[openlayers3] 01/03: Imported Upstream version 3.1.1

Johan Van de Wauw johanvdw-guest at moszumanska.debian.org
Thu Dec 25 22:50:39 UTC 2014


This is an automated email from the git hooks/post-receive script.

johanvdw-guest pushed a commit to branch master
in repository openlayers3.

commit 45087af5142e7c4bc487c7711b591430784bc343
Author: Johan Van de Wauw <johan.vandewauw at gmail.com>
Date:   Thu Dec 25 21:53:07 2014 +0100

    Imported Upstream version 3.1.1
---
 .gitignore                                         |     7 +
 .jshintrc                                          |     4 +
 .npmignore                                         |     5 +
 .travis.yml                                        |     8 +
 AUTHORS.md                                         |    58 +
 CONTRIBUTING.md                                    |   304 +
 LICENSE.md                                         |    27 +
 README.md                                          |    11 +
 bin/BeautifulSoup.py                               |  1767 ++
 bin/check-example.js                               |    33 +
 bin/combine-examples.py                            |    27 +
 bin/example-screenshot.js                          |   180 +
 bin/exampleparser.py                               |   269 +
 bin/loader_hosted_examples.js                      |    69 +
 bin/pyglslunit.py                                  |   121 +
 build.cmd                                          |     2 +
 build.py                                           |   801 +
 changelog/v3.1.0.md                                |   234 +
 changelog/v3.1.1.md                                |     9 +
 closure-util.json                                  |     3 +
 config/examples-all.json                           |    78 +
 config/jsdoc/api/conf.json                         |    42 +
 config/jsdoc/api/index.md                          |    41 +
 config/jsdoc/api/plugins/api.js                    |   130 +
 config/jsdoc/api/plugins/events.js                 |    43 +
 config/jsdoc/api/plugins/inheritdoc.js             |   109 +
 config/jsdoc/api/plugins/interface.js              |    25 +
 config/jsdoc/api/plugins/observable.js             |    69 +
 config/jsdoc/api/plugins/typedefs.js               |    63 +
 config/jsdoc/api/readme.md                         |    78 +
 config/jsdoc/api/template/README.md                |     3 +
 config/jsdoc/api/template/less/common.less         |     9 +
 config/jsdoc/api/template/less/footer.less         |    10 +
 config/jsdoc/api/template/less/jaguar.less         |    22 +
 config/jsdoc/api/template/less/main.less           |   288 +
 config/jsdoc/api/template/less/navigation.less     |   103 +
 config/jsdoc/api/template/publish.js               |   513 +
 .../static/fonts/glyphicons-halflings-regular.eot  |   Bin 0 -> 20290 bytes
 .../static/fonts/glyphicons-halflings-regular.svg  |   229 +
 .../static/fonts/glyphicons-halflings-regular.ttf  |   Bin 0 -> 41236 bytes
 .../static/fonts/glyphicons-halflings-regular.woff |   Bin 0 -> 23292 bytes
 .../api/template/static/scripts/bootstrap.min.js   |     7 +
 .../api/template/static/scripts/jquery.min.js      |     6 +
 .../api/template/static/scripts/jquery.min.map     |     1 +
 .../api/template/static/scripts/linenumber.js      |    17 +
 config/jsdoc/api/template/static/scripts/main.js   |    78 +
 .../static/scripts/prettify/Apache-License-2.0.txt |   202 +
 .../template/static/scripts/prettify/lang-css.js   |     2 +
 .../template/static/scripts/prettify/prettify.js   |    28 +
 .../api/template/static/scripts/underscore-min.js  |     6 +
 .../api/template/static/scripts/underscore-min.map |     1 +
 .../api/template/static/styles/bootstrap.min.css   |     7 +
 config/jsdoc/api/template/static/styles/jaguar.css |   383 +
 .../api/template/static/styles/prettify-jsdoc.css  |   111 +
 .../template/static/styles/prettify-tomorrow.css   |   132 +
 config/jsdoc/api/template/tmpl/container.tmpl      |   174 +
 config/jsdoc/api/template/tmpl/details.tmpl        |    84 +
 config/jsdoc/api/template/tmpl/example.tmpl        |     2 +
 config/jsdoc/api/template/tmpl/examples.tmpl       |    16 +
 config/jsdoc/api/template/tmpl/exceptions.tmpl     |    30 +
 config/jsdoc/api/template/tmpl/layout.tmpl         |    45 +
 config/jsdoc/api/template/tmpl/mainpage.tmpl       |    14 +
 config/jsdoc/api/template/tmpl/members.tmpl        |    36 +
 config/jsdoc/api/template/tmpl/method.tmpl         |   121 +
 config/jsdoc/api/template/tmpl/navigation.tmpl     |    87 +
 config/jsdoc/api/template/tmpl/observables.tmpl    |    37 +
 config/jsdoc/api/template/tmpl/params.tmpl         |   106 +
 config/jsdoc/api/template/tmpl/properties.tmpl     |   107 +
 config/jsdoc/api/template/tmpl/returns.tmpl        |    72 +
 config/jsdoc/api/template/tmpl/source.tmpl         |     8 +
 config/jsdoc/api/template/tmpl/stability.tmpl      |     7 +
 config/jsdoc/api/template/tmpl/tutorial.tmpl       |    19 +
 config/jsdoc/api/template/tmpl/type.tmpl           |     7 +
 config/jsdoc/info/api-plugin.js                    |    15 +
 config/jsdoc/info/conf.json                        |    17 +
 config/jsdoc/info/define-plugin.js                 |    35 +
 config/jsdoc/info/publish.js                       |   175 +
 config/jsdoc/info/virtual-plugin.js                |    16 +
 config/ol-debug.json                               |     4 +
 config/ol.json                                     |    66 +
 config/readme.md                                   |     3 +
 css/ol.css                                         |   257 +
 doc/index.hbs                                      |    14 +
 doc/quickstart.hbs                                 |   133 +
 doc/tutorials/concepts.hbs                         |    73 +
 doc/tutorials/index.hbs                            |     8 +
 doc/tutorials/introduction.md                      |    44 +
 examples/Jugl.js                                   |     8 +
 examples/accessible.html                           |    72 +
 examples/accessible.js                             |    32 +
 examples/animation.html                            |    65 +
 examples/animation.js                              |   185 +
 examples/attributions.html                         |    51 +
 examples/attributions.js                           |    33 +
 examples/bind-input.html                           |    92 +
 examples/bind-input.js                             |    69 +
 examples/bing-maps.html                            |    60 +
 examples/bing-maps.js                              |    46 +
 examples/box-selection.html                        |    59 +
 examples/box-selection.js                          |    81 +
 examples/brightness-contrast.html                  |    74 +
 examples/brightness-contrast.js                    |    75 +
 examples/button-title.html                         |    62 +
 examples/button-title.js                           |    27 +
 examples/canvas-tiles.html                         |    52 +
 examples/canvas-tiles.js                           |    37 +
 examples/center.html                               |   131 +
 examples/center.js                                 |   133 +
 examples/cluster.html                              |    51 +
 examples/cluster.js                                |    80 +
 examples/custom-controls.html                      |    91 +
 examples/custom-controls.js                        |    84 +
 examples/d3.html                                   |    54 +
 examples/d3.js                                     |    96 +
 examples/data/Butterfly.png                        |   Bin 0 -> 62674 bytes
 examples/data/IGNWMTSCapabilities.xml              |     1 +
 examples/data/WMTSCapabilities.xml                 |   374 +
 examples/data/geojson/countries-110m.geojson       |   176 +
 examples/data/geojson/countries.geojson            |   181 +
 examples/data/geojson/line-samples.geojson         |    16 +
 examples/data/geojson/point-samples.geojson        |    16 +
 examples/data/geojson/polygon-samples.geojson      |    16 +
 examples/data/geojson/switzerland.geojson          |     4 +
 examples/data/geolocation-orientation.json         |   729 +
 examples/data/geolocation_marker.png               |   Bin 0 -> 829 bytes
 examples/data/geolocation_marker_heading.png       |   Bin 0 -> 1673 bytes
 examples/data/gml/topp-states-wfs.xml              |     2 +
 examples/data/gpx/fells_loop.gpx                   |  1077 ++
 examples/data/icon.png                             |   Bin 0 -> 2532 bytes
 examples/data/igc/Clement-Latour.igc               | 15585 ++++++++++++++++++
 examples/data/igc/Damien-de-Baenst.igc             |  3319 ++++
 examples/data/igc/Sylvain-Dhonneur.igc             | 16374 +++++++++++++++++++
 examples/data/igc/Tom-Payne.igc                    |  9879 +++++++++++
 examples/data/igc/Ulrich-Prinz.igc                 |  4611 ++++++
 examples/data/kml/2012-02-10.kml                   |  9391 +++++++++++
 examples/data/kml/2012_Earthquakes_Mag5.kml        | 10758 ++++++++++++
 examples/data/kml/timezones.kml                    |  1608 ++
 examples/data/ogcsample.xml                        |   284 +
 examples/data/sld/countries.sld                    |    43 +
 examples/data/topojson/us.json                     |     1 +
 examples/data/topojson/world-110m.json             |     1 +
 examples/device-orientation.html                   |    58 +
 examples/device-orientation.js                     |    55 +
 examples/drag-and-drop-image-vector.html           |    56 +
 examples/drag-and-drop-image-vector.js             |   155 +
 examples/drag-and-drop.html                        |    56 +
 examples/drag-and-drop.js                          |   151 +
 examples/drag-features.html                        |    51 +
 examples/drag-features.js                          |   192 +
 examples/drag-rotate-and-zoom.html                 |    52 +
 examples/drag-rotate-and-zoom.js                   |    24 +
 examples/draw-and-modify-features.html             |    61 +
 examples/draw-and-modify-features.js               |    84 +
 examples/draw-features.html                        |    61 +
 examples/draw-features.js                          |    73 +
 examples/dynamic-data.html                         |    51 +
 examples/dynamic-data.js                           |    79 +
 examples/earthquake-clusters.html                  |    75 +
 examples/earthquake-clusters.js                    |   154 +
 examples/epsg-4326.html                            |    51 +
 examples/epsg-4326.js                              |    33 +
 examples/export-map.html                           |    56 +
 examples/export-map.js                             |    49 +
 examples/fractal.html                              |    64 +
 examples/fractal.js                                |   124 +
 examples/full-screen-drag-rotate-and-zoom.html     |    64 +
 examples/full-screen-drag-rotate-and-zoom.js       |    33 +
 examples/full-screen.html                          |    70 +
 examples/full-screen.js                            |    29 +
 examples/geojson.html                              |    51 +
 examples/geojson.js                                |   201 +
 examples/geolocation-orientation.html              |    53 +
 examples/geolocation-orientation.js                |   229 +
 examples/geolocation.html                          |    61 +
 examples/geolocation.js                            |    84 +
 examples/getfeatureinfo-image.html                 |    57 +
 examples/getfeatureinfo-image.js                   |    38 +
 examples/getfeatureinfo-tile.html                  |    57 +
 examples/getfeatureinfo-tile.js                    |    38 +
 examples/gpx.html                                  |    62 +
 examples/gpx.js                                    |   120 +
 examples/graticule.html                            |    51 +
 examples/graticule.js                              |    33 +
 examples/heatmap-earthquakes.html                  |    52 +
 examples/heatmap-earthquakes.js                    |    40 +
 examples/hue-saturation.html                       |    74 +
 examples/hue-saturation.js                         |    79 +
 examples/icon-sprite-webgl.html                    |    53 +
 examples/icon-sprite-webgl.js                      |   111 +
 examples/icon.html                                 |    62 +
 examples/icon.js                                   |    97 +
 examples/igc.html                                  |    58 +
 examples/igc.js                                    |   191 +
 examples/image-filter.html                         |    65 +
 examples/image-filter.js                           |   146 +
 examples/image-vector-layer.html                   |    59 +
 examples/image-vector-layer.js                     |    90 +
 examples/index.html                                |   209 +
 examples/kml-earthquakes.html                      |    75 +
 examples/kml-earthquakes.js                        |    94 +
 examples/kml-timezones.html                        |    63 +
 examples/kml-timezones.js                          |   101 +
 examples/kml.html                                  |    61 +
 examples/kml.js                                    |    88 +
 examples/layer-clipping-webgl.html                 |    56 +
 examples/layer-clipping-webgl.js                   |   108 +
 examples/layer-clipping.html                       |    51 +
 examples/layer-clipping.js                         |    46 +
 examples/layer-extent.html                         |    68 +
 examples/layer-extent.js                           |    50 +
 examples/layer-group.html                          |   126 +
 examples/layer-group.js                            |    63 +
 examples/layer-spy.html                            |    60 +
 examples/layer-spy.js                              |    68 +
 examples/layer-swipe.html                          |    52 +
 examples/layer-swipe.js                            |    51 +
 examples/lazy-source.html                          |    73 +
 examples/lazy-source.js                            |    26 +
 examples/localized-openstreetmap.html              |    52 +
 examples/localized-openstreetmap.js                |    56 +
 examples/mapguide-untiled.html                     |    51 +
 examples/mapguide-untiled.js                       |    38 +
 examples/mapquest.html                             |    56 +
 examples/mapquest.js                               |    51 +
 examples/measure.html                              |    65 +
 examples/measure.js                                |   167 +
 examples/min-max-resolution.html                   |    60 +
 examples/min-max-resolution.js                     |    40 +
 examples/mobile-full-screen.html                   |    30 +
 examples/mobile-full-screen.js                     |    42 +
 examples/modify-features.html                      |    53 +
 examples/modify-features.js                        |    39 +
 examples/modify-test.html                          |    57 +
 examples/modify-test.js                            |   250 +
 examples/mouse-position.html                       |    59 +
 examples/mouse-position.js                         |    56 +
 examples/moveend.html                              |    54 +
 examples/moveend.js                                |    51 +
 examples/navigation-controls.html                  |    56 +
 examples/navigation-controls.js                    |    33 +
 examples/overlay.html                              |    82 +
 examples/overlay.js                                |    64 +
 examples/overviewmap-custom.html                   |    77 +
 examples/overviewmap-custom.js                     |    43 +
 examples/overviewmap.html                          |    41 +
 examples/overviewmap.js                            |    22 +
 examples/popup.html                                |   106 +
 examples/popup.js                                  |    73 +
 examples/preload.html                              |    55 +
 examples/preload.js                                |    38 +
 examples/readme.md                                 |    16 +
 examples/regularshape.html                         |    51 +
 examples/regularshape.js                           |   101 +
 examples/rotation.html                             |    52 +
 examples/rotation.js                               |    26 +
 examples/scale-line.html                           |    58 +
 examples/scale-line.js                             |    35 +
 examples/select-features.html                      |    62 +
 examples/select-features.js                        |    72 +
 examples/semi-transparent-layer.html               |    51 +
 examples/semi-transparent-layer.js                 |    27 +
 examples/side-by-side.html                         |    63 +
 examples/side-by-side.js                           |    41 +
 examples/simple.html                               |    51 +
 examples/simple.js                                 |    25 +
 examples/sphere-mollweide.html                     |    52 +
 examples/sphere-mollweide.js                       |    42 +
 examples/stamen.html                               |    51 +
 examples/stamen.js                                 |    28 +
 examples/static-image.html                         |    60 +
 examples/static-image.js                           |    41 +
 examples/symbol-atlas-webgl.html                   |    58 +
 examples/symbol-atlas-webgl.js                     |   123 +
 examples/synthetic-lines.html                      |   110 +
 examples/synthetic-lines.js                        |    60 +
 examples/synthetic-points.html                     |    52 +
 examples/synthetic-points.js                       |   131 +
 examples/teleport.html                             |    61 +
 examples/teleport.js                               |    33 +
 examples/tile-vector.html                          |    67 +
 examples/tile-vector.js                            |   169 +
 examples/tilejson.html                             |    51 +
 examples/tilejson.js                               |    22 +
 examples/tileutfgrid.html                          |    69 +
 examples/tileutfgrid.js                            |    68 +
 examples/tissot.html                               |    56 +
 examples/tissot.js                                 |    71 +
 examples/topojson.html                             |    53 +
 examples/topojson.js                               |    46 +
 examples/vector-labels.html                        |   361 +
 examples/vector-labels.js                          |   238 +
 examples/vector-layer.html                         |    56 +
 examples/vector-layer.js                           |   124 +
 examples/vector-osm.html                           |    56 +
 examples/vector-osm.js                             |   145 +
 examples/vector-wfs.html                           |    50 +
 examples/vector-wfs.js                             |    60 +
 examples/wkt.html                                  |    50 +
 examples/wkt.js                                    |    34 +
 examples/wms-capabilities.html                     |    49 +
 examples/wms-capabilities.js                       |     8 +
 examples/wms-custom-proj.html                      |    50 +
 examples/wms-custom-proj.js                        |   248 +
 examples/wms-image-custom-proj.html                |    54 +
 examples/wms-image-custom-proj.js                  |    74 +
 examples/wms-image.html                            |    51 +
 examples/wms-image.js                              |    29 +
 examples/wms-no-proj.html                          |    51 +
 examples/wms-no-proj.js                            |    63 +
 examples/wms-tiled.html                            |    51 +
 examples/wms-tiled.js                              |    28 +
 examples/wmts-hidpi.html                           |    56 +
 examples/wmts-hidpi.js                             |    75 +
 examples/wmts.html                                 |    51 +
 examples/wmts.js                                   |    66 +
 examples/xyz-esri-4326-512.html                    |    51 +
 examples/xyz-esri-4326-512.js                      |    72 +
 examples/xyz-esri.html                             |    51 +
 examples/xyz-esri.js                               |    29 +
 examples/xyz-retina.html                           |    52 +
 examples/xyz-retina.js                             |    42 +
 examples/xyz.html                                  |    51 +
 examples/xyz.js                                    |    46 +
 examples/zoom-constrained.html                     |    52 +
 examples/zoom-constrained.js                       |    23 +
 examples/zoomify.html                              |    51 +
 examples/zoomify.js                                |    53 +
 examples/zoomslider.html                           |   126 +
 examples/zoomslider.js                             |    36 +
 externs/bingmaps.js                                |   176 +
 externs/bootstrap.js                               |    20 +
 externs/closure-compiler.js                        |    32 +
 externs/example.js                                 |    18 +
 externs/fastclick.js                               |    25 +
 externs/geojson.js                                 |   162 +
 externs/jquery-1.9.js                              |  2157 +++
 externs/oli.js                                     |   217 +
 externs/olx.js                                     |  6557 ++++++++
 externs/proj4js.js                                 |    22 +
 externs/readme.md                                  |   120 +
 externs/tilejson.js                                |   121 +
 externs/topojson.js                                |   172 +
 externs/vbarray.js                                 |    46 +
 externs/webgl-debug.js                             |    98 +
 licenses/APACHE-2.0.txt                            |   202 +
 licenses/BSD-LICENSE.txt                           |    28 +
 licenses/MIT-LICENSE.txt                           |    18 +
 package.json                                       |    52 +
 pake.py                                            |   509 +
 requirements.txt                                   |     2 +
 resources/bootstrap/css/bootstrap-responsive.css   |  1109 ++
 .../bootstrap/css/bootstrap-responsive.min.css     |     9 +
 resources/bootstrap/css/bootstrap.css              |  6158 +++++++
 resources/bootstrap/css/bootstrap.min.css          |     9 +
 .../bootstrap/img/glyphicons-halflings-white.png   |   Bin 0 -> 8777 bytes
 resources/bootstrap/img/glyphicons-halflings.png   |   Bin 0 -> 12799 bytes
 resources/bootstrap/js/bootstrap.js                |  2276 +++
 resources/bootstrap/js/bootstrap.min.js            |     6 +
 resources/display-frame-rate.js                    |    39 +
 resources/example-behaviour.js                     |   261 +
 resources/jquery.min.js                            |     4 +
 resources/layout.css                               |    31 +
 resources/logo-32x32-optimized.png                 |   Bin 0 -> 1116 bytes
 resources/logo-32x32.png                           |   Bin 0 -> 1205 bytes
 resources/logo.png                                 |   Bin 0 -> 1365 bytes
 resources/textured_paper.jpeg                      |   Bin 0 -> 3445 bytes
 src/ol.jsdoc                                       |     3 +
 src/ol/animation.js                                |   161 +
 src/ol/animation.jsdoc                             |    13 +
 src/ol/array.js                                    |   104 +
 src/ol/attribution.js                              |    76 +
 src/ol/binary.js                                   |   174 +
 src/ol/canvasfunction.js                           |    17 +
 src/ol/centerconstraint.js                         |    42 +
 src/ol/collection.js                               |   283 +
 src/ol/color/color.js                              |   332 +
 src/ol/color/color.jsdoc                           |     8 +
 src/ol/color/colormatrix.js                        |   205 +
 src/ol/constraints.js                              |    35 +
 src/ol/control.jsdoc                               |     3 +
 src/ol/control/attributioncontrol.js               |   393 +
 src/ol/control/control.js                          |   123 +
 src/ol/control/controldefaults.js                  |    47 +
 src/ol/control/fullscreencontrol.js                |   135 +
 src/ol/control/mousepositioncontrol.js             |   265 +
 src/ol/control/overviewmapcontrol.js               |   492 +
 src/ol/control/rotatecontrol.js                    |   163 +
 src/ol/control/scalelinecontrol.js                 |   344 +
 src/ol/control/zoomcontrol.js                      |   132 +
 src/ol/control/zoomslidercontrol.js                |   327 +
 src/ol/control/zoomtoextentcontrol.js              |    85 +
 src/ol/coordinate.js                               |   349 +
 src/ol/coordinate.jsdoc                            |     3 +
 src/ol/css.js                                      |    37 +
 src/ol/deviceorientation.js                        |   250 +
 src/ol/dom/dom.js                                  |   300 +
 src/ol/dom/input.js                                |   148 +
 src/ol/easing.js                                   |    54 +
 src/ol/easing.jsdoc                                |     4 +
 src/ol/ellipsoid/ellipsoid.js                      |   185 +
 src/ol/ellipsoid/wgs84ellipsoid.js                 |    10 +
 src/ol/events/condition.js                         |   168 +
 src/ol/events/condition.jsdoc                      |    18 +
 src/ol/extent.js                                   |   890 +
 src/ol/extent.jsdoc                                |     3 +
 src/ol/feature.js                                  |   329 +
 src/ol/feature.jsdoc                               |     3 +
 src/ol/featureoverlay.js                           |   307 +
 src/ol/format.jsdoc                                |     3 +
 src/ol/format/binaryfeatureformat.js               |   111 +
 src/ol/format/featureformat.js                     |   187 +
 src/ol/format/format.js                            |    12 +
 src/ol/format/geojsonformat.js                     |   584 +
 src/ol/format/gml/gml2format.js                    |   218 +
 src/ol/format/gml/gml3format.js                    |  1351 ++
 src/ol/format/gml/gmlbaseformat.js                 |   563 +
 src/ol/format/gpxformat.js                         |   895 +
 src/ol/format/igcformat.js                         |   228 +
 src/ol/format/jsonfeatureformat.js                 |   168 +
 src/ol/format/kmlformat.js                         |  2620 +++
 src/ol/format/osmxmlformat.js                      |   252 +
 src/ol/format/owsformat.js                         |   502 +
 src/ol/format/polylineformat.js                    |   401 +
 src/ol/format/textfeatureformat.js                 |   167 +
 src/ol/format/topojsonformat.js                    |   409 +
 src/ol/format/wfsformat.js                         |   764 +
 src/ol/format/wktformat.js                         |   860 +
 src/ol/format/wmscapabilitiesformat.js             |   834 +
 src/ol/format/wmsgetfeatureinfoformat.js           |   146 +
 src/ol/format/xlinkformat.js                       |    17 +
 src/ol/format/xmlfeatureformat.js                  |   251 +
 src/ol/format/xmlformat.js                         |    48 +
 src/ol/format/xsdformat.js                         |   183 +
 src/ol/framestate.js                               |    21 +
 src/ol/geolocation.js                              |   406 +
 src/ol/geom/circle.js                              |   236 +
 src/ol/geom/flat/areaflatgeom.js                   |    64 +
 src/ol/geom/flat/centerflatgeom.js                 |    26 +
 src/ol/geom/flat/closestflatgeom.js                |   260 +
 src/ol/geom/flat/containsflatgeom.js               |   114 +
 src/ol/geom/flat/deflateflatgeom.js                |    91 +
 src/ol/geom/flat/flipflatgeom.js                   |    37 +
 src/ol/geom/flat/geodesicflatgeom.js               |   180 +
 src/ol/geom/flat/inflateflatgeom.js                |    71 +
 src/ol/geom/flat/interiorpointflatgeom.js          |    92 +
 src/ol/geom/flat/interpolateflatgeom.js            |   190 +
 src/ol/geom/flat/intersectsextent.js               |   154 +
 src/ol/geom/flat/lengthflatgeom.js                 |    43 +
 src/ol/geom/flat/orientflatgeom.js                 |   115 +
 src/ol/geom/flat/reverseflatgeom.js                |    22 +
 src/ol/geom/flat/segmentsflatgeom.js               |    33 +
 src/ol/geom/flat/simplifyflatgeom.js               |   400 +
 src/ol/geom/flat/transformflatgeom.js              |    65 +
 src/ol/geom/geom.jsdoc                             |     3 +
 src/ol/geom/geometry.js                            |   225 +
 src/ol/geom/geometrycollection.js                  |   302 +
 src/ol/geom/linearring.js                          |   154 +
 src/ol/geom/linestring.js                          |   234 +
 src/ol/geom/multilinestring.js                     |   320 +
 src/ol/geom/multipoint.js                          |   193 +
 src/ol/geom/multipolygon.js                        |   404 +
 src/ol/geom/point.js                               |   133 +
 src/ol/geom/polygon.js                             |   395 +
 src/ol/geom/simplegeometry.js                      |   293 +
 src/ol/graticule.js                                |   435 +
 src/ol/has.js                                      |   150 +
 src/ol/has.jsdoc                                   |     3 +
 src/ol/image.js                                    |   152 +
 src/ol/imagebase.js                                |   129 +
 src/ol/imagecanvas.js                              |    38 +
 src/ol/imageloadfunction.js                        |    21 +
 src/ol/imagetile.js                                |   160 +
 src/ol/imageurlfunction.js                         |    46 +
 src/ol/interaction/doubleclickzoominteraction.js   |    64 +
 src/ol/interaction/draganddropinteraction.js       |   236 +
 src/ol/interaction/dragboxinteraction.js           |   206 +
 src/ol/interaction/dragpaninteraction.js           |   168 +
 src/ol/interaction/dragrotateandzoominteraction.js |   151 +
 src/ol/interaction/dragrotateinteraction.js        |   128 +
 src/ol/interaction/dragzoominteraction.js          |    65 +
 src/ol/interaction/drawinteraction.js              |   628 +
 src/ol/interaction/interaction.js                  |   252 +
 src/ol/interaction/interaction.jsdoc               |     3 +
 src/ol/interaction/interactiondefaults.js          |   113 +
 src/ol/interaction/keyboardpaninteraction.js       |    99 +
 src/ol/interaction/keyboardzoominteraction.js      |    85 +
 src/ol/interaction/modifyinteraction.js            |   791 +
 src/ol/interaction/mousewheelzoominteraction.js    |   118 +
 src/ol/interaction/pinchrotateinteraction.js       |   169 +
 src/ol/interaction/pinchzoominteraction.js         |   158 +
 src/ol/interaction/pointerinteraction.js           |   221 +
 src/ol/interaction/selectinteraction.js            |   251 +
 src/ol/kinetic.js                                  |   159 +
 src/ol/layer/heatmaplayer.js                       |   215 +
 src/ol/layer/imagelayer.js                         |    33 +
 src/ol/layer/layer.js                              |   149 +
 src/ol/layer/layer.jsdoc                           |     3 +
 src/ol/layer/layerbase.js                          |   428 +
 src/ol/layer/layergroup.js                         |   236 +
 src/ol/layer/tilelayer.js                          |   102 +
 src/ol/layer/vectorlayer.js                        |   140 +
 src/ol/loadingstrategy.js                          |    60 +
 src/ol/loadingstrategy.jsdoc                       |     5 +
 src/ol/map.js                                      |  1564 ++
 src/ol/mapbrowserevent.js                          |   510 +
 src/ol/mapevent.js                                 |    58 +
 src/ol/math.js                                     |   112 +
 src/ol/object.js                                   |   491 +
 src/ol/observable.js                               |   114 +
 src/ol/ol.js                                       |   293 +
 src/ol/overlay.js                                  |   463 +
 src/ol/pixel.js                                    |    10 +
 src/ol/pointer/eventsource.js                      |    55 +
 src/ol/pointer/mousesource.js                      |   255 +
 src/ol/pointer/mssource.js                         |   196 +
 src/ol/pointer/nativesource.js                     |   136 +
 src/ol/pointer/pointerevent.js                     |   276 +
 src/ol/pointer/pointereventhandler.js              |   496 +
 src/ol/pointer/touchsource.js                      |   453 +
 src/ol/proj/common.js                              |    24 +
 src/ol/proj/epsg3857projection.js                  |   158 +
 src/ol/proj/epsg4326projection.js                  |    68 +
 src/ol/proj/proj.js                                |   714 +
 src/ol/proj/proj.jsdoc                             |    54 +
 src/ol/render.jsdoc                                |     3 +
 src/ol/render/box.js                               |   160 +
 src/ol/render/canvas/canvas.js                     |    96 +
 src/ol/render/canvas/canvas.jsdoc                  |     3 +
 src/ol/render/canvas/canvasimmediate.js            |  1016 ++
 src/ol/render/canvas/canvasreplay.js               |  2009 +++
 src/ol/render/ireplay.js                           |    51 +
 src/ol/render/ivectorcontext.js                    |   139 +
 src/ol/render/renderevent.js                       |    84 +
 src/ol/render/vector.js                            |   346 +
 src/ol/render/webgl/webglimagecolor.glsl           |    46 +
 src/ol/render/webgl/webglimagecolorshader.js       |   153 +
 src/ol/render/webgl/webglimagedefault.glsl         |    44 +
 src/ol/render/webgl/webglimagedefaultshader.js     |   147 +
 src/ol/render/webgl/webglimmediate.js              |   300 +
 src/ol/render/webgl/webglreplay.js                 |   822 +
 src/ol/renderer/canvas/canvasimagelayerrenderer.js |   150 +
 src/ol/renderer/canvas/canvaslayerrenderer.js      |   258 +
 src/ol/renderer/canvas/canvasmaprenderer.js        |   207 +
 src/ol/renderer/canvas/canvastilelayerrenderer.js  |   416 +
 .../renderer/canvas/canvasvectorlayerrenderer.js   |   279 +
 src/ol/renderer/dom/domimagelayerrenderer.js       |   166 +
 src/ol/renderer/dom/domlayerrenderer.js            |    56 +
 src/ol/renderer/dom/dommaprenderer.js              |   271 +
 src/ol/renderer/dom/domtilelayerrenderer.js        |   480 +
 src/ol/renderer/dom/domvectorlayerrenderer.js      |   319 +
 src/ol/renderer/layerrenderer.js                   |   293 +
 src/ol/renderer/maprenderer.js                     |   282 +
 src/ol/renderer/webgl/webglimagelayerrenderer.js   |   217 +
 src/ol/renderer/webgl/webgllayerrenderer.js        |   306 +
 src/ol/renderer/webgl/webglmapcolor.glsl           |    32 +
 src/ol/renderer/webgl/webglmapcolorshader.js       |   129 +
 src/ol/renderer/webgl/webglmapdefault.glsl         |    30 +
 src/ol/renderer/webgl/webglmapdefaultshader.js     |   123 +
 src/ol/renderer/webgl/webglmaprenderer.js          |   540 +
 src/ol/renderer/webgl/webgltilelayer.glsl          |    25 +
 src/ol/renderer/webgl/webgltilelayerrenderer.js    |   332 +
 src/ol/renderer/webgl/webgltilelayershader.js      |   111 +
 src/ol/renderer/webgl/webglvectorlayerrenderer.js  |   238 +
 src/ol/resolutionconstraint.js                     |    76 +
 src/ol/rotationconstraint.js                       |    87 +
 src/ol/size.js                                     |    21 +
 src/ol/source.jsdoc                                |     3 +
 src/ol/source/bingmapssource.js                    |   178 +
 src/ol/source/clustersource.js                     |   153 +
 src/ol/source/formatvectorsource.js                |   125 +
 src/ol/source/geojsonsource.js                     |    37 +
 src/ol/source/gpxsource.js                         |    36 +
 src/ol/source/igcsource.js                         |    33 +
 src/ol/source/imagecanvassource.js                 |    91 +
 src/ol/source/imagemapguidesource.js               |   223 +
 src/ol/source/imagesource.js                       |   101 +
 src/ol/source/imagestaticsource.js                 |    66 +
 src/ol/source/imagevectorsource.js                 |   296 +
 src/ol/source/imagewmssource.js                    |   355 +
 src/ol/source/kmlsource.js                         |    38 +
 src/ol/source/mapquestsource.js                    |    82 +
 src/ol/source/osmsource.js                         |    58 +
 src/ol/source/osmxmlsource.js                      |    35 +
 src/ol/source/servervectorsource.js                |   125 +
 src/ol/source/source.js                            |   165 +
 src/ol/source/stamensource.js                      |   132 +
 src/ol/source/staticvectorsource.js                |    83 +
 src/ol/source/tiledebugsource.js                   |   130 +
 src/ol/source/tileimagesource.js                   |   178 +
 src/ol/source/tilejsonsource.js                    |   111 +
 src/ol/source/tilesource.js                        |   208 +
 src/ol/source/tileutfgridsource.js                 |   406 +
 src/ol/source/tilevectorsource.js                  |   311 +
 src/ol/source/tilewmssource.js                     |   421 +
 src/ol/source/topojsonsource.js                    |    36 +
 src/ol/source/vectorsource.js                      |   656 +
 src/ol/source/wmssource.js                         |    17 +
 src/ol/source/wmssource.jsdoc                      |     3 +
 src/ol/source/wmtssource.js                        |   337 +
 src/ol/source/xyzsource.js                         |    86 +
 src/ol/source/zoomifysource.js                     |   185 +
 src/ol/sphere/normal.js                            |    11 +
 src/ol/sphere/sphere.js                            |   236 +
 src/ol/sphere/wgs84sphere.js                       |    11 +
 src/ol/structs/checksum.js                         |    16 +
 src/ol/structs/lrucache.js                         |   248 +
 src/ol/structs/priorityqueue.js                    |   291 +
 src/ol/structs/rbush.js                            |   242 +
 src/ol/style.jsdoc                                 |    80 +
 src/ol/style/atlasmanager.js                       |   440 +
 src/ol/style/circlestyle.js                        |   458 +
 src/ol/style/fillstyle.js                          |    66 +
 src/ol/style/iconstyle.js                          |   656 +
 src/ol/style/imagestyle.js                         |   250 +
 src/ol/style/regularshapestyle.js                  |   527 +
 src/ol/style/strokestyle.js                        |   221 +
 src/ol/style/style.js                              |   357 +
 src/ol/style/textstyle.js                          |   274 +
 src/ol/tile.js                                     |    95 +
 src/ol/tilecache.js                                |    72 +
 src/ol/tilecoord.js                                |   139 +
 src/ol/tilegrid.jsdoc                              |     3 +
 src/ol/tilegrid/tilegrid.js                        |   505 +
 src/ol/tilegrid/wmtstilegrid.js                    |   113 +
 src/ol/tilegrid/xyztilegrid.js                     |   131 +
 src/ol/tilegrid/zoomifytilegrid.js                 |    79 +
 src/ol/tileloadfunction.js                         |    11 +
 src/ol/tilequeue.js                                |    93 +
 src/ol/tilerange.js                                |   184 +
 src/ol/tileurlfunction.js                          |   157 +
 src/ol/transformfunction.js                        |    13 +
 src/ol/vec/mat4.js                                 |    82 +
 src/ol/view.js                                     |   772 +
 src/ol/webgl/buffer.js                             |    56 +
 src/ol/webgl/context.js                            |   284 +
 src/ol/webgl/shader.js                             |    84 +
 src/ol/webgl/shader.mustache                       |   103 +
 src/ol/webgl/webgl.js                              |    44 +
 src/ol/xml.js                                      |   751 +
 src/olx.jsdoc                                      |    43 +
 tasks/.jshintrc                                    |    19 +
 tasks/build-ext.js                                 |    97 +
 tasks/build.js                                     |   303 +
 tasks/changelog.sh                                 |    56 +
 tasks/generate-exports.js                          |   244 +
 tasks/generate-externs.js                          |   231 +
 tasks/generate-info.js                             |   283 +
 tasks/install.js                                   |    17 +
 tasks/parse-examples.js                            |   161 +
 tasks/publish.sh                                   |   102 +
 tasks/readme.md                                    |   124 +
 tasks/serve.js                                     |   100 +
 tasks/test.js                                      |    69 +
 test/README.md                                     |    34 +
 test/index.html                                    |    72 +
 test/spec/ol/array.test.js                         |   101 +
 test/spec/ol/collection.test.js                    |   289 +
 test/spec/ol/color.test.js                         |   109 +
 test/spec/ol/control/control.test.js               |    55 +
 test/spec/ol/control/zoomslidercontrol.test.js     |   100 +
 test/spec/ol/coordinate.test.js                    |   129 +
 test/spec/ol/ellipsoid/ellipsoid.test.js           |   358 +
 test/spec/ol/expect.test.js                        |   127 +
 test/spec/ol/extent.test.js                        |   568 +
 test/spec/ol/feature.test.js                       |   457 +
 test/spec/ol/featureoverlay.test.js                |    34 +
 test/spec/ol/format/geojson/countries.geojson      |   181 +
 test/spec/ol/format/geojsonformat.test.js          |   593 +
 test/spec/ol/format/gml/more-geoms.xml             |    47 +
 test/spec/ol/format/gml/only-boundedby.xml         |    41 +
 test/spec/ol/format/gml/repeated-name.xml          |    42 +
 test/spec/ol/format/gml/topp-states-gml.xml        |  1097 ++
 test/spec/ol/format/gml/topp-states-wfs.xml        |   233 +
 test/spec/ol/format/gmlformat.test.js              |  1106 ++
 test/spec/ol/format/gpxformat.test.js              |   561 +
 test/spec/ol/format/igcformat.test.js              |   121 +
 test/spec/ol/format/kml/states.kml                 |  4661 ++++++
 test/spec/ol/format/kmlformat.test.js              |  2503 +++
 test/spec/ol/format/osmxmlformat.test.js           |   105 +
 test/spec/ol/format/owsformat.test.js              |   154 +
 test/spec/ol/format/polylineformat.test.js         |   383 +
 test/spec/ol/format/topojson.test.js               |   162 +
 test/spec/ol/format/topojson/simple.json           |    39 +
 test/spec/ol/format/topojson/world-110m.json       |     1 +
 test/spec/ol/format/wfs/GetFeatureMultiple.xml     |     4 +
 test/spec/ol/format/wfs/Native.xml                 |     1 +
 test/spec/ol/format/wfs/NumberOfFeatures.xml       |     9 +
 test/spec/ol/format/wfs/TransactionMulti.xml       |    45 +
 test/spec/ol/format/wfs/TransactionResponse.xml    |    16 +
 test/spec/ol/format/wfs/TransactionSrs.xml         |     1 +
 test/spec/ol/format/wfs/TransactionUpdate.xml      |    23 +
 test/spec/ol/format/wfs/boundedBy.xml              |    47 +
 test/spec/ol/format/wfs/mapserver.xml              |   197 +
 test/spec/ol/format/wfs/polygonv2.xml              |    89 +
 test/spec/ol/format/wfs/topp-states-wfs.xml        |   233 +
 test/spec/ol/format/wfsformat.test.js              |   447 +
 test/spec/ol/format/wktformat.test.js              |   371 +
 test/spec/ol/format/wms/getfeatureinfo.xml         |    45 +
 test/spec/ol/format/wms/ogcsample.xml              |   284 +
 test/spec/ol/format/wmscapabilities.test.js        |   148 +
 .../spec/ol/format/wmsgetfeatureinfoformat.test.js |   207 +
 test/spec/ol/geom/circle.test.js                   |   212 +
 test/spec/ol/geom/flat/areaflatgeom.test.js        |    32 +
 test/spec/ol/geom/flat/closestflatgeom.test.js     |   146 +
 test/spec/ol/geom/flat/deflateflatgeom.test.js     |    39 +
 test/spec/ol/geom/flat/flipflatgeom.test.js        |    38 +
 test/spec/ol/geom/flat/inflateflatgeom.test.js     |    26 +
 test/spec/ol/geom/flat/interpolateflatgeom.test.js |    57 +
 .../ol/geom/flat/intersectsextentflatgeom.test.js  |    92 +
 test/spec/ol/geom/flat/orientflatgeom.test.js      |    25 +
 test/spec/ol/geom/flat/reverseflatgeom.js          |   130 +
 test/spec/ol/geom/flat/segmentsflatgeom.test.js    |    57 +
 test/spec/ol/geom/flat/simplifyflatgeom.test.js    |   358 +
 test/spec/ol/geom/flat/transformflatgeom.test.js   |    85 +
 test/spec/ol/geom/geometrycollection.test.js       |   178 +
 test/spec/ol/geom/linestring.test.js               |   305 +
 test/spec/ol/geom/multilinestring.test.js          |   326 +
 test/spec/ol/geom/multipoint.test.js               |   257 +
 test/spec/ol/geom/multipolygon.test.js             |   110 +
 test/spec/ol/geom/point.test.js                    |   174 +
 test/spec/ol/geom/polygon.test.js                  |   420 +
 test/spec/ol/graticule.test.js                     |    53 +
 test/spec/ol/interaction/drawinteraction.test.js   |   609 +
 test/spec/ol/interaction/interaction.test.js       |    60 +
 test/spec/ol/interaction/modifyinteraction.test.js |    24 +
 test/spec/ol/layer/layer.test.js                   |   575 +
 test/spec/ol/layer/layergroup.test.js              |   498 +
 test/spec/ol/layer/vectorlayer.test.js             |   129 +
 test/spec/ol/map.test.js                           |   255 +
 test/spec/ol/mapbrowserevent.test.js               |   126 +
 test/spec/ol/math.test.js                          |   174 +
 test/spec/ol/object.test.js                        |   660 +
 test/spec/ol/observable.test.js                    |   172 +
 test/spec/ol/pointer/mousesource.test.js           |   102 +
 test/spec/ol/pointer/pointereventhandler.test.js   |   170 +
 test/spec/ol/pointer/touchsource.test.js           |   139 +
 test/spec/ol/proj/epsg3857projection.test.js       |    56 +
 test/spec/ol/proj/proj.test.js                     |   394 +
 test/spec/ol/render/canvasimmediate.test.js        |    97 +
 test/spec/ol/render/vector.test.js                 |    65 +
 test/spec/ol/render/webglreplay.test.js            |   158 +
 test/spec/ol/renderer/canvas/canvasreplay.test.js  |   126 +
 .../canvas/canvasvectorlayerrenderer.test.js       |   109 +
 .../renderer/webgl/webglimagelayerrenderer.test.js |    88 +
 test/spec/ol/resolutionconstraint.test.js          |   242 +
 test/spec/ol/rotationconstraint.test.js            |    36 +
 test/spec/ol/source/clustersource.test.js          |    21 +
 test/spec/ol/source/imagewmssource.test.js         |   214 +
 test/spec/ol/source/servervectorsource.test.js     |    68 +
 test/spec/ol/source/tilesource.test.js             |   278 +
 test/spec/ol/source/tilewmssource.test.js          |   207 +
 test/spec/ol/source/vectorsource.test.js           |   418 +
 .../ol/source/vectorsource/single-feature.json     |    16 +
 test/spec/ol/source/xyzsource.test.js              |   101 +
 test/spec/ol/sphere/sphere.test.js                 |   271 +
 test/spec/ol/structs/lrucache.test.js              |   191 +
 test/spec/ol/structs/priorityqueue.test.js         |   186 +
 test/spec/ol/structs/rbush.test.js                 |   359 +
 test/spec/ol/style.test.js                         |    94 +
 test/spec/ol/style/atlasmanager.test.js            |   273 +
 test/spec/ol/style/circlestyle.test.js             |   240 +
 test/spec/ol/style/iconstyle.test.js               |   182 +
 test/spec/ol/style/regularshapestyle.test.js       |   297 +
 test/spec/ol/tilecoord.test.js                     |    52 +
 test/spec/ol/tilegrid/tilegrid.test.js             |   710 +
 test/spec/ol/tilegrid/xyztilegrid.test.js          |   168 +
 test/spec/ol/tilequeue.test.js                     |    61 +
 test/spec/ol/tilerange.test.js                     |   133 +
 test/spec/ol/tileurlfunction.test.js               |    98 +
 test/spec/ol/view.test.js                          |   463 +
 test/spec/ol/webgl/buffer.test.js                  |    55 +
 test/test-extensions.js                            |   323 +
 772 files changed, 212606 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1aa8fc6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+*.pyc
+/build/
+/examples/*.html.png
+/examples/example-list.js
+/examples/example-list.xml
+/node_modules/
+/dist/
diff --git a/.jshintrc b/.jshintrc
new file mode 100644
index 0000000..111b15e
--- /dev/null
+++ b/.jshintrc
@@ -0,0 +1,4 @@
+{
+	"-W030": true,
+	"-W083": true
+}
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..cdb35d2
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,5 @@
+*.pyc
+/build/
+/examples/*.html.png
+/examples/example-list.js
+/examples/example-list.xml
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..56346bd
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,8 @@
+before_install:
+  - "sudo pip install -r requirements.txt"
+  - "npm install -g npm && npm install"
+
+before_script:
+  - "rm src/ol/renderer/webgl/*shader.js"
+
+script: "./build.py ci"
diff --git a/AUTHORS.md b/AUTHORS.md
new file mode 100644
index 0000000..edb3f31
--- /dev/null
+++ b/AUTHORS.md
@@ -0,0 +1,58 @@
+OpenLayers contributors:
+
+* Antoine Abt
+* Mike Adair
+* Jeff Adams
+* Seb Benthall
+* Bruno Binet
+* Stéphane Brunner
+* Howard Butler
+* Bertil Chaupis
+* John Cole
+* Tim Coulter
+* Robert Coup
+* Jeff Dege
+* Roald de Wit
+* Schuyler Erle
+* Christian López Espínola
+* John Frank
+* Sean Gilles
+* Pierre Giraud
+* Ivan Grcic
+* Andreas Hocevar
+* Marc Jansen
+* Ian Johnson
+* Frédéric Junod
+* Eric Lemoine
+* Philip Lindsay
+* Martijn van Oosterhout
+* David Overstrom
+* Tom Payne
+* Corey Puffault
+* Peter William Robins
+* Gregers Rygg
+* Tim Schaub
+* Christopher Schmidt
+* Tobias Schwinger
+* Cameron Shorter
+* Pedro Simonetti
+* Paul Spencer
+* Paul Smith
+* Glen Stampoultzis
+* James Stembridge
+* Erik Uzureau
+* Bart van den Eijnden
+* Ivan Willig
+* Thomas Wood
+* Bill Woodall
+* Steve Woodbridge
+* David Zwarg
+
+Some portions of OpenLayers are used under the Apache 2.0 license, available
+in doc/licenses/APACHE-2.0.txt.
+
+Some portions of OpenLayers are used under the MIT license, availabie in
+doc/licenses/MIT-LICENSE.txt.
+
+Some portions of OpenLayers are Copyright 2001 Robert Penner, and are used
+under the BSD license, available in doc/licenses/BSD-LICENSE.txt
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..79b7cbb
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,304 @@
+# Contributing to OpenLayers 3
+
+Thanks for your interest in contributing to OpenLayers 3.
+
+## Contributing Code
+
+Our preferred means of receiving contributions is through [pull requests](https://help.github.com/articles/using-pull-requests). Make sure
+that your pull request follows our pull request guidelines below before submitting it.
+
+This page describes what you need to know to contribute code to ol3 as a developer.
+
+## Contributor License Agreement
+
+Before accepting a contribution, we ask that you provide us a Contributor
+License Agreement.  If you are making your contribution as part of work for
+your employer, please follow the guidelines on submitting a [Corporate
+Contributor License Agreement](https://raw.github.com/openlayers/cla/master/ccla.txt). If you are
+making your contribution as an individual, you can submit a digital [Individual
+Contributor License Agreement](https://docs.google.com/spreadsheet/viewform?formkey=dGNNVUJEMXF2dERTU0FXM3JjNVBQblE6MQ).
+
+## Setting up development environment
+
+You will obviously start by
+[forking](https://github.com/openlayers/ol3/fork_select) the ol3 repository.
+
+### Travis CI
+
+The Travis CI hook is enabled on the Github repository. This means every pull request 
+is run through a full test suite to ensure it compiles and passes the tests. Failing
+pull requests will not be merged.
+
+Although not mandatory, it is also recommended to set up Travis CI for your ol3 fork.
+For that go to your ol3 fork's Service Hooks page and set up the Travis hook.
+Then every time you push to your fork, the test suite will be run. This means
+errors can be caught before creating a pull request. For those making
+small or occasional contributions, this may be enough to check that your contributions
+are ok; in this case, you do not need to install the build tools on your local environment
+as described below.
+
+### Development dependencies
+
+The minimum requirements are:
+
+* Git
+* [Node.js](http://nodejs.org/) 
+* Python 2.6 or 2.7 with a couple of extra modules (see below)
+* Java 7 (JRE and JDK)
+
+The executables `git`, `java`, `jar`, and `python` should be in your `PATH`.
+
+You can check your configuration by running:
+
+    $ ./build.py checkdeps
+
+To install the Node.js dependencies run
+
+    $ npm install
+
+To install the extra Python modules, run:
+
+    $ sudo pip install -r requirements.txt
+or
+
+    $ cat requirements.txt | sudo xargs easy_install
+
+depending on your OS and Python installation.
+
+## Working with the build tool
+
+As an ol3 developer you will need to use the `build.py` Python script. This is
+the script to use to run the linter, the compiler, the tests, etc.  Windows users
+can use `build.cmd` which is a thin wrapper around `build.py`.
+
+The `build.py` script is equivalent to a Makefile. It is actually based on
+[pake](https://github.com/twpayne/pake/), which is a simple implementation of
+`make` in Python.
+
+The usage of the script is:
+
+    $ ./build.py <target>
+    
+where `<target>` is the name of the build target you want to execute. For
+example:
+
+    $ ./build.py test
+
+The main build targets are `serve`, `lint`, `build`, `test`, and `check`. The
+latter is a meta-target that basically runs `lint`, `build`, and `test`.
+
+The `serve` target starts a node-based web server, which we will refer to as the *dev server*. You'll need to start that server for running the examples and the tests in a browser. More information on that further down.
+
+Other targets include `apidoc` and `ci`. The latter is the target used on Travis CI. See ol3's [Travis configuration file](https://github.com/openlayers/ol3/blob/master/.travis.yml).
+
+## Running the `check` target
+
+The `check` target is to be run before pushing code to GitHub and opening pull
+requests. Branches that don't pass `check` won't pass the integration tests,
+and have therefore no chance of being merged into `master`.
+
+To run the `check` target:
+
+    $ ./build.py check
+
+If you want to run the full suite of integration tests, see "Running the integration
+tests" below.
+
+## Running examples
+
+To run the examples you first need to start the dev server:
+
+    $ ./build.py serve
+
+Then, just point your browser <http://localhost:3000/examples> in your browser. For example <http://localhost:3000/examples/side-by-side.html>.
+
+Run examples against the `ol.js` standalone build:
+
+The examples can also be run against the `ol.js` standalone lib, just like the examples
+[hosted](http://openlayers.github.com/ol3/master/examples/) on GitHub. Start by
+executing the `host-examples` build target:
+
+    $ ./build.py host-examples
+
+After running `host-examples` you can now open the examples index page in the browser, for example: <http://localhost/~elemoine/ol3/build/hosted/master/examples/>. (This assumes that the `hosted` directory is a web directory, served by Apache for example.)
+
+Append `?mode=raw` to make the example work in full debug mode. In raw mode the OpenLayers and Closure Library scripts are loaded individually by the Closure Library's `base.js` script (which the example page loads and executes before any other script).
+
+## Running tests
+
+To run the tests in a browser start the dev server (`./build.py serve`) and open <http://localhost:3000/test/index.html> in the browser.
+
+To run the tests on the console (headless testing with PhantomJS) use the `test` target:
+
+    $ ./build.py test
+
+See also the test-specific [README](../blob/master/test/README.md).
+
+## Running the integration tests
+
+When you submit a pull request the [Travis continuous integration
+server](https://travis-ci.org/) will run a full suite of tests, including
+building all versions of the library and checking that all of the examples
+work.  You will receive an email with the results, and the status will be
+displayed in the pull request.
+
+To run the full suite of integration tests use the `ci` target:
+
+    $ ./build.py ci
+
+Running the full suite of integration tests currently takes 5-10 minutes.
+
+This makes sure that your commit won't break the build. It also runs JSDoc3 to
+make sure that there are no invalid API doc directives.
+
+## Adding examples
+
+Adding functionality often implies adding one or several examples. This
+section provides explanations related to adding examples.
+
+The examples are located in the `examples` directory. Adding a new example
+implies creating two files in this directory, an `.html` file and a `.js` file.
+See `examples/simple.html` and `examples/simple.js` for instance.
+
+The `.html` file needs to include a script tag with
+`loader.js?id=<example_name>` as its `src`. For example, if the two files for
+the example are `myexample.js` and `myexample.html` then the script tag's `src`
+should be set to `myexample`.
+
+You can use `simple.js` and `simple.html` as templates for new examples.
+
+### Use of the `goog` namespace in examples
+
+Short story: the ol3 examples should not use the `goog` namespace, except
+for `goog.require`.
+
+Longer story: we want that the ol3 examples work in multiple modes, with the
+standalone lib (which has implications of the symbols and properties we
+export), and compiled together with the ol3 library.
+
+Compiling the examples together with the library makes it mandatory to declare dependencies with `goog.require` statements.
+
+## Pull request guidelines
+
+Your pull request must:
+
+ * Follow OpenLayers 3's coding style.
+
+ * Pass the integration tests run automatically by the Travis Continuous
+   Integration system.
+
+ * Address a single issue or add a single item of functionality.
+
+ * Contain a clean history of small, incremental, logically separate commits,
+   with no merge commits.
+
+ * Use clear commit messages.
+
+ * Be possible to merge automatically.
+
+
+### The `check` build target
+
+It is strongly recommended that you run
+
+    $ ./build.py check
+
+before every commit.  This will catch many problems quickly, and it is much
+faster than waiting for the Travis CI integration tests to run.
+
+The `check` build target runs a number of quick tests on your code.  These
+include:
+
+ * Lint
+ * Compile
+ * Tests
+
+
+### Follow OpenLayers 3's coding style
+
+OpenLayers 3 follows [Google's JavaScript Style
+Guide](http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml).
+This is checked using the [Closure
+Linter](https://developers.google.com/closure/utilities/) in strict mode.  You
+can run the linter locally on your machine before committing using the `lint`
+target to `build.py`:
+
+    $ ./build.py lint
+
+In addition to fixing problems identified by the linter, please also follow the
+style of the existing OpenLayers 3 code, which includes:
+
+ * Always wrap the body of `for`, `if`, and `while` statements in braces.
+
+ * Class methods should be in alphabetical order.
+
+ * `var` declarations should not span multiple lines.  If you cannot fit all
+   the declarations in a single line, then start a new `var` declaration on a
+   new line.  Within a single line, variables should be declared in
+   alphabetical order.
+
+ * Do not use assignments inside expressions.
+
+
+### Pass the integration tests run automatically by the Travis CI system
+
+The integration tests contain a number of automated checks to ensure that the
+code follows the OpenLayers 3 style and does not break tests or examples.  You
+can run the integration tests locally using the `ci` target:
+
+    $ ./build.py ci
+
+
+### Address a single issue or add a single item of functionality
+
+Please submit separate pull requests for separate issues.  This allows each to
+be reviewed on its own merits.
+
+
+### Contain a clean history of small, incremental, logically separate commits, with no merge commits
+
+The commit history explains to the reviewer the series of modifications to the
+code that you have made and breaks the overall contribution into a series of
+easily-understandable chunks.  Any individual commit should not add more than
+one new class or one new function.  Do not submit commits that change thousands
+of lines or that contain more than one distinct logical change.  Trivial
+commits, e.g. to fix lint errors, should be merged into the commit that
+introduced the error.  See the [Atomic Commit Convention on Wikipedia](http://en.wikipedia.org/wiki/Atomic_commit#Atomic_Commit_Convention) for more detail.
+
+`git apply --patch` and `git rebase` can help you create a clean commit
+history.
+[Reviewboard.org](http://www.reviewboard.org/docs/codebase/dev/git/clean-commits/)
+and [Pro GIT](http://git-scm.com/book/en/Git-Tools-Rewriting-History) have
+explain how to use them.
+
+
+### Use clear commit messages
+
+Commit messages should be short, begin with a verb in the imperative, and
+contain no trailing punctuation. We follow
+http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
+for the formatting of commit messages.
+
+Git commit message should look like:
+
+    Header line: explaining the commit in one line
+
+    Body of commit message is a few lines of text, explaining things
+    in more detail, possibly giving some background about the issue
+    being fixed, etc etc.
+
+    The body of the commit message can be several paragraphs, and
+    please do proper word-wrap and keep columns shorter than about
+    74 characters or so. That way "git log" will show things
+    nicely even when it's indented.
+
+    Further paragraphs come after blank lines.
+
+Please keep the header line short, no more than 50 characters.
+
+### Be possible to merge automatically
+
+Occasionally other changes to `master` might mean that your pull request cannot
+be merged automatically.  In this case you may need to rebase your branch on a
+more recent `master`, resolve any conflicts, and `git push --force` to update
+your branch so that it can be merged automatically.
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000..7315e48
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,27 @@
+Copyright 2005-2014 OpenLayers Contributors. All rights reserved. See
+AUTHORS.md for full list.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright notice,
+this list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY OPENLAYERS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
+SHALL COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those
+of the authors and should not be interpreted as representing official policies,
+either expressed or implied, of OpenLayers Contributors.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e46ba76
--- /dev/null
+++ b/README.md
@@ -0,0 +1,11 @@
+# OpenLayers 3
+
+[![Travis CI Status](https://secure.travis-ci.org/openlayers/ol3.png)](http://travis-ci.org/#!/openlayers/ol3)
+
+Welcome to [OpenLayers 3](http://openlayers.org/)!
+
+Check out the [hosted examples](http://openlayers.org/en/master/examples/), the [workshop](http://openlayers.org/ol3-workshop/) or poke around the evolving [API docs](http://openlayers.org/en/master/apidoc/).
+
+Please don't ask questions in the github issue tracker but use [the mailing list](https://groups.google.com/forum/#!forum/ol3-dev) instead.
+
+Please see our guide on [contributing](CONTRIBUTING.md) if you're interested in getting involved.
diff --git a/bin/BeautifulSoup.py b/bin/BeautifulSoup.py
new file mode 100644
index 0000000..6ef8ac0
--- /dev/null
+++ b/bin/BeautifulSoup.py
@@ -0,0 +1,1767 @@
+"""Beautiful Soup
+Elixir and Tonic
+"The Screen-Scraper's Friend"
+http://www.crummy.com/software/BeautifulSoup/
+
+Beautiful Soup parses a (possibly invalid) XML or HTML document into a
+tree representation. It provides methods and Pythonic idioms that make
+it easy to navigate, search, and modify the tree.
+
+A well-formed XML/HTML document yields a well-formed data
+structure. An ill-formed XML/HTML document yields a correspondingly
+ill-formed data structure. If your document is only locally
+well-formed, you can use this library to find and process the
+well-formed part of it. The BeautifulSoup class 
+
+Beautiful Soup works with Python 2.2 and up. It has no external
+dependencies, but you'll have more success at converting data to UTF-8
+if you also install these three packages:
+
+* chardet, for auto-detecting character encodings
+  http://chardet.feedparser.org/
+* cjkcodecs and iconv_codec, which add more encodings to the ones supported
+  by stock Python.
+  http://cjkpython.i18n.org/
+
+Beautiful Soup defines classes for two main parsing strategies:
+    
+ * BeautifulStoneSoup, for parsing XML, SGML, or your domain-specific
+   language that kind of looks like XML.
+
+ * BeautifulSoup, for parsing run-of-the-mill HTML code, be it valid
+   or invalid. This class has web browser-like heuristics for
+   obtaining a sensible parse tree in the face of common HTML errors.
+
+Beautiful Soup also defines a class (UnicodeDammit) for autodetecting
+the encoding of an HTML or XML document, and converting it to
+Unicode. Much of this code is taken from Mark Pilgrim's Universal Feed Parser.
+
+For more than you ever wanted to know about Beautiful Soup, see the
+documentation:
+http://www.crummy.com/software/BeautifulSoup/documentation.html
+
+"""
+from __future__ import generators
+
+__author__ = "Leonard Richardson (leonardr at segfault.org)"
+__version__ = "3.0.4"
+__copyright__ = "Copyright (c) 2004-2007 Leonard Richardson"
+__license__ = "PSF"
+
+from sgmllib import SGMLParser, SGMLParseError
+import codecs
+import types
+import re
+import sgmllib
+try:
+  from htmlentitydefs import name2codepoint
+except ImportError:
+  name2codepoint = {}
+
+#This hack makes Beautiful Soup able to parse XML with namespaces
+sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
+
+DEFAULT_OUTPUT_ENCODING = "utf-8"
+
+# First, the classes that represent markup elements.
+
+class PageElement:
+    """Contains the navigational information for some part of the page
+    (either a tag or a piece of text)"""
+
+    def setup(self, parent=None, previous=None):
+        """Sets up the initial relations between this element and
+        other elements."""        
+        self.parent = parent
+        self.previous = previous
+        self.next = None
+        self.previousSibling = None
+        self.nextSibling = None
+        if self.parent and self.parent.contents:
+            self.previousSibling = self.parent.contents[-1]
+            self.previousSibling.nextSibling = self
+
+    def replaceWith(self, replaceWith):        
+        oldParent = self.parent
+        myIndex = self.parent.contents.index(self)
+        if hasattr(replaceWith, 'parent') and replaceWith.parent == self.parent:
+            # We're replacing this element with one of its siblings.
+            index = self.parent.contents.index(replaceWith)
+            if index and index < myIndex:
+                # Furthermore, it comes before this element. That
+                # means that when we extract it, the index of this
+                # element will change.
+                myIndex = myIndex - 1
+        self.extract()        
+        oldParent.insert(myIndex, replaceWith)
+        
+    def extract(self):
+        """Destructively rips this element out of the tree."""        
+        if self.parent:
+            try:
+                self.parent.contents.remove(self)
+            except ValueError:
+                pass
+
+        #Find the two elements that would be next to each other if
+        #this element (and any children) hadn't been parsed. Connect
+        #the two.        
+        lastChild = self._lastRecursiveChild()
+        nextElement = lastChild.next
+
+        if self.previous:
+            self.previous.next = nextElement
+        if nextElement:
+            nextElement.previous = self.previous
+        self.previous = None
+        lastChild.next = None
+
+        self.parent = None        
+        if self.previousSibling:
+            self.previousSibling.nextSibling = self.nextSibling
+        if self.nextSibling:
+            self.nextSibling.previousSibling = self.previousSibling
+        self.previousSibling = self.nextSibling = None       
+
+    def _lastRecursiveChild(self):
+        "Finds the last element beneath this object to be parsed."
+        lastChild = self
+        while hasattr(lastChild, 'contents') and lastChild.contents:
+            lastChild = lastChild.contents[-1]
+        return lastChild
+
+    def insert(self, position, newChild):
+        if (isinstance(newChild, basestring)
+            or isinstance(newChild, unicode)) \
+            and not isinstance(newChild, NavigableString):
+            newChild = NavigableString(newChild)        
+
+        position =  min(position, len(self.contents))
+        if hasattr(newChild, 'parent') and newChild.parent != None:
+            # We're 'inserting' an element that's already one
+            # of this object's children. 
+            if newChild.parent == self:
+                index = self.find(newChild)
+                if index and index < position:
+                    # Furthermore we're moving it further down the
+                    # list of this object's children. That means that
+                    # when we extract this element, our target index
+                    # will jump down one.
+                    position = position - 1
+            newChild.extract()
+            
+        newChild.parent = self
+        previousChild = None
+        if position == 0:
+            newChild.previousSibling = None
+            newChild.previous = self
+        else:
+            previousChild = self.contents[position-1]
+            newChild.previousSibling = previousChild
+            newChild.previousSibling.nextSibling = newChild
+            newChild.previous = previousChild._lastRecursiveChild()
+        if newChild.previous:
+            newChild.previous.next = newChild        
+
+        newChildsLastElement = newChild._lastRecursiveChild()
+
+        if position >= len(self.contents):
+            newChild.nextSibling = None
+            
+            parent = self
+            parentsNextSibling = None
+            while not parentsNextSibling:
+                parentsNextSibling = parent.nextSibling
+                parent = parent.parent
+                if not parent: # This is the last element in the document.
+                    break
+            if parentsNextSibling:
+                newChildsLastElement.next = parentsNextSibling
+            else:
+                newChildsLastElement.next = None
+        else:
+            nextChild = self.contents[position]            
+            newChild.nextSibling = nextChild            
+            if newChild.nextSibling:
+                newChild.nextSibling.previousSibling = newChild
+            newChildsLastElement.next = nextChild
+
+        if newChildsLastElement.next:
+            newChildsLastElement.next.previous = newChildsLastElement
+        self.contents.insert(position, newChild)
+
+    def findNext(self, name=None, attrs={}, text=None, **kwargs):
+        """Returns the first item that matches the given criteria and
+        appears after this Tag in the document."""
+        return self._findOne(self.findAllNext, name, attrs, text, **kwargs)
+
+    def findAllNext(self, name=None, attrs={}, text=None, limit=None,
+                    **kwargs):
+        """Returns all items that match the given criteria and appear
+        before after Tag in the document."""
+        return self._findAll(name, attrs, text, limit, self.nextGenerator)
+
+    def findNextSibling(self, name=None, attrs={}, text=None, **kwargs):
+        """Returns the closest sibling to this Tag that matches the
+        given criteria and appears after this Tag in the document."""
+        return self._findOne(self.findNextSiblings, name, attrs, text,
+                             **kwargs)
+
+    def findNextSiblings(self, name=None, attrs={}, text=None, limit=None,
+                         **kwargs):
+        """Returns the siblings of this Tag that match the given
+        criteria and appear after this Tag in the document."""
+        return self._findAll(name, attrs, text, limit,
+                             self.nextSiblingGenerator, **kwargs)
+    fetchNextSiblings = findNextSiblings # Compatibility with pre-3.x
+
+    def findPrevious(self, name=None, attrs={}, text=None, **kwargs):
+        """Returns the first item that matches the given criteria and
+        appears before this Tag in the document."""
+        return self._findOne(self.findAllPrevious, name, attrs, text, **kwargs)
+
+    def findAllPrevious(self, name=None, attrs={}, text=None, limit=None,
+                        **kwargs):
+        """Returns all items that match the given criteria and appear
+        before this Tag in the document."""
+        return self._findAll(name, attrs, text, limit, self.previousGenerator,
+                           **kwargs)
+    fetchPrevious = findAllPrevious # Compatibility with pre-3.x
+
+    def findPreviousSibling(self, name=None, attrs={}, text=None, **kwargs):
+        """Returns the closest sibling to this Tag that matches the
+        given criteria and appears before this Tag in the document."""
+        return self._findOne(self.findPreviousSiblings, name, attrs, text,
+                             **kwargs)
+
+    def findPreviousSiblings(self, name=None, attrs={}, text=None,
+                             limit=None, **kwargs):
+        """Returns the siblings of this Tag that match the given
+        criteria and appear before this Tag in the document."""
+        return self._findAll(name, attrs, text, limit,
+                             self.previousSiblingGenerator, **kwargs)
+    fetchPreviousSiblings = findPreviousSiblings # Compatibility with pre-3.x
+
+    def findParent(self, name=None, attrs={}, **kwargs):
+        """Returns the closest parent of this Tag that matches the given
+        criteria."""
+        # NOTE: We can't use _findOne because findParents takes a different
+        # set of arguments.
+        r = None
+        l = self.findParents(name, attrs, 1)
+        if l:
+            r = l[0]
+        return r
+
+    def findParents(self, name=None, attrs={}, limit=None, **kwargs):
+        """Returns the parents of this Tag that match the given
+        criteria."""
+
+        return self._findAll(name, attrs, None, limit, self.parentGenerator,
+                             **kwargs)
+    fetchParents = findParents # Compatibility with pre-3.x
+
+    #These methods do the real heavy lifting.
+
+    def _findOne(self, method, name, attrs, text, **kwargs):
+        r = None
+        l = method(name, attrs, text, 1, **kwargs)
+        if l:
+            r = l[0]
+        return r
+    
+    def _findAll(self, name, attrs, text, limit, generator, **kwargs):
+        "Iterates over a generator looking for things that match."
+
+        if isinstance(name, SoupStrainer):
+            strainer = name
+        else:
+            # Build a SoupStrainer
+            strainer = SoupStrainer(name, attrs, text, **kwargs)
+        results = ResultSet(strainer)
+        g = generator()
+        while True:
+            try:
+                i = g.next()
+            except StopIteration:
+                break
+            if i:
+                found = strainer.search(i)
+                if found:
+                    results.append(found)
+                    if limit and len(results) >= limit:
+                        break
+        return results
+
+    #These Generators can be used to navigate starting from both
+    #NavigableStrings and Tags.                
+    def nextGenerator(self):
+        i = self
+        while i:
+            i = i.next
+            yield i
+
+    def nextSiblingGenerator(self):
+        i = self
+        while i:
+            i = i.nextSibling
+            yield i
+
+    def previousGenerator(self):
+        i = self
+        while i:
+            i = i.previous
+            yield i
+
+    def previousSiblingGenerator(self):
+        i = self
+        while i:
+            i = i.previousSibling
+            yield i
+
+    def parentGenerator(self):
+        i = self
+        while i:
+            i = i.parent
+            yield i
+
+    # Utility methods
+    def substituteEncoding(self, str, encoding=None):
+        encoding = encoding or "utf-8"
+        return str.replace("%SOUP-ENCODING%", encoding)    
+
+    def toEncoding(self, s, encoding=None):
+        """Encodes an object to a string in some encoding, or to Unicode.
+        ."""
+        if isinstance(s, unicode):
+            if encoding:
+                s = s.encode(encoding)
+        elif isinstance(s, str):
+            if encoding:
+                s = s.encode(encoding)
+            else:
+                s = unicode(s)
+        else:
+            if encoding:
+                s  = self.toEncoding(str(s), encoding)
+            else:
+                s = unicode(s)
+        return s
+
+class NavigableString(unicode, PageElement):
+
+    def __getattr__(self, attr):
+        """text.string gives you text. This is for backwards
+        compatibility for Navigable*String, but for CData* it lets you
+        get the string without the CData wrapper."""
+        if attr == 'string':
+            return self
+        else:
+            raise AttributeError, "'%s' object has no attribute '%s'" % (self.__class__.__name__, attr)
+
+    def __unicode__(self):
+        return self.__str__(None)
+
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        if encoding:
+            return self.encode(encoding)
+        else:
+            return self
+        
+class CData(NavigableString):
+
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        return "<![CDATA[%s]]>" % NavigableString.__str__(self, encoding)
+
+class ProcessingInstruction(NavigableString):
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        output = self
+        if "%SOUP-ENCODING%" in output:
+            output = self.substituteEncoding(output, encoding)
+        return "<?%s?>" % self.toEncoding(output, encoding)
+
+class Comment(NavigableString):
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        return "<!--%s-->" % NavigableString.__str__(self, encoding)    
+
+class Declaration(NavigableString):
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        return "<!%s>" % NavigableString.__str__(self, encoding)        
+
+class Tag(PageElement):
+
+    """Represents a found HTML tag with its attributes and contents."""
+
+    XML_SPECIAL_CHARS_TO_ENTITIES = { "'" : "squot",
+                                      '"' : "quote",
+                                      "&" : "amp",
+                                      "<" : "lt",
+                                      ">" : "gt" }
+
+    def __init__(self, parser, name, attrs=None, parent=None,
+                 previous=None):
+        "Basic constructor."
+
+        # We don't actually store the parser object: that lets extracted
+        # chunks be garbage-collected
+        self.parserClass = parser.__class__
+        self.isSelfClosing = parser.isSelfClosingTag(name)
+        self.name = name
+        if attrs == None:
+            attrs = []
+        self.attrs = attrs
+        self.contents = []
+        self.setup(parent, previous)
+        self.hidden = False
+        self.containsSubstitutions = False
+
+    def get(self, key, default=None):
+        """Returns the value of the 'key' attribute for the tag, or
+        the value given for 'default' if it doesn't have that
+        attribute."""
+        return self._getAttrMap().get(key, default)    
+
+    def has_key(self, key):
+        return self._getAttrMap().has_key(key)
+
+    def __getitem__(self, key):
+        """tag[key] returns the value of the 'key' attribute for the tag,
+        and throws an exception if it's not there."""
+        return self._getAttrMap()[key]
+
+    def __iter__(self):
+        "Iterating over a tag iterates over its contents."
+        return iter(self.contents)
+
+    def __len__(self):
+        "The length of a tag is the length of its list of contents."
+        return len(self.contents)
+
+    def __contains__(self, x):
+        return x in self.contents
+
+    def __nonzero__(self):
+        "A tag is non-None even if it has no contents."
+        return True
+
+    def __setitem__(self, key, value):        
+        """Setting tag[key] sets the value of the 'key' attribute for the
+        tag."""
+        self._getAttrMap()
+        self.attrMap[key] = value
+        found = False
+        for i in range(0, len(self.attrs)):
+            if self.attrs[i][0] == key:
+                self.attrs[i] = (key, value)
+                found = True
+        if not found:
+            self.attrs.append((key, value))
+        self._getAttrMap()[key] = value
+
+    def __delitem__(self, key):
+        "Deleting tag[key] deletes all 'key' attributes for the tag."
+        for item in self.attrs:
+            if item[0] == key:
+                self.attrs.remove(item)
+                #We don't break because bad HTML can define the same
+                #attribute multiple times.
+            self._getAttrMap()
+            if self.attrMap.has_key(key):
+                del self.attrMap[key]
+
+    def __call__(self, *args, **kwargs):
+        """Calling a tag like a function is the same as calling its
+        findAll() method. Eg. tag('a') returns a list of all the A tags
+        found within this tag."""
+        return apply(self.findAll, args, kwargs)
+
+    def __getattr__(self, tag):
+        #print "Getattr %s.%s" % (self.__class__, tag)
+        if len(tag) > 3 and tag.rfind('Tag') == len(tag)-3:
+            return self.find(tag[:-3])
+        elif tag.find('__') != 0:
+            return self.find(tag)
+
+    def __eq__(self, other):
+        """Returns true iff this tag has the same name, the same attributes,
+        and the same contents (recursively) as the given tag.
+
+        NOTE: right now this will return false if two tags have the
+        same attributes in a different order. Should this be fixed?"""
+        if not hasattr(other, 'name') or not hasattr(other, 'attrs') or not hasattr(other, 'contents') or self.name != other.name or self.attrs != other.attrs or len(self) != len(other):
+            return False
+        for i in range(0, len(self.contents)):
+            if self.contents[i] != other.contents[i]:
+                return False
+        return True
+
+    def __ne__(self, other):
+        """Returns true iff this tag is not identical to the other tag,
+        as defined in __eq__."""
+        return not self == other
+
+    def __repr__(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        """Renders this tag as a string."""
+        return self.__str__(encoding)
+
+    def __unicode__(self):
+        return self.__str__(None)
+
+    def __str__(self, encoding=DEFAULT_OUTPUT_ENCODING,
+                prettyPrint=False, indentLevel=0):
+        """Returns a string or Unicode representation of this tag and
+        its contents. To get Unicode, pass None for encoding.
+
+        NOTE: since Python's HTML parser consumes whitespace, this
+        method is not certain to reproduce the whitespace present in
+        the original string."""
+
+        encodedName = self.toEncoding(self.name, encoding)
+
+        attrs = []
+        if self.attrs:
+            for key, val in self.attrs:
+                fmt = '%s="%s"'
+                if isString(val):                    
+                    if self.containsSubstitutions and '%SOUP-ENCODING%' in val:
+                        val = self.substituteEncoding(val, encoding)
+
+                    # The attribute value either:
+                    #
+                    # * Contains no embedded double quotes or single quotes.
+                    #   No problem: we enclose it in double quotes.
+                    # * Contains embedded single quotes. No problem:
+                    #   double quotes work here too.
+                    # * Contains embedded double quotes. No problem:
+                    #   we enclose it in single quotes.
+                    # * Embeds both single _and_ double quotes. This
+                    #   can't happen naturally, but it can happen if
+                    #   you modify an attribute value after parsing
+                    #   the document. Now we have a bit of a
+                    #   problem. We solve it by enclosing the
+                    #   attribute in single quotes, and escaping any
+                    #   embedded single quotes to XML entities.
+                    if '"' in val:
+                        fmt = "%s='%s'"
+                        # This can't happen naturally, but it can happen
+                        # if you modify an attribute value after parsing.
+                        if "'" in val:
+                            val = val.replace("'", "&squot;")
+
+                    # Now we're okay w/r/t quotes. But the attribute
+                    # value might also contain angle brackets, or
+                    # ampersands that aren't part of entities. We need
+                    # to escape those to XML entities too.
+                    val = re.sub("([<>]|&(?![^\s]+;))",
+                                 lambda x: "&" + self.XML_SPECIAL_CHARS_TO_ENTITIES[x.group(0)[0]] + ";",
+                                 val)
+                                      
+                attrs.append(fmt % (self.toEncoding(key, encoding),
+                                    self.toEncoding(val, encoding)))
+        close = ''
+        closeTag = ''
+        if self.isSelfClosing:
+            close = ' /'
+        else:
+            closeTag = '</%s>' % encodedName
+
+        indentTag, indentContents = 0, 0
+        if prettyPrint:
+            indentTag = indentLevel
+            space = (' ' * (indentTag-1))
+            indentContents = indentTag + 1
+        contents = self.renderContents(encoding, prettyPrint, indentContents)
+        if self.hidden:
+            s = contents
+        else:
+            s = []
+            attributeString = ''
+            if attrs:
+                attributeString = ' ' + ' '.join(attrs)            
+            if prettyPrint:
+                s.append(space)
+            s.append('<%s%s%s>' % (encodedName, attributeString, close))
+            if prettyPrint:
+                s.append("\n")
+            s.append(contents)
+            if prettyPrint and contents and contents[-1] != "\n":
+                s.append("\n")
+            if prettyPrint and closeTag:
+                s.append(space)
+            s.append(closeTag)
+            if prettyPrint and closeTag and self.nextSibling:
+                s.append("\n")
+            s = ''.join(s)
+        return s
+
+    def prettify(self, encoding=DEFAULT_OUTPUT_ENCODING):
+        return self.__str__(encoding, True)
+
+    def renderContents(self, encoding=DEFAULT_OUTPUT_ENCODING,
+                       prettyPrint=False, indentLevel=0):
+        """Renders the contents of this tag as a string in the given
+        encoding. If encoding is None, returns a Unicode string.."""
+        s=[]
+        for c in self:
+            text = None
+            if isinstance(c, NavigableString):
+                text = c.__str__(encoding)
+            elif isinstance(c, Tag):
+                s.append(c.__str__(encoding, prettyPrint, indentLevel))
+            if text and prettyPrint:
+                text = text.strip()              
+            if text:
+                if prettyPrint:
+                    s.append(" " * (indentLevel-1))
+                s.append(text)
+                if prettyPrint:
+                    s.append("\n")
+        return ''.join(s)    
+
+    #Soup methods
+
+    def find(self, name=None, attrs={}, recursive=True, text=None,
+             **kwargs):
+        """Return only the first child of this Tag matching the given
+        criteria."""
+        r = None
+        l = self.findAll(name, attrs, recursive, text, 1, **kwargs)
+        if l:
+            r = l[0]
+        return r
+    findChild = find
+
+    def findAll(self, name=None, attrs={}, recursive=True, text=None,
+                limit=None, **kwargs):
+        """Extracts a list of Tag objects that match the given
+        criteria.  You can specify the name of the Tag and any
+        attributes you want the Tag to have.
+
+        The value of a key-value pair in the 'attrs' map can be a
+        string, a list of strings, a regular expression object, or a
+        callable that takes a string and returns whether or not the
+        string matches for some custom definition of 'matches'. The
+        same is true of the tag name."""
+        generator = self.recursiveChildGenerator
+        if not recursive:
+            generator = self.childGenerator
+        return self._findAll(name, attrs, text, limit, generator, **kwargs)
+    findChildren = findAll
+
+    # Pre-3.x compatibility methods
+    first = find
+    fetch = findAll
+    
+    def fetchText(self, text=None, recursive=True, limit=None):
+        return self.findAll(text=text, recursive=recursive, limit=limit)
+
+    def firstText(self, text=None, recursive=True):
+        return self.find(text=text, recursive=recursive)
+    
+    #Utility methods
+
+    def append(self, tag):
+        """Appends the given tag to the contents of this tag."""
+        self.contents.append(tag)
+
+    #Private methods
+
+    def _getAttrMap(self):
+        """Initializes a map representation of this tag's attributes,
+        if not already initialized."""
+        if not getattr(self, 'attrMap'):
+            self.attrMap = {}
+            for (key, value) in self.attrs:
+                self.attrMap[key] = value 
+        return self.attrMap
+
+    #Generator methods
+    def childGenerator(self):
+        for i in range(0, len(self.contents)):
+            yield self.contents[i]
+        raise StopIteration
+    
+    def recursiveChildGenerator(self):
+        stack = [(self, 0)]
+        while stack:
+            tag, start = stack.pop()
+            if isinstance(tag, Tag):            
+                for i in range(start, len(tag.contents)):
+                    a = tag.contents[i]
+                    yield a
+                    if isinstance(a, Tag) and tag.contents:
+                        if i < len(tag.contents) - 1:
+                            stack.append((tag, i+1))
+                        stack.append((a, 0))
+                        break
+        raise StopIteration
+
+# Next, a couple classes to represent queries and their results.
+class SoupStrainer:
+    """Encapsulates a number of ways of matching a markup element (tag or
+    text)."""
+
+    def __init__(self, name=None, attrs={}, text=None, **kwargs):
+        self.name = name
+        if isString(attrs):
+            kwargs['class'] = attrs
+            attrs = None
+        if kwargs:
+            if attrs:
+                attrs = attrs.copy()
+                attrs.update(kwargs)
+            else:
+                attrs = kwargs
+        self.attrs = attrs
+        self.text = text
+
+    def __str__(self):
+        if self.text:
+            return self.text
+        else:
+            return "%s|%s" % (self.name, self.attrs)
+    
+    def searchTag(self, markupName=None, markupAttrs={}):
+        found = None
+        markup = None
+        if isinstance(markupName, Tag):
+            markup = markupName
+            markupAttrs = markup
+        callFunctionWithTagData = callable(self.name) \
+                                and not isinstance(markupName, Tag)
+
+        if (not self.name) \
+               or callFunctionWithTagData \
+               or (markup and self._matches(markup, self.name)) \
+               or (not markup and self._matches(markupName, self.name)):
+            if callFunctionWithTagData:
+                match = self.name(markupName, markupAttrs)
+            else:
+                match = True            
+                markupAttrMap = None
+                for attr, matchAgainst in self.attrs.items():
+                    if not markupAttrMap:
+                         if hasattr(markupAttrs, 'get'):
+                            markupAttrMap = markupAttrs
+                         else:
+                            markupAttrMap = {}
+                            for k,v in markupAttrs:
+                                markupAttrMap[k] = v
+                    attrValue = markupAttrMap.get(attr)
+                    if not self._matches(attrValue, matchAgainst):
+                        match = False
+                        break
+            if match:
+                if markup:
+                    found = markup
+                else:
+                    found = markupName
+        return found
+
+    def search(self, markup):
+        #print 'looking for %s in %s' % (self, markup)
+        found = None
+        # If given a list of items, scan it for a text element that
+        # matches.        
+        if isList(markup) and not isinstance(markup, Tag):
+            for element in markup:
+                if isinstance(element, NavigableString) \
+                       and self.search(element):
+                    found = element
+                    break
+        # If it's a Tag, make sure its name or attributes match.
+        # Don't bother with Tags if we're searching for text.
+        elif isinstance(markup, Tag):
+            if not self.text:
+                found = self.searchTag(markup)
+        # If it's text, make sure the text matches.
+        elif isinstance(markup, NavigableString) or \
+                 isString(markup):
+            if self._matches(markup, self.text):
+                found = markup
+        else:
+            raise Exception, "I don't know how to match against a %s" \
+                  % markup.__class__
+        return found
+        
+    def _matches(self, markup, matchAgainst):    
+        #print "Matching %s against %s" % (markup, matchAgainst)
+        result = False
+        if matchAgainst == True and type(matchAgainst) == types.BooleanType:
+            result = markup != None
+        elif callable(matchAgainst):
+            result = matchAgainst(markup)
+        else:
+            #Custom match methods take the tag as an argument, but all
+            #other ways of matching match the tag name as a string.
+            if isinstance(markup, Tag):
+                markup = markup.name
+            if markup and not isString(markup):
+                markup = unicode(markup)
+            #Now we know that chunk is either a string, or None.
+            if hasattr(matchAgainst, 'match'):
+                # It's a regexp object.
+                result = markup and matchAgainst.search(markup)
+            elif isList(matchAgainst):
+                result = markup in matchAgainst
+            elif hasattr(matchAgainst, 'items'):
+                result = markup.has_key(matchAgainst)
+            elif matchAgainst and isString(markup):
+                if isinstance(markup, unicode):
+                    matchAgainst = unicode(matchAgainst)
+                else:
+                    matchAgainst = str(matchAgainst)
+
+            if not result:
+                result = matchAgainst == markup
+        return result
+
+class ResultSet(list):
+    """A ResultSet is just a list that keeps track of the SoupStrainer
+    that created it."""
+    def __init__(self, source):
+        list.__init__([])
+        self.source = source
+
+# Now, some helper functions.
+
+def isList(l):
+    """Convenience method that works with all 2.x versions of Python
+    to determine whether or not something is listlike."""
+    return hasattr(l, '__iter__') \
+           or (type(l) in (types.ListType, types.TupleType))
+
+def isString(s):
+    """Convenience method that works with all 2.x versions of Python
+    to determine whether or not something is stringlike."""
+    try:
+        return isinstance(s, unicode) or isintance(s, basestring) 
+    except NameError:
+        return isinstance(s, str)
+
+def buildTagMap(default, *args):
+    """Turns a list of maps, lists, or scalars into a single map.
+    Used to build the SELF_CLOSING_TAGS, NESTABLE_TAGS, and
+    NESTING_RESET_TAGS maps out of lists and partial maps."""
+    built = {}
+    for portion in args:
+        if hasattr(portion, 'items'):
+            #It's a map. Merge it.
+            for k,v in portion.items():
+                built[k] = v
+        elif isList(portion):
+            #It's a list. Map each item to the default.
+            for k in portion:
+                built[k] = default
+        else:
+            #It's a scalar. Map it to the default.
+            built[portion] = default
+    return built
+
+# Now, the parser classes.
+
+class BeautifulStoneSoup(Tag, SGMLParser):
+
+    """This class contains the basic parser and search code. It defines
+    a parser that knows nothing about tag behavior except for the
+    following:
+   
+      You can't close a tag without closing all the tags it encloses.
+      That is, "<foo><bar></foo>" actually means
+      "<foo><bar></bar></foo>".
+
+    [Another possible explanation is "<foo><bar /></foo>", but since
+    this class defines no SELF_CLOSING_TAGS, it will never use that
+    explanation.]
+
+    This class is useful for parsing XML or made-up markup languages,
+    or when BeautifulSoup makes an assumption counter to what you were
+    expecting."""
+
+    XML_ENTITY_LIST = {}
+    for i in Tag.XML_SPECIAL_CHARS_TO_ENTITIES.values():
+        XML_ENTITY_LIST[i] = True 
+
+    SELF_CLOSING_TAGS = {}
+    NESTABLE_TAGS = {}
+    RESET_NESTING_TAGS = {}
+    QUOTE_TAGS = {}
+
+    MARKUP_MASSAGE = [(re.compile('(<[^<>]*)/>'),
+                       lambda x: x.group(1) + ' />'),
+                      (re.compile('<!\s+([^<>]*)>'),
+                       lambda x: '<!' + x.group(1) + '>')
+                      ]
+
+    ROOT_TAG_NAME = u'[document]'
+
+    HTML_ENTITIES = "html"
+    XML_ENTITIES = "xml"
+
+    def __init__(self, markup="", parseOnlyThese=None, fromEncoding=None,
+                 markupMassage=True, smartQuotesTo=XML_ENTITIES,
+                 convertEntities=None, selfClosingTags=None):
+        """The Soup object is initialized as the 'root tag', and the
+        provided markup (which can be a string or a file-like object)
+        is fed into the underlying parser. 
+
+        sgmllib will process most bad HTML, and the BeautifulSoup
+        class has some tricks for dealing with some HTML that kills
+        sgmllib, but Beautiful Soup can nonetheless choke or lose data
+        if your data uses self-closing tags or declarations
+        incorrectly.
+
+        By default, Beautiful Soup uses regexes to sanitize input,
+        avoiding the vast majority of these problems. If the problems
+        don't apply to you, pass in False for markupMassage, and
+        you'll get better performance.
+
+        The default parser massage techniques fix the two most common
+        instances of invalid HTML that choke sgmllib:
+
+         <br/> (No space between name of closing tag and tag close)
+         <! --Comment--> (Extraneous whitespace in declaration)
+
+        You can pass in a custom list of (RE object, replace method)
+        tuples to get Beautiful Soup to scrub your input the way you
+        want."""
+
+        self.parseOnlyThese = parseOnlyThese
+        self.fromEncoding = fromEncoding
+        self.smartQuotesTo = smartQuotesTo
+        self.convertEntities = convertEntities
+        if self.convertEntities:
+            # It doesn't make sense to convert encoded characters to
+            # entities even while you're converting entities to Unicode.
+            # Just convert it all to Unicode.
+            self.smartQuotesTo = None
+        self.instanceSelfClosingTags = buildTagMap(None, selfClosingTags)
+        SGMLParser.__init__(self)
+            
+        if hasattr(markup, 'read'):        # It's a file-type object.
+            markup = markup.read()
+        self.markup = markup
+        self.markupMassage = markupMassage
+        try:
+            self._feed()
+        except StopParsing:
+            pass
+        self.markup = None                 # The markup can now be GCed
+        
+    def _feed(self, inDocumentEncoding=None):
+        # Convert the document to Unicode.
+        markup = self.markup
+        if isinstance(markup, unicode):
+            if not hasattr(self, 'originalEncoding'):
+                self.originalEncoding = None
+        else:
+            dammit = UnicodeDammit\
+                     (markup, [self.fromEncoding, inDocumentEncoding],
+                      smartQuotesTo=self.smartQuotesTo)
+            markup = dammit.unicode
+            self.originalEncoding = dammit.originalEncoding
+        if markup:
+            if self.markupMassage:
+                if not isList(self.markupMassage):
+                    self.markupMassage = self.MARKUP_MASSAGE            
+                for fix, m in self.markupMassage:
+                    markup = fix.sub(m, markup)
+        self.reset()
+
+        SGMLParser.feed(self, markup)
+        # Close out any unfinished strings and close all the open tags.
+        self.endData()
+        while self.currentTag.name != self.ROOT_TAG_NAME:
+            self.popTag()
+
+    def __getattr__(self, methodName):
+        """This method routes method call requests to either the SGMLParser
+        superclass or the Tag superclass, depending on the method name."""
+        #print "__getattr__ called on %s.%s" % (self.__class__, methodName)
+
+        if methodName.find('start_') == 0 or methodName.find('end_') == 0 \
+               or methodName.find('do_') == 0:
+            return SGMLParser.__getattr__(self, methodName)
+        elif methodName.find('__') != 0:
+            return Tag.__getattr__(self, methodName)
+        else:
+            raise AttributeError
+
+    def isSelfClosingTag(self, name):
+        """Returns true iff the given string is the name of a
+        self-closing tag according to this parser."""
+        return self.SELF_CLOSING_TAGS.has_key(name) \
+               or self.instanceSelfClosingTags.has_key(name)
+            
+    def reset(self):
+        Tag.__init__(self, self, self.ROOT_TAG_NAME)
+        self.hidden = 1
+        SGMLParser.reset(self)
+        self.currentData = []
+        self.currentTag = None
+        self.tagStack = []
+        self.quoteStack = []
+        self.pushTag(self)
+    
+    def popTag(self):
+        tag = self.tagStack.pop()
+        # Tags with just one string-owning child get the child as a
+        # 'string' property, so that soup.tag.string is shorthand for
+        # soup.tag.contents[0]
+        if len(self.currentTag.contents) == 1 and \
+           isinstance(self.currentTag.contents[0], NavigableString):
+            self.currentTag.string = self.currentTag.contents[0]
+
+        #print "Pop", tag.name
+        if self.tagStack:
+            self.currentTag = self.tagStack[-1]
+        return self.currentTag
+
+    def pushTag(self, tag):
+        #print "Push", tag.name
+        if self.currentTag:
+            self.currentTag.append(tag)
+        self.tagStack.append(tag)
+        self.currentTag = self.tagStack[-1]
+
+    def endData(self, containerClass=NavigableString):
+        if self.currentData:
+            currentData = ''.join(self.currentData)
+            if not currentData.strip():
+                if '\n' in currentData:
+                    currentData = '\n'
+                else:
+                    currentData = ' '
+            self.currentData = []
+            if self.parseOnlyThese and len(self.tagStack) <= 1 and \
+                   (not self.parseOnlyThese.text or \
+                    not self.parseOnlyThese.search(currentData)):
+                return
+            o = containerClass(currentData)
+            o.setup(self.currentTag, self.previous)
+            if self.previous:
+                self.previous.next = o
+            self.previous = o
+            self.currentTag.contents.append(o)
+
+
+    def _popToTag(self, name, inclusivePop=True):
+        """Pops the tag stack up to and including the most recent
+        instance of the given tag. If inclusivePop is false, pops the tag
+        stack up to but *not* including the most recent instqance of
+        the given tag."""
+        #print "Popping to %s" % name
+        if name == self.ROOT_TAG_NAME:
+            return            
+
+        numPops = 0
+        mostRecentTag = None
+        for i in range(len(self.tagStack)-1, 0, -1):
+            if name == self.tagStack[i].name:
+                numPops = len(self.tagStack)-i
+                break
+        if not inclusivePop:
+            numPops = numPops - 1
+
+        for i in range(0, numPops):
+            mostRecentTag = self.popTag()
+        return mostRecentTag    
+
+    def _smartPop(self, name):
+
+        """We need to pop up to the previous tag of this type, unless
+        one of this tag's nesting reset triggers comes between this
+        tag and the previous tag of this type, OR unless this tag is a
+        generic nesting trigger and another generic nesting trigger
+        comes between this tag and the previous tag of this type.
+
+        Examples:
+         <p>Foo<b>Bar<p> should pop to 'p', not 'b'.
+         <p>Foo<table>Bar<p> should pop to 'table', not 'p'.
+         <p>Foo<table><tr>Bar<p> should pop to 'tr', not 'p'.
+         <p>Foo<b>Bar<p> should pop to 'p', not 'b'.
+
+         <li><ul><li> *<li>* should pop to 'ul', not the first 'li'.
+         <tr><table><tr> *<tr>* should pop to 'table', not the first 'tr'
+         <td><tr><td> *<td>* should pop to 'tr', not the first 'td'
+        """
+
+        nestingResetTriggers = self.NESTABLE_TAGS.get(name)
+        isNestable = nestingResetTriggers != None
+        isResetNesting = self.RESET_NESTING_TAGS.has_key(name)
+        popTo = None
+        inclusive = True
+        for i in range(len(self.tagStack)-1, 0, -1):
+            p = self.tagStack[i]
+            if (not p or p.name == name) and not isNestable:
+                #Non-nestable tags get popped to the top or to their
+                #last occurance.
+                popTo = name
+                break
+            if (nestingResetTriggers != None
+                and p.name in nestingResetTriggers) \
+                or (nestingResetTriggers == None and isResetNesting
+                    and self.RESET_NESTING_TAGS.has_key(p.name)):
+                
+                #If we encounter one of the nesting reset triggers
+                #peculiar to this tag, or we encounter another tag
+                #that causes nesting to reset, pop up to but not
+                #including that tag.
+                popTo = p.name
+                inclusive = False
+                break
+            p = p.parent
+        if popTo:
+            self._popToTag(popTo, inclusive)
+
+    def unknown_starttag(self, name, attrs, selfClosing=0):
+        #print "Start tag %s: %s" % (name, attrs)
+        if self.quoteStack:
+            #This is not a real tag.
+            #print "<%s> is not real!" % name
+            attrs = ''.join(map(lambda(x, y): ' %s="%s"' % (x, y), attrs))
+            self.handle_data('<%s%s>' % (name, attrs))
+            return        
+        self.endData()
+
+        if not self.isSelfClosingTag(name) and not selfClosing:
+            self._smartPop(name)
+
+        if self.parseOnlyThese and len(self.tagStack) <= 1 \
+               and (self.parseOnlyThese.text or not self.parseOnlyThese.searchTag(name, attrs)):
+            return
+
+        tag = Tag(self, name, attrs, self.currentTag, self.previous)
+        if self.previous:
+            self.previous.next = tag
+        self.previous = tag
+        self.pushTag(tag)
+        if selfClosing or self.isSelfClosingTag(name):
+            self.popTag()                
+        if name in self.QUOTE_TAGS:
+            #print "Beginning quote (%s)" % name
+            self.quoteStack.append(name)
+            self.literal = 1
+        return tag
+
+    def unknown_endtag(self, name):
+        #print "End tag %s" % name
+        if self.quoteStack and self.quoteStack[-1] != name:
+            #This is not a real end tag.
+            #print "</%s> is not real!" % name
+            self.handle_data('</%s>' % name)
+            return
+        self.endData()
+        self._popToTag(name)
+        if self.quoteStack and self.quoteStack[-1] == name:
+            self.quoteStack.pop()
+            self.literal = (len(self.quoteStack) > 0)
+
+    def handle_data(self, data):
+        self.currentData.append(data)
+
+    def _toStringSubclass(self, text, subclass):
+        """Adds a certain piece of text to the tree as a NavigableString
+        subclass."""
+        self.endData()
+        self.handle_data(text)
+        self.endData(subclass)
+
+    def handle_pi(self, text):
+        """Handle a processing instruction as a ProcessingInstruction
+        object, possibly one with a %SOUP-ENCODING% slot into which an
+        encoding will be plugged later."""
+        if text[:3] == "xml":
+            text = "xml version='1.0' encoding='%SOUP-ENCODING%'"
+        self._toStringSubclass(text, ProcessingInstruction)
+
+    def handle_comment(self, text):
+        "Handle comments as Comment objects."
+        self._toStringSubclass(text, Comment)
+
+    def handle_charref(self, ref):
+        "Handle character references as data."
+        if self.convertEntities in [self.HTML_ENTITIES,
+                                    self.XML_ENTITIES]:
+            data = unichr(int(ref))
+        else:
+            data = '&#%s;' % ref
+        self.handle_data(data)
+
+    def handle_entityref(self, ref):
+        """Handle entity references as data, possibly converting known
+        HTML entity references to the corresponding Unicode
+        characters."""
+        data = None
+        if self.convertEntities == self.HTML_ENTITIES or \
+               (self.convertEntities == self.XML_ENTITIES and \
+                self.XML_ENTITY_LIST.get(ref)):
+            try:
+                data = unichr(name2codepoint[ref])
+            except KeyError:
+                pass
+        if not data:
+            data = '&%s;' % ref
+        self.handle_data(data)
+        
+    def handle_decl(self, data):
+        "Handle DOCTYPEs and the like as Declaration objects."
+        self._toStringSubclass(data, Declaration)
+
+    def parse_declaration(self, i):
+        """Treat a bogus SGML declaration as raw data. Treat a CDATA
+        declaration as a CData object."""
+        j = None
+        if self.rawdata[i:i+9] == '<![CDATA[':
+             k = self.rawdata.find(']]>', i)
+             if k == -1:
+                 k = len(self.rawdata)
+             data = self.rawdata[i+9:k]
+             j = k+3
+             self._toStringSubclass(data, CData)
+        else:
+            try:
+                j = SGMLParser.parse_declaration(self, i)
+            except SGMLParseError:
+                toHandle = self.rawdata[i:]
+                self.handle_data(toHandle)
+                j = i + len(toHandle)
+        return j
+
+class BeautifulSoup(BeautifulStoneSoup):
+
+    """This parser knows the following facts about HTML:
+
+    * Some tags have no closing tag and should be interpreted as being
+      closed as soon as they are encountered.
+
+    * The text inside some tags (ie. 'script') may contain tags which
+      are not really part of the document and which should be parsed
+      as text, not tags. If you want to parse the text as tags, you can
+      always fetch it and parse it explicitly.
+
+    * Tag nesting rules:
+
+      Most tags can't be nested at all. For instance, the occurance of
+      a <p> tag should implicitly close the previous <p> tag.
+
+       <p>Para1<p>Para2
+        should be transformed into:
+       <p>Para1</p><p>Para2
+
+      Some tags can be nested arbitrarily. For instance, the occurance
+      of a <blockquote> tag should _not_ implicitly close the previous
+      <blockquote> tag.
+
+       Alice said: <blockquote>Bob said: <blockquote>Blah
+        should NOT be transformed into:
+       Alice said: <blockquote>Bob said: </blockquote><blockquote>Blah
+
+      Some tags can be nested, but the nesting is reset by the
+      interposition of other tags. For instance, a <tr> tag should
+      implicitly close the previous <tr> tag within the same <table>,
+      but not close a <tr> tag in another table.
+
+       <table><tr>Blah<tr>Blah
+        should be transformed into:
+       <table><tr>Blah</tr><tr>Blah
+        but,
+       <tr>Blah<table><tr>Blah
+        should NOT be transformed into
+       <tr>Blah<table></tr><tr>Blah
+
+    Differing assumptions about tag nesting rules are a major source
+    of problems with the BeautifulSoup class. If BeautifulSoup is not
+    treating as nestable a tag your page author treats as nestable,
+    try ICantBelieveItsBeautifulSoup, MinimalSoup, or
+    BeautifulStoneSoup before writing your own subclass."""
+
+    def __init__(self, *args, **kwargs):
+        if not kwargs.has_key('smartQuotesTo'):
+            kwargs['smartQuotesTo'] = self.HTML_ENTITIES
+        BeautifulStoneSoup.__init__(self, *args, **kwargs)
+
+    SELF_CLOSING_TAGS = buildTagMap(None,
+                                    ['br' , 'hr', 'input', 'img', 'meta',
+                                    'spacer', 'link', 'frame', 'base'])
+
+    QUOTE_TAGS = {'script': None}
+    
+    #According to the HTML standard, each of these inline tags can
+    #contain another tag of the same type. Furthermore, it's common
+    #to actually use these tags this way.
+    NESTABLE_INLINE_TAGS = ['span', 'font', 'q', 'object', 'bdo', 'sub', 'sup',
+                            'center']
+
+    #According to the HTML standard, these block tags can contain
+    #another tag of the same type. Furthermore, it's common
+    #to actually use these tags this way.
+    NESTABLE_BLOCK_TAGS = ['blockquote', 'div', 'fieldset', 'ins', 'del']
+
+    #Lists can contain other lists, but there are restrictions.    
+    NESTABLE_LIST_TAGS = { 'ol' : [],
+                           'ul' : [],
+                           'li' : ['ul', 'ol'],
+                           'dl' : [],
+                           'dd' : ['dl'],
+                           'dt' : ['dl'] }
+
+    #Tables can contain other tables, but there are restrictions.    
+    NESTABLE_TABLE_TAGS = {'table' : [], 
+                           'tr' : ['table', 'tbody', 'tfoot', 'thead'],
+                           'td' : ['tr'],
+                           'th' : ['tr'],
+                           'thead' : ['table'],
+                           'tbody' : ['table'],
+                           'tfoot' : ['table'],
+                           }
+
+    NON_NESTABLE_BLOCK_TAGS = ['address', 'form', 'p', 'pre']
+
+    #If one of these tags is encountered, all tags up to the next tag of
+    #this type are popped.
+    RESET_NESTING_TAGS = buildTagMap(None, NESTABLE_BLOCK_TAGS, 'noscript',
+                                     NON_NESTABLE_BLOCK_TAGS,
+                                     NESTABLE_LIST_TAGS,
+                                     NESTABLE_TABLE_TAGS)
+
+    NESTABLE_TAGS = buildTagMap([], NESTABLE_INLINE_TAGS, NESTABLE_BLOCK_TAGS,
+                                NESTABLE_LIST_TAGS, NESTABLE_TABLE_TAGS)
+
+    # Used to detect the charset in a META tag; see start_meta
+    CHARSET_RE = re.compile("((^|;)\s*charset=)([^;]*)")
+
+    def start_meta(self, attrs):
+        """Beautiful Soup can detect a charset included in a META tag,
+        try to convert the document to that charset, and re-parse the
+        document from the beginning."""
+        httpEquiv = None
+        contentType = None
+        contentTypeIndex = None
+        tagNeedsEncodingSubstitution = False
+
+        for i in range(0, len(attrs)):
+            key, value = attrs[i]
+            key = key.lower()
+            if key == 'http-equiv':
+                httpEquiv = value
+            elif key == 'content':
+                contentType = value
+                contentTypeIndex = i
+
+        if httpEquiv and contentType: # It's an interesting meta tag.
+            match = self.CHARSET_RE.search(contentType)
+            if match:
+                if getattr(self, 'declaredHTMLEncoding') or \
+                       (self.originalEncoding == self.fromEncoding):
+                    # This is our second pass through the document, or
+                    # else an encoding was specified explicitly and it
+                    # worked. Rewrite the meta tag.
+                    newAttr = self.CHARSET_RE.sub\
+                              (lambda(match):match.group(1) +
+                               "%SOUP-ENCODING%", value)
+                    attrs[contentTypeIndex] = (attrs[contentTypeIndex][0],
+                                               newAttr)
+                    tagNeedsEncodingSubstitution = True
+                else:
+                    # This is our first pass through the document.
+                    # Go through it again with the new information.
+                    newCharset = match.group(3)
+                    if newCharset and newCharset != self.originalEncoding:
+                        self.declaredHTMLEncoding = newCharset
+                        self._feed(self.declaredHTMLEncoding)
+                        raise StopParsing
+        tag = self.unknown_starttag("meta", attrs)
+        if tag and tagNeedsEncodingSubstitution:
+            tag.containsSubstitutions = True
+
+class StopParsing(Exception):
+    pass
+   
+class ICantBelieveItsBeautifulSoup(BeautifulSoup):
+
+    """The BeautifulSoup class is oriented towards skipping over
+    common HTML errors like unclosed tags. However, sometimes it makes
+    errors of its own. For instance, consider this fragment:
+
+     <b>Foo<b>Bar</b></b>
+
+    This is perfectly valid (if bizarre) HTML. However, the
+    BeautifulSoup class will implicitly close the first b tag when it
+    encounters the second 'b'. It will think the author wrote
+    "<b>Foo<b>Bar", and didn't close the first 'b' tag, because
+    there's no real-world reason to bold something that's already
+    bold. When it encounters '</b></b>' it will close two more 'b'
+    tags, for a grand total of three tags closed instead of two. This
+    can throw off the rest of your document structure. The same is
+    true of a number of other tags, listed below.
+
+    It's much more common for someone to forget to close a 'b' tag
+    than to actually use nested 'b' tags, and the BeautifulSoup class
+    handles the common case. This class handles the not-co-common
+    case: where you can't believe someone wrote what they did, but
+    it's valid HTML and BeautifulSoup screwed up by assuming it
+    wouldn't be."""
+
+    I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS = \
+     ['em', 'big', 'i', 'small', 'tt', 'abbr', 'acronym', 'strong',
+      'cite', 'code', 'dfn', 'kbd', 'samp', 'strong', 'var', 'b',
+      'big']
+
+    I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS = ['noscript']
+
+    NESTABLE_TAGS = buildTagMap([], BeautifulSoup.NESTABLE_TAGS,
+                                I_CANT_BELIEVE_THEYRE_NESTABLE_BLOCK_TAGS,
+                                I_CANT_BELIEVE_THEYRE_NESTABLE_INLINE_TAGS)
+
+class MinimalSoup(BeautifulSoup):
+    """The MinimalSoup class is for parsing HTML that contains
+    pathologically bad markup. It makes no assumptions about tag
+    nesting, but it does know which tags are self-closing, that
+    <script> tags contain Javascript and should not be parsed, that
+    META tags may contain encoding information, and so on.
+
+    This also makes it better for subclassing than BeautifulStoneSoup
+    or BeautifulSoup."""
+    
+    RESET_NESTING_TAGS = buildTagMap('noscript')
+    NESTABLE_TAGS = {}
+
+class BeautifulSOAP(BeautifulStoneSoup):
+    """This class will push a tag with only a single string child into
+    the tag's parent as an attribute. The attribute's name is the tag
+    name, and the value is the string child. An example should give
+    the flavor of the change:
+
+    <foo><bar>baz</bar></foo>
+     =>
+    <foo bar="baz"><bar>baz</bar></foo>
+
+    You can then access fooTag['bar'] instead of fooTag.barTag.string.
+
+    This is, of course, useful for scraping structures that tend to
+    use subelements instead of attributes, such as SOAP messages. Note
+    that it modifies its input, so don't print the modified version
+    out.
+
+    I'm not sure how many people really want to use this class; let me
+    know if you do. Mainly I like the name."""
+
+    def popTag(self):
+        if len(self.tagStack) > 1:
+            tag = self.tagStack[-1]
+            parent = self.tagStack[-2]
+            parent._getAttrMap()
+            if (isinstance(tag, Tag) and len(tag.contents) == 1 and
+                isinstance(tag.contents[0], NavigableString) and 
+                not parent.attrMap.has_key(tag.name)):
+                parent[tag.name] = tag.contents[0]
+        BeautifulStoneSoup.popTag(self)
+
+#Enterprise class names! It has come to our attention that some people
+#think the names of the Beautiful Soup parser classes are too silly
+#and "unprofessional" for use in enterprise screen-scraping. We feel
+#your pain! For such-minded folk, the Beautiful Soup Consortium And
+#All-Night Kosher Bakery recommends renaming this file to
+#"RobustParser.py" (or, in cases of extreme enterprisness,
+#"RobustParserBeanInterface.class") and using the following
+#enterprise-friendly class aliases:
+class RobustXMLParser(BeautifulStoneSoup):
+    pass
+class RobustHTMLParser(BeautifulSoup):
+    pass
+class RobustWackAssHTMLParser(ICantBelieveItsBeautifulSoup):
+    pass
+class RobustInsanelyWackAssHTMLParser(MinimalSoup):
+    pass
+class SimplifyingSOAPParser(BeautifulSOAP):
+    pass
+
+######################################################
+#
+# Bonus library: Unicode, Dammit
+#
+# This class forces XML data into a standard format (usually to UTF-8
+# or Unicode).  It is heavily based on code from Mark Pilgrim's
+# Universal Feed Parser. It does not rewrite the XML or HTML to
+# reflect a new encoding: that happens in BeautifulStoneSoup.handle_pi
+# (XML) and BeautifulSoup.start_meta (HTML).
+
+# Autodetects character encodings.
+# Download from http://chardet.feedparser.org/
+try:
+    import chardet
+#    import chardet.constants
+#    chardet.constants._debug = 1
+except:
+    chardet = None
+chardet = None
+
+# cjkcodecs and iconv_codec make Python know about more character encodings.
+# Both are available from http://cjkpython.i18n.org/
+# They're built in if you use Python 2.4.
+try:
+    import cjkcodecs.aliases
+except:
+    pass
+try:
+    import iconv_codec
+except:
+    pass
+
+class UnicodeDammit:
+    """A class for detecting the encoding of a *ML document and
+    converting it to a Unicode string. If the source encoding is
+    windows-1252, can replace MS smart quotes with their HTML or XML
+    equivalents."""
+
+    # This dictionary maps commonly seen values for "charset" in HTML
+    # meta tags to the corresponding Python codec names. It only covers
+    # values that aren't in Python's aliases and can't be determined
+    # by the heuristics in find_codec.
+    CHARSET_ALIASES = { "macintosh" : "mac-roman",
+                        "x-sjis" : "shift-jis" }
+
+    def __init__(self, markup, overrideEncodings=[],
+                 smartQuotesTo='xml'):
+        self.markup, documentEncoding, sniffedEncoding = \
+                     self._detectEncoding(markup)
+        self.smartQuotesTo = smartQuotesTo
+        self.triedEncodings = []
+        if markup == '' or isinstance(markup, unicode):
+            self.originalEncoding = None
+            self.unicode = unicode(markup)            
+            return
+        
+        u = None
+        for proposedEncoding in overrideEncodings:
+            u = self._convertFrom(proposedEncoding)
+            if u: break
+        if not u:
+            for proposedEncoding in (documentEncoding, sniffedEncoding):
+                u = self._convertFrom(proposedEncoding)
+                if u: break
+                
+        # If no luck and we have auto-detection library, try that:
+        if not u and chardet and not isinstance(self.markup, unicode):
+            u = self._convertFrom(chardet.detect(self.markup)['encoding'])
+
+        # As a last resort, try utf-8 and windows-1252:
+        if not u:
+            for proposed_encoding in ("utf-8", "windows-1252"):
+                u = self._convertFrom(proposed_encoding)
+                if u: break
+        self.unicode = u
+        if not u: self.originalEncoding = None
+
+    def _subMSChar(self, orig):
+        """Changes a MS smart quote character to an XML or HTML
+        entity."""
+        sub = self.MS_CHARS.get(orig)
+        if type(sub) == types.TupleType:
+            if self.smartQuotesTo == 'xml':
+                sub = '&#x%s;' % sub[1]
+            else:
+                sub = '&%s;' % sub[0]
+        return sub            
+
+    def _convertFrom(self, proposed):        
+        proposed = self.find_codec(proposed)
+        if not proposed or proposed in self.triedEncodings:
+            return None
+        self.triedEncodings.append(proposed)
+        markup = self.markup
+
+        # Convert smart quotes to HTML if coming from an encoding
+        # that might have them.
+        if self.smartQuotesTo and proposed.lower() in("windows-1252",
+                                                      "iso-8859-1",
+                                                      "iso-8859-2"):
+            markup = re.compile("([\x80-\x9f])").sub \
+                     (lambda(x): self._subMSChar(x.group(1)),
+                      markup)
+
+        try:
+            # print "Trying to convert document to %s" % proposed
+            u = self._toUnicode(markup, proposed)
+            self.markup = u       
+            self.originalEncoding = proposed
+        except Exception, e:
+            # print "That didn't work!"
+            # print e
+            return None        
+        #print "Correct encoding: %s" % proposed
+        return self.markup
+
+    def _toUnicode(self, data, encoding):
+        '''Given a string and its encoding, decodes the string into Unicode.
+        %encoding is a string recognized by encodings.aliases'''
+
+        # strip Byte Order Mark (if present)
+        if (len(data) >= 4) and (data[:2] == '\xfe\xff') \
+               and (data[2:4] != '\x00\x00'):
+            encoding = 'utf-16be'
+            data = data[2:]
+        elif (len(data) >= 4) and (data[:2] == '\xff\xfe') \
+                 and (data[2:4] != '\x00\x00'):
+            encoding = 'utf-16le'
+            data = data[2:]
+        elif data[:3] == '\xef\xbb\xbf':
+            encoding = 'utf-8'
+            data = data[3:]
+        elif data[:4] == '\x00\x00\xfe\xff':
+            encoding = 'utf-32be'
+            data = data[4:]
+        elif data[:4] == '\xff\xfe\x00\x00':
+            encoding = 'utf-32le'
+            data = data[4:]
+        newdata = unicode(data, encoding)
+        return newdata
+    
+    def _detectEncoding(self, xml_data):
+        """Given a document, tries to detect its XML encoding."""
+        xml_encoding = sniffed_xml_encoding = None
+        try:
+            if xml_data[:4] == '\x4c\x6f\xa7\x94':
+                # EBCDIC
+                xml_data = self._ebcdic_to_ascii(xml_data)
+            elif xml_data[:4] == '\x00\x3c\x00\x3f':
+                # UTF-16BE
+                sniffed_xml_encoding = 'utf-16be'
+                xml_data = unicode(xml_data, 'utf-16be').encode('utf-8')
+            elif (len(xml_data) >= 4) and (xml_data[:2] == '\xfe\xff') \
+                     and (xml_data[2:4] != '\x00\x00'):
+                # UTF-16BE with BOM
+                sniffed_xml_encoding = 'utf-16be'
+                xml_data = unicode(xml_data[2:], 'utf-16be').encode('utf-8')
+            elif xml_data[:4] == '\x3c\x00\x3f\x00':
+                # UTF-16LE
+                sniffed_xml_encoding = 'utf-16le'
+                xml_data = unicode(xml_data, 'utf-16le').encode('utf-8')
+            elif (len(xml_data) >= 4) and (xml_data[:2] == '\xff\xfe') and \
+                     (xml_data[2:4] != '\x00\x00'):
+                # UTF-16LE with BOM
+                sniffed_xml_encoding = 'utf-16le'
+                xml_data = unicode(xml_data[2:], 'utf-16le').encode('utf-8')
+            elif xml_data[:4] == '\x00\x00\x00\x3c':
+                # UTF-32BE
+                sniffed_xml_encoding = 'utf-32be'
+                xml_data = unicode(xml_data, 'utf-32be').encode('utf-8')
+            elif xml_data[:4] == '\x3c\x00\x00\x00':
+                # UTF-32LE
+                sniffed_xml_encoding = 'utf-32le'
+                xml_data = unicode(xml_data, 'utf-32le').encode('utf-8')
+            elif xml_data[:4] == '\x00\x00\xfe\xff':
+                # UTF-32BE with BOM
+                sniffed_xml_encoding = 'utf-32be'
+                xml_data = unicode(xml_data[4:], 'utf-32be').encode('utf-8')
+            elif xml_data[:4] == '\xff\xfe\x00\x00':
+                # UTF-32LE with BOM
+                sniffed_xml_encoding = 'utf-32le'
+                xml_data = unicode(xml_data[4:], 'utf-32le').encode('utf-8')
+            elif xml_data[:3] == '\xef\xbb\xbf':
+                # UTF-8 with BOM
+                sniffed_xml_encoding = 'utf-8'
+                xml_data = unicode(xml_data[3:], 'utf-8').encode('utf-8')
+            else:
+                sniffed_xml_encoding = 'ascii'
+                pass
+            xml_encoding_match = re.compile \
+                                 ('^<\?.*encoding=[\'"](.*?)[\'"].*\?>')\
+                                 .match(xml_data)
+        except:
+            xml_encoding_match = None
+        if xml_encoding_match:
+            xml_encoding = xml_encoding_match.groups()[0].lower()
+            if sniffed_xml_encoding and \
+               (xml_encoding in ('iso-10646-ucs-2', 'ucs-2', 'csunicode',
+                                 'iso-10646-ucs-4', 'ucs-4', 'csucs4',
+                                 'utf-16', 'utf-32', 'utf_16', 'utf_32',
+                                 'utf16', 'u16')):
+                xml_encoding = sniffed_xml_encoding
+        return xml_data, xml_encoding, sniffed_xml_encoding
+
+
+    def find_codec(self, charset):
+        return self._codec(self.CHARSET_ALIASES.get(charset, charset)) \
+               or (charset and self._codec(charset.replace("-", ""))) \
+               or (charset and self._codec(charset.replace("-", "_"))) \
+               or charset
+
+    def _codec(self, charset):
+        if not charset: return charset 
+        codec = None
+        try:
+            codecs.lookup(charset)
+            codec = charset
+        except LookupError:
+            pass
+        return codec
+
+    EBCDIC_TO_ASCII_MAP = None
+    def _ebcdic_to_ascii(self, s):
+        c = self.__class__
+        if not c.EBCDIC_TO_ASCII_MAP:
+            emap = (0,1,2,3,156,9,134,127,151,141,142,11,12,13,14,15,
+                    16,17,18,19,157,133,8,135,24,25,146,143,28,29,30,31,
+                    128,129,130,131,132,10,23,27,136,137,138,139,140,5,6,7,
+                    144,145,22,147,148,149,150,4,152,153,154,155,20,21,158,26,
+                    32,160,161,162,163,164,165,166,167,168,91,46,60,40,43,33,
+                    38,169,170,171,172,173,174,175,176,177,93,36,42,41,59,94,
+                    45,47,178,179,180,181,182,183,184,185,124,44,37,95,62,63,
+                    186,187,188,189,190,191,192,193,194,96,58,35,64,39,61,34,
+                    195,97,98,99,100,101,102,103,104,105,196,197,198,199,200,
+                    201,202,106,107,108,109,110,111,112,113,114,203,204,205,
+                    206,207,208,209,126,115,116,117,118,119,120,121,122,210,
+                    211,212,213,214,215,216,217,218,219,220,221,222,223,224,
+                    225,226,227,228,229,230,231,123,65,66,67,68,69,70,71,72,
+                    73,232,233,234,235,236,237,125,74,75,76,77,78,79,80,81,
+                    82,238,239,240,241,242,243,92,159,83,84,85,86,87,88,89,
+                    90,244,245,246,247,248,249,48,49,50,51,52,53,54,55,56,57,
+                    250,251,252,253,254,255)
+            import string
+            c.EBCDIC_TO_ASCII_MAP = string.maketrans( \
+            ''.join(map(chr, range(256))), ''.join(map(chr, emap)))
+        return s.translate(c.EBCDIC_TO_ASCII_MAP)
+
+    MS_CHARS = { '\x80' : ('euro', '20AC'),
+                 '\x81' : ' ',
+                 '\x82' : ('sbquo', '201A'),
+                 '\x83' : ('fnof', '192'),
+                 '\x84' : ('bdquo', '201E'),
+                 '\x85' : ('hellip', '2026'),
+                 '\x86' : ('dagger', '2020'),
+                 '\x87' : ('Dagger', '2021'),
+                 '\x88' : ('circ', '2C6'),
+                 '\x89' : ('permil', '2030'),
+                 '\x8A' : ('Scaron', '160'),
+                 '\x8B' : ('lsaquo', '2039'),
+                 '\x8C' : ('OElig', '152'),
+                 '\x8D' : '?',
+                 '\x8E' : ('#x17D', '17D'),
+                 '\x8F' : '?',
+                 '\x90' : '?',
+                 '\x91' : ('lsquo', '2018'),
+                 '\x92' : ('rsquo', '2019'),
+                 '\x93' : ('ldquo', '201C'),
+                 '\x94' : ('rdquo', '201D'),
+                 '\x95' : ('bull', '2022'),
+                 '\x96' : ('ndash', '2013'),
+                 '\x97' : ('mdash', '2014'),
+                 '\x98' : ('tilde', '2DC'),
+                 '\x99' : ('trade', '2122'),
+                 '\x9a' : ('scaron', '161'),
+                 '\x9b' : ('rsaquo', '203A'),
+                 '\x9c' : ('oelig', '153'),
+                 '\x9d' : '?',
+                 '\x9e' : ('#x17E', '17E'),
+                 '\x9f' : ('Yuml', ''),}
+
+#######################################################################
+
+
+#By default, act as an HTML pretty-printer.
+if __name__ == '__main__':
+    import sys
+    soup = BeautifulSoup(sys.stdin.read())
+    print soup.prettify()
diff --git a/bin/check-example.js b/bin/check-example.js
new file mode 100644
index 0000000..ee7b8be
--- /dev/null
+++ b/bin/check-example.js
@@ -0,0 +1,33 @@
+//
+// A PhantomJS script used to check that the hosted examples load
+// without errors. This script is executed by the build tool's
+// check-examples target.
+//
+var args = require('system').args;
+if (args.length != 2) {
+  phantom.exit(2);
+}
+var examplePath = args[1];
+var page = require('webpage').create();
+page.onError = function(msg, trace) {
+  var msgStack = ['JavaScript ERROR: ' + msg];
+  if (trace) {
+    msgStack.push('TRACE:');
+    trace.forEach(function(t) {
+      msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
+    });
+  }
+  console.error(msgStack.join('\n'));
+  phantom.exit(1);
+};
+page.open(examplePath, function(s) {
+  var exitCode = 0;
+  if (s != 'success') {
+    exitCode = 1;
+    console.error('PAGE LOAD ERROR');
+  }
+  phantom.exit(exitCode);
+});
+page.onConsoleMessage = function(msg) {
+  console.log('console:', msg);
+};
diff --git a/bin/combine-examples.py b/bin/combine-examples.py
new file mode 100755
index 0000000..c9cd9e3
--- /dev/null
+++ b/bin/combine-examples.py
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+
+import re
+import sys
+
+
+def main(argv):
+    examples = {}
+    requires = set()
+    for filename in argv[1:]:
+        lines = open(filename, 'rU').readlines()
+        if len(lines) > 0 and lines[0].startswith('// NOCOMPILE'):
+            continue
+        requires.update(line for line in lines if line.startswith('goog.require'))
+        examples[filename] = [line for line in lines if not line.startswith('goog.require')]
+    for require in sorted(requires):
+        sys.stdout.write(require)
+    for filename in sorted(examples.keys()):
+        sys.stdout.write('// ' + filename + '\n')
+        sys.stdout.write('(function(){\n')
+        for line in examples[filename]:
+            sys.stdout.write(line)
+        sys.stdout.write('})();\n')
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
diff --git a/bin/example-screenshot.js b/bin/example-screenshot.js
new file mode 100644
index 0000000..ac86cfa
--- /dev/null
+++ b/bin/example-screenshot.js
@@ -0,0 +1,180 @@
+
+
+/**
+ * This script is supposed to be executed via phantomjs. It will generate
+ * screenshots of the html files in the directory specified by a commandline
+ * option when these files are served through a webserver which can also be
+ * specified. The screenshots will be in the current working directory.
+ *
+ * Example usage:
+ *
+ *     user at host:~/ol3/bin $ phantomjs example-screenshot.js \
+ *                           http://localhost:8000/ol3/examples/ \
+ *                           ../examples
+ *
+ * The above command will generate `*.png` files in `examples/` for all html
+ * files that are served through `http://localhost:8000/ol3/examples/`.
+ *
+ * So if there is a file `my-humpty-example.html` inside of the relative folder
+ * `../examples/` which is being served through the webserver so that
+ * `http://localhost:8000/ol3/examples/my-humpty-example.html` is a valid and
+ * reachable URL, this script will generate a screenshot and store it as
+ * `my-humpty-example.html.png`.
+ *
+ * The query string `?mode=raw` will be appended to the generated URL.
+ *
+ * Known limitations:
+ *
+ * As phantomjs doesn't support WebGL (see e.g.
+ * https://github.com/ariya/phantomjs/wiki/Supported-Web-Standards and
+ * http://code.google.com/p/phantomjs/issues/detail?id=273) This won't render
+ * OpenLayers maps rendered through the webglrenderer.
+ *
+ * In parts based upon this gist: https://gist.github.com/crazy4groovy/3160121
+ */
+(function() { // global closure
+
+  var page = require('webpage').create(), // imports
+      fs = require('fs'),
+      system = require('system'),
+      // arguments
+      baseExamplesUrl = system.args[1],
+      exampleDir = system.args[2],
+      // various settings
+      ignoreFiles = [
+        'index.html'
+      ],
+      intervalMillisecs = 25,
+      renderMillisecs = 2000,
+      // basic variables
+      curDir = fs.workingDirectory,
+      exampleDirList = fs.list(exampleDir),
+      pageindex = 0,
+      fileName = '',
+      htmlFiles = [],
+      lenHtmlFiles = 0,
+      loadInProgress = false;
+
+  // simple object with helper functions
+  var util = {
+    /**
+     * Returns the basename of a file given a path.
+     */
+    baseName: function(path) {
+      var parts = path.split(fs.separator);
+      return parts[parts.length - 1];
+    },
+    /**
+     * Super basic test whether a file can be considered a HTML-file.
+     */
+    isHtmlFile: function(filename) {
+      return (/\.html?$/).test(filename);
+    },
+    /**
+     * Appends a slash to given string if it isn't there already.
+     */
+    appendSlash: function(str) {
+      return ((/\/$/).test(str)) ? str : str + '/';
+    },
+    /**
+     * Generates an URL out of given baseurl and path.
+     */
+    buildUrl: function(baseurl, path) {
+      var name = util.baseName(path),
+          mode = 'raw';
+      return util.appendSlash(baseurl) + name + '?mode=' + mode;
+    },
+    /**
+     * Simple progressbar logger that uses our globals pageindex & lenHtmlFiles.
+     */
+    logProgress: function() {
+      var doneSymbol = '-',
+          todoSymbol = ' ',
+          currentSymbol = '>',
+          barStrLeft = '[',
+          barStrRight = ']',
+          progresStep = 5, // one doneSymbol equals this percentage
+          totalSteps = Math.round(100 / progresStep),
+          ratio = (lenHtmlFiles === 0) ? 0 : (pageindex / lenHtmlFiles),
+          percent = (ratio === 0) ? 0 : ratio * 100,
+          normalizedNumDone = Math.floor(ratio * totalSteps),
+          normalizedNumTodo = totalSteps - normalizedNumDone,
+          progressLine = '',
+          i = 0;
+      // the progress bar
+      progressLine += barStrLeft;
+      for (; i < normalizedNumDone; i++) {
+        progressLine += doneSymbol;
+      }
+      for (i = 0; i < normalizedNumTodo; i++) {
+        progressLine += (i === 0) ? currentSymbol : todoSymbol;
+      }
+      progressLine += barStrRight;
+      // the percentage information
+      // pad if necessary
+      if (percent < 10) {
+        progressLine += '  ';
+      } else if (percent < 100) {
+        progressLine += ' ';
+      }
+      progressLine += ' ' + percent.toFixed(1) + ' % done';
+      // additional information
+      if (fileName !== '') {
+        progressLine += ', ' + util.baseName(fileName) + '';
+      }
+      console.log(progressLine);
+    }
+  };
+
+  // iterate over all files in examples directory
+  // and find the HTML files.
+  for (var i = 0; i < exampleDirList.length; i++) {
+    var fullpath = exampleDir + fs.separator + exampleDirList[i];
+    if (fs.isFile(fullpath) && util.isHtmlFile(fullpath) &&
+        ignoreFiles.indexOf(util.baseName(fullpath)) === -1) {
+      //TODO: make this more async (i.e. pop on/off stack WHILE rending pages)
+      htmlFiles.push(fullpath);
+    }
+  }
+  lenHtmlFiles = htmlFiles.length;
+
+  console.log('Capturing ' + lenHtmlFiles + ' example screenshots.');
+
+  // The main interval function that is executed regularily and renders a
+  // page to a file
+  var interval = setInterval(function() {
+    if (!loadInProgress && pageindex < lenHtmlFiles) {
+      util.logProgress();
+      fileName = htmlFiles[pageindex];
+      page.viewportSize = { width: 800, height: 600 };
+      page.clipRect = {
+        top: 0,
+        left: 0,
+        width: page.viewportSize.width,
+        height: page.viewportSize.height
+      };
+      page.open(util.buildUrl(baseExamplesUrl, htmlFiles[pageindex]));
+    }
+    if (pageindex == lenHtmlFiles) {
+      util.logProgress();
+      console.log(lenHtmlFiles + ' screenshots captured.');
+      phantom.exit();
+    }
+  }, intervalMillisecs);
+
+  // set loadInProgress flag so we only process one image at time.
+  page.onLoadStarted = function() {
+    loadInProgress = true;
+  };
+
+  // When the page is loaded, render it to an image
+  page.onLoadFinished = function() {
+    var dest = exampleDir + fs.separator + util.baseName(fileName) + '.png';
+    window.setTimeout(function() {
+      loadInProgress = false;
+      page.render(dest); // actually render the page.
+      pageindex++;
+    }, renderMillisecs);
+  };
+
+})(); // eof global closure
diff --git a/bin/exampleparser.py b/bin/exampleparser.py
new file mode 100755
index 0000000..7a7352e
--- /dev/null
+++ b/bin/exampleparser.py
@@ -0,0 +1,269 @@
+#!/usr/bin/env python
+
+import sys
+import os
+import re
+import time
+from xml.dom.minidom import Document
+
+try:
+    import xml.etree.ElementTree as ElementTree
+except ImportError:
+    try:
+        import cElementTree as ElementTree  # NOQA
+    except ImportError:
+        try:
+            import elementtree.ElementTree as ElementTree # NOQA
+        except ImportError:
+            import lxml.etree as ElementTree  # NOQA
+
+missing_deps = False
+try:
+    import json
+except ImportError:
+    try:
+        import simplejson as json  # NOQA
+    except ImportError, E:
+        missing_deps = E
+
+try:
+    from BeautifulSoup import BeautifulSoup
+except ImportError, E:
+    missing_deps = E
+
+feedName = "example-list.xml"
+feedPath = "http://openlayers.github.io/ol3/master/examples/"
+
+
+def getListOfExamples(relPath):
+    """
+    returns list of .html filenames within a given path - excludes
+    index.html
+    """
+    examples = os.listdir(relPath)
+    examples = [example for example in examples if
+                example.endswith('.html') and example != "index.html"]
+    return examples
+
+
+def getExampleHtml(path):
+    """
+    returns html of a specific example
+    """
+    print '.',
+    f = open(path)
+    html = f.read()
+    f.close()
+    return html
+
+
+def extractById(soup, tagId, value=None):
+    """
+    returns full contents of a particular tag id
+    """
+    beautifulTag = soup.find(id=tagId)
+    if beautifulTag:
+        if beautifulTag.contents:
+            value = str(beautifulTag.renderContents()).strip()
+            value = value.replace('\t', '')
+            value = value.replace('\n', '')
+    return value
+
+
+def getRelatedClasses(html):
+    """
+    parses the html, and returns a list of all OpenLayers Classes
+    used within (ie what parts of OL the javascript uses).
+    """
+    rawstr = r'''(?P<class>ol\..*?)\('''
+    return re.findall(rawstr, html)
+
+
+def parseHtml(html, ids):
+    """
+    returns dictionary of items of interest
+    """
+    soup = BeautifulSoup(html)
+    d = {}
+    for tagId in ids:
+        d[tagId] = extractById(soup, tagId)
+    #classes should eventually be parsed from docs - not automatically created.
+    classes = getRelatedClasses(html)
+    d['classes'] = classes
+    return d
+
+
+def getGitInfo(exampleDir, exampleName):
+    orig = os.getcwd()
+    os.chdir(exampleDir)
+    h = os.popen("git log -n 1 --pretty=format:'%an|%ai' " + exampleName)
+    os.chdir(orig)
+    log = h.read()
+    h.close()
+    d = {}
+    if log:
+        parts = log.split("|")
+        d["author"] = parts[0]
+        # compensate for spaces in git log time
+        td = parts[1].split(" ")
+        td.insert(1, "T")
+        d["date"] = "".join(td)
+    else:
+        d["author"] = ""
+        d["date"] = ""
+    return d
+
+
+def createFeed(examples):
+    doc = Document()
+    atomuri = "http://www.w3.org/2005/Atom"
+    feed = doc.createElementNS(atomuri, "feed")
+    feed.setAttribute("xmlns", atomuri)
+    title = doc.createElementNS(atomuri, "title")
+    title.appendChild(doc.createTextNode("OpenLayers Examples"))
+    feed.appendChild(title)
+    link = doc.createElementNS(atomuri, "link")
+    link.setAttribute("rel", "self")
+    link.setAttribute("href", feedPath + feedName)
+
+    modtime = time.strftime("%Y-%m-%dT%I:%M:%SZ", time.gmtime())
+    id = doc.createElementNS(atomuri, "id")
+    id.appendChild(doc.createTextNode(
+        "%s%s#%s" % (feedPath, feedName, modtime)))
+    feed.appendChild(id)
+
+    updated = doc.createElementNS(atomuri, "updated")
+    updated.appendChild(doc.createTextNode(modtime))
+    feed.appendChild(updated)
+
+    examples.sort(key=lambda x: x["modified"])
+    for example in sorted(examples, key=lambda x: x["modified"], reverse=True):
+        entry = doc.createElementNS(atomuri, "entry")
+
+        title = doc.createElementNS(atomuri, "title")
+        title.appendChild(doc.createTextNode(example["title"] or
+                                             example["example"]))
+        entry.appendChild(title)
+
+        tags = doc.createElementNS(atomuri, "tags")
+        tags.appendChild(doc.createTextNode(example["tags"] or
+                                            example["example"]))
+        entry.appendChild(tags)
+
+        link = doc.createElementNS(atomuri, "link")
+        link.setAttribute("href", "%s%s" % (feedPath, example["example"]))
+        entry.appendChild(link)
+
+        summary = doc.createElementNS(atomuri, "summary")
+        summary.appendChild(doc.createTextNode(example["shortdesc"] or
+                                               example["example"]))
+        entry.appendChild(summary)
+
+        updated = doc.createElementNS(atomuri, "updated")
+        updated.appendChild(doc.createTextNode(example["modified"]))
+        entry.appendChild(updated)
+
+        author = doc.createElementNS(atomuri, "author")
+        name = doc.createElementNS(atomuri, "name")
+        name.appendChild(doc.createTextNode(example["author"]))
+        author.appendChild(name)
+        entry.appendChild(author)
+
+        id = doc.createElementNS(atomuri, "id")
+        id.appendChild(doc.createTextNode("%s%s#%s" % (feedPath,
+                                                       example["example"],
+                                                       example["modified"])))
+        entry.appendChild(id)
+
+        feed.appendChild(entry)
+
+    doc.appendChild(feed)
+    return doc
+
+
+def wordIndex(examples):
+    """
+    Create an inverted index based on words in title and shortdesc.  Keys are
+    lower cased words.  Values are dictionaries with example index keys and
+    count values.
+    """
+    index = {}
+    unword = re.compile("\\W+")
+    keys = ["shortdesc", "title", "tags"]
+    for i in range(len(examples)):
+        for key in keys:
+            text = examples[i][key]
+            if text:
+                words = unword.split(text)
+                for word in words:
+                    if word:
+                        word = word.lower()
+                        if word in index:
+                            if i in index[word]:
+                                index[word][i] += 1
+                            else:
+                                index[word][i] = 1
+                        else:
+                            index[word] = {i: 1}
+    return index
+
+if __name__ == "__main__":
+
+    if missing_deps:
+        print """This script requires json or simplejson and BeautifulSoup.
+You don't have them. \n(%s)""" % E
+        sys.exit()
+
+    if len(sys.argv) == 3:
+        inExampleDir = sys.argv[1]
+        outExampleDir = sys.argv[2]
+    else:
+        inExampleDir = "../examples"
+        outExampleDir = "../examples"
+
+    outFile = open(os.path.join(outExampleDir, "example-list.js"), "w")
+
+    print 'Reading examples from %s and writing out to %s' % (inExampleDir,
+                                                              outFile.name)
+
+    exampleList = []
+    docIds = ['title', 'shortdesc', 'tags']
+
+    examples = getListOfExamples(inExampleDir)
+
+    modtime = time.strftime("%Y-%m-%dT%I:%M:%SZ", time.gmtime())
+
+    for example in examples:
+        path = os.path.join(inExampleDir, example)
+        html = getExampleHtml(path)
+        tagvalues = parseHtml(html, docIds)
+        tagvalues['example'] = example
+        # add in author/date info
+        d = getGitInfo(inExampleDir, example)
+        tagvalues["author"] = d["author"] or "anonymous"
+        tagvalues["modified"] = d["date"] or modtime
+        tagvalues['link'] = example
+
+        exampleList.append(tagvalues)
+
+    print
+
+    exampleList.sort(key=lambda x: x['example'].lower())
+
+    index = wordIndex(exampleList)
+
+    json = json.dumps({"examples": exampleList, "index": index})
+    # Give the json a global variable we can use in our js.
+    # This should be replaced or made optional.
+    json = 'var info=' + json + ';'
+    outFile.write(json)
+    outFile.close()
+
+    outFeedPath = os.path.join(outExampleDir, feedName)
+    print "writing feed to %s " % outFeedPath
+    atom = open(outFeedPath, 'w')
+    doc = createFeed(exampleList)
+    atom.write(doc.toxml())
+    atom.close()
+
+    print 'complete'
diff --git a/bin/loader_hosted_examples.js b/bin/loader_hosted_examples.js
new file mode 100644
index 0000000..3ca9429
--- /dev/null
+++ b/bin/loader_hosted_examples.js
@@ -0,0 +1,69 @@
+/**
+ * This loader is used for the hosted examples. It is used in place of the
+ * development loader (examples/loader.js).
+ *
+ * The loader loads ol.js and the example's script in "production" mode; it
+ * loads Closure Library's base.js, ol-deps.js, the example's "goog.require"
+ * script, and the example's script in "development" mode.
+ *
+ * The ol.js and ol-deps.js scripts are built by OL3's build.py script.
+ * They are located in the ../build/ directory, relative to this script.
+ *
+ * The script must be named loader.js.
+ *
+ * Usage:
+ *
+ *     <script src="../loader.js?id=my-demo"></script>
+ */
+
+(function() {
+
+  var i, pair;
+
+  var href = window.location.href, start, end, paramsString, pairs,
+      pageParams = {};
+  if (href.indexOf('?') > 0) {
+    start = href.indexOf('?') + 1;
+    end = href.indexOf('#') > 0 ? href.indexOf('#') : href.length;
+    paramsString = href.substring(start, end);
+    pairs = paramsString.split(/[&;]/);
+    for (i = 0; i < pairs.length; ++i) {
+      pair = pairs[i].split('=');
+      if (pair[0]) {
+          pageParams[decodeURIComponent(pair[0])] =
+              decodeURIComponent(pair[1]);
+      }
+    }
+  }
+
+  var scripts = document.getElementsByTagName('script');
+  var src, index, search, chunks, scriptParams = {};
+  for (i = scripts.length - 1; i >= 0; --i) {
+    src = scripts[i].getAttribute('src');
+    if (~(index = src.indexOf('loader.js?'))) {
+      search = src.substr(index + 10);
+      chunks = search ? search.split('&') : [];
+      for (i = chunks.length - 1; i >= 0; --i) {
+        pair = chunks[i].split('=');
+        if (pair[0]) {
+          scriptParams[decodeURIComponent(pair[0])] =
+              decodeURIComponent(pair[1]);
+        }
+      }
+      break;
+    }
+  }
+
+  var raw = pageParams.mode && pageParams.mode.toLowerCase() === 'raw';
+
+  var scriptId = encodeURIComponent(scriptParams.id);
+  if (!raw) {
+    document.write('<scr' + 'ipt type="text/javascript" src="../build/ol.js"></scr' + 'ipt>');
+  } else {
+    window.CLOSURE_NO_DEPS = true; // we've got our own deps file
+    document.write('<scr' + 'ipt type="text/javascript" src="../closure-library/closure/goog/base.js"></scr' + 'ipt>');
+    document.write('<scr' + 'ipt type="text/javascript" src="../build/ol-deps.js"></scr' + 'ipt>');
+    document.write('<scr' + 'ipt type="text/javascript" src="' + scriptId + '-require.js"></scr' + 'ipt>');
+  }
+  document.write('<scr' + 'ipt type="text/javascript" src="' + scriptId + '.js"></scr' + 'ipt>');
+}());
diff --git a/bin/pyglslunit.py b/bin/pyglslunit.py
new file mode 100644
index 0000000..2bea402
--- /dev/null
+++ b/bin/pyglslunit.py
@@ -0,0 +1,121 @@
+#!/usr/bin/python
+
+from optparse import OptionParser
+import re
+import sys
+
+import pystache
+
+
+ESCAPE_SEQUENCE = {
+        '\\': '\\\\',
+        '\n': '\\n',
+        '\t': '\\t'
+        }
+
+
+def js_escape(s):
+    return ''.join(ESCAPE_SEQUENCE.get(c, c) for c in s)
+
+
+def glsl_compress(s, shortNames):
+    # strip leading whitespace
+    s = re.sub(r'\A\s+', '', s)
+    # strip trailing whitespace
+    s = re.sub(r'\s+\Z', '', s)
+    # strip multi-line comments
+    s = re.sub(r'/\*.*?\*/', '', s)
+    # strip single line comments
+    s = re.sub(r'//.*?\n', '', s)
+    # replace multiple whitespace with a single space
+    s = re.sub(r'\s+', ' ', s)
+    # remove whitespace between non-word tokens
+    s = re.sub(r'(\S)\s+([^\w])', r'\1\2', s)
+    s = re.sub(r'([^\w])\s+(\S)', r'\1\2', s)
+    # replace original names with short names
+    for originalName, shortName in shortNames.items():
+        s = s.replace(originalName, shortName)
+    return s
+
+
+def main(argv):
+    option_parser = OptionParser()
+    option_parser.add_option('--input')
+    option_parser.add_option('--output')
+    option_parser.add_option('--template')
+    options, args = option_parser.parse_args(argv[1:])
+
+    context = {}
+    nextShortName = ord('a')
+    shortNames = {}
+
+    common, vertex, fragment = [], [], []
+    attributes, uniforms, varyings = {}, {}, {}
+    block = None
+    for line in open(options.input, 'rU'):
+        if line.startswith('//!'):
+            m = re.match(r'//!\s+NAMESPACE=(\S+)\s*\Z', line)
+            if m:
+                context['namespace'] = m.group(1)
+                continue
+            m = re.match(r'//!\s+CLASS=(\S+)\s*\Z', line)
+            if m:
+                context['className'] = m.group(1)
+                continue
+            m = re.match(r'//!\s+COMMON\s*\Z', line)
+            if m:
+                block = common
+                continue
+            m = re.match(r'//!\s+VERTEX\s*\Z', line)
+            if m:
+                block = vertex
+                continue
+            m = re.match(r'//!\s+FRAGMENT\s*\Z', line)
+            if m:
+                block = fragment
+                continue
+        else:
+            if block is None:
+                assert line.rstrip() == ''
+            else:
+                block.append(line)
+            m = re.match(r'attribute\s+\S+\s+(\S+);\s*\Z', line)
+            if m:
+                attribute = m.group(1)
+                if attribute not in attributes:
+                    shortName = chr(nextShortName)
+                    nextShortName += 1
+                    attributes[attribute] = {'originalName': attribute, 'shortName': shortName}
+                    shortNames[attribute] = shortName
+            m = re.match(r'uniform\s+\S+\s+(\S+);\s*\Z', line)
+            if m:
+                uniform = m.group(1)
+                if uniform not in uniforms:
+                    shortName = chr(nextShortName)
+                    nextShortName += 1
+                    uniforms[uniform] = {'originalName': uniform, 'shortName': shortName}
+                    shortNames[uniform] = shortName
+            m = re.match(r'varying\s+\S+\s+(\S+);\s*\Z', line)
+            if m:
+                varying = m.group(1)
+                if varying not in varyings:
+                    shortName = chr(nextShortName)
+                    nextShortName += 1
+                    shortNames[varying] = shortName
+
+    context['getOriginalFragmentSource'] = js_escape(''.join(common + fragment))
+    context['getOriginalVertexSource'] = js_escape(''.join(common + vertex))
+    context['getFragmentSource'] = glsl_compress(''.join(common + fragment), shortNames)
+    context['getVertexSource'] = glsl_compress(''.join(common + vertex), shortNames)
+    context['getAttributes'] = [attributes[a] for a in sorted(attributes.keys())]
+    context['getUniforms'] = [uniforms[u] for u in sorted(uniforms.keys())]
+
+    if options.output and options.output != '-':
+        output = open(options.output, 'wb')
+    else:
+        output = sys.stdout
+    output.write(pystache.render(open(options.template, 'rb').read(), context))
+
+
+if __name__ == '__main__':
+    sys.exit(main(sys.argv))
diff --git a/build.cmd b/build.cmd
new file mode 100755
index 0000000..75c1454
--- /dev/null
+++ b/build.cmd
@@ -0,0 +1,2 @@
+ at echo off
+%SystemDrive%\Python27\python.exe build.py %*
diff --git a/build.py b/build.py
new file mode 100755
index 0000000..9b53484
--- /dev/null
+++ b/build.py
@@ -0,0 +1,801 @@
+#!/usr/bin/env python
+
+from cStringIO import StringIO
+import glob
+import gzip
+import json
+import multiprocessing
+import os
+import re
+import shutil
+import sys
+
+from pake import Target
+from pake import ifind, main, output, rule, target, variables, virtual, which
+from Queue import Queue
+from threading import Thread
+
+
+class ThreadPool:
+    """A basic pool of worker threads"""
+    class Worker(Thread):
+        def __init__(self, tasks):
+            Thread.__init__(self)
+            self.tasks = tasks
+            self.daemon = True # threads will be killed on exit
+            self.start()
+
+        def run(self):
+            while True:
+                # block until a task is ready to be done
+                function, args, kargs = self.tasks.get()
+                try:
+                    function(*args, **kargs)
+                except:
+                    print("ERROR")
+                    for count, thing in enumerate(args):
+                        print '{0}. {1}'.format(count, thing)
+                    print(sys.exc_info()[0])
+                    print("ERROR")
+                    self.tasks.errors = True
+                self.tasks.task_done()
+
+    def __init__(self, num_threads = multiprocessing.cpu_count() + 1):
+        self.tasks = Queue(num_threads)
+        self.tasks.errors = False
+        # create num_threads Workers, by default the number of CPUs + 1
+        for _ in range(num_threads): self.Worker(self.tasks)
+
+    def add_task(self, function, *args, **kargs):
+        self.tasks.put((function, args, kargs))
+
+    def wait_completion(self):
+        # wait for the queue to be empty
+        self.tasks.join()
+        return self.tasks.errors
+
+
+if sys.platform == 'win32':
+
+    win = {
+        'CLEANCSS': './node_modules/.bin/cleancss',
+        'GIT': 'git.exe',
+        'GJSLINT': 'gjslint.exe',
+        'JSDOC': './node_modules/.bin/jsdoc',
+        'JSHINT': './node_modules/.bin/jshint',
+        'PYTHON': 'python.exe',
+        'PHANTOMJS': './node_modules/.bin/phantomjs'
+    }
+
+    sys_dir = os.environ.get('SYSTEMDRIVE')
+    program_files = os.environ.get('PROGRAMFILES')
+
+    if not which(win['GIT']):
+        win['GIT'] = os.path.join(program_files, 'Git', 'cmd', 'git.exe')
+    if not which(win['GIT']):
+        win['GIT'] = os.path.join(program_files, 'Git', 'bin', 'git.exe')
+
+    if not which(win['PYTHON']):
+        win['PYTHON'] = os.path.join(sys_dir, 'Python27', 'python.exe')
+
+    if not which(win['GJSLINT']):
+        win['GJSLINT'] = os.path.join(sys_dir, 'Python27', 'Scripts', 'gjslint.exe')
+
+    if not which(win['PHANTOMJS']):
+        win['PHANTOMJS'] = 'phantomjs.exe'
+    if not which(win['PHANTOMJS']):
+        win['PHANTOMJS'] = os.path.join(sys_dir, 'phantomjs-1.9.7-windows', 'phantomjs.exe')
+
+    if not which(win['JSDOC']):
+        win['JSDOC'] = os.path.join(program_files, 'jsdoc3', 'jsdoc.cmd')
+
+    for program, path in win.iteritems():
+        setattr(variables, program, path)
+
+else:
+    variables.CLEANCSS = './node_modules/.bin/cleancss'
+    variables.GIT = 'git'
+    variables.GJSLINT = 'gjslint'
+    variables.JSHINT = './node_modules/.bin/jshint'
+    variables.JSDOC = './node_modules/.bin/jsdoc'
+    variables.PYTHON = 'python'
+    variables.PHANTOMJS = './node_modules/.bin/phantomjs'
+
+variables.BRANCH = output(
+    '%(GIT)s', 'rev-parse', '--abbrev-ref', 'HEAD').strip()
+
+EXECUTABLES = [variables.CLEANCSS, variables.GIT, variables.GJSLINT,
+               variables.JSDOC, variables.JSHINT, variables.PYTHON,
+               variables.PHANTOMJS]
+
+EXAMPLES = [path
+            for path in ifind('examples')
+            if path.endswith('.html')
+            if path != 'examples/index.html']
+
+EXAMPLES_SRC = [path
+                for path in ifind('examples')
+                if path.endswith('.js')
+                if not path.endswith('.combined.js')
+                if path != 'examples/Jugl.js'
+                if path != 'examples/example-list.js']
+
+EXAMPLES_JSON = ['build/' + example.replace('.html', '.json')
+                 for example in EXAMPLES]
+
+EXAMPLES_COMBINED = ['build/' + example.replace('.html', '.combined.js')
+                     for example in EXAMPLES]
+
+GLSL_SRC = [path
+            for path in ifind('src')
+            if path.endswith('.glsl')]
+
+JSDOC_SRC = [path
+             for path in ifind('src')
+             if path.endswith('.jsdoc')]
+
+SHADER_SRC = [path.replace('.glsl', 'shader.js')
+              for path in GLSL_SRC]
+
+SPEC = [path
+        for path in ifind('test/spec')
+        if path.endswith('.js')]
+
+TASKS = [path
+         for path in ifind('tasks')
+         if path.endswith('.js')]
+
+SRC = [path
+       for path in ifind('src/ol')
+       if path.endswith('.js')
+       if path not in SHADER_SRC]
+
+NPM_INSTALL = 'build/npm-install-timestamp'
+
+def report_sizes(t):
+    stringio = StringIO()
+    gzipfile = gzip.GzipFile(t.name, 'w', 9, stringio)
+    with open(t.name, 'rb') as f:
+        shutil.copyfileobj(f, gzipfile)
+    gzipfile.close()
+    rawsize = os.stat(t.name).st_size
+    gzipsize = len(stringio.getvalue())
+    savings = '{0:.2%}'.format((rawsize - gzipsize)/float(rawsize))
+    t.info('uncompressed: %8d bytes', rawsize)
+    t.info('  compressed: %8d bytes, (saved %s)', gzipsize, savings)
+
+
+virtual('default', 'build')
+
+
+virtual('ci', 'lint', 'build', 'test',
+    'build/examples/all.combined.js', 'check-examples', 'apidoc')
+
+
+virtual('build', 'build/ol.css', 'build/ol.js', 'build/ol-debug.js')
+
+
+virtual('check', 'lint', 'build/ol.js', 'test')
+
+
+virtual('todo', 'fixme')
+
+
+ at target(NPM_INSTALL, 'package.json')
+def npm_install(t):
+    t.run('npm', 'install')
+    t.touch()
+
+
+ at target('build/ol.css', 'css/ol.css', NPM_INSTALL)
+def build_ol_css(t):
+    t.output('%(CLEANCSS)s', 'css/ol.css')
+
+
+ at target('build/ol.js', SRC, SHADER_SRC, 'config/ol.json', NPM_INSTALL)
+def build_ol_new_js(t):
+    t.run('node', 'tasks/build.js', 'config/ol.json', 'build/ol.js')
+    report_sizes(t)
+
+
+ at target('build/ol-debug.js', SRC, SHADER_SRC, 'config/ol-debug.json',
+        NPM_INSTALL)
+def build_ol_debug_js(t):
+    t.run('node', 'tasks/build.js', 'config/ol-debug.json', 'build/ol-debug.js')
+    report_sizes(t)
+
+
+for glsl_src in GLSL_SRC:
+    def shader_src_helper(glsl_src):
+        @target(glsl_src.replace('.glsl', 'shader.js'), glsl_src,
+                'src/ol/webgl/shader.mustache', 'bin/pyglslunit.py')
+        def shader_src(t):
+            t.run('%(PYTHON)s', 'bin/pyglslunit.py',
+                  '--input', glsl_src,
+                  '--template', 'src/ol/webgl/shader.mustache',
+                  '--output', t.name)
+    shader_src_helper(glsl_src)
+
+
+ at target('build/test/requireall.js', SPEC)
+def build_test_requireall_js(t):
+    requires = set()
+    for dependency in t.dependencies:
+        for line in open(dependency, 'rU'):
+            match = re.match(r'goog\.provide\(\'(.*)\'\);', line)
+            if match:
+                requires.add(match.group(1))
+    with open(t.name, 'wb') as f:
+        for require in sorted(requires):
+            f.write('goog.require(\'%s\');\n' % (require,))
+
+
+virtual('build-examples', 'examples', 'build/examples/all.combined.js',
+        EXAMPLES_COMBINED)
+
+
+virtual('examples', 'examples/example-list.xml', EXAMPLES_JSON)
+
+
+ at target('examples/example-list.xml', 'examples/example-list.js')
+def examples_examples_list_xml(t):
+    t.touch()  # already generated by bin/exampleparser.py
+
+
+ at target('examples/example-list.js', 'bin/exampleparser.py', EXAMPLES)
+def examples_examples_list_js(t):
+    t.run('%(PYTHON)s', 'bin/exampleparser.py', 'examples', 'examples')
+
+
+ at target('build/examples/all.combined.js', 'build/examples/all.js',
+        SRC, SHADER_SRC, 'config/examples-all.json', NPM_INSTALL)
+def build_examples_all_combined_js(t):
+    t.run('node', 'tasks/build.js', 'config/examples-all.json',
+          'build/examples/all.combined.js')
+    report_sizes(t)
+
+
+ at target('build/examples/all.js', EXAMPLES_SRC)
+def build_examples_all_js(t):
+    t.output('%(PYTHON)s', 'bin/combine-examples.py', t.dependencies)
+
+
+ at rule(r'\Abuild/examples/(?P<id>.*).json\Z')
+def examples_star_json(name, match):
+    def action(t):
+
+        # When compiling the ol3 code and the application code together it is
+        # better to use oli.js and olx.js files as "input" files rather than
+        # "externs" files. Indeed, externs prevent renaming, which is neither
+        # necessary nor desirable in this case.
+        #
+        # oli.js and olx.js do not provide or require namespaces (using
+        # "goog.provide" or "goog.require"). For that reason, if they are
+        # specified as input files through the "src" property, then
+        # closure-util will exclude them when creating the dependencies graph.
+        # So the compile "js" property is used instead. With that property the
+        # oli.js and olx.js files are passed directly to the compiler. And by
+        # setting "manage_closure_dependencies" to "true" the compiler will not
+        # exclude them from its dependencies graph.
+
+        content = json.dumps({
+          "exports": [],
+          "src": [
+            "src/**/*.js",
+            "build/ol.ext/*.js",
+            "examples/%(id)s.js" % match.groupdict()],
+          "compile": {
+            "js": [
+              "externs/olx.js",
+              "externs/oli.js",
+            ],
+            "externs": [
+              "externs/bingmaps.js",
+              "externs/bootstrap.js",
+              "externs/closure-compiler.js",
+              "externs/example.js",
+              "externs/fastclick.js",
+              "externs/geojson.js",
+              "externs/jquery-1.9.js",
+              "externs/proj4js.js",
+              "externs/tilejson.js",
+              "externs/topojson.js",
+              "externs/vbarray.js"
+            ],
+            "define": [
+              "goog.array.ASSUME_NATIVE_FUNCTIONS=true",
+              "goog.dom.ASSUME_STANDARDS_MODE=true",
+              "goog.json.USE_NATIVE_JSON=true",
+              "goog.DEBUG=false"
+            ],
+            "jscomp_error": [
+              "accessControls",
+              "ambiguousFunctionDecl",
+              "checkDebuggerStatement",
+              "checkEventfulObjectDisposal",
+              "checkProvides",
+              "checkRegExp",
+              "checkStructDictInheritance",
+              "checkTypes",
+              "checkVars",
+              "const",
+              "constantProperty",
+              "deprecated",
+              "duplicate",
+              "duplicateMessage",
+              "es3",
+              "es5Strict",
+              "externsValidation",
+              "fileoverviewTags",
+              "globalThis",
+              "internetExplorerChecks",
+              "invalidCasts",
+              "misplacedTypeAnnotation",
+              "missingProperties",
+              "nonStandardJsDocs",
+              "strictModuleDepCheck",
+              "suspiciousCode",
+              "typeInvalidation",
+              "tweakValidation",
+              "undefinedNames",
+              "undefinedVars",
+              "uselessCode",
+              "violatedModuleDep",
+              "visibility"
+            ],
+            "jscomp_off": [
+              "unknownDefines"
+            ],
+            "extra_annotation_name": [
+              "api", "observable"
+            ],
+            "compilation_level": "ADVANCED",
+            "warning_level": "VERBOSE",
+            "output_wrapper": "(function(){%output%})();",
+            "use_types_for_optimization": True,
+            "manage_closure_dependencies": True
+          }
+        })
+        with open(t.name, 'wb') as f:
+            f.write(content)
+    return Target(name, action=action,
+                  dependencies=[__file__, NPM_INSTALL])
+
+
+ at rule(r'\Abuild/examples/(?P<id>.*).combined.js\Z')
+def examples_star_combined_js(name, match):
+    def action(t):
+        config = 'build/examples/%(id)s.json' % match.groupdict()
+        t.run('node', 'tasks/build.js', config, name)
+        report_sizes(t)
+    dependencies = [SRC, SHADER_SRC,
+                    'examples/%(id)s.js' % match.groupdict(),
+                    'build/examples/%(id)s.json' % match.groupdict(),
+                    NPM_INSTALL]
+    return Target(name, action=action, dependencies=dependencies)
+
+
+ at target('serve', 'examples', NPM_INSTALL)
+def serve(t):
+    t.run('node', 'tasks/serve.js')
+
+
+virtual('lint', 'build/lint-timestamp', 'build/check-requires-timestamp',
+    'build/check-whitespace-timestamp', 'jshint')
+
+
+ at target('build/lint-timestamp', SRC, EXAMPLES_SRC, SPEC, precious=True)
+def build_lint_src_timestamp(t):
+    t.run('%(GJSLINT)s',
+          '--jslint_error=all',
+          '--custom_jsdoc_tags=event,fires,function,classdesc,api,observable',
+          '--strict',
+          t.newer(t.dependencies))
+    t.touch()
+
+virtual('jshint', 'build/jshint-timestamp')
+
+ at target('build/jshint-timestamp', SRC, EXAMPLES_SRC, SPEC, TASKS,
+        NPM_INSTALL, precious=True)
+def build_jshint_timestamp(t):
+    t.run(variables.JSHINT, '--verbose', t.newer(t.dependencies))
+    t.touch()
+
+
+def _strip_comments(lines):
+    # FIXME this is a horribe hack, we should use a proper JavaScript parser
+    # here
+    in_multiline_comment = False
+    lineno = 0
+    for line in lines:
+        lineno += 1
+        if in_multiline_comment:
+            index = line.find('*/')
+            if index != -1:
+                in_multiline_comment = False
+                line = line[index + 2:]
+        if not in_multiline_comment:
+            line = re.sub(r'//[^\n]*', '', line)
+            line = re.sub(r'/\*.*?\*/', '', line)
+            index = line.find('/*')
+            if index != -1:
+                yield lineno, line[:index]
+                in_multiline_comment = True
+            else:
+                yield lineno, line
+
+
+ at target('build/check-requires-timestamp', SRC, EXAMPLES_SRC, SHADER_SRC, SPEC)
+def build_check_requires_timestamp(t):
+    unused_count = 0
+    all_provides = set()
+    closure_lib_path = output('node', '-e',
+        'process.stdout.write(require("closure-util").getLibraryPath())')
+    for filename in ifind(closure_lib_path):
+        if filename.endswith('.js'):
+            if not re.match(r'.*/closure/goog/', filename):
+                continue
+            # Skip goog.i18n because it contains so many modules that it causes
+            # the generated regular expression to exceed Python's limits
+            if re.match(r'.*/closure/goog/i18n/', filename):
+                continue
+            for line in open(filename, 'rU'):
+                m = re.match(r'goog.provide\(\'(.*)\'\);', line)
+                if m:
+                    all_provides.add(m.group(1))
+    for filename in sorted(t.dependencies):
+        require_linenos = {}
+        uses = set()
+        lines = open(filename, 'rU').readlines()
+        for lineno, line in _strip_comments(lines):
+            m = re.match(r'goog.provide\(\'(.*)\'\);', line)
+            if m:
+                all_provides.add(m.group(1))
+                continue
+            m = re.match(r'goog.require\(\'(.*)\'\);', line)
+            if m:
+                require_linenos[m.group(1)] = lineno
+                continue
+        ignore_linenos = require_linenos.values()
+        for lineno, line in enumerate(lines):
+            if lineno in ignore_linenos:
+                continue
+            for require in require_linenos.iterkeys():
+                if require in line:
+                    uses.add(require)
+        for require in sorted(set(require_linenos.keys()) - uses):
+            t.info('%s:%d: unused goog.require: %r' % (
+                filename, require_linenos[require], require))
+            unused_count += 1
+    all_provides.discard('ol')
+    all_provides.discard('ol.MapProperty')
+
+    class Node(object):
+
+        def __init__(self):
+            self.present = False
+            self.children = {}
+
+        def _build_re(self, key):
+            if key == '*':
+                assert len(self.children) == 0
+                # We want to match `.doIt` but not `.SomeClass` or `.more.stuff`
+                return '(?=\\.[a-z]\\w*\\b(?!\\.))'
+            elif len(self.children) == 1:
+                child_key, child = next(self.children.iteritems())
+                child_re = child._build_re(child_key)
+                if child_key != '*':
+                    child_re = '\\.' + child_re
+                if self.present:
+                    return key + '(' + child_re + ')?'
+                else:
+                    return key + child_re
+            elif self.children:
+                children_re = '(?:' + '|'.join(
+                    ('\\.' if k != '*' else '') + self.children[k]._build_re(k)
+                    for k in sorted(self.children.keys())) + ')'
+                if self.present:
+                    return key + children_re + '?'
+                else:
+                    return key + children_re
+            else:
+                assert self.present
+                return key
+
+        def build_re(self, key):
+            return re.compile('\\b' + self._build_re(key) + '\\b')
+    root = Node()
+    for provide in all_provides:
+        node = root
+        for component in provide.split('.'):
+            if component not in node.children:
+                node.children[component] = Node()
+            node = node.children[component]
+        if component[0].islower():
+            # We've arrived at a namespace provide like `ol.foo`.
+            # In this case, we want to match uses like `ol.foo.doIt()` but
+            # not match things like `new ol.foo.SomeClass()`.
+            # For this purpose, we use the special wildcard key for the child.
+            node.children['*'] = Node()
+        else:
+            node.present = True
+    provide_res = [child.build_re(key)
+                   for key, child in root.children.iteritems()]
+    missing_count = 0
+    for filename in sorted(t.dependencies):
+        provides = set()
+        requires = set()
+        uses = set()
+        uses_linenos = {}
+        for lineno, line in _strip_comments(open(filename, 'rU')):
+            m = re.match(r'goog.provide\(\'(.*)\'\);', line)
+            if m:
+                provides.add(m.group(1))
+                continue
+            m = re.match(r'goog.require\(\'(.*)\'\);', line)
+            if m:
+                requires.add(m.group(1))
+                continue
+            while True:
+                for provide_re in provide_res:
+                    m = provide_re.search(line)
+                    if m:
+                        uses.add(m.group())
+                        uses_linenos[m.group()] = lineno
+                        line = line[:m.start()] + line[m.end():]
+                        break
+                else:
+                    break
+        if filename == 'src/ol/renderer/layerrenderer.js':
+            uses.discard('ol.renderer.Map')
+        m = re.match(
+            r'src/ol/renderer/(\w+)/\1(\w*)layerrenderer\.js\Z', filename)
+        if m:
+            uses.discard('ol.renderer.Map')
+            uses.discard('ol.renderer.%s.Map' % (m.group(1),))
+        missing_requires = uses - requires - provides
+        if missing_requires:
+            for missing_require in sorted(missing_requires):
+                t.info("%s:%d missing goog.require('%s')" %
+                       (filename, uses_linenos[missing_require], missing_require))
+                missing_count += 1
+    if unused_count or missing_count:
+        t.error('%d unused goog.requires, %d missing goog.requires' %
+                (unused_count, missing_count))
+    t.touch()
+
+
+ at target('build/check-whitespace-timestamp', SRC, EXAMPLES_SRC,
+        SPEC, JSDOC_SRC, precious=True)
+def build_check_whitespace_timestamp(t):
+    CR_RE = re.compile(r'\r')
+    LEADING_WHITESPACE_RE = re.compile(r'\s+')
+    TRAILING_WHITESPACE_RE = re.compile(r'\s+\n\Z')
+    NO_NEWLINE_RE = re.compile(r'[^\n]\Z')
+    ALL_WHITESPACE_RE = re.compile(r'\s+\Z')
+    errors = 0
+    for filename in sorted(t.newer(t.dependencies)):
+        whitespace = False
+        for lineno, line in enumerate(open(filename, 'rU')):
+            if lineno == 0 and LEADING_WHITESPACE_RE.match(line):
+                t.info('%s:%d: leading whitespace', filename, lineno + 1)
+                errors += 1
+            if CR_RE.search(line):
+                t.info('%s:%d: carriage return character in line', filename, lineno + 1)
+                errors += 1
+            if TRAILING_WHITESPACE_RE.search(line):
+                t.info('%s:%d: trailing whitespace', filename, lineno + 1)
+                errors += 1
+            if NO_NEWLINE_RE.search(line):
+                t.info('%s:%d: no newline at end of file', filename, lineno + 1)
+                errors += 1
+            whitespace = ALL_WHITESPACE_RE.match(line)
+        if whitespace:
+            t.info('%s: trailing whitespace at end of file', filename)
+            errors += 1
+    if errors:
+        t.error('%d whitespace errors' % (errors,))
+    t.touch()
+
+
+virtual('apidoc', 'build/jsdoc-%(BRANCH)s-timestamp' % vars(variables))
+
+
+ at target('build/jsdoc-%(BRANCH)s-timestamp' % vars(variables), 'host-resources',
+        SRC, SHADER_SRC, ifind('config/jsdoc/api/template'),
+        NPM_INSTALL)
+def jsdoc_BRANCH_timestamp(t):
+    t.run('%(JSDOC)s', 'config/jsdoc/api/index.md',
+          '-c', 'config/jsdoc/api/conf.json',
+          '-d', 'build/hosted/%(BRANCH)s/apidoc')
+    t.touch()
+
+
+def split_example_file(example, dst_dir):
+    lines = open(example, 'rU').readlines()
+
+    target_lines = []
+    target_require_lines = []
+
+    found_requires = False
+    found_code = False
+    for line in lines:
+        m = re.match(r'goog.require\(\'(.*)\'\);', line)
+        if m:
+            found_requires = True
+            target_require_lines.append(line)
+        elif found_requires:
+            if found_code or line not in ('\n', '\r\n'):
+                found_code = True
+                target_lines.append(line)
+
+    target = open(
+        os.path.join(dst_dir, os.path.basename(example)), 'wb')
+    target_require = open(
+        os.path.join(dst_dir, os.path.basename(example)
+          .replace('.js', '-require.js')),
+        'wb')
+
+    target.writelines(target_lines)
+    target.close()
+
+    target_require.writelines(target_require_lines)
+    target_require.close()
+
+
+ at target('host-resources', phony=True)
+def host_resources(t):
+    resources_dir = 'build/hosted/%(BRANCH)s/resources'
+    t.rm_rf(resources_dir)
+    t.cp_r('resources', resources_dir)
+
+
+ at target('host-examples', 'build', 'host-resources', 'examples', phony=True)
+def host_examples(t):
+    examples_dir = 'build/hosted/%(BRANCH)s/examples'
+    build_dir = 'build/hosted/%(BRANCH)s/build'
+    css_dir = 'build/hosted/%(BRANCH)s/css'
+    closure_lib_path = output('node', '-e',
+        'process.stdout.write(require("closure-util").getLibraryPath())')
+    t.rm_rf(examples_dir)
+    t.makedirs(examples_dir)
+    t.rm_rf(build_dir)
+    t.makedirs(build_dir)
+    t.rm_rf(css_dir)
+    t.makedirs(css_dir)
+    t.cp(EXAMPLES, examples_dir)
+    for example in [path.replace('.html', '.js') for path in EXAMPLES]:
+        split_example_file(example, examples_dir % vars(variables))
+    t.cp_r('examples/data', examples_dir + '/data')
+    t.cp('bin/loader_hosted_examples.js', examples_dir + '/loader.js')
+    t.cp('build/ol.js', 'build/ol-debug.js', build_dir)
+    t.cp('build/ol.css', css_dir)
+    t.cp('examples/index.html', 'examples/example-list.js',
+         'examples/example-list.xml', 'examples/Jugl.js', examples_dir)
+    t.rm_rf('build/hosted/%(BRANCH)s/closure-library')
+    t.cp_r(closure_lib_path, 'build/hosted/%(BRANCH)s/closure-library')
+    t.rm_rf('build/hosted/%(BRANCH)s/ol')
+    t.makedirs('build/hosted/%(BRANCH)s/ol')
+    t.cp_r('src/ol', 'build/hosted/%(BRANCH)s/ol/ol')
+    t.rm_rf('build/hosted/%(BRANCH)s/ol.ext')
+    t.cp_r('build/ol.ext', 'build/hosted/%(BRANCH)s/ol.ext')
+    t.run('%(PYTHON)s', closure_lib_path + '/closure/bin/build/depswriter.py',
+          '--root_with_prefix', 'src ../../../ol',
+          '--root_with_prefix', 'build/ol.ext ../../../ol.ext',
+          '--root', 'build/hosted/%(BRANCH)s/closure-library/closure/goog',
+          '--root_with_prefix', 'build/hosted/%(BRANCH)s/closure-library/'
+          'third_party ../../third_party',
+          '--output_file', 'build/hosted/%(BRANCH)s/build/ol-deps.js')
+
+
+ at target('check-examples', 'host-examples', phony=True)
+def check_examples(t):
+    examples = ['build/hosted/%(BRANCH)s/' + e
+                for e in EXAMPLES
+                if not open(e.replace('.html', '.js'), 'rU').readline().startswith('// NOCOMPILE')]
+    all_examples = [e + '?mode=advanced' for e in examples]
+    # Run the examples checks in a pool of threads
+    pool = ThreadPool()
+    for example in all_examples:
+        pool.add_task(t.run, '%(PHANTOMJS)s', 'bin/check-example.js', example)
+    errors = pool.wait_completion()
+    if errors:
+        sys.exit(1)
+
+
+ at target('test', NPM_INSTALL, phony=True)
+def test(t):
+    t.run('node', 'tasks/test.js')
+
+
+ at target('fixme', phony=True)
+def find_fixme(t):
+    regex = re.compile('FIXME|TODO')
+    matches = dict()
+    totalcount = 0
+    for filename in SRC:
+        f = open(filename, 'r')
+        for lineno, line in enumerate(f):
+            if regex.search(line):
+                if (filename not in matches):
+                    matches[filename] = list()
+                matches[filename].append('#%-10d %s' % (
+                    lineno + 1, line.strip()))
+                totalcount += 1
+        f.close()
+
+    for filename in matches:
+        num_matches = len(matches[filename])
+        noun = 'matches' if num_matches > 1 else 'match'
+        print '  %s has %d %s:' % (filename, num_matches, noun)
+        for match in matches[filename]:
+            print '    %s' % (match,)
+        print
+    print 'A total of %d TODO/FIXME(s) were found' % (totalcount,)
+
+
+ at target('reallyclean')
+def reallyclean(t):
+    """Removes untracked files and folders from previous builds."""
+    # -X => only clean up files that are usually ignored e.g.
+    #       through .gitignore
+    # -d => also consider directories for deletion
+    # -f => if git configuration variable clean.requireForce != false,
+    #       git clean will refuse to run unless given -f or -n.
+    t.run('%(GIT)s', 'clean', '-X', '-d', '-f', '.')
+
+
+ at target('checkdeps')
+def check_dependencies(t):
+    for exe in EXECUTABLES:
+        status = 'present' if which(exe) else 'MISSING'
+        print 'Program "%s" seems to be %s.' % (exe, status)
+    print 'For certain targets all above programs need to be present.'
+
+
+ at target('help')
+def display_help(t):
+    print '''
+build.py - The OpenLayers 3 build script.
+
+Usage:
+  ./build.py [options] [target]                         (on Unix-based machines)
+  <python-executable.exe> build.py [options] [target]   (on Windows machines)
+
+There is one option:
+  -c               - Cleans up the repository from previous builds.
+
+The most common targets are:
+  serve            - Serves files, on port 3000.
+  lint             - Runs gjslint on all sourcefiles to enforce specific syntax.
+  build            - Builds singlefile versions of OpenLayers JavaScript and
+                     CSS. This is also the default build target which runs when
+                     no target is specified.
+  test             - Runs the testsuite and displays the results.
+  check            - Runs the lint-target, builds some OpenLayers files, and
+                     then runs test. Many developers call this target often
+                     while working on the code.
+  help             - Shows this help.
+
+Other less frequently used targets are:
+  apidoc           - Builds the API-Documentation using JSDoc3.
+  ci               - Builds all examples in various modes and usually takes a
+                     long time to finish. This target calls the following
+                     targets: lint, build, build-all, test, build-examples,
+                     check-examples and apidoc. This is the target run on
+                     Travis CI.
+  reallyclean      - Remove untracked files from the repository.
+  checkdeps        - Checks whether all required development software is
+                     installed on your machine.
+  fixme            - Will print a list of parts of the code that are marked
+                     with either TODO or FIXME.
+  todo             - This is an alias for the fixme-target (see above).
+
+If no target is given, the build-target will be executed.
+
+The above list is not complete, please see the source code for not-mentioned
+and only seldomly called targets.
+    '''
+
+if __name__ == '__main__':
+    main()
diff --git a/changelog/v3.1.0.md b/changelog/v3.1.0.md
new file mode 100644
index 0000000..3db970e
--- /dev/null
+++ b/changelog/v3.1.0.md
@@ -0,0 +1,234 @@
+# 3.1.0
+
+## Summary
+
+The 3.1.0 release includes a whopping 214 merged pull requests since 3.0.0.  Of note, the WebGL renderer [now supports point rendering](https://github.com/openlayers/ol3/pull/2967).  You can use [UTFGrids for interaction](https://github.com/openlayers/ol3/pull/3015)!  Styles can now specify [alternate geometries for rendering](https://github.com/openlayers/ol3/pull/3010).  Library builds [can now be loaded](https://github.com/openlayers/ol3/pull/3039) with module loaders like Browserify  [...]
+
+## Upgrade notes
+
+The 3.1.0 release maintains a backwards-compatible API with the 3.0.0 release, so upgrades should be painless.  Some special considerations below.
+
+ * If you are using a `ol.source.ImageStatic`, you no longer need to provide an `imageSize` option if you don't want any special scaling on your image (see [#2796](https://github.com/openlayers/ol3/pull/2796)).
+
+ * Instead of calling `obj.unByKey(key)` you can now call `ol.Observable.unByKey(key)` (see [#2794](https://github.com/openlayers/ol3/pull/2794)).
+
+ * If you were using `format.writeFeatures(features)`, note that this method returns a string for all feature formats.  We considered the previous behavior a bug (see [#3003](https://github.com/openlayers/ol3/pull/3003)).
+
+ * The `obj.dispatchChangeEvent()` method is now spelled `obj.changed()`.  This method is still unstable (see [#2684](https://github.com/openlayers/ol3/pull/2684)).
+
+## Changes
+
+ * [#3076](https://github.com/openlayers/ol3/pull/3076) - Add script to standardize changelog creation. ([@tschaub](https://github.com/tschaub))
+ * [#3074](https://github.com/openlayers/ol3/pull/3074) - Remove misplaced function annotation. ([@fredj](https://github.com/fredj))
+ * [#3075](https://github.com/openlayers/ol3/pull/3075) - Remove unneeded undefined from ol.proj.ProjectionLike definitions (r=@tschaub) ([@bartvde](https://github.com/bartvde))
+ * [#3071](https://github.com/openlayers/ol3/pull/3071) - Add task for publishing to npm. ([@tschaub](https://github.com/tschaub))
+ * [#3070](https://github.com/openlayers/ol3/pull/3070) - Define goog and assign to global when generating UMD debug builds. ([@tschaub](https://github.com/tschaub))
+ * [#3068](https://github.com/openlayers/ol3/pull/3068) - Update pre-release version. ([@tschaub](https://github.com/tschaub))
+ * [#3039](https://github.com/openlayers/ol3/pull/3039) - Support for UMD builds. ([@tschaub](https://github.com/tschaub))
+ * [#3038](https://github.com/openlayers/ol3/pull/3038) - Update attribution CSS #2803 ([@acanimal](https://github.com/acanimal))
+ * [#3061](https://github.com/openlayers/ol3/pull/3061) - Add a renderBuffer option to ol.layer.Vector ([@elemoine](https://github.com/elemoine))
+ * [#3048](https://github.com/openlayers/ol3/pull/3048) - Add a drag-features example ([@elemoine](https://github.com/elemoine))
+ * [#3060](https://github.com/openlayers/ol3/pull/3060) - Update closure-library version ([@fredj](https://github.com/fredj))
+ * [#3058](https://github.com/openlayers/ol3/pull/3058) - Use an API function to extend the extent ([@ahocevar](https://github.com/ahocevar))
+ * [#3010](https://github.com/openlayers/ol3/pull/3010) - Allow styles to override feature geometries ([@ahocevar](https://github.com/ahocevar))
+ * [#3056](https://github.com/openlayers/ol3/pull/3056) - Reuse previousExtent_ local variable ([@fredj](https://github.com/fredj))
+ * [#3055](https://github.com/openlayers/ol3/pull/3055) - ol.tilecoord.createOrUpdate: add 'opt_' prefix to optional param ([@fredj](https://github.com/fredj))
+ * [#3044](https://github.com/openlayers/ol3/pull/3044) - Mark Image style constructor properties `@api` ([@gberaudo](https://github.com/gberaudo))
+ * [#3052](https://github.com/openlayers/ol3/pull/3052) - Add a testcase for parsing GML feature with only boundedBy ([@bartvde](https://github.com/bartvde))
+ * [#3051](https://github.com/openlayers/ol3/pull/3051) - Remove // NOCOMPILE from vector-wfs ([@elemoine](https://github.com/elemoine))
+ * [#2699](https://github.com/openlayers/ol3/pull/2699) - No need for featureNS and featureType to be quoted ([@bartvde](https://github.com/bartvde))
+ * [#3047](https://github.com/openlayers/ol3/pull/3047) - Move description above annotation to avoid JSDoc warnings. ([@tschaub](https://github.com/tschaub))
+ * [#2996](https://github.com/openlayers/ol3/pull/2996) - Add getter functions for points and angle in ol.style.RegularShape ([@bartvde](https://github.com/bartvde))
+ * [#3046](https://github.com/openlayers/ol3/pull/3046) - Need exportable constructor for constructor options in olx ([@ahocevar](https://github.com/ahocevar))
+ * [#3043](https://github.com/openlayers/ol3/pull/3043) - Use // NOCOMPILE for vector-wfs ([@elemoine](https://github.com/elemoine))
+ * [#3042](https://github.com/openlayers/ol3/pull/3042) - Print example name in check-examples exception ([@gberaudo](https://github.com/gberaudo))
+ * [#3032](https://github.com/openlayers/ol3/pull/3032) - Extension points for custom controls and interactions ([@elemoine](https://github.com/elemoine))
+ * [#3033](https://github.com/openlayers/ol3/pull/3033) - Allow custom mousemove conditions for Select interaction ([@ahocevar](https://github.com/ahocevar))
+ * [#3040](https://github.com/openlayers/ol3/pull/3040) - Transform the coordinates in place ([@fredj](https://github.com/fredj))
+ * [#3036](https://github.com/openlayers/ol3/pull/3036) - Respect geometry stride in modify interaction ([@tonio](https://github.com/tonio))
+ * [#3020](https://github.com/openlayers/ol3/pull/3020) - Correct error message from generate-info.js. ([@tschaub](https://github.com/tschaub))
+ * [#3037](https://github.com/openlayers/ol3/pull/3037) - Implement rotation for ol.style.RegularShape ([@bartvde](https://github.com/bartvde))
+ * [#3015](https://github.com/openlayers/ol3/pull/3015) - UTFGrid Support ([@klokantech](https://github.com/klokantech))
+ * [#3012](https://github.com/openlayers/ol3/pull/3012) - Failing tests in IE9 ([@bartvde](https://github.com/bartvde))
+ * [#3029](https://github.com/openlayers/ol3/pull/3029) - Update closure compiler and library ([@fredj](https://github.com/fredj))
+ * [#3031](https://github.com/openlayers/ol3/pull/3031) - Add missing maxZoom property in olx.view.FitGeometryOptions ([@fredj](https://github.com/fredj))
+ * [#3028](https://github.com/openlayers/ol3/pull/3028) - ol.format.WFS cleanup ([@fredj](https://github.com/fredj))
+ * [#3024](https://github.com/openlayers/ol3/pull/3024) - Add missing gmlFormat to olx.format.WFSOptions ([@fredj](https://github.com/fredj))
+ * [#3023](https://github.com/openlayers/ol3/pull/3023) - Change loader function return type ([@fredj](https://github.com/fredj))
+ * [#3021](https://github.com/openlayers/ol3/pull/3021) - Add missing properties in olx.control.AttributionOptions typedef ([@fredj](https://github.com/fredj))
+ * [#3013](https://github.com/openlayers/ol3/pull/3013) - Improve vector source clear() performance ([@gberaudo](https://github.com/gberaudo))
+ * [#3017](https://github.com/openlayers/ol3/pull/3017) - Use writeFeatures instead of writeFeaturesNode in GPX and KML example (r=@elemoine) ([@bartvde](https://github.com/bartvde))
+ * [#3014](https://github.com/openlayers/ol3/pull/3014) - Simplify hit detection code ([@elemoine](https://github.com/elemoine))
+ * [#3006](https://github.com/openlayers/ol3/pull/3006) - gml3.js and gml2.js don't follow file naming conventions ([@bartvde](https://github.com/bartvde))
+ * [#3003](https://github.com/openlayers/ol3/pull/3003) - The writeFeatures method should always return a string (r=@elemoine) ([@bartvde](https://github.com/bartvde))
+ * [#3011](https://github.com/openlayers/ol3/pull/3011) - opt_options may not be defined, use options ([@pagameba](https://github.com/pagameba))
+ * [#3009](https://github.com/openlayers/ol3/pull/3009) - Fix hit detection bug ([@elemoine](https://github.com/elemoine))
+ * [#3002](https://github.com/openlayers/ol3/pull/3002) - Passing options to RegularShape is mandatory ([@elemoine](https://github.com/elemoine))
+ * [#2967](https://github.com/openlayers/ol3/pull/2967) - Add support for drawing points with WebGL ([@camptocamp](https://github.com/camptocamp))
+ * [#2701](https://github.com/openlayers/ol3/pull/2701) - Writing GeoJSON does not respect the feature's geometryName ([@bartvde](https://github.com/bartvde))
+ * [#3000](https://github.com/openlayers/ol3/pull/3000) - Explain that return of ol.color.asArray should not be modified ([@bartvde](https://github.com/bartvde))
+ * [#2997](https://github.com/openlayers/ol3/pull/2997) - Use new demo GeoServer location ([@ahocevar](https://github.com/ahocevar))
+ * [#2976](https://github.com/openlayers/ol3/pull/2976) - Add an example to show off ol.style.RegularShape ([@bartvde](https://github.com/bartvde))
+ * [#2992](https://github.com/openlayers/ol3/pull/2992) - Add support for finding features at a given coordinates for vector tiles - fixes ([@pgiraud](https://github.com/pgiraud))
+ * [#2987](https://github.com/openlayers/ol3/pull/2987) - Image layer renderers use source projection if given and equivalent ([@kartverket](https://github.com/kartverket))
+ * [#2975](https://github.com/openlayers/ol3/pull/2975) - Use offsetX and offsetY if available ([@fredj](https://github.com/fredj))
+ * [#2973](https://github.com/openlayers/ol3/pull/2973) - Making GetTileCoordFor methods public avaible ([@s093294](https://github.com/s093294))
+ * [#2986](https://github.com/openlayers/ol3/pull/2986) - Add support for finding features at a given coordinates for vector tiles ([@pgiraud](https://github.com/pgiraud))
+ * [#2937](https://github.com/openlayers/ol3/pull/2937) - Clip layer rendering to limited extent. ([@tschaub](https://github.com/tschaub))
+ * [#2971](https://github.com/openlayers/ol3/pull/2971) - Two ol.source.TileVector fixes ([@elemoine](https://github.com/elemoine))
+ * [#2988](https://github.com/openlayers/ol3/pull/2988) - Correct olx.style.RegularShapeOptions definition (r=@elemoine) ([@bartvde](https://github.com/bartvde))
+ * [#2981](https://github.com/openlayers/ol3/pull/2981) - Use lineDash in ol.style.Circle's and ol.style.RegularShape's stroke (r=@fredj, at elemoine) ([@bartvde](https://github.com/bartvde))
+ * [#2982](https://github.com/openlayers/ol3/pull/2982) - Allow radius1 as an alias for radius in ol.style.RegularShape ([@bartvde](https://github.com/bartvde))
+ * [#2980](https://github.com/openlayers/ol3/pull/2980) - Export ol.source.TileVector#getFeatures in built mode ([@pgiraud](https://github.com/pgiraud))
+ * [#2979](https://github.com/openlayers/ol3/pull/2979) - Support OGC srs urns without an EPSG database version ([@bartvde](https://github.com/bartvde))
+ * [#2978](https://github.com/openlayers/ol3/pull/2978) - Fix zoom levels for the MapQuest Street layer ([@ahocevar](https://github.com/ahocevar))
+ * [#2889](https://github.com/openlayers/ol3/pull/2889) - Add GetFeatureInfo format ([@fgravin](https://github.com/fgravin))
+ * [#2965](https://github.com/openlayers/ol3/pull/2965) - Fix pan with select interaction in mousemove mode. ([@tonio](https://github.com/tonio))
+ * [#2960](https://github.com/openlayers/ol3/pull/2960) - LayerGroup extent should be used if extent not set on child layer ([@bartvde](https://github.com/bartvde))
+ * [#2956](https://github.com/openlayers/ol3/pull/2956) - Revert "Remove mousewheel event name workaround" ([@fredj](https://github.com/fredj))
+ * [#2959](https://github.com/openlayers/ol3/pull/2959) - Fix typo in selector ([@ahocevar](https://github.com/ahocevar))
+ * [#2895](https://github.com/openlayers/ol3/pull/2895) - Move font-family customization to layout.css ([@fredj](https://github.com/fredj))
+ * [#2896](https://github.com/openlayers/ol3/pull/2896) - Remove duplicated style parameter ([@kalinbas](https://github.com/kalinbas))
+ * [#2938](https://github.com/openlayers/ol3/pull/2938) - Additional image static docs. ([@tschaub](https://github.com/tschaub))
+ * [#2939](https://github.com/openlayers/ol3/pull/2939) - Make stability checkbox sticky. ([@tschaub](https://github.com/tschaub))
+ * [#2949](https://github.com/openlayers/ol3/pull/2949) - Add ol.ext to hosted dir ([@elemoine](https://github.com/elemoine))
+ * [#2943](https://github.com/openlayers/ol3/pull/2943) - Mark applyTransform api stable ([@fredj](https://github.com/fredj))
+ * [#2936](https://github.com/openlayers/ol3/pull/2936) - Fix unselection of selected features ([@ahocevar](https://github.com/ahocevar))
+ * [#2935](https://github.com/openlayers/ol3/pull/2935) - Fix jsdoc comment ([@geosense](https://github.com/geosense))
+ * [#2933](https://github.com/openlayers/ol3/pull/2933) - Fix compile warning ([@elemoine](https://github.com/elemoine))
+ * [#2931](https://github.com/openlayers/ol3/pull/2931) - Improvement to view docs ([@elemoine](https://github.com/elemoine))
+ * [#2906](https://github.com/openlayers/ol3/pull/2906) - Assume a latitude, longitude order for Polyline format ([@fredj](https://github.com/fredj))
+ * [#2927](https://github.com/openlayers/ol3/pull/2927) - Make it possible to programmatically finish drawing ([@elemoine](https://github.com/elemoine))
+ * [#2928](https://github.com/openlayers/ol3/pull/2928) - Do not rename handleMapBrowserEvent internally ([@elemoine](https://github.com/elemoine))
+ * [#2924](https://github.com/openlayers/ol3/pull/2924) - Readability rearangement in canvasmaprenderer.js ([@gberaudo](https://github.com/gberaudo))
+ * [#2911](https://github.com/openlayers/ol3/pull/2911) - List events fired in the navigation. ([@tschaub](https://github.com/tschaub))
+ * [#2921](https://github.com/openlayers/ol3/pull/2921) - Small feature overlay optimization ([@gberaudo](https://github.com/gberaudo))
+ * [#2897](https://github.com/openlayers/ol3/pull/2897) - Remove pointerup listener on controls ([@fredj](https://github.com/fredj))
+ * [#2912](https://github.com/openlayers/ol3/pull/2912) - jQuery externs update ([@fredj](https://github.com/fredj))
+ * [#2888](https://github.com/openlayers/ol3/pull/2888) - Element boundedBy must not be set as geometry field on GML reading ([@fgravin](https://github.com/fgravin))
+ * [#2903](https://github.com/openlayers/ol3/pull/2903) - Improved docs for icon options ([@elemoine](https://github.com/elemoine))
+ * [#2900](https://github.com/openlayers/ol3/pull/2900) - Allow build.js task to add header. ([@tschaub](https://github.com/tschaub))
+ * [#2893](https://github.com/openlayers/ol3/pull/2893) - Don't pass an object to goog.dom.createDom for the class name ([@fredj](https://github.com/fredj))
+ * [#2781](https://github.com/openlayers/ol3/pull/2781) - Use a standard title attribute for the control buttons ([@fredj](https://github.com/fredj))
+ * [#2852](https://github.com/openlayers/ol3/pull/2852) - Add missing space between class names ([@fredj](https://github.com/fredj))
+ * [#2891](https://github.com/openlayers/ol3/pull/2891) - Introduce a load function for image sources ([@ahocevar](https://github.com/ahocevar))
+ * [#2885](https://github.com/openlayers/ol3/pull/2885) - Add wrapX option to TileJSON source ([@elemoine](https://github.com/elemoine))
+ * [#2890](https://github.com/openlayers/ol3/pull/2890) - Use correct layer property names ([@elemoine](https://github.com/elemoine))
+ * [#2887](https://github.com/openlayers/ol3/pull/2887) - Explicitly pass coordinate dimension before transforming. ([@tschaub](https://github.com/tschaub))
+ * [#2886](https://github.com/openlayers/ol3/pull/2886) - Use ternary notation ([@elemoine](https://github.com/elemoine))
+ * [#2869](https://github.com/openlayers/ol3/pull/2869) - Export useful xml functions ([@tonio](https://github.com/tonio))
+ * [#2884](https://github.com/openlayers/ol3/pull/2884) - Make WKT methods throw errors instead of calling a method that throws. ([@tschaub](https://github.com/tschaub))
+ * [#2746](https://github.com/openlayers/ol3/pull/2746) - Add versioning for GML format ([@fgravin](https://github.com/fgravin))
+ * [#2882](https://github.com/openlayers/ol3/pull/2882) - Allow olx.source.WMTSOptions#requestEncoding to be a string ([@fredj](https://github.com/fredj))
+ * [#2881](https://github.com/openlayers/ol3/pull/2881) - Add default requestEncoding in documentation ([@fredj](https://github.com/fredj))
+ * [#2877](https://github.com/openlayers/ol3/pull/2877) - Remove FIXME in src/ol/structs/rbush.js ([@fredj](https://github.com/fredj))
+ * [#2870](https://github.com/openlayers/ol3/pull/2870) - Use bulk-insertion for addFeatures ([@tsauerwein](https://github.com/tsauerwein))
+ * [#2856](https://github.com/openlayers/ol3/pull/2856) - Allow layer source to be set. ([@tschaub](https://github.com/tschaub))
+ * [#2875](https://github.com/openlayers/ol3/pull/2875) - Avoid modifying `map.logos_` with each frame. ([@tschaub](https://github.com/tschaub))
+ * [#2874](https://github.com/openlayers/ol3/pull/2874) - Avoid shrinking logos. ([@tschaub](https://github.com/tschaub))
+ * [#2872](https://github.com/openlayers/ol3/pull/2872) - Remove the beforepropertychange event from ol.Object ([@fredj](https://github.com/fredj))
+ * [#2868](https://github.com/openlayers/ol3/pull/2868) - Remove doc about dispatching events. ([@tschaub](https://github.com/tschaub))
+ * [#2871](https://github.com/openlayers/ol3/pull/2871) - Make `npm install` a dependency of node based targets. ([@tschaub](https://github.com/tschaub))
+ * [#2867](https://github.com/openlayers/ol3/pull/2867) - Support for importing CommonJS style modules (like rbush). ([@openlayers](https://github.com/openlayers))
+ * [#2865](https://github.com/openlayers/ol3/pull/2865) - Add old value to property change events ([@elemoine](https://github.com/elemoine))
+ * [#2866](https://github.com/openlayers/ol3/pull/2866) - Cluster source calls loadFeatures on vector source ([@elemoine](https://github.com/elemoine))
+ * [#2864](https://github.com/openlayers/ol3/pull/2864) - Avoid mixed content in Bing Maps (r=@elemoine) ([@bartvde](https://github.com/bartvde))
+ * [#2855](https://github.com/openlayers/ol3/pull/2855) - Move touchstart preventDefault to ol.renderer.dom.Map ([@fredj](https://github.com/fredj))
+ * [#2690](https://github.com/openlayers/ol3/pull/2690) - Vector rendering with the DOM renderer ([@ahocevar](https://github.com/ahocevar))
+ * [#2859](https://github.com/openlayers/ol3/pull/2859) - Document exportable vector source symbols. ([@tschaub](https://github.com/tschaub))
+ * [#2857](https://github.com/openlayers/ol3/pull/2857) - Update the OSM attribution. ([@tschaub](https://github.com/tschaub))
+ * [#2847](https://github.com/openlayers/ol3/pull/2847) - Constrain center in zoomify example ([@elemoine](https://github.com/elemoine))
+ * [#2838](https://github.com/openlayers/ol3/pull/2838) - ol.source.WMTS now passes tileClass option to ol.source.TileImage ([@mike-mcgann](https://github.com/mike-mcgann))
+ * [#2821](https://github.com/openlayers/ol3/pull/2821) - Add ol.geom.Polygon.fromExtent ([@elemoine](https://github.com/elemoine))
+ * [#2835](https://github.com/openlayers/ol3/pull/2835) - Use correct Stamen URL for SSL. ([@j16sdiz](https://github.com/j16sdiz))
+ * [#2839](https://github.com/openlayers/ol3/pull/2839) - Dependency updates and new package name. ([@tschaub](https://github.com/tschaub))
+ * [#2840](https://github.com/openlayers/ol3/pull/2840) - Fewer point resolution tests. ([@tschaub](https://github.com/tschaub))
+ * [#2836](https://github.com/openlayers/ol3/pull/2836) - Give priority to feature's style instead of source's style ([@oterral](https://github.com/oterral))
+ * [#2834](https://github.com/openlayers/ol3/pull/2834) - Use ADVANCED instead of ADVANCED_OPTIMIZATIONS ([@fredj](https://github.com/fredj))
+ * [#2833](https://github.com/openlayers/ol3/pull/2833) - Avoid too many files open with graceful-fs at 3.0.3. ([@tschaub](https://github.com/tschaub))
+ * [#2829](https://github.com/openlayers/ol3/pull/2829) - Zoom slider refactor. ([@tschaub](https://github.com/tschaub))
+ * [#2757](https://github.com/openlayers/ol3/pull/2757) - Clear the canvas on layer extent changes. ([@tschaub](https://github.com/tschaub))
+ * [#2796](https://github.com/openlayers/ol3/pull/2796) - Determine image size on load. ([@tschaub](https://github.com/tschaub))
+ * [#2825](https://github.com/openlayers/ol3/pull/2825) - Change comments for examples_star_json build target ([@elemoine](https://github.com/elemoine))
+ * [#2822](https://github.com/openlayers/ol3/pull/2822) - Remove obsolete comment ([@gingerik](https://github.com/gingerik))
+ * [#2769](https://github.com/openlayers/ol3/pull/2769) - OverviewMap control ([@adube](https://github.com/adube))
+ * [#2820](https://github.com/openlayers/ol3/pull/2820) - Add parsing of LabelStyle in KML format ([@oterral](https://github.com/oterral))
+ * [#2819](https://github.com/openlayers/ol3/pull/2819) - Improvements to the xyz-esri-4326-512 example ([@elemoine](https://github.com/elemoine))
+ * [#2743](https://github.com/openlayers/ol3/pull/2743) - Handle ol.interaction.Draw activation/deactivation ([@elemoine](https://github.com/elemoine))
+ * [#2816](https://github.com/openlayers/ol3/pull/2816) - Exit on check-examples failure ([@gberaudo](https://github.com/gberaudo))
+ * [#2794](https://github.com/openlayers/ol3/pull/2794) - Add ol.Observable.unByKey ([@elemoine](https://github.com/elemoine))
+ * [#2815](https://github.com/openlayers/ol3/pull/2815) - Fix jquery.min.js path in xyz-esri-4326-512 example ([@fredj](https://github.com/fredj))
+ * [#2756](https://github.com/openlayers/ol3/pull/2756) - Add an example for using an Esri 512x512 tile server in EPSG:4326 (r=@elemoine) ([@bartvde](https://github.com/bartvde))
+ * [#2814](https://github.com/openlayers/ol3/pull/2814) - Add missing whitespaces in CSS calc ([@fredj](https://github.com/fredj))
+ * [#2811](https://github.com/openlayers/ol3/pull/2811) - Remove defaultProjection and object from typedef ([@fredj](https://github.com/fredj))
+ * [#2779](https://github.com/openlayers/ol3/pull/2779) - Update jQuery to 1.9.1 ([@fredj](https://github.com/fredj))
+ * [#2810](https://github.com/openlayers/ol3/pull/2810) - Remove unused properties from olx.source.TileVectorOptions ([@pagameba](https://github.com/pagameba))
+ * [#2808](https://github.com/openlayers/ol3/pull/2808) - Remove reprojectTo option from olx.source.OSMXMLOptions ([@fredj](https://github.com/fredj))
+ * [#2809](https://github.com/openlayers/ol3/pull/2809) - Miscellaneous controls cleanups ([@fredj](https://github.com/fredj))
+ * [#2805](https://github.com/openlayers/ol3/pull/2805) - Enable subclassing Interaction in public API ([@sweco-sebhar](https://github.com/sweco-sebhar))
+ * [#2798](https://github.com/openlayers/ol3/pull/2798) - Update closure-util to version 1.0.0 ([@fredj](https://github.com/fredj))
+ * [#2785](https://github.com/openlayers/ol3/pull/2785) - Use goog.* types in externs ([@ahocevar](https://github.com/ahocevar))
+ * [#2795](https://github.com/openlayers/ol3/pull/2795) - Externs ([@gingerik](https://github.com/gingerik))
+ * [#2792](https://github.com/openlayers/ol3/pull/2792) - Use valid mediatype for GPX export. ([@pgiraud](https://github.com/pgiraud))
+ * [#2784](https://github.com/openlayers/ol3/pull/2784) - Add 'tooltip'-tag to KML example. ([@marcjansen](https://github.com/marcjansen))
+ * [#2782](https://github.com/openlayers/ol3/pull/2782) - Hide the rotate control when the rotation is 0 ([@fredj](https://github.com/fredj))
+ * [#2774](https://github.com/openlayers/ol3/pull/2774) - Remove unused distinctFeatures object in ol.interaction.Modify#handlePointerDown ([@fredj](https://github.com/fredj))
+ * [#2771](https://github.com/openlayers/ol3/pull/2771) - Allow package to be published in npm registry. ([@tschaub](https://github.com/tschaub))
+ * [#2773](https://github.com/openlayers/ol3/pull/2773) - Type-related changes to ol.style.Image ([@elemoine](https://github.com/elemoine))
+ * [#2751](https://github.com/openlayers/ol3/pull/2751) - Export constructors and options of ol.source.Source children ([@gberaudo](https://github.com/gberaudo))
+ * [#2772](https://github.com/openlayers/ol3/pull/2772) - Rename updatefeature event to changefeature ([@fredj](https://github.com/fredj))
+ * [#2766](https://github.com/openlayers/ol3/pull/2766) - Make interaction "active" an ol.Object property ([@elemoine](https://github.com/elemoine))
+ * [#2765](https://github.com/openlayers/ol3/pull/2765) - Treat unknown opt types as Object in ol externs ([@elemoine](https://github.com/elemoine))
+ * [#2759](https://github.com/openlayers/ol3/pull/2759) - Fix test failures. ([@tschaub](https://github.com/tschaub))
+ * [#2762](https://github.com/openlayers/ol3/pull/2762) - Report test failures to the console. ([@tschaub](https://github.com/tschaub))
+ * [#2768](https://github.com/openlayers/ol3/pull/2768) - Write the function name correctly in the doc. ([@xamgreen](https://github.com/xamgreen))
+ * [#2764](https://github.com/openlayers/ol3/pull/2764) - Remove rtree example ([@fredj](https://github.com/fredj))
+ * [#2763](https://github.com/openlayers/ol3/pull/2763) - Miscellaneous coding style and typo fixes ([@fredj](https://github.com/fredj))
+ * [#2758](https://github.com/openlayers/ol3/pull/2758) - Correctly generate child tile ranges for XYZ tiles. ([@tschaub](https://github.com/tschaub))
+ * [#2734](https://github.com/openlayers/ol3/pull/2734) - Add maxZoom option to BingMaps ([@elemoine](https://github.com/elemoine))
+ * [#2752](https://github.com/openlayers/ol3/pull/2752) - Call loadFeatures from ol.source.ImageVector ([@elemoine](https://github.com/elemoine))
+ * [#2658](https://github.com/openlayers/ol3/pull/2658) - Set inherited values when parsing a GetCapabilities ([@oterral](https://github.com/oterral))
+ * [#2750](https://github.com/openlayers/ol3/pull/2750) - Export ol.layer.Base ([@fredj](https://github.com/fredj))
+ * [#2749](https://github.com/openlayers/ol3/pull/2749) - Export ol.source.Source ([@fredj](https://github.com/fredj))
+ * [#2742](https://github.com/openlayers/ol3/pull/2742) - Dispatch an 'updatefeature' from the vector source ([@fredj](https://github.com/fredj))
+ * [#2747](https://github.com/openlayers/ol3/pull/2747) - Fix incorrect web address. ([@lazaruslarue](https://github.com/lazaruslarue))
+ * [#2745](https://github.com/openlayers/ol3/pull/2745) - DragBox Interaction: getGeometry return type can be ol.geom.Polygon (r=@fredj) ([@bartvde](https://github.com/bartvde))
+ * [#2744](https://github.com/openlayers/ol3/pull/2744) - Fix ol.Feature 'change' event documentation ([@fredj](https://github.com/fredj))
+ * [#2741](https://github.com/openlayers/ol3/pull/2741) - issue with reading scientific notation coordinates in ol.format.GML (r=@fredj) ([@bartvde](https://github.com/bartvde))
+ * [#2739](https://github.com/openlayers/ol3/pull/2739) - Revert "Function circular renamed to createCircularOnSphere" ([@elemoine](https://github.com/elemoine))
+ * [#2616](https://github.com/openlayers/ol3/pull/2616) - Target for attribution links differs between maps ([@fredj](https://github.com/fredj))
+ * [#2740](https://github.com/openlayers/ol3/pull/2740) - Make interactions activable and deactivable ([@elemoine](https://github.com/elemoine))
+ * [#2727](https://github.com/openlayers/ol3/pull/2727) - Rename ol.geom.Polygon#circular to createCircularOnSphere ([@elemoine](https://github.com/elemoine))
+ * [#2730](https://github.com/openlayers/ol3/pull/2730) - Do not call toLowerCase when forming a change:property event ([@elemoine](https://github.com/elemoine))
+ * [#2728](https://github.com/openlayers/ol3/pull/2728) - Mark `ol.extent.getIntersection` as stable. ([@tschaub](https://github.com/tschaub))
+ * [#2726](https://github.com/openlayers/ol3/pull/2726) - Make ol.Feature#setStyle accept null ([@elemoine](https://github.com/elemoine))
+ * [#2724](https://github.com/openlayers/ol3/pull/2724) - Error when compiling individual example ([@fredj](https://github.com/fredj))
+ * [#1959](https://github.com/openlayers/ol3/pull/1959) - Add a feature box selection example ([@elemoine](https://github.com/elemoine))
+ * [#2722](https://github.com/openlayers/ol3/pull/2722) - Make ol.Map#setView do not accept undefined ([@elemoine](https://github.com/elemoine))
+ * [#2696](https://github.com/openlayers/ol3/pull/2696) - Consistent circle transform. ([@gberaudo](https://github.com/gberaudo))
+ * [#2717](https://github.com/openlayers/ol3/pull/2717) - Change the control visibility by using css class ([@fredj](https://github.com/fredj))
+ * [#2715](https://github.com/openlayers/ol3/pull/2715) - Add an EPSG:3857 map to Tissot example ([@elemoine](https://github.com/elemoine))
+ * [#2714](https://github.com/openlayers/ol3/pull/2714) - Set the opacity directly to element.style.opacity ([@fredj](https://github.com/fredj))
+ * [#2647](https://github.com/openlayers/ol3/pull/2647) - Upgrade closure library version ([@fredj](https://github.com/fredj))
+ * [#2549](https://github.com/openlayers/ol3/pull/2549) - Use goog.array.ASSUME_NATIVE_FUNCTIONS define ([@fredj](https://github.com/fredj))
+ * [#2711](https://github.com/openlayers/ol3/pull/2711) - Remove Google Maps example ([@elemoine](https://github.com/elemoine))
+ * [#2684](https://github.com/openlayers/ol3/pull/2684) - Rename ol.Observable#dispatchChangeEvent() to #changed() ([@ahocevar](https://github.com/ahocevar))
+ * [#2678](https://github.com/openlayers/ol3/pull/2678) - Mutable symbolizer properties for styles ([@ahocevar](https://github.com/ahocevar))
+ * [#2568](https://github.com/openlayers/ol3/pull/2568) - re-implement auto-configure code for ol.format.GML (r=@ahocevar) ([@bartvde](https://github.com/bartvde))
+ * [#2704](https://github.com/openlayers/ol3/pull/2704) - Use pool thread for calling bin/check-example.js. ([@gberaudo](https://github.com/gberaudo))
+ * [#2698](https://github.com/openlayers/ol3/pull/2698) - StaticVector is not an abstract base class ([@ahocevar](https://github.com/ahocevar))
+ * [#2702](https://github.com/openlayers/ol3/pull/2702) - Add vector layer in export-map example ([@fredj](https://github.com/fredj))
+ * [#2687](https://github.com/openlayers/ol3/pull/2687) - Use ol.LEGACY_IE_SUPPORT and ol.IS_LEGACY_IE define ([@fredj](https://github.com/fredj))
+ * [#2675](https://github.com/openlayers/ol3/pull/2675) - Remove undefined from ol.Map#getLayers return type ([@fredj](https://github.com/fredj))
+ * [#2692](https://github.com/openlayers/ol3/pull/2692) - Unset z-index in overlay example ([@fredj](https://github.com/fredj))
+ * [#2681](https://github.com/openlayers/ol3/pull/2681) - Make tileSize a config option for ol.source.XYZ ([@ahocevar](https://github.com/ahocevar))
+ * [#2534](https://github.com/openlayers/ol3/pull/2534) - Document ol.geom.Polygon#getLinearRing function ([@fredj](https://github.com/fredj))
+ * [#2677](https://github.com/openlayers/ol3/pull/2677) - Add TextStyle offsets getters to API. ([@gberaudo](https://github.com/gberaudo))
+ * [#2676](https://github.com/openlayers/ol3/pull/2676) - ol.FeatureOverlay: use the feature style if defined ([@fredj](https://github.com/fredj))
+ * [#2656](https://github.com/openlayers/ol3/pull/2656) - Set ol.layer.Image#getSource return type to ol.source.Image ([@fredj](https://github.com/fredj))
+ * [#2651](https://github.com/openlayers/ol3/pull/2651) - ol.layer.Vector.getSource return type specialisation. ([@gberaudo](https://github.com/gberaudo))
+ * [#2669](https://github.com/openlayers/ol3/pull/2669) - Revert "snapshot" ([@fredj](https://github.com/fredj))
+ * [#2663](https://github.com/openlayers/ol3/pull/2663) - Set tracking property to false on geolocation error ([@fredj](https://github.com/fredj))
+ * [#2662](https://github.com/openlayers/ol3/pull/2662) - Delegate transformation in ol.source.FormatVector#readFeatures to `ol.format.*` ([@gingerik](https://github.com/gingerik))
+ * [#2447](https://github.com/openlayers/ol3/pull/2447) - Correct documentation typo. ([@lazaruslarue](https://github.com/lazaruslarue))
+ * [#2660](https://github.com/openlayers/ol3/pull/2660) - New domain in the build header ([@elemoine](https://github.com/elemoine))
diff --git a/changelog/v3.1.1.md b/changelog/v3.1.1.md
new file mode 100644
index 0000000..9d78c29
--- /dev/null
+++ b/changelog/v3.1.1.md
@@ -0,0 +1,9 @@
+# 3.1.0
+
+## Summary
+
+This is a patch release to fix an issue with the select interaction in the 3.1.0 release.
+
+## Changes
+
+ * [#3082](https://github.com/openlayers/ol3/pull/3082) - Correct arguments for forEachGeometryAtPixel. ([@tschaub](https://github.com/tschaub))
diff --git a/closure-util.json b/closure-util.json
new file mode 100644
index 0000000..153e451
--- /dev/null
+++ b/closure-util.json
@@ -0,0 +1,3 @@
+{
+  "library_url": "https://github.com/google/closure-library/archive/ad5e66c1e7d7829b0d77feae49aaf5f011265715.zip"
+}
diff --git a/config/examples-all.json b/config/examples-all.json
new file mode 100644
index 0000000..29e51fb
--- /dev/null
+++ b/config/examples-all.json
@@ -0,0 +1,78 @@
+{
+  "exports": [],
+  "src": [
+    "src/**/*.js",
+    "build/ol.ext/*.js",
+    "build/examples/all.js"
+  ],
+  "compile": {
+    "js": [
+      "externs/olx.js",
+      "externs/oli.js"
+    ],
+    "externs": [
+      "externs/bingmaps.js",
+      "externs/bootstrap.js",
+      "externs/closure-compiler.js",
+      "externs/example.js",
+      "externs/fastclick.js",
+      "externs/geojson.js",
+      "externs/jquery-1.9.js",
+      "externs/proj4js.js",
+      "externs/tilejson.js",
+      "externs/topojson.js",
+      "externs/vbarray.js"
+    ],
+    "define": [
+      "goog.array.ASSUME_NATIVE_FUNCTIONS=true",
+      "goog.dom.ASSUME_STANDARDS_MODE=true",
+      "goog.json.USE_NATIVE_JSON=true",
+      "goog.DEBUG=false"
+    ],
+    "jscomp_error": [
+      "accessControls",
+      "ambiguousFunctionDecl",
+      "checkEventfulObjectDisposal",
+      "checkRegExp",
+      "checkStructDictInheritance",
+      "checkTypes",
+      "checkVars",
+      "const",
+      "constantProperty",
+      "deprecated",
+      "duplicateMessage",
+      "es3",
+      "es5Strict",
+      "externsValidation",
+      "fileoverviewTags",
+      "globalThis",
+      "internetExplorerChecks",
+      "invalidCasts",
+      "misplacedTypeAnnotation",
+      "missingGetCssName",
+      "missingProperties",
+      "missingProvide",
+      "missingRequire",
+      "missingReturn",
+      "newCheckTypes",
+      "nonStandardJsDocs",
+      "suspiciousCode",
+      "strictModuleDepCheck",
+      "typeInvalidation",
+      "undefinedNames",
+      "undefinedVars",
+      "unknownDefines",
+      "uselessCode",
+      "visibility"
+    ],
+    "extra_annotation_name": [
+      "api", "observable"
+    ],
+    "compilation_level": "ADVANCED",
+    "warning_level": "VERBOSE",
+    "output_wrapper": "(function(){%output%})();",
+    "use_types_for_optimization": true,
+    "manage_closure_dependencies": true
+
+  }
+}
diff --git a/config/jsdoc/api/conf.json b/config/jsdoc/api/conf.json
new file mode 100644
index 0000000..4858196
--- /dev/null
+++ b/config/jsdoc/api/conf.json
@@ -0,0 +1,42 @@
+{
+    "opts": {
+        "recurse": true,
+        "template": "config/jsdoc/api/template"
+    },
+    "tags": {
+        "allowUnknownTags": true
+    },
+    "source": {
+        "includePattern": ".+\\.js(doc)?$",
+        "excludePattern": "(^|\\/|\\\\)_",
+        "include": [
+            "src",
+            "externs/oli.js",
+            "externs/olx.js"
+        ]
+    },
+    "plugins": [
+        "node_modules/jsdoc/plugins/markdown",
+        "config/jsdoc/api/plugins/inheritdoc",
+        "config/jsdoc/api/plugins/interface",
+        "config/jsdoc/api/plugins/typedefs",
+        "config/jsdoc/api/plugins/events",
+        "config/jsdoc/api/plugins/observable",
+        "config/jsdoc/api/plugins/api"
+    ],
+    "markdown": {
+        "parser": "gfm"
+    },
+    "stability": {
+      "levels": ["deprecated","experimental","unstable","stable","frozen","locked"]
+    },
+    "templates": {
+        "cleverLinks": true,
+        "monospaceLinks": true,
+        "default": {
+            "outputSourceFiles": true
+        },
+        "applicationName": "OpenLayers 3"
+    },
+    "jsVersion": 180
+}
diff --git a/config/jsdoc/api/index.md b/config/jsdoc/api/index.md
new file mode 100644
index 0000000..92cfa13
--- /dev/null
+++ b/config/jsdoc/api/index.md
@@ -0,0 +1,41 @@
+<table><tr>
+<th width="33.3%">Map</th><th width="33.3%">View</th><th width="33.3%">Layers</th>
+</tr><tr>
+<td><p>A [map](ol.Map.html) is made of [layers](ol.layer.html), a [view](ol.View.html) to visualize them, [interactions](ol.interaction.html) to modify map content and [controls](ol.control.html) with UI components.</p>
+[Overview](ol.Map.html)<br>
+[Creation](ol.Map.html#Map)<br>
+[Events](ol.MapBrowserEvent.html)</td>
+<td><p>The view manages the visual parameters of the map view, like resolution or rotation.</p>
+[ol.View](ol.View.html) with center, projection, resolution and rotation</td>
+<td><p>Layers are lightweight containers that get their data from [sources](ol.source.html).</p>
+[ol.layer.Tile](ol.layer.Tile.html)<br>
+[ol.layer.Image](ol.layer.Image.html)<br>
+[ol.layer.Vector](ol.layer.Vector.html)</td>
+</tr><tr>
+<th>Controls</th><th>Interactions</th><th>Sources and formats</th>
+</tr><tr>
+<td>[Map default controls](ol.control.html#defaults)<br>
+[All controls](ol.control.html)
+</td>
+<td>
+[Map default interactions](ol.interaction.html#defaults)<br>
+Interactions for [vector features](ol.Feature.html)
+<ul><li>[ol.interaction.Select](ol.interaction.Select.html)</li>
+<li>[ol.interaction.Draw](ol.interaction.Draw.html)</li>
+<li>[ol.interaction.Modify](ol.interaction.Modify.html)</li></ul>
+[All interactions](ol.interaction.html)</td>
+<td>[Tile sources](ol.source.Tile.html) for [ol.layer.Tile](ol.layer.Tile.html)
+<br>[Image sources](ol.source.Image.html) for [ol.layer.Image](ol.layer.Image.html)
+<br>[Vector sources](ol.source.Vector.html) for [ol.layer.Vector](ol.layer.Vector.html)
+<br>[Formats](ol.format.Feature.html) for reading/writing vector data
+<br>[ol.format.WMSCapabilities](ol.format.WMSCapabilities.html)</td></tr>
+<tr><th>Projections</th><th>2-way bindings</th><th>Other components</th></tr>
+<tr><td><p>All coordinates and extents need to be provided in view projection (default: EPSG:3857). To transform, use [ol.proj.transform()](ol.proj.html#transform) and [ol.proj.transformExtent()](ol.proj.html#transformExtent).</p>
+[ol.proj](ol.proj.html)</td>
+<td><p>[Objects](ol.Object.html) can be kept in sync using the [bindTo()](ol.Object.html#bindTo) method.</p>
+<p>A [DOM Input](ol.dom.Input.html) class is available to bind Object properties to HTML Input elements.</p></td>
+<td>[ol.DeviceOrientation](ol.DeviceOrientation.html)<br>
+[ol.Geolocation](ol.Geolocation.html)<br>
+[ol.Overlay](ol.Overlay.html)<br>
+[ol.FeatureOverlay](ol.FeatureOverlay.html)<br></td>
+</tr></table>
diff --git a/config/jsdoc/api/plugins/api.js b/config/jsdoc/api/plugins/api.js
new file mode 100644
index 0000000..cfed4a7
--- /dev/null
+++ b/config/jsdoc/api/plugins/api.js
@@ -0,0 +1,130 @@
+/**
+ * Define an @api tag
+ */
+var conf = env.conf.stability;
+var defaultLevels = ["deprecated","experimental","unstable","stable","frozen","locked"];
+var levels = conf.levels || defaultLevels;
+var util = require('util');
+exports.defineTags = function(dictionary) {
+  dictionary.defineTag('api', {
+    mustHaveValue: false,
+    canHaveType: false,
+    canHaveName: false,
+    onTagged: function(doclet, tag) {
+      var level = tag.text || "experimental";
+      if (levels.indexOf(level) >= 0) {
+        doclet.stability = level;
+      } else {
+        var errorText = util.format('Invalid stability level (%s) in %s line %s', tag.text, doclet.meta.filename, doclet.meta.lineno);
+        require('jsdoc/util/error').handle( new Error(errorText) );
+      }
+    }
+  });
+};
+
+
+
+/*
+ * Based on @stability annotations, and assuming that items with no @stability
+ * annotation should not be documented, this plugin removes undocumented symbols
+ * from the documentation.
+ */
+
+function hasApiMembers(doclet) {
+  return doclet.longname.split('#')[0] == this.longname;
+}
+
+function includeAugments(doclet) {
+  var augments = doclet.augments;
+  if (augments) {
+    var cls;
+    for (var i = augments.length - 1; i >= 0; --i) {
+      cls = classes[augments[i]];
+      if (cls) {
+        includeAugments(cls);
+        if (cls.fires) {
+          if (!doclet.fires) {
+            doclet.fires = [];
+          }
+          cls.fires.forEach(function(f) {
+            if (doclet.fires.indexOf(f) == -1) {
+              doclet.fires.push(f);
+            }
+          });
+        }
+        if (cls.observables) {
+          if (!doclet.observables) {
+            doclet.observables = [];
+          }
+          cls.observables.forEach(function(f) {
+            if (doclet.observables.indexOf(f) == -1) {
+              doclet.observables.push(f);
+            }
+          });
+        }
+        if (cls.longname.indexOf('oli.') !== 0) {
+          cls._hideConstructor = true;
+          delete cls.undocumented;
+        }
+      }
+    }
+  }
+}
+
+var api = [];
+var classes = {};
+
+exports.handlers = {
+
+  newDoclet: function(e) {
+    var doclet = e.doclet;
+    // Keep track of api items - needed in parseComplete to determine classes
+    // with api members.
+    if (doclet.stability) {
+      api.push(doclet);
+    }
+    // Mark explicity defined namespaces - needed in parseComplete to keep
+    // namespaces that we need as containers for api items.
+    if (/.*\.jsdoc$/.test(doclet.meta.filename) && doclet.kind == 'namespace') {
+      doclet.namespace_ = true;
+    }
+    if (doclet.kind == 'class') {
+      classes[doclet.longname] = doclet;
+    }
+  },
+
+  parseComplete: function(e) {
+    var doclets = e.doclets;
+    for (var i = doclets.length - 1; i >= 0; --i) {
+      var doclet = doclets[i];
+      if (doclet.stability || doclet.namespace_) {
+        if (doclet.kind == 'class') {
+          includeAugments(doclet);
+        }
+        if (doclet.fires) {
+          doclet.fires.sort(function(a, b) {
+            return a.split(/#?event:/)[1] < b.split(/#?event:/)[1] ? -1 : 1;
+          });
+        }
+        if (doclet.observables) {
+          doclet.observables.sort(function(a, b) {
+            return a.name < b.name ? -1 : 1;
+          });
+        }
+        // Always document namespaces and items with stability annotation
+        continue;
+      }
+      if (doclet.kind == 'class' && api.some(hasApiMembers, doclet)) {
+        // Mark undocumented classes with documented members as unexported.
+        // This is used in ../template/tmpl/container.tmpl to hide the
+        // constructor from the docs.
+        doclet._hideConstructor = true;
+        includeAugments(doclet);
+      } else if (!doclet._hideConstructor) {
+        // Remove all other undocumented symbols
+        doclet.undocumented = true;
+      }
+    }
+  }
+
+};
diff --git a/config/jsdoc/api/plugins/events.js b/config/jsdoc/api/plugins/events.js
new file mode 100644
index 0000000..52141b2
--- /dev/null
+++ b/config/jsdoc/api/plugins/events.js
@@ -0,0 +1,43 @@
+var events = {};
+var classes = {};
+
+exports.handlers = {
+
+  newDoclet: function(e) {
+    var doclet = e.doclet;
+    var cls;
+    if (doclet.kind == 'event') {
+      cls = doclet.longname.split('#')[0];
+      if (!(cls in events)) {
+        events[cls] = [];
+      }
+      events[cls].push(doclet.longname);
+    } else if (doclet.kind == 'class') {
+      classes[doclet.longname] = doclet;
+    }
+  },
+
+  parseComplete: function(e) {
+    var doclets = e.doclets;
+    var doclet, i, ii, j, jj, event, fires;
+    for (i = 0, ii = doclets.length - 1; i < ii; ++i) {
+      doclet = doclets[i];
+      if (doclet.fires) {
+        if (doclet.kind == 'class') {
+          fires = [];
+          for (j = 0, jj = doclet.fires.length; j < jj; ++j) {
+            event = doclet.fires[j].replace('event:', '');
+            if (events[event]) {
+              fires.push.apply(fires, events[event]);            
+            } else {
+              fires.push(doclet.fires[j]);
+            }
+          }
+          doclet.fires = fires;
+        }
+      }
+    }
+  }
+
+};
+
diff --git a/config/jsdoc/api/plugins/inheritdoc.js b/config/jsdoc/api/plugins/inheritdoc.js
new file mode 100644
index 0000000..d0026b3
--- /dev/null
+++ b/config/jsdoc/api/plugins/inheritdoc.js
@@ -0,0 +1,109 @@
+/*
+ * This is a hack to prevent inheritDoc tags from entirely removing
+ * documentation of the method that inherits the documentation.
+ *
+ * TODO: Remove this hack when https://github.com/jsdoc3/jsdoc/issues/53
+ * is addressed.
+ */
+
+
+exports.defineTags = function(dictionary) {
+  dictionary.defineTag('inheritDoc', {
+    mustHaveValue: false,
+    canHaveType: false,
+    canHaveName: false,
+    onTagged: function(doclet, tag) {
+      doclet.inheritdoc = true;
+    }
+  });
+};
+
+
+var lookup = {};
+var incompleteByClass = {};
+var keepKeys = ['comment', 'meta', 'name', 'memberof', 'longname', 'augment',
+    'stability'];
+
+exports.handlers = {
+
+  newDoclet: function(e) {
+    var doclet = e.doclet;
+    var incompletes;
+    if (!(doclet.longname in lookup)) {
+      lookup[doclet.longname] = [];
+    }
+    lookup[doclet.longname].push(doclet);
+    if (doclet.inheritdoc) {
+      if (!(doclet.memberof in incompleteByClass)) {
+        incompleteByClass[doclet.memberof] = [];
+      }
+      incompletes = incompleteByClass[doclet.memberof];
+      if (incompletes.indexOf(doclet.name) == -1) {
+        incompletes.push(doclet.name);
+      }
+    }
+  },
+
+  parseComplete: function(e) {
+    var ancestors, candidate, candidates, doclet, i, j, k, l, key;
+    var incompleteDoclet, stability, incomplete, incompletes;
+    var doclets = e.doclets;
+    for (i = doclets.length - 1; i >= 0; --i) {
+      doclet = doclets[i];
+      if (doclet.augments) {
+        ancestors = [].concat(doclet.augments);
+      }
+      incompletes = incompleteByClass[doclet.longname];
+      if (ancestors && incompletes) {
+        // collect ancestors from the whole hierarchy
+        for (j = 0; j < ancestors.length; ++j) {
+          candidates = lookup[ancestors[j]];
+          if (candidates) {
+            for (k = candidates.length - 1; k >= 0; --k) {
+              candidate = candidates[k];
+              if (candidate.augments) {
+                ancestors = ancestors.concat(candidate.augments);
+              }
+            }
+          }
+        }
+        // walk through all inheritDoc members
+        for (j = incompletes.length - 1; j >= 0; --j) {
+          incomplete = incompletes[j];
+          candidates = lookup[doclet.longname + '#' + incomplete];
+          if (candidates) {
+            // get the incomplete doclet that needs to be augmented
+            for (k = candidates.length - 1; k >= 0; --k) {
+              incompleteDoclet = candidates[k];
+              if (incompleteDoclet.inheritdoc) {
+                break;
+              }
+            }
+          }
+          // find the documented ancestor
+          for (k = ancestors.length - 1; k >= 0; --k) {
+            candidates = lookup[ancestors[k] + '#' + incomplete];
+            if (candidates) {
+              for (l = candidates.length - 1; l >= 0; --l) {
+                candidate = candidates[l];
+                if (candidate && !candidate.inheritdoc) {
+                  stability = candidate.stability || incompleteDoclet.stability;
+                  if (stability) {
+                    incompleteDoclet.stability = stability;
+                    for (key in candidate) {
+                      if (candidate.hasOwnProperty(key) &&
+                          keepKeys.indexOf(key) == -1) {
+                        incompleteDoclet[key] = candidate[key];
+                      }
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+};
\ No newline at end of file
diff --git a/config/jsdoc/api/plugins/interface.js b/config/jsdoc/api/plugins/interface.js
new file mode 100644
index 0000000..7569ba8
--- /dev/null
+++ b/config/jsdoc/api/plugins/interface.js
@@ -0,0 +1,25 @@
+exports.defineTags = function(dictionary) {
+
+  var classTag = dictionary.lookUp('class');
+  dictionary.defineTag('interface', {
+    mustHaveValue: false,
+    onTagged: function(doclet, tag) {
+      classTag.onTagged.apply(this, arguments);
+      doclet.interface = true;
+    }
+  });
+
+  var augmentsTag = dictionary.lookUp('augments');
+  dictionary.defineTag('implements', {
+    mustHaveValue: true,
+    onTagged: function(doclet, tag) {
+      tag.value = tag.value.match(/^\{?([^\}]*)\}?$/)[1];
+      augmentsTag.onTagged.apply(this, arguments);
+      if (!doclet.implements) {
+        doclet.implements = [];
+      }
+      doclet.implements.push(tag.value);
+    }
+  });
+
+};
diff --git a/config/jsdoc/api/plugins/observable.js b/config/jsdoc/api/plugins/observable.js
new file mode 100644
index 0000000..b3bc7f3
--- /dev/null
+++ b/config/jsdoc/api/plugins/observable.js
@@ -0,0 +1,69 @@
+var classes = {};
+var observables = {};
+
+exports.handlers = {
+
+  newDoclet: function(e) {
+    var doclet = e.doclet;
+    if (doclet.kind == 'class') {
+      classes[doclet.longname] = doclet;
+    }
+  },
+
+  parseComplete: function(e) {
+    var doclets = e.doclets;
+    var cls, doclet, event, i, ii, observable;
+    for (i = 0, ii = doclets.length - 1; i < ii; ++i) {
+      doclet = doclets[i];
+      cls = classes[doclet.longname.split('#')[0]];
+      if (typeof doclet.observable == 'string' && cls) {
+        var name = doclet.name.replace(/^[sg]et/, '');
+        name = name.substr(0, 1).toLowerCase() + name.substr(1);
+        var key = doclet.longname.split('#')[0] + '#' + name;
+        doclet.observable = key;
+        if (!observables[key]) {
+          observables[key] = {};
+        }
+        observable = observables[key];
+        observable.name = name;
+        observable.readonly = typeof observable.readonly == 'boolean' ?
+            observable.readonly : true;
+        if (doclet.name.indexOf('get') === 0) {
+          observable.type = doclet.returns[0].type;
+          observable.description = doclet.returns[0].description;
+        } else if (doclet.name.indexOf('set') === 0) {
+          observable.readonly = false;
+        }
+        if (doclet.stability) {
+          observable.stability = doclet.stability;
+        }
+        if (!cls.observables) {
+          cls.observables = [];
+        }
+        observable = observables[doclet.observable];
+        if (cls.observables.indexOf(observable) == -1) {
+          cls.observables.push(observable);
+        }
+        if (!cls.fires) {
+          cls.fires = [];
+        }
+        event = 'ol.ObjectEvent#event:change:' + name;
+        if (cls.fires.indexOf(event) == -1) {
+          cls.fires.push(event);
+        }
+      }
+    }
+  }
+
+};
+
+exports.defineTags = function(dictionary) {
+  dictionary.defineTag('observable', {
+    mustNotHaveValue: true,
+    canHaveType: false,
+    canHaveName: false,
+    onTagged: function(doclet, tag) {
+      doclet.observable = '';
+    }
+  });
+};
diff --git a/config/jsdoc/api/plugins/typedefs.js b/config/jsdoc/api/plugins/typedefs.js
new file mode 100644
index 0000000..1b4543d
--- /dev/null
+++ b/config/jsdoc/api/plugins/typedefs.js
@@ -0,0 +1,63 @@
+/*
+ * Converts olx.js @type annotations into properties of the previous @typedef.
+ * Changes @enum annotations into @typedef.
+ */
+
+var lastOlxTypedef = null;
+var olxTypes = {};
+
+function addSubparams(params) {
+  for (var j = 0, jj = params.length; j < jj; ++j) {
+    var param = params[j];
+    var types = param.type.names;
+    for (var k = 0, kk = types.length; k < kk; ++k) {
+      var name = types[k];
+      if (name in olxTypes) {
+        param.subparams = olxTypes[name];
+        // TODO addSubparams(param.subparams);
+        // TODO Do we need to support multiple object literal types per
+        // param?
+        break;
+      }
+    }
+  }
+}
+
+exports.handlers = {
+
+  newDoclet: function(e) {
+    var doclet = e.doclet;
+    if (doclet.meta.filename == 'olx.js') {
+      // do nothing if not marked @api
+      if (!doclet.stability) {
+        return;
+      }
+      if (doclet.kind == 'typedef') {
+        lastOlxTypedef = doclet;
+        olxTypes[doclet.longname] = [];
+        doclet.properties = [];
+      } else if (lastOlxTypedef && doclet.memberof == lastOlxTypedef.longname) {
+        lastOlxTypedef.properties.push(doclet);
+        olxTypes[lastOlxTypedef.longname].push(doclet);
+      } else {
+        lastOlxTypedef = null;
+      }
+    } else if (doclet.isEnum) {
+      // We never export enums, so we document them like typedefs
+      doclet.kind = 'typedef';
+      delete doclet.isEnum;
+    }
+  },
+
+  parseComplete: function(e) {
+    var doclets = e.doclets;
+    for (var i = doclets.length - 1; i >= 0; --i) {
+      var doclet = doclets[i];
+      var params = doclet.params;
+      if (params) {
+        addSubparams(params);
+      }
+    }
+  }
+
+};
diff --git a/config/jsdoc/api/readme.md b/config/jsdoc/api/readme.md
new file mode 100644
index 0000000..96bedc7
--- /dev/null
+++ b/config/jsdoc/api/readme.md
@@ -0,0 +1,78 @@
+# API Documentation
+
+This directory contains configuration (`conf.json`), static content (`index.md`), template (`template/`) and plugins (`plugins/`) for the [JSDoc3](http://usejsdoc.org/) API generator.
+
+## Documenting the source code
+
+JSDoc annotations are used for metadata used by the compiler, for defining the user facing API, and for user documentation.
+
+In the simplest case, a JSDoc block can look like this:
+```js
+/**
+ * Add the given control to the map.
+ * @param {ol.control.Control} control Control.
+ * @api
+ */
+ol.Map.prototype.addControl = function(control) {
+  // ...
+};
+```
+The first line is text for the user documentation. This can be long, and it can
+contain Markdown.
+
+The second line tells the Closure compiler the type of the argument.
+
+The third line (`@api`) marks the method as part of the api and thus exportable. The stability can be added as value, e.g. `@api stable`. Without such an api annotation, the method will not be documented in the generated API documentation. Symbols without an api annotation will also not be exportable (unless they are explicitly exported with a `goog.exportProperty` call).
+
+### Events
+
+Events are documented using `@fires` and `@event` annotations:
+```js
+/**
+ * Constants for event names.
+ * @enum {string}
+ */
+ol.MapBrowserEvent.EventType = {
+  /**
+   * A true single click with no dragging and no double click. Note that this
+   * event is delayed by 250 ms to ensure that it is not a double click.
+   * @event ol.MapBrowserEvent#singleclick
+   * @api
+   */
+  SINGLECLICK: 'singleclick',
+  // ...
+};
+```
+Note the value of the `@event` annotation. The text before the hash refers to the event class that the event belongs to, and the text after the hash is the type of the event.
+
+To export event properties, they need to be defined in `externs/oli.js` (also see `readme.md` in `externs/`) and marked with an @api annotation:
+```js
+/** @interface */
+oli.MapBrowserEvent;
+
+/**
+ * @type {ol.Coordinate}
+ * @api
+ */
+oli.MapBrowserEvent.prototype.coordinate;
+
+// ...
+
+};
+```
+To document which events are fired by a class or method, the `@fires` annotation is used:
+```js
+/**
+ * @fires ol.MapBrowserEvent
+ * @fires ol.MapEvent
+ * @fires ol.render.Event
+ * ...
+ */
+ol.Map = function(options) {
+  // ...
+};
+```
+
+### Observable Properties
+
+Observable properties are documented using the `@observable` annotation. This annotation is added to the getter of an observable property. If an observable property is also settable, the setter is annotated with `@observable` as well.
diff --git a/config/jsdoc/api/template/README.md b/config/jsdoc/api/template/README.md
new file mode 100644
index 0000000..dd759df
--- /dev/null
+++ b/config/jsdoc/api/template/README.md
@@ -0,0 +1,3 @@
+This template is based on the [Jaguar](https://github.com/davidshimjs/jaguarjs/tree/master/docs/templates/jaguar) template. [JaguarJS](https://github.com/davidshimjs/jaguarjs) is licensed under the [LGPL license](https://github.com/davidshimjs/jaguarjs/tree/master/LICENSE).
+
+The default template for JSDoc 3 uses: [the Taffy Database library](http://taffydb.com/) and the [Underscore Template library](http://documentcloud.github.com/underscore/#template).
diff --git a/config/jsdoc/api/template/less/common.less b/config/jsdoc/api/template/less/common.less
new file mode 100644
index 0000000..09cc727
--- /dev/null
+++ b/config/jsdoc/api/template/less/common.less
@@ -0,0 +1,9 @@
+ at navWidth: 250px;
+ at colorSubtitle: rgb(119, 156, 52);
+ at colorRed: rgb(238, 125, 125);
+ at colorLink: #2a6496;
+ at colorBgNavi: #2a2a2a;
+
+.font-description () {
+    font-family: "freight-text-pro",Georgia,Cambria,"Times New Roman",Times,serif
+}
diff --git a/config/jsdoc/api/template/less/footer.less b/config/jsdoc/api/template/less/footer.less
new file mode 100644
index 0000000..851e169
--- /dev/null
+++ b/config/jsdoc/api/template/less/footer.less
@@ -0,0 +1,10 @@
+ at import "common.less";
+
+footer {
+    margin: 15px 0;
+    padding-top: 15px;
+    border-top: 1px solid #e1e1e1;
+    .font-description();
+    font-size: 0.8em;
+    color: gray;
+}
\ No newline at end of file
diff --git a/config/jsdoc/api/template/less/jaguar.less b/config/jsdoc/api/template/less/jaguar.less
new file mode 100644
index 0000000..f8272ea
--- /dev/null
+++ b/config/jsdoc/api/template/less/jaguar.less
@@ -0,0 +1,22 @@
+ at import "common.less";
+
+// normalize
+html, body {
+    font: 1em "jaf-bernino-sans","Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Verdana,sans-serif;
+    background-color: #fff;
+}
+ul, ol {
+    margin: 0;
+    padding: 0;
+}
+li {
+    list-style-type: none;
+}
+
+#wrap {
+    position: relative;
+}
+
+ at import "navigation.less";
+ at import "main.less";
+ at import "footer.less";
\ No newline at end of file
diff --git a/config/jsdoc/api/template/less/main.less b/config/jsdoc/api/template/less/main.less
new file mode 100644
index 0000000..d565292
--- /dev/null
+++ b/config/jsdoc/api/template/less/main.less
@@ -0,0 +1,288 @@
+ at import "common.less";
+
+.main {
+    padding: 20px 20px;
+    margin-left: @navWidth;
+    .page-title {
+        display: none;
+    }
+
+    h1 {
+        font-weight: bold;
+        font-size: 1.6em;
+        margin: 0;
+    }
+
+    h2 {
+        font-weight: bold;
+        font-size: 1.5em;
+        margin: 0;
+    }
+
+    h3 {
+        font-weight: bold;
+        font-size: 12px;
+        margin: 5px 0;
+    }
+
+    h4 {
+        font-weight: bold;
+        font-size: 1em;
+    }
+
+    h5 {
+        font-weight: bold;
+        font-size: 12px;
+    }
+
+    dd {
+        font-size: 12px;
+    }
+
+    h4.name {
+        span.type-signature {
+            display: inline-block;
+            border-radius: 3px;
+            background-color: gray;
+            color: #fff;
+            font-size: 0.7em;
+            padding: 2px 4px;
+        }
+
+        span.type {
+            margin-left: 5px;
+        }
+
+        span.glyphicon {
+            display: inline-block;
+            vertical-align: middle;
+            color: #e1e1e1;
+            margin-left: 7px;
+        }
+
+        span.returnType {
+            margin-left: 3px;
+            background-color: transparent!important;
+            color: gray!important;
+        }
+    }
+
+
+    span.static {
+        display: inline-block;
+        border-radius: 3px;
+        background-color: @colorSubtitle!important;
+        color: #fff;
+        font-size: 0.7em;
+        padding: 2px 4px;
+        margin-right: 8px;
+    }
+
+    span.number {
+        background-color: #ccc!important;
+        color: #2fa2b1!important;
+    }
+
+    span.string {
+        background-color: #ccc!important;
+        color: #2fa2b1!important;
+    }
+
+    span.object {
+        background-color: #ccc!important;
+        color: #2fa2b1!important;
+    }
+
+    span.array {
+        background-color: #ccc!important;
+        color: #2fa2b1!important;
+    }
+
+    span.boolean {
+        background-color: #ccc!important;
+        color: #2fa2b1!important;
+    }
+
+    .subsection-title {
+        font-size: 14px;
+        margin-top: 30px;
+        color: @colorSubtitle;
+    }
+
+    .description {
+        margin-top: 10px;
+        // .font-description();
+        font-size: 13px;
+
+        p {
+            font-size: 13px;
+        }
+    }
+
+    .tag-source {
+        font-size: 12px;
+    }
+    dt.tag-source {
+        margin-top: 5px;
+    }
+
+    dt.tag-todo {
+        font-size: 10px;
+        display: inline-block;
+        background-color: @colorLink;
+        color: #fff;
+        padding: 2px 4px;
+        border-radius: 5px;
+    }
+
+    .type-signature {
+        font-size: 12px;
+    }
+
+    .tag-deprecated {
+        display: inline-block;
+        font-size: 10px;
+    }
+
+    .important {
+        background-color: @colorRed;
+        color: #fff;
+        padding: 2px 4px;
+        border-radius: 5px;
+    }
+
+    .nameContainer {
+        position: relative;
+        margin-top: 20px;
+        padding-top: 5px;
+        border-top: 1px solid #e1e1e1;
+
+        .inherited {
+            display: inline-block;
+            border-radius: 3px;
+            background-color: #888!important;
+            font-size: 0.7em;
+            padding: 2px 4px;
+            margin-right: 5px;
+            a {
+                color: #fff;
+            }
+        }
+
+        .tag-source {
+            position: absolute;
+            top: 17px;
+            right: 0;
+            font-size: 10px;
+            a {
+                color: gray;
+            }
+        }
+
+        &.inherited {
+            color: gray;
+        }
+
+        h4 {
+            margin-right: 150px;
+            line-height: 1.3;
+            
+            .signature {
+                font-size: 13px;
+                font-weight: normal;
+                font-family: Menlo,Monaco,Consolas,"Courier New",monospace;
+            }
+        }
+    }
+
+    pre {
+        font-size: 11px;
+    }
+
+    table {
+        width: 100%;
+        margin-bottom: 15px;
+
+        th {
+            padding: 3px 3px;
+        }
+
+        td {
+            vertical-align: top;
+            padding: 5px 3px;
+        }
+
+        .name {
+            width: 110px;
+        }
+
+        .type {
+            width: 60px;
+            color: #aaa;
+            font-size: 11px;
+        }
+
+        .attributes {
+            width: 80px;
+            color: #aaa;
+            font-size: 11px;
+        }
+
+        .description {
+            font-size: 12px;
+            p {
+                margin: 0;
+            }
+        }
+
+        .optional {
+            float: left;
+            border-radius: 3px;
+            background-color: #ddd!important;
+            font-size: 0.7em;
+            padding: 2px 4px;
+            margin-right: 5px;
+            color: gray;
+        }
+    }
+
+    .readme {
+        p {
+            margin-top: 15px;
+            line-height: 1.2;
+            font-size: 0.85em;
+        }
+
+        h1 {
+            font-size: 1.7em;
+        }
+
+        h2 {
+            margin-top: 30px;
+            margin-bottom: 10px;
+            padding-bottom: 10px;
+            border-bottom: 1px solid #e1e1e1;
+        }
+
+        li {
+            font-size: 0.9em;
+            margin-bottom: 10px;
+        }
+    }
+
+    article {
+        ol, ul {
+            margin-left: 25px;
+        }
+
+        ol > li {
+            list-style-type: decimal;
+            margin-bottom: 5px;
+        }
+
+        ul > li {
+            margin-bottom: 5px;
+            list-style-type: disc;
+        }
+    }
+}
diff --git a/config/jsdoc/api/template/less/navigation.less b/config/jsdoc/api/template/less/navigation.less
new file mode 100644
index 0000000..5e221b2
--- /dev/null
+++ b/config/jsdoc/api/template/less/navigation.less
@@ -0,0 +1,103 @@
+ at import "common.less";
+
+::-webkit-scrollbar {
+    width: 8px;
+    background-color: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+    background-color: gray;
+    border-radius: 4px;
+}
+
+.navigation {
+    position: fixed;
+    float: left;
+    width: @navWidth;
+    height: 100%;
+    background-color: @colorBgNavi;
+
+    .applicationName {
+        margin: 0;
+        margin-top: 15px;
+        padding: 10px 15px;
+        font: bold 1.25em Helvetica;
+        color: #fff;
+
+        a {
+            color: #fff;
+        }
+    }
+
+    .search {
+        padding: 10px 15px;
+
+        input {
+            background-color: #333;
+            color: #fff;
+            border-color: #555;
+        }
+    }
+
+    .list {
+        padding: 10px 15px 0 15px;
+        position: relative;
+        overflow: auto;
+        width: 100%;
+    }
+
+    li.item {
+        margin-bottom: 8px;
+        padding-bottom: 8px;
+        border-bottom: 1px solid #333;
+
+        a {
+            color: #bbb;
+            &:hover {
+                color: #fff;
+            }
+        }
+        .title {
+            cursor: pointer;
+            position: relative;
+            a {
+                color: #e1e1e1;
+                &:hover {
+                    color: #fff;
+                }
+            }
+            display: block;
+            font-size: 0.8em;
+
+            .static {
+                display: block;
+                border-radius: 3px;
+                background-color: @colorSubtitle;
+                color: #000;
+                font-size: 0.7em;
+                padding: 2px 4px;
+                float: right;
+            }
+        }
+
+        .subtitle {
+            margin-top: 10px;
+            font: bold 0.65em Helvetica;
+            color: @colorSubtitle;
+            display: block;
+        }
+
+
+        ul {
+            & > li {
+                font-size: 0.7em;
+                padding-left: 8px;
+                margin-top: 2px;
+            }
+        }
+
+        .itemMembers {
+            display: none;
+        }
+    }
+}
\ No newline at end of file
diff --git a/config/jsdoc/api/template/publish.js b/config/jsdoc/api/template/publish.js
new file mode 100644
index 0000000..eabc52e
--- /dev/null
+++ b/config/jsdoc/api/template/publish.js
@@ -0,0 +1,513 @@
+/*global env: true */
+var template = require('jsdoc/template'),
+    fs = require('jsdoc/fs'),
+    path = require('jsdoc/path'),
+    taffy = require('taffydb').taffy,
+    handle = require('jsdoc/util/error').handle,
+    helper = require('jsdoc/util/templateHelper'),
+    _ = require('underscore'),
+    htmlsafe = helper.htmlsafe,
+    linkto = helper.linkto,
+    resolveAuthorLinks = helper.resolveAuthorLinks,
+    scopeToPunc = helper.scopeToPunc,
+    hasOwnProp = Object.prototype.hasOwnProperty,
+    data,
+    view,
+    outdir = env.opts.destination;
+
+function find(spec) {
+    return helper.find(data, spec);
+}
+
+function tutoriallink(tutorial) {
+    return helper.toTutorial(tutorial, null, { tag: 'em', classname: 'disabled', prefix: 'Tutorial: ' });
+}
+
+function getAncestorLinks(doclet) {
+    return helper.getAncestorLinks(data, doclet);
+}
+
+function hashToLink(doclet, hash) {
+    if ( !/^(#.+)/.test(hash) ) { return hash; }
+    
+    var url = helper.createLink(doclet);
+    
+    url = url.replace(/(#.+|$)/, hash);
+    return '<a href="' + url + '">' + hash + '</a>';
+}
+
+function needsSignature(doclet) {
+    var needsSig = false;
+
+    // function and class definitions always get a signature
+    if (doclet.kind === 'function' || doclet.kind === 'class') {
+        needsSig = true;
+    }
+    // typedefs that contain functions get a signature, too
+    else if (doclet.kind === 'typedef' && doclet.type && doclet.type.names &&
+        doclet.type.names.length) {
+        for (var i = 0, l = doclet.type.names.length; i < l; i++) {
+            if (doclet.type.names[i].toLowerCase() === 'function') {
+                needsSig = true;
+                break;
+            }
+        }
+    }
+
+    return needsSig;
+}
+
+function addSignatureParams(f) {
+    var params = helper.getSignatureParams(f, 'optional');
+    
+    f.signature = (f.signature || '') + '('+params.join(', ')+')';
+}
+
+function addSignatureReturns(f) {
+    var returnTypes = helper.getSignatureReturns(f);
+    
+    f.signature = '<span class="signature">'+(f.signature || '') + '</span>';
+    
+    if (returnTypes.length) {
+        f.signature += '<span class="glyphicon glyphicon-circle-arrow-right"></span><span class="type-signature returnType">'+(returnTypes.length ? '{'+returnTypes.join('|')+'}' : '')+'</span>';
+    }
+}
+
+function addSignatureTypes(f) {
+    var types = helper.getSignatureTypes(f);
+    
+    f.signature = (f.signature || '') + '<span class="type-signature">'+(types.length? ' :'+types.join('|') : '')+' </span>';
+}
+
+function shortenPaths(files, commonPrefix) {
+    // always use forward slashes
+    var regexp = new RegExp('\\\\', 'g');
+
+    Object.keys(files).forEach(function(file) {
+        files[file].shortened = files[file].resolved.replace(commonPrefix, '')
+            .replace(regexp, '/');
+    });
+
+    return files;
+}
+
+function resolveSourcePath(filepath) {
+    return path.resolve(process.cwd(), filepath);
+}
+
+function getPathFromDoclet(doclet) {
+    if (!doclet.meta) {
+        return;
+    }
+
+    var filepath = doclet.meta.path && doclet.meta.path !== 'null' ?
+        doclet.meta.path + '/' + doclet.meta.filename.split(/[\/\\]/).pop() :
+        doclet.meta.filename;
+
+    return filepath;
+}
+    
+function generate(title, docs, filename, resolveLinks) {
+    resolveLinks = resolveLinks === false ? false : true;
+
+    var docData = {
+        filename: filename,
+        title: title,
+        docs: docs
+    };
+    
+    var outpath = path.join(outdir, filename),
+        html = view.render('container.tmpl', docData);
+    
+    if (resolveLinks) {
+        html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
+    }
+    
+    fs.writeFileSync(outpath, html, 'utf8');
+}
+
+function generateSourceFiles(sourceFiles) {
+    Object.keys(sourceFiles).forEach(function(file) {
+        var source;
+        // links are keyed to the shortened path in each doclet's `meta.filename` property
+        var sourceOutfile = helper.getUniqueFilename(sourceFiles[file].shortened);
+        helper.registerLink(sourceFiles[file].shortened, sourceOutfile);
+
+        try {
+            source = {
+                kind: 'source',
+                code: helper.htmlsafe( fs.readFileSync(sourceFiles[file].resolved, 'utf8') )
+            };
+        }
+        catch(e) {
+            handle(e);
+        }
+
+        generate('Source: ' + sourceFiles[file].shortened, [source], sourceOutfile,
+            false);
+    });
+}
+
+/**
+ * Look for classes or functions with the same name as modules (which indicates that the module
+ * exports only that class or function), then attach the classes or functions to the `module`
+ * property of the appropriate module doclets. The name of each class or function is also updated
+ * for display purposes. This function mutates the original arrays.
+ * 
+ * @private
+ * @param {Array.<module:jsdoc/doclet.Doclet>} doclets - The array of classes and functions to
+ * check.
+ * @param {Array.<module:jsdoc/doclet.Doclet>} modules - The array of module doclets to search.
+ */
+function attachModuleSymbols(doclets, modules) {
+    var symbols = {};
+
+    // build a lookup table
+    doclets.forEach(function(symbol) {
+        symbols[symbol.longname] = symbol;
+    });
+
+    return modules.map(function(module) {
+        if (symbols[module.longname]) {
+            module.module = symbols[module.longname];
+            module.module.name = module.module.name.replace('module:', 'require("') + '")';
+        }
+    });
+}
+
+/**
+ * Create the navigation sidebar.
+ * @param {object} members The members that will be used to create the sidebar.
+ * @param {array<object>} members.classes
+ * @param {array<object>} members.externals
+ * @param {array<object>} members.globals
+ * @param {array<object>} members.mixins
+ * @param {array<object>} members.modules
+ * @param {array<object>} members.namespaces
+ * @param {array<object>} members.tutorials
+ * @param {array<object>} members.events
+ * @return {string} The HTML for the navigation sidebar.
+ */
+function buildNav(members) {
+    var nav = [];
+    // merge namespaces and classes, then sort
+    var merged = members.namespaces.concat(members.classes);
+    merged.sort(function (a, b) {
+      if (a.longname > b.longname)
+        return 1;
+      if (a.longname < b.longname)
+        return -1;
+      return 0;
+    });
+    _.each(merged, function (v) {
+      // exclude 'olx' and interfaces from sidebar
+      if (v.longname.indexOf('olx') !== 0 && v.interface !== true) {
+          if (v.kind == 'namespace') {
+            nav.push({
+                type: 'namespace',
+                longname: v.longname,
+                name: v.name,
+                members: find({
+                    kind: 'member',
+                    memberof: v.longname
+                }),
+                methods: find({
+                    kind: 'function',
+                    memberof: v.longname
+                }),
+                typedefs: find({
+                    kind: 'typedef',
+                    memberof: v.longname
+                }),
+                events: find({
+                    kind: 'event',
+                    memberof: v.longname
+                })
+            });
+          }
+          if (v.kind == 'class') {
+            nav.push({
+                type: 'class',
+                longname: v.longname,
+                name: v.name,
+                members: find({
+                    kind: 'member',
+                    memberof: v.longname
+                }),
+                methods: find({
+                    kind: 'function',
+                    memberof: v.longname
+                }),
+                typedefs: find({
+                    kind: 'typedef',
+                    memberof: v.longname
+                }),
+                fires: v.fires,
+                events: find({
+                    kind: 'event',
+                    memberof: v.longname
+                })
+            });
+          }
+      }
+    });
+    return nav;
+}
+
+
+/**
+    @param {TAFFY} taffyData See <http://taffydb.com/>.
+    @param {object} opts
+    @param {Tutorial} tutorials
+ */
+exports.publish = function(taffyData, opts, tutorials) {
+    data = taffyData;
+
+    var conf = env.conf.templates || {};
+    conf['default'] = conf['default'] || {};
+
+    var templatePath = opts.template;
+    view = new template.Template(templatePath + '/tmpl');
+    
+    // claim some special filenames in advance, so the All-Powerful Overseer of Filename Uniqueness
+    // doesn't try to hand them out later
+    var indexUrl = helper.getUniqueFilename('index');
+    // don't call registerLink() on this one! 'index' is also a valid longname
+
+    var globalUrl = helper.getUniqueFilename('global');
+    helper.registerLink('global', globalUrl);
+
+    // set up templating
+    view.layout = 'layout.tmpl';
+
+    // set up tutorials for helper
+    helper.setTutorials(tutorials);
+
+    data = helper.prune(data);
+    data.sort('longname, version, since');
+    helper.addEventListeners(data);
+
+    var sourceFiles = {};
+    var sourceFilePaths = [];
+    data().each(function(doclet) {
+         doclet.attribs = '';
+        
+        if (doclet.examples) {
+            doclet.examples = doclet.examples.map(function(example) {
+                var caption, code;
+                
+                if (example.match(/^\s*<caption>([\s\S]+?)<\/caption>(\s*[\n\r])([\s\S]+)$/i)) {
+                    caption = RegExp.$1;
+                    code    = RegExp.$3;
+                }
+                
+                return {
+                    caption: caption || '',
+                    code: code || example
+                };
+            });
+        }
+        if (doclet.see) {
+            doclet.see.forEach(function(seeItem, i) {
+                doclet.see[i] = hashToLink(doclet, seeItem);
+            });
+        }
+
+        // build a list of source files
+        var sourcePath;
+        var resolvedSourcePath;
+        if (doclet.meta) {
+            sourcePath = getPathFromDoclet(doclet);
+            resolvedSourcePath = resolveSourcePath(sourcePath);
+            sourceFiles[sourcePath] = {
+                resolved: resolvedSourcePath,
+                shortened: null
+            };
+            sourceFilePaths.push(resolvedSourcePath);
+        }
+    });
+    
+    // update outdir if necessary, then create outdir
+    var packageInfo = ( find({kind: 'package'}) || [] ) [0];
+    if (packageInfo && packageInfo.name) {
+        outdir = path.join(outdir, packageInfo.name, packageInfo.version);
+    }
+    fs.mkPath(outdir);
+
+    // copy the template's static files to outdir
+    var fromDir = path.join(templatePath, 'static');
+    var staticFiles = fs.ls(fromDir, 3);
+
+    staticFiles.forEach(function(fileName) {
+        var toDir = fs.toDir( fileName.replace(fromDir, outdir) );
+        fs.mkPath(toDir);
+        fs.copyFileSync(fileName, toDir);
+    });
+
+    // copy user-specified static files to outdir
+    var staticFilePaths;
+    var staticFileFilter;
+    var staticFileScanner;
+    if (conf['default'].staticFiles) {
+        staticFilePaths = conf['default'].staticFiles.paths || [];
+        staticFileFilter = new (require('jsdoc/src/filter')).Filter(conf['default'].staticFiles);
+        staticFileScanner = new (require('jsdoc/src/scanner')).Scanner();
+
+        staticFilePaths.forEach(function(filePath) {
+            var extraStaticFiles = staticFileScanner.scan([filePath], 10, staticFileFilter);
+
+            extraStaticFiles.forEach(function(fileName) {
+                var sourcePath = fs.statSync(filePath).isDirectory() ? filePath :
+                    path.dirname(filePath);
+                var toDir = fs.toDir( fileName.replace(sourcePath, outdir) );
+                fs.mkPath(toDir);
+                fs.copyFileSync(fileName, toDir);
+            });
+        });
+    }
+    
+    if (sourceFilePaths.length) {
+        sourceFiles = shortenPaths( sourceFiles, path.commonPrefix(sourceFilePaths) );
+    }
+    data().each(function(doclet) {
+        var url = helper.createLink(doclet);
+        helper.registerLink(doclet.longname, url);
+
+        // replace the filename with a shortened version of the full path
+        var docletPath;
+        if (doclet.meta) {
+            docletPath = getPathFromDoclet(doclet);
+            docletPath = sourceFiles[docletPath].shortened;
+            if (docletPath) {
+                doclet.meta.filename = docletPath;
+            }
+        }
+    });
+    
+    data().each(function(doclet) {
+        var url = helper.longnameToUrl[doclet.longname];
+
+        if (url.indexOf('#') > -1) {
+            doclet.id = helper.longnameToUrl[doclet.longname].split(/#/).pop();
+        }
+        else {
+            doclet.id = doclet.name;
+        }
+        
+        if ( needsSignature(doclet) ) {
+            addSignatureParams(doclet);
+            addSignatureReturns(doclet);
+        }
+    });
+    
+    // do this after the urls have all been generated
+    data().each(function(doclet) {
+        doclet.ancestors = getAncestorLinks(doclet);
+
+        if (doclet.kind === 'member') {
+            addSignatureTypes(doclet);
+        }
+        
+        if (doclet.kind === 'constant') {
+            addSignatureTypes(doclet);
+            doclet.kind = 'member';
+        }
+    });
+    
+    var members = helper.getMembers(data);
+    members.tutorials = tutorials.children;
+
+    // add template helpers
+    view.find = find;
+    view.linkto = linkto;
+    view.resolveAuthorLinks = resolveAuthorLinks;
+    view.tutoriallink = tutoriallink;
+    view.htmlsafe = htmlsafe;
+    view.members = members; //@davidshimjs: To make navigation for customizing
+
+    // once for all
+    view.nav = buildNav(members);
+    attachModuleSymbols( find({ kind: ['class', 'function'], longname: {left: 'module:'} }),
+        members.modules );
+
+    // only output pretty-printed source files if requested; do this before generating any other
+    // pages, so the other pages can link to the source files
+    if (conf['default'].outputSourceFiles) {
+        generateSourceFiles(sourceFiles);
+    }
+
+    if (members.globals.length) { generate('Global', [{kind: 'globalobj'}], globalUrl); }
+    
+    // index page displays information from package.json and lists files
+    var files = find({kind: 'file'}),
+        packages = find({kind: 'package'});
+
+    generate('Index',
+        packages.concat(
+            [{kind: 'mainpage', readme: opts.readme, longname: (opts.mainpagetitle) ? opts.mainpagetitle : 'Main Page'}]
+        ).concat(files),
+    indexUrl);
+
+    // set up the lists that we'll use to generate pages
+    var classes = taffy(members.classes);
+    var modules = taffy(members.modules);
+    var namespaces = taffy(members.namespaces);
+    var mixins = taffy(members.mixins);
+    var externals = taffy(members.externals);
+    
+    for (var longname in helper.longnameToUrl) {
+        if ( hasOwnProp.call(helper.longnameToUrl, longname) ) {
+            var myClasses = helper.find(classes, {longname: longname});
+            if (myClasses.length) {
+                generate('Class: ' + myClasses[0].name, myClasses, helper.longnameToUrl[longname]);
+            }
+            
+            var myModules = helper.find(modules, {longname: longname});
+            if (myModules.length) {
+                generate('Module: ' + myModules[0].name, myModules, helper.longnameToUrl[longname]);
+            }
+
+            var myNamespaces = helper.find(namespaces, {longname: longname});
+            if (myNamespaces.length) {
+                generate('Namespace: ' + myNamespaces[0].name, myNamespaces, helper.longnameToUrl[longname]);
+            }
+            
+            var myMixins = helper.find(mixins, {longname: longname});
+            if (myMixins.length) {
+                generate('Mixin: ' + myMixins[0].name, myMixins, helper.longnameToUrl[longname]);
+            }
+
+            var myExternals = helper.find(externals, {longname: longname});
+            if (myExternals.length) {
+                generate('External: ' + myExternals[0].name, myExternals, helper.longnameToUrl[longname]);
+            }
+        }
+    }
+
+    // TODO: move the tutorial functions to templateHelper.js
+    function generateTutorial(title, tutorial, filename) {
+        var tutorialData = {
+            title: title,
+            header: tutorial.title,
+            content: tutorial.parse(),
+            children: tutorial.children
+        };
+        
+        var tutorialPath = path.join(outdir, filename),
+            html = view.render('tutorial.tmpl', tutorialData);
+        
+        // yes, you can use {@link} in tutorials too!
+        html = helper.resolveLinks(html); // turn {@link foo} into <a href="foodoc.html">foo</a>
+        
+        fs.writeFileSync(tutorialPath, html, 'utf8');
+    }
+    
+    // tutorials can have only one parent so there is no risk for loops
+    function saveChildren(node) {
+        node.children.forEach(function(child) {
+            generateTutorial('Tutorial: ' + child.title, child, helper.tutorialToUrl(child.name));
+            saveChildren(child);
+        });
+    }
+    saveChildren(tutorials);
+};
diff --git a/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.eot b/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000..423bd5d
Binary files /dev/null and b/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.eot differ
diff --git a/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.svg b/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000..4469488
--- /dev/null
+++ b/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,229 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph />
+<glyph />
+<glyph unicode="&#xd;" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
+<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#x2000;" horiz-adv-x="652" />
+<glyph unicode="&#x2001;" horiz-adv-x="1304" />
+<glyph unicode="&#x2002;" horiz-adv-x="652" />
+<glyph unicode="&#x2003;" horiz-adv-x="1304" />
+<glyph unicode="&#x2004;" horiz-adv-x="434" />
+<glyph unicode="&#x2005;" horiz-adv-x="326" />
+<glyph unicode="&#x2006;" horiz-adv-x="217" />
+<glyph unicode="&#x2007;" horiz-adv-x="217" />
+<glyph unicode="&#x2008;" horiz-adv-x="163" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="326" />
+<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
+<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
+<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
+<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
+<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
+<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
+<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
+<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
+<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
+<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
+<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
+<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
+<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
+<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5 [...]
+<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t1 [...]
+<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t1 [...]
+<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
+<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
+<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
+<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
+<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
+<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
+<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6 [...]
+<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
+<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
+<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
+<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
+<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
+<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
+<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
+<glyph unicode="&#xe028;" d="M0 25v475l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
+<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
+<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
+<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
+<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
+<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
+<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
+<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
+<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
+<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
+<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
+<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h [...]
+<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
+<glyph unicode="&#xe041;" d="M1 700v475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
+<glyph unicode="&#xe042;" d="M2 700v475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
+<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
+<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
+<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
+<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
+<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
+<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v70h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
+<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
+<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
+<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
+<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-3 [...]
+<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35. [...]
+<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q [...]
+<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 - [...]
+<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14. [...]
+<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t3 [...]
+<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14. [...]
+<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
+<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
+<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
+<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
+<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
+<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
+<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l566 567l-136 137l-430 -431l-147 147z" />
+<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
+<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
+<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
+<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
+<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />
+<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />
+<glyph unicode="&#xe078;" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
+<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
+<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
+<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
+<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM300 500h600v200h-600v-200z" />
+<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141z" />
+<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
+<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM363 700h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26 q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-105 0 -172 -56t-67 -183zM500 300h200v100h-2 [...]
+<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -300t-217.5 -218t-299.5 -80t-299.5 80t-217.5 218t-80 300zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
+<glyph unicode="&#xe087;" d="M0 500v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200 v-206q149 48 201 206h-201v200h200q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210z" />
+<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
+<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
+<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
+<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
+<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
+<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
+<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
+<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
+<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
+<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
+<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
+<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100z M100 0h400v400h-400v-400zM200 900q-3 0 14 48t35 96l18 47l214 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
+<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28 [...]
+<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60  [...]
+<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t [...]
+<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -1 [...]
+<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
+<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64 q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
+<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100z [...]
+<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
+<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />
+<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
+<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
+<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
+<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
+<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
+<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
+<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
+<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
+<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
+<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
+<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM99 500v250v5q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351z M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37 t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
+<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
+<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 212l100 213h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
+<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
+<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
+<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM999 201v600h200v-600h-200z" />
+<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
+<glyph unicode="&#xe130;" d="M1 585q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM76 565l237 339h503l89 -100v-294l-340 -130 q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
+<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 500h300l-2 -194l402 294l-402 298v-197h-298v-201z" />
+<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l400 -294v194h302v201h-300v197z" />
+<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
+<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
+<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -34 5.5 -93t7.5 -87q0 -9 17 -44t16 -60q12 0 23 -5.5 t23 -15t20 -13.5q20 -10 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55.5t-20 -57.5q12 -21 22.5 -34.5t28 -27t36.5 -17.5q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q101 -2 221 111q31 30 47 48t34 49t21 62q-14 9 -37.5 [...]
+<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800  [...]
+<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
+<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
+<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
+<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM513 609q0 32 21 56.5t52 29.5l122 126l1 1q-9 14 -9 2 [...]
+<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36 q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -24 [...]
+<glyph unicode="&#xe143;" d="M79 784q0 131 99 229.5t230 98.5q144 0 242 -129q103 129 245 129q130 0 227 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100l-84.5 84.5t-68 74t-60 78t-33.5 70.5t-15 78z M250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-106 48.5q-73 0 -131 -83l-118 -171l-114 174q-51 80 -124 80q-59 0 -108.5 -49.5t-49 [...]
+<glyph unicode="&#xe144;" d="M57 353q0 -94 66 -160l141 -141q66 -66 159 -66q95 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141l19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
+<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
+<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
+<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5v-307l64 -14 q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 [...]
+<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5 t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -2 [...]
+<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
+<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
+<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
+<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
+<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
+<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
+<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
+<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
+<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
+<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
+<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
+<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
+<glyph unicode="&#xe162;" d="M216 519q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40z" />
+<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
+<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
+<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
+<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 401h700v699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l248 -237v700h-699zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
+<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
+<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
+<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
+<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359z" />
+<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
+<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
+<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118q17 17 20 41.5 t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
+<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t- [...]
+<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
+<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
+<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
+<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
+<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
+<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
+<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
+<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
+<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300 h200l-300 -300z" />
+<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
+<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
+<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.ttf b/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000..a498ef4
Binary files /dev/null and b/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.ttf differ
diff --git a/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.woff b/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000..d83c539
Binary files /dev/null and b/config/jsdoc/api/template/static/fonts/glyphicons-halflings-regular.woff differ
diff --git a/config/jsdoc/api/template/static/scripts/bootstrap.min.js b/config/jsdoc/api/template/static/scripts/bootstrap.min.js
new file mode 100644
index 0000000..1a6258e
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).tri [...]
\ No newline at end of file
diff --git a/config/jsdoc/api/template/static/scripts/jquery.min.js b/config/jsdoc/api/template/static/scripts/jquery.min.js
new file mode 100644
index 0000000..9a85bd3
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/jquery.min.js
@@ -0,0 +1,6 @@
+/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery.min.map
+*/
+(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("D [...]
+};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(thi [...]
+},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var Xt,Ut,Yt=x.now(),Vt=/\?/,Gt=/#.*$/,Jt=/([?&])_=[^&]*/,Qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Kt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Zt=/^(?:GET|HEAD)$/,en=/^\/\//,tn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,nn=x.fn.load,rn={},on={},sn="*/".concat("*");try{Ut=i.href}catch(an){Ut=o.createElement("a"),Ut.href="",Ut=U [...]
diff --git a/config/jsdoc/api/template/static/scripts/jquery.min.map b/config/jsdoc/api/template/static/scripts/jquery.min.map
new file mode 100644
index 0000000..49baa43
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/jquery.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"jquery.min.js","sources":["jquery.js"],"names":["window","undefined","rootjQuery","readyList","core_strundefined","location","document","docElem","documentElement","_jQuery","jQuery","_$","$","class2type","core_deletedIds","core_version","core_concat","concat","core_push","push","core_slice","slice","core_indexOf","indexOf","core_toString","toString","core_hasOwn","hasOwnProperty","core_trim","trim","selector","context","fn","init","core_pnum","source","core_rnotwhit [...]
diff --git a/config/jsdoc/api/template/static/scripts/linenumber.js b/config/jsdoc/api/template/static/scripts/linenumber.js
new file mode 100644
index 0000000..a0c570d
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/linenumber.js
@@ -0,0 +1,17 @@
+(function() {
+    var counter = 0;
+    var numbered;
+    var source = document.getElementsByClassName('prettyprint source');
+
+    if (source && source[0]) {
+        source = source[0].getElementsByTagName('code')[0];
+
+        numbered = source.innerHTML.split('\n');
+        numbered = numbered.map(function(item) {
+            counter++;
+            return '<span id="line' + counter + '"></span>' + item;
+        });
+
+        source.innerHTML = numbered.join('\n');
+    }
+})();
diff --git a/config/jsdoc/api/template/static/scripts/main.js b/config/jsdoc/api/template/static/scripts/main.js
new file mode 100644
index 0000000..d57e4b9
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/main.js
@@ -0,0 +1,78 @@
+$(function () {
+    // Search Items
+    $('#search').on('keyup', function (e) {
+        var value = $(this).val();
+        var $el = $('.navigation');
+
+        if (value) {
+            var regexp = new RegExp(value, 'i');
+            $el.find('li, .itemMembers').hide();
+
+            $el.find('li').each(function (i, v) {
+                var $item = $(v);
+
+                if ($item.data('name') && regexp.test($item.data('name'))) {
+                    $item.show();
+                    $item.closest('.itemMembers').show();
+                    $item.closest('.item').show();
+                }
+            });
+        } else {
+            $el.find('.item, .itemMembers').show();
+        }
+
+        $el.find('.list').scrollTop(0);
+    });
+
+    // Toggle when click an item element
+    $('.navigation').on('click', '.title', function (e) {
+        $(this).parent().find('.itemMembers').toggle();
+    });
+
+    // Show an item related a current documentation automatically
+    var filename = $('.page-title').data('filename').replace(/\.[a-z]+$/, '');
+    var $currentItem = $('.navigation .item[data-name*="' + filename + '"]:eq(0)');
+
+    if ($currentItem.length) {
+        $currentItem
+            .remove()
+            .prependTo('.navigation .list')
+            .show()
+            .find('.itemMembers')
+                .show();
+    }
+
+    // Auto resizing on navigation
+    var _onResize = function () {
+        var height = $(window).height();
+        var $el = $('.navigation');
+
+        $el.height(height).find('.list').height(height - 133);
+    };
+
+    $(window).on('resize', _onResize);
+    _onResize();
+
+    // show/hide unstable items
+    var links = $('a[href^="ol."]');
+    var unstable = $('.unstable');
+    var stabilityToggle = $('#stability-toggle');
+    stabilityToggle.change(function() {
+        unstable.toggleClass('hidden', this.checked);
+        var search = this.checked ? '' : '?unstable=true';
+        links.each(function(i, el) {
+            this.href = this.pathname + search + this.hash;
+        });
+        if (history.replaceState) {
+            var url = window.location.pathname + search + window.location.hash;
+            history.replaceState({}, '', url);
+        }
+        return false;
+    });
+    var search = window.location.search;
+    links.each(function(i, el) {
+        this.href = this.pathname + search + this.hash;
+    });
+    stabilityToggle.prop('checked', search !== '?unstable=true');
+    unstable.toggleClass('hidden', stabilityToggle[0].checked);
+});
diff --git a/config/jsdoc/api/template/static/scripts/prettify/Apache-License-2.0.txt b/config/jsdoc/api/template/static/scripts/prettify/Apache-License-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/prettify/Apache-License-2.0.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/config/jsdoc/api/template/static/scripts/prettify/lang-css.js b/config/jsdoc/api/template/static/scripts/prettify/lang-css.js
new file mode 100644
index 0000000..041e1f5
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/prettify/lang-css.js
@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n
"]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com",
+/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]);
diff --git a/config/jsdoc/api/template/static/scripts/prettify/prettify.js b/config/jsdoc/api/template/static/scripts/prettify/prettify.js
new file mode 100644
index 0000000..eef5ad7
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/prettify/prettify.js
@@ -0,0 +1,28 @@
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\ [...]
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a) [...]
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\ [...]
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l= [...]
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+ [...]
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0 [...]
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){fo [...]
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s [...]
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com [...]
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]) [...]
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("B [...]
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f. [...]
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0] [...]
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}funct [...]
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.n [...]
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,uni [...]
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,thro [...]
+H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield [...]
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,pac [...]
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z] [...]
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+ [...]
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuote [...]
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,i [...]
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g), [...]
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.l [...]
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_ [...]
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/config/jsdoc/api/template/static/scripts/underscore-min.js b/config/jsdoc/api/template/static/scripts/underscore-min.js
new file mode 100644
index 0000000..d22f881
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/underscore-min.js
@@ -0,0 +1,6 @@
+//     Underscore.js 1.5.2
+//     http://underscorejs.org
+//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?(this._wrapped=n,void 0):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exp [...]
+//# sourceMappingURL=underscore-min.map
\ No newline at end of file
diff --git a/config/jsdoc/api/template/static/scripts/underscore-min.map b/config/jsdoc/api/template/static/scripts/underscore-min.map
new file mode 100644
index 0000000..4fbe0ba
--- /dev/null
+++ b/config/jsdoc/api/template/static/scripts/underscore-min.map
@@ -0,0 +1 @@
+{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["root","this","previousUnderscore","_","breaker","ArrayProto","Array","prototype","ObjProto","Object","FuncProto","Function","push","slice","concat","toString","hasOwnProperty","nativeForEach","forEach","nativeMap","map","nativeReduce","reduce","nativeReduceRight","reduceRight","nativeFilter","filter","nativeEvery","every","nativeSome","some","nativeIndexOf","indexOf","nativeLastIndexOf","lastIndexOf","nativeIsA [...]
\ No newline at end of file
diff --git a/config/jsdoc/api/template/static/styles/bootstrap.min.css b/config/jsdoc/api/template/static/styles/bootstrap.min.css
new file mode 100644
index 0000000..b0abcd8
--- /dev/null
+++ b/config/jsdoc/api/template/static/styles/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.0.3 (http://getbootstrap.com)
+ * Copyright 2013 Twitter, Inc.
+ * Licensed under http://www.apache.org/licenses/LICENSE-2.0
+ */
+
+/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[ti [...]
diff --git a/config/jsdoc/api/template/static/styles/jaguar.css b/config/jsdoc/api/template/static/styles/jaguar.css
new file mode 100644
index 0000000..b44fade
--- /dev/null
+++ b/config/jsdoc/api/template/static/styles/jaguar.css
@@ -0,0 +1,383 @@
+ at import url(http://fonts.googleapis.com/css?family=Quattrocento+Sans:400,400italic,700);
+.navbar-inverse .navbar-inner {
+  background: #1F6B75;
+  height: 50px;
+}
+.navbar-inverse .brand {
+  color: white;
+  font-size: 20px;
+}
+.navbar-inverse .container {
+  padding: 5px 0 5px 0;
+}
+body {
+  padding-top: 50px;
+}
+.nameContainer .name, .prettyprint.source .pln {
+  padding-top: 50px;
+  margin-top: -50px;
+}
+a {
+  position: relative;
+  z-index: 1;
+}
+.navigation li {
+  color: #888;
+}
+
+html,
+body {
+  font-family: "Quattrocento Sans", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
+  font-size: 1.0em;
+  background-color: #fff;
+}
+ul,
+ol {
+  margin: 0;
+  padding: 0;
+}
+li {
+  list-style-type: none;
+}
+#wrap {
+  position: relative;
+}
+::-webkit-scrollbar {
+  width: 8px;
+  background-color: transparent;
+}
+::-webkit-scrollbar-thumb {
+  background-color: gray;
+  border-radius: 4px;
+}
+.navigation {
+  position: fixed;
+  float: left;
+  width: 250px;
+  height: 100%;
+  background-color: #2a2a2a;
+}
+.navigation .applicationName {
+  margin: 0;
+  margin-top: 15px;
+  padding: 10px 15px;
+  font: bold 1.25em Helvetica;
+  color: #fff;
+}
+.navigation .applicationName a {
+  color: #fff;
+}
+.navigation .search {
+  padding: 10px 15px;
+}
+.navigation .search input {
+  background-color: #333;
+  color: #fff;
+  border-color: #555;
+}
+.navigation .list {
+  padding: 10px 15px 0 15px;
+  position: relative;
+  overflow: auto;
+  width: 100%;
+}
+.navigation li.item {
+  margin-bottom: 8px;
+  padding-bottom: 8px;
+  border-bottom: 1px solid #333;
+}
+.navigation li.item a {
+  color: #bbb;
+}
+.navigation li.item a:hover {
+  color: #fff;
+}
+.navigation li.item .title {
+  cursor: pointer;
+  position: relative;
+  display: block;
+  font-size: 0.85em;
+}
+.navigation li.item .title a {
+  color: #e1e1e1;
+}
+.navigation li.item .title a:hover {
+  color: #fff;
+}
+.navigation li.item .title .static {
+  display: block;
+  border-radius: 3px;
+  background-color: #1F6B75;
+  color: #FFF;
+  font-size: 0.7em;
+  padding: 2px 4px;
+  float: right;
+}
+.navigation li.item .subtitle {
+  margin-top: 10px;
+  font: bold 0.7em Helvetica;
+  color: #1F6B75;
+  display: block;
+}
+.navigation li.item ul > li {
+  font-size: 0.75em;
+  padding-left: 8px;
+  margin-top: 2px;
+}
+.navigation li.item .itemMembers {
+  display: none;
+}
+.main {
+  padding: 20px 20px;
+  margin-left: 250px;
+}
+.main .page-title {
+  display: none;
+}
+.main h1 {
+  font-weight: bold;
+  font-size: 1.6em;
+  margin: 0;
+}
+.main h2 {
+  font-weight: bold;
+  font-size: 1.5em;
+  margin: 0;
+}
+.main h3 {
+  font-weight: bold;
+  font-size: 13px;
+  margin: 5px 0;
+}
+.main h4 {
+  font-weight: bold;
+  font-size: 1em;
+}
+.main h5 {
+  font-weight: bold;
+  font-size: 13px;
+}
+.main dd, .main .props {
+  font-size: 13px;
+}
+.main h4.name span.type {
+  margin-left: 10px;
+}
+.main h4.name span.glyphicon {
+  display: inline-block;
+  vertical-align: middle;
+  color: #c1c1c1;
+  margin-left: 7px;
+}
+.main h4.name span.returnType, .main h4.name span.type {
+  margin-left: 3px;
+  background-color: transparent!important;
+  color: gray!important;
+}
+.main span.static, .main span.stability {
+  display: inline-block;
+  border-radius: 3px;
+  background-color: #1F6B75 !important;
+  color: #fff;
+  vertical-align: top;
+  font-size: 0.8em;
+  padding: 2px 4px;
+}
+td.description span.stability {
+  float: left;
+  margin-right: 0.5em;
+}
+span.type-signature.static {
+  margin-right: 3px;
+}
+.main .subsection-title {
+  font-size: 15px;
+  margin-top: 30px;
+  color: #1F6B75;
+}
+.main .description {
+  margin-top: 10px;
+  font-size: 14px;
+}
+.main .description p {
+  font-size: 14px;
+}
+.main .tag-source {
+  font-size: 13px;
+}
+.main dt.tag-source {
+  margin-top: 5px;
+}
+.main dt.tag-todo {
+  font-size: 11px;
+  display: inline-block;
+  background-color: #2a6496;
+  color: #fff;
+  padding: 2px 4px;
+  border-radius: 5px;
+}
+.main .type-signature {
+  font-size: 13px;
+}
+.main .tag-deprecated {
+  display: inline-block;
+  font-size: 11px;
+}
+.main .important {
+  background-color: #ee7d7d;
+  color: #fff;
+  padding: 2px 4px;
+  border-radius: 5px;
+}
+.main .nameContainer {
+  position: relative;
+  margin-top: 20px;
+  padding-top: 5px;
+  border-top: 1px solid #e1e1e1;
+}
+.main .nameContainer .inherited {
+  display: inline-block;
+  border-radius: 3px;
+  background-color: #888!important;
+  vertical-align: top;
+  font-size: 0.8em;
+  padding: 2px 4px;
+  margin-right: 5px;
+}
+.main .nameContainer .inherited a {
+  color: #fff;
+}
+.main .nameContainer .tag-source {
+  position: absolute;
+  top: 17px;
+  right: 0;
+  font-size: 11px;
+}
+.main .nameContainer .tag-source a {
+  color: gray;
+}
+.main .nameContainer.inherited {
+  color: gray;
+}
+.main .nameContainer h4 {
+  margin-right: 150px;
+  line-height: 1.3;
+}
+.main .nameContainer h4 .signature {
+  font-size: 14px;
+  font-weight: normal;
+  font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+.main pre {
+  font-size: 12px;
+}
+.main table {
+  width: 100%;
+  margin-bottom: 15px;
+}
+.main table th {
+  padding: 3px 3px;
+}
+.main table td {
+  vertical-align: top;
+  padding: 5px 3px;
+}
+.main table .name {
+  width: 110px;
+}
+.main table .type {
+  color: #aaa;
+  font-size: 12px;
+}
+.main table .attributes {
+  width: 80px;
+  color: #aaa;
+  font-size: 12px;
+}
+.main table .description {
+  font-size: 13px;
+}
+.main table .description p {
+  margin: 0;
+}
+.main table .optional, .main table .repeatable {
+  float: left;
+  border-radius: 3px;
+  background-color: #ddd!important;
+  font-size: 0.7em;
+  padding: 2px 4px;
+  margin-right: 5px;
+  color: gray;
+}
+.main .readme p {
+  margin-top: 15px;
+  line-height: 1.2;
+  font-size: 0.9em;
+}
+.main .readme h1 {
+  font-size: 1.7em;
+}
+.main .readme h2 {
+  margin-top: 30px;
+  margin-bottom: 10px;
+  padding-bottom: 10px;
+  border-bottom: 1px solid #e1e1e1;
+}
+.main .readme li {
+  font-size: 0.95em;
+  margin-bottom: 10px;
+}
+.main article ol,
+.main article ul {
+  margin-left: 25px;
+}
+.main article ol > li {
+  list-style-type: decimal;
+  margin-bottom: 5px;
+}
+.main article ul > li {
+  margin-bottom: 5px;
+  list-style-type: disc;
+}
+footer {
+  margin: 15px 0;
+  padding-top: 15px;
+  border-top: 1px solid #e1e1e1;
+  font-family: "freight-text-pro", Georgia, Cambria, "Times New Roman", Times, serif;
+  font-size: 0.8em;
+  color: gray;
+}
+.main span.stability.deprecated {
+  background-color: #b94a48 !important;
+  color: #f2dede;
+}
+.main span.stability.experimental {
+  background-color: #F2CC79 !important;
+  color: #800F07;
+}
+.main span.stability.unstable {
+  background-color: #3a87ad !important;
+  color: #d9edf7;
+}
+.main span.stability.locked {
+  background-color: #468847 !important;
+  color: #dff0d8;
+}
+.main .readme table p {
+  margin-top: 0;
+}
+.main .readme table p, .main .readme table td {
+  font-size: 14px;
+}
+.main .readme table ul li {
+  margin-bottom: 0;
+}
+.hidden {
+  display: none;
+}
+#stability {
+  color: white;
+  position: absolute;
+  top: 1em;
+  right: 8em;
+}
diff --git a/config/jsdoc/api/template/static/styles/prettify-jsdoc.css b/config/jsdoc/api/template/static/styles/prettify-jsdoc.css
new file mode 100644
index 0000000..5a2526e
--- /dev/null
+++ b/config/jsdoc/api/template/static/styles/prettify-jsdoc.css
@@ -0,0 +1,111 @@
+/* JSDoc prettify.js theme */
+
+/* plain text */
+.pln {
+  color: #000000;
+  font-weight: normal;
+  font-style: normal;
+}
+
+/* string content */
+.str {
+  color: #006400;
+  font-weight: normal;
+  font-style: normal;
+}
+
+/* a keyword */
+.kwd {
+  color: #000000;
+  font-weight: bold;
+  font-style: normal;
+}
+
+/* a comment */
+.com {
+  font-weight: normal;
+  font-style: italic;
+}
+
+/* a type name */
+.typ {
+  color: #000000;
+  font-weight: normal;
+  font-style: normal;
+}
+
+/* a literal value */
+.lit {
+  color: #006400;
+  font-weight: normal;
+  font-style: normal;
+}
+
+/* punctuation */
+.pun {
+  color: #000000;
+  font-weight: bold;
+  font-style: normal;
+}
+
+/* lisp open bracket */
+.opn {
+  color: #000000;
+  font-weight: bold;
+  font-style: normal;
+}
+
+/* lisp close bracket */
+.clo {
+  color: #000000;
+  font-weight: bold;
+  font-style: normal;
+}
+
+/* a markup tag name */
+.tag {
+  color: #006400;
+  font-weight: normal;
+  font-style: normal;
+}
+
+/* a markup attribute name */
+.atn {
+  color: #006400;
+  font-weight: normal;
+  font-style: normal;
+}
+
+/* a markup attribute value */
+.atv {
+  color: #006400;
+  font-weight: normal;
+  font-style: normal;
+}
+
+/* a declaration */
+.dec {
+  color: #000000;
+  font-weight: bold;
+  font-style: normal;
+}
+
+/* a variable name */
+.var {
+  color: #000000;
+  font-weight: normal;
+  font-style: normal;
+}
+
+/* a function name */
+.fun {
+  color: #000000;
+  font-weight: bold;
+  font-style: normal;
+}
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums {
+  margin-top: 0;
+  margin-bottom: 0;
+}
diff --git a/config/jsdoc/api/template/static/styles/prettify-tomorrow.css b/config/jsdoc/api/template/static/styles/prettify-tomorrow.css
new file mode 100644
index 0000000..aa2908c
--- /dev/null
+++ b/config/jsdoc/api/template/static/styles/prettify-tomorrow.css
@@ -0,0 +1,132 @@
+/* Tomorrow Theme */
+/* Original theme - https://github.com/chriskempson/tomorrow-theme */
+/* Pretty printing styles. Used with prettify.js. */
+/* SPAN elements with the classes below are added by prettyprint. */
+/* plain text */
+.pln {
+  color: #4d4d4c; }
+
+ at media screen {
+  /* string content */
+  .str {
+    color: #718c00; }
+
+  /* a keyword */
+  .kwd {
+    color: #8959a8; }
+
+  /* a comment */
+  .com {
+    color: #8e908c; }
+
+  /* a type name */
+  .typ {
+    color: #4271ae; }
+
+  /* a literal value */
+  .lit {
+    color: #f5871f; }
+
+  /* punctuation */
+  .pun {
+    color: #4d4d4c; }
+
+  /* lisp open bracket */
+  .opn {
+    color: #4d4d4c; }
+
+  /* lisp close bracket */
+  .clo {
+    color: #4d4d4c; }
+
+  /* a markup tag name */
+  .tag {
+    color: #c82829; }
+
+  /* a markup attribute name */
+  .atn {
+    color: #f5871f; }
+
+  /* a markup attribute value */
+  .atv {
+    color: #3e999f; }
+
+  /* a declaration */
+  .dec {
+    color: #f5871f; }
+
+  /* a variable name */
+  .var {
+    color: #c82829; }
+
+  /* a function name */
+  .fun {
+    color: #4271ae; } }
+/* Use higher contrast and text-weight for printable form. */
+ at media print, projection {
+  .str {
+    color: #060; }
+
+  .kwd {
+    color: #006;
+    font-weight: bold; }
+
+  .com {
+    color: #600;
+    font-style: italic; }
+
+  .typ {
+    color: #404;
+    font-weight: bold; }
+
+  .lit {
+    color: #044; }
+
+  .pun, .opn, .clo {
+    color: #440; }
+
+  .tag {
+    color: #006;
+    font-weight: bold; }
+
+  .atn {
+    color: #404; }
+
+  .atv {
+    color: #060; } }
+/* Style */
+/*
+pre.prettyprint {
+  background: white;
+  font-family: Menlo, Monaco, Consolas, monospace;
+  font-size: 12px;
+  line-height: 1.5;
+  border: 1px solid #ccc;
+  padding: 10px; }
+*/
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums {
+  margin-top: 0;
+  margin-bottom: 0; }
+
+/* IE indents via margin-left */
+li.L0,
+li.L1,
+li.L2,
+li.L3,
+li.L4,
+li.L5,
+li.L6,
+li.L7,
+li.L8,
+li.L9 {
+  /* */ }
+
+/* Alternate shading for lines */
+li.L1,
+li.L3,
+li.L5,
+li.L7,
+li.L9 {
+  /* */ }
diff --git a/config/jsdoc/api/template/tmpl/container.tmpl b/config/jsdoc/api/template/tmpl/container.tmpl
new file mode 100644
index 0000000..065f0c6
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/container.tmpl
@@ -0,0 +1,174 @@
+<?js
+    var self = this;
+    docs.forEach(function(doc, i) {
+?>
+
+<?js if (doc.kind === 'mainpage' || (doc.kind === 'package')) { ?>
+    <?js= self.partial('mainpage.tmpl', doc) ?>
+<?js } else if (doc.kind === 'source') { ?>
+    <?js= self.partial('source.tmpl', doc) ?>
+<?js } else { ?>
+
+<section>
+    
+<header>
+    <h2><?js if (doc.ancestors && doc.ancestors.length) { ?>
+        <span class="ancestors"><?js= doc.ancestors.join('') ?></span><?js } ?><?js= doc.name ?>
+    <?js if (doc.variation) { ?>
+        <sup class="variation"><?js= doc.variation ?></sup>
+    <?js } ?></h2>
+    <?js if (doc.classdesc) { ?>
+        <div class="class-description"><?js= doc.classdesc ?></div>
+    <?js } ?>
+</header>  
+
+<article>
+    <div class="container-overview">
+    <?js if (doc.kind === 'module' && doc.module) { ?>
+        <?js= self.partial('method.tmpl', doc.module) ?>
+    <?js } ?>
+    
+    <?js if (doc.kind === 'class') { ?>
+        <?js= self.partial('method.tmpl', doc) ?>
+    <?js } else { ?>
+        <?js if (doc.description) { ?>
+            <div class="description"><?js= doc.description ?></div>
+        <?js } ?>
+        
+        <?js= self.partial('details.tmpl', doc) ?>
+        
+        <?js if (doc.examples && doc.examples.length) { ?>
+            <h3>Example<?js= doc.examples.length > 1? 's':'' ?></h3>
+            <?js= self.partial('examples.tmpl', doc.examples) ?>
+        <?js } ?>
+    <?js } ?>
+    </div>
+    
+    <?js if (doc.kind == 'class') {
+      var subclasses = self.find(function() {
+        return this.augments && this.augments.indexOf(doc.longname) > -1;
+      })
+      if (subclasses.length) {
+    ?>
+        <h3 class="subsection-title">Subclasses</h3>
+        <ul><?js subclasses.forEach(function(s) { ?>
+          <li><?js= self.linkto(s.longname, s.longname) ?>
+            <?js= (s.interface ? '(Interface)' : '') ?>
+          </li>
+        <?js }); ?></ul>
+    <?js } } ?>
+
+    <?js if (doc.augments && doc.augments.length) { ?>
+        <h3 class="subsection-title">Extends</h3>
+        
+        <ul><?js doc.augments.forEach(function(a) { ?>
+            <li><?js= self.linkto(a, a) ?></li>
+        <?js }); ?></ul>
+    <?js } ?>
+    
+    <?js if (doc.mixes && doc.mixes.length) { ?>
+        <h3 class="subsection-title">Mixes In</h3>
+        
+        <ul><?js doc.mixes.forEach(function(a) { ?>
+            <li><?js= self.linkto(a, a) ?></li>
+        <?js }); ?></ul>
+    <?js } ?>
+    
+    <?js if (doc.requires && doc.requires.length) { ?>
+        <h3 class="subsection-title">Requires</h3>
+        
+        <ul><?js doc.requires.forEach(function(r) { ?>
+            <li><?js= self.linkto(r, r) ?></li>
+        <?js }); ?></ul>
+    <?js } ?>
+    
+    <?js
+        var classes = self.find({kind: 'class', memberof: doc.longname}); 
+        if (doc.kind !== 'globalobj' && classes && classes.length) { 
+    ?>
+        <h3 class="subsection-title">Classes</h3>
+        
+        <dl><?js classes.forEach(function(c) { ?>
+            <dt><?js= self.linkto(c.longname, c.name) ?></dt>
+            <dd><?js if (c.summary) { ?><?js= c.summary ?><?js } ?></dd>
+        <?js }); ?></dl>
+    <?js } ?>
+    
+    <?js
+        var namespaces = self.find({kind: 'namespace', memberof: doc.longname}); 
+        if (doc.kind !== 'globalobj' && namespaces && namespaces.length) { 
+    ?>
+        <h3 class="subsection-title">Namespaces</h3>
+        
+        <dl><?js namespaces.forEach(function(n) { ?>
+            <dt><a href="namespaces.html#<?js= n.longname ?>"><?js= self.linkto(n.longname, n.name) ?></a></dt>
+            <dd><?js if (n.summary) { ?><?js= n.summary ?><?js } ?></dd>
+        <?js }); ?></dl>
+    <?js } ?>
+    
+    <?js
+        if (doc.observables && doc.observables.length) {
+    ?>
+        <h3 class="subsection-title">Observable Properties</h3>
+        <dl><?js= self.partial('observables.tmpl', doc.observables) ?></dl>
+
+    <?js } ?>
+
+    <?js
+        var members = self.find({kind: 'member', memberof: title === 'Global' ? {isUndefined: true} : doc.longname});
+        if (members && members.length && members.forEach) { 
+    ?>
+        <h3 class="subsection-title">Members</h3>
+        
+        <dl><?js members.forEach(function(p) { ?>
+            <?js= self.partial('members.tmpl', p) ?>
+        <?js }); ?></dl>
+    <?js } ?>
+    
+    <?js
+        var methods = self.find({kind: 'function', memberof: title === 'Global' ? {isUndefined: true} : doc.longname});
+        if (methods && methods.length && methods.forEach) { 
+    ?>
+        <h3 class="subsection-title">Methods</h3>
+        
+        <dl><?js methods.forEach(function(m) { ?>
+            <?js= self.partial('method.tmpl', m) ?>
+        <?js }); ?></dl>
+    <?js } ?>
+    
+    <?js
+        var typedefs = self.find({kind: 'typedef', memberof: title === 'Global' ? {isUndefined: true} : doc.longname}); 
+        if (typedefs && typedefs.length && typedefs.forEach) { 
+    ?>
+        <h3 class="subsection-title">Type Definitions</h3>
+        
+        <dl><?js typedefs.forEach(function(e) {
+                if (e.signature) {
+            ?>
+                <?js= self.partial('method.tmpl', e) ?>
+            <?js
+                }
+                else {
+            ?>
+                <?js= self.partial('members.tmpl', e) ?>
+            <?js
+                }
+            }); ?></dl>
+    <?js } ?>
+    
+    <?js
+        var events = self.find({kind: 'event', memberof: title === 'Global' ? {isUndefined: true} : doc.longname}); 
+        if (events && events.length && events.forEach) { 
+    ?>
+        <h3 class="subsection-title">Events</h3>
+        
+        <dl><?js events.forEach(function(e) { ?>
+            <?js= self.partial('method.tmpl', e) ?>
+        <?js }); ?></dl>
+    <?js } ?>
+</article>
+
+</section>  
+<?js } ?>
+
+<?js }); ?>
diff --git a/config/jsdoc/api/template/tmpl/details.tmpl b/config/jsdoc/api/template/tmpl/details.tmpl
new file mode 100644
index 0000000..89ca65f
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/details.tmpl
@@ -0,0 +1,84 @@
+<?js
+var data = obj;
+var self = this;
+?>
+<dl class="details">
+    <?js
+        var properties = data.properties;
+        if (properties && properties.length && properties.forEach) { 
+    ?>
+        
+        <h5 class="subsection-title">Properties:</h5>
+        
+        <dl><?js= this.partial('properties.tmpl', properties) ?></dl>
+        
+    <?js } ?>
+        
+    <?js if (data.version) {?>
+    <dt class="tag-version">Version:</dt>
+    <dd class="tag-version"><ul class="dummy"><li><?js= version ?></li></ul></dd>
+    <?js } ?>
+    
+    <?js if (data.since) {?>
+    <dt class="tag-since">Since:</dt>
+    <dd class="tag-since"><ul class="dummy"><li><?js= since ?></dd>
+    <?js } ?>
+
+    <?js if (data.deprecated) { ?>
+        <dt class="important tag-deprecated">Deprecated</dt><?js
+            if (data.deprecated === true) { ?><dd class="yes-def tag-deprecated"><ul class="dummy"><li>Yes</li></ul></dd><?js }
+            else { ?><dd><ul class="dummy"><li><?js= data.deprecated ?></li><ul></dd><?js }
+        ?>
+    <?js } ?>
+    
+    <?js if (data.author && author.length) {?>
+    <dt class="tag-author">Author:</dt>
+    <dd class="tag-author">
+        <ul><?js author.forEach(function(a) { ?>
+            <li><?js= self.resolveAuthorLinks(a) ?></li>
+        <?js }); ?></ul>
+    </dd>
+    <?js } ?>
+    
+    <?js if (data.copyright) {?>
+    <dt class="tag-copyright">Copyright:</dt>
+    <dd class="tag-copyright"><ul class="dummy"><li><?js= copyright ?></li></ul></dd>
+    <?js } ?>
+    
+    <?js if (data.license) {?>
+    <dt class="tag-license">License:</dt>
+    <dd class="tag-license"><ul class="dummy"><li><?js= license ?></li></ul></dd>
+    <?js } ?>
+    
+    <?js if (data.defaultvalue) {?>
+    <dt class="tag-default">Default Value:</dt>
+    <dd class="tag-default"><ul class="dummy"><li><?js= data.defaultvalue ?></li></ul></dd>
+    <?js } ?>
+    
+    <?js if (data.tutorials && tutorials.length) {?>
+    <dt class="tag-tutorial">Tutorials:</dt>
+    <dd class="tag-tutorial">
+        <ul><?js tutorials.forEach(function(t) { ?>
+            <li><?js= self.tutoriallink(t) ?></li>
+        <?js }); ?></ul>
+    </dd>
+    <?js } ?>
+    
+    <?js if (data.see && see.length) {?>
+    <dt class="tag-see">See:</dt>
+    <dd class="tag-see">
+        <ul><?js see.forEach(function(s) { ?>
+            <li><?js= self.linkto(s) ?></li>
+        <?js }); ?></ul>
+    </dd>
+    <?js } ?>
+    
+    <?js if (data.todo && todo.length) {?>
+    <dt class="tag-todo">TODO</dt>
+    <dd class="tag-todo">
+        <ul><?js todo.forEach(function(t) { ?>
+            <li><?js= t ?></li>
+        <?js }); ?></ul>
+    </dd>
+    <?js } ?>
+</dl>
diff --git a/config/jsdoc/api/template/tmpl/example.tmpl b/config/jsdoc/api/template/tmpl/example.tmpl
new file mode 100644
index 0000000..706350c
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/example.tmpl
@@ -0,0 +1,2 @@
+<?js var data = obj; ?>
+<pre class="prettyprint"><code><?js= data ?></code></pre>
diff --git a/config/jsdoc/api/template/tmpl/examples.tmpl b/config/jsdoc/api/template/tmpl/examples.tmpl
new file mode 100644
index 0000000..950c320
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/examples.tmpl
@@ -0,0 +1,16 @@
+<?js
+	var data = obj;
+    data.forEach(function(example) {
+        if (example.caption) {
+    ?>
+        <p class="code-caption"><?js= example.caption ?></p>
+    <?js } ?>
+
+    <?js if (example.code.toString().indexOf('<pre>') === -1) { ?>
+    <pre class="prettyprint"><code><?js= example.code ?></code></pre>
+    <?js } else { ?>
+    <?js= example.code.replace(/<pre>/g, '<pre class="prettyprint">') ?>
+    <?js } ?>
+<?js
+    });
+?>
\ No newline at end of file
diff --git a/config/jsdoc/api/template/tmpl/exceptions.tmpl b/config/jsdoc/api/template/tmpl/exceptions.tmpl
new file mode 100644
index 0000000..78c4e25
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/exceptions.tmpl
@@ -0,0 +1,30 @@
+<?js
+    var data = obj;
+?>
+<?js if (data.description && data.type && data.type.names) { ?>
+<dl>
+    <dt>
+        <div class="param-desc">
+        <?js= data.description ?>
+        </div>
+    </dt>
+    <dt>
+        <dl>
+            <dt>
+                Type
+            </dt>
+            <dd>
+                <?js= this.partial('type.tmpl', data.type.names) ?>
+            </dd>
+        </dl>
+    </dt>
+</dl>
+<?js } else { ?>
+    <div class="param-desc">
+    <?js if (data.description) { ?>
+        <?js= data.description ?>
+    <?js } else if (data.type && data.type.names) { ?>
+        <?js= this.partial('type.tmpl', data.type.names) ?>
+    <?js } ?>
+    </div>
+<?js } ?>
diff --git a/config/jsdoc/api/template/tmpl/layout.tmpl b/config/jsdoc/api/template/tmpl/layout.tmpl
new file mode 100644
index 0000000..5e1789e
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/layout.tmpl
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <title>OpenLayers 3 API Documentation - <?js= title ?></title>
+    <script src="scripts/prettify/prettify.js"> </script>
+    <script src="scripts/prettify/lang-css.js"> </script>
+    <script src="scripts/jquery.min.js"> </script>
+    <!--[if lt IE 9]>
+      <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+    <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
+    <link type="text/css" rel="stylesheet" href="styles/bootstrap.min.css">
+    <link type="text/css" rel="stylesheet" href="styles/jaguar.css">
+</head>
+<body>
+
+<div class="navbar navbar-inverse navbar-fixed-top">
+  <div class="navbar-inner">
+    <div class="container">
+      <a class="brand" href="/"><img src="../resources/logo.png" width="40"> OpenLayers 3</a>
+      <a class="brand" href="index.html">API Documentation</a>
+      <label id="stability">
+        <input type="checkbox" id="stability-toggle" checked> Stable Only
+      </label>
+    </div>
+  </div>
+</div>
+
+<div id="wrap" class="clearfix">
+    <?js= this.partial('navigation.tmpl', this) ?>
+    <div class="main">
+        <h1 class="page-title" data-filename="<?js= filename ?>"><?js= title ?></h1>
+        <?js= content ?>
+
+        <footer>
+            Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc <?js= env.version.number ?></a> on <?js= (new Date()) ?>
+        </footer>
+    </div>
+</div>
+<script>prettyPrint();</script>
+<script src="scripts/linenumber.js"></script>
+<script src="scripts/main.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/config/jsdoc/api/template/tmpl/mainpage.tmpl b/config/jsdoc/api/template/tmpl/mainpage.tmpl
new file mode 100644
index 0000000..41abaa1
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/mainpage.tmpl
@@ -0,0 +1,14 @@
+<?js
+var data = obj;
+var self = this;
+?>
+
+<?js if (data.kind === 'package') { ?>
+    <h3><?js= data.name ?> <?js= data.version ?></h3>
+<?js } ?>
+
+<?js if (data.readme) { ?>
+    <section>
+        <article class="readme"><?js= data.readme ?></article>
+    </section>
+<?js } ?>
\ No newline at end of file
diff --git a/config/jsdoc/api/template/tmpl/members.tmpl b/config/jsdoc/api/template/tmpl/members.tmpl
new file mode 100644
index 0000000..6d8e545
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/members.tmpl
@@ -0,0 +1,36 @@
+<?js
+var data = obj;
+var self = this;
+var typeSignature = '';
+
+if (data.type && data.type.names) {
+    data.type.names.forEach(function (name) {
+        typeSignature += '<span class="type-signature type ' + name.toLowerCase() + '">{' + self.linkto(name, self.htmlsafe(name)) + '}</span> ';
+    });
+}
+?>
+<dt class="<?js= (data.stability && data.stability !== 'stable') ? 'unstable' : '' ?>">
+    <div class="nameContainer">
+        <h4 class="name" id="<?js= id ?>">
+            <?js= data.attribs + (data.scope === 'static' ? longname : name)  + typeSignature ?>
+            <?js= this.partial('stability.tmpl', data) ?>
+        </h4>
+    </div>
+    <?js if (data.summary) { ?>
+    <p class="summary"><?js= summary ?></p>
+    <?js } ?>
+</dt>
+<dd class="<?js= (data.stability && data.stability !== 'stable') ? 'unstable' : '' ?>">
+    <?js if (data.description) { ?>
+    <div class="description">
+        <?js= data.description ?>
+    </div>
+    <?js } ?>
+    
+    <?js= this.partial('details.tmpl', data) ?>
+    
+    <?js if (data.examples && examples.length) { ?>
+        <h5>Example<?js= examples.length > 1? 's':'' ?></h5>
+        <?js= this.partial('examples.tmpl', examples) ?>
+    <?js } ?>
+</dd>
diff --git a/config/jsdoc/api/template/tmpl/method.tmpl b/config/jsdoc/api/template/tmpl/method.tmpl
new file mode 100644
index 0000000..6f5d4c6
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/method.tmpl
@@ -0,0 +1,121 @@
+<?js
+var data = obj;
+var self = this;
+?>
+<dt class="<?js= (data.stability && data.stability !== 'stable') ? 'unstable' : '' ?>">
+    <div class="nameContainer<?js if (data.inherited) { ?> inherited<?js } ?>">
+        <?js if (data.stability || kind !== 'class') { ?>
+        <h4 class="name" id="<?js= id ?>">
+            <?js= data.attribs + (kind === 'class' ? 'new ' : '') + (data.scope === 'static' ? longname : name) + (kind !== 'event' ? data.signature : '') ?>
+            <?js if (data.inherited || data.inherits) { ?>
+                <span class="inherited"><?js= this.linkto(data.inherits, 'inherited') ?></span>
+            <?js } ?>
+            <?js= this.partial('stability.tmpl', data) ?>
+        </h4>
+        <?js if (data.meta) {?>
+        <div class="tag-source">
+            <?js= self.linkto(meta.filename) ?>, <?js= self.linkto(meta.filename, 'line ' + meta.lineno, null, 'line' + meta.lineno) ?>
+        </div>
+        <?js } ?>
+        <?js } ?>
+    </div>
+    <?js if (data.summary) { ?>
+    <p class="summary"><?js= summary ?></p>
+    <?js } ?>
+</dt>
+<dd class="<?js= (data.stability && data.stability !== 'stable') ? 'unstable' : '' ?>">
+    
+    <?js if (data.description) { ?>
+    <div class="description">
+        <?js= data.description ?>
+    </div>
+    <?js } ?>
+
+    <?js if (kind === 'event' && data.type && data.type.names) {?>
+        <h5>Type:</h5>
+        <ul>
+            <li>
+                <?js= self.partial('type.tmpl', data.type.names) ?>
+            </li>
+        </ul>
+    <?js } ?>
+    
+    <?js if (data['this']) { ?>
+        <h5>This:</h5>
+        <ul><li><?js= this.linkto(data['this'], data['this']) ?></li></ul>
+    <?js } ?>
+    
+    <?js if (data.stability || kind !== 'class') { ?>
+    <?js if (data.params && params.length) { ?>
+        <?js= this.partial('params.tmpl', params) ?>
+    <?js } ?>
+    <?js } ?>
+    
+    <?js= this.partial('details.tmpl', data) ?>
+    
+    <?js if (data.fires && fires.length) { ?>
+    <h5>Fires:</h5>
+    <ul><?js fires.forEach(function(f) {
+            var parts = f.split(/#?event:/);
+            var type = parts.pop();
+            var eventClassName = parts[0];
+            parts = type.split(' ');
+            type = parts.shift();
+            var description = parts.length ? parts.join(' ') : '';
+            var eventDoclet = self.find({longname: f})[0];
+            if (eventDoclet && !description && eventDoclet.description) {
+              description = eventDoclet.description.replace(/<[^>]*>/g, '');
+            }
+        ?>
+        <li class="<?js= (eventDoclet || data).stability !== 'stable' ? 'unstable' : '' ?>">
+            <code><?js= self.linkto(f, type) ?></code>
+            <?js if (eventClassName) {
+              var eventClass = self.find({longname: eventClassName})[0];
+              if (eventClass) { ?>
+                (<?js= self.linkto(eventClass.longname) ?>)
+              <?js } ?>
+            <?js } ?>
+            <?js= self.partial('stability.tmpl', eventDoclet || (data.stability ? data : {stability: 'experimental'})) ?>
+            <?js if (description) { ?> -
+            <?js= description ?>
+            <?js } ?>
+        </li>
+    <?js }); ?></ul>
+    <?js } ?>
+
+    <?js if (data.listens && listens.length) { ?>
+    <h5>Listens to Events:</h5>
+    <ul><?js listens.forEach(function(f) { ?>
+        <li><?js= self.linkto(f) ?></li>
+    <?js }); ?></ul>
+    <?js } ?>
+
+    <?js if (data.listeners && listeners.length) { ?>
+    <h5>Listeners of This Event:</h5>
+    <ul><?js listeners.forEach(function(f) { ?>
+        <li><?js= self.linkto(f) ?></li>
+    <?js }); ?></ul>
+    <?js } ?>
+    
+    <?js if (data.exceptions && exceptions.length) { ?>
+    <h5>Throws:</h5>
+    <?js if (exceptions.length > 1) { ?><ul><?js
+        exceptions.forEach(function(r) { ?>
+            <li><?js= self.partial('exceptions.tmpl', r) ?></li>
+        <?js });
+    ?></ul><?js } else {
+        exceptions.forEach(function(r) { ?>
+            <?js= self.partial('exceptions.tmpl', r) ?>
+        <?js });
+    } } ?>
+    
+    <?js if (data.returns && returns.length) { ?>
+    <?js if (returns.length > 1) { ?><h5>Returns:</h5><?js } ?>
+    <?js= self.partial('returns.tmpl', data.returns) ?>
+    <?js } ?>
+    
+    <?js if (data.examples && examples.length) { ?>
+        <h5>Example<?js= examples.length > 1? 's':'' ?></h5>
+        <?js= this.partial('examples.tmpl', examples) ?>
+    <?js } ?>
+</dd>
diff --git a/config/jsdoc/api/template/tmpl/navigation.tmpl b/config/jsdoc/api/template/tmpl/navigation.tmpl
new file mode 100644
index 0000000..7a41bfe
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/navigation.tmpl
@@ -0,0 +1,87 @@
+<?js
+var self = this;
+?>
+<div class="navigation">
+    <div class="search">
+        <input id="search" type="text" class="form-control input-sm" placeholder="Search Documentation">
+    </div>
+    <ul class="list">
+    <?js
+    this.nav.forEach(function (item) {
+    ?>
+        <li class="item" data-name="<?js= item.longname ?>">
+            <span class="title">
+                <?js= self.linkto(item.longname, item.longname) ?>
+                <?js if (item.type === 'namespace' &&
+                        (item.members.length + item.typedefs.length + item.methods.length +
+                         item.events.length > 0)) { ?>
+                <?js } ?>
+            </span>
+            <ul class="members itemMembers">
+            <?js
+            if (item.members.length) {
+            ?>
+            <span class="subtitle">Members</span>
+            <?js
+                item.members.forEach(function (v) {
+            ?>
+                <li data-name="<?js= v.longname ?>"><?js= self.linkto(v.longname, v.name) ?></li>
+            <?js
+                });
+            }
+            ?>
+            </ul>
+            <ul class="typedefs itemMembers">
+            <?js
+            if (item.typedefs.length) {
+            ?>
+            <span class="subtitle">Typedefs</span>
+            <?js
+                item.typedefs.forEach(function (v) {
+            ?>
+                <li data-name="<?js= v.longname ?>" class="<?js= v.stability !== 'stable' ? 'unstable' : ''?>">
+                    <?js= self.linkto(v.longname, v.name) ?>
+                </li>
+            <?js
+                });
+            }
+            ?>
+            </ul>
+            <ul class="methods itemMembers">
+            <?js
+            if (item.methods.length) {
+            ?>
+            <span class="subtitle">Methods</span>
+            <?js
+
+                item.methods.forEach(function (v) {
+            ?>
+                <li data-name="<?js= v.longname ?>" class="<?js= v.stability !== 'stable' ? 'unstable' : ''?>">
+                    <?js= self.linkto(v.longname, v.name) ?>
+                </li>
+            <?js
+                });
+            }
+            ?>
+            </ul>
+            <ul class="fires itemMembers">
+            <?js
+            if (item.fires && item.fires.length) {
+            ?>
+            <span class="subtitle">Fires</span>
+            <?js
+                item.fires.forEach(function (v) {
+                    v = self.find({longname: v})[0] || {longname: v, name: v.split(/#?event:/)[1]};
+            ?>
+                <li data-name="<?js= v.longname ?>" class="<?js= (v.stability != 'stable' ? 'unstable' : '') ?>">
+                    <?js= self.linkto(v.longname, v.name) ?>
+                </li>
+            <?js
+                });
+            }
+            ?>
+            </ul>
+        </li>
+    <?js }); ?>
+    </ul>
+</div>
\ No newline at end of file
diff --git a/config/jsdoc/api/template/tmpl/observables.tmpl b/config/jsdoc/api/template/tmpl/observables.tmpl
new file mode 100644
index 0000000..4ee19b8
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/observables.tmpl
@@ -0,0 +1,37 @@
+<?js
+    var props = obj;
+?>
+
+<table class="props">
+    <thead>
+  <tr>
+    <th>Name</th>
+    <th>Type</th>
+    <th>Settable</th>
+    <th><a href="ol.ObjectEvent.html">ol.ObjectEvent</a> type</th>
+    <th class="last">Description</th>
+  </tr>
+  </thead>
+
+  <tbody>
+  <?js
+      var self = this;
+      props.forEach(function(prop) {
+        if (!prop) { return; }
+        var setter = prop.readonly ? 'no' : 'yes';
+  ?>
+
+    <tr class="<?js= prop.stability !== 'stable' ? 'unstable' : '' ?>">
+      <td class="name"><code><?js= prop.name ?></code></td>
+      <td class="type">
+      <?js if (prop.type && prop.type.names) {?>
+      <?js= self.partial('type.tmpl', prop.type.names) ?>
+      <?js } ?>
+      </td>
+      <td class="setter"><?js= setter ?></td>
+      <td class="event"><code>change:<?js= prop.name.toLowerCase() ?></code></td>
+      <td class="description last"><?js= prop.description ?></td>
+    </tr>
+    <?js }); ?>
+  </tbody>
+</table>
diff --git a/config/jsdoc/api/template/tmpl/params.tmpl b/config/jsdoc/api/template/tmpl/params.tmpl
new file mode 100644
index 0000000..8b6fb22
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/params.tmpl
@@ -0,0 +1,106 @@
+<?js
+    var params = obj;
+    
+    /* sort subparams under their parent params (like opts.classname) */
+    var parentParam = null;
+    params.forEach(function(param, i) {
+        if (!param) { return; }
+        if ( parentParam && param.name && param.name.indexOf(parentParam.name + '.') === 0 ) {
+            param.name = param.name.substr(parentParam.name.length+1);
+            parentParam.subparams = parentParam.subparams || [];
+            parentParam.subparams.push(param);
+            params[i] = null;
+        }
+        else {
+            parentParam = param;
+        }
+    });
+    
+    /* determine if we need extra columns, "attributes" and "default" */
+    params.hasAttributes = false;
+    params.hasDefault = false;
+    params.hasName = false;
+    
+    var colspan = 2;
+    params.forEach(function(param) {
+        if (!param) { return; }
+        if (param.type && param.type.names && param.type.names.indexOf('undefined') !== -1) {
+            param.optional = true;
+        }
+        if (param.name.indexOf('var_') == 0) {
+            params.hasAttributes = true;
+            param.variable = true;
+        }
+        
+        if (param.optional || param.nullable) {
+            params.hasAttributes = true;
+        }
+        
+        if (param.name) {
+            params.hasName = true;
+        }
+        
+        if (typeof param.defaultvalue !== 'undefined') {
+            ++colspan;
+            params.hasDefault = true;
+        }
+    });
+?>
+
+<table class="params">
+    <thead>
+	<tr>
+		<?js if (params.hasName) {?>
+		<th>Name</th>
+		<?js } ?>
+		
+		<th>Type</th>
+		
+		<?js if (params.hasDefault) {?>
+		<th>Default</th>
+		<?js } ?>
+		
+		<th class="last">Description</th>
+	</tr>
+	</thead>
+	
+	<tbody>
+	<?js
+        var self = this;
+	    params.forEach(function(param) {
+	        if (!param) { return; }
+	?>
+	
+        <tr class="<?js= (param.stability && param.stability !== 'stable') ? 'unstable' : '' ?>">
+            <?js if (params.hasName) {?>
+                <td class="name"><code><?js= param.name.replace(/^opt_/, "") ?></code></td>
+            <?js } ?>
+            
+            <?js if (!param.subparams) {?>
+            <td class="type">
+            <?js if (param.type && param.type.names) {?>
+                <?js= self.partial('type.tmpl', param.type.names) ?>
+            <?js } ?>
+            </td>
+            
+            <?js if (params.hasDefault) {?>
+                <td class="default">
+                <?js if (typeof param.defaultvalue !== 'undefined') { ?>
+                    <?js= self.htmlsafe(param.defaultvalue) ?>
+                <?js } ?>
+                </td>
+            <?js } ?>
+            <?js } ?>
+            
+            <td<?js= (param.subparams ? ' colspan=' + colspan : ' ') ?> class="description last">
+                <?js if (param.stability) { ?>
+                    <?js= self.partial('stability.tmpl', param) ?>
+                <?js } ?>
+                <?js= param.description ?><?js if (param.subparams) { ?>
+                <?js= self.partial('params.tmpl', param.subparams) ?>
+            <?js } ?></td>
+        </tr>
+	
+	<?js }); ?>
+	</tbody>
+</table>
\ No newline at end of file
diff --git a/config/jsdoc/api/template/tmpl/properties.tmpl b/config/jsdoc/api/template/tmpl/properties.tmpl
new file mode 100644
index 0000000..97a3d23
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/properties.tmpl
@@ -0,0 +1,107 @@
+<?js
+    var props = obj;
+    
+    /* sort subprops under their parent props (like opts.classname) */
+    var parentProp = null;
+    props.forEach(function(prop, i) {
+        if (!prop) { return; }
+        if ( parentProp && prop.name && prop.name.indexOf(parentProp.name + '.') === 0 ) {
+            prop.name = prop.name.substr(parentProp.name.length+1);
+            parentProp.subprops = parentProp.subprops || [];
+            parentProp.subprops.push(prop);
+            props[i] = null;
+        }
+        else {
+            parentProp = prop;
+        }
+    });
+    
+    /* determine if we need extra columns, "attributes" and "default" */
+    props.hasAttributes = false;
+    props.hasDefault = false;
+    props.hasName = false;
+    
+    props.forEach(function(prop) {
+        if (!prop) { return; }
+        
+        if (prop.optional || prop.nullable) {
+            props.hasAttributes = true;
+        }
+        
+        if (prop.name) {
+            props.hasName = true;
+        }
+        
+        if (typeof prop.defaultvalue !== 'undefined') {
+            props.hasDefault = true;
+        }
+    });
+?>
+
+<table class="props">
+    <thead>
+	<tr>
+		<?js if (props.hasName) {?>
+		<th>Name</th>
+		<?js } ?>
+		
+		<th>Type</th>
+		
+		<?js if (props.hasAttributes) {?>
+		<th>Argument</th>
+		<?js } ?>
+		
+		<?js if (props.hasDefault) {?>
+		<th>Default</th>
+		<?js } ?>
+		
+		<th class="last">Description</th>
+	</tr>
+	</thead>
+	
+	<tbody>
+	<?js
+        var self = this;
+	    props.forEach(function(prop) {
+	        if (!prop) { return; }
+	?>
+	
+        <tr>
+            <?js if (props.hasName) {?>
+                <td class="name"><code><?js= prop.name ?></code></td>
+            <?js } ?>
+            
+            <td class="type">
+            <?js if (prop.type && prop.type.names) {?>
+                <?js= self.partial('type.tmpl', prop.type.names) ?>
+            <?js } ?>
+            </td>
+            
+            <?js if (props.hasAttributes) {?>
+                <td class="attributes">
+                <?js if (prop.optional) { ?>
+                    <optional><br>
+                <?js } ?>
+                    
+                <?js if (prop.nullable) { ?>
+                    <nullable><br>
+                <?js } ?>
+                </td>
+            <?js } ?>
+            
+            <?js if (props.hasDefault) {?>
+                <td class="default">
+                <?js if (typeof prop.defaultvalue !== 'undefined') { ?>
+                    <?js= self.htmlsafe(prop.defaultvalue) ?>
+                <?js } ?>
+                </td>
+            <?js } ?>
+            
+            <td class="description last"><?js= prop.description ?><?js if (prop.subprops) { ?>
+                <h6>Properties</h6><?js= self.partial('properties.tmpl', prop.subprops) ?>
+            <?js } ?></td>
+        </tr>
+	
+	<?js }); ?>
+	</tbody>
+</table>
\ No newline at end of file
diff --git a/config/jsdoc/api/template/tmpl/returns.tmpl b/config/jsdoc/api/template/tmpl/returns.tmpl
new file mode 100644
index 0000000..b83aa57
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/returns.tmpl
@@ -0,0 +1,72 @@
+<?js
+var returns = obj;
+var parentReturn = null;
+
+returns.forEach(function (ret, i) {
+    if (ret && (ret.description || ret.name)) {
+        ret.description = ret.description.toString().replace(/<\/?p>/g, '');
+
+        var isNamed = ret.name ? true : false;
+        var name = ret.name || ret.description;
+        var startSpacePos = name.indexOf(" ");
+
+        if (parentReturn !== null && name.indexOf(parentReturn.name + '.') === 0) {
+            ret.name = isNamed ? name.substr(parentReturn.name.length + 1) : name.substr(parentReturn.name.length + 1, startSpacePos - (parentReturn.name.length + 1));
+        
+            parentReturn.subReturns = parentReturn.subReturns || [];
+            parentReturn.subReturns.push(ret);
+            returns[i] = null;
+        } else {
+            if (!isNamed) {
+                ret.name = ret.description.substr(0, startSpacePos !== -1 ? startSpacePos : ret.description.length);
+            }
+            
+            parentReturn = ret;
+        }
+    }
+});
+?>
+
+<?js
+if (returns.length > 1) {
+?>
+<table class="params">
+    <thead>
+    <tr>
+        <th>Name</th>
+        <th>Type</th>
+        <th class="last">Description</th>
+    </tr>
+    </thead>
+    <tbody>
+    <?js
+        var self = this;
+        returns.forEach(function(ret) {
+            if (!ret) {
+                return false;
+            }
+    ?>
+        <tr>
+            <td class="name"><code><?js= ret.name ?></code></td>
+            <td class="type">
+            <?js
+                if (ret.type && ret.type.names) {
+                    ret.type.names.forEach(function(name, i) { ?>
+                        <?js= self.linkto(name, self.htmlsafe(name)) ?>
+                        <?js if (i < ret.type.names.length-1) { ?> | <?js } ?>
+                    <?js }); 
+                }
+            ?>
+            </td>
+            <td class="description last"><?js= ret.description ?><?js if (ret.subReturns) { ?>
+                <?js= self.partial('returns.tmpl', ret.subReturns) ?>
+            <?js } ?></td>
+        </tr>
+    <?js }); ?>
+    </tbody>
+</table>
+<?js } else if (returns[0].description) { ?>
+<h5>Returns:</h5>
+<?js= returns[0].description ?>
+<br />
+<?js } ?>
\ No newline at end of file
diff --git a/config/jsdoc/api/template/tmpl/source.tmpl b/config/jsdoc/api/template/tmpl/source.tmpl
new file mode 100644
index 0000000..e1092ef
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/source.tmpl
@@ -0,0 +1,8 @@
+<?js
+    var data = obj;
+?>
+    <section>
+        <article>
+            <pre class="prettyprint source"><code><?js= data.code ?></code></pre>
+        </article>
+    </section>
\ No newline at end of file
diff --git a/config/jsdoc/api/template/tmpl/stability.tmpl b/config/jsdoc/api/template/tmpl/stability.tmpl
new file mode 100644
index 0000000..b169bbe
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/stability.tmpl
@@ -0,0 +1,7 @@
+<?js
+var data = obj;
+var self = this;
+
+if (data.stability != 'stable') { ?>
+<span class="stability <?js= data.stability ?>"><?js= data.stability ?></span>
+<?js } ?>
diff --git a/config/jsdoc/api/template/tmpl/tutorial.tmpl b/config/jsdoc/api/template/tmpl/tutorial.tmpl
new file mode 100644
index 0000000..b0c79c1
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/tutorial.tmpl
@@ -0,0 +1,19 @@
+<section>
+    
+<header>
+    <?js if (children.length > 0) { ?>
+    <ul><?js
+        var self = this;
+        children.forEach(function(t) { ?>
+        <li><?js= self.tutoriallink(t.name) ?></li>
+    <?js }); ?></ul>
+    <?js } ?>
+
+    <h2><?js= header ?></h2>
+</header>  
+
+<article>
+    <?js= content ?>
+</article>
+
+</section>  
diff --git a/config/jsdoc/api/template/tmpl/type.tmpl b/config/jsdoc/api/template/tmpl/type.tmpl
new file mode 100644
index 0000000..db8194d
--- /dev/null
+++ b/config/jsdoc/api/template/tmpl/type.tmpl
@@ -0,0 +1,7 @@
+<?js
+	var data = obj;
+    var self = this;
+    data.forEach(function(name, i) { ?>
+<span class="param-type"><?js= self.linkto(name, self.htmlsafe(name)) ?></span>
+<?js if (i < data.length-1) { ?>|<?js } ?>
+<?js }); ?>
\ No newline at end of file
diff --git a/config/jsdoc/info/api-plugin.js b/config/jsdoc/info/api-plugin.js
new file mode 100644
index 0000000..af732d0
--- /dev/null
+++ b/config/jsdoc/info/api-plugin.js
@@ -0,0 +1,15 @@
+
+
+/**
+ * Handle the api annotation.
+ * @param {Object} dictionary The tag dictionary.
+ */
+exports.defineTags = function(dictionary) {
+
+  dictionary.defineTag('api', {
+    onTagged: function(doclet, tag) {
+      doclet.api = tag.text || 'experimental';
+    }
+  });
+
+};
diff --git a/config/jsdoc/info/conf.json b/config/jsdoc/info/conf.json
new file mode 100644
index 0000000..b40d1d7
--- /dev/null
+++ b/config/jsdoc/info/conf.json
@@ -0,0 +1,17 @@
+{
+    "opts": {
+        "recurse": true,
+        "template": "config/jsdoc/info"
+    },
+    "tags": {
+        "allowUnknownTags": true
+    },
+    "source": {
+        "includePattern": "\\.js$"
+    },
+    "plugins": [
+        "config/jsdoc/info/api-plugin",
+        "config/jsdoc/info/define-plugin",
+        "config/jsdoc/info/virtual-plugin"
+    ]
+}
diff --git a/config/jsdoc/info/define-plugin.js b/config/jsdoc/info/define-plugin.js
new file mode 100644
index 0000000..57c4e35
--- /dev/null
+++ b/config/jsdoc/info/define-plugin.js
@@ -0,0 +1,35 @@
+/**
+ * @fileoverview  This plugin extracts info from boolean defines.  This only
+ * handles boolean defines with the default value in the description.  Default
+ * is assumed to be provided with something like "default is `true`" (case
+ * insensitive, with or without ticks).
+ */
+
+
+var DEFAULT_VALUE = /default\s+is\s+`?(true|false)`?/i;
+
+
+/**
+ * Hook to define new tags.
+ * @param {Object} dictionary The tag dictionary.
+ */
+exports.defineTags = function(dictionary) {
+
+  dictionary.defineTag('define', {
+    canHaveType: true,
+    mustHaveValue: true,
+    onTagged: function(doclet, tag) {
+      var types = tag.value.type.names;
+      if (types.length === 1 && types[0] === 'boolean') {
+        var match = tag.value.description.match(DEFAULT_VALUE);
+        if (match) {
+          doclet.define = {
+            default: match[1] === 'true'
+          };
+          doclet.description = tag.value.description;
+        }
+      }
+    }
+  });
+
+};
diff --git a/config/jsdoc/info/publish.js b/config/jsdoc/info/publish.js
new file mode 100644
index 0000000..a07a7ef
--- /dev/null
+++ b/config/jsdoc/info/publish.js
@@ -0,0 +1,175 @@
+/**
+ * @fileoverview Generates JSON output based on exportable symbols (those with
+ * an api tag) and boolean defines (with a define tag and a default value).
+ */
+var assert = require('assert');
+var fs = require('fs');
+var path = require('path');
+
+
+/**
+ * Publish hook for the JSDoc template.  Writes to JSON stdout.
+ * @param {function} data The root of the Taffy DB containing doclet records.
+ * @param {Object} opts Options.
+ */
+exports.publish = function(data, opts) {
+
+  function getTypes(data) {
+    var types = [];
+    data.forEach(function(name) {
+      types.push(name.replace(/^function$/, 'Function'));
+    });
+    return types;
+  }
+
+  // get all doclets with the "api" property or define (excluding events) or
+  // with olx namespace
+  var classes = {};
+  var docs = data(
+      [
+        {define: {isObject: true}},
+        function() {
+          if (this.kind == 'class') {
+            if (!('extends' in this) || typeof this.api == 'string') {
+              classes[this.longname] = this;
+              return true;
+            }
+          }
+          return (typeof this.api == 'string' ||
+              this.meta && (/[\\\/]externs$/).test(this.meta.path));
+        }
+      ],
+      {kind: {'!is': 'file'}},
+      {kind: {'!is': 'event'}}).get();
+
+  // get symbols data, filter out those that are members of private classes
+  var symbols = [];
+  var defines = [];
+  var typedefs = [];
+  var externs = [];
+  var base = [];
+  var augments = {};
+  var names = {};
+  docs.filter(function(doc) {
+    var include = true;
+    var constructor = doc.memberof;
+    if (constructor && constructor.substr(-1) === '_') {
+      assert.strictEqual(doc.inherited, true,
+          'Unexpected export on private class: ' + doc.longname);
+      include = false;
+    }
+    return include;
+  }).forEach(function(doc) {
+    var isExterns = (/[\\\/]externs$/).test(doc.meta.path);
+    if (isExterns && doc.longname.indexOf('olx.') === 0) {
+      if (doc.kind == 'typedef') {
+        typedefs.push({
+          name: doc.longname,
+          types: ['{}']
+        });
+      } else {
+        var typedef = typedefs[typedefs.length - 1];
+        var type = typedef.types[0];
+        typedef.types[0] = type
+            .replace(/\}$/, ', ' + doc.longname.split('#')[1] +
+                ': (' + getTypes(doc.type.names).join('|') + ')}')
+            .replace('{, ', '{');
+      }
+    } else if (doc.define) {
+      defines.push({
+        name: doc.longname,
+        description: doc.description,
+        path: path.join(doc.meta.path, doc.meta.filename),
+        default: doc.define.default
+      });
+    } else if (doc.kind == 'typedef' || doc.isEnum === true) {
+      typedefs.push({
+        name: doc.longname,
+        types: getTypes(doc.type.names)
+      });
+    } else {
+      var types;
+      var symbol = {
+        name: doc.longname,
+        kind: doc.kind,
+        description: doc.classdesc || doc.description,
+        stability: doc.api,
+        path: path.join(doc.meta.path, doc.meta.filename)
+      };
+      if (doc.augments) {
+        symbol.extends = doc.augments[0];
+      }
+      if (doc.virtual) {
+        symbol.virtual = true;
+      }
+      if (doc.type) {
+        symbol.types = getTypes(doc.type.names);
+      }
+      if (doc.params) {
+        var params = [];
+        doc.params.forEach(function(param) {
+          var paramInfo = {
+            name: param.name
+          };
+          params.push(paramInfo);
+          paramInfo.types = getTypes(param.type.names);
+          if (typeof param.variable == 'boolean') {
+            paramInfo.variable = param.variable;
+          }
+          if (typeof param.optional == 'boolean') {
+            paramInfo.optional = param.optional;
+          }
+          if (typeof param.nullable == 'boolean') {
+            paramInfo.nullable = param.nullable;
+          }
+        });
+        symbol.params = params;
+      }
+      if (doc.returns) {
+        symbol.returns = {
+          types: getTypes(doc.returns[0].type.names)
+        };
+        if (typeof doc.returns[0].nullable == 'boolean') {
+          symbol.returns.nullable = doc.returns[0].nullable;
+        }
+      }
+      if (doc.tags) {
+        doc.tags.every(function(tag) {
+          if (tag.title == 'template') {
+            symbol.template = tag.value;
+            return false;
+          }
+          return true;
+        });
+      }
+
+      var target = isExterns ? externs : (doc.api ? symbols : base);
+      target.push(symbol);
+      names[symbol.name] = true;
+
+      if (doc.api && symbol.extends) {
+        while (symbol.extends in classes && !classes[symbol.extends].api &&
+            classes[symbol.extends].augments) {
+          symbol.extends = classes[symbol.extends].augments[0];
+        }
+        if (symbol.extends) {
+          augments[symbol.extends] = true;
+        }
+      }
+    }
+  });
+
+  base = base.filter(function(symbol) {
+    return (symbol.name in augments || symbol.virtual);
+  });
+
+  process.stdout.write(
+      JSON.stringify({
+        symbols: symbols,
+        defines: defines,
+        typedefs: typedefs,
+        externs: externs,
+        base: base
+      }, null, 2));
+
+};
diff --git a/config/jsdoc/info/virtual-plugin.js b/config/jsdoc/info/virtual-plugin.js
new file mode 100644
index 0000000..52cc894
--- /dev/null
+++ b/config/jsdoc/info/virtual-plugin.js
@@ -0,0 +1,16 @@
+/**
+ * Handle the interface and abstract annotations.
+ * @param {Object} dictionary The tag dictionary.
+ */
+exports.defineTags = function(dictionary) {
+
+  var classTag = dictionary.lookUp('class');
+  dictionary.defineTag('interface', {
+    mustHaveValue: false,
+    onTagged: function(doclet, tag) {
+      classTag.onTagged.apply(this, arguments);
+      doclet.virtual = true;
+    }
+  });
+
+};
diff --git a/config/ol-debug.json b/config/ol-debug.json
new file mode 100644
index 0000000..cf20571
--- /dev/null
+++ b/config/ol-debug.json
@@ -0,0 +1,4 @@
+{
+  "exports": ["*"],
+  "umd": true
+}
diff --git a/config/ol.json b/config/ol.json
new file mode 100644
index 0000000..5b09d26
--- /dev/null
+++ b/config/ol.json
@@ -0,0 +1,66 @@
+{
+  "exports": ["*"],
+  "umd": true,
+  "compile": {
+    "externs": [
+      "externs/bingmaps.js",
+      "externs/closure-compiler.js",
+      "externs/geojson.js",
+      "externs/oli.js",
+      "externs/olx.js",
+      "externs/proj4js.js",
+      "externs/tilejson.js",
+      "externs/topojson.js",
+      "externs/vbarray.js"
+    ],
+    "define": [
+      "goog.array.ASSUME_NATIVE_FUNCTIONS=true",
+      "goog.dom.ASSUME_STANDARDS_MODE=true",
+      "goog.json.USE_NATIVE_JSON=true",
+      "goog.DEBUG=false"
+    ],
+    "jscomp_error": [
+      "accessControls",
+      "ambiguousFunctionDecl",
+      "checkEventfulObjectDisposal",
+      "checkRegExp",
+      "checkStructDictInheritance",
+      "checkTypes",
+      "checkVars",
+      "const",
+      "constantProperty",
+      "deprecated",
+      "duplicateMessage",
+      "es3",
+      "es5Strict",
+      "externsValidation",
+      "fileoverviewTags",
+      "globalThis",
+      "internetExplorerChecks",
+      "invalidCasts",
+      "misplacedTypeAnnotation",
+      "missingGetCssName",
+      "missingProperties",
+      "missingProvide",
+      "missingRequire",
+      "missingReturn",
+      "newCheckTypes",
+      "nonStandardJsDocs",
+      "suspiciousCode",
+      "strictModuleDepCheck",
+      "typeInvalidation",
+      "undefinedNames",
+      "undefinedVars",
+      "unknownDefines",
+      "uselessCode",
+      "visibility"
+    ],
+    "extra_annotation_name": [
+      "api", "observable"
+    ],
+    "compilation_level": "ADVANCED",
+    "warning_level": "VERBOSE",
+    "use_types_for_optimization": true,
+    "manage_closure_dependencies": true
+  }
+}
diff --git a/config/readme.md b/config/readme.md
new file mode 100644
index 0000000..200d20e
--- /dev/null
+++ b/config/readme.md
@@ -0,0 +1,3 @@
+# Configuration Files
+
+This directory includes configuration files for the build scripts in and documentation templates.
diff --git a/css/ol.css b/css/ol.css
new file mode 100644
index 0000000..44ea0f3
--- /dev/null
+++ b/css/ol.css
@@ -0,0 +1,257 @@
+
+.ol-mouse-position {
+  top: 8px;
+  right: 8px;
+  position: absolute;
+}
+
+.ol-scale-line {
+  background: #95b9e6;
+  background: rgba(0,60,136,0.3);
+  border-radius: 4px;
+  bottom: 8px;
+  left: 8px;
+  padding: 2px;
+  position: absolute;
+}
+.ol-scale-line-inner {
+  border: 1px solid #eeeeee;
+  border-top: none;
+  color: #eeeeee;
+  font-size: 10px;
+  text-align: center;
+  margin: 1px;
+  padding: 0px 2px;
+}
+.ol-unsupported {
+  display: none;
+}
+.ol-viewport .ol-unselectable {
+  -webkit-touch-callout: none;
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-tap-highlight-color: rgba(0,0,0,0);
+}
+
+.ol-control {
+  position: absolute;
+  background-color: #eee;
+  background-color: rgba(255,255,255,0.4);
+  border-radius: 4px;
+  padding: 2px;
+}
+.ol-control:hover {
+  background-color: rgba(255,255,255,0.6);
+}
+.ol-zoom {
+  top: .5em;
+  left: .5em;
+}
+.ol-rotate {
+  top: .5em;
+  right: .5em;
+  transition: opacity .25s;
+}
+.ol-rotate.ol-hidden {
+  opacity: 0;
+  display: none;
+}
+.ol-zoom-extent {
+  top: 4.643em;
+  left: .5em;
+}
+.ol-full-screen {
+  right: .5em;
+  top: .5em;
+}
+ at media print {
+  .ol-control {
+    display: none;
+  }
+}
+
+.ol-control button {
+  display: block;
+  margin: 1px;
+  padding: 0;
+  color: white;
+  font-size: 1.14em;
+  font-weight: bold;
+  text-decoration: none;
+  text-align: center;
+  height: 1.375em;
+  width: 1.375em;
+  line-height: .4em;
+  background-color: #7b98bc;
+  background-color: rgba(0,60,136,0.5);
+  border: none;
+  border-radius: 2px;
+}
+.ol-control button::-moz-focus-inner {
+  border: none;
+  padding: 0;
+}
+.ol-zoom-extent button {
+  line-height: 1.4em;
+}
+.ol-compass {
+  display: block;
+  font-weight: normal;
+  font-size: 1.2em;
+}
+.ol-touch .ol-control button {
+  font-size: 1.5em;
+}
+.ol-touch .ol-zoom-extent {
+  top: 5.5em;
+}
+.ol-control button:hover,
+.ol-control button:focus {
+  text-decoration: none;
+  background-color: #4c6079;
+  background-color: rgba(0,60,136,0.7);
+}
+.ol-zoom-extent button:after {
+    content: "E";
+}
+.ol-zoom .ol-zoom-in {
+  border-radius: 2px 2px 0 0;
+}
+.ol-zoom .ol-zoom-out {
+  border-radius: 0 0 2px 2px;
+}
+button.ol-full-screen-false:after {
+  content: "\2194";
+}
+button.ol-full-screen-true:after {
+  content: "\00d7";
+}
+
+
+.ol-attribution {
+  text-align: right;
+  bottom: .5em;
+  right: .5em;
+  max-width: calc(100% - 1.3em);
+}
+
+.ol-attribution ul {
+  margin: 0;
+  padding: 0 .5em;
+  font-size: .7rem;
+  line-height: 1.375em;
+  color: #000;
+  text-shadow: 0 0 2px #fff;
+}
+.ol-attribution li {
+  display: inline;
+  list-style: none;
+  line-height: inherit;
+}
+.ol-attribution li:not(:last-child):after {
+  content: " ";
+}
+.ol-attribution img {
+  max-height: 2em;
+  max-width: inherit;
+}
+.ol-attribution ul, .ol-attribution button {
+  display: inline-block;
+}
+.ol-attribution.ol-collapsed ul {
+  display: none;
+}
+.ol-attribution.ol-logo-only ul {
+  display: block;
+}
+.ol-attribution:not(.ol-collapsed) {
+  background: rgba(255,255,255,0.8);
+}
+.ol-attribution.ol-uncollapsible {
+  bottom: 0;
+  right: 0;
+  border-radius: 4px 0 0;
+  height: 1.1em;
+  line-height: 1em;
+}
+.ol-attribution.ol-logo-only {
+  background: transparent;
+  bottom: .4em;
+  height: 1.1em;
+  line-height: 1em;
+}
+.ol-attribution.ol-uncollapsible img {
+  margin-top: -.2em;
+  max-height: 1.6em;
+}
+.ol-attribution.ol-logo-only button,
+.ol-attribution.ol-uncollapsible button {
+  display: none;
+}
+
+.ol-zoomslider {
+  position: absolute;
+  top: 4.5em;
+  left: .5em;
+  background: #eee;
+  background: rgba(255, 255, 255, 0.4);
+  width: 24px;
+  height: 200px;
+}
+.ol-zoomslider-thumb {
+  position: absolute;
+  background: #7b98bc;
+  background: rgba(0,60,136,0.5);
+  border-radius: 2px;
+  cursor: pointer;
+  height: 10px;
+  width: 22px;
+  margin: 3px;
+}
+
+.ol-touch .ol-zoomslider {
+  top: 5.5em;
+  width: 2.052em;
+}
+.ol-touch .ol-zoomslider-thumb {
+  width: 1.8em;
+}
+
+.ol-overviewmap {
+  position: absolute;
+  left: 0.5em;
+  bottom: 0.5em;
+}
+.ol-overviewmap.ol-uncollapsible {
+  bottom: 0;
+  left: 0;
+  border-radius: 0 4px 0 0;
+}
+.ol-overviewmap .ol-overviewmap-map,
+.ol-overviewmap button {
+  display: inline-block;
+}
+.ol-overviewmap .ol-overviewmap-map {
+  border: 1px solid #7b98bc;
+  height: 150px;
+  margin: 2px;
+  width: 150px;
+}
+.ol-overviewmap:not(.ol-collapsed) button{
+  bottom: 1px;
+  left: 2px;
+  position: absolute;
+}
+.ol-overviewmap.ol-collapsed .ol-overviewmap-map,
+.ol-overviewmap.ol-uncollapsible button {
+  display: none;
+}
+.ol-overviewmap:not(.ol-collapsed) {
+  background: rgba(255,255,255,0.8);
+}
+.ol-overviewmap-box {
+  border: 2px dotted rgba(0,60,136,0.7);
+}
diff --git a/doc/index.hbs b/doc/index.hbs
new file mode 100644
index 0000000..6d4a002
--- /dev/null
+++ b/doc/index.hbs
@@ -0,0 +1,14 @@
+---
+title: Documentation
+layout: doc.hbs
+---
+
+# Documentation
+
+If you're eager to get your first OpenLayers 3 map on a page, dive into the [quick start](quickstart.html).
+
+For a more in-depth overview of OpenLayers 3 core concepts, check out the [tutorials](tutorials/).
+
+Make sure to also check out the [OpenLayers 3 workshop](../../../ol3-workshop/).
+
+Find additional reference material in the [API docs](../apidoc).
diff --git a/doc/quickstart.hbs b/doc/quickstart.hbs
new file mode 100644
index 0000000..4fa37ef
--- /dev/null
+++ b/doc/quickstart.hbs
@@ -0,0 +1,133 @@
+---
+title: Quick Start
+layout: doc.hbs
+---
+
+# Quick Start
+
+## Put a map on a page
+
+Below you'll find a complete working example.  Create a new file, copy in the contents below, and open in a browser:
+
+```xml
+<!doctype html>
+<html lang="en">
+  <head>
+    <link rel="stylesheet" href="http://openlayers.org/en/{{ latest }}/css/ol.css" type="text/css">
+    <style>
+      .map {
+        height: 400px;
+        width: 100%;
+      }
+    </style>
+    <script src="http://openlayers.org/en/{{ latest }}/build/ol.js" type="text/javascript"></script>
+    <title>OpenLayers 3 example</title>
+  </head>
+  <body>
+    <h2>My Map</h2>
+    <div id="map" class="map"></div>
+    <script type="text/javascript">
+      var map = new ol.Map({
+        target: 'map',
+        layers: [
+          new ol.layer.Tile({
+            source: new ol.source.MapQuest({layer: 'sat'})
+          })
+        ],
+        view: new ol.View({
+          center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
+          zoom: 4
+        })
+      });
+    </script>
+  </body>
+</html>
+```
+
+## Understanding what is going on
+
+To include a map a web page you will need 3 things:
+
+ 1. Include OpenLayers
+ 2. `<div>` map container
+ 3. JavaScript to create a simple map
+
+### Include OpenLayers
+
+```xml
+  <script src="http://openlayers.org/en/{{ latest }}/build/ol.js" type="text/javascript"></script>
+```
+
+The first part is to include the JavaScript library. For the purpose of this tutorial, here we simply point to the openlayers.org website to get the whole library. In a production environment, we would build a custom version of the library including only the module needed for our application.
+
+
+### `<div>` to contain the map
+
+```xml
+  <div id="map" class="map"></div>
+```
+
+The map in the application is contained in a [`<div>` HTML element](http://en.wikipedia.org/wiki/Span_and_div). Through this `<div>` the map properties like width, height and border can be controlled through CSS. Here's the CSS element used to make the map 400 pixels high and as wide as the browser window.
+
+```xml
+  <style>
+    .map {
+      height: 400px;
+      width: 100%;
+    }
+  </style>
+```
+
+### JavaScript to create a simple map
+
+```js
+  var map = new ol.Map({
+    target: 'map',
+    layers: [
+      new ol.layer.Tile({
+        source: new ol.source.MapQuest({layer: 'sat'})
+      })
+    ],
+    view: new ol.View({
+      center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
+      zoom: 4
+    })
+  });
+```
+
+With this JavaScript code, a map object is created with a MapQuest Open Aerial layer zoomed on the African East coast. Let's break this down:
+
+The following line creates an OpenLayers `Map` object. Just by itself, this does nothing since there's no layers or interaction attached to it.
+
+```js
+  var map = new ol.Map({ ... });
+```
+
+To attach the map object to the `<div>`, the map object takes a `target` into arguments. The value is the `id` of the `<div>`:
+
+```js
+    target: 'map'
+```
+
+The `layers: [ ... ]` array is used to define the list of layers available in the map. The first and only layer right now is a tiled layer:
+
+```js
+    layers: [
+      new ol.layer.Tile({
+        source: new ol.source.MapQuest({layer: 'sat'})
+      })
+    ]
+```
+
+Layers in OpenLayers 3 are defined with a type (Image, Tile or Vector) which contains a source. The source is the protocol used to get the map tiles. You can consult the list of [available layer sources here](/en/{{ latest }}/apidoc/ol.source.html)
+
+The next part of the `Map` object is the `View`. The view allow to specify the center, resolution, and rotation of the map. The simplest way to define a view is to define a center point and a zoom level.  Note that zoom level 0 is zoomed out.
+
+```js
+    view: new ol.View({
+      center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
+      zoom: 4
+    })
+```
+
+You will notice that the `center` specified is in lat/lon coordinates (EPSG:4326). Since the only layer we use is in Spherical Mercator projection (EPSG:3857), we can reproject them on the fly to be able to zoom the map on the right coordinates.
diff --git a/doc/tutorials/concepts.hbs b/doc/tutorials/concepts.hbs
new file mode 100644
index 0000000..08f5888
--- /dev/null
+++ b/doc/tutorials/concepts.hbs
@@ -0,0 +1,73 @@
+---
+title: Basic Concepts
+layout: doc.hbs
+---
+
+# Basic Concepts
+
+## Map
+The core component of OpenLayers 3 is the map (`ol.Map`). It is rendered to a `target` container (e.g. a `div` element on the web page that contains the map). All map properties can either be configured at construction time, or by using setter methods, e.g. `setTarget()`.
+
+```xml
+<div id="map" style="width: 100%, height: 400px"></div>
+<script>
+  var map = new ol.Map({target: 'map'});
+</script>
+```
+
+## View
+`ol.Map` is not responsible for things like center, zoom level and projection of the map. Instead, these are properties of an `ol.View` instance.
+
+```js
+  map.setView(new ol.View({
+    center: [0, 0],
+    zoom: 2
+  }));
+```
+
+An `ol.View` also has a `projection`. The projection determines the coordinate system of the `center` and the units for map resolution calculations. If not specified (like in the above snippet), the default projection is Spherical Mercator (EPSG:3857), with meters as map units.
+
+The `zoom` option is a convenient way to specify the map resolution. The available zoom levels are determined by `maxZoom` (default: 28), `zoomFactor` (default: 2) and `maxResolution` (default is calculated in such a way that the projection's validity extent fits in a 256x256 pixel tile). Starting at zoom level 0 with a resolution of `maxResolution` units per pixel, subsequent zoom levels are calculated by dividing the previous zoom level's resolution by `zoomFactor`, until zoom level `m [...]
+
+
+## Source
+To get remote data for a layer, OpenLayers 3 uses `ol.source.Source` subclasses. These are available for free and commercial map tile services like OpenStreetMap or Bing, for OGC sources like WMS or WMTS, and for vector data in formats like GeoJSON or KML.
+
+```js
+  var osmSource = new ol.source.OSM();
+```
+
+## Layer
+A layer is a visual representation of data from a `source`. OpenLayers 3 has three basic types of layers: `ol.layer.Tile`, `ol.layer.Image` and `ol.layer.Vector`.
+
+`ol.layer.Tile` is for layer sources that provide pre-rendered, tiled images in grids that are organized by zoom levels for specific resolutions.
+
+`ol.layer.Image` is for server rendered images that are available for arbitrary extents and resolutions.
+
+`ol.layer.Vector` is for vector data that is rendered client-side.
+
+```js
+  var osmLayer = new ol.layer.Tile({source: osmSource});
+  map.addLayer(osmLayer);
+```
+
+## Putting it all together
+
+
+The above snippets can be conflated to a self contained map configuration with view and layers:
+
+```xml
+<div id="map" style="width: 100%, height: 400px"></div>
+<script>
+  new ol.Map({
+    layers: [
+      new ol.layer.Tile({source: new ol.source.OSM()})
+    ],
+    view: new ol.View({
+      center: [0, 0],
+      zoom: 2
+    }),
+    target: 'map'
+  });
+</script>
+```
diff --git a/doc/tutorials/index.hbs b/doc/tutorials/index.hbs
new file mode 100644
index 0000000..8f2fc43
--- /dev/null
+++ b/doc/tutorials/index.hbs
@@ -0,0 +1,8 @@
+---
+title: Tutorials
+layout: doc.hbs
+---
+
+# Tutorials
+
+We'll be putting together a more comprehensive set of tutorials here.  For now, you can take a look at the [introduction](introduction.html) and [basic concepts](concepts.html) tutorial.  Stay tuned for more!
diff --git a/doc/tutorials/introduction.md b/doc/tutorials/introduction.md
new file mode 100644
index 0000000..351f57b
--- /dev/null
+++ b/doc/tutorials/introduction.md
@@ -0,0 +1,44 @@
+---
+title: Introduction
+layout: doc.hbs
+---
+
+# Introduction
+
+## Objectives
+OpenLayers 3 (OL3) is a fundamental redesign of the OpenLayers web mapping library. Version 2 is widely used, but dates from the early days of Javascript development, and is increasingly showing its age. OL3 has been rewritten from the ground up to use modern design patterns.
+
+The initial release aims to support much of the functionality provided by version 2, with support for a wide range of commercial and free tile sources, and the most popular open-source vector data formats. As with version 2, data can be in any projection. The initial release also adds some additional functionality, such as the ability to easily rotate or animate maps.
+
+It is also designed such that major new features, such as displaying 3D maps, or using WebGL to quickly display large vector data sets, can be added in later releases.
+
+## Closure Tools
+OL3 is based on Google's Closure Tools. It makes heavy use of parts of the [__Closure Library__](https://developers.google.com/closure/library/). Using this to handle basics like DOM or event handling means the developers can concentrate on mapping functionality, and be sure that the underlying software is well-tested and cross-browser. Closure Library is specially designed to be optimized by the [__Closure Compiler__](https://developers.google.com/closure/compiler/). The 'advanced' opti [...]
+
+## Public API
+Using the advanced optimizations of the Closure Compiler means that properties and methods are renamed – `longMeaningfulName` might become `xB` – and so are effectively unusable in applications using the library. To be usable, they have to be explicitly `exported`. This means the exported names, those not renamed, effectively become the public API of the library. These __exportable__ properties and methods are marked in the source, and documented in the [API docs](../../apido [...]
+
+Although Closure library functions are widely used within OL3, none of them are exported. You will see references to them (they are all in the `goog` namespace) in the API docs, but these are for information only. You can use the Closure library in your own applications if you like, but this is not required.
+
+## Custom Builds
+Unlike in, say, Node, where a module's exports are fixed in the source, with Closure Compiler, exports can be defined at compile time. This makes it easy to create builds that are customized to the needs of a particular site or application: a __custom build__ only exports those properties and methods needed by the site or application. As the full build is large, and will probably become larger as new features are added to the API, it's recommended that sites create a custom build for pro [...]
+
+## Renderers and Browser Support
+The library currently includes three renderers: Canvas, DOM, and WebGL. All three support raster data from tile/image servers, but only the Canvas renderer currently supports vector data. This means that only those browsers that [support Canvas](http://caniuse.com/canvas) can handle vector data. In particular, this excludes Internet Explorer versions before 9, though there is some support for those in the DOM renderer. Clearly, the WebGL renderer can only be used on those devices and bro [...]
+
+The library is intended for use on both desktop/laptop and mobile devices.
+
+## Objects and Naming Conventions
+OL3 uses a similar object hierarchy to the Closure library. There is a top-level `ol` namespace (basically, `var ol = {};`). Subdivisions of this are:
+
+* further namespaces, such as `ol.layer`; these have a lower-case initial
+* simple objects containing static properties and methods, such as `ol.animation`; these also have a lower-case initial
+* types, which have an upper-case initial. These are mainly 'classes', which here means a constructor function with prototypal inheritance, such as `ol.Map` or `ol.layer.Vector` (the Vector class within the layer namespace). There are however other, simpler, types, such as `ol.Extent`, which is an array.
+
+Class namespaces, such as `ol.layer` have a base class type with the same name, such as `ol.layer.Layer`. These are mainly abstract classes, from which the other subclasses inherit.
+
+Source files are similarly organised, with a directory for each class namespace. Names are however all lower-case, and the subclasses repeat the superclass type in their name, for example, `ol/layer/vectorlayer.js`.
+
+The naming structure means that there are sometimes 2 objects with the same name but different initial, such as `ol.feature`, a simple object with static functions to be used with features, and `ol.Feature`, a class used to instantiate new features. These two objects are however stored in the same file, in this case, `ol/feature.js`
+
+OL3 follows the convention that the names of private properties and methods, that is, those that are not part of the API, end in an underscore. In general, instance properties are private and accessed using accessors.
\ No newline at end of file
diff --git a/examples/Jugl.js b/examples/Jugl.js
new file mode 100644
index 0000000..4f81a27
--- /dev/null
+++ b/examples/Jugl.js
@@ -0,0 +1,8 @@
+/*
+ * Jugl.js -- JavaScript Template Library
+ *
+ * Copyright 2007-2010 Tim Schaub
+ * Released under the MIT license.  Please see 
+ * http://github.com/tschaub/jugl/blob/master/license.txt for the full license.
+ */
+(function(){var f={prefix:"jugl",namespaceURI:null,loadTemplate:function(h){var i=function(l){var m,k,n=!l.status||(l.status>=200&&l.status<300);if(n){try{m=l.responseXML;k=new e(m.documentElement)}catch(j){m=document.createElement("div");m.innerHTML=l.responseText;k=new e(m.firstChild)}if(h.callback){h.callback.call(h.scope,k)}}else{if(h.failure){h.failure.call(h.scope,l)}}};d(h.url,i)}};var g=function(h,j){h=h||{};j=j||{};for(var i in j){h[i]=j[i]}return h};var a=function(l,o){var m,n, [...]
\ No newline at end of file
diff --git a/examples/accessible.html b/examples/accessible.html
new file mode 100644
index 0000000..71e821d
--- /dev/null
+++ b/examples/accessible.html
@@ -0,0 +1,72 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Accessibility example</title>
+    <style>
+      a.skiplink {
+        position: absolute;
+        clip: rect(1px, 1px, 1px, 1px);
+        padding: 0;
+        border: 0;
+        height: 1px;
+        width: 1px;
+        overflow: hidden;
+      }
+      a.skiplink:focus {
+        clip: auto;
+        height: auto;
+        width: auto;
+        background-color: #fff;
+        padding: 0.3em;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png" alt=""> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <a class="skiplink" href="#map">Go to map</a>
+          <div id="map" class="map" tabindex="0"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Accessibility example</h4>
+          <p id="shortdesc">Example of an accessible map.</p>
+          <div id="docs">
+            <p>This page's <code>map</code> element has its <code>tabindex</code> attribute set to <code>"0"</code>, that makes it focusable. To focus the map element you can either navigate to it using the "tab" key or use the skip link. When the <code>map</code> element is focused the + and - keys can be used to zoom in and out and the arrow keys can be used to pan.</p>
+            <p>When clicked the "Zoom in" and "Zoom out" buttons below the map zoom the map in and out, respectively. You can navigate to the buttons using the "tab" key, and press the "enter" key to trigger the zooming action.</p>
+            <p>See the <a href="accessible.js" target="_blank">accessible.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">accessibility, tabindex</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=accessible" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/accessible.js b/examples/accessible.js
new file mode 100644
index 0000000..53a8039
--- /dev/null
+++ b/examples/accessible.js
@@ -0,0 +1,32 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+jQuery('#map').after('<button type="button" ' +
+    'onclick="map.getView().setZoom(map.getView().getZoom() - 1);">' +
+    'Zoom out</button>');
+jQuery('#map').after('<button type="button" ' +
+    'onclick="map.getView().setZoom(map.getView().getZoom() + 1);">' +
+    'Zoom in</button>');
diff --git a/examples/animation.html b/examples/animation.html
new file mode 100644
index 0000000..d072983
--- /dev/null
+++ b/examples/animation.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Animation example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div class="span12">
+          <button id="rotate-left"><i class="icon-arrow-left"></i></button>
+          <button id="rotate-right"><i class="icon-arrow-right"></i></button>
+          <button id="rotate-around-rome">Rotate around Rome</button>
+          <button id="pan-to-london">Pan to London</button>
+          <button id="elastic-to-moscow">Elastic to Moscow</button>
+          <button id="bounce-to-istanbul">Bounce to Istanbul</button>
+          <button id="spin-to-rome">Spin to Rome</button>
+          <button id="fly-to-bern">Fly to Bern</button>
+          <button id="spiral-to-madrid">Spiral to Madrid</button>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Animation example</h4>
+          <p id="shortdesc">Demonstrates animated pan, zoom, and rotation.</p>
+          <div id="docs">
+            <p>See the <a href="animation.js" target="_blank">animation.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">animation</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=animation" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/animation.js b/examples/animation.js
new file mode 100644
index 0000000..2db3f7f
--- /dev/null
+++ b/examples/animation.js
@@ -0,0 +1,185 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.animation');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+
+
+// from https://github.com/DmitryBaranovskiy/raphael
+function bounce(t) {
+  var s = 7.5625, p = 2.75, l;
+  if (t < (1 / p)) {
+    l = s * t * t;
+  } else {
+    if (t < (2 / p)) {
+      t -= (1.5 / p);
+      l = s * t * t + 0.75;
+    } else {
+      if (t < (2.5 / p)) {
+        t -= (2.25 / p);
+        l = s * t * t + 0.9375;
+      } else {
+        t -= (2.625 / p);
+        l = s * t * t + 0.984375;
+      }
+    }
+  }
+  return l;
+}
+
+// from https://github.com/DmitryBaranovskiy/raphael
+function elastic(t) {
+  return Math.pow(2, -10 * t) * Math.sin((t - 0.075) * (2 * Math.PI) / 0.3) + 1;
+}
+
+var london = ol.proj.transform([-0.12755, 51.507222], 'EPSG:4326', 'EPSG:3857');
+var moscow = ol.proj.transform([37.6178, 55.7517], 'EPSG:4326', 'EPSG:3857');
+var istanbul = ol.proj.transform([28.9744, 41.0128], 'EPSG:4326', 'EPSG:3857');
+var rome = ol.proj.transform([12.5, 41.9], 'EPSG:4326', 'EPSG:3857');
+var bern = ol.proj.transform([7.4458, 46.95], 'EPSG:4326', 'EPSG:3857');
+var madrid = ol.proj.transform([-3.683333, 40.4], 'EPSG:4326', 'EPSG:3857');
+
+var view = new ol.View({
+  // the view's initial state
+  center: istanbul,
+  zoom: 6
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      preload: 4,
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: view
+});
+
+var rotateLeft = document.getElementById('rotate-left');
+rotateLeft.addEventListener('click', function() {
+  var rotateLeft = ol.animation.rotate({
+    duration: 2000,
+    rotation: -4 * Math.PI
+  });
+  map.beforeRender(rotateLeft);
+}, false);
+var rotateRight = document.getElementById('rotate-right');
+rotateRight.addEventListener('click', function() {
+  var rotateRight = ol.animation.rotate({
+    duration: 2000,
+    rotation: 4 * Math.PI
+  });
+  map.beforeRender(rotateRight);
+}, false);
+
+var rotateAroundRome = document.getElementById('rotate-around-rome');
+rotateAroundRome.addEventListener('click', function() {
+  var currentRotation = view.getRotation();
+  var rotateAroundRome = ol.animation.rotate({
+    anchor: rome,
+    duration: 1000,
+    rotation: currentRotation
+  });
+  map.beforeRender(rotateAroundRome);
+  view.rotate(currentRotation + (Math.PI / 2), rome);
+}, false);
+
+var panToLondon = document.getElementById('pan-to-london');
+panToLondon.addEventListener('click', function() {
+  var pan = ol.animation.pan({
+    duration: 2000,
+    source: /** @type {ol.Coordinate} */ (view.getCenter())
+  });
+  map.beforeRender(pan);
+  view.setCenter(london);
+}, false);
+
+var elasticToMoscow = document.getElementById('elastic-to-moscow');
+elasticToMoscow.addEventListener('click', function() {
+  var pan = ol.animation.pan({
+    duration: 2000,
+    easing: elastic,
+    source: /** @type {ol.Coordinate} */ (view.getCenter())
+  });
+  map.beforeRender(pan);
+  view.setCenter(moscow);
+}, false);
+
+var bounceToIstanbul = document.getElementById('bounce-to-istanbul');
+bounceToIstanbul.addEventListener('click', function() {
+  var pan = ol.animation.pan({
+    duration: 2000,
+    easing: bounce,
+    source: /** @type {ol.Coordinate} */ (view.getCenter())
+  });
+  map.beforeRender(pan);
+  view.setCenter(istanbul);
+}, false);
+
+var spinToRome = document.getElementById('spin-to-rome');
+spinToRome.addEventListener('click', function() {
+  var duration = 2000;
+  var start = +new Date();
+  var pan = ol.animation.pan({
+    duration: duration,
+    source: /** @type {ol.Coordinate} */ (view.getCenter()),
+    start: start
+  });
+  var rotate = ol.animation.rotate({
+    duration: duration,
+    rotation: 2 * Math.PI,
+    start: start
+  });
+  map.beforeRender(pan, rotate);
+  view.setCenter(rome);
+}, false);
+
+var flyToBern = document.getElementById('fly-to-bern');
+flyToBern.addEventListener('click', function() {
+  var duration = 2000;
+  var start = +new Date();
+  var pan = ol.animation.pan({
+    duration: duration,
+    source: /** @type {ol.Coordinate} */ (view.getCenter()),
+    start: start
+  });
+  var bounce = ol.animation.bounce({
+    duration: duration,
+    resolution: 4 * view.getResolution(),
+    start: start
+  });
+  map.beforeRender(pan, bounce);
+  view.setCenter(bern);
+}, false);
+
+var spiralToMadrid = document.getElementById('spiral-to-madrid');
+spiralToMadrid.addEventListener('click', function() {
+  var duration = 2000;
+  var start = +new Date();
+  var pan = ol.animation.pan({
+    duration: duration,
+    source: /** @type {ol.Coordinate} */ (view.getCenter()),
+    start: start
+  });
+  var bounce = ol.animation.bounce({
+    duration: duration,
+    resolution: 2 * view.getResolution(),
+    start: start
+  });
+  var rotate = ol.animation.rotate({
+    duration: duration,
+    rotation: -4 * Math.PI,
+    start: start
+  });
+  map.beforeRender(pan, bounce, rotate);
+  view.setCenter(madrid);
+}, false);
diff --git a/examples/attributions.html b/examples/attributions.html
new file mode 100644
index 0000000..1ab192d
--- /dev/null
+++ b/examples/attributions.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Attributions example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Attributions example</h4>
+          <p id="shortdesc">Example of a attributions visibily change on map resize, to collapse them on small maps.</p>
+          <div id="docs">
+            <p>See the <a href="attributions.js" target="_blank">attributions.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">attributions, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=attributions" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/attributions.js b/examples/attributions.js
new file mode 100644
index 0000000..a48645f
--- /dev/null
+++ b/examples/attributions.js
@@ -0,0 +1,33 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.Attribution');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+var attribution = new ol.control.Attribution({
+  collapsible: false
+});
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  controls: ol.control.defaults({ attribution: false }).extend([attribution]),
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+function checkSize() {
+  var small = map.getSize()[0] < 600;
+  attribution.setCollapsible(small);
+  attribution.setCollapsed(small);
+}
+
+$(window).on('resize', checkSize);
+checkSize();
diff --git a/examples/bind-input.html b/examples/bind-input.html
new file mode 100644
index 0000000..341c4dd
--- /dev/null
+++ b/examples/bind-input.html
@@ -0,0 +1,92 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Bind HTML input example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">Bind HTML input example</h4>
+          <p id="shortdesc">Demonstrates two-way binding of HTML input elements to OpenLayers objects.</p>
+          <div id="docs">
+            <p>See the <a href="bind-input.js" target="_blank">bind-input.js source</a> to see how this is done.</p>
+            <p id="has-webgl" style="display: none">With the <a href="?renderer=webgl">WebGL renderer</a>, <strong>hue</strong>, <strong>saturation</strong>, <strong>contrast</strong> and <strong>brightness</strong> can also be controlled.</p>
+            <div id="no-webgl" class="alert alert-warning" style="display: none">
+              <h4>Warning!</h4>
+              A browser that supports <a href="http://get.webgl.org/">WebGL</a> is required to change the
+              <strong>hue</strong>, <strong>saturation</strong>, <strong>contrast</strong> and <strong>brightness</strong>.
+            </div>
+          </div>
+          <div id="tags">input, bind, openstreetmap</div>
+        </div>
+
+        <div class="span4">
+          <form class="">
+            <fieldset>
+              <legend>Layer</legend>
+              <label class="checkbox" for="visible">
+                <input id="visible" type="checkbox"/>visibility
+              </label>
+              <label>opacity</label>
+              <input id="opacity" type="range" min="0" max="1" step="0.01"/>
+            </fieldset>
+            <fieldset id="webgl" style="display: none">
+              <label>hue</label>
+              <input id="hue" type="range" min="-3.141592653589793" max="3.141592653589793" step="0.01"/>
+              <label>saturation</label>
+              <input id="saturation" type="range" min="0" max="5" step="0.01"/>
+              <label>contrast</label>
+              <input id="contrast" type="range" min="0" max="2" step="0.01"/>
+              <label>brightness</label>
+              <input id="brightness" type="range" min="-1" max="1" step="0.01"/>
+            </fieldset>
+          </form>
+        </div>
+
+        <div class="span4">
+          <form class="">
+            <fieldset>
+              <legend>View</legend>
+              <label>rotation</label>
+              <input id="rotation" type="range" min="-3.141592653589793" max="3.141592653589793" step="0.01"/>
+              <label>resolution</label>
+              <input id="resolution" type="number" min="0" step="250"/>
+            </fieldset>
+          </form>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=bind-input" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/bind-input.js b/examples/bind-input.js
new file mode 100644
index 0000000..5940453
--- /dev/null
+++ b/examples/bind-input.js
@@ -0,0 +1,69 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.dom.Input');
+goog.require('ol.has');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+function checkWebGL(evt) {
+  document.getElementById('no-webgl').style.display =
+      ol.has.WEBGL ? 'none' : '';
+  document.getElementById('has-webgl').style.display =
+      ol.has.WEBGL && !evt.glContext ? '' : 'none';
+  document.getElementById('webgl').style.display =
+      evt.glContext ? '' : 'none';
+}
+
+var layer = new ol.layer.Tile({
+  source: new ol.source.OSM()
+});
+layer.once('precompose', checkWebGL);
+
+var view = new ol.View({
+  center: [0, 0],
+  zoom: 2
+});
+
+var map = new ol.Map({
+  layers: [layer],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: view
+});
+
+var visible = new ol.dom.Input(document.getElementById('visible'));
+visible.bindTo('checked', layer, 'visible');
+
+var opacity = new ol.dom.Input(document.getElementById('opacity'));
+opacity.bindTo('value', layer, 'opacity')
+    .transform(parseFloat, String);
+
+var hue = new ol.dom.Input(document.getElementById('hue'));
+hue.bindTo('value', layer, 'hue')
+    .transform(parseFloat, String);
+
+var saturation = new ol.dom.Input(document.getElementById('saturation'));
+saturation.bindTo('value', layer, 'saturation')
+    .transform(parseFloat, String);
+
+var contrast = new ol.dom.Input(document.getElementById('contrast'));
+contrast.bindTo('value', layer, 'contrast')
+    .transform(parseFloat, String);
+
+var brightness = new ol.dom.Input(document.getElementById('brightness'));
+brightness.bindTo('value', layer, 'brightness')
+    .transform(parseFloat, String);
+
+
+var rotation = new ol.dom.Input(document.getElementById('rotation'));
+rotation.bindTo('value', view, 'rotation').transform(parseFloat, String);
+
+var resolution = new ol.dom.Input(document.getElementById('resolution'));
+resolution.bindTo('value', view, 'resolution').transform(parseFloat, String);
diff --git a/examples/bing-maps.html b/examples/bing-maps.html
new file mode 100644
index 0000000..a97c1da
--- /dev/null
+++ b/examples/bing-maps.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Bing Maps example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+
+          <select id="layer-select">
+            <option value="Aerial">Aerial</option>
+            <option value="AerialWithLabels" selected>Aerial with labels</option>
+            <option value="Road">Road</option>
+            <option value="collinsBart">Collins Bart</option>
+            <option value="ordnanceSurvey">Ordnance Survey</option>
+          </select>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Bing Maps example</h4>
+          <p id="shortdesc">Example of a Bing Maps layer.</p>
+          <div id="docs">
+            <p>When the Bing Maps tile service doesn't have tiles for a given resolution and region it returns "placeholder" tiles indicating that. Zoom the map beyond level 19 to see the "placeholder" tiles. If you want OpenLayers to display stretched tiles in place of "placeholder" tiles beyond zoom level 19 then set <code>maxZoom</code> to <code>19</code> in the options passed to <code>ol.source.BingMaps</code>.</p>
+            <p>See the <a href="bing-maps.js" target="_blank">bing-maps.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">bing, bing-maps</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=bing-maps" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/bing-maps.js b/examples/bing-maps.js
new file mode 100644
index 0000000..556076c
--- /dev/null
+++ b/examples/bing-maps.js
@@ -0,0 +1,46 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.BingMaps');
+
+
+var styles = [
+  'Road',
+  'Aerial',
+  'AerialWithLabels',
+  'collinsBart',
+  'ordnanceSurvey'
+];
+var layers = [];
+var i, ii;
+for (i = 0, ii = styles.length; i < ii; ++i) {
+  layers.push(new ol.layer.Tile({
+    visible: false,
+    preload: Infinity,
+    source: new ol.source.BingMaps({
+      key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+      imagerySet: styles[i]
+      // use maxZoom 19 to see stretched tiles instead of the BingMaps
+      // "no photos at this zoom level" tiles
+      // maxZoom: 19
+    })
+  }));
+}
+var map = new ol.Map({
+  layers: layers,
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [-6655.5402445057125, 6709968.258934638],
+    zoom: 13
+  })
+});
+
+$('#layer-select').change(function() {
+  var style = $(this).find(':selected').val();
+  var i, ii;
+  for (i = 0, ii = layers.length; i < ii; ++i) {
+    layers[i].setVisible(styles[i] == style);
+  }
+});
+$('#layer-select').trigger('change');
diff --git a/examples/box-selection.html b/examples/box-selection.html
new file mode 100644
index 0000000..4fd498b
--- /dev/null
+++ b/examples/box-selection.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Box selection example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">Box selection example</h4>
+          <p id="shortdesc">Using a DragBox interaction to select features.</p>
+          <div id="docs">
+            <p>This example shows how to use a <code>DragBox</code> interaction to select features. Selected features are added
+            to the feature overlay of a select interaction (<code>ol.interaction.Select</code>) for highlighting.</p>
+            <p>Use <code>SHIFT+drag</code> to draw boxes.</p>
+            <p>See the <a href="box-selection.js" target="_blank">box-selection.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">DragBox, feature, selection, box</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=box-selection" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/box-selection.js b/examples/box-selection.js
new file mode 100644
index 0000000..09db36e
--- /dev/null
+++ b/examples/box-selection.js
@@ -0,0 +1,81 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.events.condition');
+goog.require('ol.interaction');
+goog.require('ol.interaction.DragBox');
+goog.require('ol.interaction.Select');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.OSM');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var vectorSource = new ol.source.GeoJSON({
+  projection: 'EPSG:3857',
+  url: 'data/geojson/countries.geojson'
+});
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    }),
+    new ol.layer.Vector({
+      source: vectorSource
+    })
+  ],
+  renderer: 'canvas',
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+// a normal select interaction to handle click
+var select = new ol.interaction.Select();
+map.addInteraction(select);
+
+var selectedFeatures = select.getFeatures();
+
+// a DragBox interaction used to select features by drawing boxes
+var dragBox = new ol.interaction.DragBox({
+  condition: ol.events.condition.shiftKeyOnly,
+  style: new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: [0, 0, 255, 1]
+    })
+  })
+});
+
+map.addInteraction(dragBox);
+
+var infoBox = document.getElementById('info');
+
+dragBox.on('boxend', function(e) {
+  // features that intersect the box are added to the collection of
+  // selected features, and their names are displayed in the "info"
+  // div
+  var info = [];
+  var extent = dragBox.getGeometry().getExtent();
+  vectorSource.forEachFeatureIntersectingExtent(extent, function(feature) {
+    selectedFeatures.push(feature);
+    info.push(feature.get('name'));
+  });
+  if (info.length > 0) {
+    infoBox.innerHTML = info.join(', ');
+  }
+});
+
+// clear selection when drawing a new box and when clicking on the map
+dragBox.on('boxstart', function(e) {
+  selectedFeatures.clear();
+  infoBox.innerHTML = ' ';
+});
+map.on('click', function() {
+  selectedFeatures.clear();
+  infoBox.innerHTML = ' ';
+});
diff --git a/examples/brightness-contrast.html b/examples/brightness-contrast.html
new file mode 100644
index 0000000..fb499ee
--- /dev/null
+++ b/examples/brightness-contrast.html
@@ -0,0 +1,74 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Brightness/contrast example</title>
+    <style>
+      #reset-brightness {
+        min-width: 138px;
+      }
+      #reset-contrast {
+        min-width: 120px;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+
+          <div id="no-webgl" class="alert alert-error" style="display: none">
+            This example requires a browser that supports <a href="http://get.webgl.org/">WebGL</a>.
+          </div>
+
+          <div class="btn-group">
+            <button id="increase-brightness"><i class="icon-plus"></i></button>
+            <button id="reset-brightness">Brightness</button>
+            <button id="decrease-brightness"><i class="icon-minus"></i></button>
+          </div>
+          <div class="btn-group">
+            <button id="increase-contrast"><i class="icon-plus"></i></button>
+            <button id="reset-contrast">Contrast</button>
+            <button id="decrease-contrast"><i class="icon-minus"></i></button>
+          </div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Brightness/contrast example</h4>
+          <p id="shortdesc">Example of brightness/contrast control on the client (WebGL only).</p>
+          <div id="docs">
+            <p>See the <a href="brightness-contrast.js" target="_blank">brightness-contrast.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">brightness, contrast, webgl</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=brightness-contrast" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/brightness-contrast.js b/examples/brightness-contrast.js
new file mode 100644
index 0000000..b5d38b0
--- /dev/null
+++ b/examples/brightness-contrast.js
@@ -0,0 +1,75 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.has');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.MapQuest');
+
+
+function setResetBrightnessButtonHTML() {
+  resetBrightness.innerHTML = 'Brightness (' +
+      layer.getBrightness().toFixed(3) + ')';
+}
+
+function setResetContrastButtonHTML() {
+  resetContrast.innerHTML = 'Contrast (' + layer.getContrast().toFixed(3) + ')';
+}
+
+if (!ol.has.WEBGL) {
+  var info = document.getElementById('no-webgl');
+  /**
+   * display error message
+   */
+  info.style.display = '';
+} else {
+  var layer = new ol.layer.Tile({
+    source: new ol.source.MapQuest({layer: 'sat'})
+  });
+
+  var map = new ol.Map({
+    layers: [layer],
+    renderer: 'webgl',
+    target: 'map',
+    view: new ol.View({
+      center: [0, 0],
+      zoom: 2
+    })
+  });
+
+  var increaseBrightness = document.getElementById('increase-brightness');
+  var resetBrightness = document.getElementById('reset-brightness');
+  var decreaseBrightness = document.getElementById('decrease-brightness');
+
+  setResetBrightnessButtonHTML();
+
+  increaseBrightness.addEventListener('click', function() {
+    layer.setBrightness(Math.min(layer.getBrightness() + 0.125, 1));
+    setResetBrightnessButtonHTML();
+  }, false);
+  resetBrightness.addEventListener('click', function() {
+    layer.setBrightness(0);
+    setResetBrightnessButtonHTML();
+  }, false);
+  decreaseBrightness.addEventListener('click', function() {
+    layer.setBrightness(Math.max(layer.getBrightness() - 0.125, -1));
+    setResetBrightnessButtonHTML();
+  }, false);
+
+  var increaseContrast = document.getElementById('increase-contrast');
+  var resetContrast = document.getElementById('reset-contrast');
+  var decreaseContrast = document.getElementById('decrease-contrast');
+
+  setResetContrastButtonHTML();
+
+  increaseContrast.addEventListener('click', function() {
+    layer.setContrast(layer.getContrast() + 0.125);
+    setResetContrastButtonHTML();
+  }, false);
+  resetContrast.addEventListener('click', function() {
+    layer.setContrast(1);
+    setResetContrastButtonHTML();
+  }, false);
+  decreaseContrast.addEventListener('click', function() {
+    layer.setContrast(Math.max(layer.getContrast() - 0.125, 0));
+    setResetContrastButtonHTML();
+  }, false);
+}
diff --git a/examples/button-title.html b/examples/button-title.html
new file mode 100644
index 0000000..1247a7a
--- /dev/null
+++ b/examples/button-title.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style type="text/css">
+      .tooltip-inner {
+        white-space: nowrap;
+      }
+    </style>
+    <title>ol3 custom tooltips example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div class="span12">
+          <h4 id="title">Custom tooltips</h4>
+          <p id="shortdesc">
+            This example shows how to customize the buttons tooltips with
+            <a href="http://getbootstrap.com/javascript/#tooltips">Bootstrap</a>.
+          </p>
+          <div id="docs">
+            <p>
+              See the <a href="button-title.js" target="_blank">button-title.js source</a> to see how this is done.
+            </p>
+          </div>
+          <div id="tags">
+            custom, tooltip
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=button-title" type="text/javascript"></script>
+
+  </body>
+
+</html>
diff --git a/examples/button-title.js b/examples/button-title.js
new file mode 100644
index 0000000..b7ae541
--- /dev/null
+++ b/examples/button-title.js
@@ -0,0 +1,27 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [-8730000, 5930000],
+    rotation: Math.PI / 5,
+    zoom: 8
+  })
+});
+
+
+$('.ol-zoom-in, .ol-zoom-out').tooltip({
+  placement: 'right'
+});
+$('.ol-rotate-reset, .ol-attribution button[title]').tooltip({
+  placement: 'left'
+});
diff --git a/examples/canvas-tiles.html b/examples/canvas-tiles.html
new file mode 100644
index 0000000..90eb186
--- /dev/null
+++ b/examples/canvas-tiles.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Canvas tiles example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Canvas tiles example</h4>
+          <p id="shortdesc">Renders tiles with coordinates for debugging.</p>
+          <div id="docs">
+            <p>The black grid tiles are generated on the client with an HTML5 canvas. Note that the tile coordinates are ol3 normalized tile coordinates (origin bottom left), not OSM tile coordinates (origin top left).</p>
+            <p>See the <a href="canvas-tiles.js" target="_blank">canvas-tiles.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">layers, openstreetmap, canvas</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=canvas-tiles" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/canvas-tiles.js b/examples/canvas-tiles.js
new file mode 100644
index 0000000..278fe22
--- /dev/null
+++ b/examples/canvas-tiles.js
@@ -0,0 +1,37 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+goog.require('ol.source.TileDebug');
+goog.require('ol.tilegrid.XYZ');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    }),
+    new ol.layer.Tile({
+      source: new ol.source.TileDebug({
+        projection: 'EPSG:3857',
+        tileGrid: new ol.tilegrid.XYZ({
+          maxZoom: 22
+        })
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: ol.proj.transform(
+        [-0.1275, 51.507222], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 10
+  })
+});
diff --git a/examples/center.html b/examples/center.html
new file mode 100644
index 0000000..bf56e78
--- /dev/null
+++ b/examples/center.html
@@ -0,0 +1,131 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style>
+      .mapcontainer {
+        position: relative;
+        margin-bottom: 20px;
+      }
+      .map {
+        width: 1000px;
+        height: 600px;
+      }
+      div.ol-zoom {
+        top: 178px;
+        left: 158px;
+      }
+      div.ol-attribution {
+        bottom: 30px;
+        right: 50px;
+      }
+      .padding-top {
+        position: absolute;
+        top: 0;
+        left: 0px;
+        width: 1000px;
+        height: 170px;
+        background: rgba(255, 255, 255, 0.5);
+      }
+      .padding-left {
+        position: absolute;
+        top: 170px;
+        left: 0;
+        width: 150px;
+        height: 400px;
+        background: rgba(255, 255, 255, 0.5);
+      }
+      .padding-right {
+        position: absolute;
+        top: 170px;
+        left: 950px;
+        width: 50px;
+        height: 400px;
+        background: rgba(255, 255, 255, 0.5);
+      }
+      .padding-bottom {
+        position: absolute;
+        top: 570px;
+        left: 0px;
+        width: 1000px;
+        height: 30px;
+        background: rgba(255, 255, 255, 0.5);
+      }
+      .center {
+        position: absolute;
+        border: solid 1px black;
+        top: 490px;
+        left: 560px;
+        width: 20px;
+        height: 20px;
+      }
+    </style>
+    <title>Advanced View Positioning example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png">OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12 mapcontainer">
+          <div id="map" class="map"></div>
+          <div class="padding-top"></div>
+          <div class="padding-left"></div>
+          <div class="padding-right"></div>
+          <div class="padding-bottom"></div>
+          <div class="center"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div class="span12">
+          <button id="zoomtoswitzerlandbest">Zoom to Switzerland</button> (best fit),<br/>
+          <button id="zoomtoswitzerlandconstrained">Zoom to Switzerland</button> (respect resolution constraint).<br/>
+          <button id="zoomtoswitzerlandnearest">Zoom to Switzerland</button> (nearest),<br/>
+          <button id="zoomtolausanne">Zoom to Lausanne</button> (with min resolution),<br/>
+          <button id="centerlausanne">Center on Lausanne</button>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Advanced View Positioning example</h4>
+          <p id="shortdesc">This example demonstrates how a map's view can be
+            adjusted so a geometry or coordinate is positioned at a specific
+            pixel location. The map above has top, right, bottom, and left
+            padding applied inside the viewport. The view's <code>fitGeometry</code> method
+            is used to fit a geometry in the view with the same padding. The
+            view's <code>centerOn</code> method is used to position a coordinate (Lausanne)
+            at a specific pixel location (the center of the black box).</p>
+          <div id="docs">
+            <p>Use <code>Alt</code>+<code>Shift</code>+drag to rotate the map.</p>
+            <p>See the <a href="center.js" target="_blank">center.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">center, rotation, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="loader.js?id=center" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/center.js b/examples/center.js
new file mode 100644
index 0000000..2c63b99
--- /dev/null
+++ b/examples/center.js
@@ -0,0 +1,133 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.OSM');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+var source = new ol.source.GeoJSON({
+  projection: 'EPSG:3857',
+  url: 'data/geojson/switzerland.geojson'
+});
+var style = new ol.style.Style({
+  fill: new ol.style.Fill({
+    color: 'rgba(255, 255, 255, 0.6)'
+  }),
+  stroke: new ol.style.Stroke({
+    color: '#319FD3',
+    width: 1
+  }),
+  image: new ol.style.Circle({
+    radius: 5,
+    fill: new ol.style.Fill({
+      color: 'rgba(255, 255, 255, 0.6)'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#319FD3',
+      width: 1
+    })
+  })
+});
+var vectorLayer = new ol.layer.Vector({
+  source: source,
+  style: style
+});
+var view = new ol.View({
+  center: [0, 0],
+  zoom: 1
+});
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    }),
+    vectorLayer
+  ],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: view
+});
+
+var zoomtoswitzerlandbest = document.getElementById('zoomtoswitzerlandbest');
+zoomtoswitzerlandbest.addEventListener('click', function() {
+  var feature = source.getFeatures()[0];
+  var polygon = /** @type {ol.geom.SimpleGeometry} */ (feature.getGeometry());
+  var size = /** @type {ol.Size} */ (map.getSize());
+  view.fitGeometry(
+      polygon,
+      size,
+      {
+        padding: [170, 50, 30, 150],
+        constrainResolution: false
+      }
+  );
+}, false);
+
+var zoomtoswitzerlandconstrained =
+    document.getElementById('zoomtoswitzerlandconstrained');
+zoomtoswitzerlandconstrained.addEventListener('click', function() {
+  var feature = source.getFeatures()[0];
+  var polygon = /** @type {ol.geom.SimpleGeometry} */ (feature.getGeometry());
+  var size = /** @type {ol.Size} */ (map.getSize());
+  view.fitGeometry(
+      polygon,
+      size,
+      {
+        padding: [170, 50, 30, 150]
+      }
+  );
+}, false);
+
+var zoomtoswitzerlandnearest =
+    document.getElementById('zoomtoswitzerlandnearest');
+zoomtoswitzerlandnearest.addEventListener('click', function() {
+  var feature = source.getFeatures()[0];
+  var polygon = /** @type {ol.geom.SimpleGeometry} */ (feature.getGeometry());
+  var size = /** @type {ol.Size} */ (map.getSize());
+  view.fitGeometry(
+      polygon,
+      size,
+      {
+        padding: [170, 50, 30, 150],
+        nearest: true
+      }
+  );
+}, false);
+
+var zoomtolausanne = document.getElementById('zoomtolausanne');
+zoomtolausanne.addEventListener('click', function() {
+  var feature = source.getFeatures()[1];
+  var point = /** @type {ol.geom.SimpleGeometry} */ (feature.getGeometry());
+  var size = /** @type {ol.Size} */ (map.getSize());
+  view.fitGeometry(
+      point,
+      size,
+      {
+        padding: [170, 50, 30, 150],
+        minResolution: 50
+      }
+  );
+}, false);
+
+var centerlausanne = document.getElementById('centerlausanne');
+centerlausanne.addEventListener('click', function() {
+  var feature = source.getFeatures()[1];
+  var point = /** @type {ol.geom.Point} */ (feature.getGeometry());
+  var size = /** @type {ol.Size} */ (map.getSize());
+  view.centerOn(
+      point.getCoordinates(),
+      size,
+      [570, 500]
+  );
+}, false);
diff --git a/examples/cluster.html b/examples/cluster.html
new file mode 100644
index 0000000..13b29c0
--- /dev/null
+++ b/examples/cluster.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Clustering example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Clustering example</h4>
+          <p id="shortdesc">Example of using <code>ol.Cluster</code>.</p>
+          <div id="docs">
+            <p>See the <a href="cluster.js" target="_blank">cluster.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">cluster vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=cluster" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/cluster.js b/examples/cluster.js
new file mode 100644
index 0000000..041c545
--- /dev/null
+++ b/examples/cluster.js
@@ -0,0 +1,80 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Cluster');
+goog.require('ol.source.MapQuest');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.style.Text');
+
+
+var count = 20000;
+var features = new Array(count);
+var e = 4500000;
+for (var i = 0; i < count; ++i) {
+  var coordinates = [2 * e * Math.random() - e, 2 * e * Math.random() - e];
+  features[i] = new ol.Feature(new ol.geom.Point(coordinates));
+}
+
+var source = new ol.source.Vector({
+  features: features
+});
+
+var clusterSource = new ol.source.Cluster({
+  distance: 40,
+  source: source
+});
+
+var styleCache = {};
+var clusters = new ol.layer.Vector({
+  source: clusterSource,
+  style: function(feature, resolution) {
+    var size = feature.get('features').length;
+    var style = styleCache[size];
+    if (!style) {
+      style = [new ol.style.Style({
+        image: new ol.style.Circle({
+          radius: 10,
+          stroke: new ol.style.Stroke({
+            color: '#fff'
+          }),
+          fill: new ol.style.Fill({
+            color: '#3399CC'
+          })
+        }),
+        text: new ol.style.Text({
+          text: size.toString(),
+          fill: new ol.style.Fill({
+            color: '#fff'
+          })
+        })
+      })];
+      styleCache[size] = style;
+    }
+    return style;
+  }
+});
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.MapQuest({layer: 'sat'})
+});
+
+var raw = new ol.layer.Vector({
+  source: source
+});
+
+var map = new ol.Map({
+  layers: [raster, clusters],
+  renderer: 'canvas',
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/custom-controls.html b/examples/custom-controls.html
new file mode 100644
index 0000000..0d6cdf6
--- /dev/null
+++ b/examples/custom-controls.html
@@ -0,0 +1,91 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style type="text/css">
+      .rotate-north {
+        position: absolute;
+        top: 65px;
+        left: 8px;
+        background: rgba(255,255,255,0.4);
+        border-radius: 4px;
+        padding: 2px;
+      }
+      .ol-touch .rotate-north {
+        top: 80px;
+      }
+      .rotate-north a {
+        display: block;
+        color: white;
+        font-size: 16px;
+        font-family: 'Lucida Grande',Verdana,Geneva,Lucida,Arial,Helvetica,sans-serif;
+        font-weight: bold;
+        margin: 1px;
+        text-decoration: none;
+        text-align: center;
+        border-radius: 2px;
+        height: 22px;
+        width: 22px;
+        background: rgba(0,60,136,0.5);
+      }
+      .ol-touch .rotate-north a {
+        font-size: 20px;
+        height: 30px;
+        width: 30px;
+        line-height: 26px;
+      }
+      .rotate-north a:hover {
+        background: rgba(0,60,136,0.7);
+      }
+    </style>
+    <title>ol3 custom controls example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div class="span12">
+          <h4 id="title">Custom controls</h4>
+          <p id="shortdesc">This example shows how to create custom controls.</p>
+          <div id="docs">
+            <p>
+              This example creates a "rotate to north" button.
+              See the <a href="custom-controls.js" target="_blank">custom-controls.js
+              source</a> to see how this is done.
+            </p>
+          </div>
+          <div id="tags">
+            custom, control
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=custom-controls" type="text/javascript"></script>
+
+  </body>
+
+</html>
diff --git a/examples/custom-controls.js b/examples/custom-controls.js
new file mode 100644
index 0000000..8181eca
--- /dev/null
+++ b/examples/custom-controls.js
@@ -0,0 +1,84 @@
+goog.require('ol');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.Control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+/**
+ * Define a namespace for the application.
+ */
+window.app = {};
+var app = window.app;
+
+
+//
+// Define rotate to north control.
+//
+
+
+
+/**
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {Object=} opt_options Control options.
+ */
+app.RotateNorthControl = function(opt_options) {
+
+  var options = opt_options || {};
+
+  var anchor = document.createElement('a');
+  anchor.href = '#rotate-north';
+  anchor.innerHTML = 'N';
+
+  var this_ = this;
+  var handleRotateNorth = function(e) {
+    // prevent #rotate-north anchor from getting appended to the url
+    e.preventDefault();
+    this_.getMap().getView().setRotation(0);
+  };
+
+  anchor.addEventListener('click', handleRotateNorth, false);
+  anchor.addEventListener('touchstart', handleRotateNorth, false);
+
+  var element = document.createElement('div');
+  element.className = 'rotate-north ol-unselectable';
+  element.appendChild(anchor);
+
+  ol.control.Control.call(this, {
+    element: element,
+    target: options.target
+  });
+
+};
+ol.inherits(app.RotateNorthControl, ol.control.Control);
+
+
+//
+// Create map, giving it a rotate to north control.
+//
+
+
+var map = new ol.Map({
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }).extend([
+    new app.RotateNorthControl()
+  ]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2,
+    rotation: 1
+  })
+});
diff --git a/examples/d3.html b/examples/d3.html
new file mode 100644
index 0000000..aa1825d
--- /dev/null
+++ b/examples/d3.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>d3 integration example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">d3 integration example</h4>
+          <p id="shortdesc">Example of using ol3 and d3 together.</p>
+          <div id="docs">
+            <p>The example loads TopoJSON geometries and uses d3 (<code>d3.geo.path</code>) to render these geometries to a canvas element that is then used as the image of an ol3 image layer.</p>
+            <p>See the <a href="d3.js" target="_blank">d3.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">d3</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="http://d3js.org/d3.v3.min.js"></script>
+    <script src="http://d3js.org/topojson.v1.min.js"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=d3" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/d3.js b/examples/d3.js
new file mode 100644
index 0000000..861c092
--- /dev/null
+++ b/examples/d3.js
@@ -0,0 +1,96 @@
+// NOCOMPILE
+// this example uses d3 for which we don't have an externs file.
+goog.require('ol');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.extent');
+goog.require('ol.layer.Image');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.ImageCanvas');
+goog.require('ol.source.Stamen');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.Stamen({
+        layer: 'watercolor'
+      })
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: ol.proj.transform([-97, 38], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 4
+  })
+});
+
+
+/**
+ * Load the topojson data and create an ol.layer.Image for that data.
+ */
+d3.json('data/topojson/us.json', function(error, us) {
+  var features = topojson.feature(us, us.objects.counties);
+
+  /**
+   * This function uses d3 to render the topojson features to a canvas.
+   * @param {ol.Extent} extent Extent.
+   * @param {number} resolution Resolution.
+   * @param {number} pixelRatio Pixel ratio.
+   * @param {ol.Size} size Size.
+   * @param {ol.proj.Projection} projection Projection.
+   * @return {HTMLCanvasElement}
+   */
+  var canvasFunction = function(extent, resolution, pixelRatio,
+      size, projection) {
+    var canvasWidth = size[0];
+    var canvasHeight = size[1];
+
+    var canvas = d3.select(document.createElement('canvas'));
+    canvas.attr('width', canvasWidth).attr('height', canvasHeight);
+
+    var context = canvas.node().getContext('2d');
+
+    var d3Projection = d3.geo.mercator().scale(1).translate([0, 0]);
+    var d3Path = d3.geo.path().projection(d3Projection);
+
+    var pixelBounds = d3Path.bounds(features);
+    var pixelBoundsWidth = pixelBounds[1][0] - pixelBounds[0][0];
+    var pixelBoundsHeight = pixelBounds[1][1] - pixelBounds[0][1];
+
+    var geoBounds = d3.geo.bounds(features);
+    var geoBoundsLeftBottom = ol.proj.transform(
+        geoBounds[0], 'EPSG:4326', projection);
+    var geoBoundsRightTop = ol.proj.transform(
+        geoBounds[1], 'EPSG:4326', projection);
+    var geoBoundsWidth = geoBoundsRightTop[0] - geoBoundsLeftBottom[0];
+    if (geoBoundsWidth < 0) {
+      geoBoundsWidth += ol.extent.getWidth(projection.getExtent());
+    }
+    var geoBoundsHeight = geoBoundsRightTop[1] - geoBoundsLeftBottom[1];
+
+    var widthResolution = geoBoundsWidth / pixelBoundsWidth;
+    var heightResolution = geoBoundsHeight / pixelBoundsHeight;
+    var r = Math.max(widthResolution, heightResolution);
+    var scale = r / (resolution / pixelRatio);
+
+    var center = ol.proj.transform(ol.extent.getCenter(extent),
+        projection, 'EPSG:4326');
+    d3Projection.scale(scale).center(center)
+        .translate([canvasWidth / 2, canvasHeight / 2]);
+    d3Path = d3Path.projection(d3Projection).context(context);
+    d3Path(features);
+    context.stroke();
+
+    return canvas[0][0];
+  };
+
+  var layer = new ol.layer.Image({
+    source: new ol.source.ImageCanvas({
+      canvasFunction: canvasFunction,
+      projection: 'EPSG:3857'
+    })
+  });
+  map.addLayer(layer);
+});
diff --git a/examples/data/Butterfly.png b/examples/data/Butterfly.png
new file mode 100644
index 0000000..0a32d01
Binary files /dev/null and b/examples/data/Butterfly.png differ
diff --git a/examples/data/IGNWMTSCapabilities.xml b/examples/data/IGNWMTSCapabilities.xml
new file mode 100644
index 0000000..03def67
--- /dev/null
+++ b/examples/data/IGNWMTSCapabilities.xml
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" ?><Capabilities version="1.0.0" xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd"><ows:ServiceIdentification><ows:Title>Service de visualisation WMTS</ows:Title><ow [...]
diff --git a/examples/data/WMTSCapabilities.xml b/examples/data/WMTSCapabilities.xml
new file mode 100644
index 0000000..b58c464
--- /dev/null
+++ b/examples/data/WMTSCapabilities.xml
@@ -0,0 +1,374 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd" version="1.0.0">
+	<ows:ServiceIdentification>
+		<ows:Title>Web Map Tile Service</ows:Title>
+		<ows:ServiceType>OGC WMTS</ows:ServiceType>
+		<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
+		<ows:Fees>none</ows:Fees>
+		<ows:AccessConstraints>http://data.wien.gv.at/nutzungsbedingungen</ows:AccessConstraints>
+	</ows:ServiceIdentification>
+	<ows:ServiceProvider>
+		<ows:ProviderName>Magistrat Wien</ows:ProviderName>
+		<ows:ProviderSite xlink:href="http://www.wien.gv.at"/>
+		<ows:ServiceContact>
+			<ows:IndividualName>Gerhard Sommer</ows:IndividualName>
+		</ows:ServiceContact>
+	</ows:ServiceProvider>
+	<ows:OperationsMetadata>
+		<ows:Operation name="GetCapabilities">
+			<ows:DCP>
+				<ows:HTTP>
+					<ows:Get xlink:href="http://maps.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+					<ows:Get xlink:href="http://maps1.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+					<ows:Get xlink:href="http://maps2.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+					<ows:Get xlink:href="http://maps3.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+					<ows:Get xlink:href="http://maps4.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+				</ows:HTTP>
+			</ows:DCP>
+		</ows:Operation>
+		<ows:Operation name="GetTile">
+			<ows:DCP>
+				<ows:HTTP>
+					<ows:Get xlink:href="http://maps.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+					<ows:Get xlink:href="http://maps1.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+					<ows:Get xlink:href="http://maps2.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+					<ows:Get xlink:href="http://maps3.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+					<ows:Get xlink:href="http://maps4.wien.gv.at/wmts">
+						<ows:Constraint name="GetEncoding">
+							<ows:AllowedValues>
+								<ows:Value>RESTful</ows:Value>
+							</ows:AllowedValues>
+						</ows:Constraint>
+					</ows:Get>
+				</ows:HTTP>
+			</ows:DCP>
+		</ows:Operation>
+	</ows:OperationsMetadata>
+	<Contents>
+		<Layer>
+			<ows:Title>Luftbild</ows:Title>
+			<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
+				<ows:LowerCorner>16.17 48.10</ows:LowerCorner>
+				<ows:UpperCorner>16.58 48.33</ows:UpperCorner>
+			</ows:WGS84BoundingBox>
+			<ows:Identifier>lb</ows:Identifier>
+			<Style isDefault="true">
+				<ows:Identifier>farbe</ows:Identifier>
+			</Style>
+			<Format>image/jpeg</Format>
+			<TileMatrixSetLink>
+				<TileMatrixSet>google3857</TileMatrixSet>
+			</TileMatrixSetLink>
+			<ResourceURL format="image/jpeg" template="http://maps1.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps2.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps3.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps4.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps.wien.gv.at/wmts/lb/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+		</Layer>
+		<Layer>
+			<ows:Title>MZK Flächen</ows:Title>
+			<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
+				<ows:LowerCorner>16.17 48.10</ows:LowerCorner>
+				<ows:UpperCorner>16.58 48.33</ows:UpperCorner>
+			</ows:WGS84BoundingBox>
+			<ows:Identifier>fmzk</ows:Identifier>
+			<Style isDefault="true">
+				<ows:Identifier>pastell</ows:Identifier>
+			</Style>
+			<Format>image/jpeg</Format>
+			<TileMatrixSetLink>
+				<TileMatrixSet>google3857</TileMatrixSet>
+			</TileMatrixSetLink>
+			<ResourceURL format="image/jpeg" template="http://maps1.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps2.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps3.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps4.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps.wien.gv.at/wmts/fmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+		</Layer>
+		<Layer>
+			<ows:Title>Flächenwidmungs- und Bebauungsplan</ows:Title>
+			<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
+				<ows:LowerCorner>16.17 48.10</ows:LowerCorner>
+				<ows:UpperCorner>16.58 48.33</ows:UpperCorner>
+			</ows:WGS84BoundingBox>
+			<ows:Identifier>flwbplmzk</ows:Identifier>
+			<Style isDefault="true">
+				<ows:Identifier>rot</ows:Identifier>
+			</Style>
+			<Format>image/jpeg</Format>
+			<TileMatrixSetLink>
+				<TileMatrixSet>google3857</TileMatrixSet>
+			</TileMatrixSetLink>
+			<ResourceURL format="image/jpeg" template="http://maps1.wien.gv.at/wmts/flwbplmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps2.wien.gv.at/wmts/flwbplmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps3.wien.gv.at/wmts/flwbplmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps4.wien.gv.at/wmts/flwbplmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+			<ResourceURL format="image/jpeg" template="http://maps.wien.gv.at/wmts/flwbplmzk/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg" resourceType="tile"/>
+		</Layer>
+		<Layer>
+			<ows:Title>Beschriftung</ows:Title>
+			<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
+				<ows:LowerCorner>16.17 48.10</ows:LowerCorner>
+				<ows:UpperCorner>16.58 48.33</ows:UpperCorner>
+			</ows:WGS84BoundingBox>
+			<ows:Identifier>beschriftung</ows:Identifier>
+			<Style isDefault="true">
+				<ows:Identifier>normal</ows:Identifier>
+			</Style>
+			<Format>image/png</Format>
+			<TileMatrixSetLink>
+				<TileMatrixSet>google3857</TileMatrixSet>
+			</TileMatrixSetLink>
+			<ResourceURL format="image/png" template="http://maps1.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile"/>
+			<ResourceURL format="image/png" template="http://maps2.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile"/>
+			<ResourceURL format="image/png" template="http://maps3.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile"/>
+			<ResourceURL format="image/png" template="http://maps4.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile"/>
+			<ResourceURL format="image/png" template="http://maps.wien.gv.at/wmts/beschriftung/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png" resourceType="tile"/>
+		</Layer>
+		<TileMatrixSet>
+			<!-- -180 85.05112878 -->
+			<ows:Identifier>google3857</ows:Identifier>
+			<ows:BoundingBox crs="urn:ogc:def:crs:EPSG:6.18:3:3857">
+				<ows:LowerCorner>1799448.394855 6124949.747770</ows:LowerCorner>
+				<ows:UpperCorner>1848250.442089 6162571.828177</ows:UpperCorner>
+			</ows:BoundingBox>
+			<ows:SupportedCRS>urn:ogc:def:crs:EPSG:6.18:3:3857</ows:SupportedCRS>
+			<WellKnownScaleSet>urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible</WellKnownScaleSet>
+			<TileMatrix>
+				<ows:Identifier>0</ows:Identifier>
+				<ScaleDenominator>559082264.029</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>1</MatrixWidth>
+				<MatrixHeight>1</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>1</ows:Identifier>
+				<ScaleDenominator>279541132.015</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>2</MatrixWidth>
+				<MatrixHeight>2</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>2</ows:Identifier>
+				<ScaleDenominator>139770566.007</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>4</MatrixWidth>
+				<MatrixHeight>4</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>3</ows:Identifier>
+				<ScaleDenominator>69885283.0036</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>8</MatrixWidth>
+				<MatrixHeight>8</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>4</ows:Identifier>
+				<ScaleDenominator>34942641.5018</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>16</MatrixWidth>
+				<MatrixHeight>16</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>5</ows:Identifier>
+				<ScaleDenominator>17471320.7509</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>32</MatrixWidth>
+				<MatrixHeight>32</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>6</ows:Identifier>
+				<ScaleDenominator>8735660.37545</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>64</MatrixWidth>
+				<MatrixHeight>64</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>7</ows:Identifier>
+				<ScaleDenominator>4367830.18773</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>128</MatrixWidth>
+				<MatrixHeight>128</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>8</ows:Identifier>
+				<ScaleDenominator>2183915.09386</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>256</MatrixWidth>
+				<MatrixHeight>256</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>9</ows:Identifier>
+				<ScaleDenominator>1091957.54693</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>512</MatrixWidth>
+				<MatrixHeight>512</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>10</ows:Identifier>
+				<ScaleDenominator>545978.773466</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>1024</MatrixWidth>
+				<MatrixHeight>1024</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>11</ows:Identifier>
+				<ScaleDenominator>272989.386733</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>2048</MatrixWidth>
+				<MatrixHeight>2048</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>12</ows:Identifier>
+				<ScaleDenominator>136494.693366</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>4096</MatrixWidth>
+				<MatrixHeight>4096</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>13</ows:Identifier>
+				<ScaleDenominator>68247.3466832</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>8192</MatrixWidth>
+				<MatrixHeight>8192</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>14</ows:Identifier>
+				<ScaleDenominator>34123.6733416</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>16384</MatrixWidth>
+				<MatrixHeight>16384</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>15</ows:Identifier>
+				<ScaleDenominator>17061.8366708</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>32768</MatrixWidth>
+				<MatrixHeight>32768</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>16</ows:Identifier>
+				<ScaleDenominator>8530.91833540</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>65536</MatrixWidth>
+				<MatrixHeight>65536</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>17</ows:Identifier>
+				<ScaleDenominator>4265.45916770</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>131072</MatrixWidth>
+				<MatrixHeight>131072</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>18</ows:Identifier>
+				<ScaleDenominator>2132.72958385</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>262144</MatrixWidth>
+				<MatrixHeight>262144</MatrixHeight>
+			</TileMatrix>
+			<TileMatrix>
+				<ows:Identifier>19</ows:Identifier>
+				<ScaleDenominator>1066.36479193</ScaleDenominator>
+				<TopLeftCorner>-20037508.3428 20037508.3428</TopLeftCorner>
+				<TileWidth>256</TileWidth>
+				<TileHeight>256</TileHeight>
+				<MatrixWidth>524288</MatrixWidth>
+				<MatrixHeight>524288</MatrixHeight>
+			</TileMatrix>
+		</TileMatrixSet>
+	</Contents>
+	<ServiceMetadataURL xlink:href="http://maps.wien.gv.at/wmts/1.0.0/WMTSCapabilities.xml"/>
+</Capabilities>
\ No newline at end of file
diff --git a/examples/data/geojson/countries-110m.geojson b/examples/data/geojson/countries-110m.geojson
new file mode 100644
index 0000000..fd580e6
--- /dev/null
+++ b/examples/data/geojson/countries-110m.geojson
@@ -0,0 +1,176 @@
+{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[61.2,35.7],[62.2,35.3],[63,35.4],[63.2,35.9],[64,36],[64.5,36.3],[64.7,37.1],[65.6,37.3],[65.7,37.7],[66.2,37.4],[66.5,37.4],[67.1,37.4],[67.8,37.1],[68.1,37],[68.9,37.3],[69.2,37.2],[69.5,37.6],[70.1,37.6],[70.3,37.7],[70.4,38.1],[70.8,38.5],[71.3,38.3],[71.2,38],[71.5,37.9],[71.4,37.1],[71.8,36.7],[72.2,36.9],[72.6,37],[73.3,37.5],[73.9,37.4],[75,37.4],[75.2,37.1],[74.6,37],[74.1,36. [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[16.3,-5.9],[16.6,-6.6],[16.9,-7.2],[17.1,-7.5],[17.5,-8.1],[18.1,-8],[18.5,-7.8],[19,-8],[19.2,-7.7],[19.4,-7.2],[20,-7.1],[20.1,-6.9],[20.6,-6.9],[20.5,-7.3],[21.7,-7.3],[21.7,-7.9],[21.9,-8.3],[21.8,-8.9],[21.9,-9.5],[22.2,-9.9],[22.2,-11.1],[22.4,-11],[22.8,-11],[23.5,-10.9],[23.9,-10.9],[24,-11.2],[23.9,-11.7],[24.1,-12.2],[23.9,-12.6],[24,-12.9],[21.9,-12.9],[21.9,-16.1],[22.6,-16.9],[23.2,-17.5],[21.4,-17.9],[19, [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[20.6,41.9],[20.5,41.5],[20.6,41.1],[21,40.8],[21,40.6],[20.7,40.4],[20.6,40.1],[20.2,39.6],[20,39.7],[20,39.9],[19.4,40.3],[19.3,40.7],[19.4,41.4],[19.5,41.7],[19.4,41.9],[19.3,42.2],[19.7,42.7],[19.8,42.5],[20.1,42.6],[20.3,42.3],[20.5,42.2],[20.6,41.9]]]},"id":"188"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[51.6,24.2],[51.8,24.3],[51.8,24],[52.6,24.2],[53.4,24.2],[54,24.1],[54.7,24.8],[55.4,25.4],[56.1,26.1],[56.3,25.7],[56.4,24.9],[55.9,24.9],[55.8,24.3],[56,24.1],[55.5,23.9],[55.5,23.5],[55.2,23.1],[55.2,22.7],[55,22.5],[52,23],[51.6,24],[51.6,24.2]]]},"id":"193"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-65.5,-55.2],[-66.5,-55.3],[-67,-54.9],[-67.6,-54.9],[-68.6,-54.9],[-68.6,-52.6],[-68.3,-53.1],[-67.8,-53.8],[-66.5,-54.5],[-65.1,-54.7],[-65.5,-55.2]]],[[[-65,-22.1],[-64.4,-22.8],[-64,-22],[-62.8,-22],[-62.7,-22.2],[-60.8,-23.9],[-60,-24],[-58.8,-24.8],[-57.8,-25.2],[-57.6,-25.6],[-58.6,-27.1],[-57.6,-27.4],[-56.5,-27.5],[-55.7,-27.4],[-54.8,-26.6],[-54.6,-25.7],[-54.1,-25.5],[-53.6,-26.1],[-53.6,-26.9],[-54.5,-27.5] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[43.6,41.1],[45,41.2],[45.2,41],[45.6,40.8],[45.4,40.6],[45.9,40.2],[45.6,39.9],[46,39.6],[46.5,39.5],[46.5,38.8],[46.1,38.7],[45.7,39.3],[45.7,39.5],[45.3,39.5],[45,39.7],[44.8,39.7],[44.4,40],[43.7,40.3],[43.8,40.7],[43.6,41.1]]]},"id":"195"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-59.6,-80],[-59.9,-80.5],[-60.2,-81],[-62.3,-80.9],[-64.5,-80.9],[-65.7,-80.6],[-65.7,-80.5],[-66.3,-80.3],[-64,-80.3],[-61.9,-80.4],[-61.1,-80],[-60.6,-79.6],[-59.6,-80]]],[[[-159.2,-79.5],[-161.1,-79.6],[-162.4,-79.3],[-163,-78.9],[-163.1,-78.9],[-163.7,-78.6],[-163.7,-78.6],[-163.1,-78.2],[-161.2,-78.4],[-160.2,-78.7],[-159.5,-79],[-159.2,-79.5]]],[[[-45.2,-78],[-43.9,-78.5],[-43.5,-79.1],[-43.4,-79.5],[-43.3,-80],[ [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[68.9,-48.6],[69.6,-48.9],[70.5,-49.1],[70.6,-49.3],[70.3,-49.7],[68.7,-49.8],[68.7,-49.2],[68.9,-48.8],[68.9,-48.6]]]}},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[145.4,-40.8],[146.4,-41.1],[146.9,-41],[147.7,-40.8],[148.3,-40.9],[148.4,-42.1],[148,-42.4],[147.9,-43.2],[147.6,-42.9],[146.9,-43.6],[146.7,-43.6],[146,-43.5],[145.4,-42.7],[145.3,-42],[144.7,-41.2],[144.7,-40.7],[145.4,-40.8]]],[[[143.6,-13.8],[143.9,-14.5],[144.6,-14.2],[144.9,-14.6],[145.4,-15],[145.3,-15.4],[145.5,-16.3],[145.6,-16.8],[145.9,-16.9],[146.2,-17.8],[146.1,-18.3],[146.4,-19],[147.5,-19.5],[148.2,-20] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[17,48.1],[16.9,47.7],[16.3,47.7],[16.5,47.5],[16.2,46.9],[16,46.7],[15.1,46.7],[14.6,46.4],[13.8,46.5],[12.4,46.8],[12.2,47.1],[11.2,46.9],[11,46.8],[10.4,46.9],[9.9,46.9],[9.5,47.1],[9.6,47.3],[9.6,47.5],[9.9,47.6],[10.4,47.3],[10.5,47.6],[11.4,47.5],[12.1,47.7],[12.6,47.7],[12.9,47.5],[13,47.6],[12.9,48.3],[13.2,48.4],[13.6,48.9],[14.3,48.6],[14.9,49],[15.3,49],[16,48.7],[16.5,48.8],[17,48.6],[16.9,48.5],[17,48.1]]]},"id":"369"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[45,39.7],[45.3,39.5],[45.7,39.5],[45.7,39.3],[46.1,38.7],[45.5,38.9],[45,39.3],[44.8,39.7],[45,39.7]]],[[[47.4,41.2],[47.8,41.2],[48,41.4],[48.6,41.8],[49.1,41.3],[49.6,40.6],[50.1,40.5],[50.4,40.3],[49.6,40.2],[49.4,39.4],[49.2,39],[48.9,38.8],[48.9,38.3],[48.6,38.3],[48,38.8],[48.4,39.3],[48.1,39.6],[47.7,39.5],[46.5,38.8],[46.5,39.5],[46,39.6],[45.6,39.9],[45.9,40.2],[45.4,40.6],[45.6,40.8],[45.2,41],[45,41.2],[45.2 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[29.3,-4.5],[29.3,-3.3],[29,-2.8],[29.6,-2.9],[29.9,-2.3],[30.5,-2.4],[30.5,-2.8],[30.7,-3],[30.8,-3.4],[30.5,-3.6],[30.1,-4.1],[29.8,-4.5],[29.3,-4.5]]]},"id":"212"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[3.3,51.3],[4,51.3],[5,51.5],[5.6,51],[6.2,50.8],[6,50.1],[5.8,50.1],[5.7,49.5],[4.8,50],[4.3,49.9],[3.6,50.4],[3.1,50.8],[2.7,50.8],[2.5,51.1],[3.3,51.3]]]},"id":"201"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[2.7,6.3],[1.9,6.1],[1.6,6.8],[1.7,9.1],[1.5,9.3],[1.4,9.8],[1.1,10.2],[0.8,10.5],[0.9,11],[1.2,11.1],[1.4,11.5],[1.9,11.6],[2.2,11.9],[2.5,12.2],[2.8,12.2],[3.6,11.7],[3.6,11.3],[3.8,10.7],[3.6,10.3],[3.7,10.1],[3.2,9.4],[2.9,9.1],[2.7,8.5],[2.7,7.9],[2.7,6.3]]]},"id":"203"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-2.8,9.6],[-3.5,9.9],[-4,9.9],[-4.3,9.6],[-4.8,9.8],[-5,10.2],[-5.4,10.4],[-5.5,11],[-5.2,11.4],[-5.2,11.7],[-4.4,12.5],[-4.3,13.2],[-4,13.5],[-3.5,13.3],[-3.1,13.5],[-3,13.8],[-2.2,14.2],[-2,14.6],[-1.1,15],[-0.5,15.1],[-0.3,14.9],[0.4,14.9],[0.3,14.4],[0.4,14],[1,13.3],[1,12.9],[2.2,12.6],[2.2,11.9],[1.9,11.6],[1.4,11.5],[1.2,11.1],[0.9,11],[0,11],[-0.4,11.1],[-0.8,10.9],[-1.2,11],[-2.9,11],[-3,10.4],[-2.8,9.6]]]},"id":"211"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[92.7,22],[92.7,21.3],[92.3,21.5],[92.4,20.7],[92.1,21.2],[92,21.7],[91.8,22.2],[91.4,22.8],[90.5,22.8],[90.6,22.4],[90.3,21.8],[89.8,22],[89.7,21.9],[89.4,22],[89,22.1],[88.9,22.9],[88.5,23.6],[88.7,24.2],[88.1,24.5],[88.3,24.9],[88.9,25.2],[88.2,25.8],[88.6,26.4],[89.4,26],[89.8,26],[89.9,25.3],[90.9,25.1],[91.8,25.1],[92.4,25],[91.9,24.1],[91.5,24.1],[91.2,23.5],[91.7,23],[91.9,23.6],[92.1,23.6],[92.7,22]]]},"id":"199"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[22.7,44.2],[22.9,43.8],[23.3,43.9],[24.1,43.7],[25.6,43.7],[26.1,43.9],[27.2,44.2],[28,43.8],[28.6,43.7],[28,43.3],[27.7,42.6],[28,42],[27.1,42.1],[26.1,41.8],[26.1,41.3],[25.2,41.2],[24.5,41.6],[23.7,41.3],[23,41.3],[22.9,42],[22.4,42.3],[22.5,42.5],[22.4,42.6],[22.6,42.9],[23,43.2],[22.5,43.6],[22.4,44],[22.7,44.2]]]},"id":"210"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-77.5,23.8],[-77.8,23.7],[-78,24.3],[-78.4,24.6],[-78.2,25.2],[-77.9,25.2],[-77.5,24.3],[-77.5,23.8]]],[[[-77.8,26.6],[-78.9,26.4],[-79,26.8],[-78.5,26.9],[-77.9,26.8],[-77.8,26.6]]],[[[-77,26.6],[-77.2,25.9],[-77.4,26],[-77.3,26.5],[-77.8,26.9],[-77.8,27],[-77,26.6]]]]},"id":"197"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[19,44.9],[19.4,44.9],[19.1,44.4],[19.6,44],[19.5,43.6],[19.2,43.5],[19,43.4],[18.7,43.2],[18.6,42.6],[17.7,43],[17.3,43.4],[16.9,43.7],[16.5,44],[16.2,44.4],[15.8,44.8],[16,45.2],[16.3,45],[16.5,45.2],[17,45.2],[17.9,45.1],[18.6,45.1],[19,44.9]]]},"id":"206"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[23.5,53.9],[24.5,53.9],[25.5,54.3],[25.8,54.8],[26.6,55.2],[26.5,55.6],[27.1,55.8],[28.2,56.2],[29.2,55.9],[29.4,55.7],[29.9,55.8],[30.9,55.6],[31,55.1],[30.8,54.8],[31.4,54.2],[31.8,54],[31.7,53.8],[32.4,53.6],[32.7,53.4],[32.3,53.1],[31.5,53.2],[31.3,53.1],[31.5,52.7],[31.8,52.1],[30.9,52],[30.6,51.8],[30.6,51.3],[30.2,51.4],[29.3,51.4],[29,51.6],[28.6,51.4],[28.2,51.6],[27.5,51.6],[26.3,51.8],[25.3,51.9],[24.6,51.9],[24,5 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-89.1,17.8],[-89.2,18],[-89,18],[-88.8,17.9],[-88.5,18.5],[-88.3,18.5],[-88.3,18.4],[-88.1,18.3],[-88.1,18.1],[-88.3,17.6],[-88.2,17.5],[-88.3,17.1],[-88.2,17],[-88.4,16.5],[-88.6,16.3],[-88.7,16.2],[-88.9,15.9],[-89.2,15.9],[-89.2,17],[-89.1,17.8]]]},"id":"202"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-62.8,-22],[-64,-22],[-64.4,-22.8],[-65,-22.1],[-66.3,-21.8],[-67.1,-22.7],[-67.8,-22.9],[-68.2,-21.5],[-68.8,-20.4],[-68.4,-19.4],[-69,-19],[-69.1,-18.3],[-69.6,-17.6],[-69,-16.5],[-69.4,-15.7],[-69.2,-15.3],[-69.3,-15],[-68.9,-14.5],[-68.9,-13.6],[-68.9,-12.9],[-68.7,-12.6],[-69.5,-11],[-68.8,-11],[-68.3,-11],[-68,-10.7],[-67.2,-10.3],[-66.6,-9.9],[-65.3,-9.8],[-65.4,-10.5],[-65.3,-10.9],[-65.4,-11.6],[-64.3,-12.5],[-63.2, [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-57.6,-30.2],[-56.3,-28.9],[-55.2,-27.9],[-54.5,-27.5],[-53.6,-26.9],[-53.6,-26.1],[-54.1,-25.5],[-54.6,-25.7],[-54.4,-25.2],[-54.3,-24.6],[-54.3,-24],[-54.7,-23.8],[-55,-24],[-55.4,-24],[-55.5,-23.6],[-55.6,-22.7],[-55.8,-22.4],[-56.5,-22.1],[-56.9,-22.3],[-57.9,-22.1],[-57.9,-20.7],[-58.2,-20.2],[-57.9,-20],[-57.9,-19.4],[-57.7,-19],[-57.5,-18.2],[-57.7,-17.6],[-58.3,-17.3],[-58.4,-16.9],[-58.2,-16.3],[-60.2,-16.3],[-60.5, [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[114.2,4.5],[114.6,4.9],[115.5,5.4],[115.4,5],[115.3,4.3],[114.9,4.3],[114.7,4],[114.2,4.5]]]},"id":"209"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[91.7,27.8],[92.1,27.5],[92,26.8],[91.2,26.8],[90.4,26.9],[89.7,26.7],[88.8,27.1],[88.8,27.3],[89.5,28],[90,28.3],[90.7,28.1],[91.3,28],[91.7,27.8]]]},"id":"204"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[25.6,-18.5],[25.9,-18.7],[26.2,-19.3],[27.3,-20.4],[27.7,-20.5],[27.7,-20.9],[28,-21.5],[28.8,-21.6],[29.4,-22.1],[28,-22.8],[27.1,-23.6],[26.8,-24.2],[26.5,-24.6],[25.9,-24.7],[25.8,-25.2],[25.7,-25.5],[25,-25.7],[24.2,-25.7],[23.7,-25.4],[23.3,-25.3],[22.8,-25.5],[22.6,-26],[22.1,-26.3],[21.6,-26.7],[20.9,-26.8],[20.7,-26.5],[20.8,-25.9],[20.2,-24.9],[19.9,-24.8],[19.9,-21.8],[20.9,-21.8],[20.9,-18.3],[21.7,-18.2],[23.2,-1 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[15.3,7.4],[16.1,7.5],[16.3,7.8],[16.5,7.7],[16.7,7.5],[18,7.9],[18.4,8.3],[18.9,8.6],[18.8,9],[19.1,9.1],[20.1,9],[21,9.5],[21.7,10.6],[22.2,11],[22.9,11.1],[23,10.7],[23.6,10.1],[23.6,9.7],[23.4,9.3],[23.5,9],[23.8,8.7],[24.6,8.2],[25.1,7.8],[25.1,7.5],[25.8,7],[26.2,6.5],[26.5,5.9],[27.2,5.6],[27.4,5.2],[27,5.1],[26.4,5.2],[25.7,5.3],[25.3,5.2],[25.1,4.9],[24.8,4.9],[24.4,5.1],[23.3,4.6],[22.8,4.7],[22.7,4.6],[22.4,4],[21. [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-63.7,46.6],[-62.9,46.4],[-62,46.4],[-62.5,46],[-62.9,46],[-64.1,46.4],[-64.4,46.7],[-64,47],[-63.7,46.6]]],[[[-61.8,49.1],[-62.3,49.1],[-63.6,49.4],[-64.5,49.9],[-64.2,50],[-62.9,49.7],[-61.8,49.3],[-61.8,49.1]]],[[[-123.5,48.5],[-124,48.4],[-125.7,48.8],[-126,49.2],[-126.9,49.5],[-127,49.8],[-128.1,50],[-128.4,50.5],[-128.4,50.8],[-127.3,50.6],[-126.7,50.4],[-125.8,50.3],[-125.4,50],[-124.9,49.5],[-123.9,49.1],[-123. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[9.6,47.5],[9.6,47.3],[9.5,47.1],[9.9,46.9],[10.4,46.9],[10.4,46.5],[9.9,46.3],[9.2,46.4],[9,46],[8.5,46],[8.3,46.2],[7.8,45.8],[7.3,45.8],[6.8,46],[6.5,46.4],[6,46.3],[6,46.7],[6.8,47.3],[6.7,47.5],[7.2,47.4],[7.5,47.6],[8.3,47.6],[8.5,47.8],[9.6,47.5]]]},"id":"340"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-68.6,-52.6],[-68.6,-54.9],[-67.6,-54.9],[-67,-54.9],[-67.3,-55.3],[-68.1,-55.6],[-68.6,-55.6],[-69.2,-55.5],[-70,-55.2],[-71,-55.1],[-72.3,-54.5],[-73.3,-54],[-74.7,-52.8],[-73.8,-53],[-72.4,-53.7],[-71.1,-54.1],[-70.6,-53.6],[-70.3,-52.9],[-69.3,-52.5],[-68.6,-52.6]]],[[[-68.2,-21.5],[-67.8,-22.9],[-67.1,-22.7],[-67,-23],[-67.3,-24],[-68.4,-24.5],[-68.4,-26.2],[-68.6,-26.5],[-68.3,-26.9],[-69,-27.5],[-69.7,-28.5],[-7 [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[110.3,18.7],[109.5,18.2],[108.7,18.5],[108.6,19.4],[109.1,19.8],[110.2,20.1],[110.8,20.1],[111,19.7],[110.6,19.3],[110.3,18.7]]],[[[127.7,49.8],[129.4,49.4],[130.6,48.7],[131,47.8],[132.5,47.8],[133.4,48.2],[135,48.5],[134.5,47.6],[134.1,47.2],[133.8,46.1],[133.1,45.1],[131.9,45.3],[131,45],[131.3,44.1],[131.1,42.9],[130.6,42.9],[130.6,42.4],[130,43],[129.6,42.4],[128.1,42],[128.2,41.5],[127.3,41.5],[126.9,41.8],[126.2 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-2.9,5],[-3.3,5],[-4,5.2],[-4.6,5.2],[-5.8,5],[-6.5,4.7],[-7.5,4.3],[-7.7,4.4],[-7.6,5.2],[-7.5,5.3],[-7.6,5.7],[-8,6.1],[-8.3,6.2],[-8.6,6.5],[-8.4,6.9],[-8.5,7.4],[-8.4,7.7],[-8.3,7.7],[-8.2,8.1],[-8.3,8.3],[-8.2,8.5],[-7.8,8.6],[-8.1,9.4],[-8.3,9.8],[-8.2,10.1],[-8,10.2],[-7.9,10.3],[-7.6,10.1],[-6.9,10.1],[-6.7,10.4],[-6.5,10.4],[-6.2,10.5],[-6.1,10.1],[-5.8,10.2],[-5.4,10.4],[-5,10.2],[-4.8,9.8],[-4.3,9.6],[-4,9.9],[-3. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[13.1,2.3],[13,2.3],[12.4,2.2],[11.8,2.3],[11.3,2.3],[9.6,2.3],[9.8,3.1],[9.4,3.7],[8.9,3.9],[8.7,4.4],[8.5,4.5],[8.5,4.8],[8.8,5.5],[9.2,6.4],[9.5,6.5],[10.1,7],[10.5,7.1],[11.1,6.6],[11.7,7],[11.8,7.4],[12.1,7.8],[12.2,8.3],[12.8,8.7],[13,9.4],[13.2,9.6],[13.3,10.2],[13.6,10.8],[14.4,11.6],[14.5,11.9],[14.6,12.1],[14.2,12.5],[14.2,12.8],[14.5,12.9],[14.9,12.2],[15,11.6],[14.9,10.9],[15.5,10],[14.9,10],[14.6,9.9],[14.2,10],[ [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[30.8,3.5],[30.8,2.3],[31.2,2.2],[30.9,1.8],[30.5,1.6],[30.1,1.1],[29.9,0.6],[29.8,-0.2],[29.6,-0.6],[29.6,-1.3],[29.3,-1.6],[29.3,-2.2],[29.1,-2.3],[29,-2.8],[29.3,-3.3],[29.3,-4.5],[29.5,-5.4],[29.4,-5.9],[29.6,-6.5],[30.2,-7.1],[30.7,-8.3],[30.3,-8.2],[29,-8.4],[28.7,-8.5],[28.4,-9.2],[28.7,-9.6],[28.5,-10.8],[28.4,-11.8],[28.6,-12],[29.3,-12.4],[29.6,-12.2],[29.7,-13.3],[28.9,-13.2],[28.5,-12.7],[28.2,-12.3],[27.4,-12.1], [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[13,-4.8],[12.6,-4.4],[12.3,-4.6],[11.9,-5],[11.1,-4],[11.9,-3.4],[11.5,-2.8],[11.8,-2.5],[12.5,-2.4],[12.6,-1.9],[13.1,-2.4],[14,-2.5],[14.3,-2],[14.4,-1.3],[14.3,-0.6],[13.8,0],[14.3,1.2],[14,1.4],[13.3,1.3],[13,1.8],[13.1,2.3],[14.3,2.2],[15.1,2],[15.9,1.7],[16,2.3],[16.5,3.2],[17.1,3.7],[17.8,3.6],[18.5,3.5],[18.4,2.9],[18.1,2.4],[17.9,1.7],[17.8,0.9],[17.8,0.3],[17.7,-0.1],[17.6,-0.4],[17.5,-0.7],[16.9,-1.2],[16.4,-1.7], [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-75.4,-0.2],[-75.8,0.1],[-76.3,0.4],[-76.6,0.3],[-77.4,0.4],[-77.7,0.8],[-77.9,0.8],[-78.9,1.4],[-79,1.7],[-78.6,1.8],[-78.7,2.3],[-78.4,2.6],[-77.9,2.7],[-77.5,3.3],[-77.1,3.8],[-77.5,4.1],[-77.3,4.7],[-77.5,5.6],[-77.3,5.8],[-77.5,6.7],[-77.9,7.2],[-77.8,7.7],[-77.4,7.6],[-77.2,7.9],[-77.5,8.5],[-77.4,8.7],[-76.8,8.6],[-76.1,9.3],[-75.7,9.4],[-75.7,9.8],[-75.5,10.6],[-74.9,11.1],[-74.3,11.1],[-74.2,11.3],[-73.4,11.2],[-72. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-83,8.2],[-83.5,8.4],[-83.7,8.7],[-83.6,8.8],[-83.6,9.1],[-83.9,9.3],[-84.3,9.5],[-84.6,9.6],[-84.7,9.9],[-85,10.1],[-84.9,9.8],[-85.1,9.6],[-85.3,9.8],[-85.7,9.9],[-85.8,10.1],[-85.8,10.4],[-85.7,10.8],[-85.9,10.9],[-85.7,11.1],[-85.6,11.2],[-84.9,11],[-84.7,11.1],[-84.4,11],[-84.2,10.8],[-83.9,10.7],[-83.7,10.9],[-83.4,10.4],[-83,10],[-82.5,9.6],[-82.9,9.5],[-82.9,9.1],[-82.7,8.9],[-82.9,8.8],[-82.8,8.6],[-82.9,8.4],[-83,8 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-82.3,23.2],[-81.4,23.1],[-80.6,23.1],[-79.7,22.8],[-79.3,22.4],[-78.3,22.5],[-78,22.3],[-77.1,21.7],[-76.5,21.2],[-76.2,21.2],[-75.6,21],[-75.7,20.7],[-74.9,20.7],[-74.2,20.3],[-74.3,20.1],[-75,19.9],[-75.6,19.9],[-76.3,20],[-77.8,19.9],[-77.1,20.4],[-77.5,20.7],[-78.1,20.7],[-78.5,21],[-78.7,21.6],[-79.3,21.6],[-80.2,21.8],[-80.5,22],[-81.8,22.2],[-82.2,22.4],[-81.8,22.6],[-82.8,22.7],[-83.5,22.2],[-83.9,22.2],[-84.1,21.9] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[17,48.6],[16.5,48.8],[16,48.7],[15.3,49],[14.9,49],[14.3,48.6],[13.6,48.9],[13,49.3],[12.5,49.5],[12.4,50],[12.2,50.3],[13,50.5],[13.3,50.7],[14.1,50.9],[14.3,51.1],[14.6,51],[15,51.1],[15.5,50.8],[16.2,50.7],[16.2,50.4],[16.7,50.2],[16.9,50.5],[17.6,50.4],[17.6,50],[18.4,50],[18.9,49.5],[18.6,49.5],[18.4,49.3],[18.2,49.3],[18.1,49],[17.9,49],[17.9,48.9],[17.5,48.8],[17.1,48.8],[17,48.6]]]},"id":"353"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[9.9,55],[9.9,54.6],[11,54.4],[10.9,54],[12,54.2],[12.5,54.5],[13.6,54.1],[14.1,53.8],[14.4,53.2],[14.1,53],[14.4,52.6],[14.7,52.1],[14.6,51.7],[15,51.1],[14.6,51],[14.3,51.1],[14.1,50.9],[13.3,50.7],[13,50.5],[12.2,50.3],[12.4,50],[12.5,49.5],[13,49.3],[13.6,48.9],[13.2,48.4],[12.9,48.3],[13,47.6],[12.9,47.5],[12.6,47.7],[12.1,47.7],[11.4,47.5],[10.5,47.6],[10.4,47.3],[9.9,47.6],[9.6,47.5],[8.5,47.8],[8.3,47.6],[7.5,47.6],[7 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[43.1,12.7],[43.3,12.4],[43.3,12],[42.7,11.7],[43.1,11.5],[42.8,10.9],[42.6,11.1],[42.3,11],[41.8,11.1],[41.7,11.4],[41.7,11.6],[42,12.1],[42.4,12.5],[42.8,12.5],[43.1,12.7]]]},"id":"219"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[12.7,55.6],[12.1,54.8],[11,55.4],[10.9,55.8],[12.4,56.1],[12.7,55.6]]],[[[10.9,56.5],[10.7,56.1],[10.4,56.2],[9.6,55.5],[9.9,55],[9.3,54.8],[8.5,55],[8.1,55.5],[8.1,56.5],[8.3,56.8],[8.5,57.1],[9.4,57.2],[9.8,57.4],[10.6,57.7],[10.5,57.2],[10.3,56.9],[10.4,56.6],[10.9,56.5]]]]},"id":"218"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-71.7,19.7],[-71.6,19.9],[-70.8,19.9],[-70.2,19.6],[-70,19.6],[-69.8,19.3],[-69.2,19.3],[-69.3,19],[-68.8,19],[-68.3,18.6],[-68.7,18.2],[-69.2,18.4],[-69.6,18.4],[-70,18.4],[-70.1,18.2],[-70.5,18.2],[-70.7,18.4],[-71,18.3],[-71.4,17.6],[-71.7,17.8],[-71.7,18],[-71.7,18.3],[-71.9,18.6],[-71.7,18.8],[-71.6,19.2],[-71.7,19.7]]]},"id":"221"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[12,23.5],[8.6,21.6],[5.7,19.6],[4.3,19.2],[3.2,19.1],[3.1,19.7],[2.7,19.9],[2.1,20.1],[1.8,20.6],[-1.6,22.8],[-4.9,25],[-8.7,27.4],[-8.7,27.6],[-8.7,27.7],[-8.7,28.8],[-7.1,29.6],[-6.1,29.7],[-5.2,30],[-4.9,30.5],[-3.7,30.9],[-3.6,31.6],[-3.1,31.7],[-2.6,32.1],[-1.3,32.3],[-1.1,32.7],[-1.4,32.9],[-1.7,33.9],[-1.8,34.5],[-2.2,35.2],[-1.2,35.7],[-0.1,35.9],[0.5,36.3],[1.5,36.6],[3.2,36.8],[4.8,36.9],[5.3,36.7],[6.3,37.1],[7.3, [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-80.3,-3.4],[-79.8,-2.7],[-80,-2.2],[-80.4,-2.7],[-81,-2.2],[-80.8,-2],[-80.9,-1.1],[-80.6,-0.9],[-80.4,-0.3],[-80,0.4],[-80.1,0.8],[-79.5,1],[-78.9,1.4],[-77.9,0.8],[-77.7,0.8],[-77.4,0.4],[-76.6,0.3],[-76.3,0.4],[-75.8,0.1],[-75.4,-0.2],[-75.2,-0.9],[-75.5,-1.6],[-76.6,-2.6],[-77.8,-3],[-78.5,-3.9],[-78.6,-4.5],[-79.2,-5],[-79.6,-4.5],[-80,-4.3],[-80.4,-4.4],[-80.5,-4.1],[-80.2,-3.8],[-80.3,-3.4]]]},"id":"222"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[34.9,29.5],[34.6,29.1],[34.4,28.3],[34.2,27.8],[33.9,27.6],[33.6,28],[33.1,28.4],[32.4,29.9],[32.3,29.8],[32.7,28.7],[33.3,27.7],[34.1,26.1],[34.5,25.6],[34.8,25],[35.7,23.9],[35.5,23.8],[35.5,23.1],[36.7,22.2],[36.9,22],[32.9,22],[29,22],[25,22],[25,25.7],[25,29.2],[24.7,30],[25,30.7],[24.8,31.1],[25.2,31.6],[26.5,31.6],[27.5,31.3],[28.5,31],[28.9,30.9],[29.7,31.2],[30.1,31.5],[31,31.6],[31.7,31.4],[32,30.9],[32.2,31.3],[33 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[42.4,12.5],[42,12.9],[41.6,13.5],[41.2,13.8],[40.9,14.1],[40,14.5],[39.3,14.5],[39.1,14.7],[38.5,14.5],[37.9,15],[37.6,14.2],[36.4,14.4],[36.3,14.8],[36.8,16.3],[36.9,17],[37.2,17.3],[37.9,17.4],[38.4,18],[39,16.8],[39.3,15.9],[39.8,15.4],[41.2,14.5],[41.7,13.9],[42.3,13.3],[42.6,13],[43.1,12.7],[42.8,12.5],[42.4,12.5]]]},"id":"227"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-9,41.9],[-9,42.6],[-9.4,43],[-8,43.7],[-6.8,43.6],[-5.4,43.6],[-4.3,43.4],[-3.5,43.5],[-1.9,43.4],[-1.5,43],[0.3,42.6],[0.7,42.8],[1.8,42.3],[3,42.5],[3,41.9],[2.1,41.2],[0.8,41],[0.7,40.7],[0.1,40.1],[-0.3,39.3],[0.1,38.7],[-0.5,38.3],[-0.7,37.6],[-1.4,37.4],[-2.1,36.7],[-3.4,36.7],[-4.4,36.7],[-5,36.3],[-5.4,35.9],[-5.9,36],[-6.2,36.4],[-6.5,36.9],[-7.5,37.1],[-7.5,37.4],[-7.2,37.8],[-7,38.1],[-7.4,38.4],[-7.1,39],[-7.5,3 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[24.3,57.8],[24.4,58.4],[24.1,58.3],[23.4,58.6],[23.3,59.2],[24.6,59.5],[25.9,59.6],[26.9,59.4],[28,59.5],[28.1,59.3],[27.4,58.7],[27.7,57.8],[27.3,57.5],[26.5,57.5],[25.6,57.8],[25.2,58],[24.3,57.8]]]},"id":"228"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[37.9,15],[38.5,14.5],[39.1,14.7],[39.3,14.5],[40,14.5],[40.9,14.1],[41.2,13.8],[41.6,13.5],[42,12.9],[42.4,12.5],[42,12.1],[41.7,11.6],[41.7,11.4],[41.8,11.1],[42.3,11],[42.6,11.1],[42.8,10.9],[42.6,10.6],[42.9,10],[43.3,9.5],[43.7,9.2],[46.9,8],[47.8,8],[45,5],[43.7,5],[42.8,4.3],[42.1,4.2],[41.9,3.9],[41.2,3.9],[40.8,4.3],[39.9,3.8],[39.6,3.4],[38.9,3.5],[38.7,3.6],[38.4,3.6],[38.1,3.6],[36.9,4.4],[36.2,4.4],[35.8,4.8],[35 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[28.6,69.1],[28.4,68.4],[30,67.7],[29.1,66.9],[30.2,65.8],[29.5,64.9],[30.4,64.2],[30,63.6],[31.5,62.9],[31.1,62.4],[30.2,61.8],[28.1,60.5],[26.3,60.4],[24.5,60.1],[22.9,59.8],[22.3,60.4],[21.3,60.7],[21.5,61.7],[21.1,62.6],[21.5,63.2],[22.4,63.8],[24.7,64.9],[25.4,65.1],[25.3,65.5],[23.9,66],[23.6,66.4],[23.5,67.9],[22,68.6],[20.6,69.1],[21.2,69.4],[22.4,68.8],[23.7,68.9],[24.7,68.6],[25.7,69.1],[26.2,69.8],[27.7,70.2],[29,6 [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[178.4,-17.3],[178.7,-17.6],[178.6,-18.2],[177.9,-18.3],[177.4,-18.2],[177.3,-17.7],[177.7,-17.4],[178.1,-17.5],[178.4,-17.3]]],[[[179.4,-16.8],[178.7,-17],[178.6,-16.6],[179.1,-16.4],[179.4,-16.4],[179.9,-16.1],[179.9,-16.6],[179.4,-16.8]]],[[[-179.9,-16.5],[-179.9,-16.6],[-179.9,-16.1],[-179.8,-16],[-179.9,-16.5]]]]},"id":"230"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-61.2,-51.9],[-60,-51.3],[-59.1,-51.5],[-58.6,-51.1],[-57.8,-51.5],[-58.1,-51.9],[-59.4,-52.2],[-59.9,-51.9],[-60.7,-52.3],[-61.2,-51.9]]]}},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-52.6,2.5],[-52.9,2.1],[-53.4,2.1],[-53.6,2.3],[-53.8,2.4],[-54.1,2.1],[-54.5,2.3],[-54.3,2.7],[-54.2,3.2],[-54,3.6],[-54.4,4.2],[-54.5,4.9],[-54,5.8],[-53.6,5.6],[-52.9,5.4],[-51.8,4.6],[-51.7,4.2],[-52.2,3.2],[-52.6,2.5]]],[[[9.6,42.2],[9.2,41.4],[8.8,41.6],[8.5,42.3],[8.7,42.6],[9.4,43],[9.6,42.2]]],[[[3.6,50.4],[4.3,49.9],[4.8,50],[5.7,49.5],[5.9,49.4],[6.2,49.5],[6.7,49.2],[8.1,49],[7.6,48.3],[7.5,47.6],[7.2,47.4] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[11.1,-4],[10.1,-3],[9.4,-2.1],[8.8,-1.1],[8.8,-0.8],[9,-0.5],[9.3,0.3],[9.5,1],[9.8,1.1],[11.3,1.1],[11.3,2.3],[11.8,2.3],[12.4,2.2],[13,2.3],[13.1,2.3],[13,1.8],[13.3,1.3],[14,1.4],[14.3,1.2],[13.8,0],[14.3,-0.6],[14.4,-1.3],[14.3,-2],[14,-2.5],[13.1,-2.4],[12.6,-1.9],[12.5,-2.4],[11.8,-2.5],[11.5,-2.8],[11.9,-3.4],[11.1,-4]]]},"id":"235"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-5.7,54.6],[-6.2,53.9],[-7,54.1],[-7.6,54.1],[-7.4,54.6],[-7.6,55.1],[-6.7,55.2],[-5.7,54.6]]],[[[-3,58.6],[-4.1,57.6],[-3.1,57.7],[-2,57.7],[-2.2,56.9],[-3.1,56],[-2.1,55.9],[-2,55.8],[-1.1,54.6],[-0.4,54.5],[0.2,53.3],[0.5,52.9],[1.7,52.7],[1.6,52.1],[1.1,51.8],[1.4,51.3],[0.6,50.8],[-0.8,50.8],[-2.5,50.5],[-3,50.7],[-3.6,50.2],[-4.5,50.3],[-5.2,50],[-5.8,50.2],[-4.3,51.2],[-3.4,51.4],[-3.4,51.4],[-5,51.6],[-5.3,52], [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[41.6,41.5],[41.7,42],[41.5,42.6],[40.9,43],[40.3,43.1],[40,43.4],[40.1,43.6],[40.9,43.4],[42.4,43.2],[43.8,42.7],[43.9,42.6],[44.5,42.7],[45.5,42.5],[45.8,42.1],[46.4,41.9],[46.1,41.7],[46.6,41.2],[46.5,41.1],[46,41.1],[45.2,41.4],[45,41.2],[43.6,41.1],[42.6,41.6],[41.6,41.5]]]},"id":"237"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[1.1,5.9],[-0.5,5.3],[-1.1,5],[-2,4.7],[-2.9,5],[-2.8,5.4],[-3.2,6.3],[-3,7.4],[-2.6,8.2],[-2.8,9.6],[-3,10.4],[-2.9,11],[-1.2,11],[-0.8,10.9],[-0.4,11.1],[0,11],[0,10.7],[0.4,10.2],[0.4,9.5],[0.5,8.7],[0.7,8.3],[0.5,7.4],[0.6,6.9],[0.8,6.3],[1.1,5.9]]]},"id":"238"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-8.4,7.7],[-8.7,7.7],[-8.9,7.3],[-9.2,7.3],[-9.4,7.5],[-9.3,7.9],[-9.8,8.5],[-10,8.4],[-10.2,8.4],[-10.5,8.3],[-10.5,8.7],[-10.7,9],[-10.6,9.3],[-10.8,9.7],[-11.1,10],[-11.9,10],[-12.2,9.9],[-12.4,9.8],[-12.6,9.6],[-12.7,9.3],[-13.2,8.9],[-13.7,9.5],[-14.1,9.9],[-14.3,10],[-14.6,10.2],[-14.7,10.7],[-14.8,10.9],[-15.1,11],[-14.7,11.5],[-14.4,11.5],[-14.1,11.7],[-13.9,11.7],[-13.7,11.8],[-13.8,12.1],[-13.7,12.2],[-13.7,12.6],[ [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-16.8,13.2],[-16.7,13.6],[-15.6,13.6],[-15.4,13.9],[-15.1,13.9],[-14.7,13.6],[-14.4,13.6],[-14,13.8],[-13.8,13.5],[-14.3,13.3],[-14.7,13.3],[-15.1,13.5],[-15.5,13.3],[-15.7,13.3],[-15.9,13.1],[-16.8,13.2]]]},"id":"236"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-15.1,11],[-15.7,11.5],[-16.1,11.5],[-16.3,11.8],[-16.3,12],[-16.6,12.2],[-16.7,12.4],[-16.1,12.5],[-15.8,12.5],[-15.5,12.6],[-13.7,12.6],[-13.7,12.2],[-13.8,12.1],[-13.7,11.8],[-13.9,11.7],[-14.1,11.7],[-14.4,11.5],[-14.7,11.5],[-15.1,11]]]},"id":"242"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[9.5,1],[9.3,1.2],[9.6,2.3],[11.3,2.3],[11.3,1.1],[9.8,1.1],[9.5,1]]]},"id":"224"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[23.7,35.7],[24.2,35.4],[25,35.4],[25.8,35.4],[25.7,35.2],[26.3,35.3],[26.2,35],[24.7,34.9],[24.7,35.1],[23.5,35.3],[23.7,35.7]]],[[[26.6,41.6],[26.3,40.9],[26.1,40.8],[25.4,40.9],[24.9,40.9],[23.7,40.7],[24.4,40.1],[23.9,40],[23.3,40],[22.8,40.5],[22.6,40.3],[22.8,39.7],[23.4,39.2],[23,39],[23.5,38.5],[24,38.2],[24,37.7],[23.1,37.9],[23.4,37.4],[22.8,37.3],[23.2,36.4],[22.5,36.4],[21.7,36.8],[21.3,37.6],[21.1,38.3],[20 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-46.8,82.6],[-43.4,83.2],[-39.9,83.2],[-38.6,83.5],[-35.1,83.6],[-27.1,83.5],[-20.8,82.7],[-22.7,82.3],[-26.5,82.3],[-31.9,82.2],[-31.4,82],[-27.9,82.1],[-24.8,81.8],[-22.9,82.1],[-22.1,81.7],[-23.2,81.2],[-20.6,81.5],[-15.8,81.9],[-12.8,81.7],[-12.2,81.3],[-16.3,80.6],[-16.9,80.3],[-20,80.2],[-17.7,80.1],[-18.9,79.4],[-19.7,78.8],[-19.7,77.6],[-18.5,77],[-20,76.9],[-21.7,76.6],[-19.8,76.1],[-19.6,75.2],[-20.7,75.2],[-19.4,7 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-90.1,13.7],[-90.6,13.9],[-91.2,13.9],[-91.7,14.1],[-92.2,14.5],[-92.2,14.8],[-92.1,15.1],[-92.2,15.3],[-91.7,16.1],[-90.5,16.1],[-90.4,16.4],[-90.6,16.5],[-90.7,16.7],[-91.1,16.9],[-91.5,17.3],[-91,17.3],[-91,17.8],[-90.1,17.8],[-89.1,17.8],[-89.2,17],[-89.2,15.9],[-88.9,15.9],[-88.6,15.7],[-88.5,15.9],[-88.2,15.7],[-88.7,15.3],[-89.2,15.1],[-89.2,14.9],[-89.1,14.7],[-89.4,14.4],[-89.6,14.4],[-89.5,14.2],[-89.7,14.1],[-90.1 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-59.8,8.4],[-59.1,8],[-58.5,7.3],[-58.5,6.8],[-58.1,6.8],[-57.5,6.3],[-57.1,6],[-57.3,5.1],[-57.9,4.8],[-57.9,4.6],[-58,4.1],[-57.6,3.3],[-57.3,3.3],[-57.2,2.8],[-56.5,1.9],[-56.8,1.9],[-57.3,1.9],[-57.7,1.7],[-58.1,1.5],[-58.4,1.5],[-58.5,1.3],[-59,1.3],[-59.6,1.8],[-59.7,2.2],[-60,2.8],[-59.8,3.6],[-59.5,4],[-59.8,4.4],[-60.1,4.6],[-60,5],[-60.2,5.2],[-60.7,5.2],[-61.4,6],[-61.1,6.2],[-61.2,6.7],[-60.5,6.9],[-60.3,7],[-60. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-87.3,13],[-87.5,13.3],[-87.8,13.4],[-87.7,13.8],[-87.9,13.9],[-88.1,14],[-88.5,13.8],[-88.5,14],[-88.8,14.1],[-89.1,14.3],[-89.4,14.4],[-89.1,14.7],[-89.2,14.9],[-89.2,15.1],[-88.7,15.3],[-88.2,15.7],[-88.1,15.7],[-87.9,15.9],[-87.6,15.9],[-87.5,15.8],[-87.4,15.8],[-86.9,15.8],[-86.4,15.8],[-86.1,15.9],[-86,16],[-85.7,16],[-85.4,15.9],[-85.2,15.9],[-85,16],[-84.5,15.9],[-84.4,15.8],[-84.1,15.6],[-83.8,15.4],[-83.4,15.3],[-8 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[18.8,45.9],[19.1,45.5],[19.4,45.2],[19,44.9],[18.6,45.1],[17.9,45.1],[17,45.2],[16.5,45.2],[16.3,45],[16,45.2],[15.8,44.8],[16.2,44.4],[16.5,44],[16.9,43.7],[17.3,43.4],[17.7,43],[18.6,42.6],[18.5,42.5],[17.5,42.8],[16.9,43.2],[16,43.5],[15.2,44.2],[15.4,44.3],[14.9,44.7],[14.9,45.1],[14.3,45.2],[14,44.8],[13.7,45.1],[13.7,45.5],[13.7,45.5],[14.4,45.5],[14.6,45.6],[14.9,45.5],[15.3,45.5],[15.3,45.7],[15.7,45.8],[15.8,46.2],[ [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-73.2,19.9],[-72.6,19.9],[-71.7,19.7],[-71.6,19.2],[-71.7,18.8],[-71.9,18.6],[-71.7,18.3],[-71.7,18],[-72.4,18.2],[-72.8,18.1],[-73.5,18.2],[-73.9,18],[-74.5,18.3],[-74.4,18.7],[-73.4,18.5],[-72.7,18.4],[-72.3,18.7],[-72.8,19.1],[-72.8,19.5],[-73.4,19.6],[-73.2,19.9]]]},"id":"244"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[16.2,46.9],[16.5,47.5],[16.3,47.7],[16.9,47.7],[17,48.1],[17.5,47.9],[17.9,47.8],[18.7,47.9],[18.8,48.1],[19.2,48.1],[19.7,48.3],[19.8,48.2],[20.2,48.3],[20.5,48.6],[20.8,48.6],[21.9,48.3],[22.1,48.4],[22.6,48.2],[22.7,47.9],[22.1,47.7],[21.6,47],[21,46.3],[20.2,46.1],[19.6,46.2],[18.8,45.9],[18.5,45.8],[17.6,46],[16.9,46.4],[16.6,46.5],[16.4,46.8],[16.2,46.9]]]},"id":"361"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[120.7,-10.2],[120.3,-10.3],[119,-9.6],[119.9,-9.4],[120.4,-9.7],[120.8,-10],[120.7,-10.2]]],[[[124.4,-10.1],[123.6,-10.4],[123.5,-10.2],[123.6,-9.9],[124,-9.3],[125,-8.9],[125.1,-9.1],[125.1,-9.4],[124.4,-10.1]]],[[[117.9,-8.1],[118.3,-8.4],[118.9,-8.3],[119.1,-8.7],[118,-8.9],[117.3,-9],[116.7,-9],[117.1,-8.5],[117.6,-8.4],[117.9,-8.1]]],[[[122.9,-8.1],[122.8,-8.6],[121.3,-8.9],[119.9,-8.8],[119.9,-8.4],[120.7,-8.2],[ [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[77.8,35.5],[78.9,34.3],[78.8,33.5],[79.2,33],[79.2,32.5],[78.5,32.6],[78.7,31.5],[79.7,30.9],[81.1,30.2],[80.5,29.7],[80.1,28.8],[81.1,28.4],[82,27.9],[83.3,27.4],[84.7,27.2],[85.3,26.7],[86,26.6],[87.2,26.4],[88.1,26.4],[88.2,26.8],[88,27.4],[88.1,27.9],[88.7,28.1],[88.8,27.3],[88.8,27.1],[89.7,26.7],[90.4,26.9],[91.2,26.8],[92,26.8],[92.1,27.5],[91.7,27.8],[92.5,27.9],[93.4,28.6],[94.6,29.3],[95.4,29],[96.1,29.5],[96.6,28. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-6.2,53.9],[-6,53.2],[-6.8,52.3],[-8.6,51.7],[-10,51.8],[-9.2,52.9],[-9.7,53.9],[-8.3,54.7],[-7.6,55.1],[-7.4,54.6],[-7.6,54.1],[-7,54.1],[-6.2,53.9]]]},"id":"251"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[53.9,37.2],[54.8,37.4],[55.5,38],[56.2,37.9],[56.6,38.1],[57.3,38],[58.4,37.5],[59.2,37.4],[60.4,36.5],[61.1,36.5],[61.2,35.7],[60.8,34.4],[60.5,33.7],[61,33.5],[60.5,33],[60.9,32.2],[60.9,31.5],[61.7,31.4],[61.8,30.7],[60.9,29.8],[61.4,29.3],[61.8,28.7],[62.7,28.3],[62.8,27.4],[63.2,27.2],[63.3,26.8],[61.9,26.2],[61.5,25.1],[59.6,25.4],[58.5,25.6],[57.4,25.7],[57,27],[56.5,27.1],[55.7,27],[54.7,26.5],[53.5,26.8],[52.5,27.6] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[45.4,36],[46.1,35.7],[46.2,35.1],[45.6,34.7],[45.4,34],[46.1,33],[47.3,32.5],[47.8,31.7],[47.7,31],[48,31],[48,30.5],[48.6,29.9],[48,30],[47.3,30.1],[46.6,29.1],[44.7,29.2],[41.9,31.2],[40.4,31.9],[39.2,32.2],[38.8,33.4],[41,34.4],[41.4,35.6],[41.3,36.4],[41.8,36.6],[42.3,37.2],[42.8,37.4],[43.9,37.3],[44.3,37],[44.8,37.2],[45.4,36]]]},"id":"249"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-14.5,66.5],[-14.7,65.8],[-13.6,65.1],[-14.9,64.4],[-17.8,63.7],[-18.7,63.5],[-20,63.6],[-22.8,64],[-21.8,64.4],[-24,64.9],[-22.2,65.1],[-22.2,65.4],[-24.3,65.6],[-23.7,66.3],[-22.1,66.4],[-20.6,65.7],[-19.1,66.3],[-17.8,66],[-16.2,66.5],[-14.5,66.5]]]},"id":"252"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[35.7,32.7],[35.5,32.4],[35.2,32.5],[35,31.9],[35.2,31.8],[35,31.6],[34.9,31.4],[35.4,31.5],[35.4,31.1],[34.9,29.5],[34.3,31.2],[34.6,31.5],[34.5,31.6],[34.8,32.1],[35,32.8],[35.1,33.1],[35.1,33.1],[35.5,33.1],[35.6,33.3],[35.8,33.3],[35.8,32.9],[35.7,32.7],[35.7,32.7]]]},"id":"253"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[15.5,38.2],[15.2,37.4],[15.3,37.1],[15.1,36.6],[14.3,37],[13.8,37.1],[12.4,37.6],[12.6,38.1],[13.7,38],[14.8,38.1],[15.5,38.2]]],[[[9.2,41.2],[9.8,40.5],[9.7,39.2],[9.2,39.2],[8.8,38.9],[8.4,39.2],[8.4,40.4],[8.2,41],[8.7,40.9],[9.2,41.2]]],[[[12.4,46.8],[13.8,46.5],[13.7,46],[13.9,45.6],[13.1,45.7],[12.3,45.4],[12.4,44.9],[12.3,44.6],[12.6,44.1],[13.5,43.6],[14,42.8],[15.1,42],[15.9,42],[16.2,41.7],[15.9,41.5],[16.8,4 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-77.6,18.5],[-76.9,18.4],[-76.4,18.2],[-76.2,17.9],[-76.9,17.9],[-77.2,17.7],[-77.8,17.9],[-78.3,18.2],[-78.2,18.5],[-77.8,18.5],[-77.6,18.5]]]},"id":"255"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[35.5,32.4],[35.7,32.7],[36.8,32.3],[38.8,33.4],[39.2,32.2],[39,32],[37,31.5],[38,30.5],[37.7,30.3],[37.5,30],[36.7,29.9],[36.5,29.5],[36.1,29.2],[35,29.4],[34.9,29.5],[35.4,31.1],[35.4,31.5],[35.5,31.8],[35.5,32.4]]]},"id":"257"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[134.6,34.1],[134.8,33.8],[134.2,33.2],[133.8,33.5],[133.3,33.3],[133,32.7],[132.4,33],[132.4,33.5],[132.9,34.1],[133.5,33.9],[133.9,34.4],[134.6,34.1]]],[[[141,37.1],[140.6,36.3],[140.8,35.8],[140.3,35.1],[139,34.7],[137.2,34.6],[135.8,33.5],[135.1,33.8],[135.1,34.6],[133.3,34.4],[132.2,33.9],[131,33.9],[132,33.1],[131.3,31.5],[130.7,31],[130.2,31.4],[130.4,32.3],[129.8,32.6],[129.4,33.3],[130.4,33.6],[130.9,34.2],[131 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[71,42.3],[70.4,42.1],[69.1,41.4],[68.6,40.7],[68.3,40.7],[68,41.1],[66.7,41.2],[66.5,42],[66,42],[66.1,43],[64.9,43.7],[63.2,43.7],[62,43.5],[61.1,44.4],[60.2,44.8],[58.7,45.5],[58.5,45.6],[55.9,45],[56,41.3],[55.5,41.3],[54.8,42],[54.1,42.3],[52.9,42.1],[52.5,41.8],[52.4,42],[52.7,42.4],[52.5,42.8],[51.3,43.1],[50.9,44],[50.3,44.3],[50.3,44.6],[51.3,44.5],[51.3,45.2],[52.2,45.4],[53,45.3],[53.2,46.2],[53,46.9],[52,46.8],[51 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[41,-0.9],[41.6,-1.7],[40.9,-2.1],[40.6,-2.5],[40.3,-2.6],[40.1,-3.3],[39.8,-3.7],[39.6,-4.3],[39.2,-4.7],[37.8,-3.7],[37.7,-3.1],[34.1,-1.1],[33.9,-1],[33.9,0.1],[34.2,0.5],[34.7,1.2],[35,1.9],[34.6,3.1],[34.5,3.6],[34,4.2],[34.6,4.8],[35.3,5.5],[35.8,5.3],[35.8,4.8],[36.2,4.4],[36.9,4.4],[38.1,3.6],[38.4,3.6],[38.7,3.6],[38.9,3.5],[39.6,3.4],[39.9,3.8],[40.8,4.3],[41.2,3.9],[41.9,3.9],[41,2.8],[41,-0.9]]]},"id":"262"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[71,42.3],[71.2,42.7],[71.8,42.8],[73.5,42.5],[73.6,43.1],[74.2,43.3],[75.6,42.9],[76,43],[77.7,43],[79.1,42.9],[79.6,42.5],[80.3,42.3],[80.1,42.1],[78.5,41.6],[78.2,41.2],[76.9,41.1],[76.5,40.4],[75.5,40.6],[74.8,40.4],[73.8,39.9],[74,39.7],[73.7,39.4],[71.8,39.3],[70.5,39.6],[69.5,39.5],[69.6,40.1],[70.6,39.9],[71,40.2],[71.8,40.1],[73.1,40.9],[71.9,41.4],[71.2,41.1],[70.4,41.5],[71.3,42.2],[71,42.3]]]},"id":"264"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[103.5,10.6],[103.1,11.2],[102.6,12.2],[102.3,13.4],[103,14.2],[104.3,14.4],[105.2,14.3],[106,13.9],[106.5,14.6],[107.4,14.2],[107.6,13.5],[107.5,12.3],[105.8,11.6],[106.2,11],[105.2,10.9],[104.3,10.5],[103.5,10.6]]]},"id":"258"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[128.3,38.6],[129.2,37.4],[129.5,36.8],[129.5,35.6],[129.1,35.1],[128.2,34.9],[127.4,34.5],[126.5,34.4],[126.4,34.9],[126.6,35.7],[126.1,36.7],[126.9,36.9],[126.2,37.7],[126.2,37.8],[126.7,37.8],[127.1,38.3],[127.8,38.3],[128.2,38.4],[128.3,38.6]]]},"id":"345"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[20.8,42.1],[20.7,41.8],[20.6,41.9],[20.5,42.2],[20.3,42.3],[20.1,42.6],[20.3,42.8],[20.5,42.9],[20.6,43.2],[20.8,43.3],[21,43.1],[21.1,43.1],[21.3,42.9],[21.4,42.9],[21.6,42.7],[21.8,42.7],[21.7,42.4],[21.5,42.3],[21.6,42.2],[21.4,42.2],[20.8,42.1]]]},"id":"12244"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[48,30],[48.2,29.5],[48.1,29.3],[48.4,28.6],[47.7,28.5],[47.5,29],[46.6,29.1],[47.3,30.1],[48,30]]]},"id":"270"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[105.2,14.3],[105.5,14.7],[105.6,15.6],[104.8,16.4],[104.7,17.4],[104,18.2],[103.2,18.3],[103,18],[102.4,17.9],[102.1,18.1],[101.1,17.5],[101,18.4],[101.3,19.5],[100.6,19.5],[100.5,20.1],[100.1,20.4],[100.3,20.8],[101.2,21.4],[101.3,21.2],[101.8,21.2],[101.7,22.3],[102.2,22.5],[102.8,21.7],[103.2,20.8],[104.4,20.8],[104.8,19.9],[104.2,19.6],[103.9,19.3],[105.1,18.7],[105.9,17.5],[106.6,16.6],[107.3,15.9],[107.6,15.2],[107.4,1 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[35.8,33.3],[35.6,33.3],[35.5,33.1],[35.1,33.1],[35.5,33.9],[36,34.6],[36,34.6],[36.4,34.6],[36.6,34.2],[36.1,33.8],[35.8,33.3]]]},"id":"275"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-7.7,4.4],[-8,4.4],[-9,4.8],[-9.9,5.6],[-10.8,6.1],[-11.4,6.8],[-11.2,7.1],[-11.1,7.4],[-10.7,7.9],[-10.2,8.4],[-10,8.4],[-9.8,8.5],[-9.3,7.9],[-9.4,7.5],[-9.2,7.3],[-8.9,7.3],[-8.7,7.7],[-8.4,7.7],[-8.5,7.4],[-8.4,6.9],[-8.6,6.5],[-8.3,6.2],[-8,6.1],[-7.6,5.7],[-7.5,5.3],[-7.6,5.2],[-7.7,4.4]]]},"id":"276"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[14.9,22.9],[14.1,22.5],[13.6,23],[12,23.5],[11.6,24.1],[10.8,24.6],[10.3,24.4],[9.9,24.9],[9.9,25.4],[9.3,26.1],[9.7,26.5],[9.6,27.1],[9.8,27.7],[9.7,28.1],[9.9,29],[9.8,29.4],[9.5,30.3],[10,30.5],[10.1,31],[10,31.4],[10.6,31.8],[10.9,32.1],[11.4,32.4],[11.5,33.1],[12.7,32.8],[13.1,32.9],[13.9,32.7],[15.2,32.3],[15.7,31.4],[16.6,31.2],[18,30.8],[19.1,30.3],[19.6,30.5],[20.1,31],[19.8,31.8],[20.1,32.2],[20.9,32.7],[21.5,32.8] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[81.8,7.5],[81.6,6.5],[81.2,6.2],[80.3,6],[79.9,6.8],[79.7,8.2],[80.1,9.8],[80.8,9.3],[81.3,8.6],[81.8,7.5]]]},"id":"337"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[29,-29],[29.3,-29.3],[29,-29.7],[28.8,-30.1],[28.3,-30.2],[28.1,-30.5],[27.7,-30.6],[27,-29.9],[27.5,-29.2],[28.1,-28.9],[28.5,-28.6],[29,-29]]]},"id":"274"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[22.7,54.3],[22.7,54.6],[22.8,54.9],[22.3,55],[21.3,55.2],[21.1,56],[22.2,56.3],[23.9,56.3],[24.9,56.4],[25,56.2],[25.5,56.1],[26.5,55.6],[26.6,55.2],[25.8,54.8],[25.5,54.3],[24.5,53.9],[23.5,53.9],[23.2,54.2],[22.7,54.3]]]},"id":"279"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[6,50.1],[6.2,49.9],[6.2,49.5],[5.9,49.4],[5.7,49.5],[5.8,50.1],[6,50.1]]]},"id":"280"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[21.1,56],[21.1,56.8],[21.6,57.4],[22.5,57.8],[23.3,57],[24.1,57],[24.3,57.8],[25.2,58],[25.6,57.8],[26.5,57.5],[27.3,57.5],[27.8,57.2],[27.9,56.8],[28.2,56.2],[27.1,55.8],[26.5,55.6],[25.5,56.1],[25,56.2],[24.9,56.4],[23.9,56.3],[22.2,56.3],[21.1,56]]]},"id":"273"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-8.8,27.7],[-13.1,27.7],[-12.6,28],[-11.7,28.1],[-10.9,28.8],[-10.4,29.1],[-9.6,29.9],[-9.8,31.2],[-9.4,32],[-9.3,32.6],[-8.7,33.2],[-7.7,33.7],[-6.9,34.1],[-6.2,35.1],[-5.9,35.8],[-5.2,35.8],[-4.6,35.3],[-3.6,35.4],[-2.6,35.2],[-2.2,35.2],[-1.8,34.5],[-1.7,33.9],[-1.4,32.9],[-1.1,32.7],[-1.3,32.3],[-2.6,32.1],[-3.1,31.7],[-3.6,31.6],[-3.7,30.9],[-4.9,30.5],[-5.2,30],[-6.1,29.7],[-7.1,29.6],[-8.7,28.8],[-8.7,27.7],[-8.8,27.7 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[26.6,48.2],[26.9,48.4],[27.5,48.5],[28.3,48.2],[28.7,48.1],[29.1,47.8],[29.1,47.5],[29.4,47.3],[29.6,46.9],[29.9,46.7],[29.8,46.5],[30,46.4],[29.8,46.3],[29.2,46.4],[29.1,46.5],[28.9,46.4],[28.9,46.3],[28.7,45.9],[28.5,45.6],[28.2,45.5],[28.1,45.9],[28.2,46.4],[28.1,46.8],[27.6,47.4],[27.2,47.8],[26.9,48.1],[26.6,48.2]]]},"id":"294"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[49.5,-12.5],[49.8,-12.9],[50.1,-13.6],[50.2,-14.8],[50.5,-15.2],[50.4,-15.7],[50.2,-16],[49.9,-15.4],[49.7,-15.7],[49.9,-16.5],[49.8,-16.9],[49.5,-17.1],[49.4,-18],[49,-19.1],[48.5,-20.5],[47.9,-22.4],[47.5,-23.8],[47.1,-24.9],[46.3,-25.2],[45.4,-25.6],[44.8,-25.3],[44,-25],[43.8,-24.5],[43.7,-23.6],[43.3,-22.8],[43.3,-22.1],[43.4,-21.3],[43.9,-21.2],[43.9,-20.8],[44.4,-20.1],[44.5,-19.4],[44.2,-19],[44,-18.3],[44,-17.4],[44 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-97.1,25.9],[-97.5,25],[-97.7,24.3],[-97.8,22.9],[-97.9,22.4],[-97.7,21.9],[-97.4,21.4],[-97.2,20.6],[-96.5,19.9],[-96.3,19.3],[-95.9,18.8],[-94.8,18.6],[-94.4,18.1],[-93.5,18.4],[-92.8,18.5],[-92,18.7],[-91.4,18.9],[-90.8,19.3],[-90.5,19.9],[-90.5,20.7],[-90.3,21],[-89.6,21.3],[-88.5,21.5],[-87.7,21.5],[-87.1,21.5],[-86.8,21.3],[-86.8,20.8],[-87.4,20.3],[-87.6,19.6],[-87.4,19.5],[-87.6,19],[-87.8,18.3],[-88.1,18.5],[-88.3,1 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[20.6,41.9],[20.7,41.8],[20.8,42.1],[21.4,42.2],[21.6,42.2],[21.9,42.3],[22.4,42.3],[22.9,42],[23,41.3],[22.8,41.3],[22.6,41.1],[22.1,41.1],[21.7,40.9],[21,40.8],[20.6,41.1],[20.5,41.5],[20.6,41.9]]]},"id":"282"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-12.2,14.6],[-11.8,14.8],[-11.7,15.4],[-11.3,15.4],[-10.7,15.1],[-10.1,15.3],[-9.7,15.3],[-9.6,15.5],[-5.5,15.5],[-5.3,16.2],[-5.5,16.3],[-6,20.6],[-6.5,25],[-4.9,25],[-1.6,22.8],[1.8,20.6],[2.1,20.1],[2.7,19.9],[3.1,19.7],[3.2,19.1],[4.3,19.2],[4.3,16.9],[3.7,16.2],[3.6,15.6],[2.7,15.4],[1.4,15.3],[1,15],[0.4,14.9],[-0.3,14.9],[-0.5,15.1],[-1.1,15],[-2,14.6],[-2.2,14.2],[-3,13.8],[-3.1,13.5],[-3.5,13.3],[-4,13.5],[-4.3,13.2 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[99.5,20.2],[99,19.8],[98.3,19.7],[97.8,18.6],[97.4,18.4],[97.9,17.6],[98.5,16.8],[98.9,16.2],[98.5,15.3],[98.2,15.1],[98.4,14.6],[99.1,13.8],[99.2,13.3],[99.2,12.8],[99.6,11.9],[99,11],[98.6,9.9],[98.5,10.7],[98.8,11.4],[98.4,12],[98.5,13.1],[98.1,13.6],[97.8,14.8],[97.6,16.1],[97.2,16.9],[96.5,16.4],[95.4,15.7],[94.8,15.8],[94.2,16],[94.5,17.3],[94.3,18.2],[93.5,19.4],[93.7,19.7],[93.1,19.9],[92.4,20.7],[92.3,21.5],[92.7,21 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[19.8,42.5],[19.7,42.7],[19.3,42.2],[19.4,41.9],[19.2,42],[18.9,42.3],[18.5,42.5],[18.6,42.6],[18.7,43.2],[19,43.4],[19.2,43.5],[19.5,43.4],[19.6,43.2],[20,43.1],[20.3,42.9],[20.3,42.8],[20.1,42.6],[19.8,42.5]]]},"id":"934"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[87.8,49.3],[88.8,49.5],[90.7,50.3],[92.2,50.8],[93.1,50.5],[94.1,50.5],[94.8,50],[95.8,50],[97.3,49.7],[98.2,50.4],[97.8,51],[98.9,52],[100,51.6],[100.9,51.5],[102.1,51.3],[102.3,50.5],[103.7,50.1],[104.6,50.3],[105.9,50.4],[106.9,50.3],[107.9,49.8],[108.5,49.3],[109.4,49.3],[110.7,49.1],[111.6,49.4],[112.9,49.5],[114.4,50.2],[115,50.1],[115.5,49.8],[116.7,49.9],[116.2,49.1],[115.5,48.1],[115.7,47.7],[116.3,47.9],[117.3,47.7 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[34.6,-11.5],[35.3,-11.4],[36.5,-11.7],[36.8,-11.6],[37.5,-11.6],[37.8,-11.3],[38.4,-11.3],[39.5,-10.9],[40.3,-10.3],[40.5,-10.8],[40.4,-11.8],[40.6,-12.6],[40.6,-14.2],[40.8,-14.7],[40.5,-15.4],[40.1,-16.1],[39.5,-16.7],[38.5,-17.1],[37.4,-17.6],[36.3,-18.7],[35.9,-18.8],[35.2,-19.6],[34.8,-19.8],[34.7,-20.5],[35.2,-21.3],[35.4,-21.8],[35.4,-22.1],[35.6,-22.1],[35.5,-23.1],[35.4,-23.5],[35.6,-23.7],[35.5,-24.1],[35,-24.5],[3 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-12.2,14.6],[-12.8,15.3],[-13.4,16],[-14.1,16.3],[-14.6,16.6],[-15.1,16.6],[-15.6,16.4],[-16.1,16.5],[-16.5,16.1],[-16.5,16.7],[-16.3,17.2],[-16.1,18.1],[-16.3,19.1],[-16.4,19.6],[-16.3,20.1],[-16.5,20.6],[-17.1,21],[-16.8,21.3],[-12.9,21.3],[-13.1,22.8],[-12.9,23.3],[-11.9,23.4],[-12,25.9],[-8.7,25.9],[-8.7,27.4],[-4.9,25],[-6.5,25],[-6,20.6],[-5.5,16.3],[-5.3,16.2],[-5.5,15.5],[-9.6,15.5],[-9.7,15.3],[-10.1,15.3],[-10.7,15 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[34.6,-11.5],[34.3,-12.3],[34.6,-13.6],[34.9,-13.6],[35.3,-13.9],[35.7,-14.6],[35.8,-15.9],[35.3,-16.1],[35,-16.8],[34.4,-16.2],[34.3,-15.5],[34.5,-15],[34.5,-14.6],[34.1,-14.4],[33.8,-14.5],[33.2,-14],[32.7,-13.7],[33,-12.8],[33.3,-12.4],[33.1,-11.6],[33.3,-10.8],[33.5,-10.5],[33.2,-9.7],[32.8,-9.2],[33.7,-9.4],[33.9,-9.7],[34.3,-10.2],[34.6,-11.5]]]},"id":"283"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[101.1,6.2],[101.2,5.7],[101.8,5.8],[102.1,6.2],[102.4,6.1],[103,5.5],[103.4,4.9],[103.4,4.2],[103.3,3.7],[103.4,3.4],[103.5,2.8],[103.9,2.5],[104.2,1.6],[104.2,1.3],[103.5,1.2],[102.6,2],[101.4,2.8],[101.3,3.3],[100.7,3.9],[100.6,4.8],[100.2,5.3],[100.3,6],[100.1,6.5],[100.3,6.6],[101.1,6.2]]],[[[118.6,4.5],[117.9,4.1],[117,4.3],[115.9,4.3],[115.5,3.2],[115.1,2.8],[114.6,1.4],[113.8,1.2],[112.9,1.5],[112.4,1.4],[111.8, [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[16.3,-28.6],[15.6,-27.8],[15.2,-27.1],[15,-26.1],[14.7,-25.4],[14.4,-23.9],[14.4,-22.7],[14.3,-22.1],[13.9,-21.7],[13.4,-20.9],[12.8,-19.7],[12.6,-19],[11.8,-18.1],[11.7,-17.3],[12.2,-17.1],[12.8,-16.9],[13.5,-17],[14.1,-17.4],[14.2,-17.4],[18.3,-17.3],[19,-17.8],[21.4,-17.9],[23.2,-17.5],[24,-17.3],[24.7,-17.4],[25.1,-17.6],[25.1,-17.7],[24.5,-17.9],[24.2,-17.9],[23.6,-18.3],[23.2,-17.9],[21.7,-18.2],[20.9,-18.3],[20.9,-21. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[165.8,-21.1],[166.6,-21.7],[167.1,-22.2],[166.7,-22.4],[166.2,-22.1],[165.5,-21.7],[164.8,-21.1],[164.2,-20.4],[164,-20.1],[164.5,-20.1],[165,-20.5],[165.5,-20.8],[165.8,-21.1]]]}},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[2.2,11.9],[2.2,12.6],[1,12.9],[1,13.3],[0.4,14],[0.3,14.4],[0.4,14.9],[1,15],[1.4,15.3],[2.7,15.4],[3.6,15.6],[3.7,16.2],[4.3,16.9],[4.3,19.2],[5.7,19.6],[8.6,21.6],[12,23.5],[13.6,23],[14.1,22.5],[14.9,22.9],[15.1,21.3],[15.5,21],[15.5,20.7],[15.9,20.4],[15.7,20],[15.3,17.9],[15.2,16.6],[14,15.7],[13.5,14.4],[14,14],[14,13.4],[14.6,13.3],[14.5,12.9],[14.2,12.8],[14.2,12.5],[14,12.5],[13.3,13.6],[13.1,13.6],[12.3,13],[11.5,1 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[8.5,4.8],[7.5,4.4],[7.1,4.5],[6.7,4.2],[5.9,4.3],[5.4,4.9],[5,5.6],[4.3,6.3],[3.6,6.3],[2.7,6.3],[2.7,7.9],[2.7,8.5],[2.9,9.1],[3.2,9.4],[3.7,10.1],[3.6,10.3],[3.8,10.7],[3.6,11.3],[3.6,11.7],[3.7,12.6],[4,13],[4.1,13.5],[4.4,13.7],[5.4,13.9],[6.4,13.5],[6.8,13.1],[7.3,13.1],[7.8,13.3],[9,12.8],[9.5,12.9],[10.1,13.3],[10.7,13.2],[11,13.4],[11.5,13.3],[12.3,13],[13.1,13.6],[13.3,13.6],[14,12.5],[14.2,12.5],[14.6,12.1],[14.5,1 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-85.7,11.1],[-86.1,11.4],[-86.5,11.8],[-86.7,12.1],[-87.2,12.5],[-87.7,12.9],[-87.6,13.1],[-87.4,12.9],[-87.3,13],[-87,13],[-86.9,13.3],[-86.7,13.3],[-86.8,13.8],[-86.5,13.8],[-86.3,13.8],[-86.1,14],[-85.8,13.8],[-85.7,14],[-85.5,14.1],[-85.2,14.4],[-85.1,14.6],[-85.1,14.6],[-84.9,14.8],[-84.8,14.8],[-84.6,14.7],[-84.4,14.6],[-84.2,14.7],[-84,14.7],[-83.6,14.9],[-83.5,15],[-83.1,15],[-83.2,14.9],[-83.3,14.7],[-83.2,14.3],[-8 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[6.1,53.5],[6.9,53.5],[7.1,53.1],[6.8,52.2],[6.6,51.9],[6,51.9],[6.2,50.8],[5.6,51],[5,51.5],[4,51.3],[3.3,51.3],[3.8,51.6],[4.7,53.1],[6.1,53.5]]]},"id":"300"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[28.2,71.2],[31.3,70.5],[30,70.2],[31.1,69.6],[29.4,69.2],[28.6,69.1],[29,69.8],[27.7,70.2],[26.2,69.8],[25.7,69.1],[24.7,68.6],[23.7,68.9],[22.4,68.8],[21.2,69.4],[20.6,69.1],[20,69.1],[19.9,68.4],[18,68.6],[17.7,68],[16.8,68],[16.1,67.3],[15.1,66.2],[13.6,64.8],[13.9,64.4],[13.6,64],[12.6,64.1],[11.9,63.1],[12,61.8],[12.6,61.3],[12.3,60.1],[11.5,59.4],[11,58.9],[10.4,59.5],[8.4,58.3],[7,58.1],[5.7,58.6],[5.3,59.7],[5, [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[88.1,27.9],[88,27.4],[88.2,26.8],[88.1,26.4],[87.2,26.4],[86,26.6],[85.3,26.7],[84.7,27.2],[83.3,27.4],[82,27.9],[81.1,28.4],[80.1,28.8],[80.5,29.7],[81.1,30.2],[81.5,30.4],[82.3,30.1],[83.3,29.5],[83.9,29.3],[84.2,28.8],[85,28.6],[85.8,28.2],[87,28],[88.1,27.9]]]},"id":"187"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[173,-40.9],[173.2,-41.3],[174,-40.9],[174.2,-41.3],[174.2,-41.8],[173.9,-42.2],[173.2,-43],[172.7,-43.4],[173.1,-43.9],[172.3,-43.9],[171.5,-44.2],[171.2,-44.9],[170.6,-45.9],[169.8,-46.4],[169.3,-46.6],[168.4,-46.6],[167.8,-46.3],[166.7,-46.2],[166.5,-45.9],[167,-45.1],[168.3,-44.1],[168.9,-43.9],[169.7,-43.6],[170.5,-43],[171.1,-42.5],[171.6,-41.8],[171.9,-41.5],[172.1,-41],[172.8,-40.5],[173,-40.9]]],[[[174.6,-36.2] [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[58.9,21.1],[58.5,20.4],[58,20.5],[57.8,20.2],[57.7,19.7],[57.8,19.1],[57.7,18.9],[57.2,18.9],[56.6,18.6],[56.5,18.1],[56.3,17.9],[55.7,17.9],[55.3,17.6],[55.3,17.2],[54.8,17],[54.2,17],[53.6,16.7],[53.1,16.7],[52.8,17.3],[52,19],[55,20],[55.7,22],[55.2,22.7],[55.2,23.1],[55.5,23.5],[55.5,23.9],[56,24.1],[55.8,24.3],[55.9,24.9],[56.4,24.9],[56.8,24.2],[57.4,23.9],[58.1,23.7],[58.7,23.6],[59.2,23],[59.5,22.7],[59.8,22.5] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[75.2,37.1],[75.9,36.7],[76.2,35.9],[77.8,35.5],[76.9,34.7],[75.8,34.5],[74.2,34.7],[73.7,34.3],[74.1,33.4],[74.5,32.8],[75.3,32.3],[74.4,31.7],[74.4,31],[73.5,30],[72.8,29],[71.8,27.9],[70.6,28],[69.5,26.9],[70.2,26.5],[70.3,25.7],[70.8,25.2],[71,24.4],[68.8,24.4],[68.2,23.7],[67.4,23.9],[67.1,24.7],[66.4,25.4],[64.5,25.2],[62.9,25.2],[61.5,25.1],[61.9,26.2],[63.3,26.8],[63.2,27.2],[62.8,27.4],[62.7,28.3],[61.8,28.7],[61.4,2 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-77.9,7.2],[-78.2,7.5],[-78.4,8.1],[-78.2,8.3],[-78.4,8.4],[-78.6,8.7],[-79.1,9],[-79.6,8.9],[-79.8,8.6],[-80.2,8.3],[-80.4,8.3],[-80.5,8.1],[-80,7.5],[-80.3,7.4],[-80.4,7.3],[-80.9,7.2],[-81.1,7.8],[-81.2,7.6],[-81.5,7.7],[-81.7,8.1],[-82.1,8.2],[-82.4,8.3],[-82.8,8.3],[-82.9,8.1],[-83,8.2],[-82.9,8.4],[-82.8,8.6],[-82.9,8.8],[-82.7,8.9],[-82.9,9.1],[-82.9,9.5],[-82.5,9.6],[-82.2,9.2],[-82.2,9],[-81.8,9],[-81.7,9],[-81.4,8. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-69.6,-17.6],[-69.9,-18.1],[-70.4,-18.3],[-71.4,-17.8],[-71.5,-17.4],[-73.4,-16.4],[-75.2,-15.3],[-76,-14.6],[-76.4,-13.8],[-76.3,-13.5],[-77.1,-12.2],[-78.1,-10.4],[-79,-8.4],[-79.4,-7.9],[-79.8,-7.2],[-80.5,-6.5],[-81.2,-6.1],[-80.9,-5.7],[-81.4,-4.7],[-81.1,-4],[-80.3,-3.4],[-80.2,-3.8],[-80.5,-4.1],[-80.4,-4.4],[-80,-4.3],[-79.6,-4.5],[-79.2,-5],[-78.6,-4.5],[-78.5,-3.9],[-77.8,-3],[-76.6,-2.6],[-75.5,-1.6],[-75.2,-0.9], [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[126.4,8.4],[126.5,7.8],[126.5,7.2],[126.2,6.3],[125.8,7.3],[125.4,6.8],[125.7,6],[125.4,5.6],[124.2,6.2],[123.9,6.9],[124.2,7.4],[123.6,7.8],[123.3,7.4],[122.8,7.5],[122.1,6.9],[121.9,7.2],[122.3,8],[122.9,8.3],[123.5,8.7],[123.8,8.2],[124.6,8.5],[124.8,9],[125.5,9],[125.4,9.8],[126.2,9.3],[126.3,8.8],[126.4,8.4]]],[[[124,10.3],[123.6,10],[123.3,9.3],[123,9],[122.4,9.7],[122.6,10],[122.8,10.3],[122.9,10.9],[123.5,10.9] [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[155.9,-6.8],[155.6,-6.9],[155.2,-6.5],[154.7,-5.9],[154.5,-5.1],[154.7,-5],[154.8,-5.3],[155.1,-5.6],[155.5,-6.2],[156,-6.5],[155.9,-6.8]]],[[[152,-5.5],[151.5,-5.6],[151.3,-5.8],[150.8,-6.1],[150.2,-6.3],[149.7,-6.3],[148.9,-6],[148.3,-5.7],[148.4,-5.4],[149.3,-5.6],[149.8,-5.5],[150,-5],[150.1,-5],[150.2,-5.5],[150.8,-5.5],[151.1,-5.1],[151.6,-4.8],[151.5,-4.2],[152.1,-4.1],[152.3,-4.3],[152.3,-4.9],[152,-5.5]]],[[[1 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[15,51.1],[14.6,51.7],[14.7,52.1],[14.4,52.6],[14.1,53],[14.4,53.2],[14.1,53.8],[14.8,54.1],[16.4,54.5],[17.6,54.9],[18.6,54.7],[18.7,54.4],[19.7,54.4],[20.9,54.3],[22.7,54.3],[23.2,54.2],[23.5,53.9],[23.5,53.5],[23.8,53.1],[23.8,52.7],[23.2,52.5],[23.5,52],[23.5,51.6],[24,50.7],[23.9,50.4],[23.4,50.3],[22.5,49.5],[22.8,49],[22.6,49.1],[21.6,49.5],[20.9,49.3],[20.4,49.4],[19.8,49.2],[19.3,49.6],[18.9,49.4],[18.9,49.5],[18.4,5 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-66.3,18.5],[-65.8,18.4],[-65.6,18.2],[-65.8,18],[-66.6,18],[-67.2,17.9],[-67.2,18.4],[-67.1,18.5],[-66.3,18.5]]]}},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[130.6,42.4],[130.8,42.2],[130.4,42.3],[130,41.9],[129.7,41.6],[129.7,40.9],[129.2,40.7],[129,40.5],[128.6,40.2],[128,40],[127.5,39.8],[127.5,39.3],[127.4,39.2],[127.8,39.1],[128.3,38.6],[128.2,38.4],[127.8,38.3],[127.1,38.3],[126.7,37.8],[126.2,37.8],[126.2,37.7],[125.7,37.9],[125.6,37.8],[125.3,37.7],[125.2,37.9],[125,37.9],[124.7,38.1],[125,38.5],[125.2,38.7],[125.1,38.8],[125.4,39.4],[125.3,39.6],[124.7,39.7],[124.3,39.9] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-9,41.9],[-8.7,42.1],[-8.3,42.3],[-8,41.8],[-7.4,41.8],[-7.3,41.9],[-6.7,41.9],[-6.4,41.4],[-6.9,41.1],[-6.9,40.3],[-7,40.2],[-7.1,39.7],[-7.5,39.6],[-7.1,39],[-7.4,38.4],[-7,38.1],[-7.2,37.8],[-7.5,37.4],[-7.5,37.1],[-7.9,36.8],[-8.4,37],[-8.9,36.9],[-8.7,37.7],[-8.8,38.3],[-9.3,38.4],[-9.5,38.7],[-9.4,39.4],[-9,39.8],[-9,40.2],[-8.8,40.8],[-8.8,41.2],[-9,41.5],[-9,41.9]]]},"id":"315"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-62.7,-22.2],[-62.3,-21.1],[-62.3,-20.5],[-61.8,-19.6],[-60,-19.3],[-59.1,-19.4],[-58.2,-19.9],[-58.2,-20.2],[-57.9,-20.7],[-57.9,-22.1],[-56.9,-22.3],[-56.5,-22.1],[-55.8,-22.4],[-55.6,-22.7],[-55.5,-23.6],[-55.4,-24],[-55,-24],[-54.7,-23.8],[-54.3,-24],[-54.3,-24.6],[-54.4,-25.2],[-54.6,-25.7],[-54.8,-26.6],[-55.7,-27.4],[-56.5,-27.5],[-57.6,-27.4],[-58.6,-27.1],[-57.6,-25.6],[-57.8,-25.2],[-58.8,-24.8],[-60,-24],[-60.8,-2 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[35.5,32.4],[35.5,31.8],[35.4,31.5],[34.9,31.4],[35,31.6],[35.2,31.8],[35,31.9],[35.2,32.5],[35.5,32.4]]]},"id":"884"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[50.8,24.8],[50.7,25.5],[51,26],[51.3,26.1],[51.6,25.8],[51.6,25.2],[51.4,24.6],[51.1,24.6],[50.8,24.8]]]},"id":"316"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[22.7,47.9],[23.1,48.1],[23.8,48],[24.4,48],[24.9,47.7],[25.2,47.9],[25.9,48],[26.2,48.2],[26.6,48.2],[26.9,48.1],[27.2,47.8],[27.6,47.4],[28.1,46.8],[28.2,46.4],[28.1,45.9],[28.2,45.5],[28.7,45.3],[29.1,45.5],[29.6,45.3],[29.6,45],[29.1,44.8],[28.8,44.9],[28.6,43.7],[28,43.8],[27.2,44.2],[26.1,43.9],[25.6,43.7],[24.1,43.7],[23.3,43.9],[22.9,43.8],[22.7,44.2],[22.5,44.4],[22.7,44.6],[22.5,44.7],[22.1,44.5],[21.6,44.8],[21.5,4 [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[143.6,50.7],[144.7,49],[143.2,49.3],[142.6,47.9],[143.5,46.8],[143.5,46.1],[142.7,46.7],[142.1,46],[141.9,46.8],[142,47.8],[141.9,48.9],[142.1,49.6],[142.2,51],[141.6,51.9],[141.7,53.3],[142.6,53.8],[142.2,54.2],[142.7,54.4],[142.9,53.7],[143.3,52.7],[143.2,51.8],[143.6,50.7]]],[[[22.7,54.3],[20.9,54.3],[19.7,54.4],[19.9,54.9],[21.3,55.2],[22.3,55],[22.8,54.9],[22.7,54.6],[22.7,54.3]]],[[[-175,66.6],[-174.3,66.3],[-174 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[30.4,-1.1],[30.8,-1.7],[30.8,-2.3],[30.5,-2.4],[29.9,-2.3],[29.6,-2.9],[29,-2.8],[29.1,-2.3],[29.3,-2.2],[29.3,-1.6],[29.6,-1.3],[29.8,-1.4],[30.4,-1.1]]]},"id":"319"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[42.8,16.3],[42.6,16.8],[42.3,17.1],[42.3,17.5],[41.8,17.8],[41.2,18.7],[40.9,19.5],[40.2,20.2],[39.8,20.3],[39.1,21.3],[39,22],[39.1,22.6],[38.5,23.7],[38,24.1],[37.5,24.3],[37.2,24.9],[37.2,25.1],[36.9,25.6],[36.6,25.8],[36.2,26.6],[35.6,27.4],[35.1,28.1],[34.6,28.1],[34.8,28.6],[34.8,29],[35,29.4],[36.1,29.2],[36.5,29.5],[36.7,29.9],[37.5,30],[37.7,30.3],[38,30.5],[37,31.5],[39,32],[39.2,32.2],[40.4,31.9],[41.9,31.2],[44.7 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[34,9.5],[33.8,9.5],[33.8,10],[33.7,10.3],[33.2,10.7],[33.1,11.4],[33.2,12.2],[32.7,12.2],[32.7,12],[32.1,12],[32.3,11.7],[32.4,11.1],[31.9,10.5],[31.4,9.8],[30.8,9.7],[30,10.3],[29.6,10.1],[29.5,9.8],[29,9.6],[29,9.4],[28,9.4],[27.8,9.6],[27.1,9.6],[26.8,9.5],[26.5,9.6],[26,10.1],[25.8,10.4],[25.1,10.3],[24.8,9.8],[24.5,8.9],[24.2,8.7],[23.9,8.6],[23.8,8.7],[23.5,9],[23.4,9.3],[23.6,9.7],[23.6,10.1],[23,10.7],[22.9,11.1],[22 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[34,9.5],[34,8.7],[33.8,8.4],[33.3,8.4],[33,7.8],[33.6,7.7],[34.1,7.2],[34.3,6.8],[34.7,6.6],[35.3,5.5],[34.6,4.8],[34,4.2],[33.4,3.8],[32.7,3.8],[31.9,3.6],[31.2,3.8],[30.8,3.5],[30,4.2],[29.7,4.6],[29.2,4.4],[28.7,4.5],[28.4,4.3],[28,4.4],[27.4,5.2],[27.2,5.6],[26.5,5.9],[26.2,6.5],[25.8,7],[25.1,7.5],[25.1,7.8],[24.6,8.2],[23.9,8.6],[24.2,8.7],[24.5,8.9],[24.8,9.8],[25.1,10.3],[25.8,10.4],[26,10.1],[26.5,9.6],[26.8,9.5],[2 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-16.7,13.6],[-17.1,14.4],[-17.6,14.7],[-17.2,14.9],[-16.7,15.6],[-16.5,16.1],[-16.1,16.5],[-15.6,16.4],[-15.1,16.6],[-14.6,16.6],[-14.1,16.3],[-13.4,16],[-12.8,15.3],[-12.2,14.6],[-12.1,14],[-11.9,13.4],[-11.6,13.1],[-11.5,12.8],[-11.5,12.4],[-11.7,12.4],[-12.2,12.5],[-12.3,12.4],[-12.5,12.3],[-13.2,12.6],[-13.7,12.6],[-15.5,12.6],[-15.8,12.5],[-16.1,12.5],[-16.7,12.4],[-16.8,13.2],[-15.9,13.1],[-15.7,13.3],[-15.5,13.3],[-15 [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[162.1,-10.5],[162.4,-10.8],[161.7,-10.8],[161.3,-10.2],[161.9,-10.4],[162.1,-10.5]]],[[[160.9,-9.9],[160.5,-9.9],[159.8,-9.8],[159.6,-9.6],[159.7,-9.2],[160.4,-9.4],[160.7,-9.6],[160.9,-9.9]]],[[[161.7,-9.6],[161.5,-9.8],[160.8,-8.9],[160.6,-8.3],[160.9,-8.3],[161.3,-9.1],[161.7,-9.6]]],[[[159.9,-8.3],[159.9,-8.5],[159.1,-8.1],[158.6,-7.8],[158.2,-7.4],[158.4,-7.3],[158.8,-7.6],[159.6,-8],[159.9,-8.3]]],[[[157.5,-7.3], [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-11.4,6.8],[-11.7,6.9],[-12.4,7.3],[-12.9,7.8],[-13.1,8.2],[-13.2,8.9],[-12.7,9.3],[-12.6,9.6],[-12.4,9.8],[-12.2,9.9],[-11.9,10],[-11.1,10],[-10.8,9.7],[-10.6,9.3],[-10.7,9],[-10.5,8.7],[-10.5,8.3],[-10.2,8.4],[-10.7,7.9],[-11.1,7.4],[-11.2,7.1],[-11.4,6.8]]]},"id":"331"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-87.8,13.4],[-87.9,13.1],[-88.5,13.2],[-88.8,13.3],[-89.3,13.5],[-89.8,13.5],[-90.1,13.7],[-90.1,13.9],[-89.7,14.1],[-89.5,14.2],[-89.6,14.4],[-89.4,14.4],[-89.1,14.3],[-88.8,14.1],[-88.5,14],[-88.5,13.8],[-88.1,14],[-87.9,13.9],[-87.7,13.8],[-87.8,13.4]]]},"id":"225"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[20.9,45.4],[21.5,45.2],[21.6,44.8],[22.1,44.5],[22.5,44.7],[22.7,44.6],[22.5,44.4],[22.7,44.2],[22.4,44],[22.5,43.6],[23,43.2],[22.6,42.9],[22.4,42.6],[22.5,42.5],[22.4,42.3],[21.9,42.3],[21.6,42.2],[21.5,42.3],[21.7,42.4],[21.8,42.7],[21.6,42.7],[21.4,42.9],[21.3,42.9],[21.1,43.1],[21,43.1],[20.8,43.3],[20.6,43.2],[20.5,42.9],[20.3,42.8],[20.3,42.9],[20,43.1],[19.6,43.2],[19.5,43.4],[19.2,43.5],[19.5,43.6],[19.6,44],[19.1,4 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-57.1,6],[-55.9,5.8],[-55.8,6],[-55,6],[-54,5.8],[-54.5,4.9],[-54.4,4.2],[-54,3.6],[-54.2,3.2],[-54.3,2.7],[-54.5,2.3],[-55.1,2.5],[-55.6,2.4],[-56,2.5],[-56.1,2.2],[-55.9,2],[-56,1.8],[-56.5,1.9],[-57.2,2.8],[-57.3,3.3],[-57.6,3.3],[-58,4.1],[-57.9,4.6],[-57.9,4.8],[-57.3,5.1],[-57.1,6]]]},"id":"339"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[18.9,49.5],[18.9,49.4],[19.3,49.6],[19.8,49.2],[20.4,49.4],[20.9,49.3],[21.6,49.5],[22.6,49.1],[22.3,48.8],[22.1,48.4],[21.9,48.3],[20.8,48.6],[20.5,48.6],[20.2,48.3],[19.8,48.2],[19.7,48.3],[19.2,48.1],[18.8,48.1],[18.7,47.9],[17.9,47.8],[17.5,47.9],[17,48.1],[16.9,48.5],[17,48.6],[17.1,48.8],[17.5,48.8],[17.9,48.9],[17.9,49],[18.1,49],[18.2,49.3],[18.4,49.3],[18.6,49.5],[18.9,49.5]]]},"id":"333"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[13.8,46.5],[14.6,46.4],[15.1,46.7],[16,46.7],[16.2,46.9],[16.4,46.8],[16.6,46.5],[15.8,46.2],[15.7,45.8],[15.3,45.7],[15.3,45.5],[14.9,45.5],[14.6,45.6],[14.4,45.5],[13.7,45.5],[13.9,45.6],[13.7,46],[13.8,46.5]]]},"id":"334"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[22.2,65.7],[21.2,65],[21.4,64.4],[19.8,63.6],[17.8,62.7],[17.1,61.3],[17.8,60.6],[18.8,60.1],[17.9,59],[16.8,58.7],[16.4,57],[15.9,56.1],[14.7,56.2],[14.1,55.4],[12.9,55.4],[12.6,56.3],[11.8,57.4],[11,58.9],[11.5,59.4],[12.3,60.1],[12.6,61.3],[12,61.8],[11.9,63.1],[12.6,64.1],[13.6,64],[13.9,64.4],[13.6,64.8],[15.1,66.2],[16.1,67.3],[16.8,68],[17.7,68],[18,68.6],[19.9,68.4],[20,69.1],[20.6,69.1],[22,68.6],[23.5,67.9],[23.6,6 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[32.1,-26.7],[31.9,-27.2],[31.3,-27.3],[30.7,-26.7],[30.7,-26.4],[30.9,-26],[31,-25.7],[31.3,-25.7],[31.8,-25.8],[32,-26.3],[32.1,-26.7]]]},"id":"342"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[38.8,33.4],[36.8,32.3],[35.7,32.7],[35.7,32.7],[35.8,32.9],[35.8,33.3],[36.1,33.8],[36.6,34.2],[36.4,34.6],[36,34.6],[35.9,35.4],[36.1,35.8],[36.4,36],[36.7,36.3],[36.7,36.8],[37.1,36.6],[38.2,36.9],[38.7,36.7],[39.5,36.7],[40.7,37.1],[41.2,37.1],[42.3,37.2],[41.8,36.6],[41.3,36.4],[41.4,35.6],[41,34.4],[38.8,33.4]]]},"id":"343"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[14.5,12.9],[14.6,13.3],[14,13.4],[14,14],[13.5,14.4],[14,15.7],[15.2,16.6],[15.3,17.9],[15.7,20],[15.9,20.4],[15.5,20.7],[15.5,21],[15.1,21.3],[14.9,22.9],[15.9,23.4],[19.8,21.5],[23.8,19.6],[23.9,15.6],[23,15.7],[22.6,14.9],[22.3,14.3],[22.5,14.1],[22.2,13.8],[22.3,13.4],[22,13],[21.9,12.6],[22.3,12.6],[22.5,12.3],[22.5,11.7],[22.9,11.4],[22.9,11.1],[22.2,11],[21.7,10.6],[21,9.5],[20.1,9],[19.1,9.1],[18.8,9],[18.9,8.6],[18. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[1.9,6.1],[1.1,5.9],[0.8,6.3],[0.6,6.9],[0.5,7.4],[0.7,8.3],[0.5,8.7],[0.4,9.5],[0.4,10.2],[0,10.7],[0,11],[0.9,11],[0.8,10.5],[1.1,10.2],[1.4,9.8],[1.5,9.3],[1.7,9.1],[1.6,6.8],[1.9,6.1]]]},"id":"349"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[102.6,12.2],[101.7,12.6],[100.8,12.6],[101,13.4],[100.1,13.4],[100,12.3],[99.5,10.8],[99.2,10],[99.2,9.2],[99.9,9.2],[100.3,8.3],[100.5,7.4],[101,6.9],[101.6,6.7],[102.1,6.2],[101.8,5.8],[101.2,5.7],[101.1,6.2],[100.3,6.6],[100.1,6.5],[99.7,6.8],[99.5,7.3],[99,7.9],[98.5,8.4],[98.3,7.8],[98.2,8.4],[98.3,9],[98.6,9.9],[99,11],[99.6,11.9],[99.2,12.8],[99.2,13.3],[99.1,13.8],[98.4,14.6],[98.2,15.1],[98.5,15.3],[98.9,16.2],[98.5 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[71,40.2],[70.6,39.9],[69.6,40.1],[69.5,39.5],[70.5,39.6],[71.8,39.3],[73.7,39.4],[73.9,38.5],[74.3,38.6],[74.9,38.4],[74.8,38],[75,37.4],[73.9,37.4],[73.3,37.5],[72.6,37],[72.2,36.9],[71.8,36.7],[71.4,37.1],[71.5,37.9],[71.2,38],[71.3,38.3],[70.8,38.5],[70.4,38.1],[70.3,37.7],[70.1,37.6],[69.5,37.6],[69.2,37.2],[68.9,37.3],[68.1,37],[67.8,37.1],[68.4,38.2],[68.2,38.9],[67.4,39.1],[67.7,39.6],[68.5,39.5],[69,40.1],[69.3,40.7] [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[61.2,35.7],[61.1,36.5],[60.4,36.5],[59.2,37.4],[58.4,37.5],[57.3,38],[56.6,38.1],[56.2,37.9],[55.5,38],[54.8,37.4],[53.9,37.2],[53.7,37.9],[53.9,39],[53.1,39.3],[53.4,40],[52.7,40],[52.9,40.9],[53.9,40.6],[54.7,41],[54,41.6],[53.7,42.1],[52.9,41.9],[52.8,41.1],[52.5,41.8],[52.9,42.1],[54.1,42.3],[54.8,42],[55.5,41.3],[56,41.3],[57.1,41.3],[56.9,41.8],[57.8,42.2],[58.6,42.8],[60,42.2],[60.1,41.4],[60.5,41.2],[61.5,41.3],[61.9 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[125,-8.9],[125.1,-8.7],[125.9,-8.4],[126.6,-8.4],[127,-8.3],[127.3,-8.4],[127,-8.7],[125.9,-9.1],[125.1,-9.4],[125.1,-9.1],[125,-8.9]]]},"id":"370"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-61.7,10.8],[-61.1,10.9],[-60.9,10.9],[-60.9,10.1],[-61.8,10],[-62,10.1],[-61.7,10.4],[-61.7,10.8]]]},"id":"351"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[9.5,30.3],[9.1,32.1],[8.4,32.5],[8.4,32.7],[7.6,33.3],[7.5,34.1],[8.1,34.7],[8.4,35.5],[8.2,36.4],[8.4,36.9],[9.5,37.3],[10.2,37.2],[10.2,36.7],[11,37.1],[11.1,36.9],[10.6,36.4],[10.6,35.9],[10.9,35.7],[10.8,34.8],[10.1,34.3],[10.3,33.8],[10.9,33.8],[11.1,33.3],[11.5,33.1],[11.4,32.4],[10.9,32.1],[10.6,31.8],[10,31.4],[10.1,31],[10,30.5],[9.5,30.3]]]},"id":"354"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[36.9,41.3],[38.3,40.9],[39.5,41.1],[40.4,41],[41.6,41.5],[42.6,41.6],[43.6,41.1],[43.8,40.7],[43.7,40.3],[44.4,40],[44.8,39.7],[44.1,39.4],[44.4,38.3],[44.2,38],[44.8,37.2],[44.3,37],[43.9,37.3],[42.8,37.4],[42.3,37.2],[41.2,37.1],[40.7,37.1],[39.5,36.7],[38.7,36.7],[38.2,36.9],[37.1,36.6],[36.7,36.8],[36.7,36.3],[36.4,36],[36.1,35.8],[35.8,36.3],[36.2,36.7],[35.6,36.6],[34.7,36.8],[34,36.2],[32.5,36.1],[31.7,36.6],[30 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[121.8,24.4],[121.2,22.8],[120.7,22],[120.2,22.8],[120.1,23.6],[120.7,24.5],[121.5,25.3],[122,25],[121.8,24.4]]]},"id":"3165"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[33.9,-0.9],[34.1,-1.1],[37.7,-3.1],[37.8,-3.7],[39.2,-4.7],[38.7,-5.9],[38.8,-6.5],[39.4,-6.8],[39.5,-7.1],[39.2,-7.7],[39.3,-8],[39.2,-8.5],[39.5,-9.1],[39.9,-10.1],[40.3,-10.3],[39.5,-10.9],[38.4,-11.3],[37.8,-11.3],[37.5,-11.6],[36.8,-11.6],[36.5,-11.7],[35.3,-11.4],[34.6,-11.5],[34.3,-10.2],[33.9,-9.7],[33.7,-9.4],[32.8,-9.2],[32.2,-8.9],[31.6,-8.8],[31.2,-8.6],[30.7,-8.3],[30.2,-7.1],[29.6,-6.5],[29.4,-5.9],[29.5,-5.4], [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[31.9,-1],[30.8,-1],[30.4,-1.1],[29.8,-1.4],[29.6,-1.3],[29.6,-0.6],[29.8,-0.2],[29.9,0.6],[30.1,1.1],[30.5,1.6],[30.9,1.8],[31.2,2.2],[30.8,2.3],[30.8,3.5],[31.2,3.8],[31.9,3.6],[32.7,3.8],[33.4,3.8],[34,4.2],[34.5,3.6],[34.6,3.1],[35,1.9],[34.7,1.2],[34.2,0.5],[33.9,0.1],[33.9,-0.9],[31.9,-1]]]},"id":"359"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[31.8,52.1],[32.2,52.1],[32.4,52.3],[32.7,52.2],[33.8,52.3],[34.4,51.8],[34.1,51.6],[34.2,51.3],[35,51.2],[35.4,50.8],[35.4,50.6],[36.6,50.2],[37.4,50.4],[38,49.9],[38.6,49.9],[40.1,49.6],[40.1,49.3],[39.7,48.8],[39.9,48.2],[39.7,47.9],[38.8,47.8],[38.3,47.5],[38.2,47.1],[37.4,47],[36.8,46.7],[35.8,46.6],[35,46.3],[35,45.7],[35.5,45.4],[36.5,45.5],[36.3,45.1],[35.2,44.9],[33.9,44.4],[33.3,44.6],[33.5,45],[32.5,45.3],[32.6,45. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-57.6,-30.2],[-57,-30.1],[-56,-30.9],[-55.6,-30.9],[-54.6,-31.5],[-53.8,-32],[-53.2,-32.7],[-53.7,-33.2],[-53.4,-33.8],[-53.8,-34.4],[-54.9,-35],[-55.7,-34.8],[-56.2,-34.9],[-57.1,-34.4],[-57.8,-34.5],[-58.4,-33.9],[-58.3,-33.3],[-58.1,-33],[-58.1,-32],[-57.9,-31],[-57.6,-30.2]]]},"id":"362"},
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[-155.5,19.1],[-155.7,18.9],[-155.9,19.1],[-155.9,19.3],[-156.1,19.7],[-156,19.8],[-155.9,20],[-155.9,20.2],[-155.9,20.3],[-155.8,20.2],[-155.4,20.1],[-155.2,20],[-155.1,19.9],[-154.8,19.5],[-154.8,19.5],[-155.2,19.2],[-155.5,19.1]]],[[[-156.1,20.6],[-156.4,20.6],[-156.6,20.8],[-156.7,20.9],[-156.7,20.9],[-156.6,21],[-156.3,20.9],[-156,20.8],[-156.1,20.6]]],[[[-156.8,21.2],[-156.8,21.1],[-157.3,21.1],[-157.3,21.2],[-156 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[66.5,37.4],[66.5,38],[65.2,38.4],[64.2,38.9],[63.5,39.4],[62.4,40.1],[61.9,41.1],[61.5,41.3],[60.5,41.2],[60.1,41.4],[60,42.2],[58.6,42.8],[57.8,42.2],[56.9,41.8],[57.1,41.3],[56,41.3],[55.9,45],[58.5,45.6],[58.7,45.5],[60.2,44.8],[61.1,44.4],[62,43.5],[63.2,43.7],[64.9,43.7],[66.1,43],[66,42],[66.5,42],[66.7,41.2],[68,41.1],[68.3,40.7],[68.6,40.7],[69.1,41.4],[70.4,42.1],[71,42.3],[71.3,42.2],[70.4,41.5],[71.2,41.1],[71.9,4 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-71.3,11.8],[-71.4,11.5],[-71.9,11.4],[-71.6,11],[-71.6,10.4],[-72.1,9.9],[-71.7,9.1],[-71.3,9.1],[-71,9.9],[-71.4,10.2],[-71.4,11],[-70.2,11.4],[-70.3,11.8],[-69.9,12.2],[-69.6,11.5],[-68.9,11.4],[-68.2,10.9],[-68.2,10.6],[-67.3,10.5],[-66.2,10.6],[-65.7,10.2],[-64.9,10.1],[-64.3,10.4],[-64.3,10.6],[-63.1,10.7],[-61.9,10.7],[-62.7,10.4],[-62.4,9.9],[-61.6,9.9],[-60.8,9.4],[-60.7,8.6],[-60.2,8.6],[-59.8,8.4],[-60.6,7.8],[-60 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[108.1,21.6],[106.7,20.7],[105.9,19.8],[105.7,19.1],[106.4,18],[107.4,16.7],[108.3,16.1],[108.9,15.3],[109.3,13.4],[109.2,11.7],[108.4,11],[107.2,10.4],[106.4,9.5],[105.2,8.6],[104.8,9.2],[105.1,9.9],[104.3,10.5],[105.2,10.9],[106.2,11],[105.8,11.6],[107.5,12.3],[107.6,13.5],[107.4,14.2],[107.6,15.2],[107.3,15.9],[106.6,16.6],[105.9,17.5],[105.1,18.7],[103.9,19.3],[104.2,19.6],[104.8,19.9],[104.4,20.8],[103.2,20.8],[102.8,21. [...]
+{"type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[[[[167.8,-16.5],[167.5,-16.6],[167.2,-16.2],[167.2,-15.9],[167.8,-16.5]]],[[[167.1,-14.9],[167.3,-15.7],[167,-15.6],[166.8,-15.7],[166.6,-15.4],[166.6,-14.6],[167.1,-14.9]]]]},"id":"364"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[53.1,16.7],[52.4,16.4],[52.2,15.9],[52.2,15.6],[51.2,15.2],[49.6,14.7],[48.7,14],[48.2,13.9],[47.9,14],[47.4,13.6],[46.7,13.4],[45.9,13.3],[45.6,13.3],[45.4,13],[45.1,13],[45,12.7],[44.5,12.7],[44.2,12.6],[43.5,12.6],[43.2,13.2],[43.3,13.8],[43.1,14.1],[42.9,14.8],[42.6,15.2],[42.8,15.3],[42.7,15.7],[42.8,15.9],[42.8,16.3],[43.2,16.7],[43.1,17.1],[43.4,17.6],[43.8,17.3],[44.1,17.4],[45.2,17.4],[45.4,17.3],[46.4,17.2],[46.7,1 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[31.5,-29.3],[31.3,-29.4],[30.9,-29.9],[30.6,-30.4],[30.1,-31.1],[28.9,-32.2],[28.2,-32.8],[27.5,-33.2],[26.4,-33.6],[25.9,-33.7],[25.8,-33.9],[25.2,-33.8],[24.7,-34],[23.6,-33.8],[23,-33.9],[22.6,-33.9],[21.5,-34.3],[20.7,-34.4],[20.1,-34.8],[19.6,-34.8],[19.2,-34.5],[18.9,-34.4],[18.4,-34],[18.4,-34.1],[18.2,-33.9],[18.3,-33.3],[17.9,-32.6],[18.2,-32.4],[18.2,-31.7],[17.6,-30.7],[17.1,-29.9],[17.1,-29.9],[16.3,-28.6],[16.8, [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[32.8,-9.2],[33.2,-9.7],[33.5,-10.5],[33.3,-10.8],[33.1,-11.6],[33.3,-12.4],[33,-12.8],[32.7,-13.7],[33.2,-14],[30.2,-14.8],[30.3,-15.5],[29.5,-15.6],[28.9,-16],[28.8,-16.4],[28.5,-16.5],[27.6,-17.3],[27,-17.9],[26.7,-18],[26.4,-17.8],[25.3,-17.7],[25.1,-17.7],[25.1,-17.6],[24.7,-17.4],[24,-17.3],[23.2,-17.5],[22.6,-16.9],[21.9,-16.1],[21.9,-12.9],[24,-12.9],[23.9,-12.6],[24.1,-12.2],[23.9,-11.7],[24,-11.2],[23.9,-10.9],[24.3 [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[31.2,-22.3],[30.7,-22.2],[30.3,-22.3],[29.8,-22.1],[29.4,-22.1],[28.8,-21.6],[28,-21.5],[27.7,-20.9],[27.7,-20.5],[27.3,-20.4],[26.2,-19.3],[25.9,-18.7],[25.6,-18.5],[25.3,-17.7],[26.4,-17.8],[26.7,-18],[27,-17.9],[27.6,-17.3],[28.5,-16.5],[28.8,-16.4],[28.9,-16],[29.5,-15.6],[30.3,-15.5],[30.3,-15.9],[31.2,-15.9],[31.6,-16.1],[31.9,-16.3],[32.3,-16.4],[32.8,-16.7],[32.8,-18],[32.7,-18.7],[32.6,-19.4],[32.8,-19.7],[32.7,-20. [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[32.7,35.1],[32.8,35.1],[32.9,35.4],[33.7,35.4],[34.6,35.7],[33.9,35.2],[34,35.1],[34,35],[33,34.6],[32.5,34.7],[32.3,35.1],[32.7,35.1]]]},"id":"271"},
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[47.8,8],[46.9,8],[43.7,9.2],[43.3,9.5],[42.9,10],[42.6,10.6],[42.8,10.9],[43.1,11.5],[43.5,11.3],[43.7,10.9],[44.1,10.4],[44.6,10.4],[45.6,10.7],[46.6,10.8],[47.5,11.1],[48,11.2],[48.4,11.4],[48.9,11.4],[48.9,11.4],[49.3,11.4],[49.7,11.6],[50.3,11.7],[50.7,12],[51.1,12],[51.1,11.7],[51,11.2],[51,10.6],[50.8,10.3],[50.6,9.2],[50.1,8.1],[49.5,6.8],[48.6,5.3],[47.7,4.2],[46.6,2.9],[45.6,2],[44.1,1.1],[43.1,0.3],[42,-0.9],[41.8, [...]
+{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[-13.1,27.7],[-8.7,27.7],[-8.7,27.6],[-8.7,27.4],[-8.7,25.9],[-12,25.9],[-11.9,23.4],[-12.9,23.3],[-13.1,22.8],[-12.9,21.3],[-16.8,21.3],[-17.1,21],[-17,21.9],[-16.6,22.2],[-16.3,22.7],[-16.3,23],[-16,23.7],[-15.4,24.4],[-15.1,24.5],[-14.8,25.1],[-14.8,25.6],[-14.4,26.3],[-13.8,26.6],[-13.1,27.6],[-13.1,27.7],[-13.1,27.7]]]},"id":"885"}
+]}
diff --git a/examples/data/geojson/countries.geojson b/examples/data/geojson/countries.geojson
new file mode 100644
index 0000000..9b7e0db
--- /dev/null
+++ b/examples/data/geojson/countries.geojson
@@ -0,0 +1,181 @@
+{"type":"FeatureCollection","features":[
+{"type":"Feature","id":"AFG","properties":{"name":"Afghanistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[62.230651,35.270664],[62.984662,35.404041],[63.193538,35.857166],[63.982896,36.007957],[64.546479,36.312073],[64.746105,37.111818],[65.588948,37.305217],[65.745631,37.661164],[66.217385,37.39379],[66.518607,37.362784],[67.075782,37.356144],[67.83,37.144994],[68.135562,37.023115],[68.859446,37.344336],[69.196273,37.151144],[69.518785,37.608997],[70.116578,37 [...]
+{"type":"Feature","id":"AGO","properties":{"name":"Angola"},"geometry":{"type":"MultiPolygon","coordinates":[[[[16.326528,-5.87747],[16.57318,-6.622645],[16.860191,-7.222298],[17.089996,-7.545689],[17.47297,-8.068551],[18.134222,-7.987678],[18.464176,-7.847014],[19.016752,-7.988246],[19.166613,-7.738184],[19.417502,-7.155429],[20.037723,-7.116361],[20.091622,-6.94309],[20.601823,-6.939318],[20.514748,-7.299606],[21.728111,-7.290872],[21.746456,-7.920085],[21.949131,-8.305901],[21.801801, [...]
+{"type":"Feature","id":"ALB","properties":{"name":"Albania"},"geometry":{"type":"Polygon","coordinates":[[[20.590247,41.855404],[20.463175,41.515089],[20.605182,41.086226],[21.02004,40.842727],[20.99999,40.580004],[20.674997,40.435],[20.615,40.110007],[20.150016,39.624998],[19.98,39.694993],[19.960002,39.915006],[19.406082,40.250773],[19.319059,40.72723],[19.40355,41.409566],[19.540027,41.719986],[19.371769,41.877548],[19.304486,42.195745],[19.738051,42.688247],[19.801613,42.500093],[20. [...]
+{"type":"Feature","id":"ARE","properties":{"name":"United Arab Emirates"},"geometry":{"type":"Polygon","coordinates":[[[51.579519,24.245497],[51.757441,24.294073],[51.794389,24.019826],[52.577081,24.177439],[53.404007,24.151317],[54.008001,24.121758],[54.693024,24.797892],[55.439025,25.439145],[56.070821,26.055464],[56.261042,25.714606],[56.396847,24.924732],[55.886233,24.920831],[55.804119,24.269604],[55.981214,24.130543],[55.528632,23.933604],[55.525841,23.524869],[55.234489,23.110993] [...]
+{"type":"Feature","id":"ARG","properties":{"name":"Argentina"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.5,-55.2],[-66.45,-55.25],[-66.95992,-54.89681],[-67.56244,-54.87001],[-68.63335,-54.8695],[-68.63401,-52.63637],[-68.25,-53.1],[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2]]],[[[-64.964892,-22.075862],[-64.377021,-22.798091],[-63.986838,-21.993644],[-62.846468,-22.034985],[-62.685057,-22.249029],[-60.846565,-23.880713],[-60.028966,-24.032796],[-58.807128,- [...]
+{"type":"Feature","id":"ARM","properties":{"name":"Armenia"},"geometry":{"type":"Polygon","coordinates":[[[43.582746,41.092143],[44.97248,41.248129],[45.179496,40.985354],[45.560351,40.81229],[45.359175,40.561504],[45.891907,40.218476],[45.610012,39.899994],[46.034534,39.628021],[46.483499,39.464155],[46.50572,38.770605],[46.143623,38.741201],[45.735379,39.319719],[45.739978,39.473999],[45.298145,39.471751],[45.001987,39.740004],[44.79399,39.713003],[44.400009,40.005],[43.656436,40.25356 [...]
+{"type":"Feature","id":"ATA","properties":{"name":"Antarctica"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.572095,-80.040179],[-59.865849,-80.549657],[-60.159656,-81.000327],[-62.255393,-80.863178],[-64.488125,-80.921934],[-65.741666,-80.588827],[-65.741666,-80.549657],[-66.290031,-80.255773],[-64.037688,-80.294944],[-61.883246,-80.39287],[-61.138976,-79.981371],[-60.610119,-79.628679],[-59.572095,-80.040179]]],[[[-159.208184,-79.497059],[-161.127601,-79.634209],[-162.439847 [...]
+{"type":"Feature","id":"ATF","properties":{"name":"French Southern and Antarctic Lands"},"geometry":{"type":"Polygon","coordinates":[[[68.935,-48.625],[69.58,-48.94],[70.525,-49.065],[70.56,-49.255],[70.28,-49.71],[68.745,-49.775],[68.72,-49.2425],[68.8675,-48.83],[68.935,-48.625]]]}},
+{"type":"Feature","id":"AUS","properties":{"name":"Australia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[145.397978,-40.792549],[146.364121,-41.137695],[146.908584,-41.000546],[147.689259,-40.808258],[148.289068,-40.875438],[148.359865,-42.062445],[148.017301,-42.407024],[147.914052,-43.211522],[147.564564,-42.937689],[146.870343,-43.634597],[146.663327,-43.580854],[146.048378,-43.549745],[145.43193,-42.693776],[145.29509,-42.03361],[144.718071,-41.162552],[144.743755,-40.70397 [...]
+{"type":"Feature","id":"AUT","properties":{"name":"Austria"},"geometry":{"type":"Polygon","coordinates":[[[16.979667,48.123497],[16.903754,47.714866],[16.340584,47.712902],[16.534268,47.496171],[16.202298,46.852386],[16.011664,46.683611],[15.137092,46.658703],[14.632472,46.431817],[13.806475,46.509306],[12.376485,46.767559],[12.153088,47.115393],[11.164828,46.941579],[11.048556,46.751359],[10.442701,46.893546],[9.932448,46.920728],[9.47997,47.10281],[9.632932,47.347601],[9.594226,47.5250 [...]
+{"type":"Feature","id":"AZE","properties":{"name":"Azerbaijan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.001987,39.740004],[45.298145,39.471751],[45.739978,39.473999],[45.735379,39.319719],[46.143623,38.741201],[45.457722,38.874139],[44.952688,39.335765],[44.79399,39.713003],[45.001987,39.740004]]],[[[47.373315,41.219732],[47.815666,41.151416],[47.987283,41.405819],[48.584353,41.80887],[49.110264,41.282287],[49.618915,40.572924],[50.08483,40.526157],[50.392821,40.256561],[4 [...]
+{"type":"Feature","id":"BDI","properties":{"name":"Burundi"},"geometry":{"type":"Polygon","coordinates":[[[29.339998,-4.499983],[29.276384,-3.293907],[29.024926,-2.839258],[29.632176,-2.917858],[29.938359,-2.348487],[30.469696,-2.413858],[30.527677,-2.807632],[30.743013,-3.034285],[30.752263,-3.35933],[30.50556,-3.568567],[30.116333,-4.090138],[29.753512,-4.452389],[29.339998,-4.499983]]]}},
+{"type":"Feature","id":"BEL","properties":{"name":"Belgium"},"geometry":{"type":"Polygon","coordinates":[[[3.314971,51.345781],[4.047071,51.267259],[4.973991,51.475024],[5.606976,51.037298],[6.156658,50.803721],[6.043073,50.128052],[5.782417,50.090328],[5.674052,49.529484],[4.799222,49.985373],[4.286023,49.907497],[3.588184,50.378992],[3.123252,50.780363],[2.658422,50.796848],[2.513573,51.148506],[3.314971,51.345781]]]}},
+{"type":"Feature","id":"BEN","properties":{"name":"Benin"},"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[1.865241,6.142158],[1.618951,6.832038],[1.664478,9.12859],[1.463043,9.334624],[1.425061,9.825395],[1.077795,10.175607],[0.772336,10.470808],[0.899563,10.997339],[1.24347,11.110511],[1.447178,11.547719],[1.935986,11.64115],[2.154474,11.94015],[2.490164,12.233052],[2.848643,12.235636],[3.61118,11.660167],[3.572216,11.327939],[3.797112,10.734746],[3.60007,10.332186],[ [...]
+{"type":"Feature","id":"BFA","properties":{"name":"Burkina Faso"},"geometry":{"type":"Polygon","coordinates":[[[-2.827496,9.642461],[-3.511899,9.900326],[-3.980449,9.862344],[-4.330247,9.610835],[-4.779884,9.821985],[-4.954653,10.152714],[-5.404342,10.370737],[-5.470565,10.95127],[-5.197843,11.375146],[-5.220942,11.713859],[-4.427166,12.542646],[-4.280405,13.228444],[-4.006391,13.472485],[-3.522803,13.337662],[-3.103707,13.541267],[-2.967694,13.79815],[-2.191825,14.246418],[-2.001035,14. [...]
+{"type":"Feature","id":"BGD","properties":{"name":"Bangladesh"},"geometry":{"type":"Polygon","coordinates":[[[92.672721,22.041239],[92.652257,21.324048],[92.303234,21.475485],[92.368554,20.670883],[92.082886,21.192195],[92.025215,21.70157],[91.834891,22.182936],[91.417087,22.765019],[90.496006,22.805017],[90.586957,22.392794],[90.272971,21.836368],[89.847467,22.039146],[89.70205,21.857116],[89.418863,21.966179],[89.031961,22.055708],[88.876312,22.879146],[88.52977,23.631142],[88.69994,24 [...]
+{"type":"Feature","id":"BGR","properties":{"name":"Bulgaria"},"geometry":{"type":"Polygon","coordinates":[[[22.65715,44.234923],[22.944832,43.823785],[23.332302,43.897011],[24.100679,43.741051],[25.569272,43.688445],[26.065159,43.943494],[27.2424,44.175986],[27.970107,43.812468],[28.558081,43.707462],[28.039095,43.293172],[27.673898,42.577892],[27.99672,42.007359],[27.135739,42.141485],[26.117042,41.826905],[26.106138,41.328899],[25.197201,41.234486],[24.492645,41.583896],[23.692074,41.3 [...]
+{"type":"Feature","id":"BHS","properties":{"name":"The Bahamas"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-77.53466,23.75975],[-77.78,23.71],[-78.03405,24.28615],[-78.40848,24.57564],[-78.19087,25.2103],[-77.89,25.17],[-77.54,24.34],[-77.53466,23.75975]]],[[[-77.82,26.58],[-78.91,26.42],[-78.98,26.79],[-78.51,26.87],[-77.85,26.84],[-77.82,26.58]]],[[[-77,26.59],[-77.17255,25.87918],[-77.35641,26.00735],[-77.34,26.53],[-77.78802,26.92516],[-77.79,27.04],[-77,26.59]]]]}},
+{"type":"Feature","id":"BIH","properties":{"name":"Bosnia and Herzegovina"},"geometry":{"type":"Polygon","coordinates":[[[19.005486,44.860234],[19.36803,44.863],[19.11761,44.42307],[19.59976,44.03847],[19.454,43.5681],[19.21852,43.52384],[19.03165,43.43253],[18.70648,43.20011],[18.56,42.65],[17.674922,43.028563],[17.297373,43.446341],[16.916156,43.667722],[16.456443,44.04124],[16.23966,44.351143],[15.750026,44.818712],[15.959367,45.233777],[16.318157,45.004127],[16.534939,45.211608],[17. [...]
+{"type":"Feature","id":"BLR","properties":{"name":"Belarus"},"geometry":{"type":"Polygon","coordinates":[[[23.484128,53.912498],[24.450684,53.905702],[25.536354,54.282423],[25.768433,54.846963],[26.588279,55.167176],[26.494331,55.615107],[27.10246,55.783314],[28.176709,56.16913],[29.229513,55.918344],[29.371572,55.670091],[29.896294,55.789463],[30.873909,55.550976],[30.971836,55.081548],[30.757534,54.811771],[31.384472,54.157056],[31.791424,53.974639],[31.731273,53.794029],[32.405599,53. [...]
+{"type":"Feature","id":"BLZ","properties":{"name":"Belize"},"geometry":{"type":"Polygon","coordinates":[[[-89.14308,17.808319],[-89.150909,17.955468],[-89.029857,18.001511],[-88.848344,17.883198],[-88.490123,18.486831],[-88.300031,18.499982],[-88.296336,18.353273],[-88.106813,18.348674],[-88.123479,18.076675],[-88.285355,17.644143],[-88.197867,17.489475],[-88.302641,17.131694],[-88.239518,17.036066],[-88.355428,16.530774],[-88.551825,16.265467],[-88.732434,16.233635],[-88.930613,15.88727 [...]
+{"type":"Feature","id":"BMU","properties":{"name":"Bermuda"},"geometry":{"type":"Polygon","coordinates":[[[-64.7799734332998,32.3072000581802],[-64.7873319183061,32.3039237143428],[-64.7946942710173,32.3032682700388],[-64.8094297981283,32.3098175728414],[-64.8167896352437,32.3058845718466],[-64.8101968029642,32.3022833180511],[-64.7962291465484,32.2934409732427],[-64.7815086336978,32.2868973114514],[-64.7997025513437,32.2796896417328],[-64.8066707691087,32.2747767569465],[-64.82255878736 [...]
+{"type":"Feature","id":"BOL","properties":{"name":"Bolivia"},"geometry":{"type":"Polygon","coordinates":[[[-62.846468,-22.034985],[-63.986838,-21.993644],[-64.377021,-22.798091],[-64.964892,-22.075862],[-66.273339,-21.83231],[-67.106674,-22.735925],[-67.82818,-22.872919],[-68.219913,-21.494347],[-68.757167,-20.372658],[-68.442225,-19.405068],[-68.966818,-18.981683],[-69.100247,-18.260125],[-69.590424,-17.580012],[-68.959635,-16.500698],[-69.389764,-15.660129],[-69.160347,-15.323974],[-69 [...]
+{"type":"Feature","id":"BRA","properties":{"name":"Brazil"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.2909,-28.852761],[-55.162286,-27.881915],[-54.490725,-27.474757],[-53.648735,-26.923473],[-53.628349,-26.124865],[-54.13005,-25.547639],[-54.625291,-25.739255],[-54.428946,-25.162185],[-54.293476,-24.5708],[-54.29296,-24.021014],[-54.652834,-23.839578],[-55.027902,-24.001274],[-55.400747,-23.956935],[-55.517639,-23.571998],[-55.610683,-22.655619],[-55.7979 [...]
+{"type":"Feature","id":"BRN","properties":{"name":"Brunei"},"geometry":{"type":"Polygon","coordinates":[[[114.204017,4.525874],[114.599961,4.900011],[115.45071,5.44773],[115.4057,4.955228],[115.347461,4.316636],[114.869557,4.348314],[114.659596,4.007637],[114.204017,4.525874]]]}},
+{"type":"Feature","id":"BTN","properties":{"name":"Bhutan"},"geometry":{"type":"Polygon","coordinates":[[[91.696657,27.771742],[92.103712,27.452614],[92.033484,26.83831],[91.217513,26.808648],[90.373275,26.875724],[89.744528,26.719403],[88.835643,27.098966],[88.814248,27.299316],[89.47581,28.042759],[90.015829,28.296439],[90.730514,28.064954],[91.258854,28.040614],[91.696657,27.771742]]]}},
+{"type":"Feature","id":"BWA","properties":{"name":"Botswana"},"geometry":{"type":"Polygon","coordinates":[[[25.649163,-18.536026],[25.850391,-18.714413],[26.164791,-19.293086],[27.296505,-20.39152],[27.724747,-20.499059],[27.727228,-20.851802],[28.02137,-21.485975],[28.794656,-21.639454],[29.432188,-22.091313],[28.017236,-22.827754],[27.11941,-23.574323],[26.786407,-24.240691],[26.485753,-24.616327],[25.941652,-24.696373],[25.765849,-25.174845],[25.664666,-25.486816],[25.025171,-25.71967 [...]
+{"type":"Feature","id":"CAF","properties":{"name":"Central African Republic"},"geometry":{"type":"Polygon","coordinates":[[[15.27946,7.421925],[16.106232,7.497088],[16.290562,7.754307],[16.456185,7.734774],[16.705988,7.508328],[17.96493,7.890914],[18.389555,8.281304],[18.911022,8.630895],[18.81201,8.982915],[19.094008,9.074847],[20.059685,9.012706],[21.000868,9.475985],[21.723822,10.567056],[22.231129,10.971889],[22.864165,11.142395],[22.977544,10.714463],[23.554304,10.089255],[23.55725, [...]
+{"type":"Feature","id":"CAN","properties":{"name":"Canada"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.6645,46.55001],[-62.9393,46.41587],[-62.01208,46.44314],[-62.50391,46.03339],[-62.87433,45.96818],[-64.1428,46.39265],[-64.39261,46.72747],[-64.01486,47.03601],[-63.6645,46.55001]]],[[[-61.806305,49.10506],[-62.29318,49.08717],[-63.58926,49.40069],[-64.51912,49.87304],[-64.17322,49.95718],[-62.85829,49.70641],[-61.835585,49.28855],[-61.806305,49.10506]]],[[[-123.510002,48.5 [...]
+{"type":"Feature","id":"CHE","properties":{"name":"Switzerland"},"geometry":{"type":"Polygon","coordinates":[[[9.594226,47.525058],[9.632932,47.347601],[9.47997,47.10281],[9.932448,46.920728],[10.442701,46.893546],[10.363378,46.483571],[9.922837,46.314899],[9.182882,46.440215],[8.966306,46.036932],[8.489952,46.005151],[8.31663,46.163642],[7.755992,45.82449],[7.273851,45.776948],[6.843593,45.991147],[6.5001,46.429673],[6.022609,46.27299],[6.037389,46.725779],[6.768714,47.287708],[6.736571 [...]
+{"type":"Feature","id":"CHL","properties":{"name":"Chile"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.63401,-52.63637],[-68.63335,-54.8695],[-67.56244,-54.87001],[-66.95992,-54.89681],[-67.29103,-55.30124],[-68.14863,-55.61183],[-68.639991,-55.580018],[-69.2321,-55.49906],[-69.95809,-55.19843],[-71.00568,-55.05383],[-72.2639,-54.49514],[-73.2852,-53.95752],[-74.66253,-52.83749],[-73.8381,-53.04743],[-72.43418,-53.7154],[-71.10773,-54.07433],[-70.59178,-53.61583],[-70.26748,- [...]
+{"type":"Feature","id":"CHN","properties":{"name":"China"},"geometry":{"type":"MultiPolygon","coordinates":[[[[110.339188,18.678395],[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395]]],[[[127.657407,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.987282,47.790132],[132.506672,47.78897],[133.373596,48.183442],[135.026311,48.4 [...]
+{"type":"Feature","id":"CIV","properties":{"name":"Ivory Coast"},"geometry":{"type":"Polygon","coordinates":[[[-2.856125,4.994476],[-3.311084,4.984296],[-4.00882,5.179813],[-4.649917,5.168264],[-5.834496,4.993701],[-6.528769,4.705088],[-7.518941,4.338288],[-7.712159,4.364566],[-7.635368,5.188159],[-7.539715,5.313345],[-7.570153,5.707352],[-7.993693,6.12619],[-8.311348,6.193033],[-8.60288,6.467564],[-8.385452,6.911801],[-8.485446,7.395208],[-8.439298,7.686043],[-8.280703,7.68718],[-8.2217 [...]
+{"type":"Feature","id":"CMR","properties":{"name":"Cameroon"},"geometry":{"type":"Polygon","coordinates":[[[13.075822,2.267097],[12.951334,2.321616],[12.35938,2.192812],[11.751665,2.326758],[11.276449,2.261051],[9.649158,2.283866],[9.795196,3.073404],[9.404367,3.734527],[8.948116,3.904129],[8.744924,4.352215],[8.488816,4.495617],[8.500288,4.771983],[8.757533,5.479666],[9.233163,6.444491],[9.522706,6.453482],[10.118277,7.03877],[10.497375,7.055358],[11.058788,6.644427],[11.745774,6.981383 [...]
+{"type":"Feature","id":"COD","properties":{"name":"Democratic Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[30.83386,3.509166],[30.773347,2.339883],[31.174149,2.204465],[30.85267,1.849396],[30.468508,1.583805],[30.086154,1.062313],[29.875779,0.59738],[29.819503,-0.20531],[29.587838,-0.587406],[29.579466,-1.341313],[29.291887,-1.620056],[29.254835,-2.21511],[29.117479,-2.292211],[29.024926,-2.839258],[29.276384,-3.293907],[29.339998,-4.499983],[29.519987,-5.419979] [...]
+{"type":"Feature","id":"COG","properties":{"name":"Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[12.995517,-4.781103],[12.62076,-4.438023],[12.318608,-4.60623],[11.914963,-5.037987],[11.093773,-3.978827],[11.855122,-3.426871],[11.478039,-2.765619],[11.820964,-2.514161],[12.495703,-2.391688],[12.575284,-1.948511],[13.109619,-2.42874],[13.992407,-2.470805],[14.29921,-1.998276],[14.425456,-1.333407],[14.316418,-0.552627],[13.843321,0.038758],[14.276266,1.19693],[14.0 [...]
+{"type":"Feature","id":"COL","properties":{"name":"Colombia"},"geometry":{"type":"Polygon","coordinates":[[[-75.373223,-0.152032],[-75.801466,0.084801],[-76.292314,0.416047],[-76.57638,0.256936],[-77.424984,0.395687],[-77.668613,0.825893],[-77.855061,0.809925],[-78.855259,1.380924],[-78.990935,1.69137],[-78.617831,1.766404],[-78.662118,2.267355],[-78.42761,2.629556],[-77.931543,2.696606],[-77.510431,3.325017],[-77.12769,3.849636],[-77.496272,4.087606],[-77.307601,4.667984],[-77.533221,5. [...]
+{"type":"Feature","id":"CRI","properties":{"name":"Costa Rica"},"geometry":{"type":"Polygon","coordinates":[[[-82.965783,8.225028],[-83.508437,8.446927],[-83.711474,8.656836],[-83.596313,8.830443],[-83.632642,9.051386],[-83.909886,9.290803],[-84.303402,9.487354],[-84.647644,9.615537],[-84.713351,9.908052],[-84.97566,10.086723],[-84.911375,9.795992],[-85.110923,9.55704],[-85.339488,9.834542],[-85.660787,9.933347],[-85.797445,10.134886],[-85.791709,10.439337],[-85.659314,10.754331],[-85.94 [...]
+{"type":"Feature","id":"CUB","properties":{"name":"Cuba"},"geometry":{"type":"Polygon","coordinates":[[[-82.268151,23.188611],[-81.404457,23.117271],[-80.618769,23.10598],[-79.679524,22.765303],[-79.281486,22.399202],[-78.347434,22.512166],[-77.993296,22.277194],[-77.146422,21.657851],[-76.523825,21.20682],[-76.19462,21.220565],[-75.598222,21.016624],[-75.67106,20.735091],[-74.933896,20.693905],[-74.178025,20.284628],[-74.296648,20.050379],[-74.961595,19.923435],[-75.63468,19.873774],[-7 [...]
+{"type":"Feature","id":"TRNC","properties":{"name":"Northern Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.802474,35.145504],[32.946961,35.386703],[33.667227,35.373216],[34.576474,35.671596],[33.900804,35.245756],[33.973617,35.058506],[33.86644,35.093595],[33.675392,35.017863],[33.525685,35.038688],[33.475817,35.000345],[33.455922,35.101424],[33.383833,35.162712],[33.190977,35.173125],[32.919572,35.087833],[32.73178,35.140026]]]}},
+{"type":"Feature","id":"CYP","properties":{"name":"Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[33.973617,35.058506],[34.004881,34.978098],[32.979827,34.571869],[32.490296,34.701655],[32.256667,35.103232],[32.73178,35.140026],[32.919572,35.087833],[33.190977,35.173125],[33.383833,35.162712],[33.455922,35.101424],[33.475817,35.000345],[33.525685,35.038688],[33.675392,35.017863],[33.86644,35.093595],[33.973617,35.058506]]]}},
+{"type":"Feature","id":"CZE","properties":{"name":"Czech Republic"},"geometry":{"type":"Polygon","coordinates":[[[16.960288,48.596982],[16.499283,48.785808],[16.029647,48.733899],[15.253416,49.039074],[14.901447,48.964402],[14.338898,48.555305],[13.595946,48.877172],[13.031329,49.307068],[12.521024,49.547415],[12.415191,49.969121],[12.240111,50.266338],[12.966837,50.484076],[13.338132,50.733234],[14.056228,50.926918],[14.307013,51.117268],[14.570718,51.002339],[15.016996,51.106674],[15.4 [...]
+{"type":"Feature","id":"DEU","properties":{"name":"Germany"},"geometry":{"type":"Polygon","coordinates":[[[9.921906,54.983104],[9.93958,54.596642],[10.950112,54.363607],[10.939467,54.008693],[11.956252,54.196486],[12.51844,54.470371],[13.647467,54.075511],[14.119686,53.757029],[14.353315,53.248171],[14.074521,52.981263],[14.4376,52.62485],[14.685026,52.089947],[14.607098,51.745188],[15.016996,51.106674],[14.570718,51.002339],[14.307013,51.117268],[14.056228,50.926918],[13.338132,50.73323 [...]
+{"type":"Feature","id":"DJI","properties":{"name":"Djibouti"},"geometry":{"type":"Polygon","coordinates":[[[43.081226,12.699639],[43.317852,12.390148],[43.286381,11.974928],[42.715874,11.735641],[43.145305,11.46204],[42.776852,10.926879],[42.55493,11.10511],[42.31414,11.0342],[41.75557,11.05091],[41.73959,11.35511],[41.66176,11.6312],[42,12.1],[42.35156,12.54223],[42.779642,12.455416],[43.081226,12.699639]]]}},
+{"type":"Feature","id":"DNK","properties":{"name":"Denmark"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.690006,55.609991],[12.089991,54.800015],[11.043543,55.364864],[10.903914,55.779955],[12.370904,56.111407],[12.690006,55.609991]]],[[[10.912182,56.458621],[10.667804,56.081383],[10.369993,56.190007],[9.649985,55.469999],[9.921906,54.983104],[9.282049,54.830865],[8.526229,54.962744],[8.120311,55.517723],[8.089977,56.540012],[8.256582,56.809969],[8.543438,57.110003],[9.424469, [...]
+{"type":"Feature","id":"DOM","properties":{"name":"Dominican Republic"},"geometry":{"type":"Polygon","coordinates":[[[-71.712361,19.714456],[-71.587304,19.884911],[-70.806706,19.880286],[-70.214365,19.622885],[-69.950815,19.648],[-69.76925,19.293267],[-69.222126,19.313214],[-69.254346,19.015196],[-68.809412,18.979074],[-68.317943,18.612198],[-68.689316,18.205142],[-69.164946,18.422648],[-69.623988,18.380713],[-69.952934,18.428307],[-70.133233,18.245915],[-70.517137,18.184291],[-70.669298 [...]
+{"type":"Feature","id":"DZA","properties":{"name":"Algeria"},"geometry":{"type":"Polygon","coordinates":[[[11.999506,23.471668],[8.572893,21.565661],[5.677566,19.601207],[4.267419,19.155265],[3.158133,19.057364],[3.146661,19.693579],[2.683588,19.85623],[2.060991,20.142233],[1.823228,20.610809],[-1.550055,22.792666],[-4.923337,24.974574],[-8.6844,27.395744],[-8.665124,27.589479],[-8.66559,27.656426],[-8.674116,28.841289],[-7.059228,29.579228],[-6.060632,29.7317],[-5.242129,30.000443],[-4. [...]
+{"type":"Feature","id":"ECU","properties":{"name":"Ecuador"},"geometry":{"type":"Polygon","coordinates":[[[-80.302561,-3.404856],[-79.770293,-2.657512],[-79.986559,-2.220794],[-80.368784,-2.685159],[-80.967765,-2.246943],[-80.764806,-1.965048],[-80.933659,-1.057455],[-80.58337,-0.906663],[-80.399325,-0.283703],[-80.020898,0.36034],[-80.09061,0.768429],[-79.542762,0.982938],[-78.855259,1.380924],[-77.855061,0.809925],[-77.668613,0.825893],[-77.424984,0.395687],[-76.57638,0.256936],[-76.29 [...]
+{"type":"Feature","id":"EGY","properties":{"name":"Egypt"},"geometry":{"type":"Polygon","coordinates":[[[34.9226,29.50133],[34.64174,29.09942],[34.42655,28.34399],[34.15451,27.8233],[33.92136,27.6487],[33.58811,27.97136],[33.13676,28.41765],[32.42323,29.85108],[32.32046,29.76043],[32.73482,28.70523],[33.34876,27.69989],[34.10455,26.14227],[34.47387,25.59856],[34.79507,25.03375],[35.69241,23.92671],[35.49372,23.75237],[35.52598,23.10244],[36.69069,22.20485],[36.86623,22],[32.9,22],[29.02, [...]
+{"type":"Feature","id":"ERI","properties":{"name":"Eritrea"},"geometry":{"type":"Polygon","coordinates":[[[42.35156,12.54223],[42.00975,12.86582],[41.59856,13.45209],[41.155194,13.77332],[40.8966,14.11864],[40.026219,14.519579],[39.34061,14.53155],[39.0994,14.74064],[38.51295,14.50547],[37.90607,14.95943],[37.59377,14.2131],[36.42951,14.42211],[36.323189,14.822481],[36.75386,16.291874],[36.85253,16.95655],[37.16747,17.26314],[37.904,17.42754],[38.41009,17.998307],[38.990623,16.840626],[3 [...]
+{"type":"Feature","id":"ESP","properties":{"name":"Spain"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.984433,42.592775],[-9.392884,43.026625],[-7.97819,43.748338],[-6.754492,43.567909],[-5.411886,43.57424],[-4.347843,43.403449],[-3.517532,43.455901],[-1.901351,43.422802],[-1.502771,43.034014],[0.338047,42.579546],[0.701591,42.795734],[1.826793,42.343385],[2.985999,42.473015],[3.039484,41.89212],[2.091842,41.226089],[0.810525,41.014732],[0.721331,40.678318],[0. [...]
+{"type":"Feature","id":"EST","properties":{"name":"Estonia"},"geometry":{"type":"Polygon","coordinates":[[[24.312863,57.793424],[24.428928,58.383413],[24.061198,58.257375],[23.42656,58.612753],[23.339795,59.18724],[24.604214,59.465854],[25.864189,59.61109],[26.949136,59.445803],[27.981114,59.475388],[28.131699,59.300825],[27.420166,58.724581],[27.716686,57.791899],[27.288185,57.474528],[26.463532,57.476389],[25.60281,57.847529],[25.164594,57.970157],[24.312863,57.793424]]]}},
+{"type":"Feature","id":"ETH","properties":{"name":"Ethiopia"},"geometry":{"type":"Polygon","coordinates":[[[37.90607,14.95943],[38.51295,14.50547],[39.0994,14.74064],[39.34061,14.53155],[40.02625,14.51959],[40.8966,14.11864],[41.1552,13.77333],[41.59856,13.45209],[42.00975,12.86582],[42.35156,12.54223],[42,12.1],[41.66176,11.6312],[41.73959,11.35511],[41.75557,11.05091],[42.31414,11.0342],[42.55493,11.10511],[42.776852,10.926879],[42.55876,10.57258],[42.92812,10.02194],[43.29699,9.54048] [...]
+{"type":"Feature","id":"FIN","properties":{"name":"Finland"},"geometry":{"type":"Polygon","coordinates":[[[28.59193,69.064777],[28.445944,68.364613],[29.977426,67.698297],[29.054589,66.944286],[30.21765,65.80598],[29.54443,64.948672],[30.444685,64.204453],[30.035872,63.552814],[31.516092,62.867687],[31.139991,62.357693],[30.211107,61.780028],[28.069998,60.503517],[26.255173,60.423961],[24.496624,60.057316],[22.869695,59.846373],[22.290764,60.391921],[21.322244,60.72017],[21.544866,61.705 [...]
+{"type":"Feature","id":"FJI","properties":{"name":"Fiji"},"geometry":{"type":"MultiPolygon","coordinates":[[[[178.3736,-17.33992],[178.71806,-17.62846],[178.55271,-18.15059],[177.93266,-18.28799],[177.38146,-18.16432],[177.28504,-17.72465],[177.67087,-17.38114],[178.12557,-17.50481],[178.3736,-17.33992]]],[[[179.364143,-16.801354],[178.725059,-17.012042],[178.596839,-16.63915],[179.096609,-16.433984],[179.413509,-16.379054],[180,-16.067133],[180,-16.555217],[179.364143,-16.801354]]],[[[- [...]
+{"type":"Feature","id":"FLK","properties":{"name":"Falkland Islands"},"geometry":{"type":"Polygon","coordinates":[[[-61.2,-51.85],[-60,-51.25],[-59.15,-51.5],[-58.55,-51.1],[-57.75,-51.55],[-58.05,-51.9],[-59.4,-52.2],[-59.85,-51.85],[-60.7,-52.3],[-61.2,-51.85]]]}},
+{"type":"Feature","id":"FRA","properties":{"name":"France"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.560016,42.152492],[9.229752,41.380007],[8.775723,41.583612],[8.544213,42.256517],[8.746009,42.628122],[9.390001,43.009985],[9.560016,42.152492]]],[[[3.588184,50.378992],[4.286023,49.907497],[4.799222,49.985373],[5.674052,49.529484],[5.897759,49.442667],[6.18632,49.463803],[6.65823,49.201958],[8.099279,49.017784],[7.593676,48.333019],[7.466759,47.620582],[7.192202,47.449766],[ [...]
+{"type":"Feature","id":"GAB","properties":{"name":"Gabon"},"geometry":{"type":"Polygon","coordinates":[[[11.093773,-3.978827],[10.066135,-2.969483],[9.405245,-2.144313],[8.797996,-1.111301],[8.830087,-0.779074],[9.04842,-0.459351],[9.291351,0.268666],[9.492889,1.01012],[9.830284,1.067894],[11.285079,1.057662],[11.276449,2.261051],[11.751665,2.326758],[12.35938,2.192812],[12.951334,2.321616],[13.075822,2.267097],[13.003114,1.830896],[13.282631,1.314184],[14.026669,1.395677],[14.276266,1.1 [...]
+{"type":"Feature","id":"GBR","properties":{"name":"United Kingdom"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-5.661949,54.554603],[-6.197885,53.867565],[-6.95373,54.073702],[-7.572168,54.059956],[-7.366031,54.595841],[-7.572168,55.131622],[-6.733847,55.17286],[-5.661949,54.554603]]],[[[-3.005005,58.635],[-4.073828,57.553025],[-3.055002,57.690019],[-1.959281,57.6848],[-2.219988,56.870017],[-3.119003,55.973793],[-2.085009,55.909998],[-2.005676,55.804903],[-1.114991,54.624986],[- [...]
+{"type":"Feature","id":"GEO","properties":{"name":"Georgia"},"geometry":{"type":"Polygon","coordinates":[[[41.554084,41.535656],[41.703171,41.962943],[41.45347,42.645123],[40.875469,43.013628],[40.321394,43.128634],[39.955009,43.434998],[40.076965,43.553104],[40.922185,43.382159],[42.394395,43.220308],[43.756017,42.740828],[43.9312,42.554974],[44.537623,42.711993],[45.470279,42.502781],[45.77641,42.092444],[46.404951,41.860675],[46.145432,41.722802],[46.637908,41.181673],[46.501637,41.06 [...]
+{"type":"Feature","id":"GHA","properties":{"name":"Ghana"},"geometry":{"type":"Polygon","coordinates":[[[1.060122,5.928837],[-0.507638,5.343473],[-1.063625,5.000548],[-1.964707,4.710462],[-2.856125,4.994476],[-2.810701,5.389051],[-3.24437,6.250472],[-2.983585,7.379705],[-2.56219,8.219628],[-2.827496,9.642461],[-2.963896,10.395335],[-2.940409,10.96269],[-1.203358,11.009819],[-0.761576,10.93693],[-0.438702,11.098341],[0.023803,11.018682],[-0.049785,10.706918],[0.36758,10.191213],[0.365901, [...]
+{"type":"Feature","id":"GIN","properties":{"name":"Guinea"},"geometry":{"type":"Polygon","coordinates":[[[-8.439298,7.686043],[-8.722124,7.711674],[-8.926065,7.309037],[-9.208786,7.313921],[-9.403348,7.526905],[-9.33728,7.928534],[-9.755342,8.541055],[-10.016567,8.428504],[-10.230094,8.406206],[-10.505477,8.348896],[-10.494315,8.715541],[-10.65477,8.977178],[-10.622395,9.26791],[-10.839152,9.688246],[-11.117481,10.045873],[-11.917277,10.046984],[-12.150338,9.858572],[-12.425929,9.835834] [...]
+{"type":"Feature","id":"GMB","properties":{"name":"Gambia"},"geometry":{"type":"Polygon","coordinates":[[[-16.841525,13.151394],[-16.713729,13.594959],[-15.624596,13.623587],[-15.39877,13.860369],[-15.081735,13.876492],[-14.687031,13.630357],[-14.376714,13.62568],[-14.046992,13.794068],[-13.844963,13.505042],[-14.277702,13.280585],[-14.712197,13.298207],[-15.141163,13.509512],[-15.511813,13.27857],[-15.691001,13.270353],[-15.931296,13.130284],[-16.841525,13.151394]]]}},
+{"type":"Feature","id":"GNB","properties":{"name":"Guinea Bissau"},"geometry":{"type":"Polygon","coordinates":[[[-15.130311,11.040412],[-15.66418,11.458474],[-16.085214,11.524594],[-16.314787,11.806515],[-16.308947,11.958702],[-16.613838,12.170911],[-16.677452,12.384852],[-16.147717,12.547762],[-15.816574,12.515567],[-15.548477,12.62817],[-13.700476,12.586183],[-13.718744,12.247186],[-13.828272,12.142644],[-13.743161,11.811269],[-13.9008,11.678719],[-14.121406,11.677117],[-14.382192,11.5 [...]
+{"type":"Feature","id":"GNQ","properties":{"name":"Equatorial Guinea"},"geometry":{"type":"Polygon","coordinates":[[[9.492889,1.01012],[9.305613,1.160911],[9.649158,2.283866],[11.276449,2.261051],[11.285079,1.057662],[9.830284,1.067894],[9.492889,1.01012]]]}},
+{"type":"Feature","id":"GRC","properties":{"name":"Greece"},"geometry":{"type":"MultiPolygon","coordinates":[[[[23.69998,35.705004],[24.246665,35.368022],[25.025015,35.424996],[25.769208,35.354018],[25.745023,35.179998],[26.290003,35.29999],[26.164998,35.004995],[24.724982,34.919988],[24.735007,35.084991],[23.514978,35.279992],[23.69998,35.705004]]],[[[26.604196,41.562115],[26.294602,40.936261],[26.056942,40.824123],[25.447677,40.852545],[24.925848,40.947062],[23.714811,40.687129],[24.40 [...]
+{"type":"Feature","id":"GRL","properties":{"name":"Greenland"},"geometry":{"type":"Polygon","coordinates":[[[-46.76379,82.62796],[-43.40644,83.22516],[-39.89753,83.18018],[-38.62214,83.54905],[-35.08787,83.64513],[-27.10046,83.51966],[-20.84539,82.72669],[-22.69182,82.34165],[-26.51753,82.29765],[-31.9,82.2],[-31.39646,82.02154],[-27.85666,82.13178],[-24.84448,81.78697],[-22.90328,82.09317],[-22.07175,81.73449],[-23.16961,81.15271],[-20.62363,81.52462],[-15.76818,81.91245],[-12.77018,81. [...]
+{"type":"Feature","id":"GTM","properties":{"name":"Guatemala"},"geometry":{"type":"Polygon","coordinates":[[[-90.095555,13.735338],[-90.608624,13.909771],[-91.23241,13.927832],[-91.689747,14.126218],[-92.22775,14.538829],[-92.20323,14.830103],[-92.087216,15.064585],[-92.229249,15.251447],[-91.74796,16.066565],[-90.464473,16.069562],[-90.438867,16.41011],[-90.600847,16.470778],[-90.711822,16.687483],[-91.08167,16.918477],[-91.453921,17.252177],[-91.002269,17.254658],[-91.00152,17.817595], [...]
+{"type":"Feature","id":"GUF","properties":{"name":"French Guiana"},"geometry":{"type":"Polygon","coordinates":[[[-52.556425,2.504705],[-52.939657,2.124858],[-53.418465,2.053389],[-53.554839,2.334897],[-53.778521,2.376703],[-54.088063,2.105557],[-54.524754,2.311849],[-54.27123,2.738748],[-54.184284,3.194172],[-54.011504,3.62257],[-54.399542,4.212611],[-54.478633,4.896756],[-53.958045,5.756548],[-53.618453,5.646529],[-52.882141,5.409851],[-51.823343,4.565768],[-51.657797,4.156232],[-52.249 [...]
+{"type":"Feature","id":"GUY","properties":{"name":"Guyana"},"geometry":{"type":"Polygon","coordinates":[[[-59.758285,8.367035],[-59.101684,7.999202],[-58.482962,7.347691],[-58.454876,6.832787],[-58.078103,6.809094],[-57.542219,6.321268],[-57.147436,5.97315],[-57.307246,5.073567],[-57.914289,4.812626],[-57.86021,4.576801],[-58.044694,4.060864],[-57.601569,3.334655],[-57.281433,3.333492],[-57.150098,2.768927],[-56.539386,1.899523],[-56.782704,1.863711],[-57.335823,1.948538],[-57.660971,1.6 [...]
+{"type":"Feature","id":"HND","properties":{"name":"Honduras"},"geometry":{"type":"Polygon","coordinates":[[[-87.316654,12.984686],[-87.489409,13.297535],[-87.793111,13.38448],[-87.723503,13.78505],[-87.859515,13.893312],[-88.065343,13.964626],[-88.503998,13.845486],[-88.541231,13.980155],[-88.843073,14.140507],[-89.058512,14.340029],[-89.353326,14.424133],[-89.145535,14.678019],[-89.22522,14.874286],[-89.154811,15.066419],[-88.68068,15.346247],[-88.225023,15.727722],[-88.121153,15.688655 [...]
+{"type":"Feature","id":"HRV","properties":{"name":"Croatia"},"geometry":{"type":"Polygon","coordinates":[[[18.829838,45.908878],[19.072769,45.521511],[19.390476,45.236516],[19.005486,44.860234],[18.553214,45.08159],[17.861783,45.06774],[17.002146,45.233777],[16.534939,45.211608],[16.318157,45.004127],[15.959367,45.233777],[15.750026,44.818712],[16.23966,44.351143],[16.456443,44.04124],[16.916156,43.667722],[17.297373,43.446341],[17.674922,43.028563],[18.56,42.65],[18.450016,42.479991],[1 [...]
+{"type":"Feature","id":"HTI","properties":{"name":"Haiti"},"geometry":{"type":"Polygon","coordinates":[[[-73.189791,19.915684],[-72.579673,19.871501],[-71.712361,19.714456],[-71.624873,19.169838],[-71.701303,18.785417],[-71.945112,18.6169],[-71.687738,18.31666],[-71.708305,18.044997],[-72.372476,18.214961],[-72.844411,18.145611],[-73.454555,18.217906],[-73.922433,18.030993],[-74.458034,18.34255],[-74.369925,18.664908],[-73.449542,18.526053],[-72.694937,18.445799],[-72.334882,18.668422],[ [...]
+{"type":"Feature","id":"HUN","properties":{"name":"Hungary"},"geometry":{"type":"Polygon","coordinates":[[[16.202298,46.852386],[16.534268,47.496171],[16.340584,47.712902],[16.903754,47.714866],[16.979667,48.123497],[17.488473,47.867466],[17.857133,47.758429],[18.696513,47.880954],[18.777025,48.081768],[19.174365,48.111379],[19.661364,48.266615],[19.769471,48.202691],[20.239054,48.327567],[20.473562,48.56285],[20.801294,48.623854],[21.872236,48.319971],[22.085608,48.422264],[22.64082,48. [...]
+{"type":"Feature","id":"IDN","properties":{"name":"Indonesia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[120.715609,-10.239581],[120.295014,-10.25865],[118.967808,-9.557969],[119.90031,-9.36134],[120.425756,-9.665921],[120.775502,-9.969675],[120.715609,-10.239581]]],[[[124.43595,-10.140001],[123.579982,-10.359987],[123.459989,-10.239995],[123.550009,-9.900016],[123.980009,-9.290027],[124.968682,-8.89279],[125.07002,-9.089987],[125.08852,-9.393173],[124.43595,-10.140001]]],[[[11 [...]
+{"type":"Feature","id":"IND","properties":{"name":"India"},"geometry":{"type":"Polygon","coordinates":[[[77.837451,35.49401],[78.912269,34.321936],[78.811086,33.506198],[79.208892,32.994395],[79.176129,32.48378],[78.458446,32.618164],[78.738894,31.515906],[79.721367,30.882715],[81.111256,30.183481],[80.476721,29.729865],[80.088425,28.79447],[81.057203,28.416095],[81.999987,27.925479],[83.304249,27.364506],[84.675018,27.234901],[85.251779,26.726198],[86.024393,26.630985],[87.227472,26.397 [...]
+{"type":"Feature","id":"IRL","properties":{"name":"Ireland"},"geometry":{"type":"Polygon","coordinates":[[[-6.197885,53.867565],[-6.032985,53.153164],[-6.788857,52.260118],[-8.561617,51.669301],[-9.977086,51.820455],[-9.166283,52.864629],[-9.688525,53.881363],[-8.327987,54.664519],[-7.572168,55.131622],[-7.366031,54.595841],[-7.572168,54.059956],[-6.95373,54.073702],[-6.197885,53.867565]]]}},
+{"type":"Feature","id":"IRN","properties":{"name":"Iran"},"geometry":{"type":"Polygon","coordinates":[[[53.921598,37.198918],[54.800304,37.392421],[55.511578,37.964117],[56.180375,37.935127],[56.619366,38.121394],[57.330434,38.029229],[58.436154,37.522309],[59.234762,37.412988],[60.377638,36.527383],[61.123071,36.491597],[61.210817,35.650072],[60.803193,34.404102],[60.52843,33.676446],[60.9637,33.528832],[60.536078,32.981269],[60.863655,32.18292],[60.941945,31.548075],[61.699314,31.37950 [...]
+{"type":"Feature","id":"IRQ","properties":{"name":"Iraq"},"geometry":{"type":"Polygon","coordinates":[[[45.420618,35.977546],[46.07634,35.677383],[46.151788,35.093259],[45.64846,34.748138],[45.416691,33.967798],[46.109362,33.017287],[47.334661,32.469155],[47.849204,31.709176],[47.685286,30.984853],[48.004698,30.985137],[48.014568,30.452457],[48.567971,29.926778],[47.974519,29.975819],[47.302622,30.05907],[46.568713,29.099025],[44.709499,29.178891],[41.889981,31.190009],[40.399994,31.8899 [...]
+{"type":"Feature","id":"ISL","properties":{"name":"Iceland"},"geometry":{"type":"Polygon","coordinates":[[[-14.508695,66.455892],[-14.739637,65.808748],[-13.609732,65.126671],[-14.909834,64.364082],[-17.794438,63.678749],[-18.656246,63.496383],[-19.972755,63.643635],[-22.762972,63.960179],[-21.778484,64.402116],[-23.955044,64.89113],[-22.184403,65.084968],[-22.227423,65.378594],[-24.326184,65.611189],[-23.650515,66.262519],[-22.134922,66.410469],[-20.576284,65.732112],[-19.056842,66.2766 [...]
+{"type":"Feature","id":"ISR","properties":{"name":"Israel"},"geometry":{"type":"Polygon","coordinates":[[[35.719918,32.709192],[35.545665,32.393992],[35.18393,32.532511],[34.974641,31.866582],[35.225892,31.754341],[34.970507,31.616778],[34.927408,31.353435],[35.397561,31.489086],[35.420918,31.100066],[34.922603,29.501326],[34.265433,31.219361],[34.556372,31.548824],[34.488107,31.605539],[34.752587,32.072926],[34.955417,32.827376],[35.098457,33.080539],[35.126053,33.0909],[35.460709,33.08 [...]
+{"type":"Feature","id":"ITA","properties":{"name":"Italy"},"geometry":{"type":"MultiPolygon","coordinates":[[[[15.520376,38.231155],[15.160243,37.444046],[15.309898,37.134219],[15.099988,36.619987],[14.335229,36.996631],[13.826733,37.104531],[12.431004,37.61295],[12.570944,38.126381],[13.741156,38.034966],[14.761249,38.143874],[15.520376,38.231155]]],[[[9.210012,41.209991],[9.809975,40.500009],[9.669519,39.177376],[9.214818,39.240473],[8.806936,38.906618],[8.428302,39.171847],[8.388253,4 [...]
+{"type":"Feature","id":"JAM","properties":{"name":"Jamaica"},"geometry":{"type":"Polygon","coordinates":[[[-77.569601,18.490525],[-76.896619,18.400867],[-76.365359,18.160701],[-76.199659,17.886867],[-76.902561,17.868238],[-77.206341,17.701116],[-77.766023,17.861597],[-78.337719,18.225968],[-78.217727,18.454533],[-77.797365,18.524218],[-77.569601,18.490525]]]}},
+{"type":"Feature","id":"JOR","properties":{"name":"Jordan"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.719918,32.709192],[36.834062,32.312938],[38.792341,33.378686],[39.195468,32.161009],[39.004886,32.010217],[37.002166,31.508413],[37.998849,30.5085],[37.66812,30.338665],[37.503582,30.003776],[36.740528,29.865283],[36.501214,29.505254],[36.068941,29.197495],[34.956037,29.356555],[34.922603,29.501326],[35.420918,31.100066],[35.397561,31.489086],[35.545252,31.78 [...]
+{"type":"Feature","id":"JPN","properties":{"name":"Japan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[134.638428,34.149234],[134.766379,33.806335],[134.203416,33.201178],[133.79295,33.521985],[133.280268,33.28957],[133.014858,32.704567],[132.363115,32.989382],[132.371176,33.463642],[132.924373,34.060299],[133.492968,33.944621],[133.904106,34.364931],[134.638428,34.149234]]],[[[140.976388,37.142074],[140.59977,36.343983],[140.774074,35.842877],[140.253279,35.138114],[138.975528,3 [...]
+{"type":"Feature","id":"KAZ","properties":{"name":"Kazakhstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[70.388965,42.081308],[69.070027,41.384244],[68.632483,40.668681],[68.259896,40.662325],[67.985856,41.135991],[66.714047,41.168444],[66.510649,41.987644],[66.023392,41.994646],[66.098012,42.99766],[64.900824,43.728081],[63.185787,43.650075],[62.0133,43.504477],[61.05832,44.405817],[60.239972,44.784037],[58.689989,45.500014],[58.503127,45.586804],[55.928917,44 [...]
+{"type":"Feature","id":"KEN","properties":{"name":"Kenya"},"geometry":{"type":"Polygon","coordinates":[[[40.993,-0.85829],[41.58513,-1.68325],[40.88477,-2.08255],[40.63785,-2.49979],[40.26304,-2.57309],[40.12119,-3.27768],[39.80006,-3.68116],[39.60489,-4.34653],[39.20222,-4.67677],[37.7669,-3.67712],[37.69869,-3.09699],[34.07262,-1.05982],[33.903711,-0.95],[33.893569,0.109814],[34.18,0.515],[34.6721,1.17694],[35.03599,1.90584],[34.59607,3.05374],[34.47913,3.5556],[34.005,4.249885],[34.62 [...]
+{"type":"Feature","id":"KGZ","properties":{"name":"Kyrgyzstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[71.186281,42.704293],[71.844638,42.845395],[73.489758,42.500894],[73.645304,43.091272],[74.212866,43.298339],[75.636965,42.8779],[76.000354,42.988022],[77.658392,42.960686],[79.142177,42.856092],[79.643645,42.496683],[80.25999,42.349999],[80.11943,42.123941],[78.543661,41.582243],[78.187197,41.185316],[76.904484,41.066486],[76.526368,40.427946],[75.467828,40 [...]
+{"type":"Feature","id":"KHM","properties":{"name":"Cambodia"},"geometry":{"type":"Polygon","coordinates":[[[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555]]]}},
+{"type":"Feature","id":"KOR","properties":{"name":"South Korea"},"geometry":{"type":"Polygon","coordinates":[[[128.349716,38.612243],[129.21292,37.432392],[129.46045,36.784189],[129.468304,35.632141],[129.091377,35.082484],[128.18585,34.890377],[127.386519,34.475674],[126.485748,34.390046],[126.37392,34.93456],[126.559231,35.684541],[126.117398,36.725485],[126.860143,36.893924],[126.174759,37.749686],[126.237339,37.840378],[126.68372,37.804773],[127.073309,38.256115],[127.780035,38.30453 [...]
+{"type":"Feature","id":"CS-KM","properties":{"name":"Kosovo"},"geometry":{"type":"Polygon","coordinates":[[[20.76216,42.05186],[20.71731,41.84711],[20.59023,41.85541],[20.52295,42.21787],[20.28374,42.32025],[20.0707,42.58863],[20.25758,42.81275],[20.49679,42.88469],[20.63508,43.21671],[20.81448,43.27205],[20.95651,43.13094],[21.143395,43.068685],[21.27421,42.90959],[21.43866,42.86255],[21.63302,42.67717],[21.77505,42.6827],[21.66292,42.43922],[21.54332,42.32025],[21.576636,42.245224],[21 [...]
+{"type":"Feature","id":"KWT","properties":{"name":"Kuwait"},"geometry":{"type":"Polygon","coordinates":[[[47.974519,29.975819],[48.183189,29.534477],[48.093943,29.306299],[48.416094,28.552004],[47.708851,28.526063],[47.459822,29.002519],[46.568713,29.099025],[47.302622,30.05907],[47.974519,29.975819]]]}},
+{"type":"Feature","id":"LAO","properties":{"name":"Laos"},"geometry":{"type":"Polygon","coordinates":[[[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122] [...]
+{"type":"Feature","id":"LBN","properties":{"name":"Lebanon"},"geometry":{"type":"Polygon","coordinates":[[[35.821101,33.277426],[35.552797,33.264275],[35.460709,33.08904],[35.126053,33.0909],[35.482207,33.90545],[35.979592,34.610058],[35.998403,34.644914],[36.448194,34.593935],[36.61175,34.201789],[36.06646,33.824912],[35.821101,33.277426]]]}},
+{"type":"Feature","id":"LBR","properties":{"name":"Liberia"},"geometry":{"type":"Polygon","coordinates":[[[-7.712159,4.364566],[-7.974107,4.355755],[-9.004794,4.832419],[-9.91342,5.593561],[-10.765384,6.140711],[-11.438779,6.785917],[-11.199802,7.105846],[-11.146704,7.396706],[-10.695595,7.939464],[-10.230094,8.406206],[-10.016567,8.428504],[-9.755342,8.541055],[-9.33728,7.928534],[-9.403348,7.526905],[-9.208786,7.313921],[-8.926065,7.309037],[-8.722124,7.711674],[-8.439298,7.686043],[-8 [...]
+{"type":"Feature","id":"LBY","properties":{"name":"Libya"},"geometry":{"type":"Polygon","coordinates":[[[14.8513,22.86295],[14.143871,22.491289],[13.581425,23.040506],[11.999506,23.471668],[11.560669,24.097909],[10.771364,24.562532],[10.303847,24.379313],[9.948261,24.936954],[9.910693,25.365455],[9.319411,26.094325],[9.716286,26.512206],[9.629056,27.140953],[9.756128,27.688259],[9.683885,28.144174],[9.859998,28.95999],[9.805634,29.424638],[9.48214,30.307556],[9.970017,30.539325],[10.0565 [...]
+{"type":"Feature","id":"LKA","properties":{"name":"Sri Lanka"},"geometry":{"type":"Polygon","coordinates":[[[81.787959,7.523055],[81.637322,6.481775],[81.21802,6.197141],[80.348357,5.96837],[79.872469,6.763463],[79.695167,8.200843],[80.147801,9.824078],[80.838818,9.268427],[81.304319,8.564206],[81.787959,7.523055]]]}},
+{"type":"Feature","id":"LSO","properties":{"name":"Lesotho"},"geometry":{"type":"Polygon","coordinates":[[[28.978263,-28.955597],[29.325166,-29.257387],[29.018415,-29.743766],[28.8484,-30.070051],[28.291069,-30.226217],[28.107205,-30.545732],[27.749397,-30.645106],[26.999262,-29.875954],[27.532511,-29.242711],[28.074338,-28.851469],[28.5417,-28.647502],[28.978263,-28.955597]]]}},
+{"type":"Feature","id":"LTU","properties":{"name":"Lithuania"},"geometry":{"type":"Polygon","coordinates":[[[22.731099,54.327537],[22.651052,54.582741],[22.757764,54.856574],[22.315724,55.015299],[21.268449,55.190482],[21.0558,56.031076],[22.201157,56.337802],[23.878264,56.273671],[24.860684,56.372528],[25.000934,56.164531],[25.533047,56.100297],[26.494331,55.615107],[26.588279,55.167176],[25.768433,54.846963],[25.536354,54.282423],[24.450684,53.905702],[23.484128,53.912498],[23.243987,5 [...]
+{"type":"Feature","id":"LUX","properties":{"name":"Luxembourg"},"geometry":{"type":"Polygon","coordinates":[[[6.043073,50.128052],[6.242751,49.902226],[6.18632,49.463803],[5.897759,49.442667],[5.674052,49.529484],[5.782417,50.090328],[6.043073,50.128052]]]}},
+{"type":"Feature","id":"LVA","properties":{"name":"Latvia"},"geometry":{"type":"Polygon","coordinates":[[[21.0558,56.031076],[21.090424,56.783873],[21.581866,57.411871],[22.524341,57.753374],[23.318453,57.006236],[24.12073,57.025693],[24.312863,57.793424],[25.164594,57.970157],[25.60281,57.847529],[26.463532,57.476389],[27.288185,57.474528],[27.770016,57.244258],[27.855282,56.759326],[28.176709,56.16913],[27.10246,55.783314],[26.494331,55.615107],[25.533047,56.100297],[25.000934,56.16453 [...]
+{"type":"Feature","id":"MAR","properties":{"name":"Morocco"},"geometry":{"type":"Polygon","coordinates":[[[-5.193863,35.755182],[-4.591006,35.330712],[-3.640057,35.399855],[-2.604306,35.179093],[-2.169914,35.168396],[-1.792986,34.527919],[-1.733455,33.919713],[-1.388049,32.864015],[-1.124551,32.651522],[-1.307899,32.262889],[-2.616605,32.094346],[-3.06898,31.724498],[-3.647498,31.637294],[-3.690441,30.896952],[-4.859646,30.501188],[-5.242129,30.000443],[-6.060632,29.7317],[-7.059228,29.5 [...]
+{"type":"Feature","id":"MDA","properties":{"name":"Moldova"},"geometry":{"type":"Polygon","coordinates":[[[26.619337,48.220726],[26.857824,48.368211],[27.522537,48.467119],[28.259547,48.155562],[28.670891,48.118149],[29.122698,47.849095],[29.050868,47.510227],[29.415135,47.346645],[29.559674,46.928583],[29.908852,46.674361],[29.83821,46.525326],[30.024659,46.423937],[29.759972,46.349988],[29.170654,46.379262],[29.072107,46.517678],[28.862972,46.437889],[28.933717,46.25883],[28.659987,45. [...]
+{"type":"Feature","id":"MDG","properties":{"name":"Madagascar"},"geometry":{"type":"Polygon","coordinates":[[[49.543519,-12.469833],[49.808981,-12.895285],[50.056511,-13.555761],[50.217431,-14.758789],[50.476537,-15.226512],[50.377111,-15.706069],[50.200275,-16.000263],[49.860606,-15.414253],[49.672607,-15.710204],[49.863344,-16.451037],[49.774564,-16.875042],[49.498612,-17.106036],[49.435619,-17.953064],[49.041792,-19.118781],[48.548541,-20.496888],[47.930749,-22.391501],[47.547723,-23. [...]
+{"type":"Feature","id":"MEX","properties":{"name":"Mexico"},"geometry":{"type":"Polygon","coordinates":[[[-97.140008,25.869997],[-97.528072,24.992144],[-97.702946,24.272343],[-97.776042,22.93258],[-97.872367,22.444212],[-97.699044,21.898689],[-97.38896,21.411019],[-97.189333,20.635433],[-96.525576,19.890931],[-96.292127,19.320371],[-95.900885,18.828024],[-94.839063,18.562717],[-94.42573,18.144371],[-93.548651,18.423837],[-92.786114,18.524839],[-92.037348,18.704569],[-91.407903,18.876083] [...]
+{"type":"Feature","id":"MKD","properties":{"name":"Macedonia"},"geometry":{"type":"Polygon","coordinates":[[[20.59023,41.85541],[20.71731,41.84711],[20.76216,42.05186],[21.3527,42.2068],[21.576636,42.245224],[21.91708,42.30364],[22.380526,42.32026],[22.881374,41.999297],[22.952377,41.337994],[22.76177,41.3048],[22.597308,41.130487],[22.055378,41.149866],[21.674161,40.931275],[21.02004,40.842727],[20.60518,41.08622],[20.46315,41.51509],[20.59023,41.85541]]]}},
+{"type":"Feature","id":"MLI","properties":{"name":"Mali"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-11.834208,14.799097],[-11.666078,15.388208],[-11.349095,15.411256],[-10.650791,15.132746],[-10.086846,15.330486],[-9.700255,15.264107],[-9.550238,15.486497],[-5.537744,15.50169],[-5.315277,16.201854],[-5.488523,16.325102],[-5.971129,20.640833],[-6.453787,24.956591],[-4.923337,24.974574],[-1.550055,22.792666],[1.823228,20.610809],[2.060991,20.142233],[2.683588,19. [...]
+{"type":"Feature","id":"MMR","properties":{"name":"Myanmar"},"geometry":{"type":"Polygon","coordinates":[[[99.543309,20.186598],[98.959676,19.752981],[98.253724,19.708203],[97.797783,18.62708],[97.375896,18.445438],[97.859123,17.567946],[98.493761,16.837836],[98.903348,16.177824],[98.537376,15.308497],[98.192074,15.123703],[98.430819,14.622028],[99.097755,13.827503],[99.212012,13.269294],[99.196354,12.804748],[99.587286,11.892763],[99.038121,10.960546],[98.553551,9.93296],[98.457174,10.6 [...]
+{"type":"Feature","id":"MNE","properties":{"name":"Montenegro"},"geometry":{"type":"Polygon","coordinates":[[[19.801613,42.500093],[19.738051,42.688247],[19.30449,42.19574],[19.37177,41.87755],[19.16246,41.95502],[18.88214,42.28151],[18.45,42.48],[18.56,42.65],[18.70648,43.20011],[19.03165,43.43253],[19.21852,43.52384],[19.48389,43.35229],[19.63,43.21378],[19.95857,43.10604],[20.3398,42.89852],[20.25758,42.81275],[20.0707,42.58863],[19.801613,42.500093]]]}},
+{"type":"Feature","id":"MNG","properties":{"name":"Mongolia"},"geometry":{"type":"Polygon","coordinates":[[[87.751264,49.297198],[88.805567,49.470521],[90.713667,50.331812],[92.234712,50.802171],[93.104219,50.49529],[94.147566,50.480537],[94.815949,50.013433],[95.814028,49.977467],[97.259728,49.726061],[98.231762,50.422401],[97.82574,51.010995],[98.861491,52.047366],[99.981732,51.634006],[100.88948,51.516856],[102.065223,51.259921],[102.255909,50.510561],[103.676545,50.089966],[104.62155 [...]
+{"type":"Feature","id":"MOZ","properties":{"name":"Mozambique"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[35.312398,-11.439146],[36.514082,-11.720938],[36.775151,-11.594537],[37.471284,-11.568751],[37.827645,-11.268769],[38.427557,-11.285202],[39.52103,-10.896854],[40.316589,-10.317096],[40.478387,-10.765441],[40.437253,-11.761711],[40.560811,-12.639177],[40.59962,-14.201975],[40.775475,-14.691764],[40.477251,-15.406294],[40.089264,-16.100774],[39.452559,-16.720 [...]
+{"type":"Feature","id":"MRT","properties":{"name":"Mauritania"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-12.830658,15.303692],[-13.435738,16.039383],[-14.099521,16.304302],[-14.577348,16.598264],[-15.135737,16.587282],[-15.623666,16.369337],[-16.12069,16.455663],[-16.463098,16.135036],[-16.549708,16.673892],[-16.270552,17.166963],[-16.146347,18.108482],[-16.256883,19.096716],[-16.377651,19.593817],[-16.277838,20.092521],[-16.536324,20.567866],[-17.063423,20.99 [...]
+{"type":"Feature","id":"MWI","properties":{"name":"Malawi"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[34.280006,-12.280025],[34.559989,-13.579998],[34.907151,-13.565425],[35.267956,-13.887834],[35.686845,-14.611046],[35.771905,-15.896859],[35.339063,-16.10744],[35.03381,-16.8013],[34.381292,-16.18356],[34.307291,-15.478641],[34.517666,-15.013709],[34.459633,-14.61301],[34.064825,-14.35995],[33.7897,-14.451831],[33.214025,-13.97186],[32.688165,-13.712858],[32.991 [...]
+{"type":"Feature","id":"MYS","properties":{"name":"Malaysia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[101.075516,6.204867],[101.154219,5.691384],[101.814282,5.810808],[102.141187,6.221636],[102.371147,6.128205],[102.961705,5.524495],[103.381215,4.855001],[103.438575,4.181606],[103.332122,3.726698],[103.429429,3.382869],[103.502448,2.791019],[103.854674,2.515454],[104.247932,1.631141],[104.228811,1.293048],[103.519707,1.226334],[102.573615,1.967115],[101.390638,2.760814],[101. [...]
+{"type":"Feature","id":"NAM","properties":{"name":"Namibia"},"geometry":{"type":"Polygon","coordinates":[[[16.344977,-28.576705],[15.601818,-27.821247],[15.210472,-27.090956],[14.989711,-26.117372],[14.743214,-25.39292],[14.408144,-23.853014],[14.385717,-22.656653],[14.257714,-22.111208],[13.868642,-21.699037],[13.352498,-20.872834],[12.826845,-19.673166],[12.608564,-19.045349],[11.794919,-18.069129],[11.734199,-17.301889],[12.215461,-17.111668],[12.814081,-16.941343],[13.462362,-16.9712 [...]
+{"type":"Feature","id":"NCL","properties":{"name":"New Caledonia"},"geometry":{"type":"Polygon","coordinates":[[[165.77999,-21.080005],[166.599991,-21.700019],[167.120011,-22.159991],[166.740035,-22.399976],[166.189732,-22.129708],[165.474375,-21.679607],[164.829815,-21.14982],[164.167995,-20.444747],[164.029606,-20.105646],[164.459967,-20.120012],[165.020036,-20.459991],[165.460009,-20.800022],[165.77999,-21.080005]]]}},
+{"type":"Feature","id":"NER","properties":{"name":"Niger"},"geometry":{"type":"Polygon","coordinates":[[[2.154474,11.94015],[2.177108,12.625018],[1.024103,12.851826],[0.993046,13.33575],[0.429928,13.988733],[0.295646,14.444235],[0.374892,14.928908],[1.015783,14.968182],[1.385528,15.323561],[2.749993,15.409525],[3.638259,15.56812],[3.723422,16.184284],[4.27021,16.852227],[4.267419,19.155265],[5.677566,19.601207],[8.572893,21.565661],[11.999506,23.471668],[13.581425,23.040506],[14.143871,2 [...]
+{"type":"Feature","id":"NGA","properties":{"name":"Nigeria"},"geometry":{"type":"Polygon","coordinates":[[[8.500288,4.771983],[7.462108,4.412108],[7.082596,4.464689],[6.698072,4.240594],[5.898173,4.262453],[5.362805,4.887971],[5.033574,5.611802],[4.325607,6.270651],[3.57418,6.2583],[2.691702,6.258817],[2.749063,7.870734],[2.723793,8.506845],[2.912308,9.137608],[3.220352,9.444153],[3.705438,10.06321],[3.60007,10.332186],[3.797112,10.734746],[3.572216,11.327939],[3.61118,11.660167],[3.6806 [...]
+{"type":"Feature","id":"NIC","properties":{"name":"Nicaragua"},"geometry":{"type":"Polygon","coordinates":[[[-85.71254,11.088445],[-86.058488,11.403439],[-86.52585,11.806877],[-86.745992,12.143962],[-87.167516,12.458258],[-87.668493,12.90991],[-87.557467,13.064552],[-87.392386,12.914018],[-87.316654,12.984686],[-87.005769,13.025794],[-86.880557,13.254204],[-86.733822,13.263093],[-86.755087,13.754845],[-86.520708,13.778487],[-86.312142,13.771356],[-86.096264,14.038187],[-85.801295,13.8360 [...]
+{"type":"Feature","id":"NLD","properties":{"name":"Netherlands"},"geometry":{"type":"Polygon","coordinates":[[[6.074183,53.510403],[6.90514,53.482162],[7.092053,53.144043],[6.84287,52.22844],[6.589397,51.852029],[5.988658,51.851616],[6.156658,50.803721],[5.606976,51.037298],[4.973991,51.475024],[4.047071,51.267259],[3.314971,51.345755],[3.830289,51.620545],[4.705997,53.091798],[6.074183,53.510403]]]}},
+{"type":"Feature","id":"NOR","properties":{"name":"Norway"},"geometry":{"type":"MultiPolygon","coordinates":[[[[28.165547,71.185474],[31.293418,70.453788],[30.005435,70.186259],[31.101079,69.55808],[29.399581,69.156916],[28.59193,69.064777],[29.015573,69.766491],[27.732292,70.164193],[26.179622,69.825299],[25.689213,69.092114],[24.735679,68.649557],[23.66205,68.891247],[22.356238,68.841741],[21.244936,69.370443],[20.645593,69.106247],[20.025269,69.065139],[19.87856,68.407194],[17.993868, [...]
+{"type":"Feature","id":"NPL","properties":{"name":"Nepal"},"geometry":{"type":"Polygon","coordinates":[[[88.120441,27.876542],[88.043133,27.445819],[88.174804,26.810405],[88.060238,26.414615],[87.227472,26.397898],[86.024393,26.630985],[85.251779,26.726198],[84.675018,27.234901],[83.304249,27.364506],[81.999987,27.925479],[81.057203,28.416095],[80.088425,28.79447],[80.476721,29.729865],[81.111256,30.183481],[81.525804,30.422717],[82.327513,30.115268],[83.337115,29.463732],[83.898993,29.3 [...]
+{"type":"Feature","id":"NZL","properties":{"name":"New Zealand"},"geometry":{"type":"MultiPolygon","coordinates":[[[[173.020375,-40.919052],[173.247234,-41.331999],[173.958405,-40.926701],[174.247587,-41.349155],[174.248517,-41.770008],[173.876447,-42.233184],[173.22274,-42.970038],[172.711246,-43.372288],[173.080113,-43.853344],[172.308584,-43.865694],[171.452925,-44.242519],[171.185138,-44.897104],[170.616697,-45.908929],[169.831422,-46.355775],[169.332331,-46.641235],[168.411354,-46.6 [...]
+{"type":"Feature","id":"OMN","properties":{"name":"Oman"},"geometry":{"type":"MultiPolygon","coordinates":[[[[58.861141,21.114035],[58.487986,20.428986],[58.034318,20.481437],[57.826373,20.243002],[57.665762,19.736005],[57.7887,19.06757],[57.694391,18.94471],[57.234264,18.947991],[56.609651,18.574267],[56.512189,18.087113],[56.283521,17.876067],[55.661492,17.884128],[55.269939,17.632309],[55.2749,17.228354],[54.791002,16.950697],[54.239253,17.044981],[53.570508,16.707663],[53.108573,16.6 [...]
+{"type":"Feature","id":"PAK","properties":{"name":"Pakistan"},"geometry":{"type":"Polygon","coordinates":[[[75.158028,37.133031],[75.896897,36.666806],[76.192848,35.898403],[77.837451,35.49401],[76.871722,34.653544],[75.757061,34.504923],[74.240203,34.748887],[73.749948,34.317699],[74.104294,33.441473],[74.451559,32.7649],[75.258642,32.271105],[74.405929,31.692639],[74.42138,30.979815],[73.450638,29.976413],[72.823752,28.961592],[71.777666,27.91318],[70.616496,27.989196],[69.514393,26.94 [...]
+{"type":"Feature","id":"PAN","properties":{"name":"Panama"},"geometry":{"type":"Polygon","coordinates":[[[-77.881571,7.223771],[-78.214936,7.512255],[-78.429161,8.052041],[-78.182096,8.319182],[-78.435465,8.387705],[-78.622121,8.718124],[-79.120307,8.996092],[-79.557877,8.932375],[-79.760578,8.584515],[-80.164481,8.333316],[-80.382659,8.298409],[-80.480689,8.090308],[-80.00369,7.547524],[-80.276671,7.419754],[-80.421158,7.271572],[-80.886401,7.220541],[-81.059543,7.817921],[-81.189716,7. [...]
+{"type":"Feature","id":"PER","properties":{"name":"Peru"},"geometry":{"type":"Polygon","coordinates":[[[-69.590424,-17.580012],[-69.858444,-18.092694],[-70.372572,-18.347975],[-71.37525,-17.773799],[-71.462041,-17.363488],[-73.44453,-16.359363],[-75.237883,-15.265683],[-76.009205,-14.649286],[-76.423469,-13.823187],[-76.259242,-13.535039],[-77.106192,-12.222716],[-78.092153,-10.377712],[-79.036953,-8.386568],[-79.44592,-7.930833],[-79.760578,-7.194341],[-80.537482,-6.541668],[-81.249996, [...]
+{"type":"Feature","id":"PHL","properties":{"name":"Philippines"},"geometry":{"type":"MultiPolygon","coordinates":[[[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122 [...]
+{"type":"Feature","id":"PNG","properties":{"name":"Papua New Guinea"},"geometry":{"type":"MultiPolygon","coordinates":[[[[155.880026,-6.819997],[155.599991,-6.919991],[155.166994,-6.535931],[154.729192,-5.900828],[154.514114,-5.139118],[154.652504,-5.042431],[154.759991,-5.339984],[155.062918,-5.566792],[155.547746,-6.200655],[156.019965,-6.540014],[155.880026,-6.819997]]],[[[151.982796,-5.478063],[151.459107,-5.56028],[151.30139,-5.840728],[150.754447,-6.083763],[150.241197,-6.317754],[ [...]
+{"type":"Feature","id":"POL","properties":{"name":"Poland"},"geometry":{"type":"Polygon","coordinates":[[[15.016996,51.106674],[14.607098,51.745188],[14.685026,52.089947],[14.4376,52.62485],[14.074521,52.981263],[14.353315,53.248171],[14.119686,53.757029],[14.8029,54.050706],[16.363477,54.513159],[17.622832,54.851536],[18.620859,54.682606],[18.696255,54.438719],[19.66064,54.426084],[20.892245,54.312525],[22.731099,54.327537],[23.243987,54.220567],[23.484128,53.912498],[23.527536,53.47012 [...]
+{"type":"Feature","id":"PRI","properties":{"name":"Puerto Rico"},"geometry":{"type":"Polygon","coordinates":[[[-66.282434,18.514762],[-65.771303,18.426679],[-65.591004,18.228035],[-65.847164,17.975906],[-66.599934,17.981823],[-67.184162,17.946553],[-67.242428,18.37446],[-67.100679,18.520601],[-66.282434,18.514762]]]}},
+{"type":"Feature","id":"PRK","properties":{"name":"North Korea"},"geometry":{"type":"Polygon","coordinates":[[[130.640016,42.395009],[130.780007,42.220007],[130.400031,42.280004],[129.965949,41.941368],[129.667362,41.601104],[129.705189,40.882828],[129.188115,40.661808],[129.0104,40.485436],[128.633368,40.189847],[127.967414,40.025413],[127.533436,39.75685],[127.50212,39.323931],[127.385434,39.213472],[127.783343,39.050898],[128.349716,38.612243],[128.205746,38.370397],[127.780035,38.304 [...]
+{"type":"Feature","id":"PRT","properties":{"name":"Portugal"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.671946,42.134689],[-8.263857,42.280469],[-8.013175,41.790886],[-7.422513,41.792075],[-7.251309,41.918346],[-6.668606,41.883387],[-6.389088,41.381815],[-6.851127,41.111083],[-6.86402,40.330872],[-7.026413,40.184524],[-7.066592,39.711892],[-7.498632,39.629571],[-7.098037,39.030073],[-7.374092,38.373059],[-7.029281,38.075764],[-7.166508,37.803894],[-7.537105,3 [...]
+{"type":"Feature","id":"PRY","properties":{"name":"Paraguay"},"geometry":{"type":"Polygon","coordinates":[[[-62.685057,-22.249029],[-62.291179,-21.051635],[-62.265961,-20.513735],[-61.786326,-19.633737],[-60.043565,-19.342747],[-59.115042,-19.356906],[-58.183471,-19.868399],[-58.166392,-20.176701],[-57.870674,-20.732688],[-57.937156,-22.090176],[-56.88151,-22.282154],[-56.473317,-22.0863],[-55.797958,-22.35693],[-55.610683,-22.655619],[-55.517639,-23.571998],[-55.400747,-23.956935],[-55. [...]
+{"type":"Feature","id":"QAT","properties":{"name":"Qatar"},"geometry":{"type":"Polygon","coordinates":[[[50.810108,24.754743],[50.743911,25.482424],[51.013352,26.006992],[51.286462,26.114582],[51.589079,25.801113],[51.6067,25.21567],[51.389608,24.627386],[51.112415,24.556331],[50.810108,24.754743]]]}},
+{"type":"Feature","id":"ROU","properties":{"name":"Romania"},"geometry":{"type":"Polygon","coordinates":[[[22.710531,47.882194],[23.142236,48.096341],[23.760958,47.985598],[24.402056,47.981878],[24.866317,47.737526],[25.207743,47.891056],[25.945941,47.987149],[26.19745,48.220881],[26.619337,48.220726],[26.924176,48.123264],[27.233873,47.826771],[27.551166,47.405117],[28.12803,46.810476],[28.160018,46.371563],[28.054443,45.944586],[28.233554,45.488283],[28.679779,45.304031],[29.149725,45. [...]
+{"type":"Feature","id":"RUS","properties":{"name":"Russia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[143.648007,50.7476],[144.654148,48.976391],[143.173928,49.306551],[142.558668,47.861575],[143.533492,46.836728],[143.505277,46.137908],[142.747701,46.740765],[142.09203,45.966755],[141.906925,46.805929],[142.018443,47.780133],[141.904445,48.859189],[142.1358,49.615163],[142.179983,50.952342],[141.594076,51.935435],[141.682546,53.301966],[142.606934,53.762145],[142.209749,54.225 [...]
+{"type":"Feature","id":"RWA","properties":{"name":"Rwanda"},"geometry":{"type":"Polygon","coordinates":[[[30.419105,-1.134659],[30.816135,-1.698914],[30.758309,-2.28725],[30.469696,-2.413858],[29.938359,-2.348487],[29.632176,-2.917858],[29.024926,-2.839258],[29.117479,-2.292211],[29.254835,-2.21511],[29.291887,-1.620056],[29.579466,-1.341313],[29.821519,-1.443322],[30.419105,-1.134659]]]}},
+{"type":"Feature","id":"ESH","properties":{"name":"Western Sahara"},"geometry":{"type":"Polygon","coordinates":[[[-8.794884,27.120696],[-8.817828,27.656426],[-8.66559,27.656426],[-8.665124,27.589479],[-8.6844,27.395744],[-8.687294,25.881056],[-11.969419,25.933353],[-11.937224,23.374594],[-12.874222,23.284832],[-13.118754,22.77122],[-12.929102,21.327071],[-16.845194,21.333323],[-17.063423,20.999752],[-17.020428,21.42231],[-17.002962,21.420734],[-14.750955,21.5006],[-14.630833,21.86094],[- [...]
+{"type":"Feature","id":"SAU","properties":{"name":"Saudi Arabia"},"geometry":{"type":"Polygon","coordinates":[[[42.779332,16.347891],[42.649573,16.774635],[42.347989,17.075806],[42.270888,17.474722],[41.754382,17.833046],[41.221391,18.6716],[40.939341,19.486485],[40.247652,20.174635],[39.801685,20.338862],[39.139399,21.291905],[39.023696,21.986875],[39.066329,22.579656],[38.492772,23.688451],[38.02386,24.078686],[37.483635,24.285495],[37.154818,24.858483],[37.209491,25.084542],[36.931627 [...]
+{"type":"Feature","id":"SDN","properties":{"name":"Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.824963,9.484061],[33.842131,9.981915],[33.721959,10.325262],[33.206938,10.720112],[33.086766,11.441141],[33.206938,12.179338],[32.743419,12.248008],[32.67475,12.024832],[32.073892,11.97333],[32.314235,11.681484],[32.400072,11.080626],[31.850716,10.531271],[31.352862,9.810241],[30.837841,9.707237],[29.996639,10.290927],[29.618957,10.084919],[29.515953,9.793074], [...]
+{"type":"Feature","id":"SDS","properties":{"name":"South Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.97498,8.68456],[33.8255,8.37916],[33.2948,8.35458],[32.95418,7.78497],[33.56829,7.71334],[34.0751,7.22595],[34.25032,6.82607],[34.70702,6.59422],[35.298007,5.506],[34.620196,4.847123],[34.005,4.249885],[33.39,3.79],[32.68642,3.79232],[31.88145,3.55827],[31.24556,3.7819],[30.83385,3.50917],[29.95349,4.1737],[29.715995,4.600805],[29.159078,4.389267],[28.696 [...]
+{"type":"Feature","id":"SEN","properties":{"name":"Senegal"},"geometry":{"type":"Polygon","coordinates":[[[-16.713729,13.594959],[-17.126107,14.373516],[-17.625043,14.729541],[-17.185173,14.919477],[-16.700706,15.621527],[-16.463098,16.135036],[-16.12069,16.455663],[-15.623666,16.369337],[-15.135737,16.587282],[-14.577348,16.598264],[-14.099521,16.304302],[-13.435738,16.039383],[-12.830658,15.303692],[-12.17075,14.616834],[-12.124887,13.994727],[-11.927716,13.422075],[-11.553398,13.14121 [...]
+{"type":"Feature","id":"SLB","properties":{"name":"Solomon Islands"},"geometry":{"type":"MultiPolygon","coordinates":[[[[162.119025,-10.482719],[162.398646,-10.826367],[161.700032,-10.820011],[161.319797,-10.204751],[161.917383,-10.446701],[162.119025,-10.482719]]],[[[160.852229,-9.872937],[160.462588,-9.89521],[159.849447,-9.794027],[159.640003,-9.63998],[159.702945,-9.24295],[160.362956,-9.400304],[160.688518,-9.610162],[160.852229,-9.872937]]],[[[161.679982,-9.599982],[161.529397,-9.7 [...]
+{"type":"Feature","id":"SLE","properties":{"name":"Sierra Leone"},"geometry":{"type":"Polygon","coordinates":[[[-11.438779,6.785917],[-11.708195,6.860098],[-12.428099,7.262942],[-12.949049,7.798646],[-13.124025,8.163946],[-13.24655,8.903049],[-12.711958,9.342712],[-12.596719,9.620188],[-12.425929,9.835834],[-12.150338,9.858572],[-11.917277,10.046984],[-11.117481,10.045873],[-10.839152,9.688246],[-10.622395,9.26791],[-10.65477,8.977178],[-10.494315,8.715541],[-10.505477,8.348896],[-10.230 [...]
+{"type":"Feature","id":"SLV","properties":{"name":"El Salvador"},"geometry":{"type":"Polygon","coordinates":[[[-87.793111,13.38448],[-87.904112,13.149017],[-88.483302,13.163951],[-88.843228,13.259734],[-89.256743,13.458533],[-89.812394,13.520622],[-90.095555,13.735338],[-90.064678,13.88197],[-89.721934,14.134228],[-89.534219,14.244816],[-89.587343,14.362586],[-89.353326,14.424133],[-89.058512,14.340029],[-88.843073,14.140507],[-88.541231,13.980155],[-88.503998,13.845486],[-88.065343,13.9 [...]
+{"type":"Feature","id":"SOL","properties":{"name":"Somaliland"},"geometry":{"type":"Polygon","coordinates":[[[48.93813,9.451749],[48.486736,8.837626],[47.78942,8.003],[46.948328,7.996877],[43.67875,9.18358],[43.296975,9.540477],[42.92812,10.02194],[42.55876,10.57258],[42.776852,10.926879],[43.145305,11.46204],[43.47066,11.27771],[43.666668,10.864169],[44.117804,10.445538],[44.614259,10.442205],[45.556941,10.698029],[46.645401,10.816549],[47.525658,11.127228],[48.021596,11.193064],[48.378 [...]
+{"type":"Feature","id":"SOM","properties":{"name":"Somalia"},"geometry":{"type":"Polygon","coordinates":[[[49.72862,11.5789],[50.25878,11.67957],[50.73202,12.0219],[51.1112,12.02464],[51.13387,11.74815],[51.04153,11.16651],[51.04531,10.6409],[50.83418,10.27972],[50.55239,9.19874],[50.07092,8.08173],[49.4527,6.80466],[48.59455,5.33911],[47.74079,4.2194],[46.56476,2.85529],[45.56399,2.04576],[44.06815,1.05283],[43.13597,0.2922],[42.04157,-0.91916],[41.81095,-1.44647],[41.58513,-1.68325],[4 [...]
+{"type":"Feature","id":"SRB","properties":{"name":"Republic of Serbia"},"geometry":{"type":"Polygon","coordinates":[[[20.874313,45.416375],[21.483526,45.18117],[21.562023,44.768947],[22.145088,44.478422],[22.459022,44.702517],[22.705726,44.578003],[22.474008,44.409228],[22.65715,44.234923],[22.410446,44.008063],[22.500157,43.642814],[22.986019,43.211161],[22.604801,42.898519],[22.436595,42.580321],[22.545012,42.461362],[22.380526,42.32026],[21.91708,42.30364],[21.576636,42.245224],[21.54 [...]
+{"type":"Feature","id":"SUR","properties":{"name":"Suriname"},"geometry":{"type":"Polygon","coordinates":[[[-57.147436,5.97315],[-55.949318,5.772878],[-55.84178,5.953125],[-55.03325,6.025291],[-53.958045,5.756548],[-54.478633,4.896756],[-54.399542,4.212611],[-54.006931,3.620038],[-54.181726,3.18978],[-54.269705,2.732392],[-54.524754,2.311849],[-55.097587,2.523748],[-55.569755,2.421506],[-55.973322,2.510364],[-56.073342,2.220795],[-55.9056,2.021996],[-55.995698,1.817667],[-56.539386,1.899 [...]
+{"type":"Feature","id":"SVK","properties":{"name":"Slovakia"},"geometry":{"type":"Polygon","coordinates":[[[18.853144,49.49623],[18.909575,49.435846],[19.320713,49.571574],[19.825023,49.217125],[20.415839,49.431453],[20.887955,49.328772],[21.607808,49.470107],[22.558138,49.085738],[22.280842,48.825392],[22.085608,48.422264],[21.872236,48.319971],[20.801294,48.623854],[20.473562,48.56285],[20.239054,48.327567],[19.769471,48.202691],[19.661364,48.266615],[19.174365,48.111379],[18.777025,48 [...]
+{"type":"Feature","id":"SVN","properties":{"name":"Slovenia"},"geometry":{"type":"Polygon","coordinates":[[[13.806475,46.509306],[14.632472,46.431817],[15.137092,46.658703],[16.011664,46.683611],[16.202298,46.852386],[16.370505,46.841327],[16.564808,46.503751],[15.768733,46.238108],[15.67153,45.834154],[15.323954,45.731783],[15.327675,45.452316],[14.935244,45.471695],[14.595109,45.634941],[14.411968,45.466166],[13.71506,45.500324],[13.93763,45.591016],[13.69811,46.016778],[13.806475,46.5 [...]
+{"type":"Feature","id":"SWE","properties":{"name":"Sweden"},"geometry":{"type":"Polygon","coordinates":[[[22.183173,65.723741],[21.213517,65.026005],[21.369631,64.413588],[19.778876,63.609554],[17.847779,62.7494],[17.119555,61.341166],[17.831346,60.636583],[18.787722,60.081914],[17.869225,58.953766],[16.829185,58.719827],[16.44771,57.041118],[15.879786,56.104302],[14.666681,56.200885],[14.100721,55.407781],[12.942911,55.361737],[12.625101,56.30708],[11.787942,57.441817],[11.027369,58.856 [...]
+{"type":"Feature","id":"SWZ","properties":{"name":"Swaziland"},"geometry":{"type":"Polygon","coordinates":[[[32.071665,-26.73382],[31.86806,-27.177927],[31.282773,-27.285879],[30.685962,-26.743845],[30.676609,-26.398078],[30.949667,-26.022649],[31.04408,-25.731452],[31.333158,-25.660191],[31.837778,-25.843332],[31.985779,-26.29178],[32.071665,-26.73382]]]}},
+{"type":"Feature","id":"SYR","properties":{"name":"Syria"},"geometry":{"type":"Polygon","coordinates":[[[38.792341,33.378686],[36.834062,32.312938],[35.719918,32.709192],[35.700798,32.716014],[35.836397,32.868123],[35.821101,33.277426],[36.06646,33.824912],[36.61175,34.201789],[36.448194,34.593935],[35.998403,34.644914],[35.905023,35.410009],[36.149763,35.821535],[36.41755,36.040617],[36.685389,36.259699],[36.739494,36.81752],[37.066761,36.623036],[38.167727,36.90121],[38.699891,36.71292 [...]
+{"type":"Feature","id":"TCD","properties":{"name":"Chad"},"geometry":{"type":"Polygon","coordinates":[[[14.495787,12.859396],[14.595781,13.330427],[13.954477,13.353449],[13.956699,13.996691],[13.540394,14.367134],[13.97217,15.68437],[15.247731,16.627306],[15.300441,17.92795],[15.685741,19.95718],[15.903247,20.387619],[15.487148,20.730415],[15.47106,21.04845],[15.096888,21.308519],[14.8513,22.86295],[15.86085,23.40972],[19.84926,21.49509],[23.83766,19.58047],[23.88689,15.61084],[23.02459, [...]
+{"type":"Feature","id":"TGO","properties":{"name":"Togo"},"geometry":{"type":"Polygon","coordinates":[[[1.865241,6.142158],[1.060122,5.928837],[0.836931,6.279979],[0.570384,6.914359],[0.490957,7.411744],[0.712029,8.312465],[0.461192,8.677223],[0.365901,9.465004],[0.36758,10.191213],[-0.049785,10.706918],[0.023803,11.018682],[0.899563,10.997339],[0.772336,10.470808],[1.077795,10.175607],[1.425061,9.825395],[1.463043,9.334624],[1.664478,9.12859],[1.618951,6.832038],[1.865241,6.142158]]]}},
+{"type":"Feature","id":"THA","properties":{"name":"Thailand"},"geometry":{"type":"Polygon","coordinates":[[[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.07551 [...]
+{"type":"Feature","id":"TJK","properties":{"name":"Tajikistan"},"geometry":{"type":"Polygon","coordinates":[[[71.014198,40.244366],[70.648019,39.935754],[69.55961,40.103211],[69.464887,39.526683],[70.549162,39.604198],[71.784694,39.279463],[73.675379,39.431237],[73.928852,38.505815],[74.257514,38.606507],[74.864816,38.378846],[74.829986,37.990007],[74.980002,37.41999],[73.948696,37.421566],[73.260056,37.495257],[72.63689,37.047558],[72.193041,36.948288],[71.844638,36.738171],[71.448693,3 [...]
+{"type":"Feature","id":"TKM","properties":{"name":"Turkmenistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[61.123071,36.491597],[60.377638,36.527383],[59.234762,37.412988],[58.436154,37.522309],[57.330434,38.029229],[56.619366,38.121394],[56.180375,37.935127],[55.511578,37.964117],[54.800304,37.392421],[53.921598,37.198918],[53.735511,37.906136],[53.880929,38.952093],[53.101028,39.290574],[53.357808,39.975286],[52.693973,40.033629],[52.915251,40.876523],[53.858 [...]
+{"type":"Feature","id":"TLS","properties":{"name":"East Timor"},"geometry":{"type":"Polygon","coordinates":[[[124.968682,-8.89279],[125.086246,-8.656887],[125.947072,-8.432095],[126.644704,-8.398247],[126.957243,-8.273345],[127.335928,-8.397317],[126.967992,-8.668256],[125.925885,-9.106007],[125.08852,-9.393173],[125.07002,-9.089987],[124.968682,-8.89279]]]}},
+{"type":"Feature","id":"TTO","properties":{"name":"Trinidad and Tobago"},"geometry":{"type":"Polygon","coordinates":[[[-61.68,10.76],[-61.105,10.89],[-60.895,10.855],[-60.935,10.11],[-61.77,10],[-61.95,10.09],[-61.66,10.365],[-61.68,10.76]]]}},
+{"type":"Feature","id":"TUN","properties":{"name":"Tunisia"},"geometry":{"type":"Polygon","coordinates":[[[9.48214,30.307556],[9.055603,32.102692],[8.439103,32.506285],[8.430473,32.748337],[7.612642,33.344115],[7.524482,34.097376],[8.140981,34.655146],[8.376368,35.479876],[8.217824,36.433177],[8.420964,36.946427],[9.509994,37.349994],[10.210002,37.230002],[10.18065,36.724038],[11.028867,37.092103],[11.100026,36.899996],[10.600005,36.41],[10.593287,35.947444],[10.939519,35.698984],[10.807 [...]
+{"type":"Feature","id":"TUR","properties":{"name":"Turkey"},"geometry":{"type":"MultiPolygon","coordinates":[[[[36.913127,41.335358],[38.347665,40.948586],[39.512607,41.102763],[40.373433,41.013673],[41.554084,41.535656],[42.619549,41.583173],[43.582746,41.092143],[43.752658,40.740201],[43.656436,40.253564],[44.400009,40.005],[44.79399,39.713003],[44.109225,39.428136],[44.421403,38.281281],[44.225756,37.971584],[44.772699,37.170445],[44.293452,37.001514],[43.942259,37.256228],[42.779126, [...]
+{"type":"Feature","id":"TWN","properties":{"name":"Taiwan"},"geometry":{"type":"Polygon","coordinates":[[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]]]}},
+{"type":"Feature","id":"TZA","properties":{"name":"United Republic of Tanzania"},"geometry":{"type":"Polygon","coordinates":[[[33.903711,-0.95],[34.07262,-1.05982],[37.69869,-3.09699],[37.7669,-3.67712],[39.20222,-4.67677],[38.74054,-5.90895],[38.79977,-6.47566],[39.44,-6.84],[39.47,-7.1],[39.19469,-7.7039],[39.25203,-8.00781],[39.18652,-8.48551],[39.53574,-9.11237],[39.9496,-10.0984],[40.31659,-10.3171],[39.521,-10.89688],[38.427557,-11.285202],[37.82764,-11.26879],[37.47129,-11.56876], [...]
+{"type":"Feature","id":"UGA","properties":{"name":"Uganda"},"geometry":{"type":"Polygon","coordinates":[[[31.86617,-1.02736],[30.76986,-1.01455],[30.419105,-1.134659],[29.821519,-1.443322],[29.579466,-1.341313],[29.587838,-0.587406],[29.8195,-0.2053],[29.875779,0.59738],[30.086154,1.062313],[30.468508,1.583805],[30.85267,1.849396],[31.174149,2.204465],[30.77332,2.33989],[30.83385,3.50917],[31.24556,3.7819],[31.88145,3.55827],[32.68642,3.79232],[33.39,3.79],[34.005,4.249885],[34.47913,3.5 [...]
+{"type":"Feature","id":"UKR","properties":{"name":"Ukraine"},"geometry":{"type":"Polygon","coordinates":[[[31.785998,52.101678],[32.159412,52.061267],[32.412058,52.288695],[32.715761,52.238465],[33.7527,52.335075],[34.391731,51.768882],[34.141978,51.566413],[34.224816,51.255993],[35.022183,51.207572],[35.377924,50.773955],[35.356116,50.577197],[36.626168,50.225591],[37.39346,50.383953],[38.010631,49.915662],[38.594988,49.926462],[40.069058,49.601055],[40.080789,49.30743],[39.674664,48.78 [...]
+{"type":"Feature","id":"URY","properties":{"name":"Uruguay"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.976026,-30.109686],[-55.973245,-30.883076],[-55.60151,-30.853879],[-54.572452,-31.494511],[-53.787952,-32.047243],[-53.209589,-32.727666],[-53.650544,-33.202004],[-53.373662,-33.768378],[-53.806426,-34.396815],[-54.935866,-34.952647],[-55.67409,-34.752659],[-56.215297,-34.859836],[-57.139685,-34.430456],[-57.817861,-34.462547],[-58.427074,-33.909454],[-58 [...]
+{"type":"Feature","id":"USA","properties":{"name":"United States of America"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.54211,19.08348],[-155.68817,18.91619],[-155.93665,19.05939],[-155.90806,19.33888],[-156.07347,19.70294],[-156.02368,19.81422],[-155.85008,19.97729],[-155.91907,20.17395],[-155.86108,20.26721],[-155.78505,20.2487],[-155.40214,20.07975],[-155.22452,19.99302],[-155.06226,19.8591],[-154.80741,19.50871],[-154.83147,19.45328],[-155.22217,19.23972],[-155.54211,1 [...]
+{"type":"Feature","id":"UZB","properties":{"name":"Uzbekistan"},"geometry":{"type":"Polygon","coordinates":[[[66.518607,37.362784],[66.54615,37.974685],[65.215999,38.402695],[64.170223,38.892407],[63.518015,39.363257],[62.37426,40.053886],[61.882714,41.084857],[61.547179,41.26637],[60.465953,41.220327],[60.083341,41.425146],[59.976422,42.223082],[58.629011,42.751551],[57.78653,42.170553],[56.932215,41.826026],[57.096391,41.32231],[55.968191,41.308642],[55.928917,44.995858],[58.503127,45. [...]
+{"type":"Feature","id":"VEN","properties":{"name":"Venezuela"},"geometry":{"type":"Polygon","coordinates":[[[-71.331584,11.776284],[-71.360006,11.539994],[-71.94705,11.423282],[-71.620868,10.96946],[-71.633064,10.446494],[-72.074174,9.865651],[-71.695644,9.072263],[-71.264559,9.137195],[-71.039999,9.859993],[-71.350084,10.211935],[-71.400623,10.968969],[-70.155299,11.375482],[-70.293843,11.846822],[-69.943245,12.162307],[-69.5843,11.459611],[-68.882999,11.443385],[-68.233271,10.885744],[ [...]
+{"type":"Feature","id":"VNM","properties":{"name":"Vietnam"},"geometry":{"type":"Polygon","coordinates":[[[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544],[105.1 [...]
+{"type":"Feature","id":"VUT","properties":{"name":"Vanuatu"},"geometry":{"type":"MultiPolygon","coordinates":[[[[167.844877,-16.466333],[167.515181,-16.59785],[167.180008,-16.159995],[167.216801,-15.891846],[167.844877,-16.466333]]],[[[167.107712,-14.93392],[167.270028,-15.740021],[167.001207,-15.614602],[166.793158,-15.668811],[166.649859,-15.392704],[166.629137,-14.626497],[167.107712,-14.93392]]]]}},
+{"type":"Feature","id":"PSE","properties":{"name":"West Bank"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.545252,31.782505],[35.397561,31.489086],[34.927408,31.353435],[34.970507,31.616778],[35.225892,31.754341],[34.974641,31.866582],[35.18393,32.532511],[35.545665,32.393992]]]}},
+{"type":"Feature","id":"YEM","properties":{"name":"Yemen"},"geometry":{"type":"Polygon","coordinates":[[[53.108573,16.651051],[52.385206,16.382411],[52.191729,15.938433],[52.168165,15.59742],[51.172515,15.17525],[49.574576,14.708767],[48.679231,14.003202],[48.238947,13.94809],[47.938914,14.007233],[47.354454,13.59222],[46.717076,13.399699],[45.877593,13.347764],[45.62505,13.290946],[45.406459,13.026905],[45.144356,12.953938],[44.989533,12.699587],[44.494576,12.721653],[44.175113,12.58595 [...]
+{"type":"Feature","id":"ZAF","properties":{"name":"South Africa"},"geometry":{"type":"Polygon","coordinates":[[[31.521001,-29.257387],[31.325561,-29.401978],[30.901763,-29.909957],[30.622813,-30.423776],[30.055716,-31.140269],[28.925553,-32.172041],[28.219756,-32.771953],[27.464608,-33.226964],[26.419452,-33.61495],[25.909664,-33.66704],[25.780628,-33.944646],[25.172862,-33.796851],[24.677853,-33.987176],[23.594043,-33.794474],[22.988189,-33.916431],[22.574157,-33.864083],[21.542799,-34. [...]
+{"type":"Feature","id":"ZMB","properties":{"name":"Zambia"},"geometry":{"type":"Polygon","coordinates":[[[32.759375,-9.230599],[33.231388,-9.676722],[33.485688,-10.525559],[33.31531,-10.79655],[33.114289,-11.607198],[33.306422,-12.435778],[32.991764,-12.783871],[32.688165,-13.712858],[33.214025,-13.97186],[30.179481,-14.796099],[30.274256,-15.507787],[29.516834,-15.644678],[28.947463,-16.043051],[28.825869,-16.389749],[28.467906,-16.4684],[27.598243,-17.290831],[27.044427,-17.938026],[26 [...]
+{"type":"Feature","id":"ZWE","properties":{"name":"Zimbabwe"},"geometry":{"type":"Polygon","coordinates":[[[31.191409,-22.25151],[30.659865,-22.151567],[30.322883,-22.271612],[29.839037,-22.102216],[29.432188,-22.091313],[28.794656,-21.639454],[28.02137,-21.485975],[27.727228,-20.851802],[27.724747,-20.499059],[27.296505,-20.39152],[26.164791,-19.293086],[25.850391,-18.714413],[25.649163,-18.536026],[25.264226,-17.73654],[26.381935,-17.846042],[26.706773,-17.961229],[27.044427,-17.938026 [...]
+]}
diff --git a/examples/data/geojson/line-samples.geojson b/examples/data/geojson/line-samples.geojson
new file mode 100644
index 0000000..21ebbe2
--- /dev/null
+++ b/examples/data/geojson/line-samples.geojson
@@ -0,0 +1,16 @@
+{
+"type": "FeatureCollection",
+"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
+                                                                                
+"features": [
+{ "type": "Feature", "properties": { "name": "Roussel" }, "geometry": { "type": "LineString", "coordinates": [ [ -74.317812426119204, 48.287712285170407 ], [ -73.965445435101188, 48.287712285170407 ] ] } },
+{ "type": "Feature", "properties": { "name": "de la Grande-Décharge Sud" }, "geometry": { "type": "LineString", "coordinates": [ [ -72.890274359943689, 47.66777849648031 ], [ -73.03935270229745, 47.552045722357249 ], [ -73.03483517677158, 47.743778832463107 ], [ -72.750231068641639, 47.749854072477497 ], [ -72.754748594167509, 47.552045722357249 ] ] } },
+{ "type": "Feature", "properties": { "name": "du Saguenay Ouest" }, "geometry": { "type": "LineString", "coordinates": [ [ -73.007730023616347, 48.07082744644633 ], [ -72.894791885469544, 47.889388912080449 ], [ -72.727643441012276, 48.082900678850329 ], [ -72.560494996555022, 47.895447137861773 ] ] } },
+{ "type": "Feature", "properties": { "name": "Saint-Anicet" }, "geometry": { "type": "LineString", "coordinates": [ [ -72.985142395986983, 48.338787334581873 ], [ -72.980624870461128, 48.161307640513321 ], [ -72.885756834417805, 48.164320903012829 ], [ -72.894791885469544, 48.338787334581873 ] ] } },
+{ "type": "Feature", "properties": { "name": "Saint-Remy-en-Bouzemont-Saint-Genest-et-Isson" }, "geometry": { "type": "LineString", "coordinates": [ [ -73.459482576203527, 47.53679865861892 ], [ -73.454965050677686, 47.719470781160837 ] ] } },
+{ "type": "Feature", "properties": { "name": "Sainte-Geneviève" }, "geometry": { "type": "LineString", "coordinates": [ [ -73.716981531178234, 47.889388912080449 ], [ -73.423342371996569, 48.091953743979651 ], [ -73.242641350961676, 47.883329977544491 ], [ -73.685358852497131, 47.862118125007399 ] ] } },
+{ "type": "Feature", "properties": { "name": "de Lombard" }, "geometry": { "type": "LineString", "coordinates": [ [ -73.631148546186679, 48.323770568268507 ], [ -73.626631020660795, 48.185408784389622 ], [ -73.55435061224685, 48.188420630879783 ], [ -73.55435061224685, 48.320766684325278 ], [ -73.473035152781165, 48.317762623483489 ], [ -73.482070203832905, 48.19745510840756 ], [ -73.400754744367205, 48.206487993065075 ], [ -73.396237218841335, 48.323770568268507 ], [ -73.301369182798027 [...]
+{ "type": "Feature", "properties": { "name": "de la Grande-Baie Sud" }, "geometry": { "type": "LineString", "coordinates": [ [ -74.439785615317746, 47.564240180362376 ], [ -74.227461915601779, 47.716431476953346 ], [ -74.055795945618627, 47.552045722357249 ], [ -73.879612450109633, 47.710352336655504 ] ] } },
+{ "type": "Feature", "properties": { "name": "de Tadoussac" }, "geometry": { "type": "LineString", "coordinates": [ [ -74.313294900593348, 48.091953743979651 ], [ -74.313294900593348, 47.880300244488787 ], [ -73.974480486152942, 47.877270334238752 ], [ -73.978998011678812, 48.076864416783366 ] ] } }
+]
+}
diff --git a/examples/data/geojson/point-samples.geojson b/examples/data/geojson/point-samples.geojson
new file mode 100644
index 0000000..cdc8d4e
--- /dev/null
+++ b/examples/data/geojson/point-samples.geojson
@@ -0,0 +1,16 @@
+{
+"type": "FeatureCollection",
+"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
+                                                                                
+"features": [
+{ "type": "Feature", "properties": { "name": "Saguenay (Arrondissement Latterière)" }, "geometry": { "type": "Point", "coordinates": [ -75.849253579389796, 47.6434349837781 ] } },
+{ "type": "Feature", "properties": { "name": "Canton Tremblay" }, "geometry": { "type": "Point", "coordinates": [ -75.840218528338056, 47.971115165183342 ] } },
+{ "type": "Feature", "properties": { "name": "Saint-Félix-d'Otis" }, "geometry": { "type": "Point", "coordinates": [ -75.849253579389796, 48.278693733790902 ] } },
+{ "type": "Feature", "properties": { "name": "La Baie" }, "geometry": { "type": "Point", "coordinates": [ -74.792152606335762, 47.649521925935176 ] } },
+{ "type": "Feature", "properties": { "name": "Saint-David-de-Falardeau" }, "geometry": { "type": "Point", "coordinates": [ -74.801187657387501, 47.977163824275436 ] } },
+{ "type": "Feature", "properties": { "name": "Saint-Honoré-de-Chicoutimi" }, "geometry": { "type": "Point", "coordinates": [ -74.792152606335762, 48.284706278302295 ] } },
+{ "type": "Feature", "properties": { "name": "Alma" }, "geometry": { "type": "Point", "coordinates": [ -75.298115465233423, 47.6434349837781 ] } },
+{ "type": "Feature", "properties": { "name": "Jonquière" }, "geometry": { "type": "Point", "coordinates": [ -75.298115465233423, 47.971115165183342 ] } },
+{ "type": "Feature", "properties": { "name": "Chicoutimi" }, "geometry": { "type": "Point", "coordinates": [ -75.289080414181669, 48.284706278302295 ] } }
+]
+}
diff --git a/examples/data/geojson/polygon-samples.geojson b/examples/data/geojson/polygon-samples.geojson
new file mode 100644
index 0000000..eef9eee
--- /dev/null
+++ b/examples/data/geojson/polygon-samples.geojson
@@ -0,0 +1,16 @@
+{
+"type": "FeatureCollection",
+"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
+                                                                                
+"features": [
+{ "type": "Feature", "properties": { "name": "Parc de la Colline" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.357206347890767, 47.72858763003908 ], [ -71.86027854004486, 47.527648291638172 ], [ -72.37075892446839, 47.539848426151735 ], [ -72.357206347890767, 47.72858763003908 ] ] ] } },
+{ "type": "Feature", "properties": { "name": "Centre Paul-Étienne Simard" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.357206347890767, 48.013440900213297 ], [ -72.239750684218109, 48.013440900213297 ], [ -72.253303260795718, 47.856056000888501 ], [ -72.027426984502114, 47.856056000888501 ], [ -72.036462035553868, 48.013440900213297 ], [ -71.905453795303586, 48.01646283861713 ], [ -71.891901218725963, 47.801464984333364 ], [ -72.361723873416651, 47.810567474765456 ], [ -7 [...]
+{ "type": "Feature", "properties": { "name": "Loisirs Rivière du Moulin" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -72.194575428959382, 48.33278115872843 ], [ -72.018391933450374, 48.33278115872843 ], [ -71.846725963467236, 48.251628525276693 ], [ -71.950629050562299, 48.107038644740094 ], [ -72.203610480011122, 48.107038644740094 ], [ -72.397864077623623, 48.221539261269051 ], [ -72.194575428959382, 48.33278115872843 ] ] ] } },
+{ "type": "Feature", "properties": { "name": "L'Étoile-du-Nord" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.589227008492543, 47.649521925935176 ], [ -71.525981651130337, 47.734664642855655 ], [ -71.48532392139748, 47.649521925935169 ], [ -71.295587849310877, 47.637347332276697 ], [ -71.462736293768117, 47.585573652777313 ], [ -71.390455885354172, 47.475766052599219 ], [ -71.535016702182091, 47.552045722357242 ], [ -71.702165146639345, 47.491030857179695 ], [ -71.61633216 [...]
+{ "type": "Feature", "properties": { "name": "Loisirs Lavoie et St-Jean-Baptiste" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.729270299794578, 48.010418784700107 ], [ -71.291070323784993, 48.004374022337799 ], [ -71.291070323784993, 47.777183877693901 ], [ -71.729270299794578, 47.786290622064854 ], [ -71.729270299794578, 48.010418784700107 ] ] ] } },
+{ "type": "Feature", "properties": { "name": "Loisirs Diamant" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.693130095587605, 48.341790157179155 ], [ -71.286552798259123, 48.344792802893032 ], [ -71.449183717190522, 48.224548983994914 ], [ -71.277517747207369, 48.070827446446337 ], [ -71.751857927423927, 48.085918544287573 ], [ -71.507911549026844, 48.21551928490868 ], [ -71.693130095587605, 48.341790157179155 ] ] ] } },
+{ "type": "Feature", "properties": { "name": "Sydenham" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.051641470913779, 47.710352336655504 ], [ -70.911598179611758, 47.710352336655504 ], [ -70.925150756189367, 47.619080121567436 ], [ -70.712827056473373, 47.616034965734443 ], [ -70.721862107525112, 47.448278226184989 ], [ -70.857387873301292, 47.448278226184989 ], [ -70.852870347775408, 47.552045722357249 ], [ -71.056158996439635, 47.552045722357249 ], [ -71.051641470913779 [...]
+{ "type": "Feature", "properties": { "name": "Saint-Luc" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -71.110369302750115, 47.798430466372736 ], [ -70.902563128560018, 47.983211774835986 ], [ -70.699274479895777, 47.789325849015306 ], [ -71.110369302750115, 47.798430466372736 ] ] ] } },
+{ "type": "Feature", "properties": { "name": "Loisirs du Fjord du Saguenay" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -70.988396113551573, 48.32977780546792 ], [ -70.812212618042579, 48.32977780546792 ], [ -70.807695092516681, 48.209498600656133 ], [ -70.631511597007702, 48.209498600656147 ], [ -70.636029122533571, 48.079882636349602 ], [ -71.146509506957088, 48.082900678850329 ], [ -71.151027032482972, 48.212509031269981 ], [ -70.983878588025689, 48.209498600656133 ], [ - [...]
+]
+}
diff --git a/examples/data/geojson/switzerland.geojson b/examples/data/geojson/switzerland.geojson
new file mode 100644
index 0000000..eea0851
--- /dev/null
+++ b/examples/data/geojson/switzerland.geojson
@@ -0,0 +1,4 @@
+{"type":"FeatureCollection","features":[
+{"type":"Feature","id":"CHE","properties":{"name":"Switzerland"},"geometry":{"type":"Polygon","coordinates":[[[9.594226,47.525058],[9.632932,47.347601],[9.47997,47.10281],[9.932448,46.920728],[10.442701,46.893546],[10.363378,46.483571],[9.922837,46.314899],[9.182882,46.440215],[8.966306,46.036932],[8.489952,46.005151],[8.31663,46.163642],[7.755992,45.82449],[7.273851,45.776948],[6.843593,45.991147],[6.5001,46.429673],[6.022609,46.27299],[6.037389,46.725779],[6.768714,47.287708],[6.736571 [...]
+{"type":"Feature","id":"LSNE","properties":{"name":"Lausanne"},"geometry":{"type":"Point","coordinates":[6.6339863,46.5193823]}}
+]}
diff --git a/examples/data/geolocation-orientation.json b/examples/data/geolocation-orientation.json
new file mode 100644
index 0000000..0bb5d90
--- /dev/null
+++ b/examples/data/geolocation-orientation.json
@@ -0,0 +1,729 @@
+{
+  "data": [{
+    "coords": {
+      "speed": 1.7330950498580933,
+      "accuracy": 5,
+      "altitudeAccuracy": 8,
+      "altitude": 238,
+      "longitude": 5.868668798362713,
+      "heading": 67.5,
+      "latitude": 45.64444874417562
+    },
+    "timestamp": 1394788264972
+  }, {
+    "coords": {
+      "speed": 1.9535436630249023,
+      "accuracy": 5,
+      "altitudeAccuracy": 8,
+      "altitude": 238,
+      "longitude": 5.868715401744348,
+      "heading": 69.609375,
+      "latitude": 45.64446391542036
+    },
+    "timestamp": 1394788266115
+  }, {
+    "coords": {
+      "speed": 2.1882569789886475,
+      "accuracy": 10,
+      "altitudeAccuracy": 8,
+      "altitude": 238,
+      "longitude": 5.868768962105614,
+      "heading": 67.5,
+      "latitude": 45.644484995906836
+    },
+    "timestamp": 1394788267107
+  }, {
+    "coords": {
+      "speed": 2.4942498207092285,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 237,
+      "longitude": 5.868825791409117,
+      "heading": 68.5546875,
+      "latitude": 45.64450435810316
+    },
+    "timestamp": 1394788267959
+  }, {
+    "coords": {
+      "speed": 2.7581217288970947,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 237,
+      "longitude": 5.868881698703271,
+      "heading": 69.609375,
+      "latitude": 45.64452149909515
+    },
+    "timestamp": 1394788268964
+  }, {
+    "coords": {
+      "speed": 3.3746347427368164,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 236,
+      "longitude": 5.868938528006774,
+      "heading": 70.3125,
+      "latitude": 45.644536712249405
+    },
+    "timestamp": 1394788270116
+  }, {
+    "coords": {
+      "speed": 3.597411870956421,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 236,
+      "longitude": 5.868992004549009,
+      "heading": 74.8828125,
+      "latitude": 45.644547943999655
+    },
+    "timestamp": 1394788271158
+  }, {
+    "coords": {
+      "speed": 3.6382505893707275,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 236,
+      "longitude": 5.869038775568706,
+      "heading": 73.828125,
+      "latitude": 45.64456005584974
+    },
+    "timestamp": 1394788271893
+  }, {
+    "coords": {
+      "speed": 3.65671443939209,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 236,
+      "longitude": 5.869091162463528,
+      "heading": 73.4765625,
+      "latitude": 45.644572335337884
+    },
+    "timestamp": 1394788272903
+  }, {
+    "coords": {
+      "speed": 3.7153592109680176,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 236,
+      "longitude": 5.869144219910604,
+      "heading": 73.125,
+      "latitude": 45.64458671030182
+    },
+    "timestamp": 1394788273914
+  }, {
+    "coords": {
+      "speed": 3.8041043281555176,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 236,
+      "longitude": 5.869205072527629,
+      "heading": 72.421875,
+      "latitude": 45.64460313883204
+    },
+    "timestamp": 1394788274901
+  }, {
+    "coords": {
+      "speed": 3.9588162899017334,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 236,
+      "longitude": 5.869268858810765,
+      "heading": 72.421875,
+      "latitude": 45.64461990263838
+    },
+    "timestamp": 1394788276140
+  }, {
+    "coords": {
+      "speed": 4.152309417724609,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 235,
+      "longitude": 5.869351252918941,
+      "heading": 78.046875,
+      "latitude": 45.64466122542102
+    },
+    "timestamp": 1394788276948
+  }, {
+    "coords": {
+      "speed": 4.49971866607666,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 236,
+      "longitude": 5.869433479389054,
+      "heading": 79.8046875,
+      "latitude": 45.64467040360499
+    },
+    "timestamp": 1394788277892
+  }, {
+    "coords": {
+      "speed": 4.824056148529053,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 235,
+      "longitude": 5.869504055013758,
+      "heading": 91.40625,
+      "latitude": 45.64466089014489
+    },
+    "timestamp": 1394788279211
+  }, {
+    "coords": {
+      "speed": 5.269814491271973,
+      "accuracy": 10,
+      "altitudeAccuracy": 6,
+      "altitude": 235,
+      "longitude": 5.869575049733621,
+      "heading": 91.40625,
+      "latitude": 45.64465967476893
+    },
+    "timestamp": 1394788279898
+  }, {
+    "coords": {
+      "speed": 5.4861016273498535,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 235,
+      "longitude": 5.86963213049422,
+      "heading": 95.2734375,
+      "latitude": 45.64465091568012
+    },
+    "timestamp": 1394788280935
+  }, {
+    "coords": {
+      "speed": 5.380503177642822,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 235,
+      "longitude": 5.869714859878523,
+      "heading": 75.5859375,
+      "latitude": 45.64468792178262
+    },
+    "timestamp": 1394788281930
+  }, {
+    "coords": {
+      "speed": 5.276519775390625,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 234,
+      "longitude": 5.869746124377353,
+      "heading": 55.1953125,
+      "latitude": 45.64467706721801
+    },
+    "timestamp": 1394788282909
+  }, {
+    "coords": {
+      "speed": 5.212399482727051,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 232,
+      "longitude": 5.8697939850444625,
+      "heading": 49.5703125,
+      "latitude": 45.64467899505574
+    },
+    "timestamp": 1394788284221
+  }, {
+    "coords": {
+      "speed": 5.174651622772217,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 232,
+      "longitude": 5.869789123540623,
+      "heading": 18.984375,
+      "latitude": 45.64469378911484
+    },
+    "timestamp": 1394788284924
+  }, {
+    "coords": {
+      "speed": 5.211904525756836,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 232,
+      "longitude": 5.869806222623093,
+      "heading": 10.1953125,
+      "latitude": 45.64473896757294
+    },
+    "timestamp": 1394788286251
+  }, {
+    "coords": {
+      "speed": 5.254780292510986,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 233,
+      "longitude": 5.86982952431391,
+      "heading": 18.6328125,
+      "latitude": 45.64478381075491
+    },
+    "timestamp": 1394788286927
+  }, {
+    "coords": {
+      "speed": 5.329030513763428,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 232,
+      "longitude": 5.869875792419417,
+      "heading": 33.75,
+      "latitude": 45.644830078860416
+    },
+    "timestamp": 1394788288221
+  }, {
+    "coords": {
+      "speed": 5.384955883026123,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 232,
+      "longitude": 5.869927508761985,
+      "heading": 46.7578125,
+      "latitude": 45.64486025371183
+    },
+    "timestamp": 1394788288935
+  }, {
+    "coords": {
+      "speed": 5.309582233428955,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 232,
+      "longitude": 5.869972854858143,
+      "heading": 47.109375,
+      "latitude": 45.644890596201314
+    },
+    "timestamp": 1394788290178
+  }, {
+    "coords": {
+      "speed": 5.250724792480469,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.870029265066488,
+      "heading": 46.40625,
+      "latitude": 45.644932673355235
+    },
+    "timestamp": 1394788290890
+  }, {
+    "coords": {
+      "speed": 5.3057990074157715,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.870077712466819,
+      "heading": 39.375,
+      "latitude": 45.644970224281444
+    },
+    "timestamp": 1394788291884
+  }, {
+    "coords": {
+      "speed": 5.431822299957275,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.870133116846783,
+      "heading": 43.59375,
+      "latitude": 45.6450097449549
+    },
+    "timestamp": 1394788292885
+  }, {
+    "coords": {
+      "speed": 5.542125225067139,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.870186509569986,
+      "heading": 43.59375,
+      "latitude": 45.645047421609654
+    },
+    "timestamp": 1394788294100
+  }, {
+    "coords": {
+      "speed": 5.647174835205078,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.870246104901535,
+      "heading": 42.890625,
+      "latitude": 45.645093647805645
+    },
+    "timestamp": 1394788295157
+  }, {
+    "coords": {
+      "speed": 5.735793590545654,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 230,
+      "longitude": 5.870298156520231,
+      "heading": 42.5390625,
+      "latitude": 45.64514368776758
+    },
+    "timestamp": 1394788296124
+  }, {
+    "coords": {
+      "speed": 5.809989929199219,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 230,
+      "longitude": 5.870346436282499,
+      "heading": 43.59375,
+      "latitude": 45.64519154843469
+    },
+    "timestamp": 1394788296960
+  }, {
+    "coords": {
+      "speed": 5.877871036529541,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 228,
+      "longitude": 5.87034755932109,
+      "heading": 42.75193405151367,
+      "latitude": 45.645270362475216
+    },
+    "timestamp": 1394788298177
+  }, {
+    "coords": {
+      "speed": 5.937166690826416,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 228,
+      "longitude": 5.870402806867787,
+      "heading": 42.75193405151367,
+      "latitude": 45.645312142096095
+    },
+    "timestamp": 1394788298898
+  }, {
+    "coords": {
+      "speed": 6.071393966674805,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 229,
+      "longitude": 5.870464520921814,
+      "heading": 43.183074951171875,
+      "latitude": 45.64535851937182
+    },
+    "timestamp": 1394788299897
+  }, {
+    "coords": {
+      "speed": 6.329115390777588,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 230,
+      "longitude": 5.8705368384107715,
+      "heading": 43.183074951171875,
+      "latitude": 45.645412389093565
+    },
+    "timestamp": 1394788300957
+  }, {
+    "coords": {
+      "speed": 6.581554889678955,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 229,
+      "longitude": 5.870600162706978,
+      "heading": 43.183074951171875,
+      "latitude": 45.64545955929912
+    },
+    "timestamp": 1394788302211
+  }, {
+    "coords": {
+      "speed": 6.605470180511475,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 230,
+      "longitude": 5.870657211053185,
+      "heading": 43.183074951171875,
+      "latitude": 45.64550205482465
+    },
+    "timestamp": 1394788302917
+  }, {
+    "coords": {
+      "speed": 6.623170375823975,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 229,
+      "longitude": 5.870713613403495,
+      "heading": 43.183074951171875,
+      "latitude": 45.64554406917767
+    },
+    "timestamp": 1394788303929
+  }, {
+    "coords": {
+      "speed": 6.645580768585205,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 229,
+      "longitude": 5.870773011629353,
+      "heading": 43.183074951171875,
+      "latitude": 45.64558831489415
+    },
+    "timestamp": 1394788304902
+  }, {
+    "coords": {
+      "speed": 6.663600444793701,
+      "accuracy": 5,
+      "altitudeAccuracy": 4,
+      "altitude": 229,
+      "longitude": 5.87083890910435,
+      "heading": 43.183074951171875,
+      "latitude": 45.645637401898654
+    },
+    "timestamp": 1394788306035
+  }, {
+    "coords": {
+      "speed": 6.664675712585449,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 229,
+      "longitude": 5.870890033475007,
+      "heading": 43.183074951171875,
+      "latitude": 45.64567548463474
+    },
+    "timestamp": 1394788307080
+  }, {
+    "coords": {
+      "speed": 6.6489081382751465,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 228,
+      "longitude": 5.870943189474929,
+      "heading": 43.183074951171875,
+      "latitude": 45.645715080460064
+    },
+    "timestamp": 1394788308211
+  }, {
+    "coords": {
+      "speed": 6.551820755004883,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 228,
+      "longitude": 5.871005613698799,
+      "heading": 43.183074951171875,
+      "latitude": 45.64576158014743
+    },
+    "timestamp": 1394788308904
+  }, {
+    "coords": {
+      "speed": 6.467689514160156,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 229,
+      "longitude": 5.871058030061249,
+      "heading": 43.183074951171875,
+      "latitude": 45.64580062501799
+    },
+    "timestamp": 1394788310161
+  }, {
+    "coords": {
+      "speed": 6.3997955322265625,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 229,
+      "longitude": 5.871062579208228,
+      "heading": 43.183074951171875,
+      "latitude": 45.64580401381376
+    },
+    "timestamp": 1394788310957
+  }, {
+    "coords": {
+      "speed": 5.799798488616943,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 230,
+      "longitude": 5.8710817079554545,
+      "heading": 43.183074951171875,
+      "latitude": 45.64581826277647
+    },
+    "timestamp": 1394788312036
+  }, {
+    "coords": {
+      "speed": 4.424941062927246,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 230,
+      "longitude": 5.871121835629857,
+      "heading": 175.4296875,
+      "latitude": 45.645828271551544
+    },
+    "timestamp": 1394788312951
+  }, {
+    "coords": {
+      "speed": 4.3496222496032715,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.8710026017471595,
+      "heading": 176.484375,
+      "latitude": 45.645752236602775
+    },
+    "timestamp": 1394788315227
+  }, {
+    "coords": {
+      "speed": 5.076380252838135,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 232,
+      "longitude": 5.871189236646398,
+      "heading": 176.1328125,
+      "latitude": 45.64553692475487
+    },
+    "timestamp": 1394788316970
+  }, {
+    "coords": {
+      "speed": 5.102786064147949,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.871200384577616,
+      "heading": 171.2109375,
+      "latitude": 45.64548554368843
+    },
+    "timestamp": 1394788317965
+  }, {
+    "coords": {
+      "speed": 4.705626964569092,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.871210945775612,
+      "heading": 164.1796875,
+      "latitude": 45.645453105723156
+    },
+    "timestamp": 1394788318956
+  }, {
+    "coords": {
+      "speed": 4.378190040588379,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 231,
+      "longitude": 5.87124749087344,
+      "heading": 126.2109375,
+      "latitude": 45.645433282522156
+    },
+    "timestamp": 1394788320197
+  }, {
+    "coords": {
+      "speed": 4.208680152893066,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 233,
+      "longitude": 5.871283365419014,
+      "heading": 125.859375,
+      "latitude": 45.6454103999265
+    },
+    "timestamp": 1394788320894
+  }, {
+    "coords": {
+      "speed": 4.072604179382324,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 233,
+      "longitude": 5.871314043184622,
+      "heading": 103.359375,
+      "latitude": 45.645410819021656
+    },
+    "timestamp": 1394788322169
+  }, {
+    "coords": {
+      "speed": 3.7680623531341553,
+      "accuracy": 5,
+      "altitudeAccuracy": 6,
+      "altitude": 234,
+      "longitude": 5.871355114510163,
+      "heading": 92.4609375,
+      "latitude": 45.645418111277415
+    },
+    "timestamp": 1394788322898
+  }, {
+    "coords": {
+      "speed": 3.537794351577759,
+      "accuracy": 10,
+      "altitudeAccuracy": 6,
+      "altitude": 234,
+      "longitude": 5.871393922721847,
+      "heading": 92.4609375,
+      "latitude": 45.64541693781097
+    },
+    "timestamp": 1394788323968
+  }, {
+    "coords": {
+      "speed": 3.3741507530212402,
+      "accuracy": 10,
+      "altitudeAccuracy": 6,
+      "altitude": 234,
+      "longitude": 5.8714455552453835,
+      "heading": 75.5859375,
+      "latitude": 45.645444011358215
+    },
+    "timestamp": 1394788324896
+  }, {
+    "coords": {
+      "speed": 3.3729660511016846,
+      "accuracy": 10,
+      "altitudeAccuracy": 6,
+      "altitude": 235,
+      "longitude": 5.87150791660498,
+      "heading": 70.3125,
+      "latitude": 45.64547209073384
+    },
+    "timestamp": 1394788325971
+  }, {
+    "coords": {
+      "speed": 3.463883876800537,
+      "accuracy": 10,
+      "altitudeAccuracy": 6,
+      "altitude": 235,
+      "longitude": 5.871554352348551,
+      "heading": 70.3125,
+      "latitude": 45.64548374157925
+    },
+    "timestamp": 1394788327122
+  }, {
+    "coords": {
+      "speed": 3.5247886180877686,
+      "accuracy": 10,
+      "altitudeAccuracy": 6,
+      "altitude": 235,
+      "longitude": 5.871567260479435,
+      "heading": 67.1484375,
+      "latitude": 45.645496733529164
+    },
+    "timestamp": 1394788328164
+  }, {
+    "coords": {
+      "speed": 3.455146551132202,
+      "accuracy": 10,
+      "altitudeAccuracy": 6,
+      "altitude": 235,
+      "longitude": 5.871608583262071,
+      "heading": 68.90625,
+      "latitude": 45.64550293613751
+    },
+    "timestamp": 1394788328985
+  }, {
+    "coords": {
+      "speed": 3.382997989654541,
+      "accuracy": 10,
+      "altitudeAccuracy": 8,
+      "altitude": 236,
+      "longitude": 5.871640518313154,
+      "heading": 78.75,
+      "latitude": 45.6454965658911
+    },
+    "timestamp": 1394788329900
+  }, {
+    "coords": {
+      "speed": 3.242330312728882,
+      "accuracy": 10,
+      "altitudeAccuracy": 8,
+      "altitude": 236,
+      "longitude": 5.871667759498462,
+      "heading": 92.4609375,
+      "latitude": 45.64548562750746
+    },
+    "timestamp": 1394788331120
+  }, {
+    "coords": {
+      "speed": 3.074465274810791,
+      "accuracy": 10,
+      "altitudeAccuracy": 8,
+      "altitude": 236,
+      "longitude": 5.871691312646374,
+      "heading": 110.0390625,
+      "latitude": 45.645468402696444
+    },
+    "timestamp": 1394788332219
+  }]
+}
diff --git a/examples/data/geolocation_marker.png b/examples/data/geolocation_marker.png
new file mode 100644
index 0000000..6258640
Binary files /dev/null and b/examples/data/geolocation_marker.png differ
diff --git a/examples/data/geolocation_marker_heading.png b/examples/data/geolocation_marker_heading.png
new file mode 100644
index 0000000..5edfadc
Binary files /dev/null and b/examples/data/geolocation_marker_heading.png differ
diff --git a/examples/data/gml/topp-states-wfs.xml b/examples/data/gml/topp-states-wfs.xml
new file mode 100644
index 0000000..29edac4
--- /dev/null
+++ b/examples/data/gml/topp-states-wfs.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="49" timeStamp="2013-05-17T09:43:05.282Z" xsi:schemaLocation="http://www.openplans.org/topp http://demo.opengeo.org/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp%3Astates http://www.opengis.net/wfs http://demo.opengeo.org/geoserver/schemas/wfs/1.1.0/wfs.xsd" xmlns:ogc="http://www.opengis.net/ogc" xmlns:osm="http://openstreemap.org" xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplan [...]
\ No newline at end of file
diff --git a/examples/data/gpx/fells_loop.gpx b/examples/data/gpx/fells_loop.gpx
new file mode 100644
index 0000000..d8a1df5
--- /dev/null
+++ b/examples/data/gpx/fells_loop.gpx
@@ -0,0 +1,1077 @@
+<?xml version="1.0"?>
+<gpx
+ version="1.0"
+ creator="ExpertGPS 1.1 - http://www.topografix.com"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://www.topografix.com/GPX/1/0"
+ xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
+<time>2002-02-27T17:18:33Z</time>
+<bounds minlat="42.401051" minlon="-71.126602" maxlat="42.468655" maxlon="-71.102973"/>
+<wpt lat="42.438878" lon="-71.119277">
+ <ele>44.586548</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5066</name>
+ <desc><![CDATA[5066]]></desc>
+ <sym>Crossing</sym>
+ <type><![CDATA[Crossing]]></type>
+</wpt>
+<wpt lat="42.439227" lon="-71.119689">
+ <ele>57.607200</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>5067</name>
+ <desc><![CDATA[5067]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.438917" lon="-71.116146">
+ <ele>44.826904</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>5096</name>
+ <desc><![CDATA[5096]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.443904" lon="-71.122044">
+ <ele>50.594727</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5142</name>
+ <desc><![CDATA[5142]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.447298" lon="-71.121447">
+ <ele>127.711200</ele>
+ <time>2001-06-02T03:26:58Z</time>
+ <name>5156</name>
+ <desc><![CDATA[5156]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.454873" lon="-71.125094">
+ <ele>96.926400</ele>
+ <time>2001-06-02T03:26:59Z</time>
+ <name>5224</name>
+ <desc><![CDATA[5224]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.459079" lon="-71.124988">
+ <ele>82.600800</ele>
+ <time>2001-06-02T03:26:59Z</time>
+ <name>5229</name>
+ <desc><![CDATA[5229]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.456979" lon="-71.124474">
+ <ele>82.905600</ele>
+ <time>2001-06-02T03:26:59Z</time>
+ <name>5237</name>
+ <desc><![CDATA[5237]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.454401" lon="-71.120990">
+ <ele>66.696655</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5254</name>
+ <desc><![CDATA[5254]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.451442" lon="-71.121746">
+ <ele>74.627442</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>5258</name>
+ <desc><![CDATA[5258]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.454404" lon="-71.120660">
+ <ele>65.254761</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5264</name>
+ <desc><![CDATA[5264]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.457761" lon="-71.121045">
+ <ele>77.419200</ele>
+ <time>2001-06-02T03:27:00Z</time>
+ <name>526708</name>
+ <desc><![CDATA[526708]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.457089" lon="-71.120313">
+ <ele>74.676000</ele>
+ <time>2001-06-02T03:27:00Z</time>
+ <name>526750</name>
+ <desc><![CDATA[526750]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.456592" lon="-71.119676">
+ <ele>78.713135</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>527614</name>
+ <desc><![CDATA[527614]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.456252" lon="-71.119356">
+ <ele>78.713135</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>527631</name>
+ <desc><![CDATA[527631]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.458148" lon="-71.119135">
+ <ele>68.275200</ele>
+ <time>2001-06-02T03:27:00Z</time>
+ <name>5278</name>
+ <desc><![CDATA[5278]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.459377" lon="-71.117693">
+ <ele>64.008000</ele>
+ <time>2001-06-02T03:27:01Z</time>
+ <name>5289</name>
+ <desc><![CDATA[5289]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.464183" lon="-71.119828">
+ <ele>52.997925</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5374FIRE</name>
+ <desc><![CDATA[5374FIRE]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.465650" lon="-71.119399">
+ <ele>56.388000</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>5376</name>
+ <desc><![CDATA[5376]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.439018" lon="-71.114456">
+ <ele>56.388000</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>6006</name>
+ <desc><![CDATA[600698]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.438594" lon="-71.114803">
+ <ele>46.028564</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>6006BLUE</name>
+ <desc><![CDATA[6006BLUE]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.436757" lon="-71.113223">
+ <ele>37.616943</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>6014MEADOW</name>
+ <desc><![CDATA[6014MEADOW]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.441754" lon="-71.113220">
+ <ele>56.388000</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>6029</name>
+ <desc><![CDATA[6029]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.436243" lon="-71.109075">
+ <ele>50.292000</ele>
+ <time>2001-06-02T03:27:05Z</time>
+ <name>6053</name>
+ <desc><![CDATA[6053]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.439250" lon="-71.107500">
+ <ele>25.603200</ele>
+ <time>2001-06-02T03:26:57Z</time>
+ <name>6066</name>
+ <desc><![CDATA[6066]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.439764" lon="-71.107582">
+ <ele>34.442400</ele>
+ <time>2001-06-02T03:26:57Z</time>
+ <name>6067</name>
+ <desc><![CDATA[6067]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.434766" lon="-71.105874">
+ <ele>30.480000</ele>
+ <time>2001-06-02T03:26:57Z</time>
+ <name>6071</name>
+ <desc><![CDATA[6071]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.433304" lon="-71.106599">
+ <ele>15.240000</ele>
+ <time>2001-06-02T03:26:56Z</time>
+ <name>6073</name>
+ <desc><![CDATA[6073]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.437338" lon="-71.104772">
+ <ele>37.795200</ele>
+ <time>2001-06-02T03:26:57Z</time>
+ <name>6084</name>
+ <desc><![CDATA[6084]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.442196" lon="-71.110975">
+ <ele>64.008000</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>6130</name>
+ <desc><![CDATA[6130]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.442981" lon="-71.111441">
+ <ele>64.008000</ele>
+ <time>2001-06-02T03:26:58Z</time>
+ <name>6131</name>
+ <desc><![CDATA[6131]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.444773" lon="-71.108882">
+ <ele>62.788800</ele>
+ <time>2001-06-02T03:27:05Z</time>
+ <name>6153</name>
+ <desc><![CDATA[6153]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.443592" lon="-71.106301">
+ <ele>55.473600</ele>
+ <time>2001-06-02T03:27:05Z</time>
+ <name>6171</name>
+ <desc><![CDATA[6171]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.447804" lon="-71.106624">
+ <ele>62.484000</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>6176</name>
+ <desc><![CDATA[6176]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.448448" lon="-71.106158">
+ <ele>62.179200</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>6177</name>
+ <desc><![CDATA[6177]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.453415" lon="-71.106783">
+ <ele>69.799200</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>6272</name>
+ <desc><![CDATA[6272]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.453434" lon="-71.107253">
+ <ele>73.152000</ele>
+ <time>2001-06-02T03:26:56Z</time>
+ <name>6272</name>
+ <desc><![CDATA[6272]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.458298" lon="-71.106771">
+ <ele>70.104000</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>6278</name>
+ <desc><![CDATA[6278]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.451430" lon="-71.105413">
+ <ele>57.564209</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>6280</name>
+ <desc><![CDATA[6280]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.453845" lon="-71.105206">
+ <ele>66.696655</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>6283</name>
+ <desc><![CDATA[6283]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.459986" lon="-71.106170">
+ <ele>72.945191</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>6289</name>
+ <desc><![CDATA[6289]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.457616" lon="-71.105116">
+ <ele>72.847200</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>6297</name>
+ <desc><![CDATA[6297]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.467110" lon="-71.113574">
+ <ele>53.644800</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>6328</name>
+ <desc><![CDATA[6328]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.464202" lon="-71.109863">
+ <ele>43.891200</ele>
+ <time>2001-06-02T03:27:03Z</time>
+ <name>6354</name>
+ <desc><![CDATA[6354]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.466459" lon="-71.110067">
+ <ele>48.768000</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>635722</name>
+ <desc><![CDATA[635722]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.466557" lon="-71.109410">
+ <ele>49.072800</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>635783</name>
+ <desc><![CDATA[635783]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.463495" lon="-71.107117">
+ <ele>62.484000</ele>
+ <time>2001-06-02T03:27:03Z</time>
+ <name>6373</name>
+ <desc><![CDATA[6373]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.401051" lon="-71.110241">
+ <ele>3.962400</ele>
+ <time>2001-06-02T03:26:56Z</time>
+ <name>6634</name>
+ <desc><![CDATA[6634]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.432621" lon="-71.106532">
+ <ele>13.411200</ele>
+ <time>2001-06-02T03:26:56Z</time>
+ <name>6979</name>
+ <desc><![CDATA[6979]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.431033" lon="-71.107883">
+ <ele>34.012085</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>6997</name>
+ <desc><![CDATA[6997]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</wpt>
+<wpt lat="42.465687" lon="-71.107360">
+ <ele>87.782400</ele>
+ <time>2001-06-02T03:27:03Z</time>
+ <name>BEAR HILL</name>
+ <cmt>BEAR HILL TOWER</cmt>
+ <desc><![CDATA[Bear Hill Tower]]></desc>
+ <sym>Tall Tower</sym>
+ <type><![CDATA[Tower]]></type>
+</wpt>
+<wpt lat="42.430950" lon="-71.107628">
+ <ele>23.469600</ele>
+ <time>2001-06-02T00:18:15Z</time>
+ <name>BELLEVUE</name>
+ <cmt>BELLEVUE</cmt>
+ <desc><![CDATA[Bellevue Parking Lot]]></desc>
+ <sym>Parking Area</sym>
+ <type><![CDATA[Parking]]></type>
+</wpt>
+<wpt lat="42.438666" lon="-71.114079">
+ <ele>43.384766</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>6016</name>
+ <desc><![CDATA[Bike Loop Connector]]></desc>
+ <sym>Trailhead</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.456469" lon="-71.124651">
+ <ele>89.916000</ele>
+ <time>2001-06-02T03:26:59Z</time>
+ <name>5236BRIDGE</name>
+ <desc><![CDATA[Bridge]]></desc>
+ <sym>Bridge</sym>
+ <type><![CDATA[Bridge]]></type>
+</wpt>
+<wpt lat="42.465759" lon="-71.119815">
+ <ele>55.473600</ele>
+ <time>2001-06-02T03:27:01Z</time>
+ <name>5376BRIDGE</name>
+ <desc><![CDATA[Bridge]]></desc>
+ <sym>Bridge</sym>
+ <type><![CDATA[Bridge]]></type>
+</wpt>
+<wpt lat="42.442993" lon="-71.105878">
+ <ele>52.730400</ele>
+ <time>2001-06-02T03:27:05Z</time>
+ <name>6181CROSS</name>
+ <desc><![CDATA[Crossing]]></desc>
+ <sym>Crossing</sym>
+ <type><![CDATA[Crossing]]></type>
+</wpt>
+<wpt lat="42.435472" lon="-71.109664">
+ <ele>45.110400</ele>
+ <time>2001-06-02T03:27:05Z</time>
+ <name>6042CROSS</name>
+ <desc><![CDATA[Crossing]]></desc>
+ <sym>Crossing</sym>
+ <type><![CDATA[Crossing]]></type>
+</wpt>
+<wpt lat="42.458516" lon="-71.103646">
+ <name>DARKHOLLPO</name>
+ <desc><![CDATA[Dark Hollow Pond]]></desc>
+ <sym>Fishing Area</sym>
+</wpt>
+<wpt lat="42.443109" lon="-71.112675">
+ <ele>56.083200</ele>
+ <time>2001-06-02T03:26:57Z</time>
+ <name>6121DEAD</name>
+ <desc><![CDATA[Dead End]]></desc>
+ <sym>Danger Area</sym>
+ <type><![CDATA[Dead End]]></type>
+</wpt>
+<wpt lat="42.449866" lon="-71.119298">
+ <ele>117.043200</ele>
+ <time>2001-06-02T03:26:59Z</time>
+ <name>5179DEAD</name>
+ <desc><![CDATA[Dead End]]></desc>
+ <sym>Danger Area</sym>
+ <type><![CDATA[Dead End]]></type>
+</wpt>
+<wpt lat="42.459629" lon="-71.116524">
+ <ele>69.494400</ele>
+ <time>2001-06-02T03:27:01Z</time>
+ <name>5299DEAD</name>
+ <desc><![CDATA[Dead End]]></desc>
+ <sym>Danger Area</sym>
+ <type><![CDATA[Dead End]]></type>
+</wpt>
+<wpt lat="42.465485" lon="-71.119148">
+ <ele>56.997600</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>5376DEAD</name>
+ <desc><![CDATA[Dead End]]></desc>
+ <sym>Danger Area</sym>
+ <type><![CDATA[Dead End]]></type>
+</wpt>
+<wpt lat="42.462776" lon="-71.109986">
+ <ele>46.939200</ele>
+ <time>2001-06-02T03:27:03Z</time>
+ <name>6353DEAD</name>
+ <desc><![CDATA[Dead End]]></desc>
+ <sym>Danger Area</sym>
+ <type><![CDATA[Dead End]]></type>
+</wpt>
+<wpt lat="42.446793" lon="-71.108784">
+ <ele>61.264800</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>6155DEAD</name>
+ <desc><![CDATA[Dead End]]></desc>
+ <sym>Danger Area</sym>
+ <type><![CDATA[Dead End]]></type>
+</wpt>
+<wpt lat="42.451204" lon="-71.126602">
+ <ele>110.947200</ele>
+ <time>2001-06-02T03:26:59Z</time>
+ <name>GATE14</name>
+ <desc><![CDATA[Gate 14]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Road]]></type>
+</wpt>
+<wpt lat="42.458499" lon="-71.122078">
+ <ele>77.724000</ele>
+ <time>2001-06-02T03:27:00Z</time>
+ <name>GATE16</name>
+ <desc><![CDATA[Gate 16]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Road]]></type>
+</wpt>
+<wpt lat="42.459376" lon="-71.119238">
+ <ele>65.836800</ele>
+ <time>2001-06-02T03:27:01Z</time>
+ <name>GATE17</name>
+ <desc><![CDATA[Gate 17]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Road]]></type>
+</wpt>
+<wpt lat="42.466353" lon="-71.119240">
+ <ele>57.302400</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>GATE19</name>
+ <desc><![CDATA[Gate 19]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Road]]></type>
+</wpt>
+<wpt lat="42.468655" lon="-71.107697">
+ <ele>49.377600</ele>
+ <time>2001-06-02T03:27:03Z</time>
+ <name>GATE21</name>
+ <desc><![CDATA[Gate 21]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Road]]></type>
+</wpt>
+<wpt lat="42.456718" lon="-71.102973">
+ <ele>81.076800</ele>
+ <time>2001-06-02T03:27:03Z</time>
+ <name>GATE24</name>
+ <desc><![CDATA[Gate 24]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Road]]></type>
+</wpt>
+<wpt lat="42.430847" lon="-71.107690">
+ <ele>21.515015</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>GATE5</name>
+ <desc><![CDATA[Gate 5]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Truck Stop]]></type>
+</wpt>
+<wpt lat="42.431240" lon="-71.109236">
+ <ele>26.561890</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>GATE6</name>
+ <desc><![CDATA[Gate 6]]></desc>
+ <sym>Trailhead</sym>
+ <type><![CDATA[Trail Head]]></type>
+</wpt>
+<wpt lat="42.439502" lon="-71.106556">
+ <ele>32.004000</ele>
+ <time>2001-06-02T00:18:16Z</time>
+ <name>6077LOGS</name>
+ <desc><![CDATA[Log Crossing]]></desc>
+ <sym>Amusement Park</sym>
+ <type><![CDATA[Obstacle]]></type>
+</wpt>
+<wpt lat="42.449765" lon="-71.122320">
+ <ele>119.809082</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>5148NANEPA</name>
+ <desc><![CDATA[Nanepashemet Road Crossing]]></desc>
+ <sym>Trailhead</sym>
+ <type><![CDATA[Trail Head]]></type>
+</wpt>
+<wpt lat="42.457388" lon="-71.119845">
+ <ele>73.761600</ele>
+ <time>2001-06-02T03:27:00Z</time>
+ <name>5267OBSTAC</name>
+ <desc><![CDATA[Obstacle]]></desc>
+ <sym>Amusement Park</sym>
+ <type><![CDATA[Obstacle]]></type>
+</wpt>
+<wpt lat="42.434980" lon="-71.109942">
+ <ele>45.307495</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>PANTHRCAVE</name>
+ <desc><![CDATA[Panther Cave]]></desc>
+ <sym>Tunnel</sym>
+ <type><![CDATA[Tunnel]]></type>
+</wpt>
+<wpt lat="42.453256" lon="-71.121211">
+ <ele>77.992066</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>5252PURPLE</name>
+ <desc><![CDATA[Purple Rock Hill]]></desc>
+ <sym>Summit</sym>
+ <type><![CDATA[Summit]]></type>
+</wpt>
+<wpt lat="42.457734" lon="-71.117481">
+ <ele>67.970400</ele>
+ <time>2001-06-02T03:27:01Z</time>
+ <name>5287WATER</name>
+ <desc><![CDATA[Reservoir]]></desc>
+ <sym>Swimming Area</sym>
+ <type><![CDATA[Reservoir]]></type>
+</wpt>
+<wpt lat="42.459278" lon="-71.124574">
+ <ele>81.076800</ele>
+ <time>2001-06-02T03:27:00Z</time>
+ <name>5239ROAD</name>
+ <desc><![CDATA[Road]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Road]]></type>
+</wpt>
+<wpt lat="42.458782" lon="-71.118991">
+ <ele>67.360800</ele>
+ <time>2001-06-02T03:27:01Z</time>
+ <name>5278ROAD</name>
+ <desc><![CDATA[Road]]></desc>
+ <sym>Truck Stop</sym>
+ <type><![CDATA[Road]]></type>
+</wpt>
+<wpt lat="42.439993" lon="-71.120925">
+ <ele>53.949600</ele>
+ <time>2001-06-02T00:18:14Z</time>
+ <name>5058ROAD</name>
+ <cmt>ROAD CROSSING</cmt>
+ <desc><![CDATA[Road Crossing]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Road Crossing]]></type>
+</wpt>
+<wpt lat="42.453415" lon="-71.106782">
+ <ele>69.799200</ele>
+ <time>2001-06-02T00:18:13Z</time>
+ <name>SHEEPFOLD</name>
+ <desc><![CDATA[Sheepfold Parking Lot]]></desc>
+ <sym>Parking Area</sym>
+ <type><![CDATA[Parking]]></type>
+</wpt>
+<wpt lat="42.455956" lon="-71.107483">
+ <ele>64.008000</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>SOAPBOX</name>
+ <desc><![CDATA[Soap Box Derby Track]]></desc>
+ <sym>Cemetery</sym>
+ <type><![CDATA[Intersection]]></type>
+</wpt>
+<wpt lat="42.465913" lon="-71.119328">
+ <ele>64.533692</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>5376STREAM</name>
+ <desc><![CDATA[Stream Crossing]]></desc>
+ <sym>Bridge</sym>
+ <type><![CDATA[Bridge]]></type>
+</wpt>
+<wpt lat="42.445359" lon="-71.122845">
+ <ele>61.649902</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5144SUMMIT</name>
+ <desc><![CDATA[Summit]]></desc>
+ <sym>Summit</sym>
+ <type><![CDATA[Summit]]></type>
+</wpt>
+<wpt lat="42.441727" lon="-71.121676">
+ <ele>67.360800</ele>
+ <time>2001-06-02T00:18:16Z</time>
+ <name>5150TANK</name>
+ <cmt>WATER TANK</cmt>
+ <desc><![CDATA[Water Tank]]></desc>
+ <sym>Museum</sym>
+ <type><![CDATA[Water Tank]]></type>
+</wpt>
+<rte>
+ <name>BELLEVUE</name>
+ <desc><![CDATA[Bike Loop Bellevue]]></desc>
+ <number>1</number>
+<rtept lat="42.430950" lon="-71.107628">
+ <ele>23.469600</ele>
+ <time>2001-06-02T00:18:15Z</time>
+ <name>BELLEVUE</name>
+ <cmt>BELLEVUE</cmt>
+ <desc><![CDATA[Bellevue Parking Lot]]></desc>
+ <sym>Parking Area</sym>
+ <type><![CDATA[Parking]]></type>
+</rtept>
+<rtept lat="42.431240" lon="-71.109236">
+ <ele>26.561890</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>GATE6</name>
+ <desc><![CDATA[Gate 6]]></desc>
+ <sym>Trailhead</sym>
+ <type><![CDATA[Trail Head]]></type>
+</rtept>
+<rtept lat="42.434980" lon="-71.109942">
+ <ele>45.307495</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>PANTHRCAVE</name>
+ <desc><![CDATA[Panther Cave]]></desc>
+ <sym>Tunnel</sym>
+ <type><![CDATA[Tunnel]]></type>
+</rtept>
+<rtept lat="42.436757" lon="-71.113223">
+ <ele>37.616943</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>6014MEADOW</name>
+ <desc><![CDATA[6014MEADOW]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.439018" lon="-71.114456">
+ <ele>56.388000</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>6006</name>
+ <desc><![CDATA[600698]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.438594" lon="-71.114803">
+ <ele>46.028564</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>6006BLUE</name>
+ <desc><![CDATA[6006BLUE]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.438917" lon="-71.116146">
+ <ele>44.826904</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>5096</name>
+ <desc><![CDATA[5096]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.438878" lon="-71.119277">
+ <ele>44.586548</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5066</name>
+ <desc><![CDATA[5066]]></desc>
+ <sym>Crossing</sym>
+ <type><![CDATA[Crossing]]></type>
+</rtept>
+<rtept lat="42.439227" lon="-71.119689">
+ <ele>57.607200</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>5067</name>
+ <desc><![CDATA[5067]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.439993" lon="-71.120925">
+ <ele>53.949600</ele>
+ <time>2001-06-02T00:18:14Z</time>
+ <name>5058ROAD</name>
+ <cmt>ROAD CROSSING</cmt>
+ <desc><![CDATA[Road Crossing]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Road Crossing]]></type>
+</rtept>
+<rtept lat="42.441727" lon="-71.121676">
+ <ele>67.360800</ele>
+ <time>2001-06-02T00:18:16Z</time>
+ <name>5150TANK</name>
+ <cmt>WATER TANK</cmt>
+ <desc><![CDATA[Water Tank]]></desc>
+ <sym>Museum</sym>
+ <type><![CDATA[Water Tank]]></type>
+</rtept>
+<rtept lat="42.443904" lon="-71.122044">
+ <ele>50.594727</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5142</name>
+ <desc><![CDATA[5142]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.445359" lon="-71.122845">
+ <ele>61.649902</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5144SUMMIT</name>
+ <desc><![CDATA[Summit]]></desc>
+ <sym>Summit</sym>
+ <type><![CDATA[Summit]]></type>
+</rtept>
+<rtept lat="42.447298" lon="-71.121447">
+ <ele>127.711200</ele>
+ <time>2001-06-02T03:26:58Z</time>
+ <name>5156</name>
+ <desc><![CDATA[5156]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.449765" lon="-71.122320">
+ <ele>119.809082</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>5148NANEPA</name>
+ <desc><![CDATA[Nanepashemet Road Crossing]]></desc>
+ <sym>Trailhead</sym>
+ <type><![CDATA[Trail Head]]></type>
+</rtept>
+<rtept lat="42.451442" lon="-71.121746">
+ <ele>74.627442</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>5258</name>
+ <desc><![CDATA[5258]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.453256" lon="-71.121211">
+ <ele>77.992066</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>5252PURPLE</name>
+ <desc><![CDATA[Purple Rock Hill]]></desc>
+ <sym>Summit</sym>
+ <type><![CDATA[Summit]]></type>
+</rtept>
+<rtept lat="42.456252" lon="-71.119356">
+ <ele>78.713135</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>527631</name>
+ <desc><![CDATA[527631]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.456592" lon="-71.119676">
+ <ele>78.713135</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>527614</name>
+ <desc><![CDATA[527614]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.457388" lon="-71.119845">
+ <ele>73.761600</ele>
+ <time>2001-06-02T03:27:00Z</time>
+ <name>5267OBSTAC</name>
+ <desc><![CDATA[Obstacle]]></desc>
+ <sym>Amusement Park</sym>
+ <type><![CDATA[Obstacle]]></type>
+</rtept>
+<rtept lat="42.458148" lon="-71.119135">
+ <ele>68.275200</ele>
+ <time>2001-06-02T03:27:00Z</time>
+ <name>5278</name>
+ <desc><![CDATA[5278]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.459377" lon="-71.117693">
+ <ele>64.008000</ele>
+ <time>2001-06-02T03:27:01Z</time>
+ <name>5289</name>
+ <desc><![CDATA[5289]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.464183" lon="-71.119828">
+ <ele>52.997925</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>5374FIRE</name>
+ <desc><![CDATA[5374FIRE]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.465650" lon="-71.119399">
+ <ele>56.388000</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>5376</name>
+ <desc><![CDATA[5376]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.465913" lon="-71.119328">
+ <ele>64.533692</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>5376STREAM</name>
+ <desc><![CDATA[Stream Crossing]]></desc>
+ <sym>Bridge</sym>
+ <type><![CDATA[Bridge]]></type>
+</rtept>
+<rtept lat="42.467110" lon="-71.113574">
+ <ele>53.644800</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>6328</name>
+ <desc><![CDATA[6328]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.466459" lon="-71.110067">
+ <ele>48.768000</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>635722</name>
+ <desc><![CDATA[635722]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.466557" lon="-71.109410">
+ <ele>49.072800</ele>
+ <time>2001-06-02T03:27:02Z</time>
+ <name>635783</name>
+ <desc><![CDATA[635783]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.463495" lon="-71.107117">
+ <ele>62.484000</ele>
+ <time>2001-06-02T03:27:03Z</time>
+ <name>6373</name>
+ <desc><![CDATA[6373]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.465687" lon="-71.107360">
+ <ele>87.782400</ele>
+ <time>2001-06-02T03:27:03Z</time>
+ <name>BEAR HILL</name>
+ <cmt>BEAR HILL TOWER</cmt>
+ <desc><![CDATA[Bear Hill Tower]]></desc>
+ <sym>Tall Tower</sym>
+ <type><![CDATA[Tower]]></type>
+</rtept>
+<rtept lat="42.459986" lon="-71.106170">
+ <ele>72.945191</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>6289</name>
+ <desc><![CDATA[6289]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.457616" lon="-71.105116">
+ <ele>72.847200</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>6297</name>
+ <desc><![CDATA[6297]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.453845" lon="-71.105206">
+ <ele>66.696655</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>6283</name>
+ <desc><![CDATA[6283]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.451430" lon="-71.105413">
+ <ele>57.564209</ele>
+ <time>2001-11-16T23:03:38Z</time>
+ <name>6280</name>
+ <desc><![CDATA[6280]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.448448" lon="-71.106158">
+ <ele>62.179200</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>6177</name>
+ <desc><![CDATA[6177]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.447804" lon="-71.106624">
+ <ele>62.484000</ele>
+ <time>2001-06-02T03:27:04Z</time>
+ <name>6176</name>
+ <desc><![CDATA[6176]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.444773" lon="-71.108882">
+ <ele>62.788800</ele>
+ <time>2001-06-02T03:27:05Z</time>
+ <name>6153</name>
+ <desc><![CDATA[6153]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.443592" lon="-71.106301">
+ <ele>55.473600</ele>
+ <time>2001-06-02T03:27:05Z</time>
+ <name>6171</name>
+ <desc><![CDATA[6171]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.442981" lon="-71.111441">
+ <ele>64.008000</ele>
+ <time>2001-06-02T03:26:58Z</time>
+ <name>6131</name>
+ <desc><![CDATA[6131]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.442196" lon="-71.110975">
+ <ele>64.008000</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>6130</name>
+ <desc><![CDATA[6130]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.441754" lon="-71.113220">
+ <ele>56.388000</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>6029</name>
+ <desc><![CDATA[6029]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.439018" lon="-71.114456">
+ <ele>56.388000</ele>
+ <time>2001-06-02T03:26:55Z</time>
+ <name>6006</name>
+ <desc><![CDATA[600698]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Intersection]]></type>
+</rtept>
+<rtept lat="42.436757" lon="-71.113223">
+ <ele>37.616943</ele>
+ <time>2001-11-28T21:05:28Z</time>
+ <name>6014MEADOW</name>
+ <desc><![CDATA[6014MEADOW]]></desc>
+ <sym>Dot</sym>
+ <type><![CDATA[Dot]]></type>
+</rtept>
+<rtept lat="42.434980" lon="-71.109942">
+ <ele>45.307495</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>PANTHRCAVE</name>
+ <desc><![CDATA[Panther Cave]]></desc>
+ <sym>Tunnel</sym>
+ <type><![CDATA[Tunnel]]></type>
+</rtept>
+<rtept lat="42.431240" lon="-71.109236">
+ <ele>26.561890</ele>
+ <time>2001-11-07T23:53:41Z</time>
+ <name>GATE6</name>
+ <desc><![CDATA[Gate 6]]></desc>
+ <sym>Trailhead</sym>
+ <type><![CDATA[Trail Head]]></type>
+</rtept>
+<rtept lat="42.430950" lon="-71.107628">
+ <ele>23.469600</ele>
+ <time>2001-06-02T00:18:15Z</time>
+ <name>BELLEVUE</name>
+ <cmt>BELLEVUE</cmt>
+ <desc><![CDATA[Bellevue Parking Lot]]></desc>
+ <sym>Parking Area</sym>
+ <type><![CDATA[Parking]]></type>
+</rtept>
+</rte>
+</gpx>
\ No newline at end of file
diff --git a/examples/data/icon.png b/examples/data/icon.png
new file mode 100644
index 0000000..ed88662
Binary files /dev/null and b/examples/data/icon.png differ
diff --git a/examples/data/igc/Clement-Latour.igc b/examples/data/igc/Clement-Latour.igc
new file mode 100644
index 0000000..6789e28
--- /dev/null
+++ b/examples/data/igc/Clement-Latour.igc
@@ -0,0 +1,15585 @@
+AXGD123 6030 SN07172 SW3.32
+HFDTE190411
+HOPLTPILOT: Clement Latour
+HOGTYGLIDERTYPE: R10.2
+HOGIDGLIDERID: None
+HODTM100GPSDATUM: WGS-84
+HOCIDCOMPETITIONID: 
+HOCCLCOMPETITION CLASS: None
+HOSITSite: Marlens
+B0853524556201N00651065EA0200502041
+B0853544556201N00651065EA0200502041
+B0853564556201N00651065EA0200402041
+B0853584556201N00651065EA0200402041
+B0854004556201N00651065EA0200402041
+B0854024556201N00651065EA0200402041
+B0854044556201N00651065EA0200402041
+B0854064556201N00651065EA0200402041
+B0854084556201N00651065EA0200402041
+B0854104556201N00651065EA0200402041
+B0854124556201N00651065EA0200402041
+B0854144556201N00651065EA0200402041
+B0854164556201N00651064EA0200402041
+B0854184556201N00651064EA0200402041
+B0854204556201N00651065EA0200402041
+B0854224556201N00651065EA0200502041
+B0854244556200N00651064EA0200402041
+B0854264556198N00651062EA0200302041
+B0854284556194N00651060EA0199902039
+B0854304556188N00651058EA0199802038
+B0854324556182N00651058EA0199602036
+B0854344556174N00651057EA0199202034
+B0854364556165N00651059EA0199302032
+B0854384556157N00651061EA0199302031
+B0854404556147N00651061EA0199502031
+B0854424556138N00651060EA0200102031
+B0854444556136N00651051EA0200702035
+B0854464556139N00651038EA0201102040
+B0854484556143N00651023EA0201602046
+B0854504556142N00651008EA0202402053
+B0854524556141N00650995EA0203102061
+B0854544556141N00650984EA0203902070
+B0854564556138N00650976EA0204502077
+B0854584556132N00650971EA0205202085
+B0855004556130N00650958EA0205502092
+B0855024556141N00650943EA0205902097
+B0855044556156N00650946EA0206502102
+B0855064556161N00650961EA0206802108
+B0855084556150N00650973EA0207402114
+B0855104556141N00650966EA0208102121
+B0855124556140N00650949EA0208602126
+B0855144556149N00650938EA0209202132
+B0855164556163N00650942EA0209502137
+B0855184556172N00650956EA0210102142
+B0855204556167N00650969EA0210402146
+B0855224556155N00650968EA0211202151
+B0855244556147N00650959EA0212102158
+B0855264556143N00650948EA0212602164
+B0855284556141N00650932EA0212902168
+B0855304556149N00650914EA0213402172
+B0855324556164N00650915EA0213802177
+B0855344556174N00650928EA0214502182
+B0855364556175N00650943EA0215002188
+B0855384556167N00650953EA0215202192
+B0855404556154N00650950EA0215802196
+B0855424556148N00650933EA0216402200
+B0855444556154N00650914EA0216502205
+B0855464556171N00650911EA0216802208
+B0855484556184N00650926EA0217502214
+B0855504556186N00650944EA0218202219
+B0855524556178N00650956EA0218802226
+B0855544556166N00650955EA0219102232
+B0855564556156N00650941EA0219502236
+B0855584556157N00650918EA0219902239
+B0856004556171N00650905EA0220702245
+B0856024556183N00650912EA0220902247
+B0856044556182N00650927EA0221202252
+B0856064556169N00650930EA0221802256
+B0856084556157N00650915EA0222402262
+B0856104556153N00650893EA0223102267
+B0856124556159N00650876EA0223402273
+B0856144556173N00650872EA0223502276
+B0856164556185N00650881EA0223802279
+B0856184556188N00650896EA0224202282
+B0856204556181N00650907EA0224702286
+B0856224556171N00650911EA0225302291
+B0856244556162N00650905EA0225802297
+B0856264556157N00650886EA0226102301
+B0856284556164N00650867EA0226302305
+B0856304556179N00650864EA0226902309
+B0856324556189N00650870EA0227502315
+B0856344556195N00650878EA0228002321
+B0856364556197N00650888EA0228202323
+B0856384556190N00650899EA0228302326
+B0856404556177N00650899EA0228402327
+B0856424556166N00650883EA0228702330
+B0856444556164N00650863EA0229202333
+B0856464556170N00650844EA0229802337
+B0856484556181N00650835EA0230102341
+B0856504556194N00650834EA0230502344
+B0856524556203N00650845EA0230402346
+B0856544556192N00650853EA0230602347
+B0856564556180N00650843EA0231202351
+B0856584556177N00650825EA0231802356
+B0857004556176N00650809EA0232202361
+B0857024556177N00650793EA0232102364
+B0857044556186N00650779EA0231902365
+B0857064556200N00650781EA0232002365
+B0857084556208N00650792EA0232502367
+B0857104556213N00650800EA0232802370
+B0857124556218N00650809EA0232902371
+B0857144556213N00650822EA0233402373
+B0857164556205N00650832EA0234202377
+B0857184556198N00650840EA0234802383
+B0857204556192N00650844EA0235002386
+B0857224556182N00650835EA0235102389
+B0857244556180N00650815EA0235302392
+B0857264556190N00650803EA0235802395
+B0857284556202N00650801EA0236602402
+B0857304556209N00650806EA0237002406
+B0857324556218N00650815EA0237302410
+B0857344556221N00650827EA0237802415
+B0857364556212N00650836EA0238202419
+B0857384556199N00650833EA0238702425
+B0857404556190N00650819EA0238902429
+B0857424556191N00650800EA0239102432
+B0857444556201N00650789EA0239202434
+B0857464556215N00650789EA0239502437
+B0857484556223N00650796EA0239902440
+B0857504556226N00650807EA0240202443
+B0857524556225N00650821EA0240502446
+B0857544556219N00650833EA0241002449
+B0857564556208N00650833EA0241202453
+B0857584556198N00650825EA0241402455
+B0858004556189N00650814EA0241802458
+B0858024556180N00650805EA0242302462
+B0858044556171N00650795EA0242702466
+B0858064556166N00650782EA0243102470
+B0858084556162N00650766EA0243402474
+B0858104556154N00650757EA0243502477
+B0858124556141N00650753EA0243602478
+B0858144556131N00650748EA0243802481
+B0858164556121N00650740EA0243902482
+B0858184556108N00650731EA0244202483
+B0858204556096N00650722EA0244702486
+B0858224556088N00650710EA0244702488
+B0858244556080N00650696EA0244102488
+B0858264556070N00650684EA0243902485
+B0858284556060N00650677EA0243402482
+B0858304556050N00650671EA0242602477
+B0858324556039N00650660EA0241802470
+B0858344556026N00650647EA0241702466
+B0858364556016N00650633EA0242002463
+B0858384556006N00650620EA0242002464
+B0858404555997N00650609EA0241602461
+B0858424555988N00650598EA0241202456
+B0858444555977N00650587EA0240802453
+B0858464555965N00650578EA0240502449
+B0858484555954N00650568EA0240102445
+B0858504555941N00650556EA0239902442
+B0858524555929N00650544EA0240202440
+B0858544555919N00650532EA0240502440
+B0858564555910N00650520EA0240502441
+B0858584555900N00650508EA0240402440
+B0859004555888N00650495EA0240402440
+B0859024555876N00650482EA0240302439
+B0859044555864N00650468EA0240202439
+B0859064555852N00650455EA0240202439
+B0859084555840N00650442EA0240202439
+B0859104555829N00650429EA0240002438
+B0859124555817N00650417EA0239802436
+B0859144555805N00650402EA0239802435
+B0859164555794N00650388EA0240002434
+B0859184555785N00650375EA0239902434
+B0859204555775N00650365EA0239402432
+B0859224555762N00650354EA0239202430
+B0859244555751N00650339EA0239202430
+B0859264555742N00650324EA0239102429
+B0859284555733N00650308EA0238702427
+B0859304555723N00650293EA0238602425
+B0859324555714N00650279EA0238302423
+B0859344555706N00650265EA0238002421
+B0859364555701N00650258EA0237902419
+B0859384555685N00650234EA0237802417
+B0859404555674N00650218EA0237602415
+B0859424555662N00650205EA0237302414
+B0859444555649N00650193EA0237102412
+B0859464555636N00650180EA0236902410
+B0859484555624N00650166EA0237002409
+B0859504555612N00650151EA0237602409
+B0859524555604N00650135EA0238302412
+B0859544555595N00650121EA0238702417
+B0859564555586N00650110EA0238802419
+B0859584555575N00650104EA0239002422
+B0900004555563N00650095EA0239502426
+B0900024555551N00650082EA0240102431
+B0900044555540N00650074EA0240402435
+B0900064555529N00650080EA0240302439
+B0900084555526N00650091EA0240202442
+B0900104555537N00650095EA0240102444
+B0900124555549N00650076EA0240102445
+B0900144555551N00650049EA0240802448
+B0900164555548N00650028EA0241402455
+B0900184555546N00650010EA0241602457
+B0900204555541N00649989EA0242102460
+B0900224555530N00649978EA0242402465
+B0900244555520N00649983EA0242702468
+B0900264555518N00649996EA0243402473
+B0900284555528N00650000EA0243902479
+B0900304555541N00649985EA0244602485
+B0900324555545N00649961EA0245202491
+B0900344555534N00649946EA0245502496
+B0900364555522N00649952EA0246202500
+B0900384555521N00649967EA0247202508
+B0900404555531N00649969EA0247902517
+B0900424555542N00649959EA0248602524
+B0900444555548N00649938EA0249402532
+B0900464555541N00649918EA0249902540
+B0900484555528N00649915EA0250602547
+B0900504555522N00649928EA0251402554
+B0900524555525N00649937EA0252302564
+B0900544555535N00649936EA0253002570
+B0900564555546N00649928EA0253702578
+B0900584555552N00649908EA0254202584
+B0901004555548N00649885EA0254802590
+B0901024555536N00649876EA0255502596
+B0901044555527N00649886EA0256202602
+B0901064555526N00649900EA0257002611
+B0901084555534N00649903EA0257602617
+B0901104555545N00649894EA0258302623
+B0901124555550N00649874EA0258902630
+B0901144555543N00649855EA0259502636
+B0901164555530N00649850EA0260302642
+B0901184555522N00649861EA0261002649
+B0901204555522N00649873EA0261802657
+B0901224555529N00649879EA0262402663
+B0901244555540N00649872EA0263102670
+B0901264555545N00649853EA0263702677
+B0901284555539N00649836EA0264402684
+B0901304555525N00649830EA0265002691
+B0901324555514N00649837EA0265702698
+B0901344555511N00649847EA0266202704
+B0901364555519N00649853EA0266502708
+B0901384555531N00649846EA0267002712
+B0901404555538N00649827EA0267602717
+B0901424555534N00649806EA0268202722
+B0901444555522N00649795EA0268902729
+B0901464555508N00649797EA0269502735
+B0901484555503N00649807EA0269802740
+B0901504555510N00649814EA0270102745
+B0901524555522N00649807EA0270602749
+B0901544555527N00649788EA0271202754
+B0901564555524N00649768EA0271902761
+B0901584555517N00649752EA0272402767
+B0902004555504N00649748EA0272702772
+B0902024555492N00649755EA0273202777
+B0902044555490N00649767EA0273602782
+B0902064555498N00649774EA0274002786
+B0902084555508N00649761EA0274402789
+B0902104555510N00649738EA0275002794
+B0902124555502N00649717EA0275902800
+B0902144555494N00649700EA0276402806
+B0902164555485N00649681EA0276802810
+B0902184555475N00649659EA0277402815
+B0902204555466N00649638EA0278102822
+B0902224555458N00649618EA0278602829
+B0902244555451N00649600EA0278702833
+B0902264555442N00649582EA0278502836
+B0902284555434N00649563EA0278402836
+B0902304555427N00649545EA0278102834
+B0902324555420N00649526EA0277902830
+B0902344555412N00649505EA0278002829
+B0902364555405N00649488EA0278302831
+B0902384555399N00649472EA0278202829
+B0902404555393N00649457EA0278002827
+B0902424555385N00649441EA0277502824
+B0902444555378N00649425EA0277102820
+B0902464555370N00649408EA0276802816
+B0902484555362N00649391EA0276502812
+B0902504555356N00649374EA0276202808
+B0902524555348N00649357EA0275702804
+B0902544555340N00649341EA0275102799
+B0902564555332N00649322EA0274702794
+B0902584555326N00649302EA0274402791
+B0903004555319N00649283EA0274002787
+B0903024555312N00649264EA0273502781
+B0903044555307N00649243EA0273202778
+B0903064555303N00649224EA0273002775
+B0903084555298N00649207EA0272602771
+B0903104555294N00649187EA0271802766
+B0903124555291N00649165EA0271302760
+B0903144555287N00649145EA0270802755
+B0903164555283N00649124EA0270102749
+B0903184555281N00649104EA0269602743
+B0903204555279N00649085EA0269002737
+B0903224555276N00649070EA0268402730
+B0903244555273N00649054EA0267702723
+B0903264555269N00649034EA0267202716
+B0903284555267N00649015EA0267202711
+B0903304555266N00648998EA0267002709
+B0903324555263N00648982EA0266502704
+B0903344555258N00648964EA0266202700
+B0903364555253N00648946EA0266202698
+B0903384555247N00648929EA0266002697
+B0903404555242N00648911EA0266102697
+B0903424555237N00648893EA0266902697
+B0903444555231N00648875EA0267902700
+B0903464555227N00648857EA0268502706
+B0903484555225N00648837EA0268902711
+B0903504555221N00648816EA0269802717
+B0903524555218N00648795EA0270802725
+B0903544555218N00648779EA0271302732
+B0903564555215N00648761EA0271602737
+B0903584555211N00648742EA0272302745
+B0904004555209N00648727EA0273202754
+B0904024555207N00648712EA0273802763
+B0904044555204N00648699EA0274202770
+B0904064555199N00648685EA0274502776
+B0904084555193N00648669EA0274902781
+B0904104555186N00648654EA0275402786
+B0904124555179N00648642EA0275602791
+B0904144555172N00648630EA0275902794
+B0904164555166N00648615EA0276102797
+B0904184555161N00648600EA0276202799
+B0904204555155N00648586EA0276102799
+B0904224555148N00648571EA0276102800
+B0904244555141N00648557EA0275902799
+B0904264555135N00648543EA0275802798
+B0904284555130N00648529EA0275602797
+B0904304555125N00648515EA0275302795
+B0904324555118N00648502EA0275302794
+B0904344555111N00648489EA0275402794
+B0904364555104N00648477EA0275202793
+B0904384555096N00648462EA0275102792
+B0904404555090N00648445EA0275102792
+B0904424555084N00648428EA0274902790
+B0904444555078N00648411EA0274602788
+B0904464555071N00648395EA0274202785
+B0904484555064N00648380EA0274002782
+B0904504555057N00648363EA0273702779
+B0904524555051N00648344EA0274002777
+B0904544555046N00648327EA0274302777
+B0904564555040N00648314EA0274302779
+B0904584555035N00648301EA0274302779
+B0905004555029N00648287EA0274202779
+B0905024555021N00648272EA0274002777
+B0905044555013N00648257EA0273502775
+B0905064555004N00648243EA0273102771
+B0905084554995N00648227EA0272302765
+B0905104554984N00648211EA0271902760
+B0905124554974N00648196EA0271502756
+B0905144554963N00648181EA0271002752
+B0905164554954N00648165EA0270302746
+B0905184554943N00648147EA0269402739
+B0905204554931N00648130EA0268602733
+B0905224554919N00648114EA0268002726
+B0905244554908N00648096EA0267302718
+B0905264554896N00648078EA0266602711
+B0905284554885N00648061EA0266002705
+B0905304554873N00648043EA0265402698
+B0905324554861N00648026EA0264902693
+B0905344554849N00648009EA0264302686
+B0905364554836N00647992EA0263502680
+B0905384554823N00647975EA0263002674
+B0905404554808N00647962EA0262402669
+B0905424554794N00647950EA0262202665
+B0905444554780N00647938EA0262002662
+B0905464554766N00647928EA0261902659
+B0905484554751N00647918EA0261602656
+B0905504554738N00647907EA0261602654
+B0905524554725N00647897EA0261202652
+B0905544554713N00647887EA0260702647
+B0905564554700N00647874EA0260302643
+B0905584554688N00647857EA0260002640
+B0906004554678N00647841EA0259702637
+B0906024554668N00647826EA0259102633
+B0906044554657N00647808EA0258602628
+B0906064554646N00647788EA0258202623
+B0906084554637N00647767EA0257802619
+B0906104554628N00647746EA0257302615
+B0906124554617N00647727EA0257002611
+B0906144554607N00647708EA0256702608
+B0906164554598N00647689EA0256302604
+B0906184554587N00647669EA0256102602
+B0906204554577N00647650EA0256002600
+B0906224554567N00647631EA0255702597
+B0906244554557N00647611EA0255602595
+B0906264554547N00647590EA0255602594
+B0906284554538N00647572EA0255502593
+B0906304554528N00647552EA0255202591
+B0906324554520N00647532EA0254902588
+B0906344554512N00647512EA0254502585
+B0906364554503N00647494EA0254102581
+B0906384554495N00647476EA0253902578
+B0906404554487N00647461EA0253702576
+B0906424554479N00647444EA0253302573
+B0906444554470N00647426EA0253102570
+B0906464554463N00647410EA0253002569
+B0906484554455N00647395EA0252702566
+B0906504554447N00647379EA0252302562
+B0906524554439N00647359EA0251902559
+B0906544554434N00647339EA0251702557
+B0906564554430N00647320EA0251702555
+B0906584554424N00647302EA0251502554
+B0907004554419N00647284EA0251302552
+B0907024554416N00647264EA0250902549
+B0907044554415N00647246EA0250702547
+B0907064554412N00647227EA0250402544
+B0907084554407N00647208EA0250302542
+B0907104554402N00647190EA0250102541
+B0907124554396N00647175EA0249802539
+B0907144554389N00647159EA0249602535
+B0907164554382N00647143EA0249402533
+B0907184554376N00647129EA0249002531
+B0907204554370N00647115EA0248402528
+B0907224554362N00647100EA0248102524
+B0907244554353N00647085EA0247902521
+B0907264554346N00647071EA0247602518
+B0907284554338N00647056EA0247302515
+B0907304554329N00647041EA0247002512
+B0907324554321N00647026EA0246702509
+B0907344554313N00647011EA0246402505
+B0907364554304N00646995EA0246002502
+B0907384554295N00646981EA0245702498
+B0907404554286N00646966EA0245502495
+B0907424554277N00646950EA0245202493
+B0907444554268N00646934EA0245102491
+B0907464554258N00646919EA0245002490
+B0907484554248N00646904EA0244902489
+B0907504554239N00646888EA0244702488
+B0907524554229N00646873EA0244602487
+B0907544554219N00646859EA0244602486
+B0907564554208N00646844EA0244502485
+B0907584554197N00646829EA0244502485
+B0908004554187N00646815EA0244402485
+B0908024554177N00646799EA0244402484
+B0908044554167N00646782EA0244402484
+B0908064554158N00646764EA0244602485
+B0908084554150N00646747EA0244602486
+B0908104554142N00646732EA0244502486
+B0908124554136N00646716EA0244302485
+B0908144554130N00646700EA0243902482
+B0908164554122N00646682EA0243702479
+B0908184554114N00646665EA0243702478
+B0908204554106N00646649EA0243602477
+B0908224554099N00646632EA0243302474
+B0908244554091N00646614EA0243102472
+B0908264554084N00646597EA0243002471
+B0908284554078N00646579EA0242602468
+B0908304554070N00646559EA0242202465
+B0908324554062N00646541EA0242202464
+B0908344554054N00646526EA0242002462
+B0908364554045N00646510EA0241602458
+B0908384554035N00646494EA0241302455
+B0908404554025N00646479EA0241202453
+B0908424554015N00646465EA0240902451
+B0908444554005N00646450EA0240602448
+B0908464553995N00646435EA0240402445
+B0908484553985N00646421EA0240202443
+B0908504553976N00646407EA0239802440
+B0908524553965N00646392EA0239302436
+B0908544553954N00646377EA0239002432
+B0908564553945N00646363EA0238902430
+B0908584553935N00646347EA0238602428
+B0909004553925N00646331EA0238402426
+B0909024553917N00646315EA0238302424
+B0909044553908N00646300EA0238202422
+B0909064553899N00646285EA0237802419
+B0909084553891N00646268EA0237502417
+B0909104553882N00646252EA0237302415
+B0909124553873N00646236EA0237002412
+B0909144553865N00646219EA0236702409
+B0909164553855N00646203EA0236502406
+B0909184553846N00646188EA0236202404
+B0909204553838N00646171EA0235902401
+B0909224553830N00646153EA0235602397
+B0909244553822N00646135EA0235402395
+B0909264553814N00646120EA0235202393
+B0909284553805N00646105EA0234802390
+B0909304553796N00646089EA0234602387
+B0909324553787N00646073EA0234402386
+B0909344553779N00646058EA0234102383
+B0909364553771N00646043EA0233802380
+B0909384553762N00646027EA0233702378
+B0909404553754N00646013EA0233602377
+B0909424553746N00645999EA0233102374
+B0909444553736N00645984EA0232802370
+B0909464553728N00645968EA0232802369
+B0909484553720N00645953EA0232602367
+B0909504553712N00645937EA0232302364
+B0909524553704N00645919EA0232202363
+B0909544553697N00645902EA0232202362
+B0909564553690N00645886EA0231902360
+B0909584553682N00645870EA0231602357
+B0910004553674N00645853EA0231402355
+B0910024553665N00645839EA0231202353
+B0910044553655N00645825EA0230902350
+B0910064553646N00645810EA0230702347
+B0910084553637N00645796EA0230402345
+B0910104553627N00645781EA0230002342
+B0910124553618N00645766EA0229702339
+B0910144553609N00645751EA0229502336
+B0910164553601N00645735EA0229302334
+B0910184553594N00645718EA0229102332
+B0910204553587N00645702EA0228802329
+B0910224553579N00645686EA0228402327
+B0910244553571N00645671EA0228202324
+B0910264553563N00645656EA0228102322
+B0910284553554N00645642EA0227902320
+B0910304553545N00645627EA0227702318
+B0910324553537N00645612EA0227602316
+B0910344553528N00645598EA0227302314
+B0910364553518N00645584EA0227202312
+B0910384553509N00645570EA0226902310
+B0910404553500N00645556EA0226702308
+B0910424553490N00645542EA0226402305
+B0910444553481N00645527EA0226002302
+B0910464553472N00645512EA0225802299
+B0910484553461N00645498EA0225602297
+B0910504553452N00645485EA0225402295
+B0910524553442N00645471EA0225202293
+B0910544553431N00645458EA0225002291
+B0910564553421N00645445EA0224902289
+B0910584553410N00645432EA0224702288
+B0911004553400N00645419EA0224502286
+B0911024553390N00645406EA0224302284
+B0911044553381N00645392EA0224102282
+B0911064553371N00645378EA0223902280
+B0911084553361N00645364EA0223602278
+B0911104553351N00645350EA0223302275
+B0911124553341N00645335EA0223102272
+B0911144553332N00645320EA0222902270
+B0911164553324N00645306EA0222602268
+B0911184553317N00645291EA0222202264
+B0911204553308N00645276EA0221902261
+B0911224553300N00645260EA0221702258
+B0911244553293N00645246EA0221202254
+B0911264553285N00645231EA0220902250
+B0911284553279N00645215EA0221202248
+B0911304553274N00645203EA0221402248
+B0911324553268N00645193EA0221402249
+B0911344553261N00645183EA0221402250
+B0911364553256N00645171EA0221302250
+B0911384553249N00645157EA0221402250
+B0911404553242N00645142EA0221702252
+B0911424553237N00645126EA0222202256
+B0911444553233N00645110EA0222602260
+B0911464553227N00645094EA0223002265
+B0911484553216N00645082EA0223202268
+B0911504553203N00645085EA0223502272
+B0911524553197N00645101EA0223802275
+B0911544553206N00645112EA0224202280
+B0911564553216N00645107EA0224502284
+B0911584553220N00645090EA0224802287
+B0912004553214N00645071EA0225102290
+B0912024553200N00645061EA0225502293
+B0912044553186N00645065EA0225702296
+B0912064553179N00645079EA0226002299
+B0912084553182N00645094EA0226302302
+B0912104553192N00645100EA0226402304
+B0912124553203N00645091EA0226602306
+B0912144553207N00645075EA0226802308
+B0912164553203N00645058EA0227002310
+B0912184553192N00645047EA0227102312
+B0912204553178N00645047EA0227302313
+B0912224553168N00645057EA0227602315
+B0912244553168N00645074EA0227802317
+B0912264553175N00645087EA0228002320
+B0912284553185N00645090EA0228202322
+B0912304553194N00645085EA0228402324
+B0912324553199N00645070EA0228802327
+B0912344553197N00645051EA0229102330
+B0912364553185N00645040EA0229102332
+B0912384553172N00645046EA0229102333
+B0912404553169N00645062EA0229202334
+B0912424553177N00645072EA0229402336
+B0912444553187N00645072EA0229802338
+B0912464553196N00645066EA0230302343
+B0912484553204N00645058EA0230602347
+B0912504553210N00645052EA0230802350
+B0912524553214N00645035EA0230802351
+B0912544553208N00645014EA0231202352
+B0912564553197N00645005EA0231602355
+B0912584553186N00645012EA0231802358
+B0913004553183N00645025EA0231902360
+B0913024553188N00645037EA0232002361
+B0913044553196N00645043EA0232402365
+B0913064553206N00645041EA0232702367
+B0913084553216N00645029EA0233102371
+B0913104553219N00645010EA0233602375
+B0913124553214N00644990EA0234102380
+B0913144553203N00644979EA0234402384
+B0913164553192N00644985EA0234702388
+B0913184553191N00645000EA0235102392
+B0913204553199N00645008EA0235502396
+B0913224553210N00645004EA0235802399
+B0913244553217N00644987EA0236202402
+B0913264553212N00644965EA0236702407
+B0913284553199N00644956EA0237102411
+B0913304553189N00644962EA0237302415
+B0913324553187N00644977EA0237602418
+B0913344553196N00644983EA0237902420
+B0913364553208N00644975EA0238302424
+B0913384553213N00644958EA0238702429
+B0913404553212N00644939EA0239302433
+B0913424553202N00644926EA0239802438
+B0913444553189N00644925EA0240202443
+B0913464553182N00644934EA0240302446
+B0913484553183N00644948EA0240502449
+B0913504553193N00644953EA0240802452
+B0913524553203N00644944EA0241002454
+B0913544553210N00644927EA0241302456
+B0913564553209N00644907EA0241802459
+B0913584553200N00644895EA0242302463
+B0914004553189N00644892EA0243002468
+B0914024553180N00644894EA0243502475
+B0914044553175N00644904EA0243702479
+B0914064553179N00644916EA0243902483
+B0914084553190N00644916EA0243902485
+B0914104553200N00644902EA0244002486
+B0914124553203N00644883EA0244602489
+B0914144553201N00644863EA0245002494
+B0914164553192N00644850EA0245002496
+B0914184553180N00644851EA0245102498
+B0914204553172N00644860EA0245202499
+B0914224553173N00644873EA0245702501
+B0914244553182N00644879EA0246202504
+B0914264553194N00644870EA0246602508
+B0914284553199N00644852EA0246902511
+B0914304553195N00644834EA0246902513
+B0914324553184N00644828EA0246602513
+B0914344553173N00644837EA0246602513
+B0914364553169N00644850EA0247002515
+B0914384553172N00644860EA0247302518
+B0914404553178N00644866EA0247502520
+B0914424553186N00644869EA0247702522
+B0914444553196N00644866EA0247902523
+B0914464553207N00644858EA0248402526
+B0914484553216N00644850EA0249002531
+B0914504553223N00644837EA0249302535
+B0914524553229N00644818EA0249502538
+B0914544553225N00644793EA0249702541
+B0914564553213N00644785EA0249602542
+B0914584553206N00644797EA0249802542
+B0915004553206N00644811EA0250302546
+B0915024553207N00644820EA0250802551
+B0915044553210N00644826EA0251102555
+B0915064553221N00644825EA0251002557
+B0915084553232N00644814EA0251002557
+B0915104553235N00644795EA0251002556
+B0915124553231N00644775EA0251402557
+B0915144553223N00644760EA0251802560
+B0915164553213N00644751EA0252002562
+B0915184553203N00644754EA0251902563
+B0915204553197N00644765EA0251902563
+B0915224553197N00644778EA0252102565
+B0915244553205N00644785EA0252302566
+B0915264553218N00644781EA0252402568
+B0915284553224N00644758EA0252402567
+B0915304553220N00644736EA0252702568
+B0915324553208N00644729EA0252902570
+B0915344553198N00644729EA0253002572
+B0915364553191N00644734EA0252902573
+B0915384553187N00644745EA0252802572
+B0915404553193N00644757EA0252802572
+B0915424553205N00644759EA0252902572
+B0915444553216N00644746EA0252902572
+B0915464553217N00644722EA0252902572
+B0915484553210N00644707EA0253202574
+B0915504553199N00644702EA0253202575
+B0915524553189N00644699EA0253102574
+B0915544553178N00644698EA0252602572
+B0915564553164N00644699EA0252602570
+B0915584553151N00644699EA0252702571
+B0916004553140N00644701EA0252602570
+B0916024553129N00644703EA0252402568
+B0916044553117N00644703EA0252002565
+B0916064553106N00644705EA0251602562
+B0916084553093N00644706EA0251302558
+B0916104553081N00644705EA0251202556
+B0916124553070N00644702EA0250802553
+B0916144553058N00644699EA0250502550
+B0916164553046N00644696EA0250302547
+B0916184553034N00644694EA0250202545
+B0916204553022N00644693EA0250002543
+B0916224553009N00644689EA0250002542
+B0916244552997N00644682EA0250302542
+B0916264552986N00644677EA0250802544
+B0916284552976N00644672EA0251302549
+B0916304552967N00644665EA0251202550
+B0916324552955N00644659EA0250902551
+B0916344552942N00644655EA0251002551
+B0916364552930N00644650EA0251502554
+B0916384552918N00644646EA0251802557
+B0916404552905N00644641EA0252102560
+B0916424552892N00644637EA0252202563
+B0916444552880N00644635EA0252302564
+B0916464552866N00644633EA0252502566
+B0916484552853N00644631EA0252502567
+B0916504552841N00644629EA0252602568
+B0916524552829N00644626EA0252702569
+B0916544552817N00644623EA0252602569
+B0916564552804N00644620EA0252802570
+B0916584552790N00644619EA0253202572
+B0917004552778N00644618EA0253502576
+B0917024552767N00644621EA0253602578
+B0917044552756N00644629EA0253602578
+B0917064552748N00644638EA0253502578
+B0917084552736N00644641EA0253302578
+B0917104552722N00644638EA0252702576
+B0917124552708N00644629EA0252002572
+B0917144552695N00644619EA0251402565
+B0917164552681N00644607EA0251002560
+B0917184552670N00644595EA0250702557
+B0917204552660N00644583EA0250302552
+B0917224552649N00644570EA0249602546
+B0917244552638N00644555EA0249302541
+B0917264552627N00644542EA0248902537
+B0917284552617N00644529EA0248502532
+B0917304552604N00644515EA0248202527
+B0917324552591N00644502EA0248302524
+B0917344552579N00644491EA0248602523
+B0917364552569N00644478EA0249002524
+B0917384552559N00644464EA0249502528
+B0917404552549N00644449EA0250102534
+B0917424552541N00644434EA0250602541
+B0917444552534N00644418EA0251102547
+B0917464552525N00644405EA0251702552
+B0917484552516N00644394EA0252202558
+B0917504552507N00644386EA0252202562
+B0917524552494N00644387EA0251802565
+B0917544552487N00644399EA0251802566
+B0917564552496N00644407EA0252202567
+B0917584552508N00644397EA0252602570
+B0918004552514N00644383EA0253102575
+B0918024552516N00644367EA0253402578
+B0918044552516N00644350EA0253702581
+B0918064552512N00644333EA0254002584
+B0918084552506N00644317EA0254402587
+B0918104552500N00644302EA0254702590
+B0918124552493N00644287EA0254702592
+B0918144552483N00644274EA0254602592
+B0918164552471N00644260EA0254702592
+B0918184552458N00644247EA0254902593
+B0918204552445N00644232EA0255102595
+B0918224552433N00644218EA0255202596
+B0918244552419N00644205EA0255002596
+B0918264552405N00644190EA0255002595
+B0918284552393N00644174EA0255002595
+B0918304552381N00644159EA0254802593
+B0918324552367N00644145EA0254602592
+B0918344552352N00644131EA0254302589
+B0918364552338N00644117EA0254102587
+B0918384552326N00644103EA0254102586
+B0918404552314N00644090EA0253802585
+B0918424552301N00644079EA0253302581
+B0918444552288N00644066EA0252802576
+B0918464552276N00644051EA0252202571
+B0918484552265N00644037EA0251602564
+B0918504552253N00644023EA0250902558
+B0918524552240N00644010EA0250402552
+B0918544552228N00643998EA0250002546
+B0918564552216N00643986EA0249502541
+B0918584552204N00643973EA0249002536
+B0919004552191N00643961EA0248702532
+B0919024552179N00643951EA0248302528
+B0919044552167N00643939EA0247602523
+B0919064552154N00643927EA0247002516
+B0919084552139N00643916EA0246602512
+B0919104552128N00643903EA0246202508
+B0919124552117N00643890EA0245502502
+B0919144552104N00643878EA0245002496
+B0919164552091N00643867EA0244802491
+B0919184552080N00643855EA0244302487
+B0919204552068N00643844EA0243702482
+B0919224552055N00643834EA0243002476
+B0919244552042N00643823EA0242602471
+B0919264552029N00643812EA0242302468
+B0919284552016N00643801EA0241902464
+B0919304552003N00643789EA0241602460
+B0919324551990N00643779EA0241402458
+B0919344551978N00643769EA0240902455
+B0919364551965N00643761EA0240602451
+B0919384551951N00643760EA0240602448
+B0919404551938N00643760EA0240402446
+B0919424551925N00643755EA0239802442
+B0919444551911N00643750EA0239602438
+B0919464551898N00643743EA0239402435
+B0919484551887N00643730EA0239202432
+B0919504551875N00643716EA0238902430
+B0919524551863N00643702EA0238902429
+B0919544551852N00643687EA0238902428
+B0919564551840N00643674EA0238602427
+B0919584551828N00643660EA0238402425
+B0920004551815N00643647EA0238402424
+B0920024551803N00643634EA0238502424
+B0920044551791N00643622EA0238502424
+B0920064551778N00643608EA0238402423
+B0920084551766N00643594EA0238402424
+B0920104551753N00643584EA0238502425
+B0920124551741N00643573EA0238402425
+B0920144551729N00643563EA0238202423
+B0920164551715N00643554EA0238002421
+B0920184551701N00643548EA0238002421
+B0920204551688N00643544EA0237902420
+B0920224551673N00643540EA0237502418
+B0920244551658N00643535EA0237302415
+B0920264551644N00643530EA0237202414
+B0920284551630N00643522EA0237102413
+B0920304551616N00643512EA0237002413
+B0920324551603N00643502EA0236902412
+B0920344551590N00643492EA0236902411
+B0920364551578N00643482EA0236702410
+B0920384551565N00643472EA0236502408
+B0920404551552N00643463EA0236402406
+B0920424551539N00643453EA0236202405
+B0920444551527N00643444EA0236002403
+B0920464551516N00643434EA0235602400
+B0920484551504N00643423EA0235402397
+B0920504551491N00643413EA0235302395
+B0920524551477N00643406EA0235102393
+B0920544551465N00643400EA0234902392
+B0920564551452N00643394EA0234702389
+B0920584551438N00643387EA0234602388
+B0921004551426N00643379EA0234502387
+B0921024551414N00643370EA0234302385
+B0921044551401N00643359EA0234002382
+B0921064551389N00643348EA0233902381
+B0921084551377N00643336EA0233802380
+B0921104551366N00643324EA0233602377
+B0921124551354N00643311EA0233302375
+B0921144551342N00643300EA0233102373
+B0921164551330N00643289EA0232702371
+B0921184551318N00643278EA0232402367
+B0921204551306N00643265EA0232202364
+B0921224551294N00643255EA0232202363
+B0921244551283N00643246EA0232002362
+B0921264551271N00643235EA0231802359
+B0921284551258N00643223EA0231602357
+B0921304551246N00643212EA0231402356
+B0921324551235N00643200EA0231202354
+B0921344551224N00643187EA0230902351
+B0921364551212N00643175EA0230602348
+B0921384551199N00643165EA0230402346
+B0921404551185N00643156EA0230202344
+B0921424551172N00643148EA0229902341
+B0921444551159N00643139EA0229702339
+B0921464551146N00643129EA0229502337
+B0921484551133N00643118EA0229202334
+B0921504551120N00643108EA0229002332
+B0921524551108N00643099EA0228802330
+B0921544551096N00643089EA0228502327
+B0921564551084N00643076EA0228202324
+B0921584551072N00643064EA0227802321
+B0922004551060N00643051EA0227602318
+B0922024551048N00643039EA0227402316
+B0922044551036N00643027EA0227402315
+B0922064551026N00643016EA0227202313
+B0922084551015N00643004EA0226802310
+B0922104551004N00642992EA0226602308
+B0922124550993N00642982EA0226302305
+B0922144550981N00642973EA0226002302
+B0922164550968N00642965EA0225702299
+B0922184550955N00642956EA0225402296
+B0922204550943N00642946EA0225102293
+B0922224550931N00642936EA0224802290
+B0922244550919N00642927EA0224602287
+B0922264550907N00642917EA0224302285
+B0922284550896N00642906EA0224002281
+B0922304550885N00642896EA0223702278
+B0922324550872N00642886EA0223302275
+B0922344550861N00642876EA0222902271
+B0922364550848N00642866EA0222502267
+B0922384550835N00642859EA0222102263
+B0922404550822N00642852EA0221902260
+B0922424550809N00642845EA0221502257
+B0922444550798N00642836EA0220902252
+B0922464550786N00642827EA0220302246
+B0922484550773N00642819EA0219602239
+B0922504550761N00642808EA0219302234
+B0922524550750N00642797EA0219102231
+B0922544550738N00642787EA0219002229
+B0922564550727N00642774EA0218902227
+B0922584550716N00642761EA0218802226
+B0923004550705N00642751EA0218602226
+B0923024550693N00642741EA0218502224
+B0923044550681N00642731EA0218502223
+B0923064550668N00642725EA0218502224
+B0923084550656N00642719EA0218502224
+B0923104550644N00642712EA0218402223
+B0923124550632N00642701EA0218202222
+B0923144550620N00642690EA0218202221
+B0923164550607N00642679EA0217802219
+B0923184550594N00642668EA0217702217
+B0923204550582N00642656EA0217502215
+B0923224550569N00642644EA0217402214
+B0923244550556N00642633EA0217202212
+B0923264550544N00642622EA0217002211
+B0923284550533N00642609EA0216902209
+B0923304550522N00642598EA0216802208
+B0923324550511N00642587EA0216602206
+B0923344550500N00642573EA0216402204
+B0923364550490N00642558EA0216102202
+B0923384550481N00642545EA0215702199
+B0923404550472N00642531EA0215002195
+B0923424550463N00642517EA0214302189
+B0923444550451N00642503EA0213702183
+B0923464550441N00642492EA0213102177
+B0923484550430N00642482EA0212402169
+B0923504550418N00642471EA0211702161
+B0923524550404N00642463EA0211002155
+B0923544550389N00642458EA0210502149
+B0923564550373N00642452EA0210102143
+B0923584550359N00642445EA0209902139
+B0924004550345N00642438EA0209402135
+B0924024550331N00642431EA0208802130
+B0924044550317N00642421EA0208302124
+B0924064550304N00642410EA0208002120
+B0924084550290N00642400EA0207702117
+B0924104550278N00642391EA0207402113
+B0924124550264N00642383EA0207102109
+B0924144550251N00642374EA0206902107
+B0924164550238N00642366EA0206402103
+B0924184550223N00642356EA0205802098
+B0924204550209N00642347EA0205602094
+B0924224550195N00642337EA0205502092
+B0924244550183N00642329EA0205102089
+B0924264550169N00642322EA0204602085
+B0924284550154N00642313EA0204602083
+B0924304550141N00642304EA0204502082
+B0924324550127N00642295EA0204202079
+B0924344550112N00642285EA0204002076
+B0924364550098N00642275EA0203802075
+B0924384550084N00642266EA0203702073
+B0924404550070N00642256EA0203702073
+B0924424550055N00642251EA0203802074
+B0924444550042N00642248EA0203602074
+B0924464550028N00642243EA0203502073
+B0924484550014N00642238EA0203702073
+B0924504550001N00642233EA0203702074
+B0924524549988N00642228EA0203602074
+B0924544549974N00642224EA0203502073
+B0924564549961N00642220EA0203502073
+B0924584549948N00642217EA0203502074
+B0925004549935N00642214EA0203502074
+B0925024549921N00642211EA0203602074
+B0925044549909N00642206EA0203702075
+B0925064549896N00642201EA0203702075
+B0925084549884N00642197EA0203502075
+B0925104549872N00642194EA0203402074
+B0925124549858N00642191EA0203402074
+B0925144549845N00642187EA0203402074
+B0925164549832N00642184EA0203202073
+B0925184549818N00642181EA0203202072
+B0925204549804N00642177EA0203302072
+B0925224549789N00642173EA0203402073
+B0925244549775N00642169EA0203502074
+B0925264549761N00642166EA0203602076
+B0925284549747N00642162EA0203702077
+B0925304549733N00642157EA0203902078
+B0925324549720N00642152EA0204002079
+B0925344549706N00642148EA0204302081
+B0925364549692N00642144EA0204702085
+B0925384549678N00642139EA0205102088
+B0925404549665N00642134EA0205402092
+B0925424549653N00642127EA0205902096
+B0925444549642N00642120EA0206102100
+B0925464549630N00642115EA0206402102
+B0925484549618N00642108EA0206702106
+B0925504549606N00642101EA0206902109
+B0925524549595N00642100EA0207002111
+B0925544549588N00642108EA0207002112
+B0925564549591N00642117EA0207002112
+B0925584549601N00642117EA0207002113
+B0926004549611N00642109EA0207402116
+B0926024549620N00642101EA0207702119
+B0926044549628N00642096EA0207902121
+B0926064549636N00642092EA0208202123
+B0926084549643N00642089EA0208602126
+B0926104549650N00642086EA0209002130
+B0926124549656N00642083EA0209502135
+B0926144549662N00642082EA0209902139
+B0926164549668N00642082EA0210302143
+B0926184549674N00642082EA0210602147
+B0926204549680N00642088EA0210702148
+B0926224549677N00642104EA0210902150
+B0926244549665N00642111EA0211102151
+B0926264549649N00642100EA0211602154
+B0926284549638N00642086EA0211902158
+B0926304549627N00642074EA0212202161
+B0926324549614N00642062EA0212702165
+B0926344549602N00642057EA0212902168
+B0926364549592N00642065EA0212502170
+B0926384549589N00642076EA0212502171
+B0926404549597N00642080EA0212702171
+B0926424549608N00642076EA0213002172
+B0926444549615N00642070EA0213202174
+B0926464549622N00642066EA0213602177
+B0926484549629N00642062EA0214102181
+B0926504549635N00642057EA0214502185
+B0926524549641N00642052EA0215002189
+B0926544549648N00642049EA0215602195
+B0926564549653N00642050EA0216002200
+B0926584549655N00642059EA0216402204
+B0927004549650N00642072EA0216902208
+B0927024549634N00642072EA0217202212
+B0927044549621N00642054EA0217402214
+B0927064549620N00642032EA0217602217
+B0927084549632N00642030EA0217902220
+B0927104549640N00642043EA0218702225
+B0927124549645N00642051EA0219402232
+B0927144549651N00642053EA0220102240
+B0927164549655N00642058EA0220502246
+B0927184549651N00642069EA0220702250
+B0927204549633N00642070EA0221002252
+B0927224549618N00642050EA0221802258
+B0927244549616N00642029EA0222202263
+B0927264549622N00642015EA0222802268
+B0927284549629N00642008EA0223602275
+B0927304549636N00642003EA0224402283
+B0927324549640N00641998EA0224802290
+B0927344549646N00641999EA0225202295
+B0927364549648N00642012EA0225602299
+B0927384549637N00642023EA0225802302
+B0927404549620N00642018EA0226102304
+B0927424549607N00641997EA0226702307
+B0927444549606N00641976EA0227202312
+B0927464549612N00641962EA0227902318
+B0927484549619N00641955EA0228702326
+B0927504549626N00641949EA0229502333
+B0927524549632N00641944EA0230302342
+B0927544549639N00641938EA0231002349
+B0927564549647N00641937EA0231502356
+B0927584549651N00641951EA0231802360
+B0928004549645N00641967EA0232202365
+B0928024549629N00641967EA0232702368
+B0928044549618N00641948EA0233502374
+B0928064549616N00641930EA0234702382
+B0928084549620N00641921EA0235602392
+B0928104549625N00641916EA0236202401
+B0928124549630N00641909EA0236402407
+B0928144549637N00641903EA0236602412
+B0928164549647N00641910EA0237102416
+B0928184549652N00641928EA0237702420
+B0928204549646N00641946EA0237802424
+B0928224549632N00641960EA0238102426
+B0928244549616N00641965EA0238602430
+B0928264549602N00641956EA0239002433
+B0928284549594N00641939EA0239402437
+B0928304549598N00641925EA0240002442
+B0928324549607N00641922EA0240502446
+B0928344549614N00641919EA0240802450
+B0928364549620N00641911EA0241302454
+B0928384549628N00641904EA0242102460
+B0928404549635N00641902EA0242002464
+B0928424549642N00641903EA0241602467
+B0928444549645N00641915EA0240802466
+B0928464549638N00641934EA0240102463
+B0928484549622N00641939EA0239702455
+B0928504549606N00641929EA0240002451
+B0928524549595N00641920EA0240302451
+B0928544549584N00641916EA0240702453
+B0928564549571N00641911EA0241002455
+B0928584549559N00641904EA0241402459
+B0929004549546N00641899EA0241902463
+B0929024549533N00641894EA0242302466
+B0929044549522N00641890EA0242902470
+B0929064549516N00641894EA0243402474
+B0929084549512N00641901EA0243702478
+B0929104549510N00641910EA0243602481
+B0929124549511N00641920EA0243402481
+B0929144549517N00641931EA0243702483
+B0929164549525N00641933EA0244402486
+B0929184549529N00641928EA0245102492
+B0929204549532N00641923EA0245602496
+B0929224549535N00641919EA0245902500
+B0929244549537N00641911EA0246302504
+B0929264549536N00641901EA0246402506
+B0929284549528N00641891EA0246402508
+B0929304549516N00641886EA0246702510
+B0929324549507N00641881EA0246702512
+B0929344549497N00641876EA0246402512
+B0929364549482N00641880EA0246802511
+B0929384549474N00641896EA0247302513
+B0929404549476N00641910EA0247602515
+B0929424549482N00641916EA0247502516
+B0929444549488N00641915EA0247602517
+B0929464549493N00641912EA0248102521
+B0929484549497N00641912EA0247802521
+B0929504549500N00641910EA0247302521
+B0929524549506N00641904EA0247202519
+B0929544549511N00641900EA0246902517
+B0929564549516N00641897EA0246102513
+B0929584549521N00641893EA0245602508
+B0930004549526N00641884EA0245202504
+B0930024549522N00641868EA0244602498
+B0930044549511N00641855EA0244202492
+B0930064549498N00641844EA0244302488
+B0930084549486N00641834EA0244702486
+B0930104549478N00641829EA0244602485
+B0930124549466N00641826EA0244102482
+B0930144549455N00641817EA0244102479
+B0930164549446N00641806EA0244202479
+B0930184549439N00641794EA0243902478
+B0930204549428N00641782EA0243602475
+B0930224549416N00641768EA0244402475
+B0930244549407N00641753EA0245102477
+B0930264549398N00641741EA0245102479
+B0930284549383N00641737EA0245102479
+B0930304549371N00641739EA0245602483
+B0930324549362N00641741EA0245802487
+B0930344549355N00641745EA0245202488
+B0930364549349N00641760EA0244902489
+B0930384549353N00641773EA0245002490
+B0930404549365N00641771EA0245002490
+B0930424549372N00641753EA0244902491
+B0930444549371N00641733EA0245002492
+B0930464549365N00641716EA0245002493
+B0930484549356N00641702EA0244802492
+B0930504549347N00641688EA0244902491
+B0930524549338N00641675EA0244702490
+B0930544549331N00641661EA0244302488
+B0930564549325N00641645EA0243702485
+B0930584549316N00641631EA0243102479
+B0931004549305N00641619EA0242602474
+B0931024549296N00641607EA0242502471
+B0931044549286N00641596EA0242402469
+B0931064549275N00641587EA0242402468
+B0931084549264N00641577EA0242402467
+B0931104549253N00641564EA0242402466
+B0931124549242N00641551EA0242702467
+B0931144549230N00641542EA0242802468
+B0931164549220N00641532EA0242502467
+B0931184549210N00641516EA0242502467
+B0931204549199N00641499EA0242702467
+B0931224549190N00641483EA0242902469
+B0931244549181N00641470EA0242802469
+B0931264549170N00641453EA0243202470
+B0931284549160N00641437EA0243502473
+B0931304549152N00641421EA0243602475
+B0931324549145N00641405EA0243602476
+B0931344549137N00641393EA0243402476
+B0931364549129N00641383EA0243302474
+B0931384549120N00641371EA0243202473
+B0931404549113N00641358EA0243502474
+B0931424549104N00641346EA0243802475
+B0931444549095N00641335EA0244102478
+B0931464549086N00641324EA0244302482
+B0931484549076N00641312EA0244402483
+B0931504549064N00641306EA0244302484
+B0931524549053N00641303EA0243902483
+B0931544549041N00641298EA0243502481
+B0931564549029N00641287EA0243202478
+B0931584549016N00641272EA0242902474
+B0932004549004N00641253EA0242702471
+B0932024548990N00641238EA0242502469
+B0932044548977N00641228EA0242302467
+B0932064548965N00641218EA0242002464
+B0932084548952N00641210EA0241602461
+B0932104548939N00641198EA0241302457
+B0932124548928N00641182EA0241002454
+B0932144548919N00641165EA0240702452
+B0932164548909N00641149EA0240502448
+B0932184548898N00641135EA0240702447
+B0932204548889N00641124EA0241202446
+B0932224548880N00641116EA0241502449
+B0932244548869N00641108EA0241702452
+B0932264548858N00641109EA0241602453
+B0932284548851N00641122EA0241702455
+B0932304548854N00641131EA0242302459
+B0932324548862N00641132EA0242602464
+B0932344548870N00641128EA0242702466
+B0932364548876N00641119EA0242502468
+B0932384548881N00641100EA0242202467
+B0932404548877N00641077EA0242102466
+B0932424548865N00641062EA0242502466
+B0932444548854N00641060EA0242702466
+B0932464548845N00641064EA0242602466
+B0932484548837N00641071EA0242602466
+B0932504548834N00641085EA0242702467
+B0932524548841N00641095EA0243002470
+B0932544548849N00641101EA0243402474
+B0932564548854N00641107EA0243702478
+B0932584548858N00641112EA0243702480
+B0933004548865N00641111EA0243602480
+B0933024548875N00641099EA0243802480
+B0933044548877N00641076EA0243902482
+B0933064548870N00641057EA0243902483
+B0933084548862N00641043EA0243902483
+B0933104548850N00641036EA0243702482
+B0933124548838N00641043EA0243402481
+B0933144548833N00641058EA0243602480
+B0933164548839N00641068EA0243802481
+B0933184548847N00641074EA0243802481
+B0933204548856N00641078EA0243802481
+B0933224548865N00641084EA0243902482
+B0933244548874N00641090EA0244202484
+B0933264548880N00641095EA0244402487
+B0933284548888N00641097EA0244502489
+B0933304548897N00641101EA0244502489
+B0933324548906N00641110EA0244902491
+B0933344548914N00641120EA0245402494
+B0933364548918N00641130EA0245702498
+B0933384548922N00641138EA0245702500
+B0933404548931N00641138EA0245702502
+B0933424548945N00641125EA0245802503
+B0933444548950N00641104EA0246102505
+B0933464548944N00641090EA0246502506
+B0933484548933N00641088EA0247002510
+B0933504548928N00641094EA0247202514
+B0933524548928N00641102EA0247502517
+B0933544548933N00641110EA0248002520
+B0933564548939N00641115EA0248502525
+B0933584548946N00641115EA0248802529
+B0934004548953N00641119EA0248902532
+B0934024548960N00641126EA0248902534
+B0934044548969N00641117EA0248802535
+B0934064548970N00641094EA0248802534
+B0934084548957N00641074EA0249102534
+B0934104548945N00641068EA0250002537
+B0934124548936N00641067EA0250802543
+B0934144548929N00641065EA0251202548
+B0934164548923N00641070EA0251002551
+B0934184548927N00641078EA0251002553
+B0934204548937N00641068EA0251002554
+B0934224548945N00641054EA0251502559
+B0934244548950N00641045EA0251702562
+B0934264548953N00641030EA0251602564
+B0934284548954N00641008EA0251902565
+B0934304548947N00640993EA0252402568
+B0934324548937N00640993EA0252602571
+B0934344548932N00641002EA0253102574
+B0934364548931N00641014EA0253902580
+B0934384548934N00641022EA0254302585
+B0934404548941N00641024EA0254402587
+B0934424548951N00641013EA0254302589
+B0934444548954N00640992EA0254502589
+B0934464548947N00640976EA0255202592
+B0934484548938N00640977EA0255902595
+B0934504548929N00640985EA0256702603
+B0934524548926N00640991EA0256902608
+B0934544548928N00640996EA0256802611
+B0934564548939N00640993EA0256702613
+B0934584548949N00640974EA0256702614
+B0935004548948N00640949EA0257002615
+B0935024548938N00640931EA0257902619
+B0935044548929N00640922EA0258702626
+B0935064548923N00640914EA0258902630
+B0935084548915N00640902EA0258602632
+B0935104548904N00640896EA0258302632
+B0935124548897N00640903EA0258402633
+B0935144548899N00640912EA0258602634
+B0935164548909N00640913EA0258802635
+B0935184548919N00640904EA0259102636
+B0935204548926N00640887EA0259402639
+B0935224548925N00640865EA0259802642
+B0935244548916N00640850EA0260202646
+B0935264548906N00640848EA0260402649
+B0935284548902N00640857EA0260802652
+B0935304548909N00640863EA0261002655
+B0935324548922N00640855EA0261202658
+B0935344548928N00640837EA0261502661
+B0935364548927N00640818EA0261702663
+B0935384548922N00640802EA0262102666
+B0935404548911N00640792EA0262502670
+B0935424548900N00640785EA0262802673
+B0935444548891N00640776EA0263002675
+B0935464548883N00640766EA0263302678
+B0935484548874N00640757EA0263602681
+B0935504548865N00640755EA0263602684
+B0935524548857N00640764EA0263602685
+B0935544548850N00640773EA0263702686
+B0935564548840N00640770EA0263702685
+B0935584548829N00640762EA0263902686
+B0936004548818N00640756EA0264402688
+B0936024548807N00640749EA0264902691
+B0936044548796N00640743EA0265202695
+B0936064548786N00640736EA0265502699
+B0936084548777N00640727EA0265602701
+B0936104548768N00640717EA0265502702
+B0936124548758N00640708EA0265502702
+B0936144548749N00640698EA0265602703
+B0936164548740N00640685EA0265902703
+B0936184548733N00640669EA0266602705
+B0936204548731N00640656EA0267502709
+B0936224548727N00640648EA0268202715
+B0936244548721N00640640EA0268602721
+B0936264548715N00640630EA0268602725
+B0936284548706N00640620EA0268902728
+B0936304548696N00640608EA0269502734
+B0936324548687N00640597EA0270202740
+B0936344548678N00640587EA0270802747
+B0936364548669N00640577EA0271402754
+B0936384548660N00640567EA0272002760
+B0936404548652N00640559EA0272302766
+B0936424548643N00640552EA0272402770
+B0936444548633N00640544EA0272402772
+B0936464548622N00640534EA0273002775
+B0936484548612N00640525EA0273702780
+B0936504548603N00640514EA0274302786
+B0936524548595N00640498EA0274902791
+B0936544548586N00640485EA0275402797
+B0936564548576N00640476EA0275902802
+B0936584548565N00640464EA0276602808
+B0937004548554N00640454EA0277002814
+B0937024548543N00640448EA0277102818
+B0937044548530N00640439EA0277102820
+B0937064548518N00640426EA0277302822
+B0937084548508N00640417EA0277302824
+B0937104548496N00640412EA0277002824
+B0937124548484N00640403EA0276802822
+B0937144548473N00640392EA0276802822
+B0937164548463N00640383EA0276902821
+B0937184548453N00640372EA0277002822
+B0937204548445N00640361EA0277302823
+B0937224548436N00640351EA0277402825
+B0937244548427N00640341EA0277302824
+B0937264548417N00640327EA0277202823
+B0937284548408N00640312EA0277302823
+B0937304548400N00640300EA0277102823
+B0937324548391N00640289EA0277002821
+B0937344548383N00640276EA0277002821
+B0937364548375N00640264EA0276802820
+B0937384548366N00640254EA0276702818
+B0937404548359N00640241EA0276602817
+B0937424548351N00640227EA0276502815
+B0937444548343N00640214EA0276602814
+B0937464548334N00640200EA0276802815
+B0937484548327N00640184EA0277002817
+B0937504548319N00640169EA0277202819
+B0937524548310N00640156EA0277202819
+B0937544548303N00640138EA0277502821
+B0937564548297N00640121EA0277802823
+B0937584548292N00640107EA0278002825
+B0938004548284N00640091EA0278202826
+B0938024548276N00640075EA0278802829
+B0938044548269N00640061EA0279202834
+B0938064548264N00640048EA0279202836
+B0938084548258N00640032EA0279102837
+B0938104548252N00640014EA0279402839
+B0938124548247N00639999EA0279702842
+B0938144548243N00639985EA0279802843
+B0938164548237N00639969EA0279902844
+B0938184548230N00639953EA0280202846
+B0938204548225N00639938EA0280402849
+B0938224548219N00639923EA0280502850
+B0938244548213N00639906EA0280602851
+B0938264548210N00639888EA0280802853
+B0938284548206N00639872EA0280802854
+B0938304548202N00639856EA0280802854
+B0938324548198N00639840EA0280802854
+B0938344548194N00639824EA0280702853
+B0938364548190N00639809EA0280702853
+B0938384548185N00639794EA0280602852
+B0938404548180N00639779EA0280302851
+B0938424548175N00639764EA0280302849
+B0938444548165N00639760EA0279902848
+B0938464548150N00639762EA0279602845
+B0938484548143N00639746EA0278602840
+B0938504548149N00639719EA0278802836
+B0938524548154N00639702EA0279102835
+B0938544548152N00639690EA0278702833
+B0938564548150N00639671EA0278002828
+B0938584548149N00639650EA0278102827
+B0939004548148N00639633EA0278102827
+B0939024548145N00639616EA0277602823
+B0939044548142N00639594EA0277202820
+B0939064548142N00639572EA0277102818
+B0939084548146N00639552EA0276602814
+B0939104548154N00639532EA0276402810
+B0939124548161N00639512EA0276402808
+B0939144548165N00639494EA0276302807
+B0939164548166N00639474EA0275902804
+B0939184548165N00639453EA0275702801
+B0939204548164N00639433EA0275802800
+B0939224548164N00639415EA0275602799
+B0939244548162N00639397EA0275202796
+B0939264548159N00639378EA0274902793
+B0939284548155N00639361EA0274802792
+B0939304548152N00639344EA0274502789
+B0939324548148N00639329EA0274102786
+B0939344548142N00639312EA0273702782
+B0939364548137N00639294EA0273402779
+B0939384548132N00639276EA0273102775
+B0939404548127N00639258EA0272902773
+B0939424548124N00639240EA0272902772
+B0939444548120N00639224EA0272702771
+B0939464548114N00639207EA0272802770
+B0939484548109N00639192EA0272902771
+B0939504548102N00639178EA0272702770
+B0939524548096N00639163EA0272502768
+B0939544548090N00639148EA0272302767
+B0939564548083N00639135EA0272202766
+B0939584548077N00639121EA0271902764
+B0940004548070N00639106EA0271702762
+B0940024548063N00639092EA0271702761
+B0940044548056N00639078EA0271602760
+B0940064548049N00639063EA0271402758
+B0940084548041N00639048EA0271402757
+B0940104548032N00639034EA0271302757
+B0940124548025N00639021EA0271002755
+B0940144548017N00639005EA0270702752
+B0940164548010N00638990EA0270702751
+B0940184548003N00638977EA0270402750
+B0940204547996N00638964EA0270202747
+B0940224547989N00638950EA0270102746
+B0940244547983N00638937EA0270102745
+B0940264547977N00638923EA0269902744
+B0940284547970N00638908EA0269702742
+B0940304547964N00638893EA0269502740
+B0940324547958N00638877EA0269202738
+B0940344547952N00638861EA0268802734
+B0940364547947N00638843EA0268502731
+B0940384547942N00638827EA0268302729
+B0940404547937N00638811EA0268002726
+B0940424547932N00638794EA0267602722
+B0940444547927N00638777EA0267302718
+B0940464547921N00638761EA0266902715
+B0940484547915N00638744EA0266502711
+B0940504547909N00638727EA0266002707
+B0940524547901N00638709EA0265702703
+B0940544547893N00638693EA0265402700
+B0940564547886N00638678EA0265202696
+B0940584547880N00638660EA0265002693
+B0941004547876N00638643EA0264902691
+B0941024547874N00638626EA0264702689
+B0941044547873N00638609EA0264302685
+B0941064547874N00638588EA0264302683
+B0941084547873N00638571EA0264602683
+B0941104547869N00638558EA0264402682
+B0941124547862N00638544EA0264002680
+B0941144547856N00638528EA0263702678
+B0941164547850N00638511EA0263702678
+B0941184547846N00638496EA0263602677
+B0941204547842N00638480EA0263702677
+B0941224547839N00638466EA0263702678
+B0941244547837N00638453EA0263302676
+B0941264547833N00638436EA0262902674
+B0941284547830N00638420EA0263102673
+B0941304547826N00638409EA0263002674
+B0941324547820N00638400EA0262702672
+B0941344547813N00638387EA0262502670
+B0941364547805N00638374EA0262602669
+B0941384547798N00638363EA0262402668
+B0941404547789N00638351EA0262002666
+B0941424547783N00638336EA0261602663
+B0941444547778N00638322EA0261402661
+B0941464547772N00638309EA0261102658
+B0941484547767N00638294EA0260902654
+B0941504547763N00638277EA0260802653
+B0941524547759N00638260EA0260602651
+B0941544547753N00638246EA0260302649
+B0941564547748N00638230EA0260002646
+B0941584547744N00638215EA0259802643
+B0942004547741N00638200EA0259602640
+B0942024547737N00638184EA0259502639
+B0942044547734N00638170EA0259302637
+B0942064547731N00638154EA0259302636
+B0942084547728N00638137EA0259402637
+B0942104547725N00638122EA0259402637
+B0942124547722N00638105EA0259202635
+B0942144547718N00638089EA0259202635
+B0942164547712N00638075EA0259102634
+B0942184547706N00638061EA0259102634
+B0942204547700N00638048EA0259302635
+B0942224547693N00638036EA0259402636
+B0942244547687N00638024EA0259402636
+B0942264547682N00638012EA0259502637
+B0942284547677N00638000EA0259402637
+B0942304547673N00637986EA0259402637
+B0942324547669N00637974EA0259502638
+B0942344547664N00637964EA0259502638
+B0942364547660N00637952EA0259402638
+B0942384547653N00637939EA0259502638
+B0942404547645N00637926EA0259702640
+B0942424547637N00637914EA0259802641
+B0942444547631N00637901EA0259902642
+B0942464547625N00637889EA0259702642
+B0942484547619N00637876EA0259602641
+B0942504547612N00637862EA0259602641
+B0942524547607N00637848EA0259602641
+B0942544547602N00637834EA0259502641
+B0942564547595N00637821EA0259502640
+B0942584547588N00637810EA0259502640
+B0943004547582N00637798EA0259302639
+B0943024547576N00637783EA0259202637
+B0943044547570N00637769EA0259102636
+B0943064547565N00637756EA0259102636
+B0943084547560N00637742EA0259002635
+B0943104547555N00637725EA0259202636
+B0943124547551N00637709EA0259402637
+B0943144547546N00637696EA0259502637
+B0943164547541N00637680EA0259602639
+B0943184547537N00637666EA0259902641
+B0943204547534N00637655EA0259802642
+B0943224547529N00637642EA0259402641
+B0943244547523N00637629EA0259202639
+B0943264547517N00637616EA0259102638
+B0943284547513N00637601EA0259002636
+B0943304547509N00637586EA0258902635
+B0943324547504N00637574EA0258902635
+B0943344547499N00637562EA0258702633
+B0943364547494N00637549EA0258102630
+B0943384547486N00637537EA0257502626
+B0943404547478N00637524EA0257202622
+B0943424547472N00637511EA0256902619
+B0943444547464N00637501EA0256302614
+B0943464547456N00637490EA0256002609
+B0943484547448N00637478EA0255702605
+B0943504547439N00637470EA0255002600
+B0943524547430N00637461EA0254102595
+B0943544547421N00637447EA0253602588
+B0943564547413N00637432EA0253402584
+B0943584547406N00637419EA0253202581
+B0944004547401N00637406EA0252902577
+B0944024547395N00637392EA0252802574
+B0944044547390N00637374EA0253202571
+B0944064547390N00637356EA0253902571
+B0944084547388N00637342EA0254202573
+B0944104547385N00637329EA0254502576
+B0944124547381N00637315EA0254602578
+B0944144547374N00637300EA0254802580
+B0944164547367N00637284EA0255202584
+B0944184547361N00637269EA0255602588
+B0944204547356N00637256EA0256002593
+B0944224547351N00637243EA0256302597
+B0944244547345N00637230EA0256602601
+B0944264547340N00637218EA0256902604
+B0944284547335N00637207EA0256802606
+B0944304547328N00637194EA0256702607
+B0944324547320N00637179EA0257002609
+B0944344547313N00637165EA0257402612
+B0944364547307N00637155EA0257502615
+B0944384547299N00637145EA0257202616
+B0944404547291N00637132EA0257002615
+B0944424547283N00637117EA0257002616
+B0944444547277N00637104EA0256802614
+B0944464547270N00637091EA0256302612
+B0944484547262N00637075EA0256202610
+B0944504547255N00637058EA0256402609
+B0944524547250N00637042EA0256502611
+B0944544547244N00637026EA0256602611
+B0944564547237N00637008EA0256702612
+B0944584547229N00636991EA0257002613
+B0945004547222N00636976EA0257202615
+B0945024547216N00636961EA0257802617
+B0945044547212N00636946EA0259002621
+B0945064547209N00636935EA0259602628
+B0945084547204N00636922EA0260102633
+B0945104547196N00636908EA0261002639
+B0945124547188N00636897EA0262002647
+B0945144547178N00636888EA0263002657
+B0945164547167N00636881EA0263902668
+B0945184547155N00636876EA0264902680
+B0945204547143N00636872EA0265502689
+B0945224547129N00636866EA0266002696
+B0945244547116N00636857EA0266902705
+B0945264547105N00636847EA0268002715
+B0945284547095N00636842EA0268502724
+B0945304547083N00636837EA0268602731
+B0945324547072N00636828EA0268602735
+B0945344547061N00636820EA0268402739
+B0945364547050N00636811EA0267902740
+B0945384547040N00636798EA0267702737
+B0945404547030N00636784EA0267602735
+B0945424547019N00636772EA0267602734
+B0945444547009N00636759EA0267302731
+B0945464546998N00636745EA0267002728
+B0945484546988N00636730EA0266702724
+B0945504546979N00636714EA0266402720
+B0945524546970N00636697EA0266202717
+B0945544546962N00636680EA0266002714
+B0945564546954N00636662EA0265702710
+B0945584546947N00636643EA0265602708
+B0946004546940N00636626EA0265302706
+B0946024546934N00636610EA0264702702
+B0946044546926N00636594EA0264102697
+B0946064546917N00636578EA0263902693
+B0946084546909N00636564EA0263602690
+B0946104546902N00636550EA0263102686
+B0946124546895N00636536EA0262702681
+B0946144546886N00636522EA0262702677
+B0946164546877N00636507EA0262702675
+B0946184546871N00636492EA0262502673
+B0946204546865N00636476EA0262302670
+B0946224546859N00636459EA0262302669
+B0946244546852N00636444EA0262302669
+B0946264546844N00636430EA0262302668
+B0946284546836N00636414EA0262302668
+B0946304546828N00636397EA0262702668
+B0946324546820N00636383EA0263102670
+B0946344546812N00636371EA0263302672
+B0946364546801N00636359EA0263602674
+B0946384546791N00636349EA0264002677
+B0946404546781N00636340EA0264202681
+B0946424546771N00636329EA0264002682
+B0946444546761N00636317EA0264102682
+B0946464546752N00636302EA0264302684
+B0946484546745N00636288EA0264402686
+B0946504546738N00636274EA0264502687
+B0946524546731N00636260EA0264502688
+B0946544546723N00636244EA0264602689
+B0946564546716N00636228EA0264702690
+B0946584546709N00636212EA0264802691
+B0947004546701N00636198EA0265102693
+B0947024546694N00636185EA0265402696
+B0947044546689N00636172EA0265402697
+B0947064546682N00636158EA0265302697
+B0947084546675N00636144EA0265302697
+B0947104546670N00636129EA0265302697
+B0947124546665N00636114EA0265002696
+B0947144546660N00636096EA0265002695
+B0947164546655N00636078EA0265202695
+B0947184546650N00636064EA0265202695
+B0947204546644N00636050EA0265002694
+B0947224546637N00636031EA0264902694
+B0947244546631N00636013EA0265102695
+B0947264546627N00635998EA0265002696
+B0947284546623N00635981EA0264802694
+B0947304546616N00635962EA0264802693
+B0947324546610N00635945EA0264902694
+B0947344546604N00635929EA0264702693
+B0947364546598N00635911EA0264302690
+B0947384546591N00635892EA0264202688
+B0947404546586N00635873EA0264102687
+B0947424546582N00635855EA0263702685
+B0947444546576N00635838EA0263402681
+B0947464546569N00635819EA0263302680
+B0947484546564N00635803EA0263302679
+B0947504546557N00635787EA0263202677
+B0947524546551N00635772EA0263302677
+B0947544546545N00635757EA0263602678
+B0947564546538N00635745EA0264102680
+B0947584546531N00635733EA0264502684
+B0948004546524N00635722EA0265102690
+B0948024546516N00635714EA0265502695
+B0948044546508N00635707EA0265902699
+B0948064546500N00635699EA0266202702
+B0948084546491N00635689EA0266602706
+B0948104546481N00635680EA0267102711
+B0948124546471N00635677EA0267502716
+B0948144546462N00635675EA0267602719
+B0948164546451N00635675EA0267702721
+B0948184546439N00635672EA0268002723
+B0948204546427N00635667EA0268502727
+B0948224546415N00635664EA0268702731
+B0948244546402N00635662EA0269002733
+B0948264546389N00635657EA0269202736
+B0948284546377N00635649EA0269402738
+B0948304546366N00635639EA0269502739
+B0948324546356N00635625EA0269602740
+B0948344546348N00635607EA0269602741
+B0948364546341N00635589EA0269702742
+B0948384546335N00635573EA0269702742
+B0948404546330N00635555EA0269702742
+B0948424546329N00635537EA0269702742
+B0948444546328N00635518EA0269702742
+B0948464546327N00635499EA0269802742
+B0948484546326N00635480EA0270002743
+B0948504546323N00635461EA0269902744
+B0948524546317N00635445EA0269702744
+B0948544546311N00635429EA0269102742
+B0948564546306N00635410EA0269002740
+B0948584546301N00635392EA0268902739
+B0949004546297N00635377EA0268602737
+B0949024546293N00635360EA0268202733
+B0949044546291N00635340EA0268102731
+B0949064546289N00635322EA0268002730
+B0949084546286N00635306EA0267602727
+B0949104546282N00635288EA0267102722
+B0949124546279N00635268EA0267002719
+B0949144546276N00635250EA0266802717
+B0949164546273N00635233EA0266502713
+B0949184546269N00635215EA0266102710
+B0949204546263N00635197EA0266002707
+B0949224546258N00635181EA0265702705
+B0949244546252N00635166EA0265402702
+B0949264546246N00635149EA0265202699
+B0949284546241N00635131EA0264902696
+B0949304546236N00635114EA0264602693
+B0949324546231N00635097EA0264202689
+B0949344546226N00635079EA0263902686
+B0949364546222N00635062EA0263502682
+B0949384546217N00635046EA0263002678
+B0949404546212N00635028EA0262502673
+B0949424546208N00635010EA0262102668
+B0949444546203N00634992EA0261702664
+B0949464546198N00634975EA0261302660
+B0949484546191N00634956EA0260902656
+B0949504546186N00634938EA0260802654
+B0949524546181N00634923EA0260302650
+B0949544546176N00634905EA0259902645
+B0949564546171N00634887EA0259802642
+B0949584546165N00634871EA0259602641
+B0950004546159N00634857EA0259202637
+B0950024546153N00634840EA0258802633
+B0950044546147N00634823EA0258702631
+B0950064546141N00634808EA0258502629
+B0950084546136N00634792EA0258202626
+B0950104546130N00634775EA0257902623
+B0950124546125N00634760EA0257602621
+B0950144546118N00634745EA0257302618
+B0950164546112N00634728EA0257002614
+B0950184546105N00634711EA0257002613
+B0950204546099N00634695EA0256802611
+B0950224546092N00634679EA0256602610
+B0950244546087N00634663EA0256502609
+B0950264546082N00634647EA0256202607
+B0950284546076N00634631EA0256002604
+B0950304546068N00634615EA0256002603
+B0950324546060N00634598EA0256202602
+B0950344546053N00634581EA0256102602
+B0950364546047N00634563EA0255802600
+B0950384546040N00634542EA0255502597
+B0950404546034N00634522EA0255402596
+B0950424546029N00634504EA0255302596
+B0950444546025N00634485EA0255002593
+B0950464546020N00634465EA0255002591
+B0950484546016N00634448EA0255102591
+B0950504546013N00634432EA0254902590
+B0950524546009N00634414EA0254802588
+B0950544546005N00634396EA0255002588
+B0950564546001N00634382EA0254902588
+B0950584545996N00634370EA0254802586
+B0951004545991N00634357EA0254502584
+B0951024545986N00634343EA0254302582
+B0951044545980N00634329EA0254302581
+B0951064545975N00634314EA0254502581
+B0951084545970N00634299EA0254802583
+B0951104545965N00634285EA0255002586
+B0951124545960N00634272EA0255202587
+B0951144545953N00634257EA0255602591
+B0951164545947N00634243EA0256202595
+B0951184545941N00634229EA0256602600
+B0951204545936N00634217EA0256802604
+B0951224545929N00634206EA0256602606
+B0951244545923N00634192EA0256302607
+B0951264545918N00634176EA0255902605
+B0951284545912N00634159EA0255702603
+B0951304545906N00634143EA0255502601
+B0951324545902N00634127EA0255302599
+B0951344545897N00634109EA0255202597
+B0951364545893N00634090EA0255602596
+B0951384545893N00634071EA0256202597
+B0951404545893N00634053EA0256902599
+B0951424545889N00634035EA0257602605
+B0951444545886N00634018EA0258402612
+B0951464545885N00634003EA0258902620
+B0951484545884N00633991EA0258902625
+B0951504545882N00633978EA0258802628
+B0951524545879N00633963EA0258602629
+B0951544545875N00633946EA0258502627
+B0951564545871N00633928EA0258502627
+B0951584545867N00633910EA0258702628
+B0952004545864N00633893EA0258702629
+B0952024545860N00633878EA0258602628
+B0952044545855N00633862EA0258302627
+B0952064545850N00633845EA0258102625
+B0952084545846N00633828EA0258002624
+B0952104545842N00633812EA0257702622
+B0952124545837N00633797EA0257502619
+B0952144545833N00633780EA0257102616
+B0952164545829N00633764EA0256802613
+B0952184545826N00633747EA0256602611
+B0952204545822N00633730EA0256502609
+B0952224545816N00633713EA0256502607
+B0952244545812N00633696EA0256502608
+B0952264545808N00633680EA0256402607
+B0952284545804N00633663EA0256302606
+B0952304545799N00633646EA0256602606
+B0952324545795N00633630EA0256802607
+B0952344545790N00633615EA0256902608
+B0952364545785N00633598EA0256902609
+B0952384545779N00633581EA0256902609
+B0952404545774N00633564EA0256702609
+B0952424545769N00633545EA0256502607
+B0952444545763N00633526EA0256702607
+B0952464545757N00633509EA0256702608
+B0952484545752N00633495EA0256702608
+B0952504545745N00633480EA0256802608
+B0952524545740N00633464EA0257102609
+B0952544545737N00633450EA0257302611
+B0952564545732N00633434EA0257302611
+B0952584545725N00633415EA0257202611
+B0953004545718N00633398EA0257102612
+B0953024545713N00633383EA0256502611
+B0953044545706N00633367EA0256002608
+B0953064545697N00633348EA0255902606
+B0953084545690N00633332EA0255802605
+B0953104545683N00633316EA0255502602
+B0953124545675N00633297EA0255502600
+B0953144545669N00633280EA0255602600
+B0953164545665N00633264EA0255302598
+B0953184545658N00633247EA0255102595
+B0953204545649N00633233EA0255102594
+B0953224545641N00633220EA0255102594
+B0953244545635N00633203EA0255102594
+B0953264545629N00633187EA0255002594
+B0953284545623N00633173EA0254702592
+B0953304545615N00633158EA0254502590
+B0953324545607N00633144EA0254402589
+B0953344545602N00633130EA0254002587
+B0953364545595N00633117EA0253502583
+B0953384545589N00633102EA0253002578
+B0953404545582N00633086EA0252502573
+B0953424545577N00633070EA0252202570
+B0953444545573N00633055EA0251902566
+B0953464545569N00633040EA0251602563
+B0953484545565N00633026EA0251202559
+B0953504545560N00633014EA0250802555
+B0953524545555N00633001EA0250402551
+B0953544545550N00632988EA0250002547
+B0953564545545N00632977EA0249602544
+B0953584545540N00632966EA0249102539
+B0954004545534N00632954EA0248602534
+B0954024545527N00632944EA0248202529
+B0954044545521N00632932EA0247802523
+B0954064545514N00632919EA0247302519
+B0954084545507N00632905EA0247102515
+B0954104545500N00632891EA0247002513
+B0954124545494N00632877EA0246902512
+B0954144545489N00632862EA0246802511
+B0954164545484N00632847EA0246702509
+B0954184545480N00632831EA0246502508
+B0954204545475N00632816EA0246202505
+B0954224545469N00632804EA0245902503
+B0954244545462N00632791EA0245502500
+B0954264545455N00632778EA0245302497
+B0954284545449N00632766EA0245102495
+B0954304545442N00632753EA0244802492
+B0954324545436N00632740EA0244502489
+B0954344545430N00632725EA0244402487
+B0954364545425N00632710EA0244102485
+B0954384545419N00632696EA0243902483
+B0954404545413N00632680EA0243802481
+B0954424545407N00632666EA0243602479
+B0954444545401N00632653EA0243302477
+B0954464545395N00632638EA0243102474
+B0954484545388N00632622EA0242802471
+B0954504545382N00632606EA0242702470
+B0954524545376N00632591EA0242502468
+B0954544545371N00632576EA0242202465
+B0954564545365N00632560EA0242002462
+B0954584545360N00632544EA0241702460
+B0955004545355N00632529EA0241402458
+B0955024545349N00632514EA0241002454
+B0955044545344N00632499EA0240702451
+B0955064545338N00632483EA0240402447
+B0955084545332N00632469EA0240102444
+B0955104545326N00632454EA0239802441
+B0955124545321N00632439EA0239402437
+B0955144545316N00632424EA0239102435
+B0955164545311N00632409EA0238802432
+B0955184545308N00632393EA0238702430
+B0955204545305N00632379EA0238402427
+B0955224545303N00632364EA0238102424
+B0955244545301N00632348EA0237902421
+B0955264545299N00632333EA0237702420
+B0955284545298N00632319EA0237202417
+B0955304545295N00632304EA0236702412
+B0955324545289N00632290EA0236502410
+B0955344545283N00632279EA0236302408
+B0955364545278N00632267EA0235902404
+B0955384545271N00632254EA0235602401
+B0955404545264N00632242EA0235302398
+B0955424545259N00632228EA0235002395
+B0955444545253N00632214EA0234702392
+B0955464545246N00632199EA0234702390
+B0955484545241N00632184EA0234602389
+B0955504545237N00632170EA0234302388
+B0955524545231N00632158EA0233702385
+B0955544545224N00632144EA0233202380
+B0955564545219N00632127EA0233002377
+B0955584545214N00632111EA0232902376
+B0956004545210N00632097EA0232802374
+B0956024545207N00632081EA0232802373
+B0956044545202N00632066EA0233002373
+B0956064545198N00632053EA0232802373
+B0956084545194N00632038EA0232602371
+B0956104545188N00632023EA0232502369
+B0956124545182N00632010EA0232402369
+B0956144545177N00631996EA0232202367
+B0956164545172N00631982EA0231802364
+B0956184545166N00631969EA0231402359
+B0956204545161N00631954EA0231002355
+B0956224545156N00631939EA0230902352
+B0956244545153N00631925EA0231102351
+B0956264545150N00631912EA0231202351
+B0956284545147N00631897EA0231102350
+B0956304545144N00631881EA0231202351
+B0956324545141N00631865EA0231302351
+B0956344545138N00631849EA0231302352
+B0956364545134N00631833EA0231402352
+B0956384545132N00631817EA0231702355
+B0956404545130N00631803EA0231802357
+B0956424545127N00631789EA0231802357
+B0956444545123N00631775EA0231902358
+B0956464545119N00631759EA0232302360
+B0956484545114N00631745EA0232402363
+B0956504545110N00631732EA0232102363
+B0956524545106N00631718EA0231902362
+B0956544545103N00631703EA0231602359
+B0956564545099N00631687EA0231402356
+B0956584545094N00631671EA0231302355
+B0957004545091N00631656EA0231102354
+B0957024545088N00631641EA0230902352
+B0957044545085N00631626EA0230902351
+B0957064545082N00631613EA0230802350
+B0957084545079N00631599EA0230502347
+B0957104545077N00631583EA0230902346
+B0957124545075N00631569EA0231102346
+B0957144545073N00631556EA0231302348
+B0957164545072N00631543EA0231402350
+B0957184545070N00631527EA0231602352
+B0957204545068N00631512EA0231902355
+B0957224545066N00631496EA0232102357
+B0957244545063N00631481EA0232202359
+B0957264545060N00631465EA0232502362
+B0957284545058N00631449EA0232802365
+B0957304545056N00631435EA0232902367
+B0957324545052N00631422EA0233002369
+B0957344545048N00631407EA0233202370
+B0957364545045N00631392EA0233302372
+B0957384545042N00631375EA0233502373
+B0957404545040N00631357EA0234002376
+B0957424545037N00631341EA0234602380
+B0957444545033N00631326EA0235102385
+B0957464545030N00631312EA0235602390
+B0957484545027N00631297EA0236102395
+B0957504545023N00631281EA0236802402
+B0957524545021N00631266EA0237302408
+B0957544545020N00631252EA0237502413
+B0957564545020N00631236EA0237802416
+B0957584545018N00631219EA0237902418
+B0958004545015N00631202EA0238002419
+B0958024545011N00631183EA0238002420
+B0958044545009N00631165EA0238002421
+B0958064545007N00631150EA0237902420
+B0958084545006N00631134EA0237902420
+B0958104545007N00631118EA0237702420
+B0958124545004N00631104EA0237702419
+B0958144545002N00631090EA0237902420
+B0958164545001N00631077EA0237902421
+B0958184544999N00631063EA0238002421
+B0958204544997N00631048EA0238102422
+B0958224544995N00631033EA0238402424
+B0958244544992N00631018EA0238702427
+B0958264544988N00631003EA0239502431
+B0958284544986N00630989EA0240402437
+B0958304544985N00630978EA0241202445
+B0958324544983N00630970EA0241802452
+B0958344544976N00630965EA0242202458
+B0958364544966N00630975EA0242802464
+B0958384544966N00630991EA0243402471
+B0958404544978N00631001EA0244102478
+B0958424544991N00630994EA0244902486
+B0958444544995N00630978EA0245802496
+B0958464544994N00630966EA0246602505
+B0958484544990N00630957EA0247002511
+B0958504544981N00630954EA0247302517
+B0958524544973N00630968EA0247602521
+B0958544544977N00630985EA0248202525
+B0958564544991N00630991EA0248902531
+B0958584545004N00630984EA0249702538
+B0959004545010N00630969EA0250302544
+B0959024545011N00630952EA0251002551
+B0959044545011N00630939EA0251602558
+B0959064545010N00630927EA0251902563
+B0959084545007N00630914EA0252202566
+B0959104545002N00630899EA0252502569
+B0959124545000N00630885EA0252602572
+B0959144544998N00630871EA0252602573
+B0959164544995N00630855EA0252602573
+B0959184544992N00630838EA0252702574
+B0959204544990N00630824EA0252602574
+B0959224544985N00630809EA0252302572
+B0959244544980N00630795EA0252302571
+B0959264544975N00630782EA0252302571
+B0959284544970N00630770EA0252302570
+B0959304544964N00630758EA0252302570
+B0959324544957N00630746EA0252402570
+B0959344544951N00630731EA0252202570
+B0959364544948N00630716EA0252002568
+B0959384544944N00630703EA0251702565
+B0959404544942N00630690EA0251302562
+B0959424544940N00630675EA0250802557
+B0959444544937N00630660EA0250302552
+B0959464544931N00630645EA0249902547
+B0959484544925N00630630EA0249302542
+B0959504544919N00630614EA0248802536
+B0959524544912N00630599EA0248402532
+B0959544544906N00630584EA0248102527
+B0959564544902N00630567EA0248102524
+B0959584544897N00630552EA0248202523
+B1000004544891N00630540EA0248302524
+B1000024544887N00630527EA0248302524
+B1000044544883N00630512EA0248302524
+B1000064544879N00630495EA0248802525
+B1000084544875N00630480EA0249502527
+B1000104544872N00630470EA0249802531
+B1000124544869N00630457EA0250202534
+B1000144544865N00630444EA0250902540
+B1000164544861N00630432EA0251202545
+B1000184544858N00630421EA0250902549
+B1000204544854N00630405EA0250902551
+B1000224544852N00630388EA0251302556
+B1000244544848N00630375EA0251502559
+B1000264544845N00630362EA0251602560
+B1000284544841N00630348EA0251502560
+B1000304544836N00630331EA0251402560
+B1000324544830N00630313EA0251602560
+B1000344544825N00630294EA0252302562
+B1000364544821N00630280EA0252702565
+B1000384544817N00630270EA0252802567
+B1000404544813N00630258EA0252902568
+B1000424544810N00630242EA0253002570
+B1000444544808N00630226EA0253102571
+B1000464544806N00630210EA0253002571
+B1000484544804N00630194EA0252902571
+B1000504544799N00630178EA0252802570
+B1000524544794N00630164EA0252602569
+B1000544544789N00630148EA0252302566
+B1000564544785N00630130EA0252202565
+B1000584544781N00630113EA0252102564
+B1001004544776N00630097EA0251802562
+B1001024544771N00630081EA0251402559
+B1001044544765N00630066EA0250902555
+B1001064544759N00630049EA0250602551
+B1001084544754N00630032EA0250402548
+B1001104544749N00630015EA0250202546
+B1001124544745N00629999EA0249902543
+B1001144544740N00629982EA0249702541
+B1001164544735N00629964EA0249502539
+B1001184544731N00629947EA0249302537
+B1001204544728N00629930EA0249202535
+B1001224544724N00629913EA0249102534
+B1001244544720N00629895EA0249102534
+B1001264544716N00629879EA0249002533
+B1001284544712N00629863EA0248602531
+B1001304544708N00629845EA0248702531
+B1001324544705N00629828EA0248802531
+B1001344544703N00629815EA0248702530
+B1001364544701N00629800EA0248802530
+B1001384544699N00629782EA0249402530
+B1001404544697N00629765EA0250302533
+B1001424544695N00629748EA0251002538
+B1001444544693N00629731EA0251402543
+B1001464544689N00629713EA0251902550
+B1001484544687N00629694EA0252402555
+B1001504544686N00629675EA0252602559
+B1001524544685N00629654EA0252802562
+B1001544544683N00629634EA0253002566
+B1001564544681N00629613EA0253602569
+B1001584544682N00629590EA0254402574
+B1002004544684N00629570EA0254902580
+B1002024544684N00629553EA0255102584
+B1002044544683N00629534EA0255402587
+B1002064544679N00629515EA0255902592
+B1002084544675N00629496EA0256502599
+B1002104544669N00629480EA0256502603
+B1002124544664N00629463EA0256402606
+B1002144544661N00629445EA0256502607
+B1002164544659N00629430EA0256702610
+B1002184544655N00629417EA0256702611
+B1002204544652N00629404EA0256302611
+B1002224544647N00629388EA0256002609
+B1002244544642N00629371EA0255902607
+B1002264544637N00629355EA0255702606
+B1002284544633N00629340EA0255602604
+B1002304544627N00629324EA0255502602
+B1002324544621N00629309EA0255502601
+B1002344544616N00629295EA0255502601
+B1002364544612N00629282EA0255202599
+B1002384544606N00629268EA0254902597
+B1002404544601N00629251EA0254902595
+B1002424544598N00629235EA0255002595
+B1002444544594N00629222EA0254902594
+B1002464544590N00629208EA0254702592
+B1002484544584N00629193EA0254602591
+B1002504544579N00629179EA0254702591
+B1002524544574N00629165EA0254702591
+B1002544544569N00629150EA0254602590
+B1002564544565N00629136EA0254602590
+B1002584544560N00629122EA0254502589
+B1003004544555N00629107EA0254502589
+B1003024544551N00629093EA0254402588
+B1003044544546N00629078EA0254302587
+B1003064544541N00629063EA0254202586
+B1003084544537N00629049EA0254002585
+B1003104544532N00629035EA0253802583
+B1003124544528N00629020EA0253602581
+B1003144544523N00629005EA0253402579
+B1003164544518N00628990EA0253302577
+B1003184544513N00628975EA0253102575
+B1003204544508N00628960EA0252802572
+B1003224544503N00628944EA0252402569
+B1003244544498N00628928EA0252002566
+B1003264544494N00628912EA0251302561
+B1003284544490N00628894EA0250502555
+B1003304544486N00628876EA0250102550
+B1003324544485N00628860EA0249302544
+B1003344544484N00628844EA0248202537
+B1003364544481N00628826EA0247502529
+B1003384544479N00628810EA0246902522
+B1003404544478N00628794EA0246102514
+B1003424544476N00628777EA0245602507
+B1003444544472N00628760EA0245502502
+B1003464544466N00628746EA0245202498
+B1003484544460N00628732EA0244802493
+B1003504544453N00628717EA0244302489
+B1003524544446N00628700EA0244002485
+B1003544544442N00628683EA0243502480
+B1003564544439N00628666EA0242902475
+B1003584544434N00628648EA0242502470
+B1004004544430N00628630EA0242202466
+B1004024544427N00628612EA0241802462
+B1004044544422N00628594EA0241302457
+B1004064544417N00628575EA0240902454
+B1004084544412N00628557EA0240602451
+B1004104544407N00628540EA0240202446
+B1004124544403N00628522EA0239702441
+B1004144544398N00628502EA0239602438
+B1004164544394N00628484EA0239402436
+B1004184544390N00628467EA0238902432
+B1004204544386N00628450EA0238202427
+B1004224544383N00628429EA0237702422
+B1004244544378N00628410EA0237602419
+B1004264544375N00628393EA0237202416
+B1004284544371N00628375EA0236602411
+B1004304544365N00628357EA0236202406
+B1004324544359N00628338EA0236002404
+B1004344544354N00628321EA0235702401
+B1004364544349N00628303EA0235302396
+B1004384544344N00628285EA0234902393
+B1004404544339N00628265EA0234702390
+B1004424544335N00628247EA0234202386
+B1004444544330N00628228EA0233802382
+B1004464544326N00628208EA0233402378
+B1004484544323N00628189EA0233002374
+B1004504544320N00628169EA0232602370
+B1004524544317N00628150EA0232202366
+B1004544544314N00628129EA0231802362
+B1004564544311N00628109EA0231502359
+B1004584544308N00628089EA0231202356
+B1005004544306N00628069EA0230802352
+B1005024544303N00628049EA0230402348
+B1005044544300N00628029EA0230002344
+B1005064544297N00628007EA0229702340
+B1005084544294N00627987EA0229402337
+B1005104544290N00627967EA0229102333
+B1005124544285N00627947EA0228602329
+B1005144544281N00627927EA0228302326
+B1005164544277N00627907EA0228002323
+B1005184544273N00627887EA0227702319
+B1005204544269N00627867EA0227402317
+B1005224544265N00627847EA0227102313
+B1005244544261N00627827EA0226902310
+B1005264544258N00627806EA0226702308
+B1005284544255N00627787EA0226402306
+B1005304544252N00627767EA0226102303
+B1005324544249N00627746EA0225802300
+B1005344544247N00627724EA0225602298
+B1005364544245N00627704EA0225402296
+B1005384544243N00627683EA0225102293
+B1005404544241N00627661EA0224902290
+B1005424544240N00627639EA0224802288
+B1005444544239N00627618EA0224602286
+B1005464544238N00627598EA0224302284
+B1005484544237N00627577EA0224002281
+B1005504544236N00627555EA0223802279
+B1005524544235N00627534EA0223702277
+B1005544544233N00627513EA0223502275
+B1005564544231N00627491EA0223402273
+B1005584544230N00627470EA0223202272
+B1006004544227N00627449EA0222902270
+B1006024544223N00627429EA0222702268
+B1006044544219N00627408EA0222602266
+B1006064544216N00627387EA0222402265
+B1006084544211N00627366EA0222302263
+B1006104544207N00627345EA0222102262
+B1006124544202N00627324EA0222102261
+B1006144544198N00627303EA0221902260
+B1006164544193N00627283EA0221702258
+B1006184544188N00627263EA0221502256
+B1006204544182N00627242EA0221402255
+B1006224544179N00627221EA0221202253
+B1006244544174N00627200EA0221002251
+B1006264544169N00627179EA0220802249
+B1006284544165N00627158EA0220602247
+B1006304544159N00627138EA0220402245
+B1006324544153N00627119EA0220202243
+B1006344544148N00627098EA0219802240
+B1006364544144N00627077EA0219702238
+B1006384544141N00627055EA0219402236
+B1006404544141N00627032EA0219102233
+B1006424544141N00627009EA0219002231
+B1006444544141N00626986EA0218702229
+B1006464544141N00626964EA0218502226
+B1006484544141N00626942EA0218302224
+B1006504544141N00626919EA0218102222
+B1006524544141N00626897EA0217902220
+B1006544544140N00626874EA0217702218
+B1006564544140N00626852EA0217502216
+B1006584544140N00626829EA0217302214
+B1007004544139N00626807EA0217102212
+B1007024544138N00626785EA0216902210
+B1007044544138N00626763EA0216702208
+B1007064544139N00626740EA0216502205
+B1007084544139N00626717EA0216302203
+B1007104544140N00626695EA0216102202
+B1007124544140N00626672EA0215902200
+B1007144544139N00626650EA0215802197
+B1007164544138N00626628EA0215602196
+B1007184544138N00626605EA0215402193
+B1007204544138N00626583EA0215102191
+B1007224544137N00626561EA0214902189
+B1007244544137N00626538EA0214702187
+B1007264544137N00626516EA0214502184
+B1007284544136N00626494EA0214202182
+B1007304544135N00626471EA0214102180
+B1007324544134N00626449EA0213802177
+B1007344544133N00626427EA0213602175
+B1007364544132N00626405EA0213402173
+B1007384544131N00626383EA0213102170
+B1007404544129N00626361EA0212902168
+B1007424544128N00626340EA0212702166
+B1007444544126N00626318EA0212502164
+B1007464544124N00626297EA0212302161
+B1007484544121N00626276EA0212002159
+B1007504544119N00626254EA0211802157
+B1007524544117N00626233EA0211602154
+B1007544544115N00626211EA0211302152
+B1007564544113N00626190EA0211002150
+B1007584544111N00626169EA0210702147
+B1008004544109N00626147EA0210402144
+B1008024544106N00626126EA0210102141
+B1008044544103N00626106EA0209902138
+B1008064544100N00626085EA0209602135
+B1008084544097N00626064EA0209302132
+B1008104544093N00626043EA0209002129
+B1008124544090N00626022EA0208702126
+B1008144544087N00626001EA0208502123
+B1008164544085N00625980EA0208302121
+B1008184544082N00625958EA0208002118
+B1008204544080N00625938EA0207702116
+B1008224544077N00625917EA0207502113
+B1008244544075N00625896EA0207302111
+B1008264544072N00625875EA0207002109
+B1008284544069N00625854EA0206802106
+B1008304544068N00625833EA0206602104
+B1008324544066N00625812EA0206302101
+B1008344544064N00625791EA0206102099
+B1008364544062N00625770EA0205902097
+B1008384544061N00625749EA0205702095
+B1008404544059N00625728EA0205502093
+B1008424544057N00625708EA0205202091
+B1008444544055N00625687EA0205002088
+B1008464544053N00625667EA0204802086
+B1008484544050N00625647EA0204602084
+B1008504544047N00625626EA0204402082
+B1008524544044N00625607EA0204202080
+B1008544544040N00625587EA0203902077
+B1008564544037N00625567EA0203702074
+B1008584544034N00625547EA0203302072
+B1009004544031N00625528EA0203102070
+B1009024544027N00625508EA0202902068
+B1009044544023N00625488EA0202802065
+B1009064544019N00625469EA0202602063
+B1009084544014N00625450EA0202302061
+B1009104544010N00625430EA0202102059
+B1009124544006N00625410EA0202002057
+B1009144544002N00625391EA0201702055
+B1009164543997N00625372EA0201502053
+B1009184543991N00625353EA0201302050
+B1009204543985N00625335EA0201102049
+B1009224543978N00625317EA0200902047
+B1009244543972N00625299EA0200602044
+B1009264543967N00625279EA0200402042
+B1009284543962N00625260EA0200302040
+B1009304543959N00625240EA0200102038
+B1009324543956N00625221EA0199902036
+B1009344543953N00625201EA0199602034
+B1009364543950N00625180EA0199402032
+B1009384543948N00625161EA0199202030
+B1009404543946N00625141EA0199002028
+B1009424543944N00625122EA0198802025
+B1009444543942N00625102EA0198502023
+B1009464543940N00625082EA0198302022
+B1009484543938N00625062EA0198102020
+B1009504543936N00625042EA0197802017
+B1009524543934N00625022EA0197502014
+B1009544543931N00625002EA0197402012
+B1009564543927N00624982EA0197202010
+B1009584543924N00624962EA0196902008
+B1010004543920N00624942EA0196702006
+B1010024543916N00624923EA0196502004
+B1010044543913N00624904EA0196402002
+B1010064543908N00624885EA0196202000
+B1010084543904N00624866EA0196001998
+B1010104543901N00624847EA0195701995
+B1010124543897N00624827EA0195501992
+B1010144543893N00624808EA0195301990
+B1010164543890N00624790EA0195101988
+B1010184543886N00624772EA0194701985
+B1010204543883N00624753EA0194601983
+B1010224543879N00624734EA0194401981
+B1010244543875N00624716EA0194201979
+B1010264543871N00624698EA0194001976
+B1010284543867N00624679EA0193901975
+B1010304543862N00624661EA0193701973
+B1010324543858N00624643EA0193501972
+B1010344543854N00624625EA0193401970
+B1010364543849N00624607EA0193201968
+B1010384543845N00624589EA0193001967
+B1010404543840N00624571EA0192901965
+B1010424543836N00624553EA0192701963
+B1010444543833N00624534EA0192501961
+B1010464543829N00624516EA0192301959
+B1010484543825N00624498EA0192001957
+B1010504543822N00624480EA0191801955
+B1010524543818N00624462EA0191601953
+B1010544543815N00624444EA0191401951
+B1010564543811N00624426EA0191201949
+B1010584543806N00624408EA0191001947
+B1011004543802N00624390EA0190901945
+B1011024543798N00624373EA0190601943
+B1011044543793N00624355EA0190401941
+B1011064543789N00624337EA0190201938
+B1011084543784N00624319EA0190001936
+B1011104543780N00624301EA0189801934
+B1011124543776N00624283EA0189501932
+B1011144543772N00624266EA0189201930
+B1011164543768N00624248EA0189001927
+B1011184543762N00624231EA0188801925
+B1011204543755N00624215EA0188701923
+B1011224543750N00624197EA0188401921
+B1011244543745N00624180EA0188201919
+B1011264543739N00624163EA0188001917
+B1011284543734N00624145EA0187801914
+B1011304543730N00624128EA0187501912
+B1011324543725N00624110EA0187301910
+B1011344543721N00624092EA0187101907
+B1011364543717N00624074EA0186901905
+B1011384543712N00624056EA0186601903
+B1011404543708N00624038EA0186401900
+B1011424543703N00624020EA0186201898
+B1011444543698N00624003EA0185901895
+B1011464543693N00623984EA0185701893
+B1011484543688N00623966EA0185501891
+B1011504543684N00623948EA0185301889
+B1011524543679N00623930EA0185001887
+B1011544543675N00623912EA0184801884
+B1011564543670N00623894EA0184601882
+B1011584543665N00623876EA0184401880
+B1012004543660N00623858EA0184201877
+B1012024543654N00623840EA0183901875
+B1012044543650N00623822EA0183701873
+B1012064543645N00623804EA0183501871
+B1012084543640N00623786EA0183301868
+B1012104543635N00623768EA0183001866
+B1012124543631N00623750EA0182801864
+B1012144543626N00623732EA0182601862
+B1012164543621N00623714EA0182401860
+B1012184543616N00623697EA0182201858
+B1012204543612N00623679EA0182001856
+B1012224543607N00623661EA0181801854
+B1012244543603N00623643EA0181601852
+B1012264543599N00623626EA0181401850
+B1012284543594N00623608EA0181201848
+B1012304543589N00623591EA0181001846
+B1012324543585N00623573EA0180801844
+B1012344543582N00623555EA0180601842
+B1012364543578N00623536EA0180401840
+B1012384543575N00623518EA0180201838
+B1012404543571N00623499EA0180101836
+B1012424543568N00623481EA0179901834
+B1012444543565N00623462EA0179701833
+B1012464543562N00623444EA0179401830
+B1012484543558N00623426EA0179301828
+B1012504543554N00623408EA0179101827
+B1012524543551N00623390EA0178901825
+B1012544543547N00623372EA0178701822
+B1012564543544N00623354EA0178501821
+B1012584543540N00623336EA0178301819
+B1013004543536N00623319EA0178101817
+B1013024543532N00623301EA0178001815
+B1013044543528N00623283EA0177801813
+B1013064543523N00623265EA0177701812
+B1013084543519N00623247EA0177501810
+B1013104543514N00623229EA0177401808
+B1013124543509N00623212EA0177201807
+B1013144543504N00623195EA0177001805
+B1013164543499N00623177EA0176701803
+B1013184543493N00623160EA0176501801
+B1013204543489N00623142EA0176301798
+B1013224543484N00623125EA0176001796
+B1013244543479N00623108EA0175901794
+B1013264543474N00623091EA0175601791
+B1013284543469N00623074EA0175401789
+B1013304543464N00623057EA0175101786
+B1013324543459N00623039EA0174901784
+B1013344543454N00623022EA0174701782
+B1013364543450N00623005EA0174501779
+B1013384543445N00622988EA0174301777
+B1013404543441N00622970EA0174001775
+B1013424543437N00622953EA0173801772
+B1013444543433N00622935EA0173601770
+B1013464543428N00622918EA0173301768
+B1013484543424N00622901EA0173101765
+B1013504543420N00622883EA0172901763
+B1013524543416N00622866EA0172701761
+B1013544543413N00622848EA0172501758
+B1013564543409N00622831EA0172301756
+B1013584543406N00622814EA0172101754
+B1014004543402N00622796EA0171901752
+B1014024543398N00622779EA0171701750
+B1014044543395N00622761EA0171501748
+B1014064543392N00622744EA0171301746
+B1014084543388N00622727EA0171001744
+B1014104543384N00622709EA0170801742
+B1014124543380N00622691EA0170601740
+B1014144543376N00622673EA0170501738
+B1014164543373N00622656EA0170201736
+B1014184543369N00622638EA0170001734
+B1014204543366N00622621EA0169801732
+B1014224543363N00622603EA0169601730
+B1014244543359N00622585EA0169401728
+B1014264543356N00622568EA0169101725
+B1014284543353N00622550EA0168901723
+B1014304543350N00622532EA0168601720
+B1014324543347N00622515EA0168501718
+B1014344543344N00622497EA0168201716
+B1014364543340N00622479EA0168001714
+B1014384543338N00622461EA0167701711
+B1014404543335N00622444EA0167501708
+B1014424543332N00622426EA0167201706
+B1014444543330N00622408EA0167001703
+B1014464543327N00622390EA0166701701
+B1014484543324N00622372EA0166501699
+B1014504543322N00622355EA0166301696
+B1014524543320N00622337EA0166001694
+B1014544543317N00622319EA0165801691
+B1014564543314N00622302EA0165601689
+B1014584543311N00622285EA0165301687
+B1015004543307N00622267EA0165201684
+B1015024543304N00622250EA0164901682
+B1015044543300N00622234EA0164701680
+B1015064543296N00622217EA0164401677
+B1015084543292N00622201EA0164101674
+B1015104543288N00622184EA0163801671
+B1015124543284N00622168EA0163601669
+B1015144543280N00622151EA0163301666
+B1015164543275N00622135EA0163001663
+B1015184543271N00622119EA0162801660
+B1015204543266N00622103EA0162401657
+B1015224543262N00622086EA0162101655
+B1015244543258N00622069EA0162301654
+B1015264543253N00622055EA0162201654
+B1015284543247N00622042EA0161901651
+B1015304543242N00622028EA0161601649
+B1015324543237N00622014EA0161501648
+B1015344543232N00622000EA0161201646
+B1015364543228N00621986EA0160701642
+B1015384543228N00621970EA0160501639
+B1015404543227N00621954EA0160201637
+B1015424543225N00621939EA0159801633
+B1015444543224N00621923EA0159501630
+B1015464543223N00621907EA0159201627
+B1015484543221N00621890EA0158901624
+B1015504543219N00621874EA0158701621
+B1015524543217N00621856EA0158501619
+B1015544543215N00621839EA0158401618
+B1015564543212N00621822EA0158201616
+B1015584543210N00621805EA0158001614
+B1016004543208N00621788EA0157801612
+B1016024543205N00621773EA0157301609
+B1016044543200N00621756EA0156901605
+B1016064543196N00621737EA0157001603
+B1016084543191N00621721EA0156901602
+B1016104543186N00621708EA0156401599
+B1016124543181N00621691EA0156001595
+B1016144543176N00621673EA0155801592
+B1016164543171N00621654EA0155801591
+B1016184543168N00621637EA0155901591
+B1016204543168N00621620EA0156001591
+B1016224543167N00621607EA0156001593
+B1016244543166N00621594EA0156301594
+B1016264543167N00621581EA0156601596
+B1016284543169N00621570EA0157001600
+B1016304543169N00621559EA0157101602
+B1016324543168N00621548EA0157201604
+B1016344543170N00621535EA0157501606
+B1016364543176N00621523EA0157701608
+B1016384543184N00621515EA0157801610
+B1016404543192N00621507EA0157801611
+B1016424543196N00621495EA0157601611
+B1016444543188N00621488EA0157601611
+B1016464543178N00621496EA0157601611
+B1016484543176N00621515EA0157901611
+B1016504543176N00621530EA0158301615
+B1016524543174N00621542EA0158501617
+B1016544543171N00621555EA0158701619
+B1016564543165N00621565EA0158801621
+B1016584543154N00621562EA0159201623
+B1017004543151N00621546EA0159301626
+B1017024543157N00621530EA0159401627
+B1017044543170N00621523EA0159501628
+B1017064543182N00621531EA0159701629
+B1017084543183N00621548EA0159801630
+B1017104543174N00621561EA0160101633
+B1017124543164N00621567EA0160401636
+B1017144543154N00621567EA0160801639
+B1017164543146N00621562EA0160901642
+B1017184543142N00621552EA0160701643
+B1017204543148N00621534EA0160501642
+B1017224543162N00621526EA0160501641
+B1017244543175N00621534EA0160701641
+B1017264543181N00621548EA0161101644
+B1017284543186N00621561EA0161401647
+B1017304543192N00621573EA0161701650
+B1017324543193N00621588EA0161801651
+B1017344543183N00621594EA0161801653
+B1017364543175N00621585EA0161901654
+B1017384543176N00621570EA0162001655
+B1017404543187N00621560EA0162501657
+B1017424543198N00621557EA0163001661
+B1017444543206N00621554EA0163201664
+B1017464543211N00621547EA0162701665
+B1017484543204N00621532EA0162401666
+B1017504543190N00621529EA0162601665
+B1017524543183N00621544EA0162701665
+B1017544543189N00621559EA0162901664
+B1017564543202N00621563EA0163301667
+B1017584543211N00621554EA0163301668
+B1018004543213N00621541EA0163401669
+B1018024543209N00621529EA0163301669
+B1018044543201N00621518EA0163301669
+B1018064543193N00621506EA0163501670
+B1018084543189N00621493EA0163401669
+B1018104543186N00621478EA0163101668
+B1018124543181N00621461EA0163001666
+B1018144543176N00621444EA0163101666
+B1018164543171N00621429EA0163201667
+B1018184543165N00621414EA0163201667
+B1018204543159N00621399EA0163201667
+B1018224543153N00621385EA0163201667
+B1018244543147N00621374EA0162901666
+B1018264543141N00621362EA0162401663
+B1018284543135N00621347EA0162201660
+B1018304543129N00621331EA0162101658
+B1018324543126N00621316EA0161801656
+B1018344543121N00621303EA0161401653
+B1018364543114N00621288EA0161101650
+B1018384543108N00621273EA0160901648
+B1018404543102N00621260EA0160701645
+B1018424543096N00621246EA0160301641
+B1018444543090N00621232EA0160201639
+B1018464543085N00621218EA0159901636
+B1018484543080N00621203EA0159601633
+B1018504543075N00621187EA0159401631
+B1018524543069N00621173EA0159301629
+B1018544543063N00621160EA0159001627
+B1018564543057N00621147EA0158601623
+B1018584543051N00621133EA0158301619
+B1019004543044N00621118EA0158101617
+B1019024543038N00621103EA0157901615
+B1019044543034N00621089EA0157401611
+B1019064543028N00621073EA0156901607
+B1019084543020N00621054EA0157301605
+B1019104543015N00621037EA0158001605
+B1019124543012N00621024EA0158401608
+B1019144543007N00621011EA0158701612
+B1019164543002N00620998EA0159401617
+B1019184542996N00620985EA0159901623
+B1019204542988N00620978EA0159901626
+B1019224542977N00620986EA0159701628
+B1019244542976N00621006EA0159801630
+B1019264542988N00621013EA0160101632
+B1019284543000N00621003EA0160401635
+B1019304543006N00620985EA0161101639
+B1019324543008N00620968EA0161701647
+B1019344543008N00620956EA0161801650
+B1019364543003N00620947EA0161601652
+B1019384542992N00620942EA0161301652
+B1019404542982N00620954EA0160901651
+B1019424542983N00620972EA0160701647
+B1019444542996N00620978EA0160501644
+B1019464543006N00620966EA0160501641
+B1019484543006N00620948EA0160501641
+B1019504542999N00620932EA0160601640
+B1019524542990N00620921EA0160801641
+B1019544542982N00620912EA0160601642
+B1019564542975N00620905EA0160001640
+B1019584542965N00620899EA0159501636
+B1020004542955N00620889EA0159101632
+B1020024542946N00620878EA0158801627
+B1020044542935N00620867EA0158901624
+B1020064542924N00620859EA0159101623
+B1020084542916N00620852EA0159101622
+B1020104542906N00620848EA0158601619
+B1020124542895N00620842EA0158501617
+B1020144542886N00620834EA0158401616
+B1020164542878N00620827EA0158201615
+B1020184542870N00620820EA0157901612
+B1020204542861N00620811EA0157801610
+B1020224542853N00620801EA0157801609
+B1020244542844N00620791EA0157901610
+B1020264542836N00620783EA0158101611
+B1020284542827N00620775EA0158301613
+B1020304542819N00620765EA0158601616
+B1020324542811N00620755EA0158901618
+B1020344542802N00620746EA0159401622
+B1020364542794N00620738EA0160001627
+B1020384542787N00620729EA0160201631
+B1020404542778N00620727EA0159901634
+B1020424542771N00620739EA0159501636
+B1020444542778N00620754EA0159201636
+B1020464542795N00620753EA0159701637
+B1020484542807N00620749EA0160201640
+B1020504542816N00620749EA0160401641
+B1020524542827N00620749EA0160901645
+B1020544542838N00620749EA0161401649
+B1020564542845N00620758EA0161201652
+B1020584542843N00620773EA0161001652
+B1021004542831N00620776EA0161301653
+B1021024542822N00620766EA0161801655
+B1021044542818N00620754EA0162201659
+B1021064542813N00620744EA0162101661
+B1021084542804N00620733EA0162401663
+B1021104542795N00620720EA0163001667
+B1021124542788N00620711EA0163201670
+B1021144542781N00620703EA0163201671
+B1021164542771N00620694EA0163401673
+B1021184542763N00620682EA0163901676
+B1021204542758N00620669EA0164001679
+B1021224542752N00620658EA0163801680
+B1021244542742N00620651EA0163701679
+B1021264542733N00620662EA0163901679
+B1021284542738N00620677EA0164401680
+B1021304542749N00620681EA0164901683
+B1021324542759N00620682EA0165101686
+B1021344542766N00620690EA0165101686
+B1021364542764N00620703EA0165301687
+B1021384542753N00620700EA0165201687
+B1021404542745N00620685EA0165501689
+B1021424542743N00620667EA0165901692
+B1021454542740N00620644EA0166401697
+B1021474542736N00620633EA0166501699
+B1021494542728N00620631EA0166401700
+B1021514542721N00620644EA0166501699
+B1021534542724N00620659EA0167101701
+B1021554542731N00620666EA0167601706
+B1021574542741N00620665EA0167701708
+B1021594542753N00620662EA0168101712
+B1022014542763N00620661EA0168301716
+B1022034542772N00620662EA0168401717
+B1022054542782N00620666EA0168401718
+B1022074542786N00620677EA0168301718
+B1022094542780N00620688EA0168201717
+B1022114542769N00620683EA0168501718
+B1022134542763N00620666EA0169101720
+B1022154542759N00620652EA0169401724
+B1022174542754N00620641EA0169501725
+B1022194542748N00620626EA0169701727
+B1022214542742N00620615EA0170101731
+B1022234542736N00620608EA0170101732
+B1022254542730N00620601EA0170101733
+B1022274542725N00620590EA0170401735
+B1022294542720N00620579EA0171001738
+B1022314542715N00620570EA0171301743
+B1022334542710N00620565EA0171301746
+B1022354542701N00620572EA0171101746
+B1022374542699N00620592EA0171201746
+B1022394542711N00620604EA0171701747
+B1022414542725N00620602EA0172301751
+B1022434542735N00620603EA0172601755
+B1022454542746N00620607EA0172501756
+B1022474542754N00620616EA0172401756
+B1022494542751N00620632EA0172501755
+B1022514542740N00620635EA0172801757
+B1022534542733N00620623EA0173001760
+B1022554542730N00620609EA0173201763
+B1022574542725N00620600EA0173301764
+B1022594542715N00620600EA0173401766
+B1023014542709N00620613EA0173401767
+B1023034542712N00620630EA0173601768
+B1023054542722N00620637EA0173801770
+B1023074542734N00620629EA0173801772
+B1023094542741N00620611EA0173901773
+B1023114542738N00620595EA0174201776
+B1023134542732N00620582EA0174601779
+B1023154542725N00620571EA0174901782
+B1023174542716N00620563EA0175401787
+B1023194542707N00620564EA0175401789
+B1023214542701N00620578EA0175001791
+B1023234542707N00620593EA0174901790
+B1023254542719N00620598EA0175101792
+B1023274542730N00620596EA0175301792
+B1023294542740N00620593EA0175401792
+B1023314542751N00620593EA0175601794
+B1023334542761N00620594EA0175901796
+B1023354542771N00620597EA0176101798
+B1023374542781N00620601EA0176301800
+B1023394542790N00620604EA0176501801
+B1023414542797N00620610EA0176601803
+B1023434542801N00620621EA0176701804
+B1023454542793N00620633EA0176901804
+B1023474542783N00620628EA0177101806
+B1023494542778N00620612EA0177501809
+B1023514542774N00620598EA0177901813
+B1023534542770N00620587EA0178001815
+B1023554542764N00620578EA0178301817
+B1023574542758N00620568EA0178701821
+B1023594542750N00620568EA0178901823
+B1024014542744N00620583EA0179101826
+B1024034542750N00620596EA0179401827
+B1024054542764N00620595EA0179801831
+B1024074542776N00620589EA0180201835
+B1024094542786N00620585EA0180201837
+B1024114542796N00620595EA0180101838
+B1024134542795N00620612EA0180101839
+B1024154542785N00620613EA0180001839
+B1024174542775N00620597EA0180401841
+B1024194542769N00620582EA0180901845
+B1024214542763N00620572EA0181201848
+B1024234542757N00620560EA0181601852
+B1024254542751N00620548EA0182201857
+B1024274542746N00620537EA0182801863
+B1024294542740N00620529EA0182801867
+B1024314542730N00620532EA0182601870
+B1024334542724N00620549EA0182701870
+B1024354542732N00620561EA0183201871
+B1024374542744N00620553EA0183501873
+B1024394542749N00620531EA0184201876
+B1024414542744N00620514EA0184701881
+B1024434542735N00620509EA0184601883
+B1024454542725N00620507EA0184301882
+B1024474542714N00620503EA0184001879
+B1024494542703N00620497EA0183801877
+B1024514542692N00620494EA0183501874
+B1024534542681N00620492EA0183401871
+B1024554542671N00620489EA0183601871
+B1024574542662N00620489EA0183801872
+B1024594542653N00620492EA0183801873
+B1025014542644N00620494EA0183801873
+B1025034542635N00620492EA0183801873
+B1025054542625N00620488EA0183901874
+B1025074542615N00620484EA0184201875
+B1025094542604N00620479EA0185101878
+B1025114542597N00620475EA0185801883
+B1025134542589N00620473EA0186101887
+B1025154542580N00620483EA0186501891
+B1025174542580N00620503EA0186601895
+B1025194542592N00620510EA0186401897
+B1025214542606N00620499EA0186901901
+B1025234542611N00620485EA0187501906
+B1025254542610N00620471EA0188101912
+B1025274542602N00620457EA0188601918
+B1025294542590N00620457EA0189001923
+B1025314542584N00620471EA0189401928
+B1025334542582N00620488EA0190101935
+B1025354542591N00620502EA0190301939
+B1025374542607N00620504EA0190601942
+B1025394542616N00620492EA0191201946
+B1025414542610N00620477EA0191801951
+B1025434542597N00620472EA0192601957
+B1025454542586N00620469EA0193101964
+B1025474542578N00620463EA0193301968
+B1025494542568N00620456EA0193701971
+B1025514542558N00620449EA0194301977
+B1025534542550N00620442EA0194701982
+B1025554542541N00620436EA0194901984
+B1025574542531N00620429EA0195001986
+B1025594542521N00620420EA0195201987
+B1026014542511N00620411EA0195301988
+B1026034542501N00620401EA0195401990
+B1026054542491N00620391EA0195601992
+B1026074542482N00620381EA0195701993
+B1026094542472N00620372EA0195601993
+B1026114542463N00620363EA0195401992
+B1026134542453N00620353EA0195101989
+B1026154542442N00620344EA0195001988
+B1026174542431N00620336EA0194801986
+B1026194542421N00620326EA0194701984
+B1026214542409N00620315EA0194801984
+B1026234542399N00620303EA0194701984
+B1026254542388N00620293EA0194801984
+B1026274542376N00620287EA0194901985
+B1026294542365N00620283EA0195101987
+B1026314542354N00620280EA0195201988
+B1026334542343N00620275EA0195201988
+B1026354542331N00620269EA0195301988
+B1026374542319N00620260EA0195401989
+B1026394542308N00620249EA0195501991
+B1026414542297N00620237EA0195601992
+B1026434542286N00620229EA0195601993
+B1026454542275N00620224EA0195701993
+B1026474542264N00620218EA0195401992
+B1026494542254N00620213EA0194901990
+B1026514542239N00620208EA0195201989
+B1026534542226N00620204EA0195501990
+B1026554542217N00620199EA0195601990
+B1026574542208N00620192EA0195701991
+B1026594542199N00620185EA0196001994
+B1027014542191N00620175EA0196201996
+B1027034542182N00620166EA0196501998
+B1027054542173N00620158EA0196702001
+B1027074542164N00620151EA0196702002
+B1027094542155N00620145EA0196602001
+B1027114542146N00620139EA0196602001
+B1027134542138N00620131EA0196502002
+B1027154542132N00620123EA0196202001
+B1027174542123N00620115EA0196302000
+B1027194542113N00620107EA0196502000
+B1027214542106N00620100EA0196502001
+B1027234542098N00620094EA0196201999
+B1027254542090N00620088EA0196201998
+B1027274542080N00620084EA0196001997
+B1027294542070N00620079EA0195801995
+B1027314542060N00620072EA0195501993
+B1027334542050N00620064EA0195301990
+B1027354542040N00620057EA0195101989
+B1027374542032N00620049EA0194701986
+B1027394542022N00620043EA0194201981
+B1027414542012N00620036EA0193701976
+B1027434542002N00620027EA0193301973
+B1027454541994N00620019EA0192801967
+B1027474541984N00620011EA0192301962
+B1027494541974N00620003EA0192001958
+B1027514541964N00619995EA0191601955
+B1027534541955N00619989EA0191201950
+B1027554541945N00619982EA0190801946
+B1027574541936N00619974EA0190401942
+B1027594541927N00619968EA0190101938
+B1028014541916N00619961EA0190201936
+B1028034541904N00619952EA0190901935
+B1028054541894N00619945EA0191401936
+B1028074541885N00619941EA0191601940
+B1028094541876N00619936EA0191601940
+B1028114541866N00619930EA0191601941
+B1028134541855N00619925EA0191701942
+B1028154541844N00619922EA0191601943
+B1028174541833N00619919EA0191401943
+B1028194541823N00619912EA0191101941
+B1028214541813N00619905EA0190601939
+B1028234541803N00619899EA0190201934
+B1028254541792N00619891EA0190201933
+B1028274541782N00619885EA0190301932
+B1028294541773N00619878EA0190301932
+B1028314541763N00619872EA0190201931
+B1028334541751N00619865EA0190601932
+B1028354541740N00619859EA0190901935
+B1028374541731N00619852EA0191101938
+B1028394541722N00619843EA0191401941
+B1028414541713N00619831EA0192201945
+B1028434541705N00619822EA0192901951
+B1028454541699N00619813EA0193201956
+B1028474541693N00619805EA0193401959
+B1028494541686N00619796EA0193801963
+B1028514541679N00619788EA0194301969
+B1028534541674N00619780EA0194601974
+B1028554541667N00619777EA0194601977
+B1028574541658N00619789EA0194801979
+B1028594541658N00619807EA0195001983
+B1029014541667N00619817EA0195301986
+B1029034541676N00619824EA0195701990
+B1029054541685N00619831EA0196001994
+B1029074541696N00619827EA0196301997
+B1029094541704N00619812EA0196702002
+B1029114541705N00619795EA0197102006
+B1029134541701N00619781EA0197302009
+B1029154541693N00619771EA0197702012
+B1029174541683N00619767EA0198202016
+B1029194541673N00619767EA0198802022
+B1029214541665N00619773EA0199402029
+B1029234541661N00619785EA0199702033
+B1029254541664N00619797EA0199602037
+B1029274541673N00619804EA0199602039
+B1029294541689N00619802EA0200102041
+B1029314541698N00619789EA0200602045
+B1029334541696N00619772EA0201002048
+B1029354541690N00619758EA0201702054
+B1029374541683N00619752EA0202202059
+B1029394541675N00619750EA0202602063
+B1029414541667N00619748EA0203102068
+B1029434541660N00619758EA0203402072
+B1029454541662N00619771EA0203602075
+B1029474541672N00619777EA0203802077
+B1029494541686N00619772EA0204302079
+B1029514541694N00619754EA0204902083
+B1029534541693N00619734EA0205402089
+B1029554541690N00619720EA0205702093
+B1029574541685N00619709EA0205802096
+B1029594541678N00619700EA0205802097
+B1030014541668N00619699EA0205802097
+B1030034541659N00619713EA0205602096
+B1030054541662N00619733EA0206102096
+B1030074541669N00619746EA0207002099
+B1030094541673N00619755EA0207702105
+B1030114541676N00619765EA0208002109
+B1030134541685N00619774EA0208302112
+B1030154541698N00619768EA0208702117
+B1030174541704N00619748EA0209302123
+B1030194541698N00619730EA0209902128
+B1030214541689N00619721EA0210602136
+B1030234541681N00619723EA0211002143
+B1030254541675N00619733EA0211402147
+B1030274541676N00619749EA0211502151
+B1030294541689N00619754EA0211902154
+B1030314541702N00619744EA0212502159
+B1030334541704N00619723EA0213002164
+B1030354541700N00619702EA0213602171
+B1030374541693N00619686EA0214002176
+B1030394541685N00619676EA0214202180
+B1030414541676N00619671EA0214402182
+B1030434541665N00619667EA0214702185
+B1030454541654N00619664EA0215002189
+B1030474541643N00619662EA0215302192
+B1030494541632N00619658EA0215502194
+B1030514541621N00619655EA0215702196
+B1030534541609N00619654EA0215802198
+B1030554541597N00619653EA0215902199
+B1030574541586N00619649EA0216102200
+B1030594541576N00619645EA0216002201
+B1031014541566N00619643EA0215802200
+B1031034541557N00619640EA0215402198
+B1031054541548N00619633EA0215102195
+B1031074541539N00619623EA0214902192
+B1031094541530N00619614EA0214602190
+B1031114541520N00619606EA0214302186
+B1031134541510N00619598EA0214002183
+B1031154541499N00619591EA0213902180
+B1031174541488N00619586EA0213602178
+B1031194541478N00619580EA0213302175
+B1031214541468N00619572EA0213002171
+B1031234541460N00619560EA0212602167
+B1031254541453N00619547EA0212102163
+B1031274541444N00619535EA0211802159
+B1031294541435N00619522EA0211602156
+B1031314541428N00619509EA0211202152
+B1031334541421N00619495EA0210802148
+B1031354541414N00619480EA0210402145
+B1031374541407N00619464EA0210102141
+B1031394541401N00619449EA0209702138
+B1031414541395N00619435EA0209302134
+B1031434541388N00619419EA0208802129
+B1031454541381N00619403EA0208602126
+B1031474541375N00619389EA0208402123
+B1031494541367N00619376EA0207802119
+B1031514541358N00619363EA0207302114
+B1031534541348N00619351EA0206802110
+B1031554541337N00619341EA0206302105
+B1031574541325N00619332EA0206002101
+B1031594541314N00619322EA0205602097
+B1032014541304N00619312EA0205202092
+B1032034541293N00619300EA0204902088
+B1032054541283N00619287EA0204802085
+B1032074541273N00619276EA0204802084
+B1032094541263N00619266EA0204702084
+B1032114541253N00619255EA0204702084
+B1032134541245N00619243EA0204602083
+B1032154541237N00619231EA0204402082
+B1032174541228N00619220EA0204002079
+B1032194541219N00619207EA0203602075
+B1032214541211N00619192EA0203102070
+B1032234541203N00619177EA0202602065
+B1032254541196N00619161EA0201902060
+B1032274541189N00619146EA0201302053
+B1032294541181N00619131EA0200802047
+B1032314541172N00619115EA0200502042
+B1032334541164N00619101EA0200102039
+B1032354541155N00619088EA0199702035
+B1032374541146N00619074EA0199302031
+B1032394541136N00619059EA0199202028
+B1032414541128N00619044EA0199202027
+B1032434541121N00619029EA0199002024
+B1032454541114N00619011EA0198902023
+B1032474541108N00618993EA0198902023
+B1032494541101N00618977EA0198602021
+B1032514541094N00618962EA0198302018
+B1032534541085N00618945EA0197902015
+B1032554541077N00618929EA0197502012
+B1032574541069N00618914EA0197102008
+B1032594541061N00618897EA0196602003
+B1033014541053N00618881EA0196302000
+B1033034541045N00618865EA0195901996
+B1033054541038N00618849EA0195501992
+B1033074541031N00618831EA0195301988
+B1033094541025N00618814EA0195101986
+B1033114541018N00618797EA0194901984
+B1033134541011N00618779EA0194601981
+B1033154541005N00618761EA0194501980
+B1033174541000N00618744EA0194301979
+B1033194540995N00618726EA0194101977
+B1033214540989N00618709EA0193801975
+B1033234540983N00618692EA0193601973
+B1033254540978N00618675EA0193501971
+B1033274540972N00618657EA0193301970
+B1033294540966N00618641EA0193201968
+B1033314540961N00618624EA0192901966
+B1033334540955N00618608EA0192601963
+B1033354540949N00618591EA0192401961
+B1033374540942N00618574EA0192201960
+B1033394540936N00618558EA0192001958
+B1033414540930N00618540EA0192001956
+B1033434540925N00618523EA0191901955
+B1033454540922N00618506EA0191601953
+B1033474540919N00618490EA0191401951
+B1033494540913N00618473EA0191201948
+B1033514540908N00618456EA0191001947
+B1033534540902N00618440EA0190901945
+B1033554540896N00618424EA0190601943
+B1033574540889N00618407EA0190501941
+B1033594540884N00618391EA0190301940
+B1034014540879N00618375EA0190101938
+B1034034540874N00618358EA0189801935
+B1034054540870N00618340EA0189601933
+B1034074540864N00618323EA0189501931
+B1034094540859N00618307EA0189301929
+B1034114540853N00618290EA0189101928
+B1034134540848N00618274EA0188901926
+B1034154540842N00618258EA0188601923
+B1034174540837N00618241EA0188501920
+B1034194540831N00618224EA0188301919
+B1034214540825N00618208EA0188001916
+B1034234540820N00618191EA0187701913
+B1034254540814N00618174EA0187401910
+B1034274540808N00618156EA0187201908
+B1034294540802N00618139EA0187001906
+B1034314540796N00618122EA0186601903
+B1034334540790N00618105EA0186501900
+B1034354540784N00618088EA0186101898
+B1034374540779N00618071EA0185901896
+B1034394540773N00618054EA0185701893
+B1034414540767N00618037EA0185301890
+B1034434540762N00618020EA0185001887
+B1034454540756N00618003EA0184701884
+B1034474540750N00617986EA0184401880
+B1034494540743N00617970EA0184201877
+B1034514540737N00617953EA0183901875
+B1034534540731N00617936EA0183601872
+B1034554540725N00617919EA0183301869
+B1034574540719N00617902EA0183001866
+B1034594540713N00617885EA0182701863
+B1035014540706N00617868EA0182401860
+B1035034540700N00617851EA0182101857
+B1035054540694N00617834EA0181801854
+B1035074540688N00617818EA0181601851
+B1035094540682N00617800EA0181301848
+B1035114540676N00617783EA0181001845
+B1035134540671N00617765EA0180501841
+B1035154540665N00617747EA0180201838
+B1035174540660N00617730EA0179901834
+B1035194540654N00617713EA0179401831
+B1035214540649N00617698EA0178901827
+B1035234540644N00617682EA0178301821
+B1035254540639N00617664EA0177801815
+B1035274540634N00617648EA0177501811
+B1035294540630N00617631EA0177101806
+B1035314540625N00617613EA0177101803
+B1035334540619N00617596EA0177301802
+B1035354540615N00617580EA0177501803
+B1035374540610N00617564EA0177701805
+B1035394540604N00617548EA0178101808
+B1035414540599N00617531EA0178501813
+B1035434540596N00617516EA0178601815
+B1035454540592N00617499EA0178801817
+B1035474540586N00617481EA0179201821
+B1035494540581N00617461EA0179701825
+B1035514540578N00617442EA0180301830
+B1035534540575N00617423EA0181101837
+B1035554540571N00617409EA0181801845
+B1035574540566N00617396EA0182001850
+B1035594540553N00617391EA0182101855
+B1036014540540N00617400EA0182501859
+B1036034540538N00617416EA0182801863
+B1036054540546N00617427EA0183401869
+B1036074540552N00617433EA0184001875
+B1036094540560N00617427EA0184301880
+B1036114540564N00617409EA0184701884
+B1036134540559N00617391EA0185201888
+B1036154540548N00617381EA0185701893
+B1036174540536N00617382EA0185701896
+B1036194540527N00617396EA0185601897
+B1036214540530N00617412EA0185801897
+B1036234540541N00617419EA0186201899
+B1036254540552N00617413EA0186801904
+B1036274540558N00617401EA0187201908
+B1036294540561N00617385EA0187601912
+B1036314540563N00617369EA0188001916
+B1036334540565N00617354EA0188301919
+B1036354540566N00617339EA0188501922
+B1036374540569N00617327EA0188001923
+B1036394540572N00617314EA0187301923
+B1036414540574N00617295EA0186901920
+B1036434540574N00617277EA0186601915
+B1036454540572N00617258EA0186301911
+B1036474540569N00617239EA0186101907
+B1036494540567N00617220EA0186501905
+B1036514540563N00617201EA0187001904
+B1036534540562N00617188EA0187301905
+B1036554540563N00617174EA0187501908
+B1036574540564N00617161EA0187701911
+B1036594540564N00617150EA0187601911
+B1037014540560N00617136EA0187701912
+B1037034540555N00617117EA0188501915
+B1037054540553N00617100EA0189101920
+B1037074540549N00617087EA0189501925
+B1037094540539N00617082EA0190001929
+B1037114540531N00617089EA0190401935
+B1037134540532N00617103EA0190501939
+B1037154540544N00617107EA0191001943
+B1037174540556N00617095EA0191301948
+B1037194540563N00617079EA0191701952
+B1037214540569N00617060EA0191901955
+B1037234540565N00617042EA0191701957
+B1037254540556N00617030EA0191701957
+B1037274540544N00617030EA0191801957
+B1037294540536N00617042EA0192001957
+B1037314540535N00617058EA0192401959
+B1037334540538N00617072EA0193001964
+B1037354540540N00617083EA0193601969
+B1037374540542N00617095EA0194501976
+B1037394540544N00617106EA0195201984
+B1037414540546N00617115EA0195301990
+B1037434540559N00617118EA0195101990
+B1037454540571N00617107EA0195301993
+B1037474540569N00617088EA0195501994
+B1037494540562N00617072EA0196501997
+B1037514540558N00617057EA0197302003
+B1037534540553N00617046EA0197602008
+B1037554540543N00617041EA0197702012
+B1037574540533N00617052EA0197902014
+B1037594540538N00617068EA0198602018
+B1038014540553N00617065EA0199102023
+B1038034540560N00617043EA0199802028
+B1038054540552N00617026EA0200402035
+B1038074540541N00617026EA0200602039
+B1038094540535N00617039EA0200902043
+B1038114540543N00617051EA0201302047
+B1038134540557N00617047EA0201902051
+B1038154540563N00617025EA0202502056
+B1038174540557N00617006EA0203102062
+B1038194540547N00617004EA0203302066
+B1038214540541N00617016EA0203502069
+B1038234540547N00617030EA0203902072
+B1038254540561N00617025EA0204602077
+B1038274540571N00617011EA0205402083
+B1038294540579N00616999EA0206002090
+B1038314540582N00616984EA0206102095
+B1038334540576N00616968EA0206002099
+B1038354540564N00616969EA0206002102
+B1038374540557N00616983EA0206202102
+B1038394540560N00617000EA0206502104
+B1038414540570N00617009EA0207202108
+B1038434540580N00617008EA0207602113
+B1038454540588N00616997EA0207902116
+B1038474540588N00616979EA0208202119
+B1038494540579N00616968EA0208502122
+B1038514540568N00616971EA0208702125
+B1038534540565N00616988EA0209102128
+B1038554540573N00617000EA0209302130
+B1038574540586N00616997EA0209602133
+B1038594540595N00616984EA0210002136
+B1039014540596N00616966EA0210402141
+B1039034540590N00616953EA0210702144
+B1039054540581N00616948EA0211102148
+B1039074540572N00616956EA0211402150
+B1039094540568N00616971EA0211702153
+B1039114540575N00616980EA0212002156
+B1039134540588N00616975EA0212202159
+B1039154540594N00616955EA0212502162
+B1039174540592N00616937EA0212802166
+B1039194540587N00616923EA0213102170
+B1039214540579N00616911EA0213302172
+B1039234540570N00616900EA0213502174
+B1039254540560N00616890EA0213602176
+B1039274540552N00616881EA0213502176
+B1039294540541N00616872EA0213502176
+B1039314540532N00616863EA0213602176
+B1039334540524N00616853EA0213402176
+B1039354540517N00616844EA0213102174
+B1039374540508N00616833EA0212602170
+B1039394540500N00616822EA0212102165
+B1039414540489N00616812EA0211802161
+B1039434540479N00616803EA0211402157
+B1039454540469N00616793EA0210902153
+B1039474540458N00616785EA0210502148
+B1039494540446N00616778EA0210202144
+B1039514540435N00616770EA0210002141
+B1039534540425N00616762EA0209602138
+B1039554540414N00616751EA0209202133
+B1039574540402N00616739EA0209002130
+B1039594540390N00616731EA0208802128
+B1040014540379N00616723EA0208302124
+B1040034540368N00616712EA0207802119
+B1040054540356N00616699EA0207502116
+B1040074540346N00616686EA0207102112
+B1040094540338N00616672EA0206602108
+B1040114540329N00616659EA0206202103
+B1040134540318N00616647EA0205802099
+B1040154540307N00616636EA0205602096
+B1040174540296N00616626EA0205302093
+B1040194540286N00616616EA0205002090
+B1040214540275N00616606EA0204502085
+B1040234540264N00616594EA0204202082
+B1040254540254N00616583EA0203902079
+B1040274540245N00616571EA0203502075
+B1040294540235N00616560EA0203102071
+B1040314540224N00616549EA0202702067
+B1040334540215N00616537EA0202402063
+B1040354540205N00616525EA0202002059
+B1040374540195N00616514EA0201702056
+B1040394540185N00616503EA0201402052
+B1040414540175N00616493EA0201102049
+B1040434540165N00616483EA0200702046
+B1040454540155N00616474EA0200402043
+B1040474540145N00616464EA0200002039
+B1040494540135N00616452EA0199702036
+B1040514540126N00616440EA0199502033
+B1040534540116N00616428EA0199202030
+B1040554540106N00616417EA0198902027
+B1040574540096N00616405EA0198602024
+B1040594540086N00616395EA0198402022
+B1041014540076N00616384EA0198002019
+B1041034540065N00616373EA0197702015
+B1041054540055N00616363EA0197402012
+B1041074540044N00616352EA0197002009
+B1041094540034N00616342EA0196602006
+B1041114540023N00616332EA0196402002
+B1041134540012N00616323EA0196102000
+B1041154540002N00616313EA0195701996
+B1041174539992N00616302EA0195401992
+B1041194539982N00616290EA0195101989
+B1041214539972N00616279EA0194901987
+B1041234539962N00616268EA0194601983
+B1041254539952N00616258EA0194301980
+B1041274539942N00616248EA0194001977
+B1041294539932N00616237EA0193801975
+B1041314539922N00616226EA0193501972
+B1041334539911N00616216EA0193201969
+B1041354539901N00616206EA0192901966
+B1041374539890N00616197EA0192601963
+B1041394539880N00616187EA0192301960
+B1041414539869N00616178EA0192001957
+B1041434539859N00616168EA0191801954
+B1041454539849N00616158EA0191501952
+B1041474539839N00616149EA0191101948
+B1041494539828N00616140EA0190901946
+B1041514539818N00616131EA0190501943
+B1041534539807N00616123EA0190201940
+B1041554539797N00616115EA0189901937
+B1041574539786N00616107EA0189601934
+B1041594539776N00616098EA0189401931
+B1042014539765N00616090EA0189101928
+B1042034539755N00616082EA0188801925
+B1042054539744N00616073EA0188501922
+B1042074539734N00616065EA0188201919
+B1042094539723N00616057EA0187901917
+B1042114539712N00616049EA0187701914
+B1042134539701N00616042EA0187401911
+B1042154539691N00616035EA0187101908
+B1042174539680N00616027EA0186901906
+B1042194539669N00616019EA0186601903
+B1042214539658N00616012EA0186401900
+B1042234539648N00616004EA0186101898
+B1042254539636N00615998EA0185701894
+B1042274539625N00615991EA0185401892
+B1042294539615N00615983EA0185201889
+B1042314539604N00615975EA0184901885
+B1042334539593N00615967EA0184601882
+B1042354539583N00615959EA0184401880
+B1042374539572N00615952EA0184301879
+B1042394539562N00615945EA0183901876
+B1042414539551N00615939EA0183601873
+B1042434539539N00615931EA0183401870
+B1042454539527N00615923EA0183301869
+B1042474539516N00615917EA0183301869
+B1042494539505N00615910EA0183301868
+B1042514539494N00615903EA0183401869
+B1042534539483N00615896EA0183501870
+B1042554539473N00615890EA0183601871
+B1042574539461N00615884EA0183701872
+B1042594539450N00615879EA0183701873
+B1043014539439N00615874EA0183801873
+B1043034539429N00615870EA0183501872
+B1043054539418N00615868EA0183201870
+B1043074539405N00615863EA0183101868
+B1043094539394N00615859EA0183201867
+B1043114539385N00615857EA0183601869
+B1043134539377N00615854EA0184101873
+B1043154539369N00615851EA0184401877
+B1043174539363N00615852EA0184301879
+B1043194539356N00615857EA0184301879
+B1043214539346N00615860EA0184401880
+B1043234539335N00615859EA0184601882
+B1043254539326N00615860EA0184801884
+B1043274539317N00615860EA0184901886
+B1043294539308N00615859EA0185001887
+B1043314539299N00615858EA0185001888
+B1043334539289N00615861EA0185001888
+B1043354539279N00615862EA0184901888
+B1043374539267N00615863EA0184801887
+B1043394539256N00615864EA0184801886
+B1043414539244N00615863EA0184801886
+B1043434539234N00615860EA0184701886
+B1043454539225N00615858EA0184401885
+B1043474539213N00615855EA0184201882
+B1043494539202N00615850EA0184101881
+B1043514539191N00615847EA0183601878
+B1043534539181N00615845EA0183301874
+B1043554539170N00615842EA0183201873
+B1043574539161N00615841EA0182901870
+B1043594539153N00615840EA0182501867
+B1044014539143N00615838EA0182201862
+B1044034539132N00615837EA0182001859
+B1044054539121N00615837EA0181901857
+B1044074539110N00615835EA0182101857
+B1044094539100N00615831EA0182401858
+B1044114539091N00615827EA0182701861
+B1044134539081N00615824EA0183001863
+B1044154539072N00615819EA0183301866
+B1044174539062N00615814EA0183501869
+B1044194539052N00615810EA0183501870
+B1044214539042N00615807EA0183601872
+B1044234539032N00615802EA0183601872
+B1044254539023N00615796EA0183401871
+B1044274539011N00615788EA0183401871
+B1044294539000N00615781EA0183501871
+B1044314538990N00615777EA0183401871
+B1044334538980N00615772EA0183101869
+B1044354538970N00615766EA0182701866
+B1044374538961N00615757EA0182501863
+B1044394538952N00615747EA0182701861
+B1044414538947N00615736EA0183001861
+B1044434538941N00615725EA0183101863
+B1044454538933N00615714EA0183401865
+B1044474538927N00615703EA0183801869
+B1044494538921N00615692EA0183901870
+B1044514538913N00615680EA0183801870
+B1044534538906N00615672EA0183801871
+B1044554538898N00615668EA0183701871
+B1044574538890N00615663EA0183301870
+B1044594538882N00615654EA0183001867
+B1045014538872N00615645EA0182801865
+B1045034538863N00615636EA0182601863
+B1045054538854N00615627EA0182301860
+B1045074538845N00615616EA0182001857
+B1045094538836N00615606EA0181801855
+B1045114538827N00615597EA0181601853
+B1045134538818N00615588EA0181101849
+B1045154538808N00615578EA0180701845
+B1045174538797N00615569EA0180201841
+B1045194538787N00615560EA0179701836
+B1045214538776N00615551EA0179201830
+B1045234538766N00615541EA0178701826
+B1045254538755N00615533EA0178401822
+B1045274538744N00615526EA0178101818
+B1045294538732N00615519EA0177801815
+B1045314538721N00615511EA0177701813
+B1045334538710N00615505EA0177401811
+B1045354538699N00615499EA0177101808
+B1045374538688N00615492EA0176901805
+B1045394538676N00615487EA0176701803
+B1045414538665N00615481EA0176401800
+B1045434538653N00615474EA0176101797
+B1045454538642N00615469EA0175801794
+B1045474538630N00615465EA0175401791
+B1045494538617N00615461EA0175101787
+B1045514538606N00615456EA0174901785
+B1045534538594N00615451EA0174601782
+B1045554538582N00615445EA0174401780
+B1045574538571N00615439EA0174201778
+B1045594538560N00615431EA0174001776
+B1046014538548N00615426EA0173901774
+B1046034538536N00615421EA0173901774
+B1046054538525N00615414EA0173801773
+B1046074538513N00615409EA0173501771
+B1046094538500N00615405EA0173401769
+B1046114538488N00615400EA0173301768
+B1046134538476N00615397EA0173101767
+B1046154538464N00615393EA0173001765
+B1046174538452N00615389EA0173001765
+B1046194538440N00615386EA0172801763
+B1046214538428N00615383EA0172701762
+B1046234538417N00615380EA0172601761
+B1046254538405N00615376EA0172401760
+B1046274538393N00615374EA0172301758
+B1046294538381N00615374EA0172101757
+B1046314538369N00615373EA0171801754
+B1046334538356N00615370EA0171601752
+B1046354538344N00615367EA0171601751
+B1046374538333N00615366EA0171401749
+B1046394538321N00615365EA0171201747
+B1046414538308N00615366EA0171201745
+B1046434538295N00615365EA0171501745
+B1046454538284N00615364EA0171701746
+B1046474538273N00615362EA0172001749
+B1046494538261N00615358EA0172501753
+B1046514538250N00615354EA0173101758
+B1046534538241N00615351EA0173401763
+B1046554538236N00615360EA0173401766
+B1046574538237N00615373EA0173401769
+B1046594538248N00615376EA0173701771
+B1047014538257N00615367EA0174301774
+B1047034538264N00615352EA0174801778
+B1047054538270N00615339EA0175101783
+B1047074538279N00615333EA0175201785
+B1047094538286N00615340EA0175201786
+B1047114538281N00615351EA0175201787
+B1047134538268N00615352EA0175501788
+B1047154538257N00615343EA0176101792
+B1047174538248N00615334EA0176601798
+B1047194538242N00615322EA0176801801
+B1047214538237N00615304EA0177201804
+B1047234538230N00615290EA0177401808
+B1047254538221N00615293EA0177501809
+B1047274538218N00615306EA0177701811
+B1047294538224N00615315EA0178201815
+B1047314538234N00615309EA0178501819
+B1047334538240N00615293EA0178701821
+B1047354538238N00615272EA0179001824
+B1047374538228N00615260EA0179001827
+B1047394538215N00615267EA0179201828
+B1047414538214N00615282EA0179401830
+B1047434538224N00615290EA0179801832
+B1047454538234N00615287EA0180201837
+B1047474538242N00615280EA0180601840
+B1047494538250N00615273EA0180801844
+B1047514538257N00615268EA0180801846
+B1047534538266N00615266EA0180801846
+B1047554538274N00615274EA0180801846
+B1047574538273N00615288EA0181001846
+B1047594538265N00615298EA0181301848
+B1048014538254N00615301EA0181601851
+B1048034538243N00615302EA0182201855
+B1048054538233N00615301EA0182601859
+B1048074538224N00615302EA0182601863
+B1048094538214N00615303EA0182401864
+B1048114538204N00615301EA0182301863
+B1048134538194N00615298EA0182201862
+B1048154538185N00615294EA0182201861
+B1048174538177N00615290EA0182301861
+B1048194538168N00615285EA0182501862
+B1048214538158N00615281EA0182801864
+B1048234538148N00615278EA0183001866
+B1048254538137N00615274EA0183101867
+B1048274538125N00615271EA0182901867
+B1048294538113N00615267EA0182701866
+B1048314538102N00615262EA0182601864
+B1048334538092N00615257EA0182701864
+B1048354538082N00615251EA0182901865
+B1048374538072N00615246EA0183201867
+B1048394538061N00615240EA0183601870
+B1048414538051N00615234EA0183901874
+B1048434538041N00615232EA0183701875
+B1048454538030N00615233EA0183201875
+B1048474538017N00615234EA0182901872
+B1048494538005N00615235EA0182801870
+B1048514537995N00615237EA0182501867
+B1048534537984N00615238EA0182101863
+B1048554537972N00615238EA0181801860
+B1048574537961N00615238EA0181601857
+B1048594537951N00615239EA0181401854
+B1049014537938N00615240EA0181401852
+B1049034537925N00615241EA0181401851
+B1049054537915N00615245EA0181301850
+B1049074537903N00615248EA0181301849
+B1049094537892N00615251EA0181401849
+B1049114537881N00615253EA0181701851
+B1049134537872N00615252EA0182401854
+B1049154537865N00615251EA0182901859
+B1049174537857N00615252EA0183201863
+B1049194537848N00615254EA0183401866
+B1049214537839N00615248EA0183601868
+B1049234537830N00615239EA0183901871
+B1049254537821N00615229EA0184001873
+B1049274537813N00615218EA0184201874
+B1049294537805N00615205EA0184301876
+B1049314537799N00615193EA0184101876
+B1049334537792N00615184EA0183601876
+B1049354537783N00615177EA0183201873
+B1049374537771N00615171EA0183101871
+B1049394537760N00615165EA0183101870
+B1049414537751N00615159EA0182801868
+B1049434537742N00615155EA0182801865
+B1049454537732N00615149EA0183301864
+B1049474537725N00615142EA0183401864
+B1049494537717N00615134EA0183201864
+B1049514537707N00615129EA0183301863
+B1049534537697N00615130EA0183901865
+B1049554537688N00615130EA0184601872
+B1049574537680N00615129EA0185101878
+B1049594537672N00615129EA0185701884
+B1050014537665N00615136EA0186001889
+B1050034537663N00615153EA0186401894
+B1050054537673N00615163EA0186401897
+B1050074537685N00615154EA0186301899
+B1050094537690N00615138EA0186401899
+B1050114537686N00615123EA0186601901
+B1050134537678N00615113EA0187101904
+B1050154537670N00615110EA0187801909
+B1050174537662N00615108EA0188101914
+B1050194537653N00615108EA0188201917
+B1050214537644N00615118EA0188301918
+B1050234537643N00615135EA0188601920
+B1050254537653N00615142EA0188901922
+B1050274537663N00615131EA0188901925
+B1050294537666N00615110EA0189201927
+B1050314537661N00615091EA0190001930
+B1050334537654N00615084EA0190601936
+B1050354537646N00615081EA0190901942
+B1050374537637N00615083EA0191101945
+B1050394537631N00615097EA0191101946
+B1050414537634N00615117EA0191301947
+B1050434537647N00615118EA0191701950
+B1050454537654N00615101EA0191901952
+B1050474537652N00615080EA0192501955
+B1050494537647N00615064EA0193101962
+B1050514537643N00615054EA0193601968
+B1050534537636N00615046EA0193801972
+B1050554537625N00615048EA0193601974
+B1050574537618N00615063EA0193401974
+B1050594537623N00615078EA0193301973
+B1051014537636N00615080EA0193501973
+B1051034537645N00615070EA0193901976
+B1051054537650N00615056EA0194201979
+B1051074537652N00615040EA0194701982
+B1051094537651N00615024EA0195201987
+B1051114537651N00615009EA0195201990
+B1051134537648N00614996EA0194901992
+B1051154537641N00614983EA0194701991
+B1051174537634N00614968EA0194501989
+B1051194537628N00614953EA0194101986
+B1051214537621N00614937EA0193501982
+B1051234537614N00614919EA0193201978
+B1051254537608N00614902EA0193001975
+B1051274537601N00614887EA0192601971
+B1051294537595N00614871EA0192301967
+B1051314537588N00614857EA0192701964
+B1051334537580N00614846EA0193101968
+B1051354537575N00614835EA0193001969
+B1051374537569N00614821EA0192701968
+B1051394537562N00614803EA0193001969
+B1051414537558N00614786EA0193401972
+B1051434537556N00614772EA0193601974
+B1051454537551N00614759EA0193501975
+B1051474537545N00614745EA0193801976
+B1051494537540N00614732EA0194001978
+B1051514537534N00614720EA0194201980
+B1051534537528N00614709EA0194401982
+B1051554537523N00614697EA0194401984
+B1051574537517N00614687EA0194201983
+B1051594537510N00614677EA0193701982
+B1052014537502N00614664EA0193501979
+B1052034537494N00614650EA0193401978
+B1052054537486N00614638EA0192901975
+B1052074537477N00614626EA0192601970
+B1052094537468N00614612EA0192401968
+B1052114537461N00614598EA0192401966
+B1052134537456N00614584EA0192301965
+B1052154537451N00614570EA0192201963
+B1052174537446N00614558EA0192501962
+B1052194537438N00614548EA0192901963
+B1052214537431N00614538EA0193301967
+B1052234537427N00614528EA0193401968
+B1052254537421N00614519EA0193401968
+B1052274537416N00614510EA0193501969
+B1052294537410N00614500EA0193801971
+B1052314537403N00614489EA0194401974
+B1052334537397N00614479EA0195101979
+B1052354537391N00614471EA0195501984
+B1052374537383N00614466EA0195601987
+B1052394537374N00614474EA0195701990
+B1052414537372N00614487EA0195901992
+B1052434537376N00614498EA0196101994
+B1052454537387N00614505EA0196501996
+B1052474537403N00614500EA0197302001
+B1052494537413N00614490EA0198202007
+B1052514537417N00614478EA0198602014
+B1052534537414N00614463EA0198802018
+B1052554537402N00614457EA0199002023
+B1052574537394N00614465EA0199202026
+B1052594537392N00614480EA0199502029
+B1053014537392N00614492EA0200102035
+B1053034537390N00614500EA0200302039
+B1053054537392N00614512EA0200102042
+B1053074537404N00614524EA0200302044
+B1053094537418N00614523EA0200602047
+B1053114537428N00614513EA0200902049
+B1053134537436N00614500EA0201302052
+B1053154537440N00614484EA0201702055
+B1053174537439N00614470EA0202202060
+B1053194537433N00614460EA0202602063
+B1053214537425N00614453EA0203102069
+B1053234537418N00614448EA0203302073
+B1053254537411N00614452EA0203102075
+B1053274537408N00614467EA0203102074
+B1053294537416N00614479EA0203302074
+B1053314537427N00614485EA0203702077
+B1053334537440N00614480EA0203902079
+B1053354537450N00614464EA0204102080
+B1053374537452N00614446EA0204702083
+B1053394537449N00614432EA0205202088
+B1053414537442N00614421EA0205502092
+B1053434537434N00614417EA0205702095
+B1053454537427N00614426EA0205502096
+B1053474537427N00614442EA0205502096
+B1053494537436N00614451EA0205702096
+B1053514537450N00614454EA0206302098
+B1053534537461N00614449EA0206602102
+B1053554537469N00614435EA0207002105
+B1053574537471N00614416EA0207302108
+B1053594537463N00614402EA0207602111
+B1054014537456N00614392EA0208102117
+B1054034537456N00614376EA0208002120
+B1054054537462N00614358EA0208102121
+B1054074537474N00614345EA0208402123
+B1054094537487N00614343EA0208902126
+B1054114537497N00614348EA0209602131
+B1054134537503N00614358EA0210002135
+B1054154537507N00614369EA0210302139
+B1054174537509N00614379EA0210502143
+B1054194537506N00614388EA0210402145
+B1054214537494N00614394EA0210602146
+B1054234537485N00614387EA0211002148
+B1054254537478N00614379EA0211002150
+B1054274537471N00614373EA0211102149
+B1054294537464N00614366EA0211102150
+B1054314537456N00614357EA0211102150
+B1054334537449N00614350EA0211002149
+B1054354537439N00614342EA0210802147
+B1054374537430N00614332EA0210702146
+B1054394537421N00614321EA0210702146
+B1054414537413N00614311EA0210602145
+B1054434537406N00614298EA0210502143
+B1054454537399N00614286EA0210402142
+B1054474537390N00614278EA0210102140
+B1054494537382N00614269EA0209802137
+B1054514537372N00614259EA0209702135
+B1054534537362N00614248EA0209802134
+B1054554537353N00614238EA0209602133
+B1054574537345N00614230EA0209102131
+B1054594537336N00614219EA0208602127
+B1055014537326N00614207EA0208202123
+B1055034537317N00614195EA0207902119
+B1055054537307N00614183EA0207502115
+B1055074537296N00614172EA0207202112
+B1055094537286N00614161EA0206902109
+B1055114537275N00614152EA0206502106
+B1055134537264N00614143EA0206202102
+B1055154537253N00614132EA0206002099
+B1055174537242N00614121EA0205702097
+B1055194537232N00614111EA0205402093
+B1055214537222N00614100EA0205202091
+B1055234537212N00614088EA0205102089
+B1055254537204N00614076EA0204902088
+B1055274537195N00614063EA0204802086
+B1055294537185N00614049EA0204702085
+B1055314537176N00614038EA0204602084
+B1055334537166N00614027EA0204502083
+B1055354537156N00614016EA0204302081
+B1055374537146N00614004EA0204402081
+B1055394537135N00613992EA0204602082
+B1055414537127N00613982EA0204602083
+B1055434537118N00613972EA0204402082
+B1055454537108N00613962EA0204102080
+B1055474537098N00613951EA0203802077
+B1055494537088N00613940EA0203502074
+B1055514537076N00613930EA0203202071
+B1055534537066N00613922EA0203002069
+B1055554537055N00613914EA0202702066
+B1055574537046N00613904EA0202402063
+B1055594537036N00613893EA0202502062
+B1056014537028N00613882EA0203202062
+B1056034537020N00613871EA0203802064
+B1056054537013N00613860EA0204302069
+B1056074537008N00613851EA0204502073
+B1056094537001N00613843EA0204402074
+B1056114536992N00613834EA0204402075
+B1056134536985N00613823EA0204402076
+B1056154536978N00613809EA0204302076
+B1056174536970N00613796EA0204302076
+B1056194536963N00613783EA0204402077
+B1056214536957N00613770EA0204402077
+B1056234536952N00613757EA0204302077
+B1056254536946N00613743EA0204402078
+B1056274536940N00613728EA0204602079
+B1056294536934N00613715EA0204702081
+B1056314536928N00613704EA0204602081
+B1056334536921N00613693EA0204202080
+B1056354536915N00613679EA0204102078
+B1056374536910N00613666EA0204202078
+B1056394536905N00613654EA0204202078
+B1056414536899N00613644EA0204002076
+B1056434536892N00613633EA0204102076
+B1056454536884N00613624EA0204302077
+B1056474536876N00613615EA0204602079
+B1056494536869N00613606EA0205002083
+B1056514536862N00613596EA0205302086
+B1056534536855N00613586EA0205702090
+B1056554536849N00613575EA0205902093
+B1056574536842N00613563EA0206102095
+B1056594536835N00613551EA0206402097
+B1057014536829N00613541EA0206602101
+B1057034536823N00613533EA0206602103
+B1057054536815N00613522EA0206202103
+B1057074536807N00613511EA0206002101
+B1057094536799N00613499EA0205702098
+B1057114536791N00613486EA0205402095
+B1057134536783N00613473EA0205202093
+B1057154536775N00613460EA0204902090
+B1057174536768N00613447EA0204502086
+B1057194536760N00613432EA0204202082
+B1057214536753N00613416EA0204202080
+B1057234536747N00613401EA0204102080
+B1057254536740N00613387EA0204102079
+B1057274536732N00613374EA0204202079
+B1057294536725N00613361EA0204302080
+B1057314536719N00613345EA0204702082
+B1057334536715N00613329EA0205202086
+B1057354536710N00613316EA0205302088
+B1057374536704N00613302EA0205102090
+B1057394536698N00613287EA0204702089
+B1057414536692N00613275EA0204602087
+B1057434536685N00613265EA0204402085
+B1057454536679N00613253EA0204002082
+B1057474536672N00613239EA0203902079
+B1057494536666N00613224EA0203902077
+B1057514536661N00613208EA0203902077
+B1057534536654N00613192EA0204202078
+B1057554536647N00613175EA0204802080
+B1057574536641N00613160EA0205502085
+B1057594536633N00613147EA0206302091
+B1058014536623N00613141EA0207002098
+B1058034536613N00613151EA0207402104
+B1058054536610N00613168EA0207202108
+B1058074536620N00613179EA0206602110
+B1058094536634N00613172EA0206502112
+B1058114536641N00613150EA0206802113
+B1058134536640N00613124EA0207702117
+B1058154536639N00613105EA0208802125
+B1058174536637N00613091EA0209502132
+B1058194536632N00613081EA0209902137
+B1058214536621N00613084EA0210402141
+B1058234536615N00613101EA0211202147
+B1058254536617N00613111EA0212002155
+B1058274536627N00613112EA0212502160
+B1058294536637N00613103EA0213102167
+B1058314536639N00613085EA0213602172
+B1058334536631N00613070EA0214502179
+B1058354536622N00613070EA0215102186
+B1058374536614N00613077EA0215802193
+B1058394536609N00613087EA0216302200
+B1058414536608N00613099EA0216602204
+B1058434536613N00613114EA0216502208
+B1058454536624N00613122EA0216602209
+B1058474536638N00613118EA0216602209
+B1058494536648N00613102EA0216802209
+B1058514536653N00613079EA0217302213
+B1058534536657N00613059EA0217902217
+B1058554536659N00613041EA0218402221
+B1058574536661N00613020EA0219302227
+B1058594536661N00613004EA0220102234
+B1059014536659N00612994EA0220402239
+B1059034536654N00612984EA0220802243
+B1059054536645N00612978EA0221202248
+B1059074536635N00612986EA0221602252
+B1059094536632N00613001EA0222202257
+B1059114536639N00613009EA0222602262
+B1059134536652N00612995EA0223102267
+B1059154536655N00612973EA0224002273
+B1059174536648N00612958EA0224502279
+B1059194536638N00612953EA0225102286
+B1059214536628N00612953EA0225402291
+B1059234536623N00612964EA0225802295
+B1059254536627N00612976EA0226302300
+B1059274536638N00612975EA0226702304
+B1059294536647N00612957EA0227302309
+B1059314536647N00612935EA0227702313
+B1059334536641N00612917EA0228202318
+B1059354536631N00612908EA0228702323
+B1059374536622N00612908EA0229102326
+B1059394536619N00612919EA0229202330
+B1059414536630N00612927EA0229402331
+B1059434536643N00612922EA0230002336
+B1059454536650N00612906EA0230302340
+B1059474536654N00612887EA0230702343
+B1059494536655N00612869EA0230802346
+B1059514536655N00612851EA0230902348
+B1059534536652N00612833EA0231102350
+B1059554536649N00612817EA0231102351
+B1059574536645N00612804EA0230802351
+B1059594536639N00612792EA0230602350
+B1100014536635N00612777EA0230302347
+B1100034536631N00612762EA0230002344
+B1100054536626N00612747EA0229502341
+B1100074536619N00612732EA0229302338
+B1100094536614N00612718EA0228702334
+B1100114536607N00612704EA0228102328
+B1100134536600N00612689EA0227702323
+B1100154536593N00612674EA0227202318
+B1100174536587N00612659EA0226702312
+B1100194536580N00612643EA0226302307
+B1100214536575N00612625EA0226102303
+B1100234536570N00612608EA0226102301
+B1100254536563N00612595EA0226102301
+B1100274536558N00612582EA0226002299
+B1100294536551N00612569EA0226302300
+B1100314536544N00612558EA0226802301
+B1100334536538N00612550EA0227102305
+B1100354536531N00612543EA0227302307
+B1100374536522N00612535EA0227902311
+B1100394536514N00612528EA0228502316
+B1100414536506N00612521EA0228902321
+B1100434536499N00612513EA0229302326
+B1100454536491N00612507EA0229902332
+B1100474536482N00612508EA0230202336
+B1100494536476N00612520EA0230202340
+B1100514536479N00612539EA0230402343
+B1100534536491N00612543EA0230602346
+B1100554536504N00612533EA0230902349
+B1100574536512N00612518EA0231602354
+B1100594536516N00612498EA0232202360
+B1101014536516N00612481EA0232602365
+B1101034536513N00612465EA0232902368
+B1101054536504N00612455EA0232902371
+B1101074536493N00612451EA0232902372
+B1101094536483N00612448EA0232902372
+B1101114536474N00612445EA0233002372
+B1101134536466N00612438EA0233102373
+B1101154536459N00612430EA0233402375
+B1101174536453N00612422EA0233502377
+B1101194536447N00612411EA0233402377
+B1101214536442N00612397EA0233502377
+B1101234536435N00612384EA0233902379
+B1101254536429N00612372EA0234002382
+B1101274536423N00612363EA0233502382
+B1101294536415N00612352EA0233002380
+B1101314536408N00612339EA0232902378
+B1101334536401N00612326EA0232702376
+B1101354536394N00612315EA0232402372
+B1101374536387N00612303EA0232102369
+B1101394536380N00612291EA0232202367
+B1101414536373N00612278EA0232702366
+B1101434536367N00612268EA0233202368
+B1101454536360N00612260EA0233502372
+B1101474536353N00612252EA0233602373
+B1101494536345N00612241EA0233602374
+B1101514536336N00612229EA0234102376
+B1101534536329N00612217EA0234702381
+B1101554536324N00612204EA0235002386
+B1101574536319N00612191EA0235102388
+B1101594536312N00612180EA0235302390
+B1102014536305N00612169EA0235402392
+B1102034536298N00612158EA0235202392
+B1102054536289N00612146EA0234802391
+B1102074536280N00612136EA0234602388
+B1102094536271N00612124EA0234502387
+B1102114536264N00612110EA0234302385
+B1102134536256N00612094EA0234202384
+B1102154536249N00612080EA0234302384
+B1102174536242N00612067EA0234302384
+B1102194536236N00612054EA0234102383
+B1102214536228N00612042EA0233802381
+B1102234536220N00612029EA0233702379
+B1102254536211N00612015EA0233702378
+B1102274536203N00612002EA0233702378
+B1102294536196N00611989EA0233702378
+B1102314536188N00611976EA0233702378
+B1102334536181N00611963EA0233502377
+B1102354536174N00611950EA0233302374
+B1102374536166N00611935EA0233002372
+B1102394536158N00611921EA0232902370
+B1102414536149N00611907EA0232702368
+B1102434536139N00611894EA0232502367
+B1102454536129N00611882EA0232302365
+B1102474536118N00611869EA0232102363
+B1102494536108N00611855EA0232002361
+B1102514536099N00611840EA0231702359
+B1102534536090N00611824EA0231502356
+B1102554536081N00611806EA0231302354
+B1102574536073N00611790EA0231002351
+B1102594536066N00611772EA0230602348
+B1103014536058N00611754EA0230502345
+B1103034536051N00611737EA0230402344
+B1103054536045N00611720EA0230202342
+B1103074536038N00611704EA0230002340
+B1103094536030N00611686EA0229902338
+B1103114536022N00611670EA0229902338
+B1103134536014N00611654EA0229802337
+B1103154536006N00611637EA0229602335
+B1103174536000N00611619EA0229402334
+B1103194535993N00611601EA0229202332
+B1103214535986N00611582EA0228802329
+B1103234535980N00611562EA0228702326
+B1103254535974N00611541EA0228602325
+B1103274535969N00611521EA0228502324
+B1103294535964N00611501EA0228202322
+B1103314535959N00611481EA0227902319
+B1103334535952N00611460EA0227802317
+B1103354535947N00611440EA0227602315
+B1103374535941N00611421EA0227502313
+B1103394535935N00611401EA0227402312
+B1103414535929N00611382EA0227202311
+B1103434535924N00611363EA0227102310
+B1103454535918N00611344EA0227002309
+B1103474535912N00611324EA0227102308
+B1103494535905N00611305EA0227302309
+B1103514535900N00611288EA0227302310
+B1103534535894N00611272EA0227102309
+B1103554535888N00611255EA0226902308
+B1103574535882N00611238EA0226802306
+B1103594535876N00611220EA0226702305
+B1104014535870N00611202EA0226502303
+B1104034535865N00611183EA0226302302
+B1104054535860N00611165EA0226202300
+B1104074535855N00611147EA0226002298
+B1104094535851N00611129EA0225802297
+B1104114535847N00611110EA0225602295
+B1104134535842N00611093EA0225402293
+B1104154535837N00611074EA0225202291
+B1104174535832N00611056EA0224902288
+B1104194535828N00611038EA0224602285
+B1104214535824N00611020EA0224202281
+B1104234535819N00611001EA0224002278
+B1104254535815N00610982EA0223902277
+B1104274535812N00610964EA0223602275
+B1104294535809N00610947EA0223202272
+B1104314535805N00610927EA0223002269
+B1104334535802N00610909EA0222902267
+B1104354535799N00610892EA0222602265
+B1104374535794N00610874EA0222502262
+B1104394535790N00610856EA0222502261
+B1104414535787N00610840EA0222502261
+B1104434535785N00610825EA0222202260
+B1104454535781N00610810EA0221702257
+B1104474535775N00610793EA0221502254
+B1104494535769N00610775EA0221602252
+B1104514535765N00610758EA0221702253
+B1104534535762N00610743EA0221602253
+B1104554535758N00610727EA0221702253
+B1104574535756N00610711EA0221702253
+B1104594535754N00610697EA0221602253
+B1105014535750N00610680EA0221602253
+B1105034535746N00610663EA0221702253
+B1105054535741N00610648EA0221602254
+B1105074535735N00610635EA0221602253
+B1105094535729N00610620EA0221502252
+B1105114535724N00610603EA0221502252
+B1105134535718N00610588EA0221602253
+B1105154535713N00610572EA0221602253
+B1105174535707N00610554EA0221602253
+B1105194535701N00610536EA0221802254
+B1105214535694N00610518EA0222002256
+B1105234535687N00610502EA0222002257
+B1105254535680N00610485EA0222002257
+B1105274535673N00610467EA0222102258
+B1105294535667N00610450EA0222302259
+B1105314535661N00610433EA0222502261
+B1105334535654N00610416EA0222802263
+B1105354535646N00610399EA0223302267
+B1105374535638N00610385EA0223602271
+B1105394535630N00610371EA0223802273
+B1105414535622N00610358EA0223902275
+B1105434535616N00610343EA0223802275
+B1105454535611N00610327EA0223702275
+B1105474535606N00610312EA0223602274
+B1105494535601N00610295EA0223302271
+B1105514535596N00610277EA0223202269
+B1105534535591N00610259EA0223002268
+B1105554535588N00610240EA0222902266
+B1105574535585N00610221EA0222602264
+B1105594535581N00610204EA0222302262
+B1106014535577N00610187EA0222002258
+B1106034535573N00610170EA0221502254
+B1106054535568N00610153EA0221102250
+B1106074535563N00610135EA0220602245
+B1106094535559N00610117EA0220302241
+B1106114535554N00610100EA0219902237
+B1106134535550N00610082EA0219402232
+B1106154535546N00610064EA0219102228
+B1106174535543N00610046EA0218802225
+B1106194535538N00610028EA0218502222
+B1106214535533N00610011EA0218102218
+B1106234535526N00609994EA0217902215
+B1106254535519N00609978EA0217702213
+B1106274535514N00609960EA0217502211
+B1106294535507N00609943EA0217202208
+B1106314535499N00609927EA0216802205
+B1106334535493N00609907EA0216402201
+B1106354535488N00609885EA0216202198
+B1106374535483N00609863EA0216002196
+B1106394535480N00609842EA0215802194
+B1106414535477N00609821EA0215402191
+B1106434535475N00609800EA0215202188
+B1106454535472N00609780EA0214902185
+B1106474535468N00609760EA0214302181
+B1106494535464N00609739EA0214002177
+B1106514535461N00609716EA0213902174
+B1106534535457N00609695EA0213602172
+B1106554535455N00609675EA0213002169
+B1106574535455N00609653EA0212502163
+B1106594535455N00609630EA0212202160
+B1107014535457N00609608EA0211902156
+B1107034535457N00609586EA0211502153
+B1107054535456N00609563EA0211202149
+B1107074535456N00609540EA0210802146
+B1107094535457N00609517EA0210502142
+B1107114535456N00609493EA0210102139
+B1107134535456N00609469EA0210002136
+B1107154535457N00609445EA0209902135
+B1107174535457N00609423EA0209602133
+B1107194535459N00609400EA0209202129
+B1107214535462N00609376EA0208902126
+B1107234535465N00609352EA0208802124
+B1107254535468N00609330EA0208602122
+B1107274535471N00609308EA0208402119
+B1107294535474N00609285EA0208202117
+B1107314535477N00609261EA0208102116
+B1107334535478N00609238EA0207902115
+B1107354535479N00609216EA0207702113
+B1107374535480N00609193EA0207402110
+B1107394535479N00609170EA0207202108
+B1107414535479N00609148EA0207102107
+B1107434535477N00609126EA0206802105
+B1107454535475N00609104EA0206602102
+B1107474535475N00609081EA0206402100
+B1107494535477N00609061EA0206302098
+B1107514535477N00609043EA0205802095
+B1107534535477N00609023EA0205302091
+B1107554535474N00609002EA0205002087
+B1107574535472N00608982EA0204802085
+B1107594535470N00608963EA0204502082
+B1108014535468N00608942EA0204302079
+B1108034535465N00608922EA0204002076
+B1108054535463N00608902EA0203702073
+B1108074535463N00608881EA0203502071
+B1108094535461N00608861EA0203302069
+B1108114535458N00608842EA0203102067
+B1108134535457N00608823EA0202902064
+B1108154535455N00608803EA0202702062
+B1108174535453N00608783EA0202402060
+B1108194535451N00608764EA0202102058
+B1108214535449N00608744EA0201902055
+B1108234535447N00608724EA0201702053
+B1108254535445N00608705EA0201502051
+B1108274535444N00608686EA0201202048
+B1108294535442N00608665EA0200902045
+B1108314535440N00608644EA0200802044
+B1108334535438N00608626EA0200602042
+B1108354535437N00608606EA0200302039
+B1108374535436N00608585EA0200202037
+B1108394535435N00608565EA0200102035
+B1108414535434N00608546EA0199902034
+B1108434535433N00608527EA0199602031
+B1108454535433N00608507EA0199502030
+B1108474535433N00608488EA0199402028
+B1108494535433N00608469EA0199202026
+B1108514535434N00608450EA0199002025
+B1108534535434N00608431EA0198802024
+B1108554535432N00608412EA0198602022
+B1108574535429N00608393EA0198402020
+B1108594535427N00608374EA0198202018
+B1109014535424N00608356EA0197902015
+B1109034535419N00608338EA0197602012
+B1109054535413N00608320EA0197302009
+B1109074535406N00608303EA0197102006
+B1109094535401N00608284EA0196702002
+B1109114535395N00608265EA0196502000
+B1109134535389N00608247EA0196301998
+B1109154535383N00608230EA0195801994
+B1109174535378N00608211EA0195401990
+B1109194535372N00608190EA0195201987
+B1109214535367N00608170EA0195101984
+B1109234535364N00608150EA0194801982
+B1109254535360N00608129EA0194601979
+B1109274535355N00608107EA0194401978
+B1109294535351N00608088EA0194401977
+B1109314535347N00608068EA0194101975
+B1109334535345N00608048EA0194001973
+B1109354535345N00608027EA0193801972
+B1109374535346N00608007EA0193601970
+B1109394535348N00607987EA0193201967
+B1109414535349N00607966EA0192901963
+B1109434535352N00607945EA0192601961
+B1109454535354N00607925EA0192501959
+B1109474535356N00607906EA0192301957
+B1109494535357N00607886EA0192101955
+B1109514535358N00607867EA0191801952
+B1109534535359N00607847EA0191401949
+B1109554535361N00607827EA0191101945
+B1109574535362N00607807EA0190701941
+B1109594535362N00607787EA0190301938
+B1110014535364N00607767EA0190001934
+B1110034535364N00607748EA0189701932
+B1110054535365N00607728EA0189501929
+B1110074535365N00607709EA0189201926
+B1110094535365N00607689EA0189001924
+B1110114535364N00607669EA0188901922
+B1110134535365N00607651EA0188601920
+B1110154535366N00607633EA0188201916
+B1110174535367N00607614EA0188001914
+B1110194535368N00607595EA0187801912
+B1110214535369N00607578EA0187401909
+B1110234535370N00607559EA0187101905
+B1110254535372N00607539EA0186901902
+B1110274535372N00607521EA0186601900
+B1110294535372N00607503EA0186301897
+B1110314535372N00607485EA0186001894
+B1110334535372N00607467EA0185701891
+B1110354535373N00607448EA0185401888
+B1110374535373N00607430EA0185001885
+B1110394535372N00607412EA0184601881
+B1110414535370N00607393EA0184101876
+B1110434535368N00607374EA0183701872
+B1110454535367N00607355EA0183401868
+B1110474535366N00607338EA0183001865
+B1110494535365N00607320EA0182701861
+B1110514535365N00607301EA0182401857
+B1110534535367N00607283EA0182201855
+B1110554535368N00607266EA0182001853
+B1110574535370N00607249EA0181701850
+B1110594535372N00607232EA0181401847
+B1111014535375N00607215EA0181201845
+B1111034535377N00607198EA0180901842
+B1111054535379N00607181EA0180601840
+B1111074535382N00607164EA0180301837
+B1111094535386N00607147EA0180001834
+B1111114535388N00607130EA0179701831
+B1111134535389N00607113EA0179301827
+B1111154535391N00607095EA0179001823
+B1111174535395N00607078EA0178801821
+B1111194535399N00607063EA0178701819
+B1111214535402N00607050EA0178401816
+B1111234535405N00607035EA0178001813
+B1111254535409N00607019EA0177601809
+B1111274535410N00607003EA0177201806
+B1111294535412N00606986EA0176901802
+B1111314535416N00606971EA0176401798
+B1111334535420N00606955EA0176001793
+B1111354535423N00606937EA0175601790
+B1111374535427N00606920EA0175301786
+B1111394535432N00606904EA0174901782
+B1111414535438N00606888EA0174601779
+B1111434535444N00606873EA0174301776
+B1111454535450N00606857EA0173901772
+B1111474535455N00606840EA0173601769
+B1111494535460N00606824EA0173401766
+B1111514535466N00606809EA0173101764
+B1111534535470N00606793EA0172801761
+B1111554535475N00606776EA0172501758
+B1111574535480N00606761EA0172101755
+B1111594535486N00606747EA0171601750
+B1112014535494N00606733EA0171101746
+B1112034535503N00606720EA0170701741
+B1112054535513N00606710EA0170301738
+B1112074535524N00606705EA0169901733
+B1112094535535N00606699EA0169401728
+B1112114535547N00606689EA0169101724
+B1112134535557N00606677EA0168801721
+B1112154535567N00606666EA0168501717
+B1112174535578N00606657EA0168301715
+B1112194535588N00606652EA0167901711
+B1112214535599N00606656EA0167401706
+B1112234535608N00606665EA0167001702
+B1112254535615N00606675EA0166501698
+B1112274535623N00606687EA0166101693
+B1112294535631N00606700EA0166201689
+B1112314535639N00606711EA0166401688
+B1112334535645N00606721EA0166301688
+B1112354535653N00606728EA0166001686
+B1112374535662N00606736EA0165501683
+B1112394535672N00606745EA0165201680
+B1112414535682N00606755EA0165201679
+B1112434535691N00606765EA0165301679
+B1112454535700N00606773EA0165401679
+B1112474535710N00606783EA0165601680
+B1112494535719N00606794EA0166001683
+B1112514535728N00606805EA0166801687
+B1112534535737N00606814EA0167401694
+B1112554535745N00606822EA0168101700
+B1112574535753N00606827EA0168801707
+B1112594535760N00606825EA0168901713
+B1113014535760N00606810EA0169001718
+B1113034535750N00606799EA0169401723
+B1113054535736N00606807EA0169901727
+B1113074535732N00606826EA0170801735
+B1113094535733N00606843EA0171601744
+B1113114535738N00606857EA0172201751
+B1113134535746N00606869EA0172901757
+B1113154535757N00606877EA0173601764
+B1113174535767N00606872EA0174301771
+B1113194535768N00606861EA0174801777
+B1113214535761N00606850EA0175501784
+B1113234535751N00606846EA0176101791
+B1113254535741N00606859EA0176501797
+B1113274535737N00606882EA0177301803
+B1113294535744N00606899EA0178101810
+B1113314535755N00606906EA0178701816
+B1113334535766N00606904EA0179201823
+B1113354535772N00606893EA0179501828
+B1113374535771N00606879EA0180001833
+B1113394535763N00606872EA0180401838
+B1113414535753N00606870EA0181001843
+B1113434535742N00606875EA0181501847
+B1113454535736N00606894EA0182101852
+B1113474535738N00606914EA0183001858
+B1113494535748N00606926EA0183801866
+B1113514535756N00606933EA0184301874
+B1113534535760N00606946EA0184401879
+B1113554535753N00606962EA0184501884
+B1113574535741N00606966EA0184501886
+B1113594535731N00606956EA0184301887
+B1114014535722N00606943EA0184201885
+B1114034535712N00606935EA0184001883
+B1114054535702N00606926EA0183701879
+B1114074535699N00606906EA0183301875
+B1114094535706N00606887EA0183601872
+B1114114535717N00606875EA0184401873
+B1114134535725N00606866EA0185201876
+B1114154535730N00606856EA0185601880
+B1114174535735N00606846EA0186001885
+B1114194535743N00606844EA0186601890
+B1114214535751N00606849EA0187201897
+B1114234535754N00606859EA0187301901
+B1114254535752N00606878EA0187401904
+B1114274535742N00606894EA0188101909
+B1114294535730N00606895EA0188701914
+B1114314535723N00606881EA0189301920
+B1114334535726N00606865EA0189701926
+B1114354535737N00606860EA0189801930
+B1114374535750N00606870EA0190301933
+B1114394535757N00606884EA0191101939
+B1114414535761N00606896EA0191601945
+B1114434535767N00606910EA0192201950
+B1114454535766N00606928EA0193101956
+B1114474535755N00606937EA0193501963
+B1114494535745N00606927EA0194101968
+B1114514535746N00606908EA0195001976
+B1114534535757N00606903EA0195801984
+B1114554535768N00606914EA0196501992
+B1114574535769N00606933EA0197301999
+B1114594535760N00606944EA0197802007
+B1115014535749N00606941EA0198202011
+B1115034535739N00606933EA0198702015
+B1115054535732N00606920EA0199302021
+B1115074535728N00606904EA0199902027
+B1115094535731N00606892EA0200502033
+B1115114535737N00606887EA0200702038
+B1115134535745N00606887EA0201002041
+B1115154535755N00606895EA0201502045
+B1115174535756N00606911EA0202002050
+B1115194535749N00606925EA0202802056
+B1115214535739N00606933EA0203602064
+B1115234535730N00606940EA0204002070
+B1115254535718N00606938EA0204302075
+B1115274535708N00606923EA0204702080
+B1115294535705N00606906EA0205102084
+B1115314535708N00606891EA0205202086
+B1115334535717N00606878EA0205302088
+B1115354535731N00606877EA0205402088
+B1115374535744N00606883EA0205802091
+B1115394535751N00606894EA0206002093
+B1115414535754N00606911EA0206102094
+B1115434535751N00606932EA0207002097
+B1115454535745N00606949EA0208002103
+B1115474535742N00606961EA0208502109
+B1115494535739N00606970EA0208602114
+B1115514535733N00606978EA0208302116
+B1115534535723N00606983EA0208402117
+B1115554535713N00606981EA0208302117
+B1115574535703N00606973EA0208302116
+B1115594535693N00606964EA0208802117
+B1116014535686N00606955EA0209302120
+B1116034535679N00606946EA0209602124
+B1116054535672N00606936EA0209802127
+B1116074535668N00606918EA0209702128
+B1116094535676N00606902EA0209902129
+B1116114535688N00606900EA0210202131
+B1116134535696N00606910EA0210402134
+B1116154535699N00606926EA0210902137
+B1116174535696N00606941EA0211602142
+B1116194535690N00606954EA0211902148
+B1116214535682N00606961EA0211902151
+B1116234535667N00606958EA0211802153
+B1116254535655N00606947EA0212202155
+B1116274535651N00606932EA0212402157
+B1116294535655N00606920EA0212502159
+B1116314535663N00606916EA0212402158
+B1116334535673N00606922EA0212702158
+B1116354535683N00606926EA0213102161
+B1116374535691N00606925EA0213302164
+B1116394535700N00606922EA0213202166
+B1116414535710N00606916EA0213502167
+B1116434535719N00606908EA0214002171
+B1116454535725N00606900EA0214302175
+B1116474535730N00606890EA0214402177
+B1116494535734N00606877EA0214802180
+B1116514535735N00606862EA0215202184
+B1116534535738N00606853EA0215402188
+B1116554535747N00606848EA0215302190
+B1116574535758N00606856EA0215502191
+B1116594535761N00606873EA0215702193
+B1117014535758N00606889EA0216002196
+B1117034535749N00606898EA0216402199
+B1117054535738N00606896EA0216902202
+B1117074535730N00606885EA0217202206
+B1117094535729N00606870EA0217602209
+B1117114535733N00606859EA0217902213
+B1117134535741N00606853EA0218202216
+B1117154535751N00606855EA0218402219
+B1117174535761N00606863EA0218502221
+B1117194535767N00606881EA0218502222
+B1117214535762N00606900EA0218702223
+B1117234535752N00606912EA0219102226
+B1117254535741N00606921EA0219702231
+B1117274535732N00606928EA0219902235
+B1117294535723N00606932EA0219802236
+B1117314535712N00606933EA0219702237
+B1117334535701N00606926EA0219802236
+B1117354535693N00606913EA0220102238
+B1117374535689N00606900EA0220402241
+B1117394535688N00606888EA0220602242
+B1117414535685N00606875EA0220802244
+B1117434535682N00606862EA0221002246
+B1117454535682N00606849EA0221102248
+B1117474535687N00606838EA0221302249
+B1117494535694N00606830EA0221402251
+B1117514535702N00606825EA0221402251
+B1117534535711N00606820EA0221302251
+B1117554535722N00606821EA0221402251
+B1117574535732N00606831EA0221502252
+B1117594535741N00606842EA0221602253
+B1118014535749N00606854EA0221602254
+B1118034535756N00606867EA0221602254
+B1118054535759N00606883EA0221702254
+B1118074535753N00606900EA0222102255
+B1118094535746N00606910EA0222302257
+B1118114535741N00606920EA0222202256
+B1118134535736N00606929EA0222102256
+B1118154535727N00606931EA0221702254
+B1118174535715N00606927EA0221602252
+B1118194535703N00606922EA0221802252
+B1118214535691N00606919EA0222002254
+B1118234535680N00606916EA0222202256
+B1118254535671N00606910EA0222302257
+B1118274535661N00606903EA0222402258
+B1118294535651N00606896EA0222702261
+B1118314535641N00606889EA0222802263
+B1118334535631N00606882EA0222902264
+B1118354535620N00606874EA0222902264
+B1118374535612N00606864EA0223002265
+B1118394535606N00606851EA0222902265
+B1118414535600N00606836EA0223002265
+B1118434535595N00606821EA0223002265
+B1118454535590N00606804EA0223002265
+B1118474535585N00606787EA0222802264
+B1118494535582N00606770EA0222502263
+B1118514535578N00606751EA0222102260
+B1118534535574N00606731EA0221802256
+B1118554535569N00606711EA0221502253
+B1118574535565N00606691EA0221302250
+B1118594535562N00606670EA0220902247
+B1119014535557N00606650EA0220602244
+B1119034535551N00606631EA0220402242
+B1119054535546N00606613EA0220002238
+B1119074535539N00606594EA0219602234
+B1119094535532N00606574EA0219102230
+B1119114535523N00606556EA0218902227
+B1119134535513N00606540EA0218502223
+B1119154535503N00606523EA0218002218
+B1119174535495N00606504EA0217502213
+B1119194535486N00606486EA0217102209
+B1119214535476N00606469EA0216502203
+B1119234535466N00606451EA0216002197
+B1119254535455N00606432EA0215902193
+B1119274535447N00606415EA0215802191
+B1119294535438N00606400EA0215502188
+B1119314535428N00606383EA0215202184
+B1119334535417N00606367EA0215002183
+B1119354535406N00606354EA0214702181
+B1119374535395N00606340EA0214502178
+B1119394535385N00606325EA0214202175
+B1119414535374N00606309EA0213902172
+B1119434535363N00606292EA0213702169
+B1119454535353N00606275EA0213502168
+B1119474535344N00606259EA0213302166
+B1119494535334N00606242EA0213102163
+B1119514535325N00606226EA0212802161
+B1119534535316N00606207EA0212602159
+B1119554535308N00606188EA0212602158
+B1119574535300N00606170EA0212402157
+B1119594535292N00606152EA0212202155
+B1120014535283N00606133EA0212202154
+B1120034535274N00606116EA0212002153
+B1120054535266N00606100EA0211802151
+B1120074535257N00606082EA0211602149
+B1120094535247N00606064EA0211502148
+B1120114535237N00606047EA0211302147
+B1120134535229N00606030EA0211102145
+B1120154535220N00606012EA0210902142
+B1120174535210N00605995EA0210802141
+B1120194535200N00605979EA0210602140
+B1120214535191N00605962EA0210502138
+B1120234535182N00605946EA0210202137
+B1120254535172N00605929EA0210002136
+B1120274535162N00605914EA0209602134
+B1120294535152N00605898EA0209502133
+B1120314535142N00605883EA0209302131
+B1120334535132N00605868EA0209002129
+B1120354535122N00605852EA0208902127
+B1120374535112N00605837EA0208802126
+B1120394535102N00605823EA0208602124
+B1120414535092N00605807EA0208402122
+B1120434535082N00605791EA0208202120
+B1120454535073N00605775EA0208102118
+B1120474535064N00605759EA0207902116
+B1120494535055N00605743EA0207702114
+B1120514535045N00605727EA0207402111
+B1120534535036N00605710EA0207202109
+B1120554535028N00605693EA0207102107
+B1120574535019N00605676EA0206902105
+B1120594535011N00605659EA0206602103
+B1121014535002N00605643EA0206402100
+B1121034534993N00605626EA0206102097
+B1121054534984N00605609EA0205802094
+B1121074534975N00605592EA0205402091
+B1121094534966N00605574EA0205602088
+B1121114534957N00605556EA0205002085
+B1121134534947N00605539EA0204802083
+B1121154534938N00605522EA0204602080
+B1121174534930N00605504EA0204302078
+B1121194534920N00605488EA0204102075
+B1121214534911N00605472EA0203802073
+B1121234534901N00605456EA0203602071
+B1121254534890N00605442EA0203302069
+B1121274534878N00605428EA0203202066
+B1121294534868N00605414EA0202902064
+B1121314534856N00605401EA0202702062
+B1121334534844N00605388EA0202602060
+B1121354534833N00605375EA0202402059
+B1121374534822N00605361EA0202202057
+B1121394534811N00605347EA0202002055
+B1121414534800N00605334EA0201902053
+B1121434534789N00605322EA0201702052
+B1121454534778N00605310EA0201402050
+B1121474534768N00605294EA0201502048
+B1121494534758N00605278EA0201402048
+B1121514534749N00605263EA0201402047
+B1121534534738N00605250EA0201202046
+B1121554534727N00605238EA0201102045
+B1121574534715N00605227EA0201102045
+B1121594534705N00605215EA0201102044
+B1122014534694N00605202EA0200902042
+B1122034534683N00605188EA0200902041
+B1122054534673N00605175EA0200702041
+B1122074534663N00605161EA0200502039
+B1122094534653N00605147EA0200302037
+B1122114534644N00605131EA0200102035
+B1122134534635N00605115EA0199802033
+B1122154534626N00605098EA0199602031
+B1122174534617N00605080EA0199402029
+B1122194534608N00605063EA0199302028
+B1122214534599N00605046EA0199302027
+B1122234534591N00605030EA0199202026
+B1122254534581N00605014EA0199002025
+B1122274534571N00605000EA0199002024
+B1122294534561N00604986EA0198802022
+B1122314534551N00604971EA0198702021
+B1122334534541N00604956EA0198602019
+B1122354534531N00604942EA0198402018
+B1122374534521N00604928EA0198402017
+B1122394534511N00604914EA0198302016
+B1122414534501N00604900EA0198202015
+B1122434534490N00604886EA0198102014
+B1122454534479N00604873EA0198002013
+B1122474534469N00604860EA0197802011
+B1122494534459N00604847EA0197602009
+B1122514534448N00604835EA0197302007
+B1122534534437N00604823EA0197102005
+B1122554534426N00604811EA0196902003
+B1122574534416N00604799EA0196702000
+B1122594534405N00604786EA0196601998
+B1123014534395N00604773EA0196301996
+B1123034534385N00604760EA0196001994
+B1123054534375N00604748EA0195701991
+B1123074534364N00604734EA0195401987
+B1123094534354N00604721EA0195201985
+B1123114534344N00604708EA0195001983
+B1123134534336N00604694EA0194801981
+B1123154534327N00604680EA0194601979
+B1123174534318N00604667EA0194401977
+B1123194534308N00604658EA0194101974
+B1123214534298N00604647EA0193801971
+B1123234534287N00604635EA0193601969
+B1123254534277N00604623EA0193401967
+B1123274534268N00604609EA0193301965
+B1123294534259N00604594EA0193101963
+B1123314534249N00604581EA0192901961
+B1123334534239N00604568EA0192701958
+B1123354534228N00604556EA0192501957
+B1123374534218N00604544EA0192301955
+B1123394534208N00604534EA0191901952
+B1123414534198N00604523EA0191601948
+B1123434534187N00604509EA0191301946
+B1123454534178N00604493EA0191101943
+B1123474534170N00604478EA0190901941
+B1123494534160N00604464EA0190801939
+B1123514534152N00604451EA0190501937
+B1123534534143N00604438EA0190301934
+B1123554534133N00604427EA0190101932
+B1123574534123N00604415EA0189901931
+B1123594534114N00604404EA0189701929
+B1124014534105N00604394EA0189501926
+B1124034534096N00604383EA0189501924
+B1124054534085N00604373EA0189801924
+B1124074534076N00604366EA0189901925
+B1124094534070N00604359EA0189701924
+B1124114534062N00604352EA0189701923
+B1124134534052N00604344EA0190001925
+B1124154534045N00604332EA0190401928
+B1124174534040N00604321EA0190601932
+B1124194534033N00604311EA0190501933
+B1124214534023N00604301EA0190101933
+B1124234534013N00604290EA0190101932
+B1124254534004N00604281EA0190401934
+B1124274533996N00604273EA0190801938
+B1124294533990N00604265EA0191001941
+B1124314533984N00604255EA0191201943
+B1124334533976N00604246EA0191401945
+B1124354533967N00604242EA0191601947
+B1124374533960N00604253EA0191601948
+B1124394533962N00604268EA0191701949
+B1124414533972N00604275EA0192001951
+B1124434533981N00604269EA0192101953
+B1124454533987N00604255EA0192401955
+B1124474533989N00604241EA0193001959
+B1124494533988N00604229EA0193301962
+B1124514533985N00604217EA0193601964
+B1124534533977N00604208EA0194001967
+B1124554533968N00604219EA0194301971
+B1124574533971N00604236EA0194401974
+B1124594533984N00604235EA0194401975
+B1125014533994N00604223EA0194801978
+B1125034533997N00604209EA0195101981
+B1125054533996N00604193EA0195501984
+B1125074533991N00604176EA0196201989
+B1125094533984N00604163EA0196801996
+B1125114533976N00604153EA0197302001
+B1125134533966N00604147EA0197702006
+B1125154533954N00604157EA0198102009
+B1125174533954N00604173EA0198502013
+B1125194533965N00604181EA0199102017
+B1125214533975N00604181EA0199802023
+B1125234533981N00604170EA0200202028
+B1125254533983N00604155EA0200902034
+B1125274533979N00604139EA0201302040
+B1125294533969N00604131EA0201502044
+B1125314533958N00604131EA0201902048
+B1125334533950N00604139EA0202302054
+B1125354533951N00604151EA0202602057
+B1125374533958N00604159EA0203102062
+B1125394533968N00604159EA0203602067
+B1125414533975N00604147EA0204102072
+B1125434533978N00604132EA0204602078
+B1125454533975N00604118EA0204702082
+B1125474533969N00604104EA0204902084
+B1125494533959N00604095EA0205202087
+B1125514533949N00604094EA0205402089
+B1125534533941N00604100EA0205502091
+B1125554533938N00604109EA0205602093
+B1125574533940N00604120EA0205802095
+B1125594533944N00604127EA0205902096
+B1126014533951N00604133EA0206302098
+B1126034533957N00604141EA0206902102
+B1126054533960N00604149EA0207202106
+B1126074533963N00604155EA0207102108
+B1126094533971N00604157EA0206702109
+B1126114533982N00604150EA0206602109
+B1126134533987N00604132EA0206602107
+B1126154533986N00604114EA0206902107
+B1126174533983N00604098EA0207102108
+B1126194533977N00604084EA0207202109
+B1126214533967N00604074EA0207102108
+B1126234533956N00604069EA0207302110
+B1126254533946N00604068EA0207402111
+B1126274533936N00604071EA0207402110
+B1126294533925N00604074EA0207302109
+B1126314533914N00604061EA0207102108
+B1126334533913N00604041EA0207102106
+B1126354533921N00604028EA0207002104
+B1126374533931N00604022EA0207002103
+B1126394533941N00604024EA0206902102
+B1126414533948N00604035EA0206802100
+B1126434533952N00604048EA0206902100
+B1126454533956N00604060EA0206802100
+B1126474533958N00604071EA0206802099
+B1126494533960N00604083EA0207002100
+B1126514533961N00604093EA0207102101
+B1126534533963N00604102EA0207302103
+B1126554533964N00604111EA0207302104
+B1126574533966N00604121EA0207302104
+B1126594533967N00604130EA0207102103
+B1127014533964N00604139EA0206802102
+B1127034533956N00604147EA0206602099
+B1127054533943N00604148EA0206502097
+B1127074533930N00604143EA0206402096
+B1127094533917N00604135EA0206302094
+B1127114533903N00604127EA0206202092
+B1127134533890N00604118EA0206002091
+B1127154533877N00604108EA0205702088
+B1127174533864N00604099EA0205402084
+B1127194533849N00604088EA0205202082
+B1127214533835N00604079EA0205102080
+B1127234533821N00604069EA0204902079
+B1127254533808N00604059EA0204702076
+B1127274533794N00604048EA0204502074
+B1127294533781N00604038EA0204102072
+B1127314533768N00604027EA0203602068
+B1127334533754N00604017EA0203302064
+B1127354533741N00604006EA0203002062
+B1127374533729N00603995EA0202602058
+B1127394533716N00603985EA0202102053
+B1127414533703N00603973EA0201802049
+B1127434533691N00603963EA0201602046
+B1127454533679N00603952EA0201302044
+B1127474533668N00603941EA0201002041
+B1127494533656N00603931EA0200702038
+B1127514533644N00603921EA0200602036
+B1127534533633N00603911EA0200302034
+B1127554533622N00603902EA0200102031
+B1127574533610N00603892EA0199802029
+B1127594533599N00603883EA0199502027
+B1128014533587N00603874EA0199102023
+B1128034533576N00603866EA0198802020
+B1128054533565N00603856EA0198602018
+B1128074533555N00603844EA0198202014
+B1128094533544N00603836EA0197702010
+B1128114533532N00603828EA0197202006
+B1128134533521N00603819EA0196902002
+B1128154533509N00603809EA0196701999
+B1128174533498N00603800EA0196401996
+B1128194533486N00603791EA0196001993
+B1128214533474N00603781EA0195701989
+B1128234533461N00603771EA0195601987
+B1128254533449N00603761EA0195701986
+B1128274533438N00603749EA0195601986
+B1128294533427N00603738EA0195501984
+B1128314533414N00603729EA0195501984
+B1128334533402N00603720EA0195501984
+B1128354533390N00603711EA0195401984
+B1128374533380N00603703EA0195501984
+B1128394533370N00603694EA0195401985
+B1128414533362N00603686EA0195101984
+B1128434533352N00603676EA0194801981
+B1128454533341N00603666EA0194601979
+B1128474533331N00603657EA0194401977
+B1128494533322N00603649EA0194201974
+B1128514533312N00603640EA0194201973
+B1128534533303N00603633EA0194301973
+B1128554533295N00603625EA0194401974
+B1128574533287N00603617EA0194501975
+B1128594533280N00603609EA0194401974
+B1129014533272N00603601EA0194401974
+B1129034533264N00603595EA0194301974
+B1129054533257N00603591EA0194101973
+B1129074533249N00603588EA0194001972
+B1129094533242N00603585EA0194001971
+B1129114533235N00603583EA0193701970
+B1129134533226N00603580EA0193501968
+B1129154533218N00603578EA0193301966
+B1129174533208N00603577EA0193301965
+B1129194533200N00603575EA0193301964
+B1129214533191N00603572EA0193101963
+B1129234533181N00603568EA0193001962
+B1129254533172N00603563EA0193101962
+B1129274533164N00603558EA0193301963
+B1129294533155N00603553EA0193801965
+B1129314533147N00603548EA0194401969
+B1129334533141N00603540EA0194901974
+B1129354533133N00603536EA0195401979
+B1129374533125N00603548EA0195901984
+B1129394533130N00603566EA0196401989
+B1129414533144N00603568EA0196801994
+B1129434533154N00603554EA0197201999
+B1129454533152N00603537EA0197702004
+B1129474533143N00603530EA0198002010
+B1129494533132N00603534EA0198602015
+B1129514533122N00603538EA0199202021
+B1129534533116N00603546EA0199702026
+B1129554533116N00603564EA0200202031
+B1129574533126N00603573EA0200702035
+B1129594533139N00603567EA0201002039
+B1130014533146N00603552EA0201302042
+B1130034533146N00603537EA0201702046
+B1130054533138N00603528EA0202102050
+B1130074533126N00603533EA0202402052
+B1130094533120N00603549EA0202902055
+B1130114533125N00603564EA0203602060
+B1130134533134N00603572EA0204202066
+B1130154533144N00603572EA0204302070
+B1130174533154N00603562EA0204602074
+B1130194533156N00603545EA0204902077
+B1130214533151N00603531EA0205202080
+B1130234533142N00603526EA0205602084
+B1130254533133N00603530EA0206002087
+B1130274533129N00603546EA0206402091
+B1130294533130N00603559EA0206902097
+B1130314533134N00603569EA0207102101
+B1130334533142N00603571EA0206902104
+B1130354533154N00603560EA0207002105
+B1130374533158N00603544EA0207302108
+B1130394533156N00603527EA0207602109
+B1130414533151N00603513EA0207902112
+B1130434533141N00603505EA0208102114
+B1130454533130N00603500EA0208602118
+B1130474533120N00603500EA0209102123
+B1130494533110N00603504EA0209502127
+B1130514533103N00603513EA0209802131
+B1130534533104N00603525EA0210002134
+B1130554533109N00603534EA0210402137
+B1130574533117N00603534EA0210702141
+B1130594533124N00603522EA0210802144
+B1131014533126N00603501EA0211102146
+B1131034533121N00603482EA0211402149
+B1131054533107N00603474EA0211702152
+B1131074533097N00603481EA0211902154
+B1131094533093N00603494EA0212102156
+B1131114533093N00603506EA0212602160
+B1131134533097N00603513EA0212802163
+B1131154533105N00603513EA0212702165
+B1131174533113N00603499EA0212502165
+B1131194533115N00603477EA0212502163
+B1131214533111N00603457EA0212802164
+B1131234533102N00603443EA0213202167
+B1131254533093N00603434EA0213402169
+B1131274533083N00603429EA0213402170
+B1131294533072N00603431EA0213302169
+B1131314533065N00603444EA0213202168
+B1131334533067N00603456EA0213302168
+B1131354533073N00603461EA0213402169
+B1131374533079N00603462EA0213502170
+B1131394533086N00603460EA0213202169
+B1131414533093N00603454EA0212802167
+B1131434533100N00603435EA0212902166
+B1131454533103N00603416EA0213102167
+B1131474533099N00603399EA0213102166
+B1131494533092N00603382EA0213002165
+B1131514533084N00603367EA0212802163
+B1131534533075N00603353EA0212502160
+B1131554533065N00603342EA0212102157
+B1131574533054N00603331EA0211302152
+B1131594533043N00603317EA0210602145
+B1132014533033N00603303EA0210102139
+B1132034533023N00603290EA0209602133
+B1132054533013N00603276EA0209102127
+B1132074533003N00603261EA0208702122
+B1132094532993N00603246EA0208402118
+B1132114532984N00603232EA0207902113
+B1132134532974N00603217EA0207402107
+B1132154532965N00603200EA0206902102
+B1132174532956N00603181EA0206502098
+B1132194532948N00603164EA0206102094
+B1132214532939N00603148EA0205602089
+B1132234532930N00603130EA0205302085
+B1132254532920N00603113EA0205102081
+B1132274532911N00603098EA0204802078
+B1132294532901N00603082EA0204302074
+B1132314532891N00603068EA0203902070
+B1132334532880N00603053EA0203802067
+B1132354532870N00603037EA0203402063
+B1132374532860N00603021EA0203102060
+B1132394532850N00603005EA0202702056
+B1132414532841N00602988EA0202302052
+B1132434532832N00602970EA0202002048
+B1132454532823N00602953EA0201602044
+B1132474532814N00602936EA0201202040
+B1132494532806N00602918EA0200802036
+B1132514532797N00602900EA0200402032
+B1132534532789N00602882EA0200002029
+B1132554532783N00602861EA0199602025
+B1132574532778N00602841EA0199402023
+B1132594532772N00602822EA0198802019
+B1133014532765N00602804EA0198202015
+B1133034532756N00602785EA0197702010
+B1133054532747N00602769EA0197402006
+B1133074532736N00602754EA0196902002
+B1133094532726N00602741EA0196401998
+B1133114532715N00602729EA0196001993
+B1133134532704N00602716EA0195601988
+B1133154532693N00602702EA0195201984
+B1133174532683N00602688EA0194801980
+B1133194532674N00602673EA0194301975
+B1133214532664N00602659EA0193801970
+B1133234532654N00602644EA0193301965
+B1133254532644N00602629EA0192901961
+B1133274532636N00602614EA0192601958
+B1133294532628N00602598EA0192201954
+B1133314532619N00602583EA0191901950
+B1133334532610N00602568EA0191601947
+B1133354532601N00602554EA0191201944
+B1133374532591N00602540EA0190901940
+B1133394532581N00602526EA0190601937
+B1133414532571N00602513EA0190301934
+B1133434532561N00602499EA0190001931
+B1133454532550N00602485EA0189801928
+B1133474532540N00602472EA0189501926
+B1133494532530N00602458EA0189201923
+B1133514532520N00602443EA0188901920
+B1133534532510N00602429EA0188501916
+B1133554532498N00602416EA0188301914
+B1133574532489N00602402EA0187901911
+B1133594532479N00602389EA0187701907
+B1134014532468N00602375EA0187501905
+B1134034532459N00602361EA0187401904
+B1134054532449N00602347EA0187201902
+B1134074532440N00602333EA0187001900
+B1134094532430N00602319EA0186801898
+B1134114532420N00602306EA0186701896
+B1134134532410N00602293EA0186401894
+B1134154532400N00602280EA0186201892
+B1134174532390N00602267EA0186001891
+B1134194532380N00602254EA0185901889
+B1134214532370N00602241EA0185801887
+B1134234532359N00602227EA0185601885
+B1134254532349N00602213EA0185401883
+B1134274532339N00602200EA0185201881
+B1134294532329N00602186EA0185001879
+B1134314532319N00602173EA0184801877
+B1134334532309N00602160EA0184601875
+B1134354532298N00602148EA0184401873
+B1134374532288N00602136EA0184201871
+B1134394532277N00602123EA0184001869
+B1134414532266N00602111EA0183801867
+B1134434532256N00602098EA0183601865
+B1134454532245N00602086EA0183401863
+B1134474532235N00602074EA0183201861
+B1134494532224N00602061EA0183001859
+B1134514532214N00602049EA0182801857
+B1134534532204N00602036EA0182501855
+B1134554532193N00602024EA0182401852
+B1134574532183N00602011EA0182201851
+B1134594532172N00601999EA0182001849
+B1135014532162N00601986EA0181801847
+B1135034532152N00601973EA0181501845
+B1135054532141N00601961EA0181301843
+B1135074532131N00601950EA0181101841
+B1135094532122N00601938EA0181001839
+B1135114532112N00601928EA0181201839
+B1135134532104N00601921EA0181201839
+B1135154532097N00601915EA0181101838
+B1135174532090N00601908EA0181001837
+B1135194532082N00601900EA0181201838
+B1135214532074N00601897EA0181401839
+B1135234532067N00601893EA0181401841
+B1135254532062N00601888EA0181101840
+B1135274532055N00601881EA0180801839
+B1135294532044N00601875EA0181001839
+B1135314532034N00601872EA0181101840
+B1135334532025N00601868EA0180901840
+B1135354532018N00601862EA0180501838
+B1135374532010N00601853EA0180201835
+B1135394532002N00601845EA0179901832
+B1135414531994N00601837EA0179601828
+B1135434531985N00601827EA0179501826
+B1135454531976N00601818EA0179401825
+B1135474531967N00601809EA0179301824
+B1135494531959N00601799EA0179101822
+B1135514531951N00601789EA0178801820
+B1135534531942N00601779EA0178501817
+B1135554531934N00601768EA0178001813
+B1135574531925N00601755EA0177501809
+B1135594531916N00601743EA0177001804
+B1136014531907N00601730EA0176401798
+B1136034531898N00601718EA0175801792
+B1136054531887N00601706EA0175101786
+B1136074531876N00601695EA0174601779
+B1136094531865N00601684EA0174301774
+B1136114531856N00601673EA0173801769
+B1136134531846N00601663EA0173301764
+B1136154531834N00601654EA0172801759
+B1136174531823N00601645EA0172301754
+B1136194531813N00601637EA0171601748
+B1136214531801N00601631EA0170801741
+B1136234531788N00601629EA0170201734
+B1136254531775N00601626EA0169701728
+B1136274531763N00601624EA0169401724
+B1136294531752N00601623EA0168801718
+B1136314531741N00601622EA0168301712
+B1136334531729N00601622EA0167801707
+B1136354531717N00601624EA0167301702
+B1136374531704N00601627EA0166701697
+B1136394531691N00601631EA0166101691
+B1136414531677N00601632EA0165401685
+B1136434531664N00601632EA0164701678
+B1136454531649N00601633EA0164101670
+B1136474531635N00601635EA0163701665
+B1136494531621N00601637EA0163401660
+B1136514531608N00601640EA0163101656
+B1136534531595N00601641EA0162801654
+B1136554531582N00601643EA0162801652
+B1136574531570N00601648EA0162801651
+B1136594531560N00601651EA0162601650
+B1137014531547N00601654EA0162401648
+B1137034531533N00601658EA0162301647
+B1137054531522N00601661EA0161901645
+B1137074531511N00601664EA0161201642
+B1137094531498N00601669EA0160801637
+B1137114531484N00601674EA0160501634
+B1137134531472N00601677EA0159901629
+B1137154531459N00601681EA0159201623
+B1137174531444N00601687EA0158701618
+B1137194531430N00601689EA0158401614
+B1137214531417N00601686EA0157801608
+B1137234531403N00601682EA0157301603
+B1137254531387N00601677EA0157101598
+B1137274531374N00601669EA0156701595
+B1137294531360N00601660EA0156301591
+B1137314531347N00601650EA0156101587
+B1137334531334N00601639EA0155801585
+B1137354531323N00601627EA0155501582
+B1137374531313N00601617EA0155001578
+B1137394531303N00601605EA0154601574
+B1137414531293N00601593EA0154301571
+B1137434531283N00601584EA0153701566
+B1137454531272N00601575EA0153101560
+B1137474531260N00601565EA0152601555
+B1137494531248N00601555EA0152201550
+B1137514531236N00601546EA0152001547
+B1137534531226N00601535EA0151701544
+B1137554531215N00601525EA0151401540
+B1137574531203N00601515EA0151301538
+B1137594531192N00601505EA0151001536
+B1138014531181N00601494EA0150701533
+B1138034531170N00601484EA0150501530
+B1138054531158N00601475EA0150301529
+B1138074531147N00601465EA0150001527
+B1138094531136N00601456EA0149801524
+B1138114531124N00601447EA0149501521
+B1138134531114N00601436EA0149201518
+B1138154531103N00601425EA0148801515
+B1138174531091N00601415EA0148601512
+B1138194531079N00601403EA0148401510
+B1138214531068N00601393EA0148101508
+B1138234531056N00601383EA0147801504
+B1138254531045N00601371EA0147501502
+B1138274531033N00601359EA0147301499
+B1138294531022N00601348EA0146901496
+B1138314531010N00601336EA0146701493
+B1138334530998N00601325EA0146501491
+B1138354530986N00601315EA0146201488
+B1138374530975N00601304EA0145901486
+B1138394530963N00601293EA0145601482
+B1138414530950N00601283EA0145301480
+B1138434530937N00601273EA0145101477
+B1138454530924N00601263EA0144801474
+B1138474530912N00601253EA0144501471
+B1138494530900N00601241EA0144201468
+B1138514530888N00601229EA0144001466
+B1138534530876N00601216EA0143801464
+B1138554530865N00601202EA0143601462
+B1138574530854N00601189EA0143301459
+B1138594530843N00601177EA0143001455
+B1139014530831N00601165EA0142701453
+B1139034530818N00601154EA0142501450
+B1139054530805N00601146EA0142201447
+B1139074530791N00601137EA0142001444
+B1139094530778N00601127EA0141801443
+B1139114530766N00601118EA0141401440
+B1139134530754N00601108EA0141201437
+B1139154530740N00601098EA0141101436
+B1139174530728N00601089EA0140901434
+B1139194530716N00601079EA0140501431
+B1139214530703N00601069EA0140201428
+B1139234530690N00601060EA0140001425
+B1139254530677N00601050EA0139901424
+B1139274530664N00601040EA0139701422
+B1139294530652N00601031EA0139501420
+B1139314530639N00601020EA0139201417
+B1139334530627N00601009EA0139001415
+B1139354530614N00600999EA0138901413
+B1139374530602N00600989EA0138701411
+B1139394530590N00600979EA0138501409
+B1139414530577N00600970EA0138201406
+B1139434530565N00600958EA0138001404
+B1139454530554N00600947EA0137601402
+B1139474530542N00600936EA0137301399
+B1139494530530N00600925EA0136901395
+B1139514530518N00600913EA0136601391
+B1139534530504N00600903EA0136401388
+B1139554530491N00600893EA0136101386
+B1139574530479N00600883EA0135801383
+B1139594530467N00600872EA0135701380
+B1140014530456N00600861EA0135501378
+B1140034530445N00600850EA0135201376
+B1140054530436N00600838EA0135001374
+B1140074530425N00600827EA0134901373
+B1140094530415N00600817EA0134601371
+B1140114530404N00600807EA0134401368
+B1140134530392N00600795EA0134401367
+B1140154530381N00600784EA0134401367
+B1140174530371N00600773EA0134101365
+B1140194530361N00600763EA0133901363
+B1140214530350N00600753EA0133701361
+B1140234530339N00600743EA0133501358
+B1140254530328N00600734EA0133301357
+B1140274530317N00600724EA0133101355
+B1140294530307N00600715EA0132901352
+B1140314530296N00600707EA0132701350
+B1140334530285N00600699EA0132501348
+B1140354530274N00600691EA0132201346
+B1140374530263N00600683EA0131901343
+B1140394530252N00600675EA0131801341
+B1140414530240N00600670EA0131601339
+B1140434530228N00600666EA0131201336
+B1140454530216N00600663EA0131001334
+B1140474530203N00600660EA0130801332
+B1140494530191N00600655EA0130601329
+B1140514530180N00600650EA0130401327
+B1140534530168N00600644EA0130101324
+B1140554530157N00600636EA0129901322
+B1140574530147N00600629EA0129601319
+B1140594530137N00600620EA0129401317
+B1141014530127N00600611EA0129101314
+B1141034530117N00600602EA0128901312
+B1141054530108N00600592EA0128701310
+B1141074530097N00600584EA0128501307
+B1141094530087N00600575EA0128301306
+B1141114530077N00600568EA0128101304
+B1141134530066N00600560EA0127801302
+B1141154530056N00600552EA0127701300
+B1141174530046N00600543EA0127601298
+B1141194530036N00600535EA0127501297
+B1141214530026N00600527EA0127201295
+B1141234530015N00600520EA0127001292
+B1141254530005N00600511EA0126801290
+B1141274529995N00600502EA0126601288
+B1141294529985N00600494EA0126501287
+B1141314529976N00600485EA0126201285
+B1141334529967N00600476EA0126001283
+B1141354529958N00600466EA0125901281
+B1141374529949N00600457EA0125701279
+B1141394529940N00600447EA0125501277
+B1141414529931N00600438EA0125301275
+B1141434529923N00600428EA0125101273
+B1141454529914N00600418EA0124901271
+B1141474529905N00600409EA0124601268
+B1141494529896N00600399EA0124301265
+B1141514529887N00600390EA0124101263
+B1141534529878N00600381EA0123801260
+B1141554529869N00600372EA0123501257
+B1141574529859N00600364EA0123201254
+B1141594529849N00600356EA0122901251
+B1142014529839N00600348EA0122601248
+B1142034529830N00600341EA0122301246
+B1142054529820N00600333EA0122001242
+B1142074529810N00600325EA0121701239
+B1142094529800N00600317EA0121401236
+B1142114529791N00600309EA0121101233
+B1142134529782N00600301EA0120801230
+B1142154529773N00600292EA0120601227
+B1142174529765N00600283EA0120201225
+B1142194529756N00600275EA0119801222
+B1142214529747N00600266EA0119501218
+B1142234529738N00600258EA0119301215
+B1142254529729N00600250EA0119001212
+B1142274529719N00600243EA0118601208
+B1142294529710N00600234EA0118201204
+B1142314529701N00600224EA0117901200
+B1142334529693N00600214EA0117601197
+B1142354529684N00600204EA0117201194
+B1142374529676N00600194EA0117001191
+B1142394529667N00600183EA0116601188
+B1142414529659N00600173EA0116201184
+B1142434529651N00600163EA0115801180
+B1142454529642N00600152EA0115401176
+B1142474529633N00600142EA0115201172
+B1142494529624N00600133EA0114801169
+B1142514529615N00600123EA0114401165
+B1142534529606N00600112EA0114001161
+B1142554529596N00600102EA0113701158
+B1142574529587N00600091EA0113401154
+B1142594529578N00600080EA0113101151
+B1143014529569N00600071EA0112901149
+B1143034529560N00600062EA0112501145
+B1143054529551N00600052EA0112101142
+B1143074529542N00600041EA0111801138
+B1143094529533N00600031EA0111401135
+B1143114529524N00600021EA0111101132
+B1143134529514N00600012EA0110901129
+B1143154529505N00600004EA0110801127
+B1143174529496N00559995EA0110401125
+B1143194529486N00559986EA0110201122
+B1143214529477N00559978EA0110101121
+B1143234529468N00559971EA0109901119
+B1143254529458N00559963EA0109601116
+B1143274529448N00559956EA0109401114
+B1143294529439N00559949EA0109301112
+B1143314529429N00559942EA0109001110
+B1143334529419N00559936EA0108801107
+B1143354529408N00559928EA0108601105
+B1143374529397N00559921EA0108601104
+B1143394529386N00559914EA0108501104
+B1143414529376N00559908EA0108501103
+B1143434529367N00559901EA0108501103
+B1143454529359N00559895EA0108501103
+B1143474529350N00559889EA0108401103
+B1143494529342N00559883EA0108201102
+B1143514529333N00559878EA0108101101
+B1143534529324N00559874EA0108001099
+B1143554529314N00559868EA0108001098
+B1143574529305N00559862EA0107901098
+B1143594529297N00559856EA0107701097
+B1144014529289N00559849EA0107601095
+B1144034529280N00559841EA0107401094
+B1144054529271N00559833EA0107301093
+B1144074529261N00559824EA0107201091
+B1144094529252N00559817EA0107201091
+B1144114529242N00559809EA0107101090
+B1144134529233N00559801EA0107001089
+B1144154529223N00559793EA0106901088
+B1144174529212N00559784EA0106801087
+B1144194529202N00559774EA0106801087
+B1144214529192N00559766EA0106801087
+B1144234529182N00559757EA0106701086
+B1144254529172N00559749EA0106601085
+B1144274529163N00559740EA0106501085
+B1144294529153N00559731EA0106501084
+B1144314529144N00559721EA0106501083
+B1144334529135N00559712EA0106401083
+B1144354529126N00559704EA0106201082
+B1144374529117N00559695EA0105901080
+B1144394529108N00559686EA0105801078
+B1144414529099N00559677EA0105701077
+B1144434529089N00559668EA0105501075
+B1144454529079N00559658EA0105301074
+B1144474529068N00559650EA0105301073
+B1144494529059N00559641EA0105201072
+B1144514529050N00559632EA0105001070
+B1144534529039N00559624EA0105001070
+B1144554529029N00559616EA0105001069
+B1144574529019N00559607EA0104901069
+B1144594529009N00559599EA0104801068
+B1145014528999N00559591EA0104601066
+B1145034528989N00559582EA0104501065
+B1145054528978N00559573EA0104401064
+B1145074528969N00559564EA0104301063
+B1145094528959N00559557EA0104201062
+B1145114528949N00559548EA0104001060
+B1145134528940N00559540EA0104001059
+B1145154528929N00559532EA0103901059
+B1145174528918N00559525EA0103901058
+B1145194528908N00559516EA0104001058
+B1145214528898N00559509EA0103901058
+B1145234528889N00559500EA0103701057
+B1145254528879N00559490EA0103701056
+B1145274528869N00559481EA0103701056
+B1145294528861N00559471EA0103601056
+B1145314528852N00559462EA0103401054
+B1145334528842N00559451EA0103601054
+B1145354528832N00559442EA0103601055
+B1145374528823N00559433EA0103401053
+B1145394528813N00559421EA0103501053
+B1145414528804N00559413EA0103501054
+B1145434528795N00559407EA0103201053
+B1145454528785N00559399EA0103001051
+B1145474528776N00559390EA0102901050
+B1145494528768N00559381EA0102801048
+B1145514528759N00559372EA0102901047
+B1145534528750N00559365EA0103001048
+B1145554528743N00559357EA0102801047
+B1145574528736N00559346EA0102801046
+B1145594528727N00559336EA0102901046
+B1146014528718N00559327EA0103001048
+B1146034528711N00559318EA0103001048
+B1146054528702N00559309EA0103201049
+B1146074528694N00559304EA0103301051
+B1146094528686N00559300EA0103401053
+B1146114528677N00559298EA0103401053
+B1146134528667N00559296EA0103501054
+B1146154528658N00559294EA0103601055
+B1146174528649N00559292EA0103601056
+B1146194528639N00559290EA0103701056
+B1146214528630N00559288EA0103701057
+B1146234528621N00559288EA0103501056
+B1146254528611N00559287EA0103201054
+B1146274528601N00559284EA0103001052
+B1146294528592N00559281EA0102501049
+B1146314528583N00559277EA0101901044
+B1146334528574N00559272EA0101501039
+B1146354528562N00559267EA0101401035
+B1146374528550N00559265EA0101201033
+B1146394528539N00559265EA0100801029
+B1146414528527N00559264EA0100301024
+B1146434528514N00559262EA0100201021
+B1146454528502N00559260EA0099901019
+B1146474528491N00559258EA0099501016
+B1146494528479N00559253EA0099101011
+B1146514528467N00559247EA0099001007
+B1146534528455N00559241EA0099101006
+B1146554528446N00559235EA0098901005
+B1146574528437N00559230EA0098501002
+B1146594528426N00559223EA0098200999
+B1147014528416N00559214EA0098200998
+B1147034528405N00559206EA0098200997
+B1147054528395N00559198EA0098100997
+B1147074528385N00559189EA0098100996
+B1147094528376N00559181EA0098200997
+B1147114528367N00559174EA0098100997
+B1147134528358N00559165EA0098000996
+B1147154528349N00559155EA0098000996
+B1147174528340N00559148EA0097900996
+B1147194528332N00559140EA0097700994
+B1147214528323N00559130EA0097700994
+B1147234528313N00559122EA0097800995
+B1147254528306N00559115EA0097700994
+B1147274528298N00559107EA0097600993
+B1147294528291N00559099EA0097500992
+B1147314528283N00559091EA0097500992
+B1147334528273N00559084EA0097400991
+B1147354528264N00559077EA0097300990
+B1147374528253N00559070EA0097100989
+B1147394528242N00559062EA0097100988
+B1147414528231N00559055EA0097100988
+B1147434528221N00559048EA0097000988
+B1147454528211N00559041EA0096800986
+B1147474528200N00559033EA0096700985
+B1147494528190N00559025EA0096700985
+B1147514528181N00559017EA0096500983
+B1147534528172N00559006EA0096500982
+B1147554528162N00558998EA0096700982
+B1147574528152N00558992EA0096600982
+B1147594528143N00558983EA0096400981
+B1148014528133N00558974EA0096500981
+B1148034528123N00558966EA0096500981
+B1148054528114N00558957EA0096300980
+B1148074528104N00558947EA0096000978
+B1148094528094N00558936EA0095700975
+B1148114528085N00558926EA0095200972
+B1148134528074N00558914EA0095000968
+B1148154528064N00558904EA0094800966
+B1148174528055N00558895EA0094300963
+B1148194528044N00558885EA0094100959
+B1148214528032N00558875EA0094000957
+B1148234528022N00558866EA0093600955
+B1148254528011N00558857EA0093200950
+B1148274527999N00558845EA0093300948
+B1148294527988N00558835EA0093300947
+B1148314527978N00558827EA0093200947
+B1148334527967N00558818EA0093200946
+B1148354527956N00558810EA0093200946
+B1148374527945N00558802EA0093100946
+B1148394527935N00558794EA0093100946
+B1148414527926N00558785EA0093000945
+B1148434527917N00558774EA0093100945
+B1148454527910N00558764EA0093000945
+B1148474527902N00558755EA0092800944
+B1148494527893N00558746EA0092700943
+B1148514527883N00558740EA0092500942
+B1148534527874N00558733EA0092200939
+B1148554527864N00558725EA0092100937
+B1148574527853N00558716EA0092000935
+B1148594527843N00558707EA0092000935
+B1149014527833N00558699EA0092000935
+B1149034527824N00558689EA0092100936
+B1149054527815N00558679EA0092100936
+B1149074527806N00558669EA0092100937
+B1149094527797N00558660EA0091800935
+B1149114527788N00558648EA0091600933
+B1149134527778N00558636EA0091800932
+B1149154527770N00558627EA0091900933
+B1149174527763N00558618EA0091800933
+B1149194527755N00558607EA0091700932
+B1149214527746N00558597EA0091600931
+B1149234527738N00558587EA0091400930
+B1149254527730N00558576EA0091100927
+B1149274527720N00558564EA0090900925
+B1149294527710N00558552EA0090800923
+B1149314527700N00558541EA0090700923
+B1149334527690N00558529EA0090700922
+B1149354527680N00558515EA0090700921
+B1149374527672N00558500EA0090900922
+B1149394527665N00558488EA0091000924
+B1149414527656N00558477EA0091200925
+B1149434527649N00558465EA0091300927
+B1149454527642N00558452EA0091400929
+B1149474527636N00558439EA0091500929
+B1149494527629N00558425EA0091500930
+B1149514527622N00558411EA0091500930
+B1149534527615N00558397EA0091400930
+B1149554527609N00558382EA0091300929
+B1149574527601N00558368EA0091300929
+B1149594527592N00558355EA0091100928
+B1150014527582N00558341EA0090800926
+B1150034527574N00558325EA0090700924
+B1150054527566N00558310EA0090600924
+B1150074527558N00558296EA0090400922
+B1150094527551N00558280EA0090100920
+B1150114527543N00558262EA0090000918
+B1150134527536N00558245EA0090000917
+B1150154527531N00558228EA0089900916
+B1150174527526N00558211EA0089800915
+B1150194527521N00558194EA0089700914
+B1150214527515N00558178EA0089600913
+B1150234527510N00558162EA0089400911
+B1150254527504N00558145EA0089100909
+B1150274527496N00558128EA0089000907
+B1150294527488N00558111EA0089000906
+B1150314527483N00558094EA0089000906
+B1150334527480N00558078EA0089100907
+B1150354527475N00558061EA0089100907
+B1150374527469N00558046EA0089000906
+B1150394527461N00558032EA0088800905
+B1150414527450N00558019EA0089000905
+B1150434527436N00558010EA0089200906
+B1150454527424N00558001EA0089200907
+B1150474527412N00557995EA0089100907
+B1150494527398N00557991EA0089200907
+B1150514527384N00557989EA0089500909
+B1150534527371N00557985EA0089600911
+B1150554527361N00557990EA0089600911
+B1150574527356N00558004EA0089600912
+B1150594527362N00558010EA0089600912
+B1151014527370N00557999EA0089700912
+B1151034527371N00557977EA0089900913
+B1151054527366N00557957EA0090100915
+B1151074527356N00557944EA0090300917
+B1151094527344N00557942EA0090400919
+B1151114527334N00557947EA0090500920
+B1151134527330N00557961EA0090400920
+B1151154527335N00557972EA0090400920
+B1151174527342N00557975EA0090700922
+B1151194527349N00557975EA0090700923
+B1151214527358N00557970EA0090700923
+B1151234527367N00557959EA0091000924
+B1151254527374N00557942EA0091400926
+B1151274527375N00557923EA0091800930
+B1151294527372N00557907EA0091900934
+B1151314527371N00557889EA0091700935
+B1151334527370N00557869EA0091700936
+B1151354527361N00557854EA0091400936
+B1151374527347N00557856EA0091200934
+B1151394527338N00557866EA0091100933
+B1151414527338N00557879EA0091000931
+B1151434527344N00557889EA0091300931
+B1151454527354N00557893EA0091600932
+B1151474527365N00557891EA0091900936
+B1151494527374N00557887EA0092100938
+B1151514527383N00557885EA0092300940
+B1151534527391N00557883EA0092400942
+B1151554527398N00557883EA0092400943
+B1151574527407N00557879EA0092300943
+B1151594527412N00557862EA0092200943
+B1152014527410N00557845EA0092200943
+B1152034527401N00557834EA0092200943
+B1152054527391N00557834EA0092200942
+B1152074527384N00557845EA0092200942
+B1152094527382N00557857EA0092400943
+B1152114527386N00557864EA0092500944
+B1152134527391N00557868EA0092500945
+B1152154527397N00557871EA0092500944
+B1152174527404N00557873EA0092500944
+B1152194527413N00557874EA0092700944
+B1152214527422N00557874EA0092800946
+B1152234527432N00557875EA0093100947
+B1152254527442N00557877EA0093400950
+B1152274527451N00557879EA0093700953
+B1152294527459N00557882EA0094100957
+B1152314527466N00557884EA0094600961
+B1152334527473N00557885EA0094800964
+B1152354527480N00557879EA0094900967
+B1152374527483N00557862EA0094900969
+B1152394527477N00557847EA0095000970
+B1152414527462N00557846EA0095200971
+B1152434527457N00557857EA0095300972
+B1152454527458N00557868EA0095700974
+B1152474527463N00557873EA0095900977
+B1152494527470N00557873EA0095800978
+B1152514527477N00557865EA0095900978
+B1152534527480N00557847EA0096000978
+B1152554527476N00557829EA0096400981
+B1152574527470N00557818EA0096700985
+B1152594527461N00557814EA0096800987
+B1153014527453N00557817EA0096900988
+B1153034527449N00557826EA0097000989
+B1153054527450N00557836EA0097200990
+B1153074527455N00557843EA0097500992
+B1153094527462N00557843EA0097900995
+B1153114527469N00557845EA0098300999
+B1153134527475N00557850EA0098501002
+B1153154527480N00557854EA0098501005
+B1153174527488N00557850EA0098201006
+B1153194527492N00557833EA0098101006
+B1153214527487N00557816EA0098101006
+B1153234527476N00557811EA0098201005
+B1153254527465N00557819EA0098301004
+B1153274527456N00557828EA0098701006
+B1153294527449N00557835EA0099101010
+B1153314527445N00557844EA0099501013
+B1153334527444N00557854EA0099901017
+B1153354527443N00557865EA0100301021
+B1153374527442N00557875EA0100601024
+B1153394527450N00557878EA0100801027
+B1153414527456N00557866EA0101301029
+B1153434527455N00557848EA0101601033
+B1153454527443N00557838EA0101801035
+B1153474527431N00557846EA0102201039
+B1153494527430N00557861EA0102501041
+B1153514527437N00557869EA0103001047
+B1153534527444N00557862EA0103301051
+B1153554527445N00557848EA0103701055
+B1153574527439N00557835EA0104001059
+B1153594527428N00557830EA0104201062
+B1154014527416N00557840EA0104601065
+B1154034527409N00557853EA0104701067
+B1154054527409N00557866EA0104901069
+B1154074527418N00557869EA0105301071
+B1154094527424N00557862EA0105901075
+B1154114527429N00557858EA0106401081
+B1154134527434N00557855EA0106701085
+B1154154527437N00557845EA0106801088
+B1154174527438N00557831EA0107301091
+B1154194527435N00557819EA0107501095
+B1154214527425N00557811EA0107701097
+B1154234527411N00557811EA0107901099
+B1154254527401N00557823EA0108001101
+B1154274527398N00557839EA0108201102
+B1154294527402N00557849EA0108401104
+B1154314527408N00557850EA0108401105
+B1154334527415N00557843EA0108501105
+B1154354527418N00557832EA0108901107
+B1154374527417N00557819EA0109201110
+B1154394527415N00557807EA0109101111
+B1154414527410N00557795EA0108701111
+B1154434527395N00557785EA0108901112
+B1154454527380N00557789EA0109201112
+B1154474527375N00557803EA0109001112
+B1154494527374N00557816EA0108901109
+B1154514527378N00557829EA0108901108
+B1154534527387N00557835EA0109101109
+B1154554527396N00557834EA0109401111
+B1154574527403N00557831EA0109601113
+B1154594527410N00557827EA0109801115
+B1155014527418N00557823EA0110301118
+B1155034527426N00557820EA0110701123
+B1155054527431N00557816EA0110701126
+B1155074527435N00557809EA0110201128
+B1155094527434N00557791EA0109801129
+B1155114527426N00557776EA0109901128
+B1155134527413N00557773EA0110101128
+B1155154527404N00557782EA0110301129
+B1155174527402N00557796EA0110501130
+B1155194527404N00557809EA0110801131
+B1155214527411N00557816EA0110801133
+B1155234527418N00557816EA0110501133
+B1155254527422N00557802EA0110101130
+B1155274527419N00557785EA0109901128
+B1155294527409N00557774EA0109801126
+B1155314527398N00557771EA0110001126
+B1155334527387N00557773EA0110301128
+B1155354527378N00557777EA0110401129
+B1155374527369N00557782EA0110301130
+B1155394527364N00557796EA0110301130
+B1155414527364N00557811EA0110301129
+B1155434527372N00557820EA0110301128
+B1155454527381N00557819EA0110201128
+B1155474527388N00557810EA0110301129
+B1155494527392N00557801EA0110101128
+B1155514527394N00557790EA0109601126
+B1155534527392N00557775EA0109201123
+B1155554527385N00557759EA0109101120
+B1155574527373N00557748EA0109201120
+B1155594527362N00557740EA0109101119
+B1156014527352N00557731EA0109101118
+B1156034527342N00557722EA0109101117
+B1156054527333N00557715EA0109101117
+B1156074527324N00557709EA0109201117
+B1156094527314N00557708EA0109401118
+B1156114527305N00557706EA0109701120
+B1156134527298N00557706EA0109901122
+B1156154527293N00557719EA0110001123
+B1156174527298N00557734EA0110201124
+B1156194527311N00557735EA0110401127
+B1156214527317N00557724EA0110401128
+B1156234527317N00557707EA0110401129
+B1156254527312N00557691EA0110601130
+B1156274527304N00557683EA0110701130
+B1156294527293N00557684EA0111001132
+B1156314527283N00557687EA0111201134
+B1156334527276N00557691EA0111301136
+B1156354527273N00557704EA0111501137
+B1156374527276N00557715EA0111701139
+B1156394527286N00557714EA0111401140
+B1156414527295N00557699EA0111701140
+B1156434527295N00557682EA0112001141
+B1156454527288N00557671EA0112101142
+B1156474527278N00557666EA0112201144
+B1156494527269N00557672EA0112201144
+B1156514527264N00557684EA0112401144
+B1156534527263N00557696EA0112601146
+B1156554527265N00557702EA0112201146
+B1156574527272N00557706EA0111701144
+B1156594527281N00557704EA0111401141
+B1157014527289N00557689EA0111101137
+B1157034527289N00557669EA0111301134
+B1157054527285N00557654EA0111501134
+B1157074527278N00557645EA0111601135
+B1157094527268N00557638EA0111701136
+B1157114527256N00557635EA0112001139
+B1157134527245N00557635EA0112201141
+B1157154527236N00557636EA0112201142
+B1157174527228N00557642EA0112101142
+B1157194527227N00557651EA0111901141
+B1157214527233N00557655EA0111701140
+B1157234527241N00557649EA0111601139
+B1157254527247N00557635EA0111601138
+B1157274527248N00557617EA0111701137
+B1157294527241N00557597EA0111901138
+B1157314527231N00557586EA0112101139
+B1157334527221N00557581EA0112001139
+B1157354527211N00557582EA0111701138
+B1157374527207N00557593EA0111701137
+B1157394527210N00557602EA0111801138
+B1157414527217N00557601EA0111801138
+B1157434527224N00557587EA0111801137
+B1157454527225N00557568EA0111901138
+B1157474527221N00557551EA0111801137
+B1157494527212N00557540EA0111601136
+B1157514527200N00557537EA0111301134
+B1157534527192N00557546EA0111201132
+B1157554527188N00557557EA0111301132
+B1157574527181N00557566EA0111201131
+B1157594527172N00557572EA0111101130
+B1158014527163N00557579EA0110901128
+B1158034527155N00557588EA0110801127
+B1158054527147N00557594EA0110601125
+B1158074527137N00557599EA0110601124
+B1158094527128N00557604EA0110601123
+B1158114527120N00557611EA0110301122
+B1158134527111N00557617EA0110001119
+B1158154527101N00557624EA0109701116
+B1158174527092N00557633EA0109901115
+B1158194527083N00557642EA0110101115
+B1158214527075N00557649EA0110101116
+B1158234527068N00557657EA0110201116
+B1158254527059N00557664EA0110601118
+B1158274527052N00557668EA0110801121
+B1158294527047N00557673EA0110801122
+B1158314527046N00557681EA0110901123
+B1158334527052N00557688EA0110901124
+B1158354527063N00557684EA0110801125
+B1158374527072N00557669EA0110701124
+B1158394527073N00557649EA0110801124
+B1158414527068N00557633EA0110901125
+B1158434527058N00557623EA0111001126
+B1158454527048N00557620EA0111201128
+B1158474527040N00557620EA0111201129
+B1158494527034N00557626EA0111001128
+B1158514527027N00557636EA0111101128
+B1158534527019N00557644EA0111301129
+B1158554527011N00557649EA0111501132
+B1158574527003N00557652EA0111701134
+B1158594526997N00557656EA0111901136
+B1159014526995N00557663EA0111801137
+B1159034526997N00557673EA0112001138
+B1159054527005N00557680EA0112201139
+B1159074527015N00557677EA0112301140
+B1159094527023N00557666EA0112101141
+B1159114527027N00557644EA0112201141
+B1159134527024N00557625EA0112201142
+B1159154527015N00557614EA0112301141
+B1159174527004N00557612EA0112401143
+B1159194526994N00557614EA0112701145
+B1159214526984N00557615EA0112801147
+B1159234526975N00557613EA0112901148
+B1159254526966N00557612EA0112901149
+B1159274526958N00557614EA0113001150
+B1159294526951N00557617EA0112901150
+B1159314526947N00557624EA0112801150
+B1159334526944N00557634EA0112801149
+B1159354526938N00557644EA0112801148
+B1159374526932N00557652EA0112801148
+B1159394526925N00557659EA0112701147
+B1159414526918N00557667EA0112601146
+B1159434526911N00557676EA0112401145
+B1159454526904N00557683EA0112301144
+B1159474526895N00557691EA0112201143
+B1159494526887N00557698EA0112201143
+B1159514526878N00557704EA0112101142
+B1159534526869N00557710EA0112001141
+B1159554526860N00557716EA0111801140
+B1159574526851N00557722EA0111501137
+B1159594526841N00557727EA0111101135
+B1200014526832N00557731EA0110701131
+B1200034526821N00557733EA0110401127
+B1200054526810N00557737EA0110201124
+B1200074526799N00557741EA0110001122
+B1200094526789N00557742EA0109601119
+B1200114526777N00557744EA0109301115
+B1200134526765N00557746EA0109201113
+B1200154526753N00557748EA0108901111
+B1200174526743N00557753EA0108601108
+B1200194526731N00557758EA0108301104
+B1200214526720N00557763EA0108101102
+B1200234526708N00557767EA0107601099
+B1200254526696N00557770EA0107301095
+B1200274526684N00557773EA0107001092
+B1200294526673N00557776EA0106601088
+B1200314526661N00557778EA0106001084
+B1200334526647N00557782EA0105801080
+B1200354526634N00557783EA0105501077
+B1200374526621N00557783EA0105101073
+B1200394526607N00557783EA0105501069
+B1200414526593N00557778EA0106101067
+B1200434526583N00557775EA0106301067
+B1200454526574N00557779EA0106501068
+B1200474526569N00557794EA0106801070
+B1200494526575N00557802EA0107101073
+B1200514526584N00557796EA0107501079
+B1200534526587N00557782EA0107801085
+B1200554526581N00557767EA0107901090
+B1200574526569N00557760EA0108001094
+B1200594526556N00557771EA0108201097
+B1201014526553N00557786EA0108401100
+B1201044526559N00557794EA0108901106
+B1201064526566N00557793EA0109201109
+B1201084526573N00557789EA0109601113
+B1201104526580N00557782EA0110101117
+B1201124526583N00557769EA0110201119
+B1201144526577N00557754EA0110201121
+B1201164526565N00557754EA0110301123
+B1201184526556N00557770EA0110701125
+B1201204526559N00557786EA0111201128
+B1201224526567N00557787EA0111601132
+B1201244526574N00557780EA0112001137
+B1201264526579N00557769EA0112201140
+B1201284526578N00557755EA0111901142
+B1201304526566N00557744EA0111701142
+B1201324526554N00557754EA0111801143
+B1201344526551N00557772EA0112401144
+B1201364526555N00557782EA0112901147
+B1201384526563N00557783EA0113101150
+B1201404526573N00557781EA0113401152
+B1201424526583N00557779EA0113801156
+B1201444526592N00557773EA0113801158
+B1201464526595N00557756EA0113701160
+B1201484526590N00557734EA0113401162
+B1201504526576N00557727EA0113001160
+B1201524526564N00557737EA0112901160
+B1201544526561N00557751EA0112701159
+B1201564526568N00557763EA0112701157
+B1201584526578N00557763EA0112601156
+B1202004526584N00557751EA0112601153
+B1202024526586N00557736EA0112401150
+B1202044526584N00557717EA0112101146
+B1202064526577N00557700EA0111801143
+B1202084526567N00557690EA0111301140
+B1202104526553N00557686EA0110801135
+B1202124526539N00557683EA0110901133
+B1202144526526N00557681EA0111101132
+B1202164526514N00557681EA0111301134
+B1202184526502N00557680EA0111801136
+B1202204526492N00557678EA0112301140
+B1202224526484N00557678EA0112201143
+B1202244526480N00557688EA0112001145
+B1202264526486N00557700EA0112001147
+B1202284526498N00557697EA0112301148
+B1202304526508N00557693EA0112601150
+B1202324526514N00557700EA0112601151
+B1202344526511N00557715EA0112901152
+B1202364526498N00557721EA0113101153
+B1202384526487N00557710EA0113301154
+B1202404526483N00557691EA0113501156
+B1202424526490N00557677EA0113601158
+B1202444526501N00557676EA0113901160
+B1202464526506N00557684EA0114101161
+B1202484526504N00557696EA0114201163
+B1202504526493N00557706EA0114501165
+B1202524526478N00557700EA0114701167
+B1202544526470N00557685EA0114901169
+B1202564526470N00557667EA0115201172
+B1202584526477N00557654EA0115401176
+B1203004526486N00557652EA0115401178
+B1203024526494N00557661EA0115601179
+B1203044526489N00557673EA0115801180
+B1203064526477N00557678EA0116301182
+B1203084526464N00557677EA0116501186
+B1203104526453N00557669EA0116401187
+B1203124526447N00557654EA0116201186
+B1203144526451N00557632EA0116401186
+B1203164526460N00557621EA0116601186
+B1203184526470N00557620EA0116901187
+B1203204526477N00557627EA0117001188
+B1203224526476N00557638EA0117301191
+B1203244526468N00557648EA0117901194
+B1203264526460N00557654EA0118301198
+B1203284526455N00557662EA0118301201
+B1203304526457N00557672EA0118401203
+B1203324526468N00557667EA0118701206
+B1203344526473N00557651EA0118801209
+B1203364526472N00557631EA0119001211
+B1203384526466N00557615EA0119101212
+B1203404526451N00557613EA0119601216
+B1203424526441N00557621EA0120001220
+B1203444526437N00557632EA0120301223
+B1203464526437N00557641EA0120701226
+B1203484526443N00557648EA0121001229
+B1203504526452N00557641EA0121101233
+B1203524526454N00557624EA0121301235
+B1203544526448N00557603EA0121701238
+B1203564526433N00557602EA0122001240
+B1203584526423N00557612EA0122201242
+B1204004526422N00557624EA0122701245
+B1204024526429N00557628EA0123101249
+B1204044526436N00557619EA0123401253
+B1204064526439N00557604EA0123601256
+B1204084526436N00557587EA0123801259
+B1204104526428N00557572EA0123901261
+B1204124526414N00557568EA0124101262
+B1204144526403N00557576EA0124301265
+B1204164526401N00557589EA0124501267
+B1204184526406N00557598EA0124901269
+B1204204526415N00557600EA0125301273
+B1204224526423N00557597EA0125501275
+B1204244526429N00557590EA0125601276
+B1204264526430N00557573EA0125501278
+B1204284526425N00557556EA0125501279
+B1204304526414N00557551EA0125601279
+B1204324526401N00557555EA0125901282
+B1204344526393N00557566EA0126301285
+B1204364526387N00557576EA0126701289
+B1204384526380N00557586EA0127101293
+B1204404526375N00557597EA0127501296
+B1204424526377N00557606EA0127401299
+B1204444526386N00557605EA0127301300
+B1204464526391N00557590EA0127401301
+B1204484526386N00557571EA0127701302
+B1204504526376N00557558EA0128101305
+B1204524526363N00557551EA0128401309
+B1204544526351N00557552EA0128401311
+B1204564526340N00557560EA0128401311
+B1204584526333N00557570EA0128701312
+B1205004526328N00557581EA0128601312
+B1205024526325N00557593EA0128301311
+B1205044526328N00557604EA0127801309
+B1205064526336N00557601EA0127701306
+B1205084526340N00557583EA0128201304
+B1205104526335N00557567EA0128301304
+B1205124526327N00557555EA0128301305
+B1205144526318N00557547EA0128001303
+B1205164526306N00557541EA0127801301
+B1205184526293N00557541EA0127801300
+B1205204526280N00557542EA0127701300
+B1205224526267N00557542EA0127601299
+B1205244526253N00557542EA0127401297
+B1205264526241N00557540EA0127101295
+B1205284526228N00557538EA0126701291
+B1205304526215N00557537EA0126401288
+B1205324526202N00557536EA0126301286
+B1205344526190N00557536EA0126001284
+B1205364526178N00557537EA0125601280
+B1205384526165N00557537EA0125401277
+B1205404526151N00557537EA0125201274
+B1205424526139N00557538EA0125001272
+B1205444526127N00557541EA0124901270
+B1205464526114N00557542EA0124801268
+B1205484526102N00557541EA0124401266
+B1205504526091N00557543EA0123801263
+B1205524526079N00557548EA0123401260
+B1205544526066N00557555EA0123101257
+B1205564526055N00557561EA0122601254
+B1205584526044N00557567EA0121801249
+B1206004526031N00557574EA0121301243
+B1206024526017N00557581EA0120901238
+B1206044526003N00557587EA0120401234
+B1206064525991N00557596EA0119901228
+B1206084525977N00557606EA0119501223
+B1206104525964N00557615EA0119201219
+B1206124525950N00557624EA0118901216
+B1206144525937N00557633EA0118601212
+B1206164525925N00557641EA0118401209
+B1206184525912N00557648EA0118001206
+B1206204525899N00557655EA0117701203
+B1206224525887N00557661EA0117401199
+B1206244525874N00557666EA0117101196
+B1206264525861N00557671EA0117001193
+B1206284525848N00557676EA0116901192
+B1206304525838N00557681EA0116501189
+B1206324525825N00557685EA0116101185
+B1206344525812N00557687EA0115801183
+B1206364525799N00557689EA0115501180
+B1206384525788N00557693EA0115101176
+B1206404525776N00557696EA0114701173
+B1206424525764N00557700EA0114301168
+B1206444525750N00557704EA0114201164
+B1206464525737N00557704EA0114301161
+B1206484525726N00557705EA0114101160
+B1206504525716N00557707EA0113801157
+B1206524525703N00557710EA0113701155
+B1206544525691N00557713EA0113601155
+B1206564525680N00557716EA0113401153
+B1206584525668N00557718EA0113101150
+B1207004525655N00557720EA0112701147
+B1207024525641N00557721EA0112401144
+B1207044525626N00557720EA0112401142
+B1207064525612N00557719EA0112501141
+B1207084525599N00557718EA0112701142
+B1207104525587N00557716EA0112701143
+B1207124525576N00557714EA0112501143
+B1207144525564N00557713EA0112201142
+B1207164525551N00557712EA0112001140
+B1207184525538N00557710EA0111901139
+B1207204525527N00557708EA0111601137
+B1207224525515N00557707EA0111101135
+B1207244525502N00557706EA0110801132
+B1207264525490N00557706EA0110801130
+B1207284525479N00557707EA0110901130
+B1207304525469N00557707EA0111201131
+B1207324525460N00557707EA0111101131
+B1207344525451N00557709EA0110701129
+B1207364525441N00557710EA0110301126
+B1207384525430N00557711EA0110001122
+B1207404525419N00557712EA0109501119
+B1207424525407N00557712EA0108901114
+B1207444525395N00557712EA0108701109
+B1207464525383N00557709EA0108601107
+B1207484525374N00557703EA0108601106
+B1207504525364N00557696EA0108601105
+B1207524525354N00557689EA0109301105
+B1207544525346N00557684EA0109801107
+B1207564525342N00557680EA0109901109
+B1207584525335N00557682EA0109901111
+B1208004525336N00557695EA0110001112
+B1208024525349N00557702EA0110201114
+B1208044525363N00557690EA0110601116
+B1208064525364N00557670EA0110801120
+B1208084525356N00557654EA0111201126
+B1208104525347N00557651EA0111601132
+B1208124525341N00557658EA0111801136
+B1208144525339N00557670EA0112001140
+B1208164525347N00557678EA0112101141
+B1208184525362N00557669EA0112601144
+B1208204525369N00557653EA0112601146
+B1208224525369N00557633EA0112601147
+B1208244525364N00557618EA0112801148
+B1208264525354N00557616EA0113001149
+B1208284525343N00557620EA0113701153
+B1208304525335N00557622EA0114401159
+B1208324525328N00557621EA0114801164
+B1208344525324N00557628EA0114701168
+B1208364525330N00557641EA0114801171
+B1208384525343N00557637EA0115001173
+B1208404525350N00557617EA0115401175
+B1208424525347N00557600EA0115801179
+B1208444525339N00557597EA0116001181
+B1208464525330N00557606EA0116501186
+B1208484525330N00557617EA0116501189
+B1208504525340N00557624EA0116501192
+B1208524525353N00557614EA0116701193
+B1208544525359N00557596EA0117201195
+B1208564525354N00557581EA0117601198
+B1208584525344N00557576EA0117901201
+B1209004525335N00557580EA0118201204
+B1209024525333N00557594EA0118201206
+B1209044525342N00557603EA0118201207
+B1209064525355N00557598EA0118301207
+B1209084525362N00557582EA0118301207
+B1209104525359N00557563EA0118901209
+B1209124525354N00557551EA0119701214
+B1209144525350N00557541EA0119901219
+B1209164525343N00557531EA0120101221
+B1209184525330N00557530EA0120401224
+B1209204525324N00557543EA0120601226
+B1209224525330N00557556EA0121001228
+B1209244525341N00557555EA0121401232
+B1209264525349N00557542EA0121701236
+B1209284525348N00557525EA0122101240
+B1209304525338N00557514EA0122501244
+B1209324525327N00557519EA0122701248
+B1209344525324N00557533EA0122901251
+B1209364525332N00557542EA0123001253
+B1209384525343N00557538EA0123101255
+B1209404525348N00557521EA0123501257
+B1209424525346N00557502EA0124201262
+B1209444525341N00557487EA0124701268
+B1209464525331N00557481EA0125301274
+B1209484525321N00557482EA0125601279
+B1209504525315N00557492EA0125501282
+B1209524525321N00557505EA0125501285
+B1209544525331N00557499EA0125601286
+B1209564525336N00557478EA0126201288
+B1209584525333N00557460EA0126701292
+B1210004525324N00557449EA0127201297
+B1210024525316N00557440EA0127501300
+B1210044525307N00557437EA0127501303
+B1210064525299N00557448EA0127601304
+B1210084525302N00557461EA0128001307
+B1210104525312N00557457EA0128201309
+B1210124525319N00557442EA0128801312
+B1210144525319N00557425EA0129201316
+B1210164525314N00557412EA0129401318
+B1210184525305N00557405EA0129601320
+B1210204525297N00557413EA0129701321
+B1210224525298N00557426EA0129801322
+B1210244525307N00557431EA0130201324
+B1210264525316N00557421EA0130501326
+B1210284525319N00557403EA0130701328
+B1210304525312N00557388EA0130901331
+B1210324525302N00557382EA0131101334
+B1210344525294N00557385EA0131201336
+B1210364525291N00557397EA0131301338
+B1210384525297N00557407EA0131401339
+B1210404525307N00557404EA0131501341
+B1210424525313N00557390EA0131701343
+B1210444525315N00557374EA0131801345
+B1210464525313N00557360EA0132001347
+B1210484525308N00557347EA0132101348
+B1210504525300N00557339EA0132201349
+B1210524525291N00557339EA0132301350
+B1210544525284N00557349EA0132301351
+B1210564525287N00557363EA0132501351
+B1210584525296N00557362EA0132701352
+B1211004525302N00557346EA0132801353
+B1211024525300N00557329EA0132801354
+B1211044525292N00557315EA0132901355
+B1211064525281N00557309EA0132901355
+B1211084525272N00557314EA0132701355
+B1211104525271N00557329EA0132501353
+B1211124525282N00557330EA0132401352
+B1211144525291N00557317EA0132401352
+B1211164525295N00557301EA0132401352
+B1211184525296N00557282EA0132401352
+B1211204525292N00557264EA0132401352
+B1211224525284N00557251EA0132201351
+B1211244525274N00557243EA0131801348
+B1211264525261N00557238EA0131501345
+B1211284525248N00557231EA0131401342
+B1211304525235N00557224EA0131401341
+B1211324525224N00557219EA0131401341
+B1211344525214N00557211EA0131101339
+B1211364525203N00557200EA0130901337
+B1211384525192N00557188EA0131001336
+B1211404525182N00557177EA0131001336
+B1211424525173N00557168EA0131001337
+B1211444525164N00557162EA0130901337
+B1211464525155N00557154EA0130801335
+B1211484525145N00557146EA0130601333
+B1211504525133N00557137EA0130501332
+B1211524525123N00557127EA0130401331
+B1211544525112N00557115EA0130201330
+B1211564525100N00557104EA0130101328
+B1211584525088N00557094EA0129801327
+B1212004525076N00557084EA0129601325
+B1212024525063N00557074EA0129401323
+B1212044525051N00557063EA0129101321
+B1212064525040N00557054EA0128601317
+B1212084525027N00557043EA0128001312
+B1212104525015N00557031EA0127701308
+B1212124525003N00557022EA0127401305
+B1212144524991N00557015EA0127001300
+B1212164524977N00557010EA0126501295
+B1212184524964N00557007EA0126201291
+B1212204524950N00557005EA0125701287
+B1212224524936N00557004EA0125301282
+B1212244524922N00557003EA0124901277
+B1212264524911N00557000EA0124301272
+B1212284524899N00557000EA0123801266
+B1212304524886N00557001EA0123501260
+B1212324524875N00557001EA0123501256
+B1212344524865N00557000EA0123401253
+B1212364524853N00557001EA0123401253
+B1212384524841N00557002EA0123501254
+B1212404524830N00557004EA0123501255
+B1212424524817N00557006EA0123601256
+B1212444524805N00557007EA0123901258
+B1212464524794N00557009EA0124301261
+B1212484524784N00557010EA0124601264
+B1212504524777N00557019EA0124701267
+B1212524524778N00557036EA0125101269
+B1212544524787N00557044EA0125401272
+B1212564524798N00557033EA0125601274
+B1212584524797N00557012EA0125701278
+B1213004524784N00557007EA0125901281
+B1213024524775N00557019EA0126401285
+B1213044524777N00557034EA0126801288
+B1213064524786N00557040EA0127201293
+B1213084524796N00557037EA0127501297
+B1213104524801N00557024EA0127601301
+B1213124524799N00557006EA0127601303
+B1213144524787N00557000EA0127901305
+B1213164524777N00557009EA0128201308
+B1213184524778N00557022EA0128601310
+B1213204524788N00557031EA0129101315
+B1213224524798N00557029EA0129401319
+B1213244524806N00557017EA0129801322
+B1213264524805N00556999EA0130101326
+B1213284524796N00556987EA0130301328
+B1213304524784N00556992EA0130501330
+B1213324524781N00557006EA0130901331
+B1213344524791N00557018EA0131401337
+B1213364524800N00557019EA0131901342
+B1213384524807N00557012EA0132101345
+B1213404524805N00556993EA0132201348
+B1213424524793N00556982EA0132701352
+B1213444524783N00556990EA0132901355
+B1213464524785N00557006EA0133201358
+B1213484524796N00557012EA0133601362
+B1213504524805N00557001EA0134001364
+B1213524524807N00556982EA0134501368
+B1213544524801N00556963EA0134701372
+B1213564524787N00556959EA0135001375
+B1213584524779N00556972EA0135101377
+B1214004524784N00556985EA0135301380
+B1214024524795N00556986EA0135701382
+B1214044524802N00556973EA0136201386
+B1214064524801N00556956EA0136501390
+B1214084524793N00556942EA0136801394
+B1214104524782N00556939EA0136901396
+B1214124524773N00556950EA0137001398
+B1214144524776N00556964EA0137201400
+B1214164524787N00556968EA0137701402
+B1214184524798N00556963EA0138301407
+B1214204524807N00556956EA0138701412
+B1214224524814N00556946EA0138801415
+B1214244524815N00556927EA0138701417
+B1214264524807N00556909EA0139101419
+B1214284524793N00556911EA0139401421
+B1214304524787N00556921EA0139501423
+B1214324524792N00556933EA0139801425
+B1214344524802N00556933EA0140101428
+B1214364524809N00556920EA0140201431
+B1214384524811N00556903EA0140401431
+B1214404524805N00556886EA0140601433
+B1214424524793N00556881EA0140701435
+B1214444524784N00556890EA0140901436
+B1214464524783N00556903EA0141101439
+B1214484524789N00556913EA0141301441
+B1214504524800N00556915EA0141601443
+B1214524524811N00556909EA0141901446
+B1214544524818N00556896EA0141901448
+B1214564524818N00556877EA0141701449
+B1214584524810N00556862EA0141701449
+B1215004524797N00556864EA0141901449
+B1215024524792N00556876EA0142101450
+B1215044524797N00556888EA0142301451
+B1215064524808N00556891EA0142501453
+B1215084524819N00556885EA0142601454
+B1215104524826N00556876EA0142501454
+B1215124524829N00556862EA0142201453
+B1215144524827N00556845EA0141901451
+B1215164524815N00556837EA0141701448
+B1215184524803N00556841EA0141701447
+B1215204524798N00556850EA0141801446
+B1215224524798N00556860EA0141901447
+B1215244524800N00556870EA0142001447
+B1215264524803N00556881EA0142101449
+B1215284524804N00556891EA0142101449
+B1215304524806N00556898EA0142001448
+B1215324524816N00556898EA0142201448
+B1215344524824N00556885EA0142101448
+B1215364524824N00556870EA0141701447
+B1215384524818N00556855EA0141401444
+B1215404524809N00556840EA0141501443
+B1215424524803N00556823EA0141701443
+B1215444524798N00556807EA0141801445
+B1215464524793N00556789EA0141901446
+B1215484524787N00556771EA0142201447
+B1215504524783N00556755EA0142401450
+B1215524524779N00556741EA0142201451
+B1215544524773N00556725EA0141901451
+B1215564524766N00556709EA0141801450
+B1215584524759N00556693EA0141601448
+B1216004524751N00556679EA0141101445
+B1216024524744N00556664EA0140601440
+B1216044524737N00556648EA0140101435
+B1216064524731N00556632EA0139701431
+B1216084524725N00556617EA0139201425
+B1216104524717N00556601EA0138801420
+B1216124524710N00556584EA0138501416
+B1216144524703N00556567EA0138301413
+B1216164524696N00556550EA0137901409
+B1216184524690N00556532EA0137601405
+B1216204524682N00556516EA0137501403
+B1216224524676N00556502EA0137401402
+B1216244524669N00556487EA0137401401
+B1216264524663N00556471EA0137601401
+B1216284524659N00556455EA0137601402
+B1216304524654N00556440EA0137501401
+B1216324524647N00556424EA0137401400
+B1216344524640N00556407EA0137401400
+B1216364524634N00556392EA0137301400
+B1216384524628N00556380EA0137101399
+B1216404524621N00556367EA0136701397
+B1216424524613N00556354EA0136201393
+B1216444524606N00556340EA0135801388
+B1216464524600N00556325EA0135601385
+B1216484524592N00556311EA0135501382
+B1216504524585N00556296EA0135501381
+B1216524524578N00556281EA0135801381
+B1216544524572N00556267EA0136001382
+B1216564524567N00556253EA0136101384
+B1216584524563N00556238EA0136201385
+B1217004524560N00556221EA0136501387
+B1217024524558N00556205EA0137101391
+B1217044524554N00556192EA0137501395
+B1217064524545N00556190EA0137701399
+B1217084524537N00556203EA0138101403
+B1217104524538N00556217EA0138501407
+B1217124524548N00556220EA0138701411
+B1217144524558N00556205EA0138901414
+B1217164524560N00556187EA0139201417
+B1217184524558N00556170EA0139701422
+B1217204524556N00556155EA0140301427
+B1217224524549N00556144EA0140801432
+B1217244524540N00556138EA0141101437
+B1217264524531N00556148EA0141101440
+B1217284524533N00556164EA0141401444
+B1217304524545N00556164EA0141901447
+B1217324524554N00556148EA0142501452
+B1217344524553N00556133EA0142901456
+B1217364524546N00556123EA0143201459
+B1217384524536N00556128EA0143401463
+B1217404524536N00556142EA0143601465
+B1217424524546N00556150EA0144101467
+B1217444524558N00556143EA0144501470
+B1217464524563N00556129EA0144801473
+B1217484524566N00556114EA0145101476
+B1217504524565N00556102EA0145101478
+B1217524524561N00556090EA0145201478
+B1217544524551N00556082EA0145601480
+B1217564524540N00556085EA0146201482
+B1217584524531N00556091EA0146801487
+B1218004524525N00556098EA0147101492
+B1218024524526N00556112EA0147101496
+B1218044524537N00556122EA0147401499
+B1218064524549N00556114EA0147701502
+B1218084524554N00556095EA0148101506
+B1218104524548N00556080EA0148701510
+B1218124524537N00556078EA0149201515
+B1218144524529N00556088EA0149501519
+B1218164524528N00556103EA0149801523
+B1218184524536N00556113EA0150001526
+B1218204524548N00556106EA0150201529
+B1218224524555N00556088EA0150801532
+B1218244524551N00556071EA0151301538
+B1218264524543N00556059EA0152001545
+B1218284524536N00556049EA0152701552
+B1218304524528N00556043EA0153201558
+B1218324524519N00556050EA0153501563
+B1218344524518N00556064EA0153901568
+B1218364524529N00556075EA0154401572
+B1218384524540N00556064EA0154801576
+B1218404524544N00556045EA0155501581
+B1218424524540N00556030EA0156201589
+B1218444524534N00556019EA0156801595
+B1218464524526N00556013EA0156901600
+B1218484524516N00556022EA0157101604
+B1218504524517N00556039EA0157301608
+B1218524524529N00556045EA0157701612
+B1218544524544N00556037EA0158301615
+B1218564524553N00556021EA0159101621
+B1218584524554N00556004EA0159501627
+B1219004524550N00555991EA0159701632
+B1219024524542N00555987EA0159701634
+B1219044524535N00555999EA0159801636
+B1219064524540N00556016EA0160201638
+B1219084524556N00556020EA0160701640
+B1219104524573N00556015EA0161501646
+B1219124524586N00556007EA0162301653
+B1219144524592N00555995EA0162701658
+B1219164524588N00555980EA0163001662
+B1219184524579N00555980EA0163401666
+B1219204524575N00555997EA0163701669
+B1219224524587N00556013EA0164101672
+B1219244524603N00556012EA0164801676
+B1219264524613N00556004EA0165001681
+B1219284524619N00555994EA0164901683
+B1219304524618N00555980EA0164701683
+B1219324524610N00555971EA0164701682
+B1219344524597N00555974EA0165401684
+B1219364524587N00555979EA0166301688
+B1219384524581N00555981EA0166701694
+B1219404524577N00555983EA0166701697
+B1219424524576N00555998EA0167001698
+B1219444524585N00556015EA0167701702
+B1219464524599N00556014EA0168201705
+B1219484524606N00556002EA0168301709
+B1219504524601N00555987EA0168901714
+B1219524524593N00555980EA0169601721
+B1219544524586N00555987EA0169901726
+B1219564524583N00556000EA0170101730
+B1219584524586N00556015EA0170301733
+B1220004524596N00556026EA0170901736
+B1220024524608N00556023EA0171501742
+B1220044524613N00556013EA0171901746
+B1220064524610N00556001EA0172501753
+B1220084524600N00556000EA0172801758
+B1220104524591N00556012EA0173101762
+B1220124524590N00556031EA0173701766
+B1220144524600N00556043EA0174101770
+B1220164524611N00556042EA0174501775
+B1220184524617N00556031EA0174801778
+B1220204524614N00556018EA0175201783
+B1220224524603N00556016EA0175401786
+B1220244524593N00556027EA0175901790
+B1220264524586N00556043EA0176501795
+B1220284524586N00556060EA0176801799
+B1220304524592N00556075EA0177101802
+B1220324524603N00556079EA0177201805
+B1220344524611N00556068EA0177501808
+B1220364524612N00556054EA0178001811
+B1220384524603N00556047EA0178401815
+B1220404524592N00556048EA0179001821
+B1220424524582N00556052EA0179201825
+B1220444524574N00556063EA0179201827
+B1220464524572N00556083EA0179301829
+B1220484524581N00556097EA0179501831
+B1220504524593N00556093EA0179601832
+B1220524524599N00556081EA0179901834
+B1220544524598N00556068EA0180301837
+B1220564524594N00556057EA0180601841
+B1220584524588N00556048EA0180701843
+B1221004524582N00556037EA0181001844
+B1221024524578N00556025EA0181301848
+B1221044524575N00556013EA0181801851
+B1221064524573N00556000EA0182201856
+B1221084524569N00555989EA0182401859
+B1221104524562N00555981EA0182601861
+B1221124524553N00555983EA0182901863
+B1221144524548N00555994EA0183101865
+B1221164524551N00556008EA0183101867
+B1221184524560N00556018EA0183101867
+B1221204524573N00556019EA0183101867
+B1221224524584N00556013EA0183201867
+B1221244524591N00556001EA0183301868
+B1221264524596N00555987EA0183501869
+B1221284524600N00555976EA0183701871
+B1221304524601N00555965EA0183601871
+B1221324524602N00555952EA0183501870
+B1221344524608N00555936EA0183801870
+B1221364524613N00555919EA0184201872
+B1221384524615N00555907EA0184601876
+B1221404524617N00555896EA0184601878
+B1221424524620N00555881EA0184701879
+B1221444524623N00555865EA0184801880
+B1221464524626N00555850EA0184901881
+B1221484524628N00555834EA0185101883
+B1221504524631N00555818EA0185301886
+B1221524524633N00555801EA0185401887
+B1221544524634N00555785EA0185301888
+B1221564524635N00555769EA0185201887
+B1221584524634N00555752EA0185101886
+B1222004524633N00555734EA0185001885
+B1222024524633N00555715EA0185101885
+B1222044524631N00555697EA0185301886
+B1222064524629N00555683EA0185301887
+B1222084524628N00555670EA0185101886
+B1222104524625N00555654EA0185001885
+B1222124524621N00555640EA0185201885
+B1222144524617N00555627EA0185801887
+B1222164524614N00555616EA0186301890
+B1222184524611N00555605EA0186501894
+B1222204524609N00555592EA0186601896
+B1222224524605N00555575EA0186701897
+B1222244524600N00555557EA0187301901
+B1222264524594N00555541EA0187801906
+B1222284524590N00555526EA0188001910
+B1222304524584N00555510EA0187801912
+B1222324524576N00555492EA0187801912
+B1222344524567N00555472EA0188401916
+B1222364524560N00555455EA0188701921
+B1222384524554N00555442EA0188601923
+B1222404524546N00555429EA0188501923
+B1222424524537N00555416EA0188401922
+B1222444524529N00555403EA0188301920
+B1222464524521N00555390EA0188201919
+B1222484524512N00555377EA0188201918
+B1222504524504N00555366EA0188101918
+B1222524524495N00555354EA0188101917
+B1222544524485N00555342EA0188301917
+B1222564524476N00555329EA0188601919
+B1222584524466N00555316EA0189001921
+B1223004524455N00555307EA0189601925
+B1223024524444N00555308EA0190901930
+B1223044524439N00555303EA0191601938
+B1223064524434N00555296EA0192201945
+B1223084524424N00555302EA0192901952
+B1223104524423N00555317EA0193501958
+B1223124524439N00555319EA0194301966
+B1223144524451N00555307EA0195501976
+B1223164524449N00555293EA0196001986
+B1223184524441N00555283EA0196701994
+B1223204524432N00555278EA0197302002
+B1223224524424N00555290EA0197902009
+B1223244524427N00555307EA0198602016
+B1223264524440N00555311EA0199602023
+B1223284524449N00555297EA0200302031
+B1223304524449N00555283EA0200802038
+B1223324524446N00555270EA0201102042
+B1223344524436N00555262EA0201702047
+B1223364524427N00555269EA0202402053
+B1223384524426N00555283EA0203002060
+B1223404524435N00555291EA0203602066
+B1223424524448N00555286EA0204502074
+B1223444524453N00555272EA0205102081
+B1223464524451N00555256EA0205602088
+B1223484524447N00555243EA0206102094
+B1223504524440N00555235EA0206502099
+B1223524524431N00555238EA0207302105
+B1223544524427N00555252EA0207802110
+B1223564524436N00555267EA0208502116
+B1223584524449N00555264EA0209202124
+B1224004524454N00555246EA0209602129
+B1224024524452N00555229EA0210402137
+B1224044524446N00555222EA0211002143
+B1224064524437N00555223EA0211602149
+B1224084524435N00555236EA0212002155
+B1224104524440N00555251EA0212702160
+B1224124524452N00555256EA0213402166
+B1224144524464N00555244EA0213902171
+B1224164524470N00555229EA0214402178
+B1224184524467N00555215EA0214902184
+B1224204524461N00555207EA0215402188
+B1224224524453N00555208EA0215802193
+B1224244524448N00555220EA0216102197
+B1224264524455N00555235EA0216702201
+B1224284524469N00555240EA0217402206
+B1224304524483N00555234EA0218002213
+B1224324524493N00555224EA0218402219
+B1224344524497N00555211EA0218602223
+B1224364524495N00555196EA0218802226
+B1224384524487N00555188EA0219102228
+B1224404524479N00555180EA0219902233
+B1224424524473N00555171EA0220902239
+B1224444524468N00555164EA0221402246
+B1224464524461N00555155EA0221802251
+B1224484524452N00555144EA0222102255
+B1224504524444N00555136EA0222302259
+B1224524524434N00555130EA0222502261
+B1224544524423N00555123EA0222702263
+B1224564524413N00555117EA0222702265
+B1224584524403N00555113EA0222702266
+B1225004524392N00555109EA0222902267
+B1225024524382N00555103EA0223002268
+B1225044524371N00555097EA0223202270
+B1225064524361N00555091EA0223402271
+B1225084524350N00555085EA0223502273
+B1225104524340N00555078EA0223602274
+B1225124524330N00555073EA0223702276
+B1225144524320N00555066EA0223802277
+B1225164524310N00555059EA0223902278
+B1225184524299N00555052EA0224102279
+B1225204524288N00555045EA0224302282
+B1225224524279N00555037EA0224402283
+B1225244524269N00555028EA0224502284
+B1225264524258N00555018EA0224602285
+B1225284524248N00555007EA0224702287
+B1225304524238N00554995EA0224602287
+B1225324524226N00554984EA0224302286
+B1225344524215N00554974EA0224102284
+B1225364524204N00554966EA0223602281
+B1225384524193N00554958EA0223202277
+B1225404524181N00554949EA0223002274
+B1225424524170N00554940EA0222902271
+B1225444524158N00554933EA0222602269
+B1225464524148N00554925EA0222502267
+B1225484524138N00554917EA0222402265
+B1225504524128N00554909EA0222202263
+B1225524524117N00554900EA0222302262
+B1225544524107N00554892EA0222302262
+B1225564524097N00554885EA0222502263
+B1225584524087N00554876EA0222502263
+B1226004524077N00554867EA0222502263
+B1226024524066N00554858EA0222402263
+B1226044524055N00554850EA0222402263
+B1226064524044N00554841EA0222202262
+B1226084524032N00554833EA0222202261
+B1226104524022N00554826EA0222002260
+B1226124524011N00554820EA0221602257
+B1226144523999N00554813EA0221502255
+B1226164523988N00554805EA0221502254
+B1226184523978N00554799EA0221402253
+B1226204523967N00554793EA0221202251
+B1226224523955N00554786EA0221102249
+B1226244523944N00554778EA0221402248
+B1226264523936N00554775EA0221602249
+B1226284523928N00554770EA0221802250
+B1226304523919N00554762EA0222102253
+B1226324523909N00554755EA0222502257
+B1226344523901N00554750EA0223002261
+B1226364523895N00554745EA0223102264
+B1226384523887N00554739EA0223202266
+B1226404523878N00554730EA0223502268
+B1226424523870N00554722EA0223802272
+B1226444523861N00554714EA0224002274
+B1226464523852N00554706EA0224202277
+B1226484523843N00554696EA0224502280
+B1226504523836N00554684EA0224702283
+B1226524523828N00554675EA0224902285
+B1226544523819N00554666EA0224902286
+B1226564523811N00554658EA0225002288
+B1226584523803N00554651EA0225102288
+B1227004523795N00554646EA0225002289
+B1227024523786N00554643EA0224902288
+B1227044523776N00554640EA0224902287
+B1227064523765N00554636EA0225002288
+B1227084523756N00554634EA0225102289
+B1227104523746N00554635EA0224902288
+B1227124523734N00554634EA0224802287
+B1227144523722N00554633EA0224902287
+B1227164523713N00554631EA0224902288
+B1227184523703N00554626EA0224902287
+B1227204523693N00554623EA0225102288
+B1227224523684N00554621EA0225302290
+B1227244523674N00554618EA0225202290
+B1227264523663N00554616EA0225102289
+B1227284523651N00554614EA0225002288
+B1227304523639N00554609EA0224902287
+B1227324523628N00554606EA0224902287
+B1227344523616N00554602EA0224802286
+B1227364523603N00554597EA0224802285
+B1227384523589N00554594EA0225002286
+B1227404523576N00554591EA0225002286
+B1227424523562N00554587EA0225202287
+B1227444523548N00554584EA0225302289
+B1227464523536N00554581EA0225302289
+B1227484523522N00554576EA0225302289
+B1227504523509N00554569EA0225502290
+B1227524523497N00554563EA0225702292
+B1227544523485N00554556EA0225702293
+B1227564523473N00554551EA0225702293
+B1227584523460N00554546EA0225702293
+B1228004523447N00554541EA0225802294
+B1228024523434N00554535EA0225802294
+B1228044523421N00554529EA0225802294
+B1228064523405N00554524EA0225902295
+B1228084523392N00554520EA0226002296
+B1228104523379N00554516EA0226002296
+B1228124523365N00554511EA0226202297
+B1228144523352N00554507EA0226302299
+B1228164523339N00554505EA0226402300
+B1228184523327N00554502EA0226302301
+B1228204523314N00554499EA0226102300
+B1228224523300N00554496EA0226102300
+B1228244523287N00554493EA0226002299
+B1228264523274N00554489EA0225902298
+B1228284523260N00554485EA0226002298
+B1228304523246N00554482EA0225902298
+B1228324523232N00554478EA0225902298
+B1228344523219N00554476EA0225902297
+B1228364523204N00554473EA0225902297
+B1228384523191N00554468EA0225902297
+B1228404523177N00554463EA0226002297
+B1228424523164N00554459EA0225902297
+B1228444523152N00554455EA0225802297
+B1228464523139N00554450EA0225802296
+B1228484523125N00554446EA0225802297
+B1228504523112N00554442EA0225902297
+B1228524523099N00554440EA0225802297
+B1228544523085N00554437EA0225802296
+B1228564523072N00554435EA0225802297
+B1228584523059N00554432EA0225902297
+B1229004523046N00554430EA0225802297
+B1229024523033N00554429EA0225702296
+B1229044523020N00554425EA0225702295
+B1229064523007N00554421EA0225902296
+B1229084522995N00554418EA0226302298
+B1229104522983N00554416EA0226502300
+B1229124522972N00554413EA0226502302
+B1229144522959N00554408EA0226502302
+B1229164522945N00554404EA0226602303
+B1229184522932N00554402EA0226702304
+B1229204522918N00554398EA0226702305
+B1229224522904N00554395EA0226702305
+B1229244522893N00554392EA0226402304
+B1229264522880N00554386EA0226202302
+B1229284522867N00554380EA0226602302
+B1229304522856N00554375EA0226902303
+B1229324522845N00554371EA0226902303
+B1229344522830N00554366EA0227002304
+B1229364522816N00554361EA0227202306
+B1229384522802N00554357EA0227302308
+B1229404522788N00554356EA0227302309
+B1229424522774N00554356EA0227302309
+B1229444522761N00554354EA0227202309
+B1229464522748N00554353EA0226802308
+B1229484522733N00554350EA0226402305
+B1229504522719N00554345EA0226202303
+B1229524522706N00554339EA0225902300
+B1229544522694N00554331EA0225702297
+B1229564522681N00554324EA0225502294
+B1229584522667N00554317EA0225302292
+B1230004522654N00554310EA0225002290
+B1230024522640N00554305EA0224602286
+B1230044522626N00554299EA0224302283
+B1230064522613N00554293EA0224202280
+B1230084522599N00554287EA0224202279
+B1230104522586N00554284EA0224302279
+B1230124522573N00554281EA0224302279
+B1230144522561N00554275EA0224202278
+B1230164522550N00554267EA0224002277
+B1230184522537N00554260EA0223802275
+B1230204522524N00554255EA0223602274
+B1230224522511N00554253EA0223302272
+B1230244522498N00554249EA0223002269
+B1230264522484N00554246EA0222802266
+B1230284522470N00554243EA0222602264
+B1230304522457N00554238EA0222602263
+B1230324522445N00554234EA0222402261
+B1230344522432N00554230EA0222102259
+B1230364522419N00554226EA0221902257
+B1230384522405N00554221EA0221802255
+B1230404522392N00554217EA0221702254
+B1230424522380N00554212EA0221602253
+B1230444522366N00554207EA0221502252
+B1230464522353N00554202EA0221502251
+B1230484522341N00554197EA0221502251
+B1230504522329N00554192EA0221302250
+B1230524522316N00554187EA0221202248
+B1230544522303N00554182EA0221102248
+B1230564522291N00554177EA0220902246
+B1230584522278N00554174EA0220702245
+B1231004522266N00554171EA0220702243
+B1231024522253N00554166EA0220702243
+B1231044522240N00554162EA0220602243
+B1231064522228N00554158EA0220602242
+B1231084522216N00554154EA0220702242
+B1231104522204N00554151EA0220802244
+B1231124522192N00554148EA0220702244
+B1231144522180N00554144EA0220402243
+B1231164522166N00554140EA0220302241
+B1231184522153N00554137EA0220302241
+B1231204522141N00554132EA0220402241
+B1231224522129N00554126EA0220502242
+B1231244522117N00554122EA0220502242
+B1231264522105N00554118EA0220402241
+B1231284522092N00554114EA0220402241
+B1231304522079N00554110EA0220602241
+B1231324522067N00554106EA0221102243
+B1231344522058N00554100EA0221202245
+B1231364522050N00554091EA0221102245
+B1231384522038N00554084EA0221202245
+B1231404522027N00554077EA0221402247
+B1231424522018N00554071EA0221302248
+B1231444522010N00554065EA0221002248
+B1231464522000N00554057EA0220602246
+B1231484521988N00554050EA0220302244
+B1231504521976N00554043EA0220202242
+B1231524521965N00554035EA0220102240
+B1231544521954N00554026EA0220102239
+B1231564521943N00554018EA0220402239
+B1231584521934N00554012EA0220802241
+B1232004521926N00554008EA0221202244
+B1232024521917N00554002EA0221502247
+B1232044521908N00553995EA0221702250
+B1232064521899N00553989EA0222202254
+B1232084521891N00553984EA0222502258
+B1232104521883N00553979EA0222802261
+B1232124521873N00553975EA0223102264
+B1232144521862N00553971EA0223502268
+B1232164521851N00553965EA0223902273
+B1232184521841N00553957EA0224402277
+B1232204521832N00553952EA0224702281
+B1232224521823N00553947EA0224902284
+B1232244521813N00553939EA0225102287
+B1232264521802N00553933EA0225402289
+B1232284521792N00553926EA0226002293
+B1232304521782N00553916EA0226402297
+B1232324521772N00553909EA0226902302
+B1232344521761N00553903EA0227502307
+B1232364521753N00553894EA0228302314
+B1232384521746N00553883EA0229302321
+B1232404521740N00553873EA0230302331
+B1232424521732N00553865EA0231102340
+B1232444521724N00553858EA0231902349
+B1232464521716N00553850EA0232702358
+B1232484521707N00553844EA0233302366
+B1232504521698N00553836EA0233702372
+B1232524521689N00553829EA0234102378
+B1232544521679N00553821EA0234502382
+B1232564521669N00553811EA0235302388
+B1232584521661N00553800EA0236002395
+B1233004521653N00553790EA0236102400
+B1233024521643N00553780EA0236302403
+B1233044521634N00553771EA0236602407
+B1233064521626N00553763EA0236502409
+B1233084521617N00553753EA0236502409
+B1233104521607N00553741EA0237102411
+B1233124521599N00553731EA0237702415
+B1233144521592N00553724EA0237902418
+B1233164521583N00553716EA0238202420
+B1233184521573N00553708EA0238802424
+B1233204521563N00553698EA0239302429
+B1233224521554N00553688EA0239602433
+B1233244521543N00553678EA0240002437
+B1233264521534N00553667EA0240202440
+B1233284521524N00553655EA0240302443
+B1233304521514N00553641EA0240902446
+B1233324521509N00553623EA0241502450
+B1233344521503N00553609EA0241802454
+B1233364521495N00553597EA0242202458
+B1233384521490N00553582EA0242602462
+B1233404521487N00553567EA0242702465
+B1233424521483N00553550EA0242802467
+B1233444521475N00553535EA0242902469
+B1233464521469N00553520EA0243002470
+B1233484521464N00553502EA0243102471
+B1233504521458N00553486EA0243302473
+B1233524521450N00553471EA0243502475
+B1233544521443N00553457EA0243402476
+B1233564521433N00553444EA0243102476
+B1233584521421N00553430EA0243002475
+B1234004521408N00553416EA0243402475
+B1234024521399N00553404EA0243402477
+B1234044521391N00553393EA0243002476
+B1234064521382N00553380EA0243002475
+B1234084521372N00553369EA0243102476
+B1234104521362N00553364EA0242902475
+B1234124521349N00553360EA0243202474
+B1234144521336N00553360EA0243502476
+B1234164521325N00553365EA0243502477
+B1234184521314N00553369EA0243102477
+B1234204521301N00553369EA0242802474
+B1234224521289N00553364EA0242402470
+B1234244521279N00553359EA0242002466
+B1234264521266N00553355EA0241602461
+B1234284521254N00553350EA0241502458
+B1234304521242N00553345EA0241502457
+B1234324521231N00553341EA0241302456
+B1234344521221N00553336EA0240802453
+B1234364521211N00553330EA0240202449
+B1234384521199N00553324EA0239802444
+B1234404521189N00553320EA0239302440
+B1234424521179N00553318EA0238602434
+B1234444521168N00553316EA0238002426
+B1234464521156N00553312EA0237602420
+B1234484521144N00553306EA0237502416
+B1234504521135N00553300EA0237002411
+B1234524521125N00553292EA0236402405
+B1234544521114N00553284EA0236102400
+B1234564521102N00553281EA0235802396
+B1234584521092N00553278EA0235502393
+B1235004521082N00553273EA0235002389
+B1235024521071N00553267EA0234702384
+B1235044521060N00553263EA0234402382
+B1235064521050N00553261EA0234002379
+B1235084521040N00553260EA0233402374
+B1235104521028N00553257EA0233002369
+B1235124521017N00553252EA0232702366
+B1235144521009N00553247EA0232302362
+B1235164520999N00553241EA0231802357
+B1235184520989N00553234EA0231502353
+B1235204520978N00553229EA0231502350
+B1235224520969N00553224EA0231302349
+B1235244520960N00553219EA0231002345
+B1235264520948N00553213EA0230802343
+B1235284520938N00553210EA0230802343
+B1235304520928N00553206EA0230602341
+B1235324520918N00553201EA0230502340
+B1235344520908N00553196EA0230302339
+B1235364520899N00553191EA0229902337
+B1235384520890N00553184EA0229502333
+B1235404520879N00553178EA0229102329
+B1235424520869N00553173EA0228702326
+B1235444520861N00553167EA0228002322
+B1235464520852N00553161EA0227202315
+B1235484520841N00553155EA0226802310
+B1235504520832N00553148EA0226602307
+B1235524520824N00553143EA0226002301
+B1235544520814N00553135EA0225702297
+B1235564520804N00553130EA0225402293
+B1235584520795N00553127EA0225202290
+B1236004520786N00553120EA0224902286
+B1236024520777N00553113EA0225102285
+B1236044520769N00553106EA0225102284
+B1236064520760N00553099EA0225102284
+B1236084520749N00553091EA0225102285
+B1236104520740N00553083EA0225302286
+B1236124520731N00553075EA0225102286
+B1236144520721N00553067EA0224802285
+B1236164520712N00553058EA0224602283
+B1236184520704N00553050EA0224302280
+B1236204520695N00553041EA0224202279
+B1236224520686N00553034EA0224302279
+B1236244520678N00553027EA0224202278
+B1236264520670N00553020EA0223802276
+B1236284520659N00553014EA0223702274
+B1236304520648N00553007EA0223902274
+B1236324520639N00552999EA0224002275
+B1236344520629N00552991EA0224202277
+B1236364520619N00552983EA0224602279
+B1236384520611N00552975EA0224902282
+B1236404520603N00552969EA0225002284
+B1236424520594N00552965EA0224602285
+B1236444520585N00552961EA0224102283
+B1236464520576N00552956EA0223702279
+B1236484520567N00552950EA0223102274
+B1236504520555N00552944EA0222802269
+B1236524520543N00552936EA0223002265
+B1236544520534N00552927EA0223202264
+B1236564520525N00552921EA0223402264
+B1236584520515N00552915EA0223302265
+B1237004520503N00552909EA0223202264
+B1237024520491N00552904EA0223302265
+B1237044520480N00552898EA0223302266
+B1237064520470N00552892EA0223302266
+B1237084520459N00552885EA0223502267
+B1237104520448N00552877EA0223902269
+B1237124520440N00552869EA0224202273
+B1237144520433N00552862EA0224002275
+B1237164520424N00552856EA0223702276
+B1237184520415N00552850EA0223502274
+B1237204520405N00552842EA0223502274
+B1237224520396N00552834EA0223602275
+B1237244520387N00552825EA0223902276
+B1237264520377N00552816EA0224402278
+B1237284520369N00552807EA0224802282
+B1237304520362N00552796EA0225202286
+B1237324520354N00552783EA0225902291
+B1237344520344N00552774EA0226702297
+B1237364520336N00552768EA0227002303
+B1237384520328N00552765EA0227402307
+B1237404520319N00552759EA0228002312
+B1237424520310N00552752EA0228702319
+B1237444520301N00552748EA0229202325
+B1237464520292N00552743EA0229902331
+B1237484520283N00552740EA0230402338
+B1237504520275N00552736EA0230802343
+B1237524520265N00552731EA0231202347
+B1237544520253N00552725EA0231802353
+B1237564520243N00552720EA0232202359
+B1237584520233N00552719EA0232502363
+B1238004520223N00552717EA0232802366
+B1238024520214N00552711EA0233102369
+B1238044520205N00552704EA0233402372
+B1238064520197N00552694EA0233602374
+B1238084520189N00552684EA0233902378
+B1238104520180N00552675EA0234102380
+B1238124520170N00552668EA0234102382
+B1238144520160N00552659EA0234002382
+B1238164520147N00552650EA0234102382
+B1238184520135N00552642EA0234602383
+B1238204520123N00552636EA0235002386
+B1238224520112N00552630EA0235302389
+B1238244520101N00552621EA0236002394
+B1238264520091N00552613EA0236702399
+B1238284520081N00552606EA0237302406
+B1238304520072N00552599EA0237802411
+B1238324520063N00552593EA0238102416
+B1238344520054N00552587EA0238002419
+B1238364520045N00552581EA0237702421
+B1238384520034N00552573EA0237602421
+B1238404520025N00552569EA0237502420
+B1238424520018N00552565EA0237202418
+B1238444520009N00552560EA0237002415
+B1238464519998N00552551EA0237002413
+B1238484519989N00552542EA0237302413
+B1238504519982N00552534EA0237402413
+B1238524519974N00552527EA0237502413
+B1238544519965N00552519EA0237702414
+B1238564519957N00552512EA0237902416
+B1238584519949N00552507EA0237902418
+B1239004519939N00552503EA0237802417
+B1239024519928N00552496EA0238702419
+B1239044519920N00552489EA0239802423
+B1239064519912N00552484EA0240302430
+B1239084519903N00552480EA0240502433
+B1239104519893N00552475EA0240502436
+B1239124519882N00552469EA0240402437
+B1239144519873N00552462EA0240202437
+B1239164519863N00552455EA0239902436
+B1239184519855N00552446EA0239702433
+B1239204519845N00552437EA0239602432
+B1239224519835N00552429EA0239602432
+B1239244519825N00552422EA0239402431
+B1239264519815N00552413EA0239102429
+B1239284519804N00552404EA0238802427
+B1239304519793N00552395EA0238602425
+B1239324519785N00552387EA0238002422
+B1239344519775N00552378EA0237302418
+B1239364519763N00552369EA0237002412
+B1239384519752N00552360EA0236702409
+B1239404519742N00552352EA0236302405
+B1239424519733N00552345EA0235802400
+B1239444519722N00552337EA0235402396
+B1239464519712N00552328EA0235302393
+B1239484519703N00552320EA0235402391
+B1239504519693N00552313EA0235202390
+B1239524519680N00552307EA0234902387
+B1239544519666N00552300EA0234702385
+B1239564519654N00552293EA0234502384
+B1239584519644N00552285EA0234502382
+B1240004519632N00552275EA0234802382
+B1240024519621N00552268EA0235002383
+B1240044519610N00552264EA0234902383
+B1240064519598N00552257EA0234502381
+B1240084519586N00552247EA0234302380
+B1240104519574N00552239EA0234002377
+B1240124519562N00552233EA0233502374
+B1240144519549N00552226EA0233002369
+B1240164519537N00552218EA0232502364
+B1240184519524N00552208EA0232102359
+B1240204519513N00552199EA0231802356
+B1240224519504N00552191EA0231502353
+B1240244519493N00552183EA0231002348
+B1240264519481N00552174EA0230502343
+B1240284519469N00552164EA0230202339
+B1240304519459N00552154EA0230302337
+B1240324519449N00552146EA0230502335
+B1240344519440N00552139EA0230202335
+B1240364519431N00552134EA0229802332
+B1240384519420N00552126EA0229402329
+B1240404519409N00552117EA0229302328
+B1240424519399N00552109EA0229002325
+B1240444519388N00552100EA0228802323
+B1240464519377N00552090EA0228902322
+B1240484519367N00552081EA0228802322
+B1240504519357N00552071EA0228402319
+B1240524519345N00552059EA0228102317
+B1240544519334N00552050EA0228202317
+B1240564519325N00552040EA0228202317
+B1240584519317N00552031EA0228002316
+B1241004519307N00552022EA0227802314
+B1241024519297N00552013EA0227702313
+B1241044519288N00552005EA0227502312
+B1241064519278N00551997EA0227102309
+B1241084519268N00551989EA0226902306
+B1241104519258N00551982EA0226602304
+B1241124519248N00551975EA0226402301
+B1241144519237N00551967EA0226102299
+B1241164519228N00551959EA0225702296
+B1241184519218N00551952EA0225202292
+B1241204519207N00551943EA0224702287
+B1241224519196N00551933EA0224602285
+B1241244519186N00551927EA0224402283
+B1241264519176N00551922EA0224002280
+B1241284519166N00551915EA0223502275
+B1241304519154N00551910EA0223302271
+B1241324519143N00551904EA0223002269
+B1241344519134N00551897EA0222702265
+B1241364519124N00551889EA0222402262
+B1241384519114N00551880EA0222402259
+B1241404519105N00551872EA0222302258
+B1241424519095N00551863EA0222202257
+B1241444519086N00551853EA0222302256
+B1241464519076N00551844EA0222402257
+B1241484519069N00551835EA0222502258
+B1241504519060N00551826EA0222502258
+B1241524519051N00551815EA0222802260
+B1241544519043N00551804EA0223402263
+B1241564519036N00551794EA0223602267
+B1241584519028N00551786EA0223502269
+B1242004519020N00551777EA0223502270
+B1242024519011N00551768EA0223702271
+B1242044519002N00551759EA0224002274
+B1242064518993N00551749EA0224102276
+B1242084518984N00551740EA0224002277
+B1242104518977N00551732EA0223702277
+B1242124518968N00551724EA0223402275
+B1242144518959N00551716EA0223202272
+B1242164518950N00551710EA0223102271
+B1242184518941N00551702EA0223102270
+B1242204518933N00551691EA0223202270
+B1242224518925N00551684EA0223202270
+B1242244518918N00551675EA0223002268
+B1242264518909N00551665EA0223102268
+B1242284518898N00551654EA0223602268
+B1242304518890N00551644EA0224202271
+B1242324518882N00551634EA0224902275
+B1242344518873N00551624EA0225702282
+B1242364518864N00551614EA0226302291
+B1242384518854N00551606EA0226802298
+B1242404518845N00551598EA0227002303
+B1242424518836N00551588EA0227102306
+B1242444518824N00551579EA0227402310
+B1242464518812N00551570EA0228002315
+B1242484518804N00551559EA0228802320
+B1242504518798N00551549EA0229402327
+B1242524518792N00551538EA0229802331
+B1242544518784N00551527EA0230302337
+B1242564518776N00551518EA0230502342
+B1242584518765N00551509EA0230602345
+B1243004518754N00551499EA0230802348
+B1243024518744N00551492EA0230502350
+B1243044518735N00551487EA0229902351
+B1243064518723N00551476EA0230102351
+B1243084518714N00551464EA0230702353
+B1243104518708N00551455EA0230802354
+B1243124518701N00551445EA0231202356
+B1243144518695N00551434EA0231702359
+B1243164518690N00551421EA0232502364
+B1243184518685N00551408EA0233202370
+B1243204518679N00551395EA0233902377
+B1243224518671N00551388EA0234002383
+B1243244518658N00551394EA0234102386
+B1243264518651N00551412EA0234502389
+B1243284518653N00551430EA0235302393
+B1243304518665N00551435EA0236002398
+B1243324518676N00551424EA0236802405
+B1243344518679N00551408EA0237402412
+B1243364518672N00551395EA0237502416
+B1243384518659N00551396EA0237402418
+B1243404518648N00551414EA0237302420
+B1243424518649N00551434EA0237702421
+B1243444518662N00551444EA0238502425
+B1243464518674N00551444EA0239302432
+B1243484518682N00551443EA0239702437
+B1243504518691N00551440EA0240102441
+B1243524518698N00551426EA0240402444
+B1243544518700N00551409EA0240802447
+B1243564518696N00551396EA0241002451
+B1243584518690N00551387EA0241202453
+B1244004518683N00551376EA0241102454
+B1244024518676N00551365EA0241202453
+B1244044518668N00551354EA0241402454
+B1244064518663N00551343EA0241402456
+B1244084518657N00551331EA0241402456
+B1244104518652N00551321EA0241102455
+B1244124518648N00551309EA0240602452
+B1244144518641N00551297EA0240302449
+B1244164518635N00551283EA0240202446
+B1244184518630N00551270EA0240002445
+B1244204518624N00551259EA0239802442
+B1244224518619N00551247EA0239502440
+B1244244518614N00551235EA0239302437
+B1244264518608N00551222EA0239102434
+B1244284518603N00551211EA0238802432
+B1244304518597N00551199EA0238602429
+B1244324518592N00551185EA0238502427
+B1244344518588N00551171EA0238402426
+B1244364518583N00551160EA0238102424
+B1244384518577N00551148EA0237702420
+B1244404518571N00551135EA0237402417
+B1244424518565N00551123EA0237302415
+B1244444518559N00551110EA0237202413
+B1244464518553N00551096EA0237102412
+B1244484518547N00551083EA0237002411
+B1244504518541N00551071EA0236702409
+B1244524518536N00551060EA0236402406
+B1244544518531N00551048EA0236002403
+B1244564518526N00551036EA0235602399
+B1244584518522N00551023EA0235202395
+B1245004518518N00551009EA0234702390
+B1245024518514N00550995EA0234302386
+B1245044518509N00550981EA0233902382
+B1245064518505N00550967EA0233502378
+B1245084518501N00550953EA0233102373
+B1245104518496N00550940EA0232802369
+B1245124518490N00550927EA0232402365
+B1245144518484N00550917EA0232002362
+B1245164518477N00550906EA0231502357
+B1245184518472N00550893EA0231302354
+B1245204518467N00550881EA0230902351
+B1245224518462N00550870EA0230502347
+B1245244518457N00550857EA0230202343
+B1245264518451N00550845EA0229902340
+B1245284518446N00550833EA0229502336
+B1245304518441N00550820EA0229402334
+B1245324518435N00550809EA0229102332
+B1245344518430N00550799EA0228802329
+B1245364518425N00550788EA0228402325
+B1245384518418N00550776EA0228102322
+B1245404518412N00550765EA0227802318
+B1245424518406N00550756EA0227402315
+B1245444518399N00550746EA0227002311
+B1245464518393N00550735EA0226602307
+B1245484518386N00550723EA0226302304
+B1245504518380N00550713EA0226102301
+B1245524518374N00550702EA0225802298
+B1245544518368N00550692EA0225702296
+B1245564518362N00550684EA0225402294
+B1245584518356N00550676EA0225002291
+B1246004518350N00550665EA0224502287
+B1246024518343N00550656EA0224202283
+B1246044518336N00550647EA0223902281
+B1246064518330N00550638EA0223502277
+B1246084518324N00550628EA0223002272
+B1246104518318N00550617EA0222502267
+B1246124518313N00550605EA0222102263
+B1246144518307N00550595EA0221602258
+B1246164518300N00550584EA0221202253
+B1246184518293N00550570EA0221002249
+B1246204518288N00550556EA0221002246
+B1246224518283N00550543EA0220902246
+B1246244518278N00550529EA0220802244
+B1246264518273N00550513EA0220702242
+B1246284518269N00550498EA0220602242
+B1246304518265N00550482EA0220502241
+B1246324518261N00550466EA0220502241
+B1246344518257N00550451EA0220602241
+B1246364518253N00550437EA0220602241
+B1246384518249N00550422EA0220602242
+B1246404518245N00550408EA0220402242
+B1246424518240N00550395EA0220502242
+B1246444518236N00550381EA0220502242
+B1246464518234N00550366EA0220402242
+B1246484518232N00550353EA0220302241
+B1246504518229N00550339EA0220202240
+B1246524518226N00550324EA0220302240
+B1246544518222N00550311EA0220302241
+B1246564518219N00550300EA0220202241
+B1246584518214N00550288EA0220102239
+B1247004518210N00550277EA0219902238
+B1247024518205N00550265EA0219902237
+B1247044518200N00550255EA0219702236
+B1247064518196N00550245EA0219502234
+B1247084518190N00550235EA0219102232
+B1247104518182N00550226EA0219002230
+B1247124518174N00550218EA0218902229
+B1247144518168N00550211EA0218702227
+B1247164518161N00550203EA0218502224
+B1247184518154N00550193EA0218202221
+B1247204518147N00550184EA0218102219
+B1247224518139N00550175EA0218102218
+B1247244518132N00550165EA0218102218
+B1247264518127N00550154EA0218102219
+B1247284518123N00550146EA0218002219
+B1247304518117N00550137EA0217802217
+B1247324518112N00550128EA0217702215
+B1247344518105N00550119EA0217502213
+B1247364518099N00550108EA0217302211
+B1247384518094N00550098EA0217102209
+B1247404518088N00550088EA0216902207
+B1247424518082N00550078EA0216802205
+B1247444518075N00550067EA0217202204
+B1247464518068N00550059EA0217502205
+B1247484518063N00550051EA0217702209
+B1247504518057N00550043EA0217702211
+B1247524518052N00550036EA0217402211
+B1247544518045N00550027EA0217002209
+B1247564518037N00550017EA0216902207
+B1247584518029N00550007EA0216702206
+B1248004518021N00549997EA0216602204
+B1248024518014N00549989EA0216502203
+B1248044518007N00549986EA0216402201
+B1248064517998N00549984EA0216802201
+B1248084517991N00549981EA0217302202
+B1248104517985N00549979EA0218002205
+B1248124517979N00549978EA0218702210
+B1248144517974N00549976EA0218902215
+B1248164517968N00549972EA0219102218
+B1248184517959N00549968EA0219502222
+B1248204517951N00549962EA0220102228
+B1248224517943N00549959EA0220102233
+B1248244517933N00549963EA0219802236
+B1248264517923N00549965EA0219302237
+B1248284517912N00549962EA0219302235
+B1248304517905N00549957EA0219002233
+B1248324517899N00549953EA0218602231
+B1248344517890N00549948EA0218102226
+B1248364517880N00549943EA0217902223
+B1248384517870N00549939EA0217702220
+B1248404517861N00549933EA0217402217
+B1248424517853N00549925EA0217102213
+B1248444517845N00549916EA0217002211
+B1248464517837N00549907EA0216702209
+B1248484517829N00549898EA0216402206
+B1248504517820N00549891EA0216002203
+B1248524517810N00549883EA0215802199
+B1248544517801N00549876EA0215402195
+B1248564517790N00549873EA0214902191
+B1248584517780N00549868EA0214402186
+B1249004517769N00549861EA0214002181
+B1249024517759N00549855EA0213702178
+B1249044517748N00549850EA0213402174
+B1249064517738N00549844EA0213102171
+B1249084517728N00549837EA0212802168
+B1249104517720N00549831EA0212202164
+B1249124517711N00549825EA0211502158
+B1249144517700N00549819EA0210902152
+B1249164517690N00549813EA0210502147
+B1249184517681N00549807EA0210102143
+B1249204517672N00549803EA0209702138
+B1249224517663N00549797EA0209102133
+B1249244517655N00549790EA0208602127
+B1249264517645N00549783EA0208102122
+B1249284517636N00549776EA0207702117
+B1249304517626N00549770EA0207202113
+B1249324517617N00549764EA0206702107
+B1249344517607N00549756EA0206402103
+B1249364517597N00549749EA0206002099
+B1249384517589N00549740EA0205602095
+B1249404517580N00549731EA0205102090
+B1249424517569N00549722EA0204902086
+B1249444517559N00549712EA0204802084
+B1249464517550N00549702EA0204702083
+B1249484517541N00549694EA0204602082
+B1249504517531N00549685EA0204602081
+B1249524517521N00549677EA0204502080
+B1249544517511N00549670EA0204402080
+B1249564517501N00549661EA0204302079
+B1249584517492N00549653EA0204202077
+B1250004517482N00549644EA0204002076
+B1250024517472N00549635EA0204002075
+B1250044517463N00549626EA0203902075
+B1250064517453N00549618EA0203802074
+B1250084517443N00549610EA0203702073
+B1250104517433N00549602EA0203602072
+B1250124517423N00549594EA0203402071
+B1250144517413N00549585EA0203302070
+B1250164517402N00549576EA0203302069
+B1250184517392N00549567EA0203202069
+B1250204517382N00549557EA0203202068
+B1250224517371N00549548EA0203202068
+B1250244517361N00549540EA0203202068
+B1250264517351N00549533EA0203102067
+B1250284517341N00549525EA0203002067
+B1250304517331N00549517EA0203002066
+B1250324517321N00549510EA0202902066
+B1250344517310N00549502EA0202702064
+B1250364517300N00549492EA0202702063
+B1250384517290N00549483EA0202602063
+B1250404517280N00549474EA0202302061
+B1250424517270N00549465EA0202102059
+B1250444517258N00549457EA0202002057
+B1250464517247N00549450EA0201802056
+B1250484517238N00549442EA0201402053
+B1250504517227N00549432EA0201102050
+B1250524517216N00549422EA0201102048
+B1250544517206N00549415EA0200902047
+B1250564517197N00549407EA0200402044
+B1250584517188N00549396EA0200202040
+B1251004517179N00549386EA0200002038
+B1251024517170N00549379EA0199602035
+B1251044517159N00549372EA0199202031
+B1251064517150N00549360EA0198902028
+B1251084517142N00549350EA0198502025
+B1251104517134N00549340EA0197902021
+B1251124517125N00549329EA0197602016
+B1251144517116N00549319EA0197402012
+B1251164517108N00549312EA0196902008
+B1251184517097N00549305EA0196402002
+B1251204517086N00549297EA0196201999
+B1251224517077N00549290EA0195801995
+B1251244517068N00549284EA0195101989
+B1251264517058N00549277EA0194501983
+B1251284517048N00549271EA0194101979
+B1251304517040N00549267EA0193601974
+B1251324517030N00549261EA0192701968
+B1251344517018N00549253EA0192201961
+B1251364517009N00549244EA0192001957
+B1251384517002N00549236EA0191301952
+B1251404516993N00549226EA0190601945
+B1251424516984N00549215EA0190301940
+B1251444516975N00549207EA0190101937
+B1251464516967N00549201EA0189701933
+B1251484516958N00549194EA0189301928
+B1251504516948N00549187EA0188901924
+B1251524516939N00549179EA0188601921
+B1251544516929N00549172EA0188101917
+B1251564516919N00549167EA0187501912
+B1251584516909N00549158EA0186801906
+B1252004516900N00549145EA0186501902
+B1252024516891N00549136EA0185901898
+B1252044516883N00549126EA0185101891
+B1252064516873N00549115EA0184501885
+B1252084516863N00549104EA0184201881
+B1252104516854N00549093EA0184001877
+B1252124516846N00549083EA0183901874
+B1252144516836N00549073EA0183701873
+B1252164516828N00549062EA0183601871
+B1252184516821N00549052EA0183301869
+B1252204516813N00549043EA0182901865
+B1252224516804N00549034EA0182601862
+B1252244516795N00549024EA0182501860
+B1252264516786N00549016EA0182401858
+B1252284516778N00549008EA0182101856
+B1252304516769N00549000EA0181601853
+B1252324516760N00548991EA0181101848
+B1252344516751N00548982EA0180701845
+B1252364516743N00548974EA0180301840
+B1252384516733N00548967EA0180101836
+B1252404516724N00548958EA0179901834
+B1252424516715N00548952EA0179601831
+B1252444516705N00548944EA0179401827
+B1252464516695N00548935EA0179501826
+B1252484516687N00548928EA0179701825
+B1252504516678N00548921EA0179801826
+B1252524516670N00548913EA0179901827
+B1252544516661N00548905EA0180301829
+B1252564516652N00548900EA0180701832
+B1252584516643N00548893EA0181101837
+B1253004516635N00548885EA0181501842
+B1253024516625N00548879EA0181901846
+B1253044516616N00548873EA0182101850
+B1253064516608N00548864EA0182001852
+B1253084516599N00548853EA0182101854
+B1253104516589N00548843EA0182501857
+B1253124516583N00548833EA0182901860
+B1253144516578N00548821EA0183401865
+B1253164516571N00548811EA0184101870
+B1253184516564N00548801EA0184901877
+B1253204516556N00548792EA0185201884
+B1253224516549N00548785EA0185301889
+B1253244516540N00548777EA0185301892
+B1253264516530N00548768EA0186101896
+B1253284516521N00548761EA0187001901
+B1253304516517N00548751EA0187501907
+B1253324516511N00548743EA0187901911
+B1253344516503N00548734EA0188501917
+B1253364516497N00548723EA0189101923
+B1253384516491N00548714EA0189601928
+B1253404516484N00548705EA0190201934
+B1253424516479N00548693EA0190401939
+B1253444516476N00548681EA0190201942
+B1253464516471N00548671EA0189701944
+B1253484516464N00548663EA0189501943
+B1253504516457N00548654EA0189201940
+B1253524516450N00548645EA0189501937
+B1253544516445N00548635EA0189801938
+B1253564516439N00548628EA0189801938
+B1253584516432N00548622EA0189701938
+B1254004516425N00548615EA0189401936
+B1254024516416N00548607EA0188901933
+B1254044516408N00548598EA0188601929
+B1254064516400N00548589EA0188501926
+B1254084516391N00548580EA0188501924
+B1254104516383N00548571EA0188501923
+B1254124516375N00548564EA0188401923
+B1254144516367N00548558EA0188201921
+B1254164516357N00548550EA0188301920
+B1254184516349N00548543EA0188901919
+B1254204516343N00548537EA0189401922
+B1254224516337N00548532EA0189601925
+B1254244516330N00548525EA0189701926
+B1254264516322N00548518EA0190001929
+B1254284516314N00548514EA0190401933
+B1254304516307N00548509EA0190501937
+B1254324516300N00548499EA0190601939
+B1254344516292N00548488EA0191101942
+B1254364516283N00548480EA0191701946
+B1254384516277N00548474EA0192001951
+B1254404516271N00548467EA0191701954
+B1254424516263N00548459EA0191401956
+B1254444516253N00548449EA0191201956
+B1254464516244N00548434EA0191201955
+B1254484516235N00548417EA0191601956
+B1254504516226N00548406EA0192101958
+B1254524516217N00548399EA0192001960
+B1254544516207N00548389EA0191501960
+B1254564516196N00548377EA0191501959
+B1254584516186N00548365EA0191501959
+B1255004516175N00548358EA0191401957
+B1255024516163N00548352EA0191601956
+B1255044516153N00548342EA0191801957
+B1255064516145N00548331EA0192001958
+B1255084516136N00548322EA0192301960
+B1255104516127N00548313EA0192601963
+B1255124516120N00548303EA0192501964
+B1255144516111N00548293EA0192301964
+B1255164516099N00548282EA0192601964
+B1255184516089N00548272EA0192901967
+B1255204516080N00548263EA0192901968
+B1255224516070N00548254EA0192901968
+B1255244516060N00548245EA0192901967
+B1255264516050N00548236EA0192901966
+B1255284516040N00548224EA0193101967
+B1255304516031N00548211EA0193601968
+B1255324516024N00548201EA0194201971
+B1255344516018N00548192EA0194501975
+B1255364516013N00548184EA0194301977
+B1255384516005N00548175EA0194101977
+B1255404515996N00548166EA0193901976
+B1255424515988N00548158EA0193701975
+B1255444515981N00548150EA0193401972
+B1255464515973N00548141EA0193101969
+B1255484515965N00548132EA0192901966
+B1255504515956N00548122EA0192601963
+B1255524515948N00548113EA0192401961
+B1255544515938N00548104EA0192201958
+B1255564515929N00548096EA0192001956
+B1255584515920N00548087EA0191801954
+B1256004515910N00548076EA0191601952
+B1256024515901N00548066EA0191401950
+B1256044515893N00548056EA0191101947
+B1256064515883N00548046EA0191001945
+B1256084515874N00548039EA0190701943
+B1256104515865N00548030EA0190201940
+B1256124515855N00548020EA0189901936
+B1256144515845N00548011EA0189701934
+B1256164515835N00548002EA0189301931
+B1256184515824N00547994EA0189101927
+B1256204515812N00547986EA0189301925
+B1256224515802N00547977EA0189901925
+B1256244515794N00547966EA0190501926
+B1256264515786N00547955EA0191401931
+B1256284515777N00547944EA0192301938
+B1256304515770N00547936EA0193001947
+B1256324515763N00547939EA0193301954
+B1256344515757N00547956EA0193801961
+B1256364515762N00547971EA0194301967
+B1256384515773N00547971EA0194901975
+B1256404515779N00547955EA0195401981
+B1256424515770N00547940EA0196101989
+B1256444515758N00547942EA0196401996
+B1256464515752N00547957EA0196502001
+B1256484515755N00547971EA0196902005
+B1256504515769N00547975EA0197302009
+B1256524515778N00547961EA0197802014
+B1256544515774N00547943EA0198402019
+B1256564515764N00547938EA0198602024
+B1256584515754N00547946EA0198702027
+B1257004515752N00547964EA0198902030
+B1257024515761N00547976EA0199202032
+B1257044515773N00547976EA0199702035
+B1257064515782N00547964EA0200202038
+B1257084515786N00547949EA0200602043
+B1257104515784N00547935EA0200802046
+B1257124515775N00547927EA0201002048
+B1257144515764N00547934EA0201002050
+B1257164515761N00547949EA0201002051
+B1257184515769N00547964EA0201202052
+B1257204515783N00547967EA0201502053
+B1257224515793N00547959EA0201802055
+B1257244515797N00547946EA0202002057
+B1257264515798N00547930EA0202302060
+B1257284515794N00547919EA0202402062
+B1257304515787N00547909EA0202702063
+B1257324515779N00547899EA0203002066
+B1257344515770N00547889EA0203602070
+B1257364515763N00547882EA0203802074
+B1257384515755N00547876EA0203902076
+B1257404515746N00547869EA0204102078
+B1257424515737N00547860EA0204102079
+B1257444515729N00547850EA0204002079
+B1257464515719N00547842EA0203802078
+B1257484515709N00547832EA0203802077
+B1257504515698N00547821EA0203902077
+B1257524515688N00547811EA0204002078
+B1257544515679N00547801EA0204102078
+B1257564515671N00547789EA0204102079
+B1257584515663N00547778EA0204102079
+B1258004515654N00547768EA0204302079
+B1258024515647N00547758EA0204402080
+B1258044515641N00547748EA0204402080
+B1258064515634N00547739EA0204402081
+B1258084515627N00547732EA0204302080
+B1258104515619N00547725EA0204002079
+B1258124515611N00547717EA0203702077
+B1258144515603N00547710EA0203402073
+B1258164515593N00547700EA0203302070
+B1258184515584N00547690EA0203202069
+B1258204515576N00547680EA0202902068
+B1258224515569N00547669EA0202402065
+B1258244515560N00547658EA0202202061
+B1258264515552N00547647EA0202102059
+B1258284515544N00547636EA0201802057
+B1258304515537N00547624EA0201702054
+B1258324515530N00547612EA0201702053
+B1258344515524N00547602EA0201702053
+B1258364515515N00547593EA0201502052
+B1258384515506N00547583EA0201502051
+B1258404515497N00547573EA0201602052
+B1258424515490N00547561EA0201702053
+B1258444515484N00547549EA0201702053
+B1258464515475N00547538EA0201902054
+B1258484515467N00547526EA0202002055
+B1258504515460N00547515EA0202002056
+B1258524515453N00547504EA0202002056
+B1258544515445N00547493EA0201902056
+B1258564515437N00547483EA0201902055
+B1258584515430N00547473EA0201902055
+B1259004515422N00547464EA0201802055
+B1259024515414N00547454EA0201602054
+B1259044515407N00547444EA0201402052
+B1259064515398N00547435EA0201102049
+B1259084515387N00547428EA0201102048
+B1259104515379N00547420EA0201102048
+B1259124515372N00547412EA0200502046
+B1259144515361N00547404EA0200502043
+B1259164515351N00547393EA0200502043
+B1259184515342N00547384EA0200402042
+B1259204515332N00547378EA0200202040
+B1259224515322N00547369EA0200502039
+B1259244515312N00547359EA0201202040
+B1259264515305N00547351EA0202002042
+B1259284515298N00547344EA0202402047
+B1259304515292N00547335EA0202502050
+B1259324515284N00547325EA0202602052
+B1259344515278N00547313EA0202802054
+B1259364515272N00547300EA0203102057
+B1259384515265N00547288EA0203402061
+B1259404515258N00547276EA0203902065
+B1259424515251N00547265EA0204802071
+B1259444515247N00547255EA0205302077
+B1259464515245N00547244EA0205602081
+B1259484515241N00547233EA0205602085
+B1259504515236N00547223EA0205602087
+B1259524515231N00547216EA0205602088
+B1259544515225N00547209EA0205602087
+B1259564515221N00547201EA0206102089
+B1259584515218N00547193EA0206402093
+B1300004515214N00547185EA0206502095
+B1300024515208N00547177EA0206602096
+B1300044515201N00547170EA0206902099
+B1300064515194N00547164EA0206702101
+B1300084515186N00547158EA0206702101
+B1300104515178N00547150EA0207202103
+B1300124515173N00547148EA0207402105
+B1300144515166N00547148EA0207502107
+B1300164515157N00547141EA0207502108
+B1300184515149N00547139EA0207402110
+B1300204515143N00547141EA0206702110
+B1300224515137N00547142EA0206202107
+B1300244515130N00547139EA0205702103
+B1300264515124N00547136EA0205002099
+B1300284515117N00547130EA0204102092
+B1300304515110N00547122EA0203402083
+B1300324515105N00547113EA0202802076
+B1300344515100N00547104EA0202202069
+B1300364515094N00547099EA0201502062
+B1300384515087N00547091EA0201102055
+B1300404515081N00547078EA0201002050
+B1300424515073N00547069EA0200902046
+B1300444515064N00547062EA0200802045
+B1300464515056N00547052EA0200702043
+B1300484515047N00547042EA0200602042
+B1300504515039N00547032EA0200502041
+B1300524515033N00547020EA0200602041
+B1300544515028N00547006EA0200602041
+B1300564515022N00546994EA0200402041
+B1300584515014N00546982EA0200402039
+B1301004515004N00546967EA0200802040
+B1301024514996N00546954EA0201002041
+B1301044514989N00546943EA0200702041
+B1301064514979N00546932EA0200602040
+B1301084514968N00546921EA0201002041
+B1301104514959N00546910EA0201202044
+B1301124514950N00546901EA0201402045
+B1301144514940N00546892EA0201902048
+B1301164514932N00546883EA0202302052
+B1301184514924N00546874EA0202602055
+B1301204514915N00546864EA0203302060
+B1301224514906N00546851EA0204402066
+B1301244514900N00546838EA0204702072
+B1301264514895N00546829EA0204602076
+B1301284514887N00546821EA0204702078
+B1301304514878N00546813EA0205002082
+B1301324514873N00546803EA0205102085
+B1301344514868N00546794EA0205102087
+B1301364514861N00546785EA0204902088
+B1301384514854N00546774EA0204702087
+B1301404514845N00546762EA0204402085
+B1301424514836N00546751EA0204502085
+B1301444514828N00546742EA0204102083
+B1301464514820N00546734EA0203402080
+B1301484514809N00546726EA0202902075
+B1301504514798N00546718EA0202802073
+B1301524514789N00546711EA0202602071
+B1301544514780N00546704EA0202302067
+B1301564514769N00546696EA0202802064
+B1301584514759N00546688EA0204002063
+B1302004514753N00546683EA0204302065
+B1302024514747N00546678EA0204202066
+B1302044514738N00546671EA0204302067
+B1302064514730N00546662EA0204602069
+B1302084514723N00546653EA0204702072
+B1302104514717N00546647EA0204702074
+B1302124514712N00546637EA0204702075
+B1302144514707N00546625EA0204702075
+B1302164514700N00546613EA0204702076
+B1302184514693N00546601EA0204702076
+B1302204514688N00546589EA0204602076
+B1302224514682N00546579EA0204602076
+B1302244514676N00546571EA0204402076
+B1302264514670N00546562EA0204102074
+B1302284514664N00546552EA0204102073
+B1302304514658N00546543EA0203902072
+B1302324514653N00546534EA0203702071
+B1302344514647N00546524EA0203502069
+B1302364514641N00546515EA0203402067
+B1302384514636N00546506EA0203202066
+B1302404514630N00546499EA0203002065
+B1302424514625N00546492EA0202902063
+B1302444514619N00546486EA0202802063
+B1302464514614N00546481EA0202702062
+B1302484514607N00546475EA0202502060
+B1302504514602N00546468EA0202402059
+B1302524514597N00546459EA0202402058
+B1302544514590N00546453EA0202402058
+B1302564514583N00546447EA0202902058
+B1302584514577N00546439EA0203402061
+B1303004514572N00546427EA0203702065
+B1303024514565N00546415EA0204102068
+B1303044514558N00546401EA0204702073
+B1303064514553N00546388EA0205102079
+B1303084514547N00546377EA0205402083
+B1303104514541N00546366EA0205502086
+B1303124514535N00546356EA0205502088
+B1303144514530N00546345EA0205302088
+B1303164514523N00546335EA0205102087
+B1303184514515N00546327EA0205102086
+B1303204514508N00546319EA0204902085
+B1303224514502N00546311EA0204602083
+B1303244514494N00546304EA0204402081
+B1303264514487N00546297EA0204202079
+B1303284514481N00546290EA0204002076
+B1303304514474N00546283EA0203602073
+B1303324514468N00546275EA0203302070
+B1303344514460N00546267EA0203002067
+B1303364514454N00546260EA0202602064
+B1303384514448N00546253EA0202302060
+B1303404514441N00546245EA0201902056
+B1303424514435N00546237EA0201602053
+B1303444514429N00546230EA0201202049
+B1303464514422N00546224EA0200902045
+B1303484514416N00546219EA0200502042
+B1303504514409N00546212EA0200202038
+B1303524514403N00546205EA0199802035
+B1303544514396N00546198EA0199402031
+B1303564514389N00546190EA0199002027
+B1303584514381N00546182EA0198802023
+B1304004514374N00546173EA0198802021
+B1304024514368N00546164EA0199202020
+B1304044514363N00546155EA0199402021
+B1304064514359N00546148EA0199402022
+B1304084514353N00546141EA0199102021
+B1304104514348N00546133EA0198802019
+B1304124514342N00546123EA0198502016
+B1304144514337N00546113EA0198402015
+B1304164514332N00546106EA0198102013
+B1304184514326N00546098EA0197802010
+B1304204514320N00546089EA0197702008
+B1304224514315N00546081EA0197402006
+B1304244514311N00546072EA0197002003
+B1304264514305N00546061EA0197002001
+B1304284514297N00546051EA0197202001
+B1304304514289N00546042EA0197302001
+B1304324514283N00546032EA0197202001
+B1304344514274N00546021EA0197102000
+B1304364514266N00546009EA0197102001
+B1304384514260N00546000EA0196902000
+B1304404514254N00545990EA0196801999
+B1304424514246N00545977EA0197101999
+B1304444514239N00545963EA0197602000
+B1304464514234N00545952EA0197602001
+B1304484514228N00545942EA0197502000
+B1304504514223N00545931EA0197402001
+B1304524514218N00545921EA0197302001
+B1304544514213N00545910EA0197202001
+B1304564514207N00545899EA0197102000
+B1304584514202N00545886EA0197102001
+B1305004514198N00545875EA0197002000
+B1305024514193N00545864EA0196901999
+B1305044514187N00545854EA0196901999
+B1305064514181N00545844EA0196801999
+B1305084514176N00545836EA0196601998
+B1305104514170N00545827EA0196501997
+B1305124514165N00545817EA0196301996
+B1305144514160N00545810EA0196101994
+B1305164514153N00545802EA0195901992
+B1305184514147N00545794EA0195901992
+B1305204514141N00545788EA0195801991
+B1305224514135N00545780EA0195601990
+B1305244514129N00545772EA0195501988
+B1305264514123N00545763EA0195501987
+B1305284514118N00545754EA0195401987
+B1305304514113N00545745EA0195201986
+B1305324514107N00545737EA0195101985
+B1305344514100N00545730EA0195001984
+B1305364514095N00545722EA0194801983
+B1305384514088N00545715EA0194501981
+B1305404514081N00545709EA0194501979
+B1305424514074N00545707EA0194301978
+B1305444514069N00545719EA0193901976
+B1305464514069N00545740EA0193901974
+B1305484514073N00545757EA0193801974
+B1305504514079N00545773EA0193501972
+B1305524514087N00545792EA0193301969
+B1305544514096N00545810EA0193301968
+B1305564514104N00545826EA0193101967
+B1305584514113N00545842EA0192801965
+B1306004514121N00545861EA0192901963
+B1306024514129N00545878EA0193001963
+B1306044514137N00545894EA0192801962
+B1306064514147N00545910EA0192601960
+B1306084514158N00545927EA0192601959
+B1306104514168N00545943EA0192601959
+B1306124514180N00545957EA0192401958
+B1306144514191N00545972EA0192201956
+B1306164514202N00545988EA0192101955
+B1306184514213N00546003EA0192101954
+B1306204514223N00546018EA0191901953
+B1306224514234N00546034EA0191801952
+B1306244514244N00546050EA0191801951
+B1306264514254N00546065EA0191801951
+B1306284514263N00546080EA0191701951
+B1306304514270N00546094EA0191601951
+B1306324514275N00546104EA0191501949
+B1306344514280N00546116EA0191601949
+B1306364514285N00546128EA0191801950
+B1306384514290N00546139EA0191801951
+B1306404514297N00546151EA0191801951
+B1306424514305N00546165EA0191801951
+B1306444514312N00546178EA0191601951
+B1306464514320N00546190EA0191301949
+B1306484514327N00546203EA0191101947
+B1306504514336N00546215EA0191101947
+B1306524514345N00546225EA0191101946
+B1306544514353N00546236EA0190701945
+B1306564514362N00546248EA0190501942
+B1306584514370N00546261EA0190101940
+B1307004514377N00546275EA0189901936
+B1307024514385N00546290EA0189801934
+B1307044514394N00546306EA0189801933
+B1307064514402N00546321EA0190201932
+B1307084514410N00546336EA0190601934
+B1307104514417N00546350EA0190901936
+B1307124514425N00546364EA0191401940
+B1307144514432N00546380EA0191601943
+B1307164514437N00546395EA0190901945
+B1307184514444N00546413EA0190101945
+B1307204514453N00546431EA0189701942
+B1307224514461N00546447EA0189401939
+B1307244514467N00546462EA0189001934
+B1307264514475N00546476EA0188501929
+B1307284514484N00546492EA0188201924
+B1307304514493N00546506EA0187801921
+B1307324514503N00546520EA0187501916
+B1307344514513N00546533EA0187201913
+B1307364514523N00546546EA0187001910
+B1307384514533N00546559EA0186801907
+B1307404514542N00546572EA0186601905
+B1307424514550N00546586EA0186401902
+B1307444514557N00546599EA0186301900
+B1307464514565N00546610EA0186201899
+B1307484514573N00546618EA0186001898
+B1307504514581N00546627EA0185701895
+B1307524514590N00546636EA0185501893
+B1307544514597N00546646EA0185101890
+B1307564514604N00546657EA0184801887
+B1307584514614N00546667EA0184601884
+B1308004514624N00546679EA0184501882
+B1308024514634N00546692EA0184601880
+B1308044514644N00546706EA0185601880
+B1308064514654N00546720EA0186501881
+B1308084514661N00546733EA0186901885
+B1308104514668N00546744EA0187101889
+B1308124514673N00546757EA0187601893
+B1308144514678N00546773EA0188401899
+B1308164514683N00546787EA0189301906
+B1308184514690N00546800EA0189901915
+B1308204514696N00546811EA0190201921
+B1308224514703N00546823EA0190301927
+B1308244514713N00546837EA0190501930
+B1308264514723N00546853EA0191001935
+B1308284514731N00546869EA0190901939
+B1308304514740N00546883EA0190501941
+B1308324514749N00546896EA0189801942
+B1308344514759N00546910EA0189401940
+B1308364514770N00546923EA0189101936
+B1308384514780N00546934EA0188801931
+B1308404514790N00546946EA0188401927
+B1308424514799N00546959EA0188101923
+B1308444514808N00546972EA0187801919
+B1308464514816N00546986EA0187501916
+B1308484514823N00547000EA0187301913
+B1308504514830N00547011EA0186901909
+B1308524514837N00547023EA0186401904
+B1308544514843N00547038EA0186401901
+B1308564514850N00547051EA0186501898
+B1308584514856N00547058EA0186401897
+B1309004514863N00547067EA0186101894
+B1309024514870N00547077EA0185901892
+B1309044514878N00547087EA0185701890
+B1309064514888N00547095EA0185501888
+B1309084514897N00547105EA0185201886
+B1309104514905N00547115EA0184801883
+B1309124514913N00547126EA0184401879
+B1309144514923N00547138EA0184701876
+B1309164514932N00547150EA0185301874
+B1309184514940N00547162EA0185501874
+B1309204514948N00547174EA0185601876
+B1309224514958N00547186EA0185801880
+B1309244514967N00547197EA0186001883
+B1309264514975N00547208EA0186301887
+B1309284514983N00547219EA0186801891
+B1309304514993N00547232EA0187501896
+B1309324515003N00547245EA0188501902
+B1309344515010N00547255EA0189201910
+B1309364515014N00547267EA0189701916
+B1309384515010N00547278EA0189801923
+B1309404514998N00547280EA0190101928
+B1309424514989N00547268EA0190601933
+B1309444514994N00547254EA0191201939
+B1309464515008N00547250EA0192101946
+B1309484515020N00547252EA0193201956
+B1309504515030N00547253EA0193901965
+B1309524515039N00547256EA0194201972
+B1309544515047N00547274EA0194901979
+B1309564515045N00547295EA0195501986
+B1309584515033N00547299EA0196001992
+B1310004515026N00547287EA0196501999
+B1310024515029N00547272EA0197002005
+B1310044515042N00547267EA0197902010
+B1310064515055N00547273EA0198802018
+B1310084515065N00547282EA0199602028
+B1310104515073N00547290EA0200002034
+B1310124515075N00547308EA0200002039
+B1310144515067N00547325EA0200102043
+B1310164515053N00547327EA0200602046
+B1310184515045N00547311EA0201102049
+B1310204515046N00547295EA0201802054
+B1310224515049N00547284EA0202602060
+B1310244515055N00547274EA0203602067
+B1310264515063N00547267EA0204402075
+B1310284515074N00547267EA0205302082
+B1310304515082N00547277EA0205902090
+B1310324515088N00547294EA0206202096
+B1310344515087N00547316EA0206202100
+B1310364515075N00547324EA0206202103
+B1310384515064N00547313EA0206402105
+B1310404515066N00547298EA0206802106
+B1310424515076N00547291EA0207402110
+B1310444515086N00547288EA0208202117
+B1310464515097N00547286EA0208902123
+B1310484515109N00547287EA0209902131
+B1310504515120N00547290EA0210802141
+B1310524515130N00547293EA0211502149
+B1310544515138N00547288EA0211502156
+B1310564515132N00547275EA0211802161
+B1310584515120N00547274EA0212602165
+B1311004515113N00547289EA0213602171
+B1311024515115N00547307EA0214602179
+B1311044515127N00547316EA0215302186
+B1311064515138N00547312EA0215902194
+B1311084515142N00547301EA0216302199
+B1311104515140N00547290EA0216802204
+B1311124515130N00547289EA0217202208
+B1311144515119N00547303EA0218402213
+B1311164515116N00547324EA0219502221
+B1311184515120N00547343EA0220402230
+B1311204515131N00547359EA0221102240
+B1311224515145N00547362EA0221802248
+B1311244515152N00547350EA0222402256
+B1311264515146N00547337EA0222902263
+B1311284515132N00547336EA0223702270
+B1311304515123N00547351EA0224702278
+B1311324515123N00547372EA0225502287
+B1311344515133N00547389EA0226102295
+B1311364515148N00547395EA0226802302
+B1311384515158N00547387EA0227502309
+B1311404515155N00547374EA0228102316
+B1311424515143N00547370EA0228802322
+B1311444515132N00547381EA0229602330
+B1311464515130N00547401EA0230202338
+B1311484515140N00547418EA0230702345
+B1311504515153N00547424EA0230902350
+B1311524515167N00547420EA0231602355
+B1311544515176N00547410EA0232402362
+B1311564515178N00547398EA0233102370
+B1311584515178N00547387EA0234002378
+B1312004515178N00547379EA0234702386
+B1312024515172N00547380EA0235002393
+B1312044515165N00547394EA0235302398
+B1312064515167N00547413EA0235802404
+B1312084515178N00547430EA0236402408
+B1312104515194N00547437EA0236902414
+B1312124515207N00547431EA0237402419
+B1312144515214N00547419EA0238102425
+B1312164515215N00547409EA0238802431
+B1312184515210N00547404EA0239402437
+B1312204515205N00547403EA0239802442
+B1312224515200N00547411EA0240002446
+B1312244515198N00547428EA0240202448
+B1312264515204N00547448EA0240502451
+B1312284515216N00547464EA0241002455
+B1312304515231N00547474EA0241702460
+B1312324515244N00547479EA0242102465
+B1312344515258N00547483EA0242202469
+B1312364515272N00547488EA0242102471
+B1312384515286N00547499EA0242102470
+B1312404515298N00547511EA0241602469
+B1312424515312N00547520EA0241302466
+B1312444515328N00547530EA0240902461
+B1312464515341N00547543EA0240302455
+B1312484515354N00547556EA0239702449
+B1312504515369N00547568EA0239302443
+B1312524515382N00547582EA0238802438
+B1312544515394N00547595EA0238402433
+B1312564515408N00547607EA0238102429
+B1312584515421N00547619EA0237802425
+B1313004515432N00547634EA0237502422
+B1313024515443N00547649EA0237402419
+B1313044515454N00547665EA0237302418
+B1313064515465N00547679EA0237202416
+B1313084515476N00547693EA0236902413
+B1313104515489N00547706EA0236602411
+B1313124515501N00547719EA0236402408
+B1313144515513N00547732EA0236002405
+B1313164515524N00547745EA0235602401
+B1313184515537N00547758EA0235102397
+B1313204515549N00547770EA0234602391
+B1313224515561N00547781EA0234002386
+B1313244515574N00547791EA0233502380
+B1313264515587N00547802EA0233102375
+B1313284515600N00547815EA0232702371
+B1313304515611N00547829EA0232302367
+B1313324515622N00547842EA0232102363
+B1313344515633N00547853EA0231802361
+B1313364515643N00547863EA0231402357
+B1313384515653N00547874EA0231002353
+B1313404515664N00547884EA0230702349
+B1313424515675N00547895EA0230302346
+B1313444515685N00547906EA0229902342
+B1313464515695N00547917EA0229402338
+B1313484515707N00547928EA0229102334
+B1313504515718N00547940EA0228902331
+B1313524515729N00547951EA0228502327
+B1313544515740N00547961EA0228102323
+B1313564515752N00547971EA0227702319
+B1313594515763N00547982EA0227302315
+B1314014515775N00547994EA0227002312
+B1314034515787N00548006EA0227102310
+B1314054515798N00548019EA0227302309
+B1314074515807N00548030EA0227002308
+B1314094515817N00548040EA0226302304
+B1314114515828N00548053EA0226002301
+B1314134515840N00548066EA0226002299
+B1314154515850N00548077EA0225602296
+B1314174515860N00548090EA0225202292
+B1314194515871N00548105EA0224902289
+B1314214515884N00548117EA0224602286
+B1314234515895N00548129EA0224202282
+B1314254515906N00548141EA0223602278
+B1314274515916N00548152EA0223002273
+B1314294515927N00548163EA0222602268
+B1314314515938N00548173EA0222102264
+B1314334515949N00548184EA0221502258
+B1314354515959N00548195EA0221002252
+B1314374515971N00548206EA0220802247
+B1314394515981N00548219EA0220702244
+B1314414515989N00548231EA0220402242
+B1314434515998N00548243EA0220002237
+B1314454516007N00548257EA0219902235
+B1314474516017N00548270EA0219902234
+B1314494516027N00548282EA0219702232
+B1314514516037N00548295EA0219602231
+B1314534516047N00548306EA0219402230
+B1314554516055N00548316EA0218902228
+B1314574516064N00548329EA0218302224
+B1314594516074N00548342EA0217902219
+B1315014516084N00548353EA0217702217
+B1315034516094N00548363EA0217302213
+B1315054516105N00548373EA0217002210
+B1315074516116N00548383EA0216602206
+B1315094516128N00548393EA0216202202
+B1315114516140N00548401EA0215702198
+B1315134516152N00548411EA0215302194
+B1315154516163N00548423EA0215102191
+B1315174516175N00548434EA0214802188
+B1315194516185N00548446EA0214402185
+B1315214516195N00548458EA0214002181
+B1315234516204N00548468EA0213402176
+B1315254516215N00548480EA0213002171
+B1315274516226N00548492EA0212602167
+B1315294516237N00548501EA0211902162
+B1315314516250N00548509EA0211402155
+B1315334516264N00548516EA0211302151
+B1315354516275N00548527EA0211002148
+B1315374516284N00548538EA0210702144
+B1315394516295N00548548EA0210502142
+B1315414516305N00548557EA0210302140
+B1315434516314N00548567EA0209802137
+B1315454516324N00548577EA0209302132
+B1315474516336N00548588EA0209102130
+B1315494516346N00548598EA0209002128
+B1315514516356N00548607EA0208802126
+B1315534516367N00548616EA0208602124
+B1315554516379N00548625EA0208702123
+B1315574516390N00548633EA0208502123
+B1315594516401N00548641EA0208202121
+B1316014516414N00548650EA0208202120
+B1316034516428N00548660EA0208302119
+B1316054516439N00548672EA0208202119
+B1316074516450N00548682EA0208102118
+B1316094516463N00548691EA0208102118
+B1316114516475N00548700EA0208002118
+B1316134516486N00548709EA0207802116
+B1316154516498N00548719EA0207802115
+B1316174516510N00548729EA0207902116
+B1316194516522N00548739EA0207902117
+B1316214516533N00548749EA0208102117
+B1316234516546N00548759EA0208602119
+B1316254516558N00548769EA0208902121
+B1316274516568N00548779EA0209302123
+B1316294516580N00548789EA0210002128
+B1316314516591N00548799EA0210502134
+B1316334516603N00548811EA0210802138
+B1316354516617N00548820EA0211302142
+B1316374516630N00548828EA0211902148
+B1316394516640N00548838EA0212202153
+B1316414516650N00548847EA0212402157
+B1316434516661N00548855EA0212402159
+B1316454516672N00548862EA0212402160
+B1316474516684N00548872EA0212502160
+B1316494516696N00548881EA0212602161
+B1316514516709N00548888EA0212602162
+B1316534516721N00548895EA0212502162
+B1316554516733N00548903EA0212402161
+B1316574516745N00548911EA0212302160
+B1316594516757N00548921EA0212402160
+B1317014516768N00548931EA0212602161
+B1317034516780N00548942EA0212802163
+B1317054516791N00548954EA0213202166
+B1317074516802N00548966EA0213402169
+B1317094516814N00548977EA0213602171
+B1317114516827N00548987EA0213802173
+B1317134516839N00548997EA0213802175
+B1317154516851N00549007EA0213602175
+B1317174516864N00549018EA0213502174
+B1317194516877N00549031EA0213502174
+B1317214516889N00549042EA0213202173
+B1317234516900N00549055EA0212902170
+B1317254516912N00549072EA0212402166
+B1317274516923N00549087EA0212102162
+B1317294516933N00549099EA0212002160
+B1317314516942N00549110EA0211402156
+B1317334516952N00549122EA0210702152
+B1317354516964N00549131EA0210002146
+B1317374516975N00549139EA0209202138
+B1317394516987N00549148EA0208402129
+B1317414516999N00549158EA0207602121
+B1317434517012N00549167EA0207002114
+B1317454517024N00549176EA0206302107
+B1317474517038N00549183EA0205702099
+B1317494517054N00549191EA0205402092
+B1317514517069N00549200EA0205602087
+B1317534517082N00549208EA0205502083
+B1317554517091N00549217EA0205102080
+B1317574517102N00549227EA0204902077
+B1317594517112N00549238EA0204702075
+B1318014517122N00549248EA0204402073
+B1318034517134N00549258EA0204002070
+B1318054517146N00549268EA0203702067
+B1318074517158N00549278EA0203402064
+B1318094517170N00549287EA0203302062
+B1318114517180N00549297EA0202902060
+B1318134517189N00549307EA0202602057
+B1318154517199N00549316EA0202402055
+B1318174517210N00549324EA0202202053
+B1318194517220N00549332EA0201902051
+B1318214517230N00549340EA0201602048
+B1318234517240N00549350EA0201502046
+B1318254517250N00549359EA0201202044
+B1318274517260N00549367EA0200802041
+B1318294517270N00549375EA0200302037
+B1318314517281N00549383EA0200102034
+B1318334517293N00549390EA0200002031
+B1318354517301N00549396EA0199602029
+B1318374517311N00549400EA0199002025
+B1318394517324N00549407EA0198902021
+B1318414517337N00549417EA0199202018
+B1318434517348N00549424EA0199002017
+B1318454517357N00549431EA0198602014
+B1318474517368N00549441EA0198302011
+B1318494517378N00549452EA0198102010
+B1318514517387N00549461EA0197802008
+B1318534517396N00549471EA0197202003
+B1318554517406N00549483EA0196901999
+B1318574517417N00549493EA0196801997
+B1318594517427N00549503EA0196701996
+B1319014517437N00549513EA0196501994
+B1319034517448N00549522EA0196301993
+B1319054517459N00549531EA0196201992
+B1319074517470N00549541EA0196201991
+B1319094517482N00549550EA0196101991
+B1319114517492N00549560EA0195701989
+B1319134517502N00549570EA0195201986
+B1319154517514N00549581EA0195001983
+B1319174517526N00549592EA0194901981
+B1319194517538N00549600EA0194801980
+B1319214517549N00549607EA0194501977
+B1319234517561N00549618EA0194601976
+B1319254517571N00549630EA0194701977
+B1319274517580N00549641EA0194601977
+B1319294517590N00549652EA0194501976
+B1319314517599N00549664EA0194401975
+B1319334517609N00549677EA0194401975
+B1319354517618N00549691EA0194301975
+B1319374517627N00549703EA0194001973
+B1319394517637N00549714EA0193701970
+B1319414517647N00549726EA0193501968
+B1319434517657N00549738EA0193301966
+B1319454517666N00549750EA0193401965
+B1319474517675N00549762EA0193401965
+B1319494517682N00549775EA0193201964
+B1319514517690N00549786EA0192901962
+B1319534517698N00549798EA0192601960
+B1319554517707N00549810EA0192301957
+B1319574517715N00549823EA0192201954
+B1319594517722N00549837EA0192101953
+B1320014517728N00549851EA0192001952
+B1320034517734N00549864EA0191701950
+B1320054517741N00549880EA0191701948
+B1320074517750N00549896EA0191701948
+B1320094517758N00549912EA0191901948
+B1320114517766N00549928EA0192101950
+B1320134517774N00549944EA0192301952
+B1320154517781N00549958EA0192501955
+B1320174517787N00549972EA0192801957
+B1320194517795N00549981EA0192701959
+B1320214517808N00549978EA0192601959
+B1320234517818N00549964EA0192801960
+B1320254517816N00549950EA0192801960
+B1320274517806N00549944EA0192901960
+B1320294517797N00549954EA0192901961
+B1320314517794N00549972EA0193001960
+B1320334517797N00549991EA0193201962
+B1320354517802N00550009EA0193401963
+B1320374517806N00550026EA0193601966
+B1320394517812N00550042EA0194001969
+B1320414517818N00550056EA0194401973
+B1320434517822N00550069EA0194801977
+B1320454517824N00550083EA0195101980
+B1320474517819N00550095EA0195301983
+B1320494517808N00550094EA0195601986
+B1320514517802N00550080EA0195801989
+B1320534517808N00550063EA0195901991
+B1320554517823N00550063EA0196101993
+B1320574517834N00550080EA0196601996
+B1320594517838N00550096EA0197102001
+B1321014517844N00550109EA0197702007
+B1321034517849N00550123EA0198102012
+B1321054517850N00550137EA0198702017
+B1321074517843N00550148EA0199002021
+B1321094517832N00550148EA0199202024
+B1321114517825N00550138EA0199302026
+B1321134517826N00550121EA0199402028
+B1321154517838N00550110EA0199702030
+B1321174517852N00550116EA0200102032
+B1321194517862N00550131EA0200702035
+B1321214517868N00550145EA0201302041
+B1321234517876N00550155EA0201702046
+B1321254517885N00550163EA0201902050
+B1321274517894N00550172EA0202002052
+B1321294517902N00550183EA0202002053
+B1321314517910N00550194EA0201902053
+B1321334517918N00550207EA0202002053
+B1321354517926N00550220EA0201902053
+B1321374517933N00550235EA0201902053
+B1321394517940N00550250EA0202102054
+B1321414517947N00550263EA0202202055
+B1321434517954N00550277EA0202002055
+B1321454517961N00550291EA0202002054
+B1321474517970N00550306EA0202102054
+B1321494517978N00550318EA0202202055
+B1321514517984N00550330EA0202102055
+B1321534517991N00550342EA0202002054
+B1321554517999N00550354EA0201902052
+B1321574518007N00550365EA0201902052
+B1321594518017N00550377EA0201802052
+B1322014518027N00550388EA0201702051
+B1322034518036N00550400EA0201402049
+B1322054518045N00550413EA0201102047
+B1322074518055N00550427EA0201102045
+B1322094518064N00550441EA0201102044
+B1322114518072N00550454EA0201002044
+B1322134518081N00550467EA0200902043
+B1322154518090N00550481EA0201002043
+B1322174518098N00550496EA0201102044
+B1322194518105N00550510EA0201002044
+B1322214518113N00550523EA0200702043
+B1322234518121N00550538EA0200502040
+B1322254518128N00550553EA0200302039
+B1322274518135N00550566EA0200002037
+B1322294518143N00550579EA0199502033
+B1322314518151N00550593EA0199102028
+B1322334518160N00550606EA0198802025
+B1322354518169N00550618EA0198502021
+B1322374518178N00550632EA0198202018
+B1322394518186N00550645EA0197802015
+B1322414518194N00550658EA0197502011
+B1322434518203N00550671EA0197302008
+B1322454518213N00550683EA0197002006
+B1322474518221N00550695EA0196602002
+B1322494518230N00550707EA0196201998
+B1322514518240N00550720EA0195801994
+B1322534518249N00550734EA0195601991
+B1322554518257N00550747EA0195401989
+B1322574518264N00550761EA0195101986
+B1322594518271N00550775EA0194601982
+B1323014518280N00550790EA0194201978
+B1323034518288N00550804EA0194001975
+B1323054518296N00550818EA0193601972
+B1323074518304N00550831EA0193101968
+B1323094518312N00550845EA0192701963
+B1323114518321N00550861EA0192401959
+B1323134518329N00550875EA0192101956
+B1323154518337N00550888EA0191901953
+B1323174518346N00550901EA0191501951
+B1323194518354N00550916EA0191001946
+B1323214518362N00550932EA0190601942
+B1323234518368N00550950EA0190201938
+B1323254518374N00550967EA0190001934
+B1323274518379N00550983EA0189601931
+B1323294518384N00550999EA0189301928
+B1323314518389N00551015EA0189101925
+B1323334518394N00551031EA0188901923
+B1323354518402N00551044EA0188501920
+B1323374518411N00551055EA0188101916
+B1323394518424N00551062EA0187901912
+B1323414518437N00551064EA0187701910
+B1323434518450N00551062EA0187501908
+B1323454518463N00551062EA0187501907
+B1323474518475N00551060EA0187701907
+B1323494518487N00551058EA0187701908
+B1323514518499N00551058EA0187801908
+B1323534518512N00551057EA0187901909
+B1323554518524N00551055EA0187901911
+B1323574518535N00551053EA0187601911
+B1323594518546N00551050EA0187201910
+B1324014518559N00551045EA0187101908
+B1324034518572N00551042EA0187001907
+B1324054518585N00551039EA0187101907
+B1324074518599N00551034EA0187201907
+B1324094518613N00551029EA0187601909
+B1324114518625N00551023EA0187901911
+B1324134518635N00551015EA0187901912
+B1324154518645N00551007EA0187801913
+B1324174518655N00551004EA0187601913
+B1324194518666N00550995EA0187501912
+B1324214518671N00550979EA0187401911
+B1324234518659N00550964EA0187301911
+B1324254518651N00550964EA0187301910
+B1324274518644N00550970EA0187101908
+B1324294518635N00550976EA0187001906
+B1324314518627N00550984EA0187001905
+B1324334518620N00550993EA0186901905
+B1324354518614N00550997EA0186501903
+B1324374518605N00551002EA0186201900
+B1324394518596N00551009EA0186001898
+B1324414518588N00551015EA0185901897
+B1324434518581N00551021EA0185701894
+B1324454518572N00551027EA0185601892
+B1324474518563N00551033EA0185501890
+B1324494518555N00551038EA0185401889
+B1324514518546N00551043EA0185401888
+B1324534518537N00551050EA0185401888
+B1324554518528N00551056EA0185401888
+B1324574518519N00551061EA0185201887
+B1324594518510N00551067EA0184901885
+B1325014518500N00551074EA0184701883
+B1325034518491N00551082EA0184601882
+B1325054518481N00551089EA0184401880
+B1325074518471N00551095EA0184301878
+B1325094518460N00551100EA0184301877
+B1325114518450N00551105EA0184401877
+B1325134518440N00551110EA0184601878
+B1325154518431N00551112EA0184901880
+B1325174518421N00551110EA0185601883
+B1325194518413N00551109EA0185801887
+B1325214518406N00551113EA0185401889
+B1325234518399N00551119EA0185201888
+B1325254518390N00551125EA0185201887
+B1325274518382N00551131EA0185101887
+B1325294518375N00551137EA0184901885
+B1325314518365N00551129EA0185101884
+B1325334518356N00551115EA0186101884
+B1325354518349N00551103EA0186901887
+B1325374518343N00551094EA0187401893
+B1325394518336N00551085EA0187901900
+B1325414518328N00551074EA0188401906
+B1325434518321N00551066EA0188901912
+B1325454518312N00551064EA0188901917
+B1325474518305N00551075EA0188901921
+B1325494518305N00551092EA0189201924
+B1325514518315N00551106EA0190001928
+B1325534518329N00551110EA0190701935
+B1325554518345N00551105EA0191601942
+B1325574518357N00551091EA0192401950
+B1325594518365N00551073EA0193101959
+B1326014518370N00551056EA0193401966
+B1326034518369N00551041EA0193401972
+B1326054518358N00551031EA0193301976
+B1326074518347N00551041EA0193601978
+B1326094518350N00551058EA0193901981
+B1326114518364N00551067EA0194501983
+B1326134518381N00551064EA0194701985
+B1326154518392N00551051EA0194401986
+B1326174518390N00551035EA0194001987
+B1326194518378N00551029EA0193901985
+B1326214518366N00551036EA0194101984
+B1326234518361N00551050EA0194701984
+B1326254518361N00551063EA0195701986
+B1326274518359N00551072EA0196501992
+B1326294518354N00551083EA0197301999
+B1326314518350N00551098EA0198202007
+B1326334518358N00551111EA0198902014
+B1326354518371N00551106EA0199602021
+B1326374518371N00551087EA0200602029
+B1326394518360N00551086EA0201502037
+B1326414518357N00551107EA0202402045
+B1326434518366N00551119EA0203702057
+B1326454518378N00551118EA0204402066
+B1326474518386N00551101EA0205302076
+B1326494518380N00551086EA0206002085
+B1326514518367N00551088EA0207302094
+B1326534518362N00551102EA0208402107
+B1326554518362N00551115EA0209302120
+B1326574518366N00551125EA0209902130
+B1326594518380N00551129EA0210602139
+B1327014518395N00551119EA0211802147
+B1327034518399N00551104EA0212602155
+B1327054518383N00551092EA0213602166
+B1327074518371N00551099EA0214502176
+B1327094518370N00551115EA0215302185
+B1327114518379N00551125EA0216002193
+B1327134518394N00551118EA0216802201
+B1327154518400N00551100EA0218102210
+B1327174518395N00551086EA0219002221
+B1327194518383N00551081EA0219902230
+B1327214518375N00551087EA0220702241
+B1327234518375N00551103EA0221402248
+B1327254518385N00551116EA0222402257
+B1327274518400N00551112EA0223202265
+B1327294518408N00551096EA0224302275
+B1327314518404N00551078EA0225102286
+B1327334518392N00551075EA0225902293
+B1327354518387N00551089EA0226702301
+B1327374518394N00551105EA0227302309
+B1327394518408N00551101EA0228202315
+B1327414518415N00551079EA0229302325
+B1327434518406N00551066EA0230202335
+B1327454518396N00551068EA0231102344
+B1327474518393N00551080EA0231802352
+B1327494518400N00551092EA0232402358
+B1327514518413N00551090EA0233202367
+B1327534518422N00551073EA0234102375
+B1327554518425N00551052EA0235302385
+B1327574518424N00551035EA0236002395
+B1327594518419N00551022EA0236302403
+B1328014518406N00551027EA0236502410
+B1328034518400N00551046EA0237202416
+B1328054518405N00551063EA0238302423
+B1328074518412N00551071EA0238802430
+B1328094518422N00551076EA0239002434
+B1328114518436N00551077EA0239502437
+B1328134518448N00551065EA0240102441
+B1328154518444N00551047EA0240802447
+B1328174518432N00551041EA0241702453
+B1328194518423N00551050EA0242502461
+B1328214518421N00551067EA0242802468
+B1328234518427N00551081EA0243302472
+B1328254518436N00551093EA0243902478
+B1328274518445N00551108EA0244602485
+B1328294518452N00551122EA0245502492
+B1328314518461N00551136EA0246302500
+B1328334518471N00551150EA0247102508
+B1328354518481N00551164EA0247802515
+B1328374518488N00551181EA0248302522
+B1328394518494N00551200EA0248802527
+B1328414518500N00551219EA0249302533
+B1328434518508N00551238EA0249502537
+B1328454518516N00551258EA0249502539
+B1328474518524N00551279EA0249402540
+B1328494518533N00551298EA0249402540
+B1328514518541N00551315EA0249302540
+B1328534518548N00551331EA0249102539
+B1328554518557N00551346EA0248802536
+B1328574518566N00551359EA0248602533
+B1328594518577N00551371EA0248502531
+B1329014518587N00551383EA0248302529
+B1329034518599N00551395EA0248102526
+B1329054518611N00551407EA0247902524
+B1329074518620N00551421EA0247802523
+B1329094518629N00551435EA0247402520
+B1329114518639N00551449EA0246902516
+B1329134518650N00551464EA0246502511
+B1329154518662N00551479EA0246202507
+B1329174518674N00551492EA0246102504
+B1329194518687N00551505EA0246102502
+B1329214518699N00551516EA0246402502
+B1329234518710N00551527EA0246202501
+B1329254518722N00551538EA0246002499
+B1329274518735N00551550EA0246102499
+B1329294518747N00551561EA0246202499
+B1329314518759N00551571EA0246202499
+B1329334518771N00551581EA0246302500
+B1329354518782N00551592EA0246302500
+B1329374518795N00551604EA0246402500
+B1329394518807N00551615EA0246602502
+B1329414518817N00551625EA0246702503
+B1329434518827N00551633EA0246402503
+B1329454518839N00551641EA0246202502
+B1329474518850N00551649EA0246302501
+B1329494518861N00551657EA0246202501
+B1329514518872N00551664EA0246102501
+B1329534518883N00551672EA0245802499
+B1329554518894N00551679EA0245602496
+B1329574518906N00551685EA0245402494
+B1329594518917N00551693EA0245102492
+B1330014518928N00551700EA0244802489
+B1330034518940N00551708EA0244602485
+B1330054518952N00551718EA0244502484
+B1330074518963N00551726EA0244302483
+B1330094518973N00551734EA0244002480
+B1330114518984N00551741EA0243702477
+B1330134518994N00551750EA0243302474
+B1330154519005N00551757EA0242902470
+B1330174519017N00551765EA0242602466
+B1330194519028N00551774EA0242502464
+B1330214519039N00551780EA0242102461
+B1330234519049N00551789EA0241802457
+B1330254519060N00551800EA0241902455
+B1330274519069N00551807EA0241802455
+B1330294519078N00551814EA0241602453
+B1330314519089N00551823EA0241602452
+B1330334519099N00551830EA0241502452
+B1330354519109N00551836EA0241002450
+B1330374519118N00551845EA0240402447
+B1330394519130N00551855EA0240202444
+B1330414519142N00551865EA0240102442
+B1330434519151N00551874EA0239502438
+B1330454519161N00551882EA0238702433
+B1330474519173N00551891EA0238002426
+B1330494519186N00551899EA0237702421
+B1330514519198N00551906EA0237302417
+B1330534519210N00551913EA0236602410
+B1330554519222N00551921EA0236002404
+B1330574519236N00551929EA0235602398
+B1330594519248N00551935EA0234902393
+B1331014519260N00551942EA0234302386
+B1331034519273N00551948EA0234002380
+B1331054519285N00551955EA0233902375
+B1331074519295N00551963EA0233802373
+B1331094519305N00551970EA0233302369
+B1331114519316N00551979EA0232902365
+B1331134519327N00551988EA0232802361
+B1331154519337N00551996EA0232802360
+B1331174519346N00552004EA0232502358
+B1331194519357N00552012EA0232302355
+B1331214519368N00552021EA0232302354
+B1331234519378N00552030EA0232202354
+B1331254519387N00552038EA0232002352
+B1331274519397N00552047EA0231802350
+B1331294519408N00552054EA0231902350
+B1331314519418N00552063EA0231702349
+B1331334519427N00552072EA0231502348
+B1331354519437N00552081EA0231402347
+B1331374519447N00552090EA0231302346
+B1331394519456N00552100EA0231102344
+B1331414519466N00552109EA0231002343
+B1331434519477N00552117EA0230902342
+B1331454519487N00552123EA0230802341
+B1331474519497N00552130EA0230702340
+B1331494519508N00552137EA0230602339
+B1331514519518N00552144EA0230602339
+B1331534519528N00552151EA0230402338
+B1331554519538N00552158EA0230202336
+B1331574519548N00552166EA0230102334
+B1331594519559N00552174EA0230002333
+B1332014519568N00552183EA0229702332
+B1332034519578N00552192EA0229302329
+B1332054519589N00552201EA0229002326
+B1332074519599N00552206EA0228902324
+B1332094519608N00552210EA0228602322
+B1332114519618N00552215EA0228002319
+B1332134519629N00552221EA0227802316
+B1332154519640N00552226EA0227702314
+B1332174519647N00552233EA0227202311
+B1332194519656N00552240EA0226602307
+B1332214519667N00552248EA0226502304
+B1332234519676N00552254EA0226202301
+B1332254519686N00552258EA0225702297
+B1332274519696N00552264EA0225502293
+B1332294519706N00552271EA0225402291
+B1332314519714N00552277EA0225102288
+B1332334519721N00552285EA0224602284
+B1332354519730N00552292EA0224302280
+B1332374519739N00552297EA0224102278
+B1332394519747N00552302EA0223802275
+B1332414519756N00552306EA0223502272
+B1332434519766N00552311EA0223202269
+B1332454519775N00552317EA0223002266
+B1332474519784N00552322EA0222702264
+B1332494519794N00552327EA0222402261
+B1332514519804N00552331EA0222202258
+B1332534519814N00552337EA0222202257
+B1332554519824N00552344EA0222402256
+B1332574519833N00552352EA0222802256
+B1332594519842N00552358EA0223302259
+B1333014519850N00552365EA0223502262
+B1333034519858N00552372EA0223602264
+B1333054519868N00552377EA0223902267
+B1333074519877N00552384EA0224202270
+B1333094519885N00552392EA0224402273
+B1333114519893N00552399EA0224602276
+B1333134519903N00552405EA0224902278
+B1333154519913N00552408EA0225202281
+B1333174519924N00552410EA0225402285
+B1333194519934N00552413EA0225402287
+B1333214519944N00552418EA0225302288
+B1333234519956N00552421EA0225402288
+B1333254519968N00552424EA0225502289
+B1333274519978N00552429EA0225802291
+B1333294519987N00552433EA0226002294
+B1333314519996N00552437EA0226202296
+B1333334520004N00552443EA0226402298
+B1333354520012N00552449EA0226702301
+B1333374520020N00552456EA0226902304
+B1333394520027N00552463EA0227002306
+B1333414520036N00552473EA0227002307
+B1333434520044N00552482EA0227002307
+B1333454520053N00552491EA0227202307
+B1333474520061N00552501EA0227402309
+B1333494520069N00552511EA0227502310
+B1333514520078N00552521EA0227602312
+B1333534520087N00552535EA0228002314
+B1333554520094N00552548EA0228702317
+B1333574520101N00552562EA0229102322
+B1333594520106N00552574EA0229402326
+B1334014520113N00552584EA0229502329
+B1334034520124N00552590EA0230002332
+B1334054520133N00552598EA0230302336
+B1334074520142N00552607EA0230502340
+B1334094520153N00552612EA0230802342
+B1334114520164N00552616EA0231202346
+B1334134520175N00552621EA0231602351
+B1334154520186N00552626EA0232002354
+B1334174520197N00552631EA0232502359
+B1334194520208N00552634EA0232802363
+B1334214520219N00552636EA0233002366
+B1334234520231N00552637EA0233202369
+B1334254520242N00552635EA0233302371
+B1334274520253N00552635EA0233302372
+B1334294520265N00552635EA0233302372
+B1334314520276N00552634EA0233402373
+B1334334520288N00552633EA0233402373
+B1334354520299N00552630EA0233302373
+B1334374520311N00552627EA0233302373
+B1334394520322N00552623EA0233202372
+B1334414520333N00552617EA0233102371
+B1334434520343N00552610EA0233002370
+B1334454520353N00552604EA0232802369
+B1334474520364N00552599EA0232602367
+B1334494520376N00552597EA0232502365
+B1334514520388N00552598EA0232402364
+B1334534520400N00552600EA0232302363
+B1334554520412N00552601EA0232002361
+B1334574520424N00552603EA0231902359
+B1334594520436N00552602EA0231802357
+B1335014520448N00552601EA0231602356
+B1335034520459N00552600EA0231402354
+B1335054520470N00552599EA0231302352
+B1335074520481N00552600EA0231102350
+B1335094520492N00552601EA0230802348
+B1335114520503N00552604EA0230502345
+B1335134520515N00552606EA0230502343
+B1335154520527N00552607EA0230502342
+B1335174520537N00552609EA0230402342
+B1335194520548N00552610EA0230402341
+B1335214520560N00552610EA0230602342
+B1335234520570N00552610EA0230702343
+B1335254520580N00552609EA0230702343
+B1335274520592N00552609EA0230802344
+B1335294520603N00552611EA0230902346
+B1335314520612N00552611EA0230602346
+B1335334520623N00552610EA0230302345
+B1335354520636N00552608EA0230402344
+B1335374520647N00552607EA0230502345
+B1335394520657N00552606EA0230202344
+B1335414520667N00552606EA0230102342
+B1335434520679N00552606EA0230302341
+B1335454520690N00552606EA0230602342
+B1335474520702N00552606EA0230702344
+B1335494520714N00552605EA0231002346
+B1335514520726N00552604EA0231202349
+B1335534520738N00552604EA0231402350
+B1335554520751N00552604EA0231602352
+B1335574520765N00552605EA0231802355
+B1335594520777N00552607EA0232002357
+B1336014520790N00552609EA0232202358
+B1336034520803N00552612EA0232302360
+B1336054520817N00552615EA0232402361
+B1336074520831N00552617EA0232602362
+B1336094520846N00552618EA0233102364
+B1336114520857N00552617EA0233202367
+B1336134520866N00552618EA0232902368
+B1336154520878N00552617EA0232702367
+B1336174520890N00552615EA0232402364
+B1336194520901N00552613EA0232002361
+B1336214520911N00552613EA0231502356
+B1336234520923N00552615EA0231202353
+B1336254520932N00552619EA0231002350
+B1336274520940N00552623EA0230502346
+B1336294520949N00552626EA0230102341
+B1336314520961N00552627EA0230002338
+B1336334520969N00552631EA0229802336
+B1336354520976N00552636EA0229202331
+B1336374520986N00552637EA0228902327
+B1336394520998N00552639EA0229102324
+B1336414521010N00552640EA0229302323
+B1336434521019N00552639EA0229302322
+B1336454521029N00552638EA0229202322
+B1336474521040N00552638EA0229302324
+B1336494521049N00552638EA0229102323
+B1336514521059N00552638EA0228902321
+B1336534521071N00552637EA0229002321
+B1336554521082N00552639EA0229102322
+B1336574521090N00552641EA0228902322
+B1336594521101N00552644EA0228702320
+B1337014521114N00552648EA0228802320
+B1337034521125N00552650EA0228902322
+B1337054521136N00552650EA0228902322
+B1337074521149N00552650EA0229102322
+B1337094521161N00552650EA0229302323
+B1337114521172N00552650EA0229302324
+B1337134521184N00552650EA0229402325
+B1337154521198N00552650EA0229702327
+B1337174521210N00552650EA0229702329
+B1337194521221N00552650EA0229602329
+B1337214521233N00552648EA0229502328
+B1337234521247N00552646EA0229802329
+B1337254521259N00552646EA0230102332
+B1337274521270N00552645EA0230502335
+B1337294521281N00552645EA0230802339
+B1337314521290N00552649EA0230902342
+B1337334521299N00552651EA0230902345
+B1337354521310N00552651EA0231002345
+B1337374521321N00552653EA0231202347
+B1337394521332N00552655EA0231402349
+B1337414521342N00552656EA0231502350
+B1337434521354N00552657EA0231502351
+B1337454521367N00552658EA0231602351
+B1337474521379N00552656EA0231802353
+B1337494521390N00552654EA0231802354
+B1337514521401N00552652EA0231702353
+B1337534521412N00552651EA0231702354
+B1337554521423N00552651EA0231702353
+B1337574521435N00552653EA0231902354
+B1337594521446N00552653EA0232202355
+B1338014521456N00552654EA0232302357
+B1338034521466N00552657EA0232302357
+B1338054521478N00552661EA0232602358
+B1338074521490N00552666EA0233002360
+B1338094521501N00552668EA0233302363
+B1338114521512N00552669EA0233802366
+B1338134521523N00552671EA0234202371
+B1338154521533N00552671EA0234702375
+B1338174521543N00552670EA0235402380
+B1338194521552N00552669EA0236002387
+B1338214521561N00552668EA0236602394
+B1338234521569N00552663EA0237002400
+B1338254521575N00552653EA0237302405
+B1338274521569N00552636EA0237302409
+B1338294521556N00552626EA0237402412
+B1338314521542N00552631EA0237702415
+B1338334521535N00552645EA0237902418
+B1338354521536N00552662EA0238602422
+B1338374521543N00552675EA0239202428
+B1338394521552N00552685EA0239802435
+B1338414521561N00552694EA0240402441
+B1338434521571N00552701EA0240902446
+B1338454521582N00552706EA0241302450
+B1338474521593N00552711EA0241602454
+B1338494521604N00552717EA0241602457
+B1338514521615N00552722EA0241502458
+B1338534521626N00552730EA0241402458
+B1338554521637N00552740EA0241102456
+B1338574521649N00552747EA0240802453
+B1338594521661N00552754EA0240802451
+B1339014521674N00552760EA0241002450
+B1339034521686N00552766EA0241202450
+B1339054521696N00552769EA0240902450
+B1339074521706N00552770EA0240502447
+B1339094521717N00552772EA0240102443
+B1339114521728N00552773EA0239902439
+B1339134521740N00552774EA0240202437
+B1339154521749N00552775EA0240302436
+B1339174521757N00552777EA0240202435
+B1339194521767N00552778EA0240302434
+B1339214521778N00552779EA0240402435
+B1339234521788N00552782EA0240402436
+B1339254521797N00552785EA0240202436
+B1339274521808N00552785EA0240102435
+B1339294521818N00552787EA0239802433
+B1339314521829N00552788EA0239702432
+B1339334521839N00552791EA0239602430
+B1339354521848N00552795EA0239502430
+B1339374521859N00552797EA0239902430
+B1339394521870N00552799EA0240402431
+B1339414521880N00552802EA0240802435
+B1339434521889N00552804EA0241102440
+B1339454521898N00552806EA0241102442
+B1339474521907N00552809EA0241102443
+B1339494521919N00552811EA0241402444
+B1339514521929N00552812EA0241202446
+B1339534521938N00552814EA0241002447
+B1339554521950N00552816EA0241202446
+B1339574521963N00552817EA0241702448
+B1339594521973N00552818EA0242102451
+B1340014521982N00552819EA0242302453
+B1340034521993N00552818EA0243002457
+B1340054522003N00552819EA0243602462
+B1340074522013N00552820EA0243802465
+B1340094522023N00552820EA0243802467
+B1340114522035N00552819EA0244102469
+B1340134522046N00552818EA0244502472
+B1340154522056N00552819EA0244902476
+B1340174522065N00552821EA0245402480
+B1340194522075N00552820EA0245902485
+B1340214522083N00552818EA0246502493
+B1340234522093N00552817EA0246902497
+B1340254522100N00552816EA0247202500
+B1340274522110N00552815EA0247702504
+B1340294522119N00552814EA0247902508
+B1340314522129N00552812EA0248302511
+B1340334522140N00552811EA0248902515
+B1340354522151N00552814EA0249802521
+B1340374522160N00552818EA0250202528
+B1340394522169N00552822EA0250402533
+B1340414522178N00552827EA0250402536
+B1340434522190N00552833EA0250602538
+B1340454522202N00552840EA0250802540
+B1340474522213N00552848EA0251202544
+B1340494522224N00552856EA0251302546
+B1340514522235N00552865EA0251302548
+B1340534522246N00552873EA0251302548
+B1340554522257N00552879EA0251202548
+B1340574522268N00552884EA0250802547
+B1340594522279N00552890EA0250302544
+B1341014522290N00552894EA0249702540
+B1341034522301N00552899EA0249102534
+B1341054522313N00552903EA0248702529
+B1341074522325N00552906EA0248502526
+B1341094522337N00552910EA0248102523
+B1341114522348N00552914EA0247802519
+B1341134522360N00552920EA0247602516
+B1341154522371N00552926EA0247402514
+B1341174522381N00552932EA0247102511
+B1341194522393N00552942EA0246902507
+B1341214522405N00552954EA0247502505
+B1341234522416N00552961EA0248002505
+B1341254522426N00552968EA0248202508
+B1341274522438N00552976EA0248602512
+B1341294522450N00552982EA0249402517
+B1341314522461N00552989EA0249902524
+B1341334522471N00552997EA0250502530
+B1341354522481N00553003EA0251102537
+B1341374522492N00553012EA0251602543
+B1341394522502N00553024EA0252202550
+B1341414522512N00553034EA0252402555
+B1341434522522N00553044EA0252402559
+B1341454522533N00553053EA0252602561
+B1341474522545N00553060EA0252802564
+B1341494522556N00553066EA0253002566
+B1341514522565N00553074EA0253102568
+B1341534522576N00553081EA0253202570
+B1341554522588N00553088EA0253302570
+B1341574522601N00553095EA0253502572
+B1341594522613N00553105EA0253802575
+B1342014522625N00553115EA0253802577
+B1342034522637N00553125EA0253702578
+B1342054522650N00553137EA0253502577
+B1342074522661N00553152EA0253402575
+B1342094522673N00553166EA0253202574
+B1342114522683N00553180EA0252802572
+B1342134522694N00553196EA0252402568
+B1342154522706N00553207EA0251902564
+B1342174522718N00553218EA0251202558
+B1342194522730N00553230EA0250602552
+B1342214522744N00553240EA0250202547
+B1342234522757N00553250EA0249702542
+B1342254522771N00553259EA0249102536
+B1342274522785N00553270EA0248402529
+B1342294522798N00553279EA0248002524
+B1342314522811N00553284EA0247702520
+B1342334522824N00553288EA0247502516
+B1342354522837N00553293EA0247202513
+B1342374522850N00553299EA0246902510
+B1342394522863N00553305EA0246702507
+B1342414522874N00553312EA0246402505
+B1342434522887N00553316EA0246002501
+B1342454522900N00553321EA0245802498
+B1342474522912N00553327EA0245502496
+B1342494522924N00553333EA0245102492
+B1342514522937N00553338EA0245002489
+B1342534522950N00553344EA0245102487
+B1342554522961N00553351EA0244902486
+B1342574522973N00553359EA0244702483
+B1342594522985N00553366EA0244602482
+B1343014522998N00553372EA0244502481
+B1343034523011N00553376EA0244202479
+B1343054523023N00553380EA0243902478
+B1343074523036N00553386EA0243702477
+B1343094523047N00553393EA0243602476
+B1343114523060N00553399EA0243402475
+B1343134523072N00553404EA0243402474
+B1343154523085N00553408EA0243202472
+B1343174523098N00553411EA0243202471
+B1343194523111N00553413EA0243102471
+B1343214523124N00553415EA0242902470
+B1343234523137N00553419EA0242702467
+B1343254523150N00553422EA0242502465
+B1343274523163N00553426EA0242502464
+B1343294523175N00553430EA0242202463
+B1343314523187N00553435EA0241902460
+B1343334523200N00553441EA0241702458
+B1343354523211N00553449EA0241502456
+B1343374523222N00553455EA0241002453
+B1343394523234N00553460EA0240502449
+B1343414523246N00553467EA0240302446
+B1343434523257N00553476EA0240002443
+B1343454523268N00553479EA0239502439
+B1343474523281N00553480EA0239302436
+B1343494523292N00553485EA0239002433
+B1343514523302N00553490EA0238602429
+B1343534523314N00553494EA0238402426
+B1343554523326N00553498EA0238202424
+B1343574523337N00553503EA0237902421
+B1343594523348N00553511EA0237802418
+B1344014523358N00553520EA0237602414
+B1344034523369N00553529EA0237102410
+B1344054523379N00553537EA0236902408
+B1344074523389N00553546EA0236602406
+B1344094523399N00553556EA0236402403
+B1344114523410N00553564EA0236202401
+B1344134523421N00553572EA0236002399
+B1344154523432N00553578EA0235702396
+B1344174523443N00553583EA0235502394
+B1344194523455N00553588EA0235402392
+B1344214523466N00553592EA0235202390
+B1344234523478N00553595EA0235102388
+B1344254523490N00553600EA0235002387
+B1344274523501N00553606EA0234902385
+B1344294523512N00553613EA0234602383
+B1344314523523N00553620EA0234602382
+B1344334523534N00553627EA0234602381
+B1344354523544N00553633EA0234402379
+B1344374523555N00553640EA0234102377
+B1344394523566N00553645EA0234002375
+B1344414523577N00553650EA0233702373
+B1344434523588N00553655EA0233402371
+B1344454523599N00553660EA0233302369
+B1344474523611N00553665EA0233202368
+B1344494523621N00553668EA0232802365
+B1344514523633N00553672EA0232402362
+B1344534523644N00553677EA0232202359
+B1344554523657N00553681EA0232102356
+B1344574523669N00553683EA0232002355
+B1344594523679N00553686EA0231702353
+B1345014523691N00553689EA0231502350
+B1345034523704N00553691EA0231402349
+B1345054523715N00553694EA0231202348
+B1345074523726N00553698EA0230902345
+B1345094523737N00553704EA0230702343
+B1345114523748N00553711EA0230802342
+B1345134523757N00553719EA0230502340
+B1345154523767N00553727EA0230102337
+B1345174523777N00553737EA0230002335
+B1345194523787N00553746EA0229802333
+B1345214523799N00553751EA0229402330
+B1345234523811N00553755EA0229202327
+B1345254523823N00553760EA0229002324
+B1345274523835N00553764EA0228802322
+B1345294523847N00553768EA0228302319
+B1345314523860N00553771EA0228102316
+B1345334523872N00553775EA0227902314
+B1345354523884N00553779EA0227602311
+B1345374523896N00553783EA0227302308
+B1345394523908N00553787EA0227002305
+B1345414523920N00553791EA0226702302
+B1345434523932N00553795EA0226302299
+B1345454523945N00553798EA0226002296
+B1345474523957N00553801EA0225702293
+B1345494523970N00553804EA0225502290
+B1345514523982N00553807EA0225302288
+B1345534523994N00553809EA0225002286
+B1345554524006N00553812EA0224802283
+B1345574524018N00553816EA0224702281
+B1345594524030N00553818EA0224502280
+B1346014524041N00553821EA0224302279
+B1346034524052N00553825EA0224002276
+B1346054524064N00553829EA0223802273
+B1346074524076N00553832EA0223702272
+B1346094524087N00553835EA0223402270
+B1346114524099N00553838EA0223302267
+B1346134524111N00553841EA0223102266
+B1346154524123N00553844EA0222902264
+B1346174524135N00553849EA0222602262
+B1346194524146N00553853EA0222502260
+B1346214524158N00553858EA0222402259
+B1346234524170N00553862EA0222302258
+B1346254524181N00553867EA0222102257
+B1346274524192N00553871EA0222002256
+B1346294524204N00553876EA0221902255
+B1346314524216N00553880EA0221802254
+B1346334524227N00553885EA0221602252
+B1346354524239N00553889EA0221402251
+B1346374524251N00553894EA0221102248
+B1346394524263N00553899EA0220802245
+B1346414524275N00553903EA0220602243
+B1346434524286N00553907EA0220402240
+B1346454524297N00553911EA0220102238
+B1346474524307N00553915EA0219602234
+B1346494524318N00553919EA0219502231
+B1346514524329N00553924EA0219402229
+B1346534524339N00553928EA0219002227
+B1346554524350N00553933EA0218702224
+B1346574524362N00553938EA0218602222
+B1346594524374N00553940EA0218602222
+B1347014524385N00553942EA0218502220
+B1347034524397N00553946EA0218602219
+B1347054524409N00553950EA0218502220
+B1347074524420N00553951EA0218302219
+B1347094524430N00553952EA0218002217
+B1347114524441N00553955EA0217902215
+B1347134524451N00553957EA0217602213
+B1347154524461N00553957EA0217202210
+B1347174524471N00553960EA0217002207
+B1347194524480N00553963EA0216602204
+B1347214524487N00553967EA0216102200
+B1347234524496N00553973EA0215602195
+B1347254524505N00553977EA0215302192
+B1347274524513N00553981EA0214802187
+B1347294524521N00553986EA0214102182
+B1347314524530N00553989EA0213402175
+B1347334524540N00553991EA0212702168
+B1347354524548N00553993EA0212002161
+B1347374524558N00553996EA0211302153
+B1347394524568N00554000EA0210702146
+B1347414524578N00554005EA0210202140
+B1347434524589N00554009EA0209802135
+B1347454524600N00554011EA0209402130
+B1347474524608N00554014EA0208902126
+B1347494524618N00554017EA0208302121
+B1347514524629N00554019EA0208002116
+B1347534524639N00554022EA0207802113
+B1347554524647N00554025EA0207202109
+B1347574524656N00554027EA0206502103
+B1347594524667N00554032EA0206302098
+B1348014524677N00554036EA0206302095
+B1348034524686N00554040EA0206002093
+B1348054524696N00554044EA0205502088
+B1348074524708N00554046EA0205302085
+B1348094524719N00554046EA0204902082
+B1348114524730N00554047EA0204502078
+B1348134524742N00554048EA0204302075
+B1348154524755N00554050EA0204202073
+B1348174524766N00554050EA0204002072
+B1348194524778N00554052EA0203602069
+B1348214524790N00554055EA0203402067
+B1348234524802N00554057EA0203302066
+B1348254524813N00554057EA0202902063
+B1348274524824N00554060EA0202502059
+B1348294524836N00554063EA0202302056
+B1348314524848N00554065EA0202102054
+B1348334524859N00554068EA0201802052
+B1348354524870N00554069EA0201802050
+B1348374524882N00554071EA0202302049
+B1348394524893N00554073EA0202802049
+B1348414524903N00554076EA0202802051
+B1348434524913N00554079EA0202502051
+B1348454524925N00554082EA0202402050
+B1348474524936N00554086EA0202302050
+B1348494524946N00554090EA0202302050
+B1348514524957N00554094EA0202502050
+B1348534524967N00554102EA0203102052
+B1348554524975N00554111EA0203802055
+B1348574524983N00554119EA0204402061
+B1348594524993N00554121EA0204902067
+B1349014525000N00554106EA0205202074
+B1349034524991N00554090EA0205602080
+B1349054524978N00554092EA0206002086
+B1349074524971N00554107EA0206502091
+B1349094524975N00554124EA0207202098
+B1349114524985N00554130EA0207902106
+B1349134524996N00554124EA0208602114
+B1349154525000N00554109EA0209002121
+B1349174524995N00554094EA0209402127
+B1349194524985N00554090EA0209402131
+B1349214524974N00554099EA0209802134
+B1349234524972N00554117EA0210302137
+B1349254524976N00554134EA0211102144
+B1349274524980N00554148EA0211702152
+B1349294524988N00554157EA0212002155
+B1349314525001N00554157EA0212502160
+B1349334525008N00554143EA0212602163
+B1349354525002N00554123EA0213102166
+B1349374524988N00554119EA0213602170
+B1349394524978N00554130EA0214002174
+B1349414524977N00554149EA0214502178
+B1349434524985N00554165EA0214902183
+B1349454524998N00554169EA0215402188
+B1349474525008N00554163EA0215802192
+B1349494525015N00554149EA0216002196
+B1349514525014N00554131EA0216602199
+B1349534525004N00554120EA0217302204
+B1349554524994N00554128EA0217702208
+B1349574524992N00554146EA0218302212
+B1349594525002N00554156EA0218602216
+B1350014525014N00554150EA0218802220
+B1350034525020N00554133EA0219202225
+B1350054525015N00554115EA0219802229
+B1350074525004N00554106EA0220502236
+B1350094524994N00554111EA0221002241
+B1350114524987N00554124EA0221302246
+B1350134524984N00554139EA0221702250
+B1350154524989N00554155EA0222102255
+B1350174525000N00554159EA0222402259
+B1350194525011N00554152EA0222802262
+B1350214525018N00554138EA0223102266
+B1350234525019N00554119EA0223802270
+B1350254525012N00554101EA0224502276
+B1350274525007N00554089EA0225102283
+B1350294525002N00554082EA0225002288
+B1350314524990N00554086EA0224802291
+B1350334524980N00554100EA0224902293
+B1350354524979N00554118EA0225202295
+B1350374524987N00554131EA0225802298
+B1350394524996N00554134EA0226202302
+B1350414525007N00554132EA0226502305
+B1350434525017N00554123EA0226802307
+B1350454525024N00554108EA0226902309
+B1350474525023N00554088EA0227002311
+B1350494525013N00554077EA0227002312
+B1350514525004N00554079EA0226802310
+B1350534524996N00554085EA0226302306
+B1350554524990N00554100EA0226202302
+B1350574524994N00554115EA0226502300
+B1350594525001N00554124EA0226802300
+B1351014525010N00554129EA0227202303
+B1351034525019N00554133EA0227302305
+B1351054525027N00554140EA0227502307
+B1351074525036N00554149EA0227902309
+B1351094525046N00554154EA0228702314
+B1351114525055N00554156EA0229302320
+B1351134525063N00554159EA0229502324
+B1351154525074N00554154EA0229402327
+B1351174525076N00554139EA0229102329
+B1351194525067N00554127EA0229202330
+B1351214525056N00554131EA0229002331
+B1351234525047N00554143EA0229002330
+B1351254525045N00554161EA0229102330
+B1351274525051N00554180EA0229302330
+B1351294525061N00554194EA0229802333
+B1351314525073N00554199EA0230202337
+B1351334525084N00554202EA0230802343
+B1351354525092N00554209EA0231202348
+B1351374525100N00554211EA0231302352
+B1351394525104N00554202EA0231402354
+B1351414525099N00554189EA0231902355
+B1351434525087N00554187EA0232202358
+B1351454525075N00554200EA0232402360
+B1351474525068N00554219EA0232602362
+B1351494525069N00554241EA0233002365
+B1351514525076N00554257EA0233202368
+B1351534525088N00554265EA0233302369
+B1351554525101N00554260EA0233802371
+B1351574525104N00554246EA0234402373
+B1351594525093N00554235EA0234802378
+B1352014525080N00554243EA0234902380
+B1352034525075N00554264EA0234902382
+B1352054525078N00554285EA0235102383
+B1352074525091N00554298EA0235602389
+B1352094525104N00554296EA0236202393
+B1352114525112N00554283EA0236702399
+B1352134525113N00554268EA0237402405
+B1352154525103N00554261EA0237602410
+B1352174525091N00554268EA0237902414
+B1352194525085N00554288EA0238002417
+B1352214525090N00554307EA0238202418
+B1352234525105N00554313EA0238902422
+B1352254525118N00554312EA0239602429
+B1352274525128N00554306EA0240402437
+B1352294525134N00554298EA0241102445
+B1352314525133N00554287EA0241502451
+B1352334525121N00554279EA0242002456
+B1352354525110N00554291EA0242402460
+B1352374525109N00554312EA0243002464
+B1352394525119N00554326EA0243702470
+B1352414525129N00554333EA0244302476
+B1352434525139N00554337EA0244902482
+B1352454525152N00554343EA0245502488
+B1352474525166N00554349EA0246102493
+B1352494525180N00554352EA0246702499
+B1352514525193N00554352EA0247202505
+B1352534525205N00554355EA0247602510
+B1352554525217N00554358EA0248002514
+B1352574525228N00554363EA0248602520
+B1352594525234N00554375EA0248602524
+B1353014525240N00554393EA0249002527
+B1353034525248N00554410EA0249502533
+B1353054525257N00554421EA0249702537
+B1353074525267N00554433EA0249802540
+B1353094525277N00554447EA0250202543
+B1353114525288N00554459EA0250502547
+B1353134525297N00554469EA0250602549
+B1353154525307N00554480EA0250602550
+B1353174525318N00554490EA0250402549
+B1353194525329N00554500EA0250302548
+B1353214525340N00554508EA0250102546
+B1353234525353N00554513EA0249902544
+B1353254525366N00554519EA0250002543
+B1353274525379N00554527EA0250102543
+B1353294525392N00554534EA0250002543
+B1353314525406N00554537EA0249802542
+B1353334525420N00554546EA0249902541
+B1353354525433N00554556EA0249902541
+B1353374525445N00554562EA0249802541
+B1353394525459N00554567EA0249702539
+B1353414525473N00554574EA0249702539
+B1353434525486N00554581EA0249602538
+B1353454525500N00554587EA0249502537
+B1353474525515N00554594EA0249402537
+B1353494525529N00554600EA0249402536
+B1353514525544N00554604EA0249302535
+B1353534525558N00554609EA0249202534
+B1353554525573N00554612EA0249102533
+B1353574525587N00554615EA0248802532
+B1353594525600N00554618EA0248602530
+B1354014525613N00554620EA0248402527
+B1354034525625N00554620EA0248202525
+B1354054525635N00554619EA0247902523
+B1354074525645N00554619EA0247502520
+B1354094525656N00554618EA0247102515
+B1354114525668N00554618EA0246802512
+B1354134525680N00554620EA0246502509
+B1354154525693N00554620EA0246202506
+B1354174525705N00554618EA0246002502
+B1354194525719N00554616EA0245902500
+B1354214525732N00554614EA0245902499
+B1354234525745N00554612EA0246002499
+B1354254525758N00554609EA0246302500
+B1354274525771N00554608EA0246802502
+B1354294525783N00554610EA0247202506
+B1354314525794N00554612EA0247402509
+B1354334525805N00554614EA0247702511
+B1354354525817N00554619EA0247902513
+B1354374525828N00554619EA0248102516
+B1354394525841N00554621EA0248402519
+B1354414525853N00554628EA0248702522
+B1354434525865N00554637EA0248802525
+B1354454525878N00554645EA0248902526
+B1354474525891N00554652EA0249002527
+B1354494525905N00554660EA0249102528
+B1354514525916N00554664EA0248802528
+B1354534525927N00554667EA0248202527
+B1354554525939N00554671EA0247802524
+B1354574525952N00554675EA0247702522
+B1354594525963N00554677EA0247502522
+B1355014525973N00554680EA0247202519
+B1355034525984N00554683EA0247002516
+B1355054525997N00554686EA0246702513
+B1355074526009N00554689EA0246502510
+B1355094526021N00554694EA0246202507
+B1355114526034N00554700EA0246002505
+B1355134526046N00554706EA0245802503
+B1355154526058N00554711EA0245502500
+B1355174526071N00554719EA0245302497
+B1355194526083N00554725EA0245202495
+B1355214526095N00554728EA0244802492
+B1355234526108N00554732EA0244602489
+B1355254526120N00554739EA0244202486
+B1355274526132N00554744EA0243902483
+B1355294526143N00554749EA0243502479
+B1355314526154N00554756EA0242902474
+B1355334526164N00554764EA0242302469
+B1355354526175N00554772EA0241902463
+B1355374526186N00554782EA0241602460
+B1355394526197N00554790EA0241202455
+B1355414526209N00554796EA0241102451
+B1355434526223N00554803EA0241602449
+B1355454526234N00554809EA0241902448
+B1355474526242N00554816EA0241702448
+B1355494526251N00554818EA0241302446
+B1355514526261N00554817EA0241402445
+B1355534526272N00554820EA0241502446
+B1355554526283N00554823EA0241402447
+B1355574526295N00554825EA0241302446
+B1355594526309N00554827EA0241502446
+B1356014526323N00554825EA0241802448
+B1356034526334N00554824EA0241802450
+B1356054526346N00554824EA0241602450
+B1356074526358N00554823EA0241502449
+B1356094526372N00554824EA0241502449
+B1356114526386N00554828EA0241302449
+B1356134526399N00554831EA0241102448
+B1356154526413N00554832EA0241002446
+B1356174526426N00554831EA0240802445
+B1356194526439N00554834EA0240602443
+B1356214526453N00554839EA0240502441
+B1356234526468N00554844EA0240402440
+B1356254526482N00554850EA0240202439
+B1356274526495N00554856EA0239702436
+B1356294526510N00554862EA0239202432
+B1356314526523N00554867EA0238802427
+B1356334526537N00554871EA0238302423
+B1356354526551N00554876EA0238002419
+B1356374526564N00554879EA0237602415
+B1356394526577N00554881EA0237102411
+B1356414526590N00554882EA0236802407
+B1356434526603N00554883EA0236402403
+B1356454526616N00554883EA0236002399
+B1356474526630N00554882EA0235602396
+B1356494526643N00554881EA0235202392
+B1356514526657N00554882EA0234802388
+B1356534526671N00554882EA0234602384
+B1356554526685N00554884EA0234302382
+B1356574526698N00554887EA0234002378
+B1356594526712N00554890EA0233602374
+B1357014526727N00554893EA0233202371
+B1357034526742N00554897EA0233002368
+B1357054526756N00554901EA0232702365
+B1357074526770N00554906EA0232302361
+B1357094526784N00554910EA0232002358
+B1357114526798N00554915EA0231702355
+B1357134526812N00554921EA0231402352
+B1357154526826N00554926EA0231102349
+B1357174526840N00554931EA0230902346
+B1357194526854N00554936EA0230702344
+B1357214526868N00554941EA0230402342
+B1357234526882N00554945EA0230202339
+B1357254526896N00554950EA0229902337
+B1357274526910N00554955EA0229702334
+B1357294526925N00554960EA0229502331
+B1357314526939N00554965EA0229402330
+B1357334526951N00554971EA0229202328
+B1357354526964N00554978EA0228802325
+B1357374526978N00554985EA0228502322
+B1357394526992N00554991EA0228202319
+B1357414527005N00554997EA0227802315
+B1357434527019N00555005EA0227502312
+B1357454527032N00555012EA0227102309
+B1357474527045N00555018EA0226602305
+B1357494527058N00555024EA0226202300
+B1357514527071N00555030EA0225702295
+B1357534527084N00555037EA0225202290
+B1357554527097N00555044EA0224702285
+B1357574527111N00555053EA0224402280
+B1357594527124N00555061EA0224302277
+B1358014527136N00555071EA0224102275
+B1358034527149N00555080EA0223902273
+B1358054527161N00555088EA0223702272
+B1358074527173N00555098EA0223602270
+B1358094527186N00555107EA0223602269
+B1358114527197N00555113EA0223402269
+B1358134527209N00555119EA0223102267
+B1358154527222N00555126EA0223002265
+B1358174527235N00555135EA0222902265
+B1358194527245N00555144EA0222402263
+B1358214527257N00555153EA0222002260
+B1358234527271N00555161EA0221902258
+B1358254527283N00555172EA0221902257
+B1358274527293N00555181EA0221702255
+B1358294527306N00555189EA0221402252
+B1358314527318N00555197EA0221302250
+B1358334527331N00555203EA0221002248
+B1358354527344N00555208EA0220902246
+B1358374527357N00555212EA0220702245
+B1358394527370N00555216EA0220402242
+B1358414527384N00555220EA0220202240
+B1358434527397N00555223EA0220102237
+B1358454527412N00555228EA0220002236
+B1358474527426N00555232EA0219902235
+B1358494527439N00555236EA0219802234
+B1358514527453N00555239EA0219602232
+B1358534527467N00555242EA0219402230
+B1358554527481N00555248EA0219202229
+B1358574527494N00555255EA0219002227
+B1358594527507N00555261EA0218702224
+B1359014527520N00555268EA0218402222
+B1359034527533N00555274EA0218202219
+B1359054527546N00555280EA0217902216
+B1359074527560N00555286EA0217502213
+B1359094527573N00555291EA0217202209
+B1359114527587N00555294EA0216902206
+B1359134527600N00555297EA0216602203
+B1359154527614N00555302EA0216302200
+B1359174527628N00555306EA0215902196
+B1359194527641N00555310EA0215502193
+B1359214527655N00555314EA0215202189
+B1359234527668N00555317EA0214802185
+B1359254527682N00555321EA0214602182
+B1359274527695N00555326EA0214202178
+B1359294527708N00555330EA0213802174
+B1359314527721N00555335EA0213602171
+B1359334527734N00555341EA0213302168
+B1359354527747N00555347EA0212902164
+B1359374527760N00555353EA0212702161
+B1359394527773N00555360EA0212502158
+B1359414527786N00555367EA0212202156
+B1359434527799N00555374EA0211802152
+B1359454527812N00555381EA0211602150
+B1359474527825N00555387EA0211402148
+B1359494527837N00555392EA0211202146
+B1359514527848N00555400EA0211002144
+B1359534527859N00555407EA0210702142
+B1359554527869N00555413EA0210502139
+B1359574527879N00555419EA0210202137
+B1359594527890N00555427EA0210102135
+B1400014527900N00555434EA0210102134
+B1400034527910N00555438EA0209902133
+B1400054527920N00555442EA0209802132
+B1400074527930N00555448EA0209702131
+B1400094527940N00555453EA0209702131
+B1400114527949N00555457EA0209402130
+B1400134527960N00555464EA0209002128
+B1400154527972N00555473EA0209002126
+B1400174527984N00555481EA0208802125
+B1400194527994N00555489EA0208402122
+B1400214528007N00555496EA0207902117
+B1400234528020N00555501EA0207702115
+B1400254528032N00555505EA0207302112
+B1400274528045N00555509EA0206902107
+B1400294528058N00555516EA0206702104
+B1400314528071N00555523EA0206702102
+B1400334528082N00555528EA0206502100
+B1400354528094N00555532EA0206102097
+B1400374528107N00555535EA0205902094
+B1400394528119N00555538EA0205702092
+B1400414528131N00555544EA0205502090
+B1400434528143N00555550EA0205402088
+B1400454528154N00555556EA0205202087
+B1400474528165N00555563EA0205002085
+B1400494528176N00555572EA0204802083
+B1400514528186N00555582EA0204402081
+B1400534528195N00555591EA0204002077
+B1400554528207N00555603EA0204002074
+B1400574528217N00555617EA0204202073
+B1400594528225N00555628EA0204202073
+B1401014528234N00555638EA0204002072
+B1401034528242N00555650EA0203902070
+B1401054528251N00555662EA0203802068
+B1401074528260N00555674EA0203702068
+B1401094528269N00555686EA0203402066
+B1401114528278N00555698EA0203202064
+B1401134528289N00555711EA0203202063
+B1401154528297N00555726EA0203002062
+B1401174528305N00555741EA0202702060
+B1401194528313N00555758EA0202402057
+B1401214528321N00555774EA0202202055
+B1401234528330N00555789EA0201902053
+B1401254528338N00555804EA0201602049
+B1401274528347N00555819EA0201502047
+B1401294528356N00555833EA0201402045
+B1401314528365N00555847EA0201302044
+B1401334528374N00555861EA0201302043
+B1401354528383N00555875EA0201302043
+B1401374528392N00555888EA0201202043
+B1401394528402N00555901EA0201002042
+B1401414528412N00555914EA0200902041
+B1401434528422N00555927EA0200902040
+B1401454528433N00555939EA0200902041
+B1401474528443N00555952EA0200902041
+B1401494528453N00555964EA0200702040
+B1401514528465N00555976EA0200602039
+B1401534528476N00555988EA0200402037
+B1401554528487N00556000EA0200102035
+B1401574528498N00556014EA0200002033
+B1401594528508N00556027EA0199802032
+B1402014528518N00556039EA0199402029
+B1402034528529N00556051EA0199102026
+B1402054528540N00556063EA0199002024
+B1402074528550N00556073EA0198602022
+B1402094528561N00556083EA0198202018
+B1402114528573N00556092EA0197902015
+B1402134528585N00556101EA0197602012
+B1402154528595N00556112EA0197202009
+B1402174528605N00556123EA0196602004
+B1402194528616N00556136EA0196301999
+B1402214528627N00556149EA0196001996
+B1402234528637N00556161EA0195601992
+B1402254528647N00556173EA0195001987
+B1402274528657N00556188EA0194701982
+B1402294528668N00556202EA0194401979
+B1402314528678N00556215EA0194001975
+B1402334528689N00556229EA0193601971
+B1402354528700N00556243EA0193301968
+B1402374528710N00556257EA0193001965
+B1402394528720N00556272EA0192501961
+B1402414528730N00556287EA0192201956
+B1402434528741N00556301EA0191901953
+B1402454528750N00556315EA0191501949
+B1402474528759N00556329EA0191001944
+B1402494528771N00556344EA0190601940
+B1402514528781N00556359EA0190401938
+B1402534528790N00556373EA0190001934
+B1402554528800N00556388EA0189601930
+B1402574528811N00556404EA0189301927
+B1402594528821N00556421EA0189101924
+B1403014528832N00556436EA0188901922
+B1403034528842N00556450EA0188801920
+B1403054528852N00556466EA0188501917
+B1403074528862N00556480EA0188301915
+B1403094528873N00556494EA0188101912
+B1403114528882N00556508EA0187801911
+B1403134528892N00556522EA0187601908
+B1403154528903N00556534EA0187301905
+B1403174528912N00556548EA0187101903
+B1403194528921N00556562EA0186801900
+B1403214528930N00556575EA0186501897
+B1403234528940N00556589EA0186201894
+B1403254528949N00556603EA0185901891
+B1403274528958N00556617EA0185601888
+B1403294528966N00556632EA0185201884
+B1403314528975N00556647EA0184801880
+B1403334528984N00556661EA0184401876
+B1403354528992N00556676EA0184001872
+B1403374529002N00556690EA0183601868
+B1403394529011N00556705EA0183301864
+B1403414529021N00556721EA0183101861
+B1403434529029N00556736EA0182701859
+B1403454529038N00556750EA0182301855
+B1403474529048N00556766EA0182001851
+B1403494529057N00556782EA0181701848
+B1403514529067N00556796EA0181301844
+B1403534529077N00556810EA0180901840
+B1403554529088N00556825EA0180601836
+B1403574529098N00556840EA0180301833
+B1403594529108N00556854EA0180001830
+B1404014529119N00556867EA0179701827
+B1404034529129N00556880EA0179401824
+B1404054529139N00556893EA0179001821
+B1404074529149N00556908EA0178701817
+B1404094529159N00556923EA0178401814
+B1404114529169N00556937EA0178001811
+B1404134529179N00556951EA0177701807
+B1404154529189N00556966EA0177401804
+B1404174529199N00556981EA0177101801
+B1404194529208N00556996EA0176701798
+B1404214529219N00557011EA0176401794
+B1404234529229N00557026EA0176101791
+B1404254529238N00557042EA0175801788
+B1404274529248N00557058EA0175501784
+B1404294529258N00557074EA0175201781
+B1404314529269N00557090EA0174901778
+B1404334529279N00557105EA0174701776
+B1404354529288N00557120EA0174401773
+B1404374529299N00557135EA0174101769
+B1404394529309N00557150EA0173801767
+B1404414529319N00557164EA0173601765
+B1404434529329N00557178EA0173301762
+B1404454529339N00557193EA0173101759
+B1404484529350N00557207EA0173001758
+B1404504529359N00557219EA0172701756
+B1404524529369N00557233EA0172401754
+B1404544529379N00557247EA0172301751
+B1404564529390N00557261EA0172201750
+B1404584529399N00557272EA0172001749
+B1405004529409N00557284EA0171601746
+B1405024529420N00557297EA0171401744
+B1405044529431N00557309EA0171201742
+B1405064529441N00557321EA0171001740
+B1405084529451N00557333EA0170701737
+B1405104529461N00557346EA0170401733
+B1405124529471N00557359EA0170101731
+B1405144529481N00557372EA0170001729
+B1405164529490N00557385EA0169801727
+B1405184529500N00557397EA0169501724
+B1405204529509N00557410EA0169301721
+B1405224529519N00557423EA0169201720
+B1405244529528N00557436EA0168901717
+B1405264529538N00557448EA0168501714
+B1405284529548N00557463EA0168201710
+B1405304529557N00557478EA0167901708
+B1405324529567N00557492EA0167501704
+B1405344529576N00557508EA0167201701
+B1405364529585N00557523EA0167001698
+B1405384529595N00557538EA0166801696
+B1405404529604N00557551EA0166701694
+B1405424529612N00557564EA0166501692
+B1405444529621N00557578EA0166301690
+B1405464529629N00557592EA0166001688
+B1405484529638N00557606EA0165801685
+B1405504529645N00557620EA0165601683
+B1405524529654N00557635EA0165401681
+B1405544529662N00557650EA0165201679
+B1405564529669N00557666EA0165101677
+B1405584529677N00557679EA0164801675
+B1406004529686N00557693EA0164601673
+B1406024529695N00557706EA0164401670
+B1406044529704N00557717EA0164201668
+B1406064529713N00557730EA0163901666
+B1406084529722N00557743EA0163701663
+B1406104529732N00557755EA0163601662
+B1406124529740N00557768EA0163501661
+B1406144529748N00557780EA0163301658
+B1406164529757N00557793EA0163101656
+B1406184529766N00557806EA0162901655
+B1406204529774N00557817EA0162701653
+B1406224529783N00557829EA0162401650
+B1406244529792N00557841EA0162301648
+B1406264529801N00557851EA0162101647
+B1406284529810N00557861EA0161801644
+B1406304529819N00557872EA0161601642
+B1406324529829N00557883EA0161501640
+B1406344529837N00557894EA0161201638
+B1406364529846N00557905EA0160901635
+B1406384529855N00557917EA0160701633
+B1406404529864N00557929EA0160401631
+B1406424529872N00557941EA0160101628
+B1406444529882N00557952EA0159901625
+B1406464529892N00557964EA0159701622
+B1406484529900N00557976EA0159401620
+B1406504529910N00557988EA0159001617
+B1406524529920N00557999EA0158801614
+B1406544529929N00558011EA0158601612
+B1406564529939N00558022EA0158401609
+B1406584529948N00558033EA0158101607
+B1407004529958N00558045EA0157901605
+B1407024529967N00558056EA0157701603
+B1407044529976N00558068EA0157401600
+B1407064529986N00558079EA0157101597
+B1407084529996N00558090EA0156901594
+B1407104530005N00558102EA0156601591
+B1407124530014N00558114EA0156301588
+B1407144530024N00558127EA0156101586
+B1407164530033N00558140EA0155901584
+B1407184530042N00558154EA0155701582
+B1407204530051N00558167EA0155501580
+B1407224530059N00558180EA0155201577
+B1407244530068N00558193EA0155001575
+B1407264530077N00558206EA0154801573
+B1407284530086N00558218EA0154601571
+B1407304530096N00558230EA0154301568
+B1407324530105N00558242EA0154101565
+B1407344530114N00558255EA0153901564
+B1407364530123N00558267EA0153701561
+B1407384530132N00558280EA0153401559
+B1407404530141N00558294EA0153301557
+B1407424530150N00558306EA0153101555
+B1407444530158N00558319EA0152901553
+B1407464530167N00558332EA0152701551
+B1407484530176N00558344EA0152501549
+B1407504530184N00558356EA0152201547
+B1407524530193N00558369EA0152001544
+B1407544530202N00558382EA0151701542
+B1407564530210N00558395EA0151501539
+B1407584530219N00558407EA0151301537
+B1408004530227N00558420EA0151101535
+B1408024530236N00558433EA0151001534
+B1408044530244N00558445EA0150801532
+B1408064530253N00558457EA0150601530
+B1408084530261N00558470EA0150401528
+B1408104530269N00558482EA0150201526
+B1408124530277N00558494EA0150001523
+B1408144530285N00558506EA0149701521
+B1408164530294N00558518EA0149601519
+B1408184530302N00558529EA0149401517
+B1408204530311N00558541EA0149101515
+B1408224530320N00558552EA0148901512
+B1408244530329N00558564EA0148701510
+B1408264530338N00558575EA0148501509
+B1408284530347N00558587EA0148301507
+B1408304530356N00558598EA0148101504
+B1408324530365N00558610EA0147901503
+B1408344530373N00558622EA0147801501
+B1408364530382N00558633EA0147501499
+B1408384530391N00558645EA0147401497
+B1408404530400N00558657EA0147201495
+B1408424530408N00558669EA0147001493
+B1408444530418N00558681EA0146801491
+B1408464530426N00558693EA0146601489
+B1408484530435N00558704EA0146501488
+B1408504530443N00558717EA0146301486
+B1408524530452N00558729EA0146101484
+B1408544530461N00558740EA0145901482
+B1408564530470N00558752EA0145701480
+B1408584530478N00558764EA0145501478
+B1409004530487N00558776EA0145301476
+B1409024530496N00558787EA0145101474
+B1409044530505N00558798EA0144901472
+B1409064530514N00558809EA0144701470
+B1409084530523N00558821EA0144501468
+B1409104530531N00558832EA0144201465
+B1409124530540N00558844EA0144001463
+B1409144530549N00558856EA0143801461
+B1409164530557N00558868EA0143501458
+B1409184530566N00558880EA0143201455
+B1409204530574N00558893EA0143001453
+B1409224530583N00558905EA0142801451
+B1409244530591N00558917EA0142601448
+B1409264530600N00558928EA0142401446
+B1409284530609N00558940EA0142201444
+B1409304530617N00558951EA0141901441
+B1409324530626N00558963EA0141601439
+B1409344530635N00558975EA0141401436
+B1409364530643N00558987EA0141201434
+B1409384530651N00558999EA0140901431
+B1409404530660N00559010EA0140601428
+B1409424530669N00559022EA0140401426
+B1409444530677N00559033EA0140101423
+B1409464530686N00559044EA0139701420
+B1409484530695N00559056EA0139401417
+B1409504530703N00559067EA0139101414
+B1409524530712N00559079EA0138701411
+B1409544530721N00559090EA0138401407
+B1409564530730N00559102EA0138101404
+B1409584530739N00559113EA0137801401
+B1410004530747N00559124EA0137501398
+B1410024530756N00559137EA0137201395
+B1410044530764N00559149EA0136901392
+B1410064530773N00559161EA0136601389
+B1410084530781N00559173EA0136401386
+B1410104530789N00559185EA0136101383
+B1410124530798N00559197EA0135801380
+B1410144530806N00559209EA0135401377
+B1410164530815N00559220EA0135101374
+B1410184530823N00559232EA0134801371
+B1410204530831N00559244EA0134501367
+B1410224530840N00559256EA0134201364
+B1410244530848N00559268EA0133901361
+B1410264530856N00559281EA0133701359
+B1410284530864N00559293EA0133401356
+B1410304530871N00559306EA0133101353
+B1410324530879N00559319EA0132901350
+B1410344530886N00559332EA0132601348
+B1410364530894N00559345EA0132401345
+B1410384530902N00559358EA0132101342
+B1410404530909N00559371EA0131901340
+B1410424530917N00559384EA0131701337
+B1410444530924N00559397EA0131401334
+B1410464530932N00559410EA0131201332
+B1410484530939N00559423EA0131001330
+B1410504530947N00559435EA0130801328
+B1410524530955N00559448EA0130701326
+B1410544530963N00559460EA0130401324
+B1410564530970N00559473EA0130301322
+B1410584530977N00559485EA0130001320
+B1411004530984N00559498EA0129801317
+B1411024530992N00559511EA0129601315
+B1411044530999N00559523EA0129401314
+B1411064531006N00559535EA0129101311
+B1411084531014N00559548EA0129001309
+B1411104531021N00559561EA0128801308
+B1411124531028N00559574EA0128601305
+B1411144531034N00559587EA0128301302
+B1411164531041N00559602EA0128101300
+B1411184531047N00559615EA0127801298
+B1411204531054N00559628EA0127501294
+B1411224531061N00559642EA0127201291
+B1411244531068N00559655EA0126901289
+B1411264531074N00559668EA0126601286
+B1411284531080N00559682EA0126301283
+B1411304531087N00559695EA0126001280
+B1411324531093N00559709EA0125701277
+B1411344531100N00559723EA0125401273
+B1411364531107N00559737EA0125201271
+B1411384531114N00559750EA0124901268
+B1411404531119N00559764EA0124701266
+B1411424531126N00559779EA0124601264
+B1411444531132N00559793EA0124501263
+B1411464531138N00559806EA0124301262
+B1411484531144N00559820EA0124101260
+B1411504531151N00559834EA0124001259
+B1411524531157N00559848EA0123701257
+B1411544531163N00559861EA0123401254
+B1411564531170N00559874EA0123001251
+B1411584531177N00559885EA0122801248
+B1412004531183N00559898EA0122601245
+B1412024531189N00559912EA0122501243
+B1412044531193N00559927EA0122201242
+B1412064531197N00559940EA0121601239
+B1412084531203N00559949EA0121201234
+B1412104531210N00559959EA0121001231
+B1412124531215N00559970EA0120601229
+B1412144531221N00559979EA0120201224
+B1412164531228N00559988EA0119901220
+B1412184531234N00559998EA0119601218
+B1412204531240N00600008EA0119101214
+B1412224531246N00600019EA0118801209
+B1412244531253N00600031EA0118501206
+B1412264531259N00600042EA0118201203
+B1412284531265N00600052EA0117801199
+B1412304531271N00600064EA0117501195
+B1412324531277N00600075EA0117201192
+B1412344531284N00600085EA0116801188
+B1412364531290N00600094EA0116401184
+B1412384531298N00600104EA0116001180
+B1412404531305N00600114EA0115701176
+B1412424531312N00600123EA0115301172
+B1412444531319N00600133EA0115101169
+B1412464531327N00600143EA0114901166
+B1412484531334N00600153EA0114601163
+B1412504531342N00600161EA0114401161
+B1412524531350N00600169EA0114501160
+B1412544531357N00600177EA0114401160
+B1412564531365N00600185EA0114401160
+B1412584531371N00600194EA0114301159
+B1413004531377N00600203EA0114001157
+B1413024531384N00600214EA0113801155
+B1413044531389N00600227EA0113701154
+B1413064531396N00600239EA0113601152
+B1413084531402N00600251EA0113401151
+B1413104531409N00600262EA0113301149
+B1413124531416N00600271EA0113101148
+B1413144531423N00600280EA0112901146
+B1413164531430N00600290EA0112601144
+B1413184531438N00600300EA0112401141
+B1413204531445N00600309EA0112101138
+B1413224531453N00600320EA0112101136
+B1413244531461N00600331EA0112001135
+B1413264531469N00600342EA0111901135
+B1413284531476N00600353EA0111701133
+B1413304531485N00600363EA0111601132
+B1413324531492N00600373EA0111501131
+B1413344531499N00600383EA0111301129
+B1413364531507N00600391EA0111001127
+B1413384531513N00600400EA0110801125
+B1413404531519N00600410EA0110401122
+B1413424531525N00600419EA0109901118
+B1413444531532N00600429EA0109501113
+B1413464531539N00600440EA0109301110
+B1413484531545N00600452EA0109001108
+B1413504531551N00600465EA0108701104
+B1413524531559N00600476EA0108401101
+B1413544531565N00600488EA0108201099
+B1413564531571N00600502EA0108001096
+B1413584531577N00600517EA0107701094
+B1414004531584N00600531EA0107501091
+B1414024531590N00600546EA0107301089
+B1414044531596N00600560EA0107101087
+B1414064531602N00600575EA0106901085
+B1414084531609N00600590EA0106801083
+B1414104531616N00600606EA0106701082
+B1414124531623N00600622EA0106701081
+B1414144531629N00600638EA0106601081
+B1414164531636N00600653EA0106401080
+B1414184531642N00600668EA0106301078
+B1414204531650N00600684EA0106201077
+B1414224531656N00600701EA0106101077
+B1414244531661N00600716EA0106001076
+B1414264531668N00600731EA0105701073
+B1414284531675N00600747EA0105501071
+B1414304531682N00600760EA0105401069
+B1414324531689N00600773EA0105101068
+B1414344531693N00600787EA0105001066
+B1414364531698N00600802EA0104701063
+B1414384531703N00600815EA0104501060
+B1414404531709N00600829EA0104201058
+B1414424531715N00600842EA0104001055
+B1414444531723N00600853EA0103901053
+B1414464531729N00600864EA0103701052
+B1414484531735N00600877EA0103501050
+B1414504531742N00600890EA0103601049
+B1414524531746N00600902EA0103601050
+B1414544531748N00600914EA0103301049
+B1414564531753N00600926EA0103201047
+B1414584531758N00600939EA0103301047
+B1415004531760N00600952EA0103001047
+B1415024531765N00600964EA0102801045
+B1415044531770N00600978EA0102901045
+B1415064531774N00600993EA0102901045
+B1415084531778N00601004EA0102901045
+B1415104531784N00601015EA0102801044
+B1415124531789N00601026EA0102901044
+B1415144531795N00601038EA0103001045
+B1415164531800N00601050EA0103001045
+B1415184531805N00601064EA0102901044
+B1415204531810N00601077EA0103001044
+B1415224531814N00601090EA0103101044
+B1415244531818N00601102EA0103101044
+B1415264531824N00601114EA0103101044
+B1415284531828N00601124EA0103201045
+B1415304531833N00601131EA0103301045
+B1415324531838N00601140EA0103501046
+B1415344531843N00601150EA0103701049
+B1415364531847N00601160EA0103901050
+B1415384531852N00601168EA0104001051
+B1415404531857N00601176EA0104201053
+B1415424531863N00601184EA0104401055
+B1415444531868N00601193EA0104601056
+B1415464531874N00601201EA0104601058
+B1415484531879N00601208EA0104301058
+B1415504531885N00601215EA0104001057
+B1415524531892N00601222EA0103801055
+B1415544531899N00601226EA0103801053
+B1415564531906N00601229EA0103901053
+B1415584531914N00601233EA0103801053
+B1416004531921N00601234EA0103801051
+B1416024531930N00601234EA0104001052
+B1416044531939N00601235EA0104401053
+B1416064531947N00601236EA0104701056
+B1416084531954N00601237EA0104901059
+B1416104531959N00601237EA0105001060
+B1416124531965N00601237EA0105001061
+B1416144531971N00601237EA0105001061
+B1416164531977N00601236EA0105301063
+B1416184531983N00601235EA0105601066
+B1416204531989N00601234EA0105901069
+B1416224531994N00601235EA0106101071
+B1416244532000N00601234EA0106401074
+B1416264532006N00601233EA0106801079
+B1416284532010N00601232EA0107301083
+B1416304532014N00601233EA0107501086
+B1416324532018N00601232EA0107701089
+B1416344532021N00601230EA0107901091
+B1416364532025N00601230EA0108201094
+B1416384532026N00601227EA0108401095
+B1416404532025N00601221EA0108601097
+B1416424532013N00601217EA0108801099
+B1416444531997N00601226EA0109101101
+B1416464531988N00601245EA0109201103
+B1416484531988N00601267EA0109501105
+B1416504531994N00601285EA0109801109
+B1416524532002N00601290EA0110001112
+B1416544532007N00601288EA0110301113
+B1416564532010N00601283EA0110601116
+B1416584532011N00601278EA0111101121
+B1417004532012N00601277EA0111401125
+B1417024532015N00601278EA0111501128
+B1417044532015N00601276EA0111501130
+B1417064532010N00601271EA0111501132
+B1417084531996N00601274EA0111701134
+B1417104531981N00601285EA0112101137
+B1417124531972N00601305EA0112301140
+B1417144531970N00601329EA0112701143
+B1417164531976N00601345EA0113101146
+B1417184531982N00601347EA0113401150
+B1417204531985N00601347EA0113501152
+B1417224531988N00601348EA0113201153
+B1417244531992N00601347EA0113201152
+B1417264531997N00601343EA0113501154
+B1417284532000N00601342EA0113601156
+B1417304532002N00601341EA0113601156
+B1417324532004N00601337EA0113801157
+B1417344532007N00601334EA0113901159
+B1417364532010N00601331EA0113901159
+B1417384532012N00601326EA0113901158
+B1417404532016N00601320EA0114001159
+B1417424532021N00601314EA0114501161
+B1417444532024N00601310EA0114901164
+B1417464532026N00601309EA0114901166
+B1417484532027N00601308EA0114901167
+B1417504532030N00601303EA0115401169
+B1417524532032N00601299EA0116001173
+B1417544532033N00601298EA0116201177
+B1417564532035N00601298EA0116201179
+B1417584532038N00601297EA0116301180
+B1418004532040N00601294EA0116501181
+B1418024532042N00601292EA0116501183
+B1418044532045N00601290EA0116401184
+B1418064532048N00601288EA0116501183
+B1418084532051N00601285EA0116601185
+B1418104532054N00601283EA0116801186
+B1418124532058N00601280EA0117201188
+B1418144532063N00601278EA0117701192
+B1418164532065N00601274EA0118001195
+B1418184532061N00601267EA0118101198
+B1418204532048N00601266EA0118301200
+B1418224532036N00601278EA0118601202
+B1418244532031N00601301EA0118801205
+B1418264532032N00601324EA0119301210
+B1418284532039N00601337EA0119701214
+B1418304532045N00601337EA0120001218
+B1418324532046N00601331EA0120101221
+B1418344532042N00601324EA0120201223
+B1418364532031N00601321EA0120201224
+B1418384532016N00601330EA0120401225
+B1418404532006N00601349EA0120601227
+B1418424532002N00601371EA0121001230
+B1418444532004N00601390EA0121501234
+B1418464532009N00601403EA0121701236
+B1418484532017N00601411EA0122001239
+B1418504532023N00601413EA0122801243
+B1418524532026N00601409EA0123201248
+B1418544532027N00601406EA0123101251
+B1418564532031N00601404EA0123001253
+B1418584532035N00601400EA0122901254
+B1419004532031N00601391EA0122501252
+B1419024532018N00601389EA0122301250
+B1419044532002N00601401EA0122301249
+B1419064531993N00601423EA0122301247
+B1419084531992N00601447EA0122401246
+B1419104531997N00601464EA0122701247
+B1419124532003N00601471EA0122901248
+B1419144532007N00601473EA0122801249
+B1419164532011N00601473EA0122601247
+B1419184532016N00601471EA0123001247
+B1419204532021N00601471EA0123401250
+B1419224532024N00601471EA0123501253
+B1419244532026N00601471EA0123601253
+B1419264532030N00601469EA0123901255
+B1419284532033N00601467EA0124101259
+B1419304532034N00601466EA0124101260
+B1419324532037N00601464EA0124201260
+B1419344532041N00601462EA0124401262
+B1419364532045N00601460EA0124401264
+B1419384532049N00601458EA0124501264
+B1419404532055N00601455EA0124801266
+B1419424532061N00601453EA0125101269
+B1419444532067N00601449EA0125401272
+B1419464532072N00601446EA0125601275
+B1419484532076N00601444EA0125401277
+B1419504532080N00601441EA0125101277
+B1419524532084N00601438EA0125001274
+B1419544532090N00601437EA0125201275
+B1419564532095N00601435EA0125501277
+B1419584532098N00601433EA0125801279
+B1420004532103N00601430EA0126401282
+B1420024532107N00601427EA0126901285
+B1420044532111N00601427EA0126801288
+B1420064532115N00601426EA0126601289
+B1420084532123N00601422EA0126801290
+B1420104532131N00601420EA0127101292
+B1420124532137N00601419EA0127301294
+B1420144532142N00601419EA0127401295
+B1420164532148N00601417EA0127801297
+B1420184532152N00601415EA0128301301
+B1420204532156N00601414EA0128401304
+B1420224532159N00601414EA0128401305
+B1420244532158N00601410EA0128601305
+B1420264532152N00601401EA0129201307
+B1420284532140N00601403EA0129501310
+B1420304532128N00601414EA0129801313
+B1420324532117N00601432EA0129901317
+B1420344532114N00601455EA0129801318
+B1420364532123N00601471EA0130001319
+B1420384532134N00601474EA0130501323
+B1420404532138N00601473EA0131201328
+B1420424532141N00601472EA0131701334
+B1420444532145N00601472EA0132201339
+B1420464532149N00601471EA0132701345
+B1420484532148N00601465EA0132801348
+B1420504532137N00601459EA0133201352
+B1420524532124N00601467EA0133501356
+B1420544532114N00601489EA0133901359
+B1420564532114N00601514EA0134701364
+B1420584532123N00601530EA0135501371
+B1421004532131N00601535EA0136101379
+B1421024532134N00601537EA0136401385
+B1421044532138N00601536EA0136801389
+B1421064532138N00601530EA0137101394
+B1421084532130N00601526EA0137301398
+B1421104532117N00601529EA0137601402
+B1421124532104N00601544EA0138001405
+B1421144532098N00601570EA0138301408
+B1421164532100N00601594EA0138801412
+B1421184532107N00601608EA0139201416
+B1421204532114N00601610EA0139601420
+B1421224532118N00601609EA0140001423
+B1421244532122N00601609EA0139701425
+B1421264532127N00601608EA0138901426
+B1421284532132N00601604EA0138301424
+B1421304532134N00601598EA0138101420
+B1421324532136N00601599EA0137801416
+B1421344532141N00601601EA0137201411
+B1421364532148N00601598EA0137101407
+B1421384532152N00601594EA0136901405
+B1421404532156N00601590EA0136601402
+B1421424532160N00601588EA0136301398
+B1421444532165N00601585EA0136301395
+B1421464532170N00601581EA0136301393
+B1421484532175N00601578EA0136401392
+B1421504532180N00601576EA0136601392
+B1421524532185N00601572EA0136901393
+B1421544532190N00601568EA0137001394
+B1421564532193N00601564EA0136401393
+B1421584532194N00601558EA0135601391
+B1422004532197N00601550EA0135401388
+B1422024532200N00601544EA0135401386
+B1422044532205N00601539EA0135401385
+B1422064532210N00601537EA0135401384
+B1422084532216N00601538EA0135301383
+B1422104532221N00601536EA0135201382
+B1422124532226N00601531EA0135301381
+B1422144532232N00601526EA0135601381
+B1422164532237N00601524EA0135901383
+B1422184532243N00601522EA0136001384
+B1422204532249N00601518EA0135701383
+B1422224532257N00601516EA0135001381
+B1422244532265N00601513EA0134501377
+B1422264532273N00601510EA0134301374
+B1422284532282N00601510EA0134201372
+B1422304532291N00601510EA0134201371
+B1422324532301N00601513EA0134101370
+B1422344532311N00601514EA0134001368
+B1422364532321N00601516EA0134101367
+B1422384532331N00601517EA0134301367
+B1422404532340N00601518EA0134601369
+B1422424532347N00601517EA0134901371
+B1422444532353N00601514EA0135301374
+B1422464532358N00601510EA0135701378
+B1422484532364N00601506EA0135901381
+B1422504532371N00601503EA0136101384
+B1422524532376N00601500EA0136101386
+B1422544532377N00601494EA0135701387
+B1422564532373N00601489EA0135401386
+B1422584532365N00601490EA0135201384
+B1423004532355N00601498EA0135301381
+B1423024532345N00601510EA0135601382
+B1423044532336N00601522EA0135901384
+B1423064532328N00601532EA0136101386
+B1423084532319N00601544EA0136101386
+B1423104532309N00601554EA0136101386
+B1423124532300N00601553EA0136101385
+B1423144532300N00601546EA0136201385
+B1423164532305N00601541EA0136301386
+B1423184532313N00601540EA0136201385
+B1423204532321N00601537EA0136101384
+B1423224532329N00601535EA0135801382
+B1423244532336N00601532EA0135401380
+B1423264532341N00601527EA0135101377
+B1423284532341N00601519EA0134801374
+B1423304532338N00601510EA0134501370
+B1423324532335N00601501EA0134301367
+B1423344532332N00601492EA0134201365
+B1423364532328N00601485EA0133901362
+B1423384532322N00601477EA0133601359
+B1423404532316N00601466EA0133601357
+B1423424532314N00601456EA0133401356
+B1423444532312N00601446EA0133001353
+B1423464532309N00601437EA0132601350
+B1423484532307N00601427EA0132301346
+B1423504532306N00601416EA0132001343
+B1423524532303N00601406EA0131801340
+B1423544532301N00601397EA0131501338
+B1423564532300N00601386EA0131301334
+B1423584532299N00601374EA0131101332
+B1424004532297N00601363EA0130901330
+B1424024532297N00601351EA0130601327
+B1424044532298N00601338EA0130501325
+B1424064532300N00601326EA0130401324
+B1424084532304N00601316EA0130201322
+B1424104532307N00601305EA0130201321
+B1424124532310N00601293EA0130301321
+B1424144532313N00601283EA0130601323
+B1424164532316N00601274EA0130801325
+B1424184532317N00601267EA0130801327
+B1424204532319N00601261EA0130901327
+B1424224532321N00601255EA0131001328
+B1424244532324N00601248EA0130901328
+B1424264532328N00601242EA0131001328
+B1424284532331N00601235EA0131101329
+B1424304532333N00601228EA0131101330
+B1424324532336N00601222EA0131001330
+B1424344532339N00601217EA0130901329
+B1424364532343N00601211EA0130801328
+B1424384532347N00601203EA0130701327
+B1424404532350N00601196EA0130601326
+B1424424532355N00601191EA0130601326
+B1424444532359N00601187EA0130301325
+B1424464532360N00601178EA0130201323
+B1424484532355N00601169EA0130101323
+B1424504532351N00601162EA0129901321
+B1424524532354N00601157EA0129401319
+B1424544532364N00601160EA0128901316
+B1424564532374N00601174EA0128701312
+B1424584532380N00601192EA0128501309
+B1425004532385N00601212EA0128301307
+B1425024532390N00601232EA0128301305
+B1425044532394N00601252EA0128401304
+B1425064532399N00601271EA0128501304
+B1425084532404N00601289EA0128801306
+B1425104532408N00601307EA0128701307
+B1425124532412N00601322EA0128201308
+B1425144532418N00601338EA0127801307
+B1425164532425N00601356EA0127901306
+B1425184532430N00601373EA0127801305
+B1425204532434N00601391EA0127801303
+B1425224532440N00601408EA0127701302
+B1425244532446N00601424EA0127701301
+B1425264532453N00601440EA0127801301
+B1425284532458N00601456EA0128001302
+B1425304532464N00601471EA0128201304
+B1425324532470N00601486EA0128301305
+B1425344532475N00601500EA0128501307
+B1425364532480N00601515EA0128601308
+B1425384532487N00601527EA0128701308
+B1425404532494N00601536EA0128701308
+B1425424532501N00601536EA0128601308
+B1425444532505N00601523EA0128601307
+B1425464532499N00601515EA0128601306
+B1425484532486N00601516EA0128801306
+B1425504532474N00601521EA0129001309
+B1425524532463N00601524EA0129101310
+B1425544532453N00601525EA0129301311
+B1425564532442N00601526EA0129401314
+B1425584532433N00601526EA0129501315
+B1426004532425N00601522EA0129501315
+B1426024532420N00601514EA0129501315
+B1426044532417N00601504EA0129501314
+B1426064532415N00601493EA0129401314
+B1426084532412N00601482EA0129401314
+B1426104532409N00601473EA0129301314
+B1426124532406N00601462EA0129201313
+B1426144532403N00601452EA0129101312
+B1426164532399N00601442EA0129101311
+B1426184532395N00601431EA0129201311
+B1426204532394N00601420EA0129301312
+B1426224532393N00601411EA0129401313
+B1426244532391N00601403EA0129301313
+B1426264532387N00601396EA0129101312
+B1426284532383N00601386EA0128901310
+B1426304532380N00601375EA0128801308
+B1426324532377N00601364EA0128801307
+B1426344532374N00601353EA0128801307
+B1426364532372N00601344EA0128801307
+B1426384532372N00601334EA0128901308
+B1426404532372N00601326EA0129001310
+B1426424532373N00601318EA0129001310
+B1426444532373N00601309EA0129201311
+B1426464532374N00601298EA0129601312
+B1426484532376N00601288EA0129901316
+B1426504532377N00601280EA0130101318
+B1426524532379N00601271EA0130001319
+B1426544532389N00601269EA0130001319
+B1426564532397N00601282EA0130101319
+B1426584532395N00601301EA0130101320
+B1427004532386N00601316EA0130401321
+B1427024532376N00601323EA0130701323
+B1427044532366N00601321EA0131001327
+B1427064532357N00601317EA0131201330
+B1427084532351N00601311EA0131201332
+B1427104532346N00601303EA0131101332
+B1427124532344N00601294EA0131101333
+B1427144532346N00601289EA0131101332
+B1427164532352N00601290EA0131101332
+B1427184532359N00601303EA0131201331
+B1427204532360N00601321EA0131201332
+B1427224532357N00601338EA0131101332
+B1427244532354N00601355EA0131201331
+B1427264532348N00601372EA0131401332
+B1427284532339N00601385EA0131601333
+B1427304532330N00601396EA0131701335
+B1427324532320N00601408EA0132101337
+B1427344532310N00601419EA0132701341
+B1427364532302N00601431EA0133001346
+B1427384532293N00601441EA0132801349
+B1427404532280N00601440EA0132701351
+B1427424532269N00601431EA0133001352
+B1427444532266N00601420EA0133301355
+B1427464532269N00601412EA0133601358
+B1427484532275N00601409EA0133701360
+B1427504532285N00601414EA0133901361
+B1427524532291N00601432EA0134101362
+B1427544532287N00601454EA0134701365
+B1427564532277N00601466EA0135101369
+B1427584532266N00601469EA0135301371
+B1428004532255N00601464EA0135601374
+B1428024532251N00601452EA0135901376
+B1428044532255N00601443EA0136201380
+B1428064532264N00601445EA0136201382
+B1428084532273N00601457EA0136301383
+B1428104532276N00601479EA0136601385
+B1428124532268N00601495EA0136901388
+B1428144532256N00601502EA0137201391
+B1428164532244N00601503EA0137301392
+B1428184532232N00601500EA0137501393
+B1428204532224N00601487EA0137901395
+B1428224532227N00601477EA0138101398
+B1428244532235N00601478EA0138201401
+B1428264532242N00601489EA0138101402
+B1428284532247N00601510EA0138201402
+B1428304532243N00601532EA0138501404
+B1428324532231N00601545EA0138801405
+B1428344532219N00601550EA0138801406
+B1428364532207N00601551EA0138801405
+B1428384532193N00601550EA0139001404
+B1428404532184N00601538EA0139301404
+B1428424532184N00601527EA0139601406
+B1428444532187N00601520EA0139701409
+B1428464532189N00601515EA0139501410
+B1428484532192N00601511EA0139101410
+B1428504532203N00601516EA0138901408
+B1428524532214N00601524EA0138901408
+B1428544532223N00601532EA0138801408
+B1428564532231N00601539EA0138701406
+B1428584532240N00601545EA0138501404
+B1429004532250N00601550EA0138201402
+B1429024532260N00601554EA0138001400
+B1429044532271N00601554EA0138401398
+B1429064532279N00601554EA0138701398
+B1429084532286N00601556EA0138801399
+B1429104532293N00601557EA0138701398
+B1429124532302N00601556EA0138901398
+B1429144532311N00601559EA0139401399
+B1429164532319N00601560EA0139601403
+B1429184532324N00601559EA0139901406
+B1429204532330N00601556EA0140301410
+B1429224532335N00601552EA0140301413
+B1429244532336N00601545EA0139901415
+B1429264532325N00601534EA0139601415
+B1429284532309N00601534EA0139501414
+B1429304532296N00601553EA0139301414
+B1429324532297N00601575EA0139301413
+B1429344532305N00601586EA0139501413
+B1429364532313N00601586EA0139501414
+B1429384532319N00601586EA0139401413
+B1429404532327N00601587EA0139301412
+B1429424532333N00601585EA0139001411
+B1429444532341N00601583EA0138701409
+B1429464532349N00601582EA0138601406
+B1429484532359N00601584EA0138801404
+B1429504532367N00601587EA0139301404
+B1429524532374N00601590EA0139501405
+B1429544532380N00601591EA0139401405
+B1429564532387N00601591EA0139101404
+B1429584532396N00601591EA0138801401
+B1430004532406N00601594EA0138901401
+B1430024532415N00601597EA0138901400
+B1430044532422N00601598EA0138701399
+B1430064532430N00601600EA0138301397
+B1430084532439N00601601EA0137701393
+B1430104532448N00601600EA0137601390
+B1430124532457N00601600EA0137701388
+B1430144532466N00601603EA0137601387
+B1430164532477N00601603EA0137601386
+B1430184532488N00601605EA0138001385
+B1430204532498N00601608EA0138001386
+B1430224532504N00601610EA0137601385
+B1430244532512N00601610EA0137401383
+B1430264532522N00601610EA0137501383
+B1430284532530N00601610EA0137701385
+B1430304532540N00601612EA0137601385
+B1430324532549N00601615EA0137301385
+B1430344532557N00601617EA0136701383
+B1430364532565N00601619EA0136301380
+B1430384532574N00601620EA0135801376
+B1430404532582N00601617EA0135701372
+B1430424532589N00601614EA0135701371
+B1430444532597N00601613EA0135601369
+B1430464532607N00601614EA0135701369
+B1430484532615N00601615EA0135601370
+B1430504532622N00601618EA0135301368
+B1430524532631N00601623EA0135001366
+B1430544532640N00601632EA0135001365
+B1430564532648N00601645EA0134901364
+B1430584532655N00601659EA0134601362
+B1431004532662N00601672EA0134101359
+B1431024532670N00601690EA0133901356
+B1431044532677N00601709EA0133701354
+B1431064532682N00601730EA0133301351
+B1431084532687N00601751EA0133101347
+B1431104532693N00601773EA0132901345
+B1431124532697N00601793EA0132501342
+B1431144532703N00601815EA0132201338
+B1431164532708N00601837EA0132101336
+B1431184532713N00601858EA0132001334
+B1431204532719N00601873EA0131501332
+B1431224532727N00601891EA0130901328
+B1431244532734N00601912EA0130701324
+B1431264532736N00601934EA0130401321
+B1431284532736N00601951EA0129601317
+B1431304532738N00601970EA0128801312
+B1431324532741N00601991EA0128201305
+B1431344532742N00602010EA0127401299
+B1431364532744N00602028EA0126301291
+B1431384532749N00602050EA0125901284
+B1431404532754N00602073EA0125701277
+B1431424532757N00602091EA0125301273
+B1431444532762N00602109EA0125201268
+B1431464532768N00602128EA0125601264
+B1431484532771N00602148EA0126101262
+B1431504532773N00602164EA0126201263
+B1431524532776N00602181EA0126501265
+B1431544532778N00602198EA0126501267
+B1431564532779N00602214EA0126201267
+B1431584532781N00602231EA0125701266
+B1432004532784N00602251EA0125501263
+B1432024532787N00602270EA0125201261
+B1432044532789N00602289EA0124801258
+B1432064532790N00602310EA0124601255
+B1432084532792N00602331EA0124501254
+B1432104532793N00602349EA0124101252
+B1432124532794N00602369EA0123701249
+B1432144532794N00602389EA0123501246
+B1432164532797N00602408EA0123201244
+B1432184532798N00602428EA0122801242
+B1432204532799N00602449EA0122501238
+B1432224532801N00602470EA0122201235
+B1432244532801N00602491EA0122001234
+B1432264532802N00602511EA0121801231
+B1432284532805N00602531EA0121601229
+B1432304532807N00602551EA0121301226
+B1432324532809N00602571EA0120901223
+B1432344532812N00602590EA0120801221
+B1432364532814N00602610EA0120701220
+B1432384532817N00602628EA0120501218
+B1432404532820N00602645EA0120201216
+B1432424532822N00602663EA0120201214
+B1432444532824N00602681EA0120101214
+B1432464532826N00602698EA0119801212
+B1432484532829N00602716EA0119501209
+B1432504532833N00602734EA0119301207
+B1432524532838N00602751EA0119201206
+B1432544532843N00602767EA0119101204
+B1432564532852N00602791EA0119101203
+B1432584532855N00602799EA0119201203
+B1433004532861N00602813EA0119201204
+B1433024532865N00602827EA0119201204
+B1433044532870N00602839EA0119001203
+B1433064532876N00602850EA0118901202
+B1433084532884N00602859EA0118801201
+B1433104532894N00602867EA0119001201
+B1433124532904N00602873EA0119101202
+B1433144532914N00602879EA0119401204
+B1433164532922N00602885EA0119501206
+B1433184532929N00602892EA0119601208
+B1433204532937N00602897EA0119401208
+B1433224532944N00602899EA0119001208
+B1433244532953N00602900EA0118901206
+B1433264532963N00602902EA0119001204
+B1433284532972N00602904EA0119301205
+B1433304532981N00602904EA0119701207
+B1433324532989N00602904EA0120301211
+B1433344532995N00602908EA0120801217
+B1433364532999N00602907EA0120801221
+B1433384533000N00602896EA0120701224
+B1433404532990N00602884EA0121001226
+B1433424532975N00602891EA0121501230
+B1433444532966N00602910EA0122001234
+B1433464532967N00602928EA0122401239
+B1433484532974N00602940EA0122701243
+B1433504532982N00602939EA0122801244
+B1433524532984N00602927EA0122801245
+B1433544532976N00602917EA0123101246
+B1433564532957N00602918EA0123501251
+B1433584532951N00602924EA0123801252
+B1434004532942N00602941EA0124101256
+B1434024532939N00602961EA0124501259
+B1434044532943N00602977EA0124901263
+B1434064532951N00602985EA0125401268
+B1434084532958N00602983EA0125601271
+B1434104532958N00602970EA0125701274
+B1434124532948N00602961EA0126001276
+B1434144532934N00602968EA0126401280
+B1434164532924N00602986EA0126801283
+B1434184532923N00603006EA0127201286
+B1434204532929N00603021EA0127401289
+B1434224532938N00603024EA0127601291
+B1434244532942N00603016EA0127601292
+B1434264532934N00603005EA0127701294
+B1434284532919N00603006EA0128101296
+B1434304532908N00603021EA0128601299
+B1434324532902N00603039EA0129001302
+B1434344532903N00603057EA0129401307
+B1434364532908N00603072EA0129801312
+B1434384532917N00603078EA0129901315
+B1434404532925N00603074EA0129901318
+B1434424532922N00603055EA0129701319
+B1434444532908N00603053EA0129701319
+B1434464532900N00603059EA0130001320
+B1434484532888N00603072EA0130301323
+B1434504532879N00603087EA0130901327
+B1434524532869N00603111EA0131501335
+B1434544532866N00603117EA0131701337
+B1434564532861N00603131EA0131601340
+B1434584532871N00603152EA0131901344
+B1435004532877N00603146EA0132201346
+B1435024532878N00603140EA0132601348
+B1435044532864N00603125EA0132801351
+B1435064532856N00603125EA0133101352
+B1435084532835N00603142EA0133501356
+B1435104532830N00603160EA0133801359
+B1435124532832N00603177EA0134001361
+B1435144532840N00603185EA0134101361
+B1435164532846N00603182EA0134201363
+B1435184532844N00603169EA0134401365
+B1435204532832N00603160EA0134901368
+B1435224532824N00603161EA0135201369
+B1435244532808N00603168EA0135701374
+B1435264532787N00603167EA0135801379
+B1435284532780N00603153EA0135801381
+B1435304532785N00603146EA0136101383
+B1435324532789N00603149EA0136401384
+B1435344532796N00603172EA0136901390
+B1435364532799N00603183EA0137401395
+B1435384532801N00603193EA0137601397
+B1435404532803N00603200EA0137701397
+B1435424532807N00603221EA0138101401
+B1435444532812N00603234EA0138701406
+B1435464532818N00603243EA0139301412
+B1435484532821N00603246EA0139701414
+B1435504532828N00603236EA0139701419
+B1435524532821N00603221EA0140001422
+B1435544532806N00603217EA0140401426
+B1435564532791N00603224EA0140701429
+B1435584532779N00603228EA0140701431
+B1436004532766N00603218EA0140401431
+B1436024532761N00603204EA0140401431
+B1436044532764N00603197EA0139901429
+B1436064532771N00603198EA0139501425
+B1436084532778N00603205EA0139101420
+B1436104532782N00603209EA0138901417
+B1436124532794N00603222EA0138901414
+B1436144532800N00603233EA0139001414
+B1436164532806N00603244EA0139301415
+B1436184532812N00603254EA0139701417
+B1436204532817N00603261EA0140101420
+B1436224532823N00603268EA0140401423
+B1436244532829N00603276EA0140701426
+B1436264532835N00603284EA0140801428
+B1436284532841N00603290EA0141001430
+B1436304532847N00603297EA0141201432
+B1436324532854N00603304EA0141301433
+B1436344532862N00603312EA0141501435
+B1436364532869N00603320EA0141701437
+B1436384532876N00603325EA0141901439
+B1436404532883N00603330EA0142001441
+B1436424532890N00603336EA0142301444
+B1436444532897N00603341EA0142601447
+B1436464532904N00603346EA0143001451
+B1436484532911N00603349EA0143101453
+B1436504532917N00603352EA0143201455
+B1436524532925N00603354EA0143201456
+B1436544532933N00603357EA0143401457
+B1436564532940N00603357EA0143401457
+B1436584532947N00603355EA0143501458
+B1437004532950N00603347EA0143301457
+B1437024532946N00603333EA0142901456
+B1437044532934N00603326EA0143001456
+B1437064532922N00603325EA0143201457
+B1437084532911N00603322EA0143201457
+B1437104532900N00603318EA0143301457
+B1437124532889N00603317EA0143201457
+B1437144532878N00603319EA0143101455
+B1437164532866N00603320EA0143201456
+B1437184532853N00603319EA0143601458
+B1437204532842N00603318EA0144201461
+B1437224532830N00603316EA0144701466
+B1437244532821N00603310EA0145101471
+B1437264532822N00603300EA0145301474
+B1437284532829N00603296EA0145701478
+B1437304532832N00603296EA0146101481
+B1437324532837N00603299EA0146301484
+B1437344532845N00603311EA0146401488
+B1437364532851N00603323EA0146901492
+B1437384532856N00603334EA0147101494
+B1437404532862N00603342EA0147001495
+B1437424532866N00603346EA0146801495
+B1437444532876N00603354EA0146701492
+B1437464532882N00603349EA0146401490
+B1437484532879N00603333EA0146101487
+B1437504532867N00603320EA0146501485
+B1437524532856N00603315EA0147201487
+B1437544532848N00603312EA0147101488
+B1437564532838N00603308EA0147001487
+B1437584532831N00603305EA0147201488
+B1438004532818N00603302EA0147301490
+B1438024532800N00603296EA0147101490
+B1438044532791N00603286EA0147101490
+B1438064532792N00603273EA0147001489
+B1438084532802N00603273EA0146901489
+B1438104532810N00603286EA0147301491
+B1438124532814N00603295EA0147701494
+B1438144532817N00603301EA0147701495
+B1438164532823N00603310EA0147901497
+B1438184532828N00603319EA0148301500
+B1438204532833N00603326EA0148701504
+B1438224532839N00603331EA0148801506
+B1438244532847N00603337EA0149101510
+B1438264532853N00603345EA0149601514
+B1438284532859N00603353EA0150201520
+B1438304532862N00603359EA0150501524
+B1438324532871N00603363EA0150801527
+B1438344532879N00603367EA0151301532
+B1438364532886N00603367EA0151301535
+B1438384532893N00603364EA0150801537
+B1438404532901N00603366EA0150501536
+B1438424532908N00603371EA0150401534
+B1438444532915N00603375EA0150401534
+B1438464532921N00603377EA0150101531
+B1438484532928N00603377EA0149801528
+B1438504532937N00603375EA0149701526
+B1438524532945N00603375EA0149801525
+B1438544532952N00603373EA0149901525
+B1438564532961N00603370EA0150001525
+B1438584532969N00603369EA0150501526
+B1439004532977N00603370EA0150701528
+B1439024532985N00603371EA0150801529
+B1439044532992N00603369EA0151001531
+B1439064532999N00603365EA0150601531
+B1439084533006N00603360EA0150001530
+B1439104533014N00603355EA0149601527
+B1439124533022N00603351EA0149301523
+B1439144533030N00603345EA0149301521
+B1439164533039N00603343EA0149801520
+B1439184533044N00603345EA0150201520
+B1439204533049N00603344EA0150101519
+B1439224533057N00603340EA0150201520
+B1439244533064N00603339EA0150501522
+B1439264533070N00603336EA0150601523
+B1439284533078N00603331EA0150701525
+B1439304533085N00603325EA0150901527
+B1439324533093N00603320EA0151201531
+B1439344533101N00603315EA0151501534
+B1439364533109N00603315EA0151701536
+B1439384533116N00603321EA0151801538
+B1439404533123N00603329EA0151801538
+B1439424533130N00603334EA0151601537
+B1439444533138N00603339EA0151301535
+B1439464533146N00603347EA0151101533
+B1439484533154N00603356EA0150901531
+B1439504533161N00603364EA0150601528
+B1439524533168N00603373EA0150201524
+B1439544533176N00603382EA0149801521
+B1439564533185N00603391EA0149601518
+B1439584533194N00603399EA0149401515
+B1440004533203N00603406EA0149101512
+B1440024533212N00603414EA0148901510
+B1440044533221N00603423EA0148801509
+B1440064533229N00603431EA0148601507
+B1440084533237N00603440EA0148401505
+B1440104533245N00603449EA0148101502
+B1440124533254N00603458EA0147901500
+B1440144533262N00603466EA0147801498
+B1440164533270N00603474EA0147501495
+B1440184533279N00603483EA0147201493
+B1440204533287N00603492EA0147001491
+B1440224533295N00603500EA0146801488
+B1440244533304N00603506EA0146401485
+B1440264533313N00603512EA0146201483
+B1440284533322N00603519EA0146001481
+B1440304533330N00603527EA0145801479
+B1440324533338N00603538EA0145801478
+B1440344533343N00603550EA0145701477
+B1440364533350N00603562EA0145601476
+B1440384533357N00603574EA0145401475
+B1440404533364N00603587EA0145601475
+B1440424533369N00603601EA0145701476
+B1440444533372N00603615EA0145401475
+B1440464533379N00603628EA0144901473
+B1440484533386N00603641EA0144701471
+B1440504533394N00603655EA0144701471
+B1440524533401N00603668EA0144901471
+B1440544533409N00603679EA0145101473
+B1440564533416N00603691EA0145001473
+B1440584533424N00603704EA0144801471
+B1441004533433N00603718EA0144701470
+B1441024533442N00603731EA0144601469
+B1441044533451N00603744EA0144401467
+B1441064533461N00603756EA0144201465
+B1441084533472N00603768EA0144301465
+B1441104533483N00603778EA0144601466
+B1441124533493N00603786EA0145101469
+B1441144533501N00603796EA0145401472
+B1441164533510N00603807EA0145401473
+B1441184533521N00603818EA0145801476
+B1441204533529N00603830EA0146201479
+B1441224533537N00603844EA0146401481
+B1441244533547N00603858EA0146601483
+B1441264533558N00603873EA0147201487
+B1441284533568N00603878EA0147701492
+B1441304533571N00603871EA0148101496
+B1441324533568N00603862EA0148501502
+B1441344533562N00603856EA0149001508
+B1441364533558N00603850EA0149801515
+B1441384533559N00603843EA0150301520
+B1441404533565N00603836EA0150601524
+B1441424533577N00603835EA0151001529
+B1441444533587N00603854EA0151101532
+B1441464533579N00603878EA0151401536
+B1441484533565N00603879EA0151801540
+B1441504533556N00603877EA0152601546
+B1441524533550N00603875EA0153001551
+B1441544533546N00603868EA0153201554
+B1441564533549N00603856EA0153601557
+B1441584533562N00603857EA0154101561
+B1442004533572N00603874EA0154501564
+B1442024533571N00603895EA0154801567
+B1442044533559N00603907EA0155001569
+B1442064533546N00603906EA0155501574
+B1442084533540N00603897EA0156001579
+B1442104533539N00603888EA0156601586
+B1442124533543N00603883EA0156901590
+B1442144533553N00603886EA0157001592
+B1442164533565N00603900EA0157201593
+B1442184533567N00603922EA0157501596
+B1442204533559N00603940EA0157701598
+B1442224533546N00603947EA0158101601
+B1442244533537N00603944EA0158401604
+B1442264533533N00603937EA0158801609
+B1442284533533N00603930EA0159201613
+B1442304533540N00603927EA0159601617
+B1442324533550N00603935EA0159601618
+B1442344533556N00603958EA0159501618
+B1442364533550N00603981EA0159501618
+B1442384533536N00603988EA0159601617
+B1442404533525N00603985EA0159901619
+B1442424533516N00603982EA0160301623
+B1442444533508N00603980EA0160701627
+B1442464533499N00603977EA0161301632
+B1442484533490N00603975EA0162101639
+B1442504533484N00603974EA0162701645
+B1442524533479N00603970EA0162401648
+B1442544533486N00603964EA0162201649
+B1442564533497N00603965EA0162101650
+B1442584533508N00603978EA0162301649
+B1443004533514N00603997EA0162601651
+B1443024533509N00604019EA0162901655
+B1443044533496N00604030EA0163201658
+B1443064533481N00604032EA0163801662
+B1443084533471N00604031EA0164601668
+B1443104533464N00604029EA0164901672
+B1443124533458N00604025EA0164601674
+B1443144533461N00604013EA0164001673
+B1443164533471N00604008EA0163601673
+B1443184533480N00604008EA0163401670
+B1443204533490N00604009EA0163001663
+B1443224533500N00604011EA0162701659
+B1443244533510N00604012EA0162701657
+B1443264533519N00604012EA0162801656
+B1443284533526N00604012EA0162801655
+B1443304533535N00604012EA0162801653
+B1443324533543N00604010EA0162701652
+B1443344533550N00604007EA0162701651
+B1443364533558N00604005EA0162601650
+B1443384533565N00604002EA0162401648
+B1443404533572N00603999EA0161901644
+B1443424533580N00603998EA0161701641
+B1443444533588N00603996EA0161401638
+B1443464533595N00603995EA0161001634
+B1443484533603N00603993EA0160801631
+B1443504533611N00603994EA0160501628
+B1443524533620N00603993EA0160201625
+B1443544533629N00603990EA0160001622
+B1443564533637N00603989EA0159801620
+B1443584533645N00603987EA0159501617
+B1444004533654N00603985EA0159201614
+B1444024533662N00603983EA0158801611
+B1444044533672N00603981EA0158501608
+B1444064533682N00603978EA0158401606
+B1444084533690N00603974EA0158301604
+B1444104533698N00603971EA0158001601
+B1444124533708N00603966EA0157501597
+B1444144533717N00603959EA0157001594
+B1444164533726N00603953EA0156601590
+B1444184533735N00603945EA0156101585
+B1444204533746N00603937EA0155801580
+B1444224533755N00603930EA0155701578
+B1444244533764N00603925EA0155701576
+B1444264533773N00603921EA0156001577
+B1444284533780N00603917EA0156301579
+B1444304533785N00603912EA0156401580
+B1444324533792N00603905EA0156601583
+B1444344533798N00603899EA0157201587
+B1444364533806N00603896EA0157901593
+B1444384533810N00603894EA0158001596
+B1444404533816N00603888EA0158101599
+B1444424533824N00603882EA0158501604
+B1444444533830N00603878EA0158801607
+B1444464533836N00603874EA0158701608
+B1444484533845N00603870EA0158801609
+B1444504533854N00603867EA0158901610
+B1444524533863N00603863EA0158901610
+B1444544533872N00603860EA0159001611
+B1444564533883N00603859EA0159401613
+B1444584533892N00603858EA0159601616
+B1445004533901N00603857EA0159701617
+B1445024533912N00603855EA0159801619
+B1445044533924N00603856EA0160201621
+B1445064533934N00603858EA0160501625
+B1445084533945N00603857EA0160801628
+B1445104533957N00603859EA0161501633
+B1445124533965N00603866EA0161901637
+B1445144533973N00603876EA0162001640
+B1445164533983N00603889EA0162301643
+B1445184533991N00603902EA0163001648
+B1445204533999N00603911EA0163501653
+B1445224534008N00603922EA0163901658
+B1445244534017N00603925EA0164301663
+B1445264534018N00603917EA0164301667
+B1445284534008N00603911EA0164501673
+B1445304533998N00603916EA0165001678
+B1445324533989N00603919EA0165301681
+B1445344533980N00603917EA0165801685
+B1445364533972N00603911EA0166301690
+B1445384533967N00603905EA0166801695
+B1445404533965N00603896EA0167201699
+B1445424533972N00603886EA0167501702
+B1445444533985N00603888EA0167901706
+B1445464533994N00603905EA0168001708
+B1445484533992N00603929EA0167901710
+B1445504533980N00603941EA0168101710
+B1445524533967N00603941EA0168701714
+B1445544533958N00603939EA0169401721
+B1445564533947N00603940EA0170001727
+B1445584533936N00603939EA0170601733
+B1446004533930N00603933EA0171201739
+B1446024533930N00603924EA0171601744
+B1446044533940N00603922EA0171901748
+B1446064533951N00603935EA0172301752
+B1446084533954N00603956EA0172701755
+B1446104533944N00603972EA0173201760
+B1446124533930N00603976EA0173901764
+B1446144533922N00603971EA0174401770
+B1446164533921N00603963EA0174601773
+B1446184533929N00603957EA0174901775
+B1446204533941N00603963EA0175201778
+B1446224533950N00603982EA0175501782
+B1446244533952N00604004EA0176101787
+B1446264533946N00604024EA0176701793
+B1446284533937N00604040EA0177401800
+B1446304533927N00604048EA0178101808
+B1446324533916N00604044EA0178601813
+B1446344533911N00604035EA0179101818
+B1446364533918N00604027EA0179301822
+B1446384533930N00604032EA0179601826
+B1446404533940N00604048EA0180001830
+B1446424533946N00604066EA0180601836
+B1446444533950N00604084EA0181101841
+B1446464533951N00604106EA0181101845
+B1446484533942N00604129EA0181101847
+B1446504533925N00604141EA0181101848
+B1446524533909N00604137EA0181601849
+B1446544533898N00604129EA0182401854
+B1446564533888N00604121EA0183001859
+B1446584533879N00604113EA0183401864
+B1447004533878N00604102EA0183901867
+B1447024533888N00604102EA0184501873
+B1447044533896N00604113EA0185101878
+B1447064533899N00604131EA0185301882
+B1447084533894N00604151EA0185601885
+B1447104533880N00604160EA0186001889
+B1447124533867N00604157EA0186601895
+B1447144533859N00604147EA0187101900
+B1447164533856N00604138EA0187801907
+B1447184533858N00604132EA0188301912
+B1447204533866N00604131EA0188701916
+B1447224533877N00604140EA0189201921
+B1447244533883N00604156EA0189601926
+B1447264533880N00604175EA0190001930
+B1447284533871N00604192EA0190601935
+B1447304533857N00604198EA0191101940
+B1447324533844N00604195EA0191601945
+B1447344533834N00604186EA0192201950
+B1447364533834N00604173EA0192701955
+B1447384533840N00604170EA0193301961
+B1447404533850N00604176EA0193601965
+B1447424533858N00604188EA0194001970
+B1447444533861N00604205EA0194401975
+B1447464533859N00604224EA0194601978
+B1447484533853N00604246EA0195001983
+B1447504533838N00604258EA0195601987
+B1447524533823N00604255EA0196001991
+B1447544533814N00604244EA0196501996
+B1447564533811N00604232EA0196901999
+B1447584533814N00604222EA0197502004
+B1448004533822N00604223EA0197802008
+B1448024533831N00604233EA0198102012
+B1448044533836N00604249EA0198402016
+B1448064533834N00604269EA0198602018
+B1448084533820N00604284EA0198702020
+B1448104533803N00604286EA0199202023
+B1448124533791N00604282EA0199702028
+B1448144533781N00604276EA0200202033
+B1448164533770N00604272EA0200902039
+B1448184533761N00604269EA0201402044
+B1448204533752N00604261EA0201802049
+B1448224533749N00604249EA0201902052
+B1448244533757N00604245EA0201902053
+B1448264533766N00604255EA0202102055
+B1448284533769N00604272EA0202202056
+B1448304533765N00604293EA0202502059
+B1448324533755N00604308EA0203002062
+B1448344533744N00604321EA0203602067
+B1448364533738N00604337EA0203902070
+B1448384533736N00604353EA0204202073
+B1448404533740N00604366EA0204502076
+B1448424533747N00604370EA0204702078
+B1448444533753N00604360EA0204602079
+B1448464533751N00604344EA0204802081
+B1448484533743N00604333EA0205402085
+B1448504533733N00604325EA0205802089
+B1448524533724N00604318EA0206202093
+B1448544533714N00604314EA0206302095
+B1448564533699N00604321EA0206502097
+B1448584533690N00604338EA0206702099
+B1449004533693N00604353EA0206902101
+B1449024533701N00604356EA0207202104
+B1449044533704N00604343EA0207402107
+B1449064533701N00604330EA0207702110
+B1449084533692N00604320EA0207802111
+B1449104533679N00604314EA0207802112
+B1449124533664N00604319EA0208002114
+B1449144533653N00604330EA0208202115
+B1449164533644N00604341EA0208402118
+B1449184533640N00604354EA0208602119
+B1449204533639N00604368EA0208702121
+B1449224533644N00604377EA0208802121
+B1449244533653N00604372EA0208902122
+B1449264533657N00604357EA0209102123
+B1449284533652N00604341EA0209202124
+B1449304533640N00604330EA0209102124
+B1449324533623N00604330EA0209102124
+B1449344533608N00604338EA0209102124
+B1449364533596N00604348EA0209402126
+B1449384533585N00604358EA0209602128
+B1449404533578N00604369EA0209502129
+B1449424533575N00604384EA0209302128
+B1449444533577N00604397EA0209002126
+B1449464533582N00604405EA0208702123
+B1449484533589N00604408EA0208702122
+B1449504533596N00604408EA0208702122
+B1449524533602N00604409EA0208602120
+B1449544533608N00604415EA0208302117
+B1449564533613N00604423EA0208002113
+B1449584533619N00604436EA0207702110
+B1450004533623N00604450EA0207402107
+B1450024533625N00604464EA0206902103
+B1450044533626N00604480EA0206402098
+B1450064533627N00604499EA0206002094
+B1450084533627N00604515EA0205702091
+B1450104533627N00604528EA0205402087
+B1450124533629N00604543EA0204902082
+B1450144533631N00604558EA0204702079
+B1450164533631N00604572EA0204602078
+B1450184533631N00604586EA0204302074
+B1450204533632N00604601EA0204202072
+B1450224533633N00604615EA0204102071
+B1450244533633N00604629EA0204102071
+B1450264533634N00604641EA0204002069
+B1450284533635N00604656EA0203802068
+B1450304533636N00604670EA0204002068
+B1450324533635N00604684EA0204002068
+B1450344533634N00604698EA0203902067
+B1450364533635N00604712EA0203802067
+B1450384533635N00604727EA0203702066
+B1450404533634N00604741EA0203702066
+B1450424533632N00604756EA0203702065
+B1450444533630N00604771EA0203502065
+B1450464533628N00604785EA0203402063
+B1450484533627N00604799EA0203202062
+B1450504533626N00604814EA0203002060
+B1450524533626N00604829EA0202802058
+B1450544533627N00604843EA0202702057
+B1450564533627N00604857EA0202602055
+B1450584533627N00604871EA0202302053
+B1451004533627N00604885EA0202002050
+B1451024533628N00604900EA0201802048
+B1451044533630N00604915EA0201602046
+B1451064533631N00604931EA0201502045
+B1451084533633N00604946EA0201302043
+B1451104533634N00604961EA0201102041
+B1451124533635N00604976EA0200902038
+B1451144533636N00604992EA0200602036
+B1451164533638N00605006EA0200302033
+B1451184533640N00605021EA0200002030
+B1451204533643N00605037EA0199702026
+B1451224533646N00605052EA0199502024
+B1451244533649N00605067EA0199302022
+B1451264533652N00605081EA0198902019
+B1451284533656N00605096EA0198702016
+B1451304533660N00605111EA0198702015
+B1451324533662N00605124EA0198502014
+B1451344533665N00605139EA0198302012
+B1451364533667N00605154EA0198202011
+B1451384533669N00605167EA0198102010
+B1451404533673N00605180EA0197902008
+B1451424533676N00605194EA0197802006
+B1451444533679N00605208EA0198002007
+B1451464533680N00605220EA0197902006
+B1451484533681N00605232EA0197502004
+B1451504533683N00605247EA0197302001
+B1451524533687N00605261EA0197202001
+B1451544533690N00605274EA0197102000
+B1451564533695N00605286EA0197001998
+B1451584533700N00605298EA0196801997
+B1452004533704N00605310EA0196701997
+B1452024533710N00605321EA0196601996
+B1452044533716N00605331EA0196601995
+B1452064533722N00605339EA0196501995
+B1452084533729N00605346EA0196301993
+B1452104533736N00605353EA0196101991
+B1452124533743N00605362EA0195901989
+B1452144533749N00605371EA0195801987
+B1452164533755N00605382EA0195501985
+B1452184533761N00605392EA0195301982
+B1452204533768N00605402EA0195201980
+B1452224533775N00605410EA0194901978
+B1452244533783N00605418EA0194501975
+B1452264533791N00605426EA0194201972
+B1452284533799N00605432EA0194001969
+B1452304533806N00605439EA0193601966
+B1452324533813N00605447EA0193401963
+B1452344533820N00605455EA0193101960
+B1452364533827N00605462EA0192801957
+B1452384533835N00605470EA0192601955
+B1452404533842N00605477EA0192601954
+B1452424533849N00605483EA0192501953
+B1452444533857N00605489EA0192301951
+B1452464533865N00605495EA0192301950
+B1452484533872N00605502EA0192201949
+B1452504533879N00605510EA0192201950
+B1452524533885N00605518EA0192201950
+B1452544533893N00605527EA0192201950
+B1452564533900N00605536EA0192101950
+B1452584533906N00605547EA0192101949
+B1453004533911N00605559EA0192201949
+B1453024533917N00605571EA0192301951
+B1453044533921N00605581EA0192401952
+B1453064533926N00605592EA0192401952
+B1453084533932N00605603EA0192301951
+B1453104533939N00605613EA0192201951
+B1453124533943N00605624EA0192001949
+B1453144533948N00605635EA0191701946
+B1453164533954N00605647EA0191401943
+B1453184533959N00605659EA0191201941
+B1453204533963N00605669EA0191001939
+B1453224533967N00605682EA0190501935
+B1453244533974N00605693EA0190101931
+B1453264533980N00605704EA0189701927
+B1453284533985N00605717EA0189501924
+B1453304533991N00605728EA0189201921
+B1453324533997N00605738EA0188801917
+B1453344534004N00605748EA0188501914
+B1453364534011N00605757EA0188301911
+B1453384534020N00605765EA0188101909
+B1453404534027N00605773EA0187901906
+B1453424534035N00605781EA0187401903
+B1453444534044N00605789EA0187101899
+B1453464534054N00605797EA0186901897
+B1453484534063N00605804EA0186601894
+B1453504534072N00605809EA0186201891
+B1453524534082N00605816EA0185901887
+B1453544534092N00605823EA0185701884
+B1453564534102N00605830EA0185501882
+B1453584534111N00605836EA0185301880
+B1454004534121N00605843EA0185201878
+B1454024534131N00605849EA0184901876
+B1454044534142N00605855EA0185001875
+B1454064534151N00605860EA0185301877
+B1454084534159N00605865EA0185201876
+B1454104534167N00605867EA0184801875
+B1454124534178N00605873EA0184301871
+B1454144534190N00605879EA0184101869
+B1454164534199N00605884EA0183801866
+B1454184534209N00605890EA0183401862
+B1454204534219N00605897EA0182901857
+B1454224534229N00605903EA0182601854
+B1454244534239N00605909EA0182201850
+B1454264534248N00605915EA0181801845
+B1454284534258N00605921EA0181301841
+B1454304534268N00605928EA0181101839
+B1454324534278N00605935EA0180701835
+B1454344534288N00605944EA0180201830
+B1454364534300N00605954EA0180001826
+B1454384534310N00605962EA0179901824
+B1454404534320N00605969EA0179401819
+B1454424534331N00605978EA0179001815
+B1454444534344N00605987EA0179101813
+B1454464534354N00605994EA0179201813
+B1454484534364N00605999EA0178801810
+B1454504534375N00606005EA0178401806
+B1454524534386N00606013EA0178301804
+B1454544534397N00606021EA0178101803
+B1454564534408N00606028EA0177801801
+B1454584534418N00606036EA0177601799
+B1455004534428N00606043EA0177301797
+B1455024534440N00606048EA0177101794
+B1455044534452N00606055EA0177101792
+B1455064534463N00606064EA0177201792
+B1455084534473N00606071EA0177201793
+B1455104534483N00606078EA0177201793
+B1455124534494N00606084EA0177301794
+B1455144534505N00606089EA0177501794
+B1455164534517N00606091EA0177301794
+B1455184534529N00606096EA0177401795
+B1455204534540N00606103EA0177501795
+B1455224534552N00606110EA0177401795
+B1455244534565N00606119EA0177401796
+B1455264534577N00606128EA0177601797
+B1455284534589N00606134EA0177801799
+B1455304534601N00606140EA0178101802
+B1455324534613N00606147EA0178201804
+B1455344534625N00606155EA0178401805
+B1455364534636N00606162EA0178801809
+B1455384534646N00606169EA0179001811
+B1455404534657N00606178EA0179301815
+B1455424534669N00606188EA0180101819
+B1455444534678N00606196EA0181101826
+B1455464534685N00606202EA0181801833
+B1455484534694N00606205EA0182301839
+B1455504534703N00606195EA0182901847
+B1455524534707N00606183EA0183501854
+B1455544534705N00606170EA0183901859
+B1455564534698N00606158EA0184101863
+B1455584534685N00606154EA0184301867
+B1456004534672N00606161EA0184801872
+B1456024534663N00606174EA0185801878
+B1456044534659N00606189EA0186601887
+B1456064534659N00606203EA0187401896
+B1456084534661N00606218EA0188101903
+B1456104534666N00606232EA0188801911
+B1456124534678N00606236EA0189601920
+B1456144534686N00606227EA0189901926
+B1456164534684N00606209EA0190101932
+B1456184534670N00606203EA0190501937
+B1456204534656N00606215EA0191301944
+B1456224534644N00606227EA0192501955
+B1456244534635N00606236EA0193401965
+B1456264534631N00606249EA0193801973
+B1456284534633N00606267EA0194201979
+B1456304534643N00606278EA0195001985
+B1456324534653N00606276EA0195901993
+B1456344534659N00606265EA0196501999
+B1456364534655N00606251EA0197102005
+B1456384534643N00606248EA0197802011
+B1456404534632N00606255EA0198702018
+B1456424534624N00606269EA0199302024
+B1456444534620N00606285EA0200002030
+B1456464534625N00606301EA0200602036
+B1456484534638N00606306EA0201302042
+B1456504534646N00606296EA0202102048
+B1456524534645N00606280EA0202802055
+B1456544534636N00606272EA0203502062
+B1456564534624N00606271EA0204102069
+B1456584534613N00606279EA0204902076
+B1457004534606N00606294EA0205702084
+B1457024534609N00606309EA0206602092
+B1457044534619N00606317EA0207502102
+B1457064534627N00606310EA0208102110
+B1457084534627N00606293EA0208802117
+B1457104534617N00606284EA0209402125
+B1457124534603N00606286EA0210202133
+B1457144534593N00606297EA0211102141
+B1457164534587N00606313EA0211802149
+B1457184534586N00606329EA0212602156
+B1457204534594N00606341EA0213202163
+B1457224534604N00606341EA0214002171
+B1457244534612N00606332EA0215002179
+B1457264534611N00606317EA0216002188
+B1457284534600N00606309EA0216802198
+B1457304534587N00606318EA0217602206
+B1457324534581N00606335EA0218302215
+B1457344534583N00606354EA0219302226
+B1457364534590N00606366EA0220402237
+B1457384534600N00606368EA0221302247
+B1457404534608N00606362EA0222202257
+B1457424534609N00606349EA0222802265
+B1457444534600N00606337EA0223502274
+B1457464534589N00606335EA0224302282
+B1457484534576N00606347EA0225002290
+B1457504534570N00606365EA0226202300
+B1457524534573N00606381EA0227202309
+B1457544534583N00606389EA0228102318
+B1457564534592N00606384EA0228902327
+B1457584534592N00606370EA0229602334
+B1458004534584N00606359EA0230302342
+B1458024534571N00606360EA0231102349
+B1458044534558N00606370EA0232102359
+B1458064534551N00606386EA0233102369
+B1458084534551N00606403EA0234002378
+B1458104534560N00606415EA0234902387
+B1458124534570N00606416EA0235702395
+B1458144534576N00606406EA0236402403
+B1458164534575N00606391EA0237102410
+B1458184534566N00606381EA0237802417
+B1458204534556N00606376EA0238602425
+B1458224534543N00606378EA0239302432
+B1458244534532N00606395EA0239902439
+B1458264534532N00606414EA0240702446
+B1458284534541N00606421EA0241602453
+B1458304534549N00606414EA0242302460
+B1458324534549N00606401EA0242802466
+B1458344534540N00606388EA0243502474
+B1458364534526N00606387EA0244302483
+B1458384534511N00606393EA0245302492
+B1458404534501N00606408EA0246202502
+B1458424534497N00606424EA0247102510
+B1458444534503N00606438EA0247902519
+B1458464534511N00606443EA0248902528
+B1458484534519N00606436EA0249602537
+B1458504534522N00606423EA0250402545
+B1458524534516N00606410EA0251202553
+B1458544534502N00606406EA0252002561
+B1458564534488N00606413EA0252802569
+B1458584534480N00606426EA0253702578
+B1459004534478N00606440EA0254402586
+B1459024534480N00606453EA0255402595
+B1459044534488N00606458EA0256102603
+B1459064534497N00606456EA0256902612
+B1459084534504N00606451EA0257802620
+B1459104534508N00606441EA0258402628
+B1459124534508N00606426EA0258902634
+B1459144534499N00606410EA0259502639
+B1459164534484N00606408EA0260102645
+B1459184534471N00606417EA0260702650
+B1459204534463N00606431EA0261302655
+B1459224534459N00606447EA0262102662
+B1459244534458N00606462EA0262802669
+B1459264534457N00606479EA0263602676
+B1459284534453N00606495EA0264502684
+B1459304534446N00606509EA0265202691
+B1459324534440N00606526EA0265702697
+B1459344534431N00606543EA0266302703
+B1459364534423N00606560EA0266802709
+B1459384534415N00606575EA0267302714
+B1459404534407N00606589EA0267502718
+B1459424534400N00606603EA0267402720
+B1459444534390N00606619EA0267502720
+B1459464534381N00606636EA0267802722
+B1459484534372N00606650EA0267802722
+B1459504534361N00606664EA0267502721
+B1459524534349N00606678EA0267502720
+B1459544534337N00606694EA0267702721
+B1459564534326N00606708EA0267802722
+B1459584534313N00606721EA0267802722
+B1500004534302N00606735EA0267802722
+B1500024534292N00606747EA0267402720
+B1500044534281N00606762EA0267002717
+B1500064534271N00606781EA0266902716
+B1500084534264N00606797EA0266702715
+B1500104534259N00606813EA0266202711
+B1500124534257N00606832EA0265602706
+B1500144534260N00606850EA0265102701
+B1500164534263N00606864EA0264802697
+B1500184534266N00606877EA0264302691
+B1500204534271N00606891EA0263802684
+B1500224534276N00606903EA0263202678
+B1500244534282N00606915EA0262602671
+B1500264534289N00606930EA0262102664
+B1500284534295N00606945EA0261802659
+B1500304534301N00606960EA0261502656
+B1500324534307N00606974EA0261202652
+B1500344534315N00606989EA0261102649
+B1500364534324N00607001EA0261102648
+B1500384534331N00607008EA0260702645
+B1500404534335N00607016EA0259502641
+B1500424534341N00607028EA0258402635
+B1500444534353N00607046EA0258002628
+B1500464534362N00607062EA0258202625
+B1500484534369N00607072EA0258202624
+B1500504534377N00607081EA0257902620
+B1500524534386N00607092EA0257702618
+B1500544534395N00607103EA0257602616
+B1500564534404N00607114EA0257402613
+B1500584534414N00607123EA0257202611
+B1501004534425N00607130EA0256902609
+B1501024534436N00607133EA0256702606
+B1501044534448N00607135EA0256302602
+B1501064534461N00607136EA0256002598
+B1501084534474N00607140EA0255602595
+B1501104534488N00607144EA0255302591
+B1501124534501N00607148EA0255002588
+B1501144534514N00607152EA0254702585
+B1501164534528N00607155EA0254502582
+B1501184534541N00607158EA0254302580
+B1501204534555N00607160EA0254102578
+B1501224534568N00607162EA0254002577
+B1501244534582N00607163EA0253802575
+B1501264534596N00607165EA0253702574
+B1501284534610N00607166EA0253602573
+B1501304534623N00607167EA0253502572
+B1501324534637N00607168EA0253402571
+B1501344534651N00607168EA0253302569
+B1501364534665N00607168EA0253102568
+B1501384534678N00607167EA0253002566
+B1501404534691N00607165EA0252802565
+B1501424534704N00607161EA0252702563
+B1501444534718N00607158EA0252402561
+B1501464534731N00607153EA0252202559
+B1501484534744N00607148EA0252102557
+B1501504534757N00607143EA0251902555
+B1501524534771N00607139EA0251702554
+B1501544534784N00607135EA0251602552
+B1501564534798N00607132EA0251402550
+B1501584534811N00607129EA0251202548
+B1502004534824N00607127EA0250902546
+B1502024534838N00607124EA0250702544
+B1502044534852N00607122EA0250602542
+B1502064534865N00607121EA0250602542
+B1502084534878N00607122EA0250502541
+B1502104534891N00607121EA0250202539
+B1502124534905N00607120EA0249902536
+B1502144534920N00607121EA0249702534
+B1502164534933N00607122EA0249502532
+B1502184534947N00607125EA0249202530
+B1502204534962N00607132EA0249102528
+B1502224534975N00607141EA0249102527
+B1502244534988N00607150EA0249102527
+B1502264535000N00607158EA0248902526
+B1502284535012N00607166EA0248602524
+B1502304535024N00607174EA0248302520
+B1502324535036N00607186EA0247902516
+B1502344535047N00607198EA0247602513
+B1502364535057N00607211EA0247202509
+B1502384535067N00607224EA0246802505
+B1502404535076N00607237EA0246402501
+B1502424535085N00607250EA0245902496
+B1502444535094N00607264EA0245202489
+B1502464535105N00607278EA0245002485
+B1502484535114N00607293EA0244802481
+B1502504535122N00607307EA0244502477
+B1502524535130N00607322EA0244202473
+B1502544535140N00607337EA0243902471
+B1502564535147N00607351EA0243702468
+B1502584535154N00607365EA0243302464
+B1503004535162N00607379EA0242902460
+B1503024535170N00607394EA0242602458
+B1503044535176N00607411EA0242302455
+B1503064535183N00607426EA0242102453
+B1503084535190N00607441EA0241802450
+B1503104535197N00607455EA0241502447
+B1503124535204N00607469EA0241302446
+B1503144535210N00607484EA0241102443
+B1503164535216N00607499EA0240802440
+B1503184535222N00607514EA0240502438
+B1503204535228N00607530EA0240302436
+B1503224535232N00607547EA0240102433
+B1503244535238N00607564EA0239902432
+B1503264535245N00607580EA0239702430
+B1503284535251N00607595EA0239602429
+B1503304535258N00607610EA0239402427
+B1503324535266N00607624EA0239202425
+B1503344535273N00607640EA0238902422
+B1503364535281N00607656EA0238702420
+B1503384535288N00607673EA0238702419
+B1503404535295N00607688EA0238802419
+B1503424535302N00607702EA0238702418
+B1503444535309N00607718EA0238402416
+B1503464535317N00607735EA0238302416
+B1503484535325N00607750EA0238302415
+B1503504535333N00607765EA0238102414
+B1503524535341N00607780EA0237902412
+B1503544535350N00607796EA0237702410
+B1503564535358N00607810EA0237602409
+B1503584535365N00607822EA0237402407
+B1504004535373N00607836EA0237002404
+B1504024535381N00607850EA0236802402
+B1504044535388N00607863EA0236602399
+B1504064535395N00607875EA0236202396
+B1504084535403N00607888EA0235902393
+B1504104535411N00607900EA0235702391
+B1504124535419N00607912EA0235402388
+B1504144535427N00607926EA0235102385
+B1504164535435N00607940EA0234902383
+B1504184535444N00607953EA0234602380
+B1504204535452N00607967EA0234302377
+B1504224535460N00607982EA0233902373
+B1504244535467N00607996EA0233702371
+B1504264535473N00608010EA0233402368
+B1504284535480N00608026EA0232902364
+B1504304535486N00608043EA0232802361
+B1504324535492N00608059EA0232502359
+B1504344535498N00608075EA0232202355
+B1504364535505N00608092EA0231902353
+B1504384535512N00608107EA0231802351
+B1504404535518N00608121EA0231602349
+B1504424535525N00608136EA0231302346
+B1504444535533N00608150EA0231002344
+B1504464535540N00608165EA0230702340
+B1504484535547N00608183EA0230402337
+B1504504535553N00608200EA0230302336
+B1504524535559N00608215EA0230002333
+B1504544535565N00608232EA0229702330
+B1504564535573N00608249EA0229302327
+B1504584535580N00608265EA0229302325
+B1505004535587N00608281EA0229102324
+B1505024535593N00608296EA0229002322
+B1505044535600N00608312EA0228702320
+B1505064535606N00608327EA0228602318
+B1505084535613N00608341EA0228302316
+B1505104535620N00608356EA0228002313
+B1505124535627N00608371EA0227702310
+B1505144535634N00608386EA0227502308
+B1505164535639N00608402EA0227302305
+B1505184535644N00608417EA0226902302
+B1505204535651N00608433EA0226602299
+B1505224535658N00608448EA0226502298
+B1505244535663N00608462EA0226102294
+B1505264535671N00608476EA0225702290
+B1505284535679N00608492EA0225402288
+B1505304535685N00608508EA0225402286
+B1505324535690N00608523EA0225302285
+B1505344535694N00608539EA0225002282
+B1505364535701N00608554EA0224702279
+B1505384535708N00608567EA0224602278
+B1505404535713N00608582EA0224502277
+B1505424535718N00608596EA0224202274
+B1505444535725N00608611EA0224002272
+B1505464535731N00608625EA0223902271
+B1505484535736N00608638EA0223602269
+B1505504535743N00608652EA0223202265
+B1505524535750N00608667EA0223002263
+B1505544535757N00608679EA0222802262
+B1505564535763N00608692EA0222502258
+B1505584535771N00608705EA0222202256
+B1506004535777N00608719EA0221902253
+B1506024535782N00608733EA0221602250
+B1506044535787N00608748EA0221302247
+B1506064535792N00608763EA0221002244
+B1506084535798N00608776EA0220702240
+B1506104535802N00608790EA0220302236
+B1506124535807N00608805EA0220002233
+B1506144535811N00608820EA0219802230
+B1506164535812N00608835EA0219502227
+B1506184535814N00608851EA0219202223
+B1506204535818N00608866EA0219002221
+B1506224535822N00608883EA0219102220
+B1506244535824N00608899EA0219202221
+B1506264535826N00608910EA0219102221
+B1506284535828N00608919EA0218702220
+B1506304535830N00608933EA0218602219
+B1506324535831N00608946EA0218902220
+B1506344535831N00608957EA0218902219
+B1506364535834N00608968EA0218502217
+B1506384535838N00608981EA0218502216
+B1506404535842N00608995EA0218802216
+B1506424535845N00609008EA0219202218
+B1506444535849N00609019EA0219402222
+B1506464535852N00609031EA0219602224
+B1506484535858N00609041EA0219802226
+B1506504535864N00609052EA0220102229
+B1506524535870N00609063EA0220402232
+B1506544535876N00609075EA0220702235
+B1506564535882N00609086EA0221002239
+B1506584535889N00609095EA0221302242
+B1507004535896N00609104EA0221402244
+B1507024535904N00609113EA0221602246
+B1507044535910N00609123EA0222002250
+B1507064535917N00609132EA0222202252
+B1507084535924N00609141EA0222402255
+B1507104535932N00609148EA0222902259
+B1507124535938N00609156EA0223402264
+B1507144535944N00609163EA0224202271
+B1507164535949N00609172EA0225102279
+B1507184535956N00609181EA0226002288
+B1507204535962N00609188EA0226702296
+B1507224535969N00609193EA0227402304
+B1507244535976N00609202EA0228202312
+B1507264535981N00609210EA0229302322
+B1507284535987N00609212EA0230102331
+B1507304535993N00609214EA0230402339
+B1507324536000N00609222EA0230902345
+B1507344536007N00609231EA0231802353
+B1507364536013N00609237EA0232602362
+B1507384536019N00609243EA0233002368
+B1507404536024N00609251EA0233002372
+B1507424536031N00609259EA0233002374
+B1507444536038N00609268EA0233102374
+B1507464536046N00609278EA0233002373
+B1507484536054N00609286EA0233102373
+B1507504536063N00609294EA0233202374
+B1507524536070N00609304EA0233202373
+B1507544536077N00609314EA0233202373
+B1507564536084N00609325EA0233102372
+B1507584536091N00609337EA0233102371
+B1508004536098N00609348EA0233002370
+B1508024536105N00609359EA0232802368
+B1508044536113N00609369EA0232602366
+B1508064536122N00609380EA0232502365
+B1508084536130N00609391EA0232502365
+B1508104536137N00609402EA0232502364
+B1508124536144N00609414EA0232302362
+B1508144536151N00609426EA0232102361
+B1508164536156N00609439EA0231902359
+B1508184536161N00609452EA0231602355
+B1508204536168N00609466EA0231302353
+B1508224536174N00609480EA0231302351
+B1508244536180N00609494EA0231302350
+B1508264536186N00609507EA0231102348
+B1508284536192N00609520EA0231002347
+B1508304536197N00609535EA0230902346
+B1508324536202N00609549EA0230802344
+B1508344536207N00609565EA0230702343
+B1508364536211N00609581EA0230802343
+B1508384536214N00609596EA0230802342
+B1508404536216N00609612EA0230602341
+B1508424536219N00609628EA0230502340
+B1508444536221N00609644EA0230502339
+B1508464536223N00609660EA0230402338
+B1508484536226N00609674EA0230302337
+B1508504536229N00609689EA0230202337
+B1508524536229N00609706EA0230102336
+B1508544536226N00609723EA0230002335
+B1508564536221N00609738EA0229902334
+B1508584536216N00609754EA0229802333
+B1509004536209N00609769EA0229602332
+B1509024536202N00609785EA0229602331
+B1509044536194N00609801EA0229502331
+B1509064536187N00609817EA0229502330
+B1509084536180N00609833EA0229402330
+B1509104536173N00609849EA0229302329
+B1509124536166N00609865EA0229302329
+B1509144536159N00609882EA0229302329
+B1509164536152N00609897EA0229202329
+B1509184536146N00609913EA0229102328
+B1509204536140N00609929EA0228902326
+B1509224536133N00609946EA0229002326
+B1509244536126N00609963EA0229002326
+B1509264536118N00609978EA0229002326
+B1509284536111N00609995EA0228902325
+B1509304536103N00610011EA0228902325
+B1509324536096N00610027EA0229002326
+B1509344536087N00610043EA0229002327
+B1509364536080N00610058EA0229102327
+B1509384536073N00610073EA0229102327
+B1509404536067N00610090EA0229102327
+B1509424536059N00610106EA0229102328
+B1509444536052N00610123EA0229302329
+B1509464536045N00610138EA0229502331
+B1509484536038N00610153EA0229602332
+B1509504536031N00610169EA0229802334
+B1509524536024N00610183EA0229802335
+B1509544536016N00610197EA0229802335
+B1509564536008N00610212EA0229802335
+B1509584535999N00610226EA0229802335
+B1510004535990N00610241EA0229702334
+B1510024535981N00610258EA0229602333
+B1510044535971N00610274EA0229702333
+B1510064535962N00610290EA0229802335
+B1510084535953N00610305EA0229902336
+B1510104535945N00610320EA0230102337
+B1510124535936N00610335EA0230302339
+B1510144535926N00610348EA0230502341
+B1510164535917N00610360EA0230602343
+B1510184535907N00610371EA0230802345
+B1510204535897N00610382EA0231002346
+B1510224535887N00610393EA0231402349
+B1510244535876N00610402EA0231802353
+B1510264535866N00610410EA0232302358
+B1510284535855N00610419EA0233002364
+B1510304535844N00610425EA0233802371
+B1510324535835N00610432EA0234502378
+B1510344535830N00610447EA0234902384
+B1510364535832N00610465EA0235602390
+B1510384535843N00610470EA0236302397
+B1510404535850N00610458EA0237002404
+B1510424535847N00610444EA0237802411
+B1510444535835N00610435EA0238302418
+B1510464535820N00610439EA0238902426
+B1510484535809N00610453EA0239802434
+B1510504535808N00610469EA0240402442
+B1510524535813N00610484EA0241102448
+B1510544535821N00610495EA0241802456
+B1510564535830N00610493EA0242402462
+B1510584535835N00610482EA0243102469
+B1511004535831N00610468EA0243902477
+B1511024535818N00610463EA0244502484
+B1511044535805N00610471EA0245402493
+B1511064535798N00610488EA0246002501
+B1511084535799N00610506EA0246502507
+B1511104535804N00610521EA0247002512
+B1511124535813N00610529EA0247602517
+B1511144535824N00610527EA0248302523
+B1511164535829N00610518EA0249002530
+B1511184535828N00610505EA0249802538
+B1511204535820N00610492EA0250602546
+B1511224535806N00610490EA0251202552
+B1511244535792N00610497EA0252302561
+B1511264535785N00610513EA0253102570
+B1511284535783N00610530EA0253402577
+B1511304535785N00610549EA0253802582
+B1511324535793N00610565EA0254102585
+B1511344535805N00610570EA0254602589
+B1511364535814N00610568EA0255202595
+B1511384535819N00610559EA0256102601
+B1511404535818N00610548EA0256902608
+B1511424535813N00610538EA0257602615
+B1511444535802N00610531EA0258202622
+B1511464535786N00610534EA0258902628
+B1511484535776N00610551EA0259702635
+B1511504535775N00610573EA0260302642
+B1511524535783N00610589EA0260602648
+B1511544535793N00610599EA0261002651
+B1511564535805N00610598EA0261702657
+B1511584535809N00610589EA0262302663
+B1512004535803N00610576EA0262602667
+B1512024535787N00610573EA0263102672
+B1512044535772N00610588EA0263902679
+B1512064535763N00610607EA0264802687
+B1512084535758N00610622EA0265202693
+B1512104535755N00610638EA0265002697
+B1512124535751N00610659EA0264902699
+B1512144535746N00610681EA0265102698
+B1512164535742N00610703EA0265202700
+B1512184535739N00610723EA0265402701
+B1512204535735N00610740EA0265602702
+B1512224535730N00610757EA0265602702
+B1512244535724N00610776EA0265802703
+B1512264535717N00610794EA0265702702
+B1512284535710N00610812EA0265402700
+B1512304535703N00610831EA0265102698
+B1512324535699N00610853EA0264602693
+B1512344535697N00610875EA0264202688
+B1512364535693N00610895EA0263502682
+B1512384535688N00610914EA0262902675
+B1512404535688N00610934EA0262302668
+B1512424535693N00610954EA0261902662
+B1512444535698N00610973EA0261502657
+B1512464535702N00610991EA0260702650
+B1512484535706N00611008EA0259802642
+B1512504535713N00611028EA0259002634
+B1512524535717N00611048EA0258402627
+B1512544535722N00611065EA0257702619
+B1512564535728N00611079EA0256902611
+B1512584535736N00611095EA0256002602
+B1513004535744N00611111EA0255302594
+B1513024535752N00611128EA0254702587
+B1513044535760N00611144EA0254102580
+B1513064535768N00611161EA0253702575
+B1513084535774N00611177EA0253202569
+B1513104535779N00611193EA0252302562
+B1513124535788N00611210EA0251502555
+B1513144535797N00611228EA0251202549
+B1513164535806N00611244EA0251302544
+B1513184535812N00611258EA0251202541
+B1513204535818N00611273EA0250902537
+B1513224535826N00611289EA0250602535
+B1513244535833N00611305EA0250402533
+B1513264535841N00611320EA0250202531
+B1513284535848N00611334EA0250002530
+B1513304535855N00611348EA0249802528
+B1513324535862N00611362EA0249302524
+B1513344535871N00611378EA0249002521
+B1513364535879N00611395EA0248802519
+B1513384535888N00611411EA0248402515
+B1513404535897N00611427EA0248102512
+B1513424535906N00611444EA0248102511
+B1513444535914N00611459EA0248002510
+B1513464535921N00611473EA0247702507
+B1513484535930N00611488EA0247302503
+B1513504535940N00611504EA0247102501
+B1513524535948N00611520EA0247302500
+B1513544535955N00611533EA0247502501
+B1513564535960N00611546EA0247502501
+B1513584535965N00611558EA0247402501
+B1514004535971N00611571EA0247302500
+B1514024535976N00611584EA0247202500
+B1514044535982N00611595EA0247102499
+B1514064535988N00611608EA0247002499
+B1514084535994N00611622EA0246902498
+B1514104536000N00611635EA0246802497
+B1514124536007N00611649EA0246602496
+B1514144536013N00611663EA0246502495
+B1514164536019N00611677EA0246402494
+B1514184536025N00611691EA0246102491
+B1514204536032N00611705EA0245702488
+B1514224536039N00611721EA0245302484
+B1514244536045N00611736EA0244802480
+B1514264536053N00611751EA0244502477
+B1514284536060N00611764EA0244302474
+B1514304536067N00611777EA0243902471
+B1514324536075N00611789EA0243502467
+B1514344536083N00611803EA0243202463
+B1514364536091N00611816EA0243002461
+B1514384536098N00611827EA0242702459
+B1514404536105N00611840EA0242302456
+B1514424536112N00611855EA0242002453
+B1514444536119N00611868EA0241702451
+B1514464536126N00611879EA0241502448
+B1514484536134N00611889EA0241102445
+B1514504536142N00611898EA0240802442
+B1514524536148N00611907EA0240302438
+B1514544536154N00611919EA0239802433
+B1514564536161N00611933EA0239602429
+B1514584536168N00611943EA0239402427
+B1515004536174N00611952EA0238902423
+B1515024536182N00611964EA0238602419
+B1515044536189N00611975EA0238502417
+B1515064536195N00611986EA0238302415
+B1515084536201N00611998EA0237902411
+B1515104536207N00612011EA0237502408
+B1515124536214N00612021EA0237202405
+B1515144536221N00612028EA0236702401
+B1515164536228N00612038EA0236302397
+B1515184536234N00612048EA0236102395
+B1515204536240N00612057EA0235702391
+B1515224536246N00612068EA0235202387
+B1515244536253N00612078EA0234902384
+B1515264536259N00612087EA0234702381
+B1515284536264N00612096EA0234402378
+B1515304536271N00612106EA0234102375
+B1515324536278N00612116EA0233902373
+B1515344536285N00612125EA0233602370
+B1515364536291N00612135EA0233302367
+B1515384536298N00612146EA0233002365
+B1515404536305N00612157EA0232802363
+B1515424536312N00612168EA0232602361
+B1515444536318N00612179EA0232402359
+B1515464536324N00612191EA0232202356
+B1515484536331N00612204EA0232002354
+B1515504536336N00612218EA0231702352
+B1515524536342N00612231EA0231402349
+B1515544536349N00612245EA0231202347
+B1515564536355N00612260EA0231102346
+B1515584536362N00612273EA0231102345
+B1516004536368N00612287EA0231002344
+B1516024536374N00612302EA0230802342
+B1516044536380N00612315EA0230502339
+B1516064536387N00612331EA0230302337
+B1516084536394N00612346EA0230402337
+B1516104536400N00612357EA0230202335
+B1516124536406N00612370EA0229802332
+B1516144536413N00612383EA0229802332
+B1516164536420N00612395EA0229902332
+B1516184536425N00612407EA0229702331
+B1516204536432N00612418EA0229402328
+B1516224536440N00612428EA0229302328
+B1516244536446N00612439EA0229302327
+B1516264536452N00612451EA0229002325
+B1516284536459N00612465EA0228902323
+B1516304536464N00612479EA0228802323
+B1516324536468N00612494EA0228702322
+B1516344536473N00612507EA0228502320
+B1516364536478N00612521EA0228302318
+B1516384536485N00612535EA0228202316
+B1516404536491N00612547EA0228102316
+B1516424536498N00612559EA0228102315
+B1516444536505N00612570EA0227902314
+B1516464536511N00612582EA0227702312
+B1516484536518N00612594EA0227502310
+B1516504536525N00612607EA0227202307
+B1516524536533N00612621EA0227102306
+B1516544536540N00612633EA0226902304
+B1516564536548N00612644EA0226802302
+B1516584536555N00612657EA0226702301
+B1517004536562N00612669EA0226602301
+B1517024536569N00612681EA0226502299
+B1517044536576N00612695EA0226402298
+B1517064536583N00612708EA0226402298
+B1517084536589N00612722EA0226302298
+B1517104536595N00612735EA0226002296
+B1517124536602N00612747EA0225502293
+B1517144536610N00612759EA0225302291
+B1517164536615N00612774EA0225102288
+B1517184536621N00612788EA0224802285
+B1517204536628N00612801EA0224502281
+B1517224536634N00612815EA0224102278
+B1517244536640N00612827EA0223702274
+B1517264536646N00612840EA0223202268
+B1517284536652N00612854EA0222702264
+B1517304536658N00612867EA0222302259
+B1517324536664N00612879EA0221802254
+B1517344536671N00612892EA0221302249
+B1517364536677N00612904EA0220902245
+B1517384536683N00612914EA0220402240
+B1517404536689N00612926EA0219802234
+B1517424536695N00612940EA0219402229
+B1517444536701N00612954EA0219202225
+B1517464536705N00612968EA0218902222
+B1517484536710N00612981EA0218602219
+B1517504536716N00612993EA0218502218
+B1517524536722N00613005EA0218402216
+B1517544536727N00613018EA0218302215
+B1517564536732N00613032EA0218202214
+B1517584536737N00613045EA0218102214
+B1518004536742N00613058EA0218102213
+B1518024536748N00613072EA0218102214
+B1518044536756N00613084EA0218102214
+B1518064536763N00613097EA0218302215
+B1518084536771N00613109EA0218202215
+B1518104536778N00613121EA0218202215
+B1518124536785N00613133EA0218202215
+B1518144536793N00613145EA0218102214
+B1518164536802N00613157EA0218102215
+B1518184536811N00613171EA0218102215
+B1518204536819N00613184EA0218202215
+B1518224536827N00613196EA0218202215
+B1518244536835N00613208EA0217902213
+B1518264536844N00613220EA0217902212
+B1518284536854N00613230EA0217902213
+B1518304536863N00613240EA0217902212
+B1518324536871N00613252EA0217702211
+B1518344536880N00613263EA0217602210
+B1518364536888N00613275EA0217502209
+B1518384536897N00613287EA0217302208
+B1518404536906N00613300EA0217302207
+B1518424536913N00613314EA0217302207
+B1518444536921N00613327EA0217102205
+B1518464536930N00613341EA0217002204
+B1518484536938N00613353EA0217102204
+B1518504536947N00613365EA0217102204
+B1518524536955N00613376EA0217002203
+B1518544536964N00613389EA0216902202
+B1518564536973N00613402EA0216902202
+B1518584536982N00613416EA0216802201
+B1519004536990N00613429EA0216802202
+B1519024536999N00613441EA0216802201
+B1519044537007N00613455EA0216702200
+B1519064537016N00613468EA0216602200
+B1519084537025N00613479EA0216702200
+B1519104537034N00613492EA0216602199
+B1519124537043N00613504EA0216402198
+B1519144537052N00613517EA0216302197
+B1519164537060N00613530EA0216202196
+B1519184537069N00613543EA0216102194
+B1519204537078N00613558EA0215902192
+B1519224537087N00613572EA0215802191
+B1519244537095N00613584EA0215602190
+B1519264537104N00613597EA0215302187
+B1519284537112N00613611EA0215002184
+B1519304537120N00613623EA0214802182
+B1519324537128N00613636EA0214502178
+B1519344537137N00613649EA0214102175
+B1519364537145N00613664EA0213902173
+B1519384537153N00613677EA0213702171
+B1519404537162N00613690EA0213502167
+B1519434537174N00613709EA0213202165
+B1519454537183N00613722EA0212802162
+B1519474537191N00613736EA0212502159
+B1519494537200N00613749EA0212402157
+B1519514537207N00613761EA0212202154
+B1519534537215N00613772EA0211802151
+B1519554537224N00613783EA0211302147
+B1519574537234N00613794EA0211202144
+B1519594537242N00613804EA0211102142
+B1520014537249N00613816EA0210502138
+B1520034537258N00613829EA0210102135
+B1520054537267N00613840EA0209902133
+B1520074537276N00613850EA0209602129
+B1520094537287N00613860EA0209302125
+B1520114537297N00613870EA0209102123
+B1520134537306N00613878EA0208902120
+B1520154537315N00613887EA0208502117
+B1520174537326N00613898EA0208002113
+B1520194537337N00613909EA0207802111
+B1520214537347N00613919EA0207702110
+B1520234537357N00613927EA0207502108
+B1520254537366N00613936EA0207302105
+B1520274537377N00613947EA0207102103
+B1520294537387N00613956EA0206902101
+B1520314537397N00613964EA0206602098
+B1520334537408N00613971EA0206202095
+B1520354537419N00613979EA0206002093
+B1520374537431N00613987EA0206002092
+B1520394537441N00613997EA0205802091
+B1520414537453N00614005EA0205802090
+B1520434537464N00614014EA0205702090
+B1520454537476N00614022EA0205602088
+B1520474537488N00614030EA0205502088
+B1520494537501N00614036EA0205402087
+B1520514537513N00614043EA0205402086
+B1520534537526N00614050EA0205302086
+B1520554537538N00614056EA0205402086
+B1520574537551N00614062EA0205602088
+B1520594537562N00614068EA0205802090
+B1521014537573N00614074EA0206102092
+B1521034537584N00614081EA0206402095
+B1521054537595N00614088EA0206702098
+B1521074537605N00614094EA0207002101
+B1521094537616N00614101EA0207202103
+B1521114537627N00614108EA0207402105
+B1521134537637N00614112EA0207702107
+B1521154537647N00614115EA0207802108
+B1521174537656N00614116EA0208002109
+B1521194537667N00614116EA0208302110
+B1521214537677N00614116EA0208602112
+B1521234537686N00614114EA0209202117
+B1521254537692N00614108EA0209802122
+B1521274537690N00614098EA0210502128
+B1521294537680N00614102EA0211002134
+B1521314537671N00614121EA0211402139
+B1521334537671N00614147EA0211902144
+B1521354537686N00614162EA0212402150
+B1521374537700N00614161EA0212902156
+B1521394537708N00614154EA0213702163
+B1521414537714N00614147EA0214602172
+B1521434537719N00614142EA0215102179
+B1521454537721N00614136EA0215402184
+B1521474537716N00614129EA0215602188
+B1521494537705N00614133EA0215702191
+B1521514537697N00614152EA0215902194
+B1521534537698N00614175EA0216302196
+B1521554537708N00614186EA0216602199
+B1521574537724N00614183EA0217102202
+B1521594537733N00614176EA0217702207
+B1522014537739N00614171EA0218002210
+B1522034537745N00614164EA0218302213
+B1522054537749N00614154EA0218702216
+B1522074537748N00614144EA0218902219
+B1522094537740N00614136EA0218902220
+B1522114537728N00614140EA0219202223
+B1522134537722N00614156EA0219402226
+B1522154537723N00614177EA0219502228
+B1522174537731N00614191EA0219602229
+B1522194537743N00614198EA0219702229
+B1522214537755N00614194EA0220102231
+B1522234537761N00614185EA0220402234
+B1522254537762N00614176EA0220602236
+B1522274537763N00614166EA0220902238
+B1522294537765N00614155EA0221102240
+B1522314537766N00614145EA0221502243
+B1522334537766N00614136EA0222202248
+B1522354537766N00614127EA0222702254
+B1522374537767N00614118EA0223302260
+B1522394537764N00614111EA0223902266
+B1522414537753N00614113EA0224202272
+B1522434537742N00614132EA0224702278
+B1522454537739N00614155EA0225302283
+B1522474537748N00614166EA0225702288
+B1522494537763N00614162EA0226202293
+B1522514537763N00614148EA0226602297
+B1522534537756N00614142EA0227202303
+B1522554537747N00614142EA0227802310
+B1522574537738N00614154EA0228402316
+B1522594537730N00614173EA0228902323
+B1523014537730N00614193EA0229402328
+B1523034537739N00614208EA0230002333
+B1523054537751N00614212EA0230502339
+B1523074537758N00614205EA0231002343
+B1523094537758N00614194EA0231402348
+B1523114537752N00614186EA0232102354
+B1523134537743N00614186EA0232902361
+B1523154537733N00614197EA0233602368
+B1523174537726N00614217EA0234002373
+B1523194537727N00614239EA0234602379
+B1523214537738N00614248EA0235202385
+B1523234537749N00614243EA0235602391
+B1523254537754N00614232EA0236002394
+B1523274537756N00614223EA0236602400
+B1523294537755N00614215EA0237402408
+B1523314537749N00614207EA0238202416
+B1523334537740N00614201EA0238802422
+B1523354537724N00614206EA0238902427
+B1523374537709N00614227EA0239602433
+B1523394537704N00614251EA0240502439
+B1523414537711N00614263EA0240902444
+B1523434537724N00614269EA0241202449
+B1523454537736N00614269EA0241602453
+B1523474537745N00614258EA0242202458
+B1523494537750N00614247EA0243402464
+B1523514537747N00614239EA0243902471
+B1523534537744N00614234EA0243702474
+B1523554537740N00614221EA0243102475
+B1523574537728N00614212EA0243002473
+B1523594537717N00614220EA0242802472
+B1524014537708N00614235EA0242402469
+B1524034537702N00614253EA0242202465
+B1524054537698N00614273EA0242702465
+B1524074537696N00614293EA0243502466
+B1524094537693N00614308EA0244302471
+B1524114537691N00614324EA0244702476
+B1524134537694N00614342EA0245002479
+B1524154537703N00614358EA0245402484
+B1524174537714N00614360EA0245802488
+B1524194537720N00614350EA0246202493
+B1524214537718N00614339EA0246902498
+B1524234537708N00614337EA0247402504
+B1524254537696N00614347EA0247802510
+B1524274537689N00614365EA0248602517
+B1524294537690N00614384EA0248902523
+B1524314537695N00614403EA0249102527
+B1524334537706N00614416EA0249502531
+B1524354537719N00614419EA0249902535
+B1524374537723N00614416EA0250202536
+B1524394537731N00614402EA0250902543
+B1524414537729N00614392EA0251602550
+B1524434537723N00614388EA0252002555
+B1524454537710N00614396EA0252402559
+B1524474537700N00614413EA0253202567
+B1524494537700N00614433EA0253702573
+B1524514537704N00614442EA0253902575
+B1524534537721N00614455EA0254202581
+B1524554537730N00614447EA0254502584
+B1524574537734N00614437EA0255302591
+B1524594537734N00614428EA0255602595
+B1525014537728N00614421EA0255802598
+B1525034537716N00614419EA0256002600
+B1525054537710N00614423EA0256402601
+B1525074537699N00614448EA0257002608
+B1525094537695N00614464EA0257802615
+B1525114537694N00614481EA0258202619
+B1525134537696N00614501EA0258202623
+B1525154537707N00614516EA0258202624
+B1525174537719N00614514EA0258002624
+B1525194537724N00614501EA0258002623
+B1525214537720N00614490EA0258602626
+B1525234537714N00614482EA0259502631
+B1525254537708N00614477EA0260202637
+B1525274537704N00614470EA0260502640
+B1525294537697N00614462EA0260702643
+B1525314537686N00614461EA0261302647
+B1525334537678N00614473EA0261902651
+B1525354537677N00614489EA0262302656
+B1525374537684N00614508EA0263002663
+B1525394537688N00614528EA0263502669
+B1525414537689N00614547EA0263702673
+B1525434537692N00614565EA0263602675
+B1525454537695N00614585EA0263202676
+B1525474537699N00614606EA0262802674
+B1525494537705N00614627EA0262602671
+B1525514537711N00614643EA0262502669
+B1525534537717N00614658EA0262202666
+B1525554537722N00614674EA0261702662
+B1525574537730N00614686EA0261202656
+B1525594537740N00614698EA0260702651
+B1526014537750N00614709EA0260402648
+B1526034537760N00614717EA0260102644
+B1526054537770N00614727EA0259702639
+B1526074537781N00614737EA0259302635
+B1526094537792N00614745EA0259102632
+B1526114537804N00614752EA0258902631
+B1526134537815N00614758EA0258702627
+B1526154537826N00614760EA0258402625
+B1526174537837N00614762EA0258202623
+B1526194537847N00614764EA0257902620
+B1526214537859N00614766EA0257502617
+B1526234537871N00614767EA0257502615
+B1526254537883N00614769EA0257502615
+B1526274537895N00614771EA0257302614
+B1526294537906N00614775EA0257302614
+B1526314537915N00614779EA0257202613
+B1526334537925N00614784EA0256802610
+B1526354537935N00614788EA0256602609
+B1526374537945N00614791EA0256402606
+B1526394537954N00614795EA0256002603
+B1526414537965N00614799EA0255602599
+B1526434537975N00614801EA0255402597
+B1526454537985N00614802EA0255102594
+B1526474537995N00614804EA0254702590
+B1526494538006N00614805EA0254402587
+B1526514538017N00614806EA0254202584
+B1526534538027N00614807EA0253902580
+B1526554538038N00614810EA0253502577
+B1526574538050N00614813EA0253302574
+B1526594538060N00614817EA0253202572
+B1527014538070N00614821EA0252802569
+B1527034538081N00614824EA0252402565
+B1527054538093N00614826EA0252102561
+B1527074538105N00614828EA0251902559
+B1527094538116N00614830EA0251702557
+B1527114538128N00614831EA0251402554
+B1527134538139N00614830EA0251002550
+B1527154538150N00614829EA0250702548
+B1527174538160N00614829EA0250402544
+B1527194538170N00614829EA0250002540
+B1527214538180N00614830EA0249602536
+B1527234538190N00614831EA0249302533
+B1527254538200N00614833EA0248902529
+B1527274538212N00614833EA0248502525
+B1527294538224N00614835EA0248202521
+B1527314538237N00614837EA0248102519
+B1527334538248N00614839EA0248002518
+B1527354538260N00614841EA0247902516
+B1527374538271N00614845EA0247702515
+B1527394538281N00614847EA0247402512
+B1527414538291N00614849EA0247002509
+B1527434538303N00614853EA0246802507
+B1527454538313N00614858EA0246502504
+B1527474538323N00614863EA0246102500
+B1527494538334N00614868EA0245902498
+B1527514538345N00614872EA0245702495
+B1527534538356N00614874EA0245302491
+B1527554538368N00614876EA0244902488
+B1527574538380N00614880EA0244802486
+B1527594538391N00614883EA0244602483
+B1528014538403N00614886EA0244302480
+B1528034538414N00614889EA0244002477
+B1528054538424N00614890EA0243702474
+B1528074538436N00614892EA0243202470
+B1528094538448N00614892EA0242902467
+B1528114538460N00614893EA0242602464
+B1528134538472N00614896EA0242202460
+B1528154538484N00614899EA0241802456
+B1528174538495N00614906EA0241502453
+B1528194538506N00614913EA0241202450
+B1528214538519N00614921EA0241002447
+B1528234538530N00614926EA0240802446
+B1528254538541N00614929EA0240602444
+B1528274538551N00614932EA0240202440
+B1528294538563N00614935EA0239802436
+B1528314538574N00614936EA0239502433
+B1528334538584N00614937EA0239002429
+B1528354538593N00614934EA0238402424
+B1528374538604N00614933EA0237902418
+B1528394538616N00614935EA0237702415
+B1528414538627N00614937EA0237402412
+B1528434538637N00614938EA0236802407
+B1528454538647N00614937EA0236202401
+B1528474538658N00614939EA0235702395
+B1528494538670N00614942EA0235302390
+B1528514538682N00614946EA0235002386
+B1528534538694N00614949EA0234902384
+B1528554538704N00614951EA0234702381
+B1528574538716N00614951EA0234302377
+B1528594538728N00614949EA0234002375
+B1529014538739N00614945EA0233902373
+B1529034538749N00614942EA0233802372
+B1529054538759N00614939EA0233602370
+B1529074538769N00614940EA0233202366
+B1529094538780N00614940EA0232902363
+B1529114538791N00614936EA0232602361
+B1529134538803N00614936EA0232502360
+B1529154538814N00614937EA0232502360
+B1529174538825N00614938EA0232602360
+B1529194538834N00614938EA0232602359
+B1529214538844N00614936EA0232402358
+B1529234538854N00614932EA0232502358
+B1529254538865N00614930EA0232702359
+B1529274538873N00614931EA0232902361
+B1529294538881N00614931EA0233202364
+B1529314538887N00614930EA0233302366
+B1529334538893N00614928EA0233302367
+B1529354538900N00614926EA0233302367
+B1529374538909N00614926EA0233202367
+B1529394538919N00614930EA0233202366
+B1529414538930N00614937EA0233102366
+B1529434538941N00614944EA0233002365
+B1529454538954N00614950EA0232902365
+B1529474538966N00614958EA0233002365
+B1529494538977N00614964EA0233002365
+B1529514538988N00614971EA0232702364
+B1529534539001N00614977EA0232702363
+B1529554539014N00614981EA0232802364
+B1529574539025N00614985EA0232802364
+B1529594539037N00614990EA0232802364
+B1530014539049N00614995EA0232902365
+B1530034539059N00615002EA0233002366
+B1530054539068N00615007EA0232702365
+B1530074539079N00615012EA0232302363
+B1530094539090N00615019EA0232002360
+B1530114539102N00615027EA0231902359
+B1530134539113N00615035EA0231802358
+B1530154539124N00615041EA0231802357
+B1530174539134N00615048EA0231702356
+B1530194539145N00615055EA0231402353
+B1530214539156N00615062EA0231102350
+B1530234539167N00615070EA0230902348
+B1530254539177N00615077EA0230602345
+B1530274539188N00615086EA0230202341
+B1530294539198N00615098EA0229802336
+B1530314539208N00615107EA0229302332
+B1530334539219N00615116EA0228902327
+B1530354539230N00615125EA0228502323
+B1530374539241N00615134EA0228102318
+B1530394539252N00615143EA0227702315
+B1530414539262N00615152EA0227402311
+B1530434539273N00615160EA0227002307
+B1530454539284N00615168EA0226602303
+B1530474539296N00615178EA0226402300
+B1530494539306N00615187EA0226202297
+B1530514539316N00615197EA0225802293
+B1530534539328N00615207EA0225402289
+B1530554539341N00615215EA0225302287
+B1530574539352N00615220EA0225102284
+B1530594539363N00615227EA0224702281
+B1531014539376N00615235EA0224602279
+B1531034539387N00615247EA0224502278
+B1531054539398N00615257EA0224402276
+B1531074539409N00615268EA0224002273
+B1531094539420N00615279EA0223602269
+B1531114539432N00615288EA0223302266
+B1531134539443N00615298EA0222902262
+B1531154539454N00615309EA0222502258
+B1531174539466N00615319EA0222202255
+B1531194539477N00615330EA0221902251
+B1531214539488N00615341EA0221502248
+B1531234539500N00615352EA0221202244
+B1531254539512N00615364EA0220802240
+B1531274539524N00615375EA0220602238
+B1531294539535N00615387EA0220602237
+B1531314539547N00615399EA0220402236
+B1531334539558N00615410EA0220302234
+B1531354539571N00615421EA0220102233
+B1531374539583N00615433EA0220102233
+B1531394539594N00615446EA0220202233
+B1531414539605N00615459EA0220102233
+B1531434539616N00615472EA0220002231
+B1531454539628N00615486EA0219902231
+B1531474539638N00615499EA0220002231
+B1531494539648N00615511EA0219902230
+B1531514539660N00615524EA0219802229
+B1531534539671N00615536EA0219702229
+B1531554539681N00615546EA0219402227
+B1531574539693N00615557EA0219202225
+B1531594539706N00615569EA0219302225
+B1532014539718N00615580EA0219402225
+B1532034539728N00615590EA0219202223
+B1532054539740N00615603EA0218802220
+B1532074539752N00615616EA0218802220
+B1532094539763N00615626EA0218702219
+B1532114539774N00615636EA0218402217
+B1532134539785N00615646EA0218202215
+B1532154539797N00615657EA0218102214
+B1532174539808N00615667EA0218002213
+B1532194539819N00615677EA0217702210
+B1532214539831N00615689EA0217402207
+B1532234539842N00615701EA0217202205
+B1532254539853N00615712EA0217002203
+B1532274539864N00615723EA0216602200
+B1532294539875N00615733EA0216102195
+B1532314539888N00615743EA0215702191
+B1532334539901N00615753EA0215302187
+B1532354539914N00615765EA0214902183
+B1532374539927N00615779EA0214702180
+B1532394539940N00615791EA0214602178
+B1532414539951N00615803EA0214202175
+B1532434539963N00615815EA0213902171
+B1532454539975N00615825EA0213602169
+B1532474539985N00615835EA0213302166
+B1532494539993N00615846EA0212702161
+B1532514540003N00615856EA0212002155
+B1532534540013N00615868EA0211602151
+B1532554540022N00615878EA0211202146
+B1532574540030N00615888EA0210502140
+B1532594540040N00615899EA0210002134
+B1533014540051N00615911EA0209502129
+B1533034540060N00615924EA0209302125
+B1533054540067N00615934EA0208802121
+B1533074540076N00615944EA0208202115
+B1533094540086N00615953EA0207902111
+B1533114540096N00615961EA0207502107
+B1533134540107N00615969EA0207102103
+B1533154540118N00615977EA0206702099
+B1533174540128N00615984EA0206502097
+B1533194540139N00615992EA0206302094
+B1533214540149N00616002EA0206002091
+B1533234540159N00616013EA0205802088
+B1533254540170N00616024EA0205602086
+B1533274540180N00616033EA0205302083
+B1533294540190N00616043EA0205002080
+B1533314540201N00616053EA0204702077
+B1533334540211N00616062EA0204502075
+B1533354540222N00616071EA0204302072
+B1533374540233N00616080EA0204002070
+B1533394540243N00616090EA0203802068
+B1533414540253N00616099EA0203502065
+B1533434540263N00616109EA0203102062
+B1533454540274N00616117EA0203102060
+B1533474540285N00616126EA0202902058
+B1533494540296N00616137EA0202702056
+B1533514540307N00616148EA0202702056
+B1533534540319N00616159EA0203002056
+B1533554540330N00616169EA0203202058
+B1533574540340N00616176EA0203202059
+B1533594540350N00616183EA0203102058
+B1534014540360N00616194EA0203002058
+B1534034540370N00616204EA0203002058
+B1534054540380N00616213EA0202902057
+B1534074540390N00616222EA0202802056
+B1534094540400N00616232EA0202802056
+B1534114540409N00616242EA0202702056
+B1534134540418N00616251EA0202502054
+B1534154540428N00616261EA0202502055
+B1534174540438N00616270EA0202502055
+B1534194540447N00616279EA0202402054
+B1534214540457N00616289EA0202302053
+B1534234540464N00616304EA0202202051
+B1534254540470N00616321EA0202202051
+B1534274540475N00616338EA0202302051
+B1534294540479N00616355EA0202202051
+B1534314540482N00616373EA0202202050
+B1534334540485N00616392EA0202202051
+B1534354540490N00616409EA0202502052
+B1534374540494N00616423EA0202902055
+B1534394540497N00616436EA0203402059
+B1534414540503N00616446EA0203602062
+B1534434540513N00616442EA0204002066
+B1534454540517N00616436EA0204402068
+B1534474540512N00616411EA0204802074
+B1534494540499N00616409EA0205202079
+B1534514540489N00616419EA0205502084
+B1534534540486N00616433EA0205702087
+B1534554540493N00616447EA0205902090
+B1534574540506N00616450EA0206402094
+B1534594540517N00616449EA0207302101
+B1535014540525N00616447EA0207802107
+B1535034540532N00616438EA0208002111
+B1535054540531N00616419EA0208102113
+B1535074540521N00616405EA0208402116
+B1535094540509N00616404EA0208702119
+B1535114540500N00616415EA0209002122
+B1535134540498N00616429EA0209302126
+B1535154540502N00616442EA0209702129
+B1535174540512N00616449EA0210202135
+B1535194540522N00616450EA0210902141
+B1535214540532N00616447EA0211402147
+B1535234540541N00616445EA0211802151
+B1535254540548N00616442EA0211902154
+B1535274540554N00616427EA0211902156
+B1535294540552N00616408EA0212302160
+B1535314540541N00616400EA0212502162
+B1535334540528N00616405EA0212702164
+B1535354540521N00616416EA0213202167
+B1535374540521N00616430EA0213702172
+B1535394540527N00616440EA0214202177
+B1535414540537N00616437EA0214202179
+B1535434540544N00616422EA0214402181
+B1535454540542N00616406EA0214802185
+B1535474540534N00616395EA0215102187
+B1535494540524N00616388EA0215302190
+B1535514540512N00616386EA0215502191
+B1535534540501N00616392EA0215802193
+B1535554540493N00616403EA0216102196
+B1535574540491N00616419EA0216602200
+B1535594540493N00616435EA0217202205
+B1536014540495N00616447EA0217902212
+B1536034540498N00616458EA0218402218
+B1536054540503N00616464EA0218502222
+B1536074540516N00616459EA0218802225
+B1536094540522N00616443EA0219202229
+B1536114540518N00616428EA0219602232
+B1536134540507N00616421EA0220102237
+B1536154540497N00616427EA0220702241
+B1536174540494N00616434EA0221202244
+B1536194540493N00616449EA0221802250
+B1536214540498N00616461EA0222102255
+B1536234540508N00616463EA0222202258
+B1536254540519N00616456EA0222502261
+B1536274540526N00616444EA0222802264
+B1536294540530N00616427EA0223202265
+B1536314540530N00616408EA0223602269
+B1536334540521N00616395EA0224102274
+B1536354540511N00616386EA0224502279
+B1536374540499N00616389EA0224702282
+B1536394540492N00616404EA0225002284
+B1536414540492N00616421EA0225602287
+B1536434540500N00616433EA0226102292
+B1536454540507N00616438EA0226502296
+B1536474540515N00616437EA0226702299
+B1536494540525N00616425EA0226902302
+B1536514540527N00616407EA0227302306
+B1536534540522N00616391EA0227602310
+B1536554540512N00616379EA0228002314
+B1536574540500N00616378EA0228302317
+B1536594540490N00616388EA0228602320
+B1537014540487N00616404EA0229002324
+B1537034540492N00616416EA0229102327
+B1537054540500N00616423EA0229302329
+B1537074540508N00616429EA0229802332
+B1537094540523N00616427EA0230502338
+B1537114540528N00616424EA0231302341
+B1537134540537N00616420EA0231902348
+B1537154540552N00616411EA0232502357
+B1537174540555N00616401EA0232902360
+B1537194540553N00616383EA0233202367
+B1537214540541N00616377EA0233602371
+B1537234540530N00616390EA0234002375
+B1537254540531N00616408EA0234702381
+B1537274540541N00616413EA0235402386
+B1537294540553N00616401EA0235802392
+B1537314540554N00616382EA0236202396
+B1537334540542N00616373EA0236502401
+B1537354540529N00616380EA0237102408
+B1537374540522N00616393EA0237502413
+B1537394540523N00616409EA0238102417
+B1537414540533N00616420EA0238902424
+B1537434540544N00616420EA0239702431
+B1537454540554N00616414EA0240402438
+B1537474540559N00616405EA0240902445
+B1537494540557N00616390EA0241302451
+B1537514540549N00616377EA0241902457
+B1537534540535N00616377EA0242202462
+B1537554540525N00616389EA0242702467
+B1537574540523N00616406EA0243402472
+B1537594540530N00616416EA0244002478
+B1538014540541N00616415EA0244702484
+B1538034540549N00616408EA0245302490
+B1538054540551N00616395EA0245902496
+B1538074540546N00616380EA0246502502
+B1538094540536N00616369EA0247102508
+B1538114540523N00616371EA0247402513
+B1538134540514N00616385EA0248002519
+B1538154540513N00616400EA0248602525
+B1538174540520N00616411EA0249202530
+B1538194540530N00616413EA0249802535
+B1538214540539N00616409EA0250302541
+B1538234540545N00616401EA0251002547
+B1538254540548N00616390EA0251602554
+B1538274540547N00616376EA0252002559
+B1538294540537N00616362EA0252602564
+B1538314540522N00616359EA0253102570
+B1538334540513N00616371EA0253602574
+B1538354540513N00616387EA0254102579
+B1538374540521N00616397EA0254602583
+B1538394540530N00616399EA0255102587
+B1538414540538N00616392EA0255602592
+B1538434540538N00616377EA0256102595
+B1538454540525N00616366EA0256702600
+B1538474540514N00616368EA0257102605
+B1538494540507N00616381EA0257602610
+B1538514540505N00616396EA0258002615
+B1538534540509N00616409EA0258402619
+B1538554540517N00616417EA0258902624
+B1538574540528N00616417EA0259202627
+B1538594540538N00616406EA0259702631
+B1539014540541N00616392EA0260302637
+B1539034540536N00616377EA0260802641
+B1539054540524N00616371EA0261402647
+B1539074540512N00616375EA0261902652
+B1539094540505N00616388EA0262402657
+B1539114540505N00616404EA0262802662
+B1539134540513N00616416EA0263402668
+B1539154540525N00616419EA0263902673
+B1539174540536N00616416EA0264402678
+B1539194540544N00616406EA0264902683
+B1539214540544N00616389EA0265202688
+B1539234540535N00616376EA0265802692
+B1539254540522N00616377EA0266202697
+B1539274540514N00616393EA0266502700
+B1539294540517N00616414EA0267102706
+B1539314540522N00616430EA0267802714
+B1539334540526N00616444EA0268102719
+B1539354540528N00616457EA0268502723
+B1539374540533N00616469EA0268802726
+B1539394540539N00616480EA0269302730
+B1539414540545N00616492EA0269802735
+B1539434540552N00616502EA0270402740
+B1539454540557N00616514EA0270802746
+B1539474540561N00616528EA0271202750
+B1539494540565N00616543EA0271702755
+B1539514540569N00616556EA0271902759
+B1539534540573N00616570EA0271802762
+B1539554540576N00616587EA0271702763
+B1539574540581N00616603EA0271502762
+B1539594540587N00616619EA0271502760
+B1540014540594N00616635EA0271602761
+B1540034540598N00616651EA0271702762
+B1540054540602N00616666EA0271602762
+B1540074540607N00616680EA0271202761
+B1540094540612N00616695EA0270602759
+B1540114540620N00616710EA0270002755
+B1540134540629N00616725EA0269602749
+B1540154540638N00616742EA0269302745
+B1540174540648N00616756EA0269002741
+B1540194540660N00616768EA0268802737
+B1540214540672N00616780EA0268602734
+B1540234540684N00616790EA0268102731
+B1540254540697N00616801EA0267602726
+B1540274540710N00616814EA0267402722
+B1540294540724N00616827EA0267402720
+B1540314540736N00616838EA0267202718
+B1540334540747N00616848EA0267002716
+B1540354540759N00616858EA0266702713
+B1540374540770N00616868EA0266502710
+B1540394540782N00616878EA0266302707
+B1540414540793N00616888EA0266102705
+B1540434540804N00616898EA0265802702
+B1540454540815N00616909EA0265602699
+B1540474540826N00616919EA0265302697
+B1540494540837N00616929EA0265102694
+B1540514540848N00616939EA0264802691
+B1540534540859N00616950EA0264502688
+B1540554540871N00616961EA0264302686
+B1540574540882N00616973EA0264102683
+B1540594540893N00616985EA0264002682
+B1541014540904N00616997EA0263902681
+B1541034540914N00617007EA0263802680
+B1541054540925N00617018EA0263502678
+B1541074540936N00617030EA0263302675
+B1541094540947N00617042EA0263102673
+B1541114540958N00617053EA0262802671
+B1541134540968N00617064EA0262502668
+B1541154540977N00617077EA0262202665
+B1541174540987N00617089EA0261902663
+B1541194540996N00617100EA0261502659
+B1541214541006N00617113EA0261102655
+B1541234541017N00617126EA0260902651
+B1541254541027N00617140EA0260702649
+B1541274541035N00617155EA0260402646
+B1541294541044N00617169EA0260202642
+B1541314541055N00617183EA0260002641
+B1541334541063N00617199EA0259902640
+B1541354541072N00617214EA0259802639
+B1541374541085N00617236EA0259602635
+B1541394541089N00617244EA0259502635
+B1541414541096N00617259EA0259502634
+B1541434541102N00617272EA0259102632
+B1541454541109N00617287EA0258602629
+B1541474541116N00617302EA0258302626
+B1541494541126N00617325EA0257902620
+B1541514541132N00617341EA0257502616
+B1541534541139N00617359EA0257202612
+B1541554541141N00617367EA0257002611
+B1541574541146N00617382EA0256602608
+B1541594541154N00617408EA0256202602
+B1542014541157N00617418EA0256002600
+B1542034541162N00617435EA0255902599
+B1542054541170N00617461EA0255702595
+B1542074541173N00617470EA0255602594
+B1542094541179N00617487EA0255602594
+B1542114541188N00617512EA0255402591
+B1542134541194N00617530EA0255202589
+B1542154541197N00617538EA0255002588
+B1542174541206N00617564EA0254802585
+B1542194541212N00617580EA0254502582
+B1542214541219N00617597EA0254302579
+B1542234541226N00617613EA0254302578
+B1542254541233N00617627EA0254202577
+B1542274541237N00617635EA0253902576
+B1542294541248N00617659EA0253702573
+B1542314541252N00617668EA0253702572
+B1542334541264N00617690EA0253602571
+B1542354541273N00617705EA0253402569
+B1542374541282N00617719EA0253302568
+B1542394541286N00617726EA0253102568
+B1542414541300N00617748EA0252802565
+B1542434541309N00617763EA0252602563
+B1542454541320N00617777EA0252602562
+B1542474541329N00617790EA0252402560
+B1542494541339N00617804EA0252202558
+B1542514541345N00617812EA0252202557
+B1542534541359N00617833EA0252202557
+B1542554541367N00617847EA0252002556
+B1542574541372N00617861EA0251802554
+B1542594541386N00617877EA0251702553
+B1543014541394N00617891EA0251502552
+B1543034541398N00617899EA0251202550
+B1543054541410N00617923EA0251002547
+B1543074541419N00617938EA0250802545
+B1543094541426N00617953EA0250502542
+B1543114541435N00617968EA0250202539
+B1543134541443N00617984EA0250002537
+B1543154541450N00617999EA0249702535
+B1543174541457N00618015EA0249402531
+B1543194541465N00618031EA0249102528
+B1543214541472N00618047EA0248802525
+B1543234541478N00618063EA0248402521
+B1543254541485N00618080EA0248102518
+B1543274541492N00618099EA0247902515
+B1543294541499N00618115EA0247602513
+B1543314541506N00618131EA0247302510
+B1543334541512N00618149EA0247002507
+B1543354541520N00618166EA0246802505
+B1543374541526N00618183EA0246602503
+B1543394541533N00618199EA0246402500
+B1543414541540N00618216EA0246202498
+B1543434541547N00618233EA0246002496
+B1543454541554N00618249EA0245802494
+B1543474541562N00618265EA0245602493
+B1543494541569N00618281EA0245502491
+B1543514541577N00618297EA0245202488
+B1543534541585N00618313EA0244902485
+B1543554541593N00618328EA0244702483
+B1543574541601N00618343EA0244402481
+B1543594541609N00618358EA0244202478
+B1544014541617N00618373EA0244102477
+B1544034541626N00618387EA0244002476
+B1544054541634N00618399EA0243902475
+B1544074541643N00618413EA0243802473
+B1544094541651N00618428EA0243702473
+B1544114541658N00618442EA0243602472
+B1544134541665N00618457EA0243402470
+B1544154541673N00618473EA0243302469
+B1544174541680N00618490EA0243302469
+B1544194541686N00618505EA0243302468
+B1544214541692N00618522EA0243102467
+B1544234541699N00618539EA0243002465
+B1544254541706N00618556EA0242902465
+B1544274541712N00618572EA0242802464
+B1544294541719N00618588EA0242602462
+B1544314541726N00618605EA0242502461
+B1544334541733N00618621EA0242302460
+B1544354541740N00618637EA0242202458
+B1544374541746N00618654EA0242002456
+B1544394541753N00618670EA0241802454
+B1544414541760N00618686EA0241602452
+B1544434541767N00618702EA0241302450
+B1544454541774N00618717EA0241102448
+B1544474541780N00618733EA0240802445
+B1544494541787N00618749EA0240602442
+B1544514541794N00618765EA0240302439
+B1544534541801N00618781EA0240002437
+B1544554541808N00618798EA0239802434
+B1544574541815N00618813EA0239702432
+B1544594541822N00618828EA0239402430
+B1545014541829N00618844EA0239102428
+B1545034541835N00618861EA0238902425
+B1545054541842N00618878EA0238702423
+B1545074541848N00618895EA0238402420
+B1545094541853N00618912EA0238202418
+B1545114541860N00618928EA0238002416
+B1545134541866N00618944EA0237702414
+B1545154541871N00618959EA0237402411
+B1545174541878N00618975EA0237002407
+B1545194541884N00618991EA0236702404
+B1545214541889N00619007EA0236502401
+B1545234541896N00619021EA0236202398
+B1545254541902N00619036EA0236002395
+B1545274541909N00619051EA0235802394
+B1545294541914N00619064EA0235502391
+B1545314541920N00619078EA0235102387
+B1545334541926N00619093EA0234702384
+B1545354541931N00619109EA0234502382
+B1545374541934N00619124EA0234302379
+B1545394541939N00619139EA0233902375
+B1545414541944N00619154EA0233602373
+B1545434541949N00619168EA0233402369
+B1545454541954N00619182EA0233002365
+B1545474541960N00619197EA0232602362
+B1545494541966N00619212EA0232402359
+B1545514541972N00619224EA0232102356
+B1545534541978N00619236EA0231702353
+B1545554541986N00619248EA0231502351
+B1545574541993N00619258EA0231302349
+B1545594542001N00619268EA0231102347
+B1546014542009N00619278EA0230902345
+B1546034542017N00619289EA0230802344
+B1546054542024N00619300EA0230702342
+B1546074542031N00619313EA0230502341
+B1546094542038N00619325EA0230402339
+B1546114542045N00619336EA0230302338
+B1546134542051N00619349EA0230202337
+B1546154542057N00619363EA0230202336
+B1546174542064N00619376EA0230002335
+B1546194542070N00619389EA0229802333
+B1546214542076N00619401EA0229502331
+B1546234542083N00619413EA0229302329
+B1546254542090N00619425EA0229102327
+B1546274542096N00619438EA0229002325
+B1546294542103N00619449EA0228802324
+B1546314542110N00619460EA0228702322
+B1546334542118N00619471EA0228602321
+B1546354542125N00619479EA0228502321
+B1546374542133N00619487EA0228402319
+B1546394542141N00619496EA0228202317
+B1546414542149N00619504EA0228102315
+B1546434542156N00619511EA0227802314
+B1546454542164N00619518EA0227502311
+B1546474542171N00619527EA0227202308
+B1546494542179N00619534EA0227002305
+B1546514542186N00619544EA0226702302
+B1546534542193N00619554EA0226402299
+B1546554542200N00619564EA0226102296
+B1546574542207N00619575EA0225802293
+B1546594542215N00619585EA0225602291
+B1547014542222N00619595EA0225302288
+B1547034542230N00619605EA0225102286
+B1547054542237N00619615EA0224902284
+B1547074542244N00619625EA0224702281
+B1547094542251N00619635EA0224502279
+B1547114542260N00619644EA0224302278
+B1547134542268N00619654EA0224302277
+B1547154542275N00619663EA0224102276
+B1547174542284N00619672EA0223902274
+B1547194542293N00619681EA0223702272
+B1547214542301N00619689EA0223502270
+B1547234542309N00619698EA0223302268
+B1547254542317N00619710EA0223202266
+B1547274542325N00619720EA0223102265
+B1547294542332N00619729EA0223002264
+B1547314542340N00619739EA0222702261
+B1547334542349N00619749EA0222602260
+B1547354542357N00619759EA0222402259
+B1547374542365N00619768EA0222302257
+B1547394542374N00619777EA0222002254
+B1547414542382N00619785EA0221802252
+B1547434542391N00619794EA0221602250
+B1547454542400N00619802EA0221402248
+B1547474542409N00619809EA0221302246
+B1547494542414N00619814EA0221102245
+B1547514542426N00619827EA0220902243
+B1547534542434N00619836EA0220702241
+B1547554542442N00619845EA0220502238
+B1547574542450N00619855EA0220202236
+B1547594542457N00619865EA0220102234
+B1548014542465N00619875EA0219702232
+B1548034542473N00619885EA0219602230
+B1548054542481N00619895EA0219402228
+B1548074542489N00619905EA0219102225
+B1548094542497N00619915EA0218802222
+B1548114542505N00619926EA0218502219
+B1548134542513N00619936EA0218502218
+B1548154542520N00619945EA0218402217
+B1548174542527N00619955EA0218202215
+B1548194542534N00619966EA0217902212
+B1548214542541N00619977EA0217702211
+B1548234542548N00619989EA0217402208
+B1548254542555N00620001EA0217202206
+B1548274542562N00620014EA0217002204
+B1548294542569N00620025EA0216802202
+B1548314542577N00620035EA0216502199
+B1548334542585N00620044EA0216302197
+B1548354542593N00620052EA0216202195
+B1548374542601N00620059EA0216102194
+B1548394542610N00620063EA0215902192
+B1548414542618N00620069EA0215602190
+B1548434542626N00620077EA0215502189
+B1548454542634N00620085EA0215402187
+B1548474542642N00620093EA0215302185
+B1548494542651N00620100EA0215102183
+B1548514542660N00620106EA0214902182
+B1548534542668N00620112EA0214602180
+B1548554542676N00620119EA0214502178
+B1548574542684N00620128EA0214202176
+B1548594542692N00620137EA0214002174
+B1549014542700N00620145EA0213802172
+B1549034542708N00620154EA0213602170
+B1549054542716N00620163EA0213302167
+B1549074542724N00620172EA0213002164
+B1549094542732N00620181EA0212802162
+B1549114542740N00620189EA0212502159
+B1549134542748N00620197EA0212302157
+B1549154542756N00620205EA0212002154
+B1549174542764N00620213EA0211802152
+B1549194542773N00620221EA0211602149
+B1549214542781N00620230EA0211302147
+B1549234542789N00620238EA0211102144
+B1549254542798N00620246EA0210902143
+B1549274542806N00620255EA0210802141
+B1549294542814N00620262EA0210602139
+B1549314542822N00620271EA0210402137
+B1549334542831N00620279EA0210202136
+B1549354542839N00620288EA0210002133
+B1549374542847N00620297EA0209702130
+B1549394542856N00620307EA0209502128
+B1549414542865N00620318EA0209502127
+B1549434542874N00620327EA0209402126
+B1549454542882N00620336EA0209102123
+B1549474542891N00620345EA0209002122
+B1549494542899N00620354EA0209302123
+B1549514542906N00620361EA0209202123
+B1549534542913N00620368EA0208902121
+B1549554542922N00620375EA0208702120
+B1549574542929N00620382EA0208902121
+B1549594542935N00620390EA0209002122
+B1550014542941N00620398EA0209202124
+B1550034542948N00620404EA0209402127
+B1550054542955N00620411EA0209702129
+B1550074542962N00620419EA0210202134
+B1550094542968N00620424EA0210702139
+B1550114542974N00620429EA0211202144
+B1550134542980N00620434EA0211902151
+B1550154542986N00620439EA0212602158
+B1550174542991N00620444EA0213002164
+B1550194542993N00620436EA0213102169
+B1550214542987N00620425EA0213502173
+B1550234542972N00620429EA0213802176
+B1550254542958N00620450EA0214002180
+B1550274542958N00620474EA0214902186
+B1550294542963N00620487EA0215902194
+B1550314542969N00620493EA0216702201
+B1550334542976N00620499EA0217402209
+B1550354542984N00620500EA0217902215
+B1550374542987N00620493EA0218002220
+B1550394542979N00620487EA0218302223
+B1550414542965N00620490EA0218602224
+B1550434542953N00620501EA0219002228
+B1550454542945N00620517EA0219602233
+B1550474542938N00620535EA0220402240
+B1550494542936N00620553EA0221102246
+B1550514542939N00620568EA0221702252
+B1550534542947N00620573EA0222302257
+B1550554542950N00620566EA0222602263
+B1550574542942N00620558EA0222902268
+B1550594542927N00620559EA0223702273
+B1551014542913N00620568EA0224402281
+B1551034542903N00620579EA0224902287
+B1551054542895N00620596EA0225302292
+B1551074542894N00620614EA0225602296
+B1551094542902N00620620EA0225802299
+B1551114542906N00620610EA0226202302
+B1551134542899N00620597EA0226802306
+B1551154542888N00620590EA0227502314
+B1551174542880N00620586EA0228002318
+B1551194542872N00620582EA0228402323
+B1551214542861N00620581EA0228902327
+B1551234542849N00620593EA0229202331
+B1551254542844N00620614EA0229502334
+B1551274542848N00620630EA0229902338
+B1551294542859N00620628EA0229902340
+B1551314542862N00620615EA0230202344
+B1551334542856N00620603EA0231002349
+B1551354542848N00620598EA0231302351
+B1551374542842N00620590EA0231402353
+B1551394542835N00620585EA0231602355
+B1551414542823N00620586EA0231702356
+B1551434542810N00620600EA0231802357
+B1551454542803N00620619EA0232002357
+B1551474542805N00620638EA0232302359
+B1551494542815N00620644EA0232302360
+B1551514542825N00620641EA0232302361
+B1551534542834N00620641EA0232502362
+B1551554542843N00620641EA0232402362
+B1551574542850N00620639EA0231802361
+B1551594542858N00620637EA0230802359
+B1552014542869N00620635EA0230402356
+B1552034542877N00620633EA0230502354
+B1552054542881N00620632EA0230202350
+B1552074542887N00620628EA0229402344
+B1552094542896N00620624EA0229102339
+B1552114542904N00620624EA0229102336
+B1552134542911N00620624EA0228802332
+B1552154542919N00620622EA0228302326
+B1552174542929N00620621EA0228002322
+B1552194542938N00620622EA0227902320
+B1552214542946N00620624EA0227602316
+B1552234542956N00620626EA0227202312
+B1552254542966N00620627EA0227002309
+B1552274542975N00620629EA0226902307
+B1552294542985N00620631EA0226702304
+B1552314542994N00620634EA0226202300
+B1552334543004N00620637EA0225802295
+B1552354543013N00620640EA0225502292
+B1552374543022N00620644EA0225202288
+B1552394543032N00620648EA0224702283
+B1552414543042N00620652EA0224202279
+B1552434543051N00620656EA0223902275
+B1552454543061N00620658EA0223502271
+B1552474543070N00620661EA0223102266
+B1552494543080N00620663EA0222702262
+B1552514543091N00620665EA0222402259
+B1552534543101N00620668EA0221902255
+B1552554543111N00620672EA0221502251
+B1552574543121N00620675EA0221102246
+B1552594543131N00620678EA0220702242
+B1553014543142N00620680EA0220302238
+B1553034543152N00620682EA0219902234
+B1553054543162N00620686EA0219602231
+B1553074543172N00620690EA0219302228
+B1553094543182N00620694EA0219002225
+B1553114543192N00620698EA0218702221
+B1553134543202N00620703EA0218502219
+B1553154543212N00620709EA0218202216
+B1553174543222N00620716EA0217902214
+B1553194543233N00620722EA0217802212
+B1553214543242N00620729EA0217502209
+B1553234543251N00620737EA0217202207
+B1553254543260N00620743EA0216802203
+B1553274543270N00620749EA0216402199
+B1553294543280N00620756EA0216402198
+B1553314543289N00620761EA0216202196
+B1553334543298N00620766EA0216002193
+B1553354543308N00620770EA0215802191
+B1553374543317N00620774EA0215502189
+B1553394543326N00620778EA0215202186
+B1553414543336N00620781EA0215102184
+B1553434543346N00620783EA0215002183
+B1553454543354N00620784EA0214802182
+B1553474543361N00620784EA0214602179
+B1553494543370N00620788EA0214302176
+B1553514543381N00620793EA0214102175
+B1553534543392N00620799EA0214602174
+B1553554543400N00620805EA0215202175
+B1553574543409N00620811EA0215502179
+B1553594543418N00620816EA0215802183
+B1554014543428N00620821EA0216302188
+B1554034543437N00620826EA0216602193
+B1554054543445N00620828EA0216402196
+B1554074543453N00620824EA0216202197
+B1554094543463N00620822EA0216302198
+B1554114543472N00620823EA0216102198
+B1554134543482N00620822EA0215802197
+B1554154543493N00620824EA0215602195
+B1554174543504N00620826EA0215402193
+B1554194543515N00620827EA0215302192
+B1554214543527N00620828EA0215302191
+B1554234543539N00620828EA0215202190
+B1554254543550N00620830EA0215102189
+B1554274543561N00620834EA0215002188
+B1554294543573N00620838EA0214902187
+B1554314543584N00620843EA0214902187
+B1554334543595N00620847EA0214902187
+B1554354543606N00620850EA0214702185
+B1554374543618N00620852EA0214702184
+B1554394543630N00620854EA0214702184
+B1554414543641N00620856EA0214702184
+B1554434543652N00620859EA0214702184
+B1554454543663N00620862EA0214702184
+B1554474543674N00620864EA0214802184
+B1554494543685N00620866EA0214802185
+B1554514543696N00620868EA0214802185
+B1554534543708N00620871EA0214802185
+B1554554543720N00620874EA0214802185
+B1554574543732N00620878EA0214902185
+B1554594543744N00620882EA0215002186
+B1555014543756N00620887EA0215202188
+B1555034543768N00620893EA0215302189
+B1555054543781N00620898EA0215302189
+B1555074543794N00620902EA0215402190
+B1555094543806N00620905EA0215402190
+B1555114543819N00620909EA0215402190
+B1555134543832N00620913EA0215302190
+B1555154543845N00620916EA0215302190
+B1555174543858N00620919EA0215302190
+B1555194543870N00620921EA0215202189
+B1555214543883N00620923EA0215102188
+B1555234543896N00620926EA0215002187
+B1555254543908N00620930EA0214902186
+B1555274543921N00620933EA0214802184
+B1555294543933N00620936EA0214602183
+B1555314543944N00620941EA0214402181
+B1555334543956N00620947EA0214002177
+B1555354543968N00620952EA0213702174
+B1555374543981N00620957EA0213502171
+B1555394543993N00620963EA0213402170
+B1555414544004N00620970EA0213102167
+B1555434544016N00620979EA0212702163
+B1555454544028N00620988EA0212602161
+B1555474544040N00620995EA0212302159
+B1555494544052N00621001EA0211902156
+B1555514544065N00621006EA0211802154
+B1555534544078N00621011EA0211902153
+B1555554544090N00621016EA0212202153
+B1555574544101N00621022EA0212302154
+B1555594544113N00621026EA0212302155
+B1556014544126N00621031EA0212402156
+B1556034544138N00621034EA0212502157
+B1556054544150N00621036EA0212502158
+B1556074544162N00621038EA0212402157
+B1556094544175N00621040EA0212202156
+B1556114544188N00621043EA0212202156
+B1556134544199N00621046EA0211902153
+B1556154544212N00621050EA0211502150
+B1556174544226N00621056EA0211302148
+B1556194544238N00621063EA0211302147
+B1556214544252N00621068EA0211102145
+B1556234544266N00621073EA0211102145
+B1556254544280N00621077EA0211402145
+B1556274544292N00621081EA0211502146
+B1556294544303N00621086EA0211202146
+B1556314544316N00621090EA0210902144
+B1556334544330N00621093EA0210802143
+B1556354544342N00621098EA0210602142
+B1556374544355N00621102EA0210302139
+B1556394544370N00621108EA0210002136
+B1556414544383N00621114EA0209802134
+B1556434544396N00621121EA0209502131
+B1556454544409N00621128EA0209102127
+B1556474544424N00621134EA0208702123
+B1556494544438N00621140EA0208702121
+B1556514544451N00621144EA0208402119
+B1556534544463N00621147EA0207902115
+B1556554544478N00621151EA0207502110
+B1556574544492N00621155EA0207302108
+B1556594544506N00621159EA0207002105
+B1557014544520N00621164EA0206702103
+B1557034544535N00621169EA0206702101
+B1557054544549N00621175EA0206502100
+B1557074544562N00621182EA0206202097
+B1557094544576N00621187EA0205902094
+B1557114544591N00621192EA0205802092
+B1557134544604N00621199EA0205602090
+B1557154544618N00621205EA0205402088
+B1557174544632N00621211EA0205402088
+B1557194544644N00621218EA0205202086
+B1557214544657N00621225EA0205002084
+B1557234544671N00621231EA0204702081
+B1557254544684N00621238EA0204702081
+B1557274544696N00621244EA0204702080
+B1557294544709N00621251EA0204502078
+B1557314544723N00621258EA0204402077
+B1557334544735N00621266EA0204302077
+B1557354544747N00621274EA0204102074
+B1557374544760N00621282EA0203802072
+B1557394544774N00621289EA0203802071
+B1557414544786N00621297EA0203702070
+B1557434544799N00621306EA0203502068
+B1557454544812N00621315EA0203302066
+B1557474544825N00621324EA0203102065
+B1557494544837N00621332EA0203002063
+B1557514544850N00621341EA0202702060
+B1557534544863N00621350EA0202502059
+B1557554544877N00621357EA0202502057
+B1557574544890N00621366EA0202402056
+B1557594544905N00621373EA0202202055
+B1558014544919N00621380EA0202202054
+B1558034544932N00621387EA0202102054
+B1558054544946N00621393EA0202002052
+B1558074544959N00621399EA0201802051
+B1558094544973N00621405EA0201702050
+B1558114544986N00621412EA0201602049
+B1558134544999N00621419EA0201502048
+B1558154545012N00621429EA0201302046
+B1558174545024N00621439EA0201202045
+B1558194545038N00621447EA0201002043
+B1558214545051N00621455EA0201002043
+B1558234545064N00621461EA0200902042
+B1558254545077N00621466EA0200802041
+B1558274545090N00621472EA0200702040
+B1558294545103N00621478EA0200602039
+B1558314545116N00621483EA0200602038
+B1558334545130N00621487EA0200502037
+B1558354545142N00621491EA0200402036
+B1558374545155N00621495EA0200302035
+B1558394545168N00621499EA0200102033
+B1558414545182N00621503EA0199902031
+B1558434545195N00621506EA0199602029
+B1558454545208N00621509EA0199402026
+B1558474545222N00621512EA0199102023
+B1558494545235N00621516EA0198902021
+B1558514545247N00621521EA0198602018
+B1558534545260N00621527EA0198402016
+B1558554545273N00621534EA0198402015
+B1558574545284N00621538EA0198102013
+B1558594545295N00621540EA0197602010
+B1559014545308N00621541EA0197202006
+B1559034545321N00621542EA0197002005
+B1559054545333N00621543EA0196802002
+B1559074545346N00621543EA0196702000
+B1559094545358N00621544EA0196701999
+B1559114545369N00621544EA0196601998
+B1559134545379N00621543EA0196301996
+B1559154545390N00621541EA0196201995
+B1559174545401N00621538EA0196301995
+B1559194545411N00621535EA0196201994
+B1559214545421N00621532EA0195901992
+B1559234545433N00621531EA0195801991
+B1559254545444N00621533EA0195601990
+B1559274545456N00621536EA0195401988
+B1559294545467N00621539EA0195201985
+B1559314545479N00621543EA0195101983
+B1559334545491N00621546EA0194901982
+B1559354545502N00621550EA0194801980
+B1559374545513N00621555EA0194801980
+B1559394545523N00621560EA0194701979
+B1559414545534N00621564EA0194501978
+B1559434545546N00621568EA0194501977
+B1559454545557N00621572EA0194601977
+B1559474545569N00621576EA0194501977
+B1559494545580N00621580EA0194401976
+B1559514545593N00621583EA0194301975
+B1559534545604N00621585EA0194201974
+B1559554545616N00621587EA0194201974
+B1559574545628N00621590EA0194201973
+B1559594545639N00621593EA0194201973
+B1600014545651N00621596EA0194101972
+B1600034545662N00621599EA0193901971
+B1600054545673N00621603EA0193701969
+B1600074545685N00621606EA0193601968
+B1600094545696N00621609EA0193501967
+B1600114545708N00621613EA0193401965
+B1600134545720N00621617EA0193301964
+B1600154545732N00621622EA0193201963
+B1600174545743N00621624EA0193101962
+B1600194545754N00621628EA0192901961
+B1600214545766N00621632EA0192801958
+B1600234545778N00621639EA0192601957
+B1600254545788N00621647EA0192501956
+B1600274545799N00621653EA0192301954
+B1600294545810N00621660EA0192101952
+B1600314545821N00621666EA0192001950
+B1600334545832N00621671EA0191801949
+B1600354545844N00621677EA0191601947
+B1600374545855N00621683EA0191501945
+B1600394545865N00621688EA0191301944
+B1600414545876N00621694EA0191101942
+B1600434545887N00621699EA0190901940
+B1600454545898N00621703EA0190801938
+B1600474545908N00621707EA0190501936
+B1600494545918N00621712EA0190201933
+B1600514545928N00621716EA0189901930
+B1600534545938N00621722EA0189501926
+B1600554545948N00621727EA0189101922
+B1600574545958N00621734EA0188801919
+B1600594545967N00621740EA0188501916
+B1601014545977N00621743EA0188201912
+B1601034545987N00621745EA0187801909
+B1601054545997N00621747EA0187501906
+B1601074546008N00621748EA0187301903
+B1601094546018N00621749EA0187101901
+B1601114546028N00621752EA0186901898
+B1601134546037N00621757EA0186401894
+B1601154546048N00621764EA0185901890
+B1601174546058N00621769EA0185801888
+B1601194546067N00621773EA0185701886
+B1601214546077N00621780EA0185501883
+B1601234546087N00621788EA0185301881
+B1601254546096N00621795EA0185101880
+B1601274546106N00621802EA0185101879
+B1601294546115N00621806EA0184901878
+B1601314546123N00621810EA0184401876
+B1601334546134N00621815EA0183801872
+B1601354546146N00621821EA0183501868
+B1601374546158N00621826EA0183501867
+B1601394546169N00621829EA0183301866
+B1601414546180N00621832EA0183101863
+B1601434546190N00621834EA0183001862
+B1601454546200N00621835EA0182901860
+B1601474546211N00621840EA0182601857
+B1601494546223N00621844EA0182501856
+B1601514546234N00621849EA0182501855
+B1601534546244N00621853EA0182501855
+B1601554546253N00621856EA0182301853
+B1601574546265N00621858EA0182201852
+B1601594546276N00621860EA0182301853
+B1602014546285N00621861EA0182301852
+B1602034546294N00621863EA0182101851
+B1602054546303N00621866EA0181901848
+B1602074546314N00621871EA0181701847
+B1602094546323N00621875EA0181501844
+B1602114546333N00621878EA0181201841
+B1602134546344N00621882EA0181001839
+B1602154546355N00621887EA0180901838
+B1602174546366N00621891EA0180701836
+B1602194546376N00621896EA0180501834
+B1602214546388N00621901EA0180501833
+B1602234546398N00621906EA0180401833
+B1602254546407N00621913EA0180301831
+B1602274546417N00621918EA0180001829
+B1602294546428N00621923EA0179901827
+B1602314546438N00621929EA0180001827
+B1602334546447N00621934EA0179801826
+B1602354546457N00621938EA0179601824
+B1602374546466N00621940EA0179601824
+B1602394546474N00621944EA0179601823
+B1602414546484N00621949EA0179401822
+B1602434546494N00621955EA0179501822
+B1602454546503N00621960EA0179601823
+B1602474546513N00621967EA0179701825
+B1602494546522N00621973EA0180101827
+B1602514546530N00621977EA0180401831
+B1602534546538N00621982EA0180801835
+B1602554546545N00621985EA0181001838
+B1602574546548N00621978EA0181001840
+B1602594546545N00621966EA0181101841
+B1603014546535N00621961EA0181301842
+B1603034546521N00621969EA0181501844
+B1603054546514N00621988EA0181601845
+B1603074546515N00622008EA0181701846
+B1603094546522N00622021EA0181801847
+B1603114546530N00622028EA0182001848
+B1603134546538N00622030EA0182001849
+B1603154546547N00622031EA0182301851
+B1603174546557N00622034EA0182901854
+B1603194546565N00622036EA0183301859
+B1603214546571N00622039EA0183601862
+B1603234546577N00622038EA0183601864
+B1603254546577N00622028EA0183601865
+B1603274546568N00622020EA0183701865
+B1603294546553N00622026EA0183701866
+B1603314546542N00622044EA0183701867
+B1603334546539N00622066EA0183701867
+B1603354546545N00622084EA0183801868
+B1603374546553N00622096EA0184001869
+B1603394546562N00622106EA0184201871
+B1603414546571N00622115EA0184401872
+B1603434546581N00622123EA0184601875
+B1603454546590N00622128EA0184901877
+B1603474546600N00622133EA0185201880
+B1603494546610N00622137EA0185601884
+B1603514546618N00622142EA0186001888
+B1603534546624N00622145EA0186201892
+B1603554546630N00622146EA0186301894
+B1603574546632N00622140EA0186401895
+B1603594546626N00622133EA0186501897
+B1604014546612N00622133EA0186601897
+B1604034546599N00622147EA0186501896
+B1604054546591N00622168EA0186601897
+B1604074546591N00622190EA0186801898
+B1604094546597N00622207EA0187101901
+B1604114546604N00622220EA0187401904
+B1604134546612N00622231EA0187701907
+B1604154546621N00622239EA0188001909
+B1604174546630N00622243EA0188201912
+B1604194546640N00622247EA0188501914
+B1604214546651N00622251EA0188901918
+B1604234546661N00622254EA0189301922
+B1604254546671N00622252EA0189801926
+B1604274546679N00622249EA0190301932
+B1604294546687N00622250EA0190601935
+B1604314546696N00622251EA0190901939
+B1604334546705N00622251EA0191401944
+B1604354546713N00622249EA0191901949
+B1604374546719N00622247EA0192501955
+B1604394546726N00622248EA0193201962
+B1604414546733N00622251EA0193901969
+B1604434546740N00622251EA0194701977
+B1604454546745N00622251EA0195301984
+B1604474546747N00622243EA0195701990
+B1604494546740N00622229EA0196101995
+B1604514546725N00622227EA0196802001
+B1604534546713N00622241EA0197302006
+B1604554546709N00622262EA0197902011
+B1604574546714N00622276EA0198502017
+B1604594546723N00622276EA0199002023
+B1605014546728N00622266EA0199802029
+B1605034546721N00622253EA0200402035
+B1605054546707N00622250EA0200902041
+B1605074546692N00622261EA0201402046
+B1605094546686N00622283EA0202002052
+B1605114546689N00622301EA0202702058
+B1605134546696N00622311EA0203302065
+B1605154546704N00622315EA0204002072
+B1605174546711N00622314EA0204802080
+B1605194546714N00622307EA0205402087
+B1605214546714N00622297EA0206202094
+B1605234546706N00622286EA0206802101
+B1605254546693N00622285EA0207302108
+B1605274546679N00622295EA0207802113
+B1605294546672N00622314EA0208202118
+B1605314546674N00622334EA0208902124
+B1605334546681N00622345EA0209602131
+B1605354546688N00622348EA0210202137
+B1605374546693N00622346EA0210902144
+B1605394546695N00622337EA0211402149
+B1605414546688N00622326EA0212002155
+B1605434546678N00622319EA0212702161
+B1605454546665N00622323EA0213102167
+B1605474546652N00622339EA0213602172
+B1605494546646N00622358EA0214202178
+B1605514546646N00622376EA0214702184
+B1605534546649N00622391EA0215102188
+B1605554546656N00622400EA0215302191
+B1605574546666N00622403EA0215602194
+B1605594546676N00622399EA0216302199
+B1606014546681N00622394EA0217102206
+B1606034546686N00622392EA0217802213
+B1606054546690N00622390EA0218202219
+B1606074546691N00622384EA0218502223
+B1606094546685N00622374EA0218702226
+B1606114546672N00622365EA0219002229
+B1606134546656N00622370EA0219502233
+B1606154546646N00622387EA0219902236
+B1606174546645N00622406EA0220302241
+B1606194546651N00622420EA0220802245
+B1606214546660N00622424EA0221302250
+B1606234546667N00622421EA0222002256
+B1606254546668N00622413EA0222402262
+B1606274546663N00622406EA0222602266
+B1606294546652N00622398EA0222802268
+B1606314546635N00622397EA0223302272
+B1606334546620N00622410EA0223602275
+B1606354546613N00622429EA0224002279
+B1606374546611N00622447EA0224402283
+B1606394546615N00622462EA0224702286
+B1606414546624N00622473EA0225002289
+B1606434546634N00622479EA0225602293
+B1606454546642N00622481EA0226302299
+B1606474546649N00622481EA0226902306
+B1606494546654N00622482EA0227502312
+B1606514546660N00622482EA0227802317
+B1606534546665N00622478EA0227602321
+B1606554546664N00622465EA0227002322
+B1606574546654N00622450EA0226902320
+B1606594546639N00622449EA0227102320
+B1607014546626N00622462EA0227102318
+B1607034546620N00622480EA0227102316
+B1607054546619N00622499EA0227202315
+B1607074546623N00622516EA0227502317
+B1607094546630N00622530EA0228002320
+B1607114546637N00622542EA0228402325
+B1607134546642N00622555EA0228902329
+B1607154546649N00622567EA0229402334
+B1607174546656N00622570EA0230002339
+B1607194546662N00622563EA0230302343
+B1607214546660N00622549EA0230502346
+B1607234546648N00622542EA0230702348
+B1607254546633N00622547EA0231002352
+B1607274546622N00622564EA0231302354
+B1607294546620N00622584EA0231602357
+B1607314546624N00622601EA0232002360
+B1607334546631N00622612EA0232402364
+B1607354546638N00622618EA0232802368
+B1607374546645N00622613EA0233102372
+B1607394546647N00622603EA0233302373
+B1607414546644N00622592EA0233602376
+B1607434546633N00622585EA0233702378
+B1607454546618N00622587EA0233802380
+B1607474546606N00622601EA0234202382
+B1607494546602N00622621EA0234502385
+B1607514546604N00622637EA0234702388
+B1607534546610N00622650EA0235002391
+B1607554546616N00622661EA0235402394
+B1607574546621N00622669EA0235702397
+B1607594546627N00622674EA0235802399
+B1608014546634N00622675EA0236002401
+B1608034546642N00622674EA0236102402
+B1608054546650N00622673EA0236102402
+B1608074546657N00622672EA0236202402
+B1608094546664N00622671EA0236202402
+B1608114546672N00622668EA0236302403
+B1608134546679N00622664EA0236702405
+B1608154546685N00622663EA0237202409
+B1608174546692N00622662EA0237702414
+B1608194546699N00622661EA0238002417
+B1608214546707N00622660EA0238302421
+B1608234546714N00622657EA0238702425
+B1608254546717N00622649EA0238802428
+B1608274546712N00622639EA0238802430
+B1608294546700N00622635EA0238702431
+B1608314546684N00622642EA0238902432
+B1608334546673N00622659EA0239302433
+B1608354546669N00622679EA0239702437
+B1608374546669N00622697EA0240102442
+B1608394546672N00622712EA0240502446
+B1608414546677N00622723EA0240902449
+B1608434546683N00622731EA0241102452
+B1608454546690N00622737EA0241402454
+B1608474546698N00622738EA0241502455
+B1608494546707N00622741EA0241502456
+B1608514546716N00622746EA0241502456
+B1608534546725N00622750EA0241302455
+B1608554546736N00622751EA0241302454
+B1608574546748N00622749EA0241602455
+B1608594546758N00622748EA0242302456
+B1609014546769N00622748EA0242802460
+B1609034546780N00622743EA0243202464
+B1609054546791N00622739EA0243902470
+B1609074546802N00622738EA0244602477
+B1609094546813N00622736EA0245002482
+B1609114546825N00622733EA0245602488
+B1609134546837N00622732EA0246402495
+B1609154546850N00622733EA0247502504
+B1609174546862N00622733EA0248402514
+B1609194546874N00622732EA0249302523
+B1609214546886N00622729EA0250102533
+B1609234546897N00622725EA0250702541
+B1609254546908N00622723EA0251202547
+B1609274546920N00622719EA0251402552
+B1609294546933N00622711EA0251702556
+B1609314546944N00622704EA0252002559
+B1609334546956N00622698EA0252302563
+B1609354546966N00622694EA0252802568
+B1609374546975N00622692EA0253102572
+B1609394546984N00622688EA0253202574
+B1609414546993N00622681EA0253302575
+B1609434547002N00622677EA0253302576
+B1609454547010N00622674EA0253302577
+B1609474547017N00622670EA0253202576
+B1609494547025N00622665EA0253002574
+B1609514547033N00622661EA0252702572
+B1609534547044N00622656EA0252302568
+B1609554547054N00622652EA0251902564
+B1609574547064N00622649EA0251602560
+B1609594547075N00622647EA0251202555
+B1610014547086N00622647EA0250702550
+B1610034547097N00622645EA0250402546
+B1610054547109N00622641EA0250402543
+B1610074547119N00622637EA0250402542
+B1610094547129N00622633EA0250202540
+B1610114547140N00622627EA0250502540
+B1610134547150N00622620EA0251102541
+B1610154547158N00622615EA0251502545
+B1610174547167N00622611EA0251702547
+B1610194547177N00622609EA0251802549
+B1610214547187N00622610EA0251802550
+B1610234547198N00622610EA0251902552
+B1610254547210N00622611EA0252202554
+B1610274547221N00622612EA0252702558
+B1610294547231N00622612EA0253202563
+B1610314547240N00622609EA0253602568
+B1610334547249N00622607EA0254202574
+B1610354547257N00622604EA0254502579
+B1610374547266N00622603EA0254402583
+B1610394547276N00622602EA0254402585
+B1610414547288N00622600EA0254602587
+B1610434547297N00622598EA0254802590
+B1610454547307N00622598EA0255002591
+B1610474547315N00622594EA0255202594
+B1610494547324N00622591EA0255602597
+B1610514547331N00622589EA0255802600
+B1610534547340N00622587EA0256202603
+B1610554547350N00622587EA0256902608
+B1610574547359N00622590EA0257602614
+B1610594547368N00622592EA0258002618
+B1611014547377N00622595EA0258402623
+B1611034547386N00622600EA0258702627
+B1611054547396N00622605EA0258902629
+B1611074547405N00622608EA0259202632
+B1611094547414N00622608EA0259402635
+B1611114547424N00622609EA0259702638
+B1611134547434N00622611EA0260002641
+B1611154547444N00622612EA0260502645
+B1611174547453N00622612EA0261002650
+B1611194547461N00622613EA0261202653
+B1611214547469N00622612EA0261002655
+B1611234547480N00622610EA0260802655
+B1611254547491N00622612EA0260902657
+B1611274547502N00622615EA0261402659
+B1611294547512N00622616EA0262002664
+B1611314547523N00622618EA0262602670
+B1611334547533N00622621EA0263302676
+B1611354547544N00622625EA0263702681
+B1611374547556N00622630EA0263802684
+B1611394547568N00622637EA0263902686
+B1611414547578N00622647EA0264302688
+B1611434547587N00622657EA0264602691
+B1611454547596N00622665EA0264802693
+B1611474547603N00622675EA0265002695
+B1611494547607N00622690EA0265102696
+B1611514547612N00622704EA0265302698
+B1611534547616N00622718EA0265402699
+B1611554547619N00622733EA0265602700
+B1611574547623N00622748EA0265702701
+B1611594547628N00622763EA0266002703
+B1612014547633N00622777EA0266202706
+B1612034547638N00622790EA0266202707
+B1612054547645N00622805EA0265902706
+B1612074547650N00622820EA0265802705
+B1612094547655N00622834EA0265602703
+B1612114547660N00622850EA0265002700
+B1612134547666N00622868EA0264302695
+B1612154547670N00622885EA0263702688
+B1612174547677N00622901EA0263302683
+B1612194547687N00622912EA0262802677
+B1612214547699N00622919EA0262302672
+B1612234547712N00622926EA0261702666
+B1612254547725N00622934EA0261102659
+B1612274547738N00622942EA0260502653
+B1612294547751N00622950EA0259902646
+B1612314547764N00622955EA0259402641
+B1612334547776N00622959EA0258802634
+B1612354547790N00622965EA0258202627
+B1612374547803N00622972EA0258002622
+B1612394547814N00622981EA0257702618
+B1612414547823N00622989EA0257302613
+B1612434547834N00622995EA0256802608
+B1612454547845N00623001EA0256502604
+B1612474547857N00623006EA0256402601
+B1612494547866N00623010EA0256902599
+B1612514547872N00623011EA0256702597
+B1612534547879N00623008EA0256002594
+B1612554547890N00623009EA0255302589
+B1612574547901N00623014EA0255302587
+B1612594547911N00623018EA0255502587
+B1613014547922N00623024EA0255702589
+B1613034547931N00623033EA0256202592
+B1613054547940N00623039EA0256902598
+B1613074547948N00623043EA0257502605
+B1613094547957N00623039EA0258002612
+B1613114547963N00623025EA0258302617
+B1613134547963N00623007EA0258502620
+B1613154547955N00622992EA0258902624
+B1613174547941N00622992EA0259402628
+B1613194547931N00623004EA0259802634
+B1613214547928N00623019EA0260202638
+B1613234547931N00623034EA0260702644
+B1613254547936N00623047EA0261202649
+B1613274547941N00623061EA0261702655
+B1613294547946N00623073EA0262102659
+B1613314547951N00623087EA0262402663
+B1613334547956N00623101EA0262702666
+B1613354547961N00623115EA0263002669
+B1613374547967N00623129EA0263402672
+B1613394547972N00623143EA0263702676
+B1613414547977N00623158EA0263902678
+B1613434547982N00623173EA0264002680
+B1613454547987N00623188EA0264102681
+B1613474547992N00623203EA0264102681
+B1613494547998N00623218EA0264002680
+B1613514548004N00623236EA0263902680
+B1613534548010N00623250EA0263702679
+B1613554548015N00623266EA0263102676
+B1613574548021N00623284EA0262502672
+B1613594548029N00623299EA0262102668
+B1614014548036N00623313EA0261702663
+B1614034548042N00623331EA0261202658
+B1614054548048N00623349EA0261002654
+B1614074548053N00623365EA0260602651
+B1614094548060N00623383EA0259802645
+B1614114548068N00623402EA0259302640
+B1614134548074N00623419EA0259202636
+B1614154548080N00623435EA0258902633
+B1614174548086N00623453EA0258502629
+B1614194548092N00623470EA0258302626
+B1614214548098N00623487EA0258102623
+B1614234548103N00623504EA0257802621
+B1614254548108N00623522EA0257702619
+B1614274548114N00623539EA0257602618
+B1614294548119N00623555EA0257402616
+B1614314548125N00623573EA0257402614
+B1614334548131N00623590EA0257302613
+B1614354548137N00623607EA0257202613
+B1614374548142N00623625EA0256902611
+B1614394548149N00623643EA0256602608
+B1614414548156N00623661EA0256502606
+B1614434548162N00623678EA0256302604
+B1614454548169N00623696EA0256002601
+B1614474548175N00623715EA0255802599
+B1614494548181N00623733EA0255602597
+B1614514548187N00623751EA0255302595
+B1614534548193N00623769EA0255102592
+B1614554548200N00623787EA0254902590
+B1614574548206N00623804EA0254702588
+B1614594548212N00623822EA0254302584
+B1615014548219N00623840EA0254102582
+B1615034548226N00623858EA0254002580
+B1615054548232N00623875EA0253802578
+B1615074548238N00623893EA0253602576
+B1615094548245N00623911EA0253402575
+B1615114548251N00623928EA0253202573
+B1615134548258N00623946EA0253002570
+B1615154548263N00623965EA0252702567
+B1615174548267N00623984EA0252402564
+B1615194548271N00624003EA0252102561
+B1615214548275N00624021EA0251902558
+B1615234548278N00624040EA0251702556
+B1615254548279N00624059EA0251602555
+B1615274548281N00624077EA0251502553
+B1615294548283N00624098EA0251102550
+B1615314548285N00624120EA0250902548
+B1615334548288N00624140EA0250902547
+B1615354548291N00624159EA0250802546
+B1615374548292N00624179EA0250602544
+B1615394548295N00624198EA0250402543
+B1615414548299N00624217EA0250302542
+B1615434548303N00624236EA0250202540
+B1615454548306N00624256EA0250102539
+B1615474548310N00624274EA0249802538
+B1615494548316N00624292EA0249702536
+B1615514548321N00624310EA0249402533
+B1615534548327N00624328EA0249102530
+B1615554548332N00624347EA0249002529
+B1615574548337N00624364EA0248802527
+B1615594548343N00624382EA0248602524
+B1616014548348N00624401EA0248402522
+B1616034548352N00624419EA0248202520
+B1616054548357N00624437EA0247902518
+B1616074548361N00624455EA0248002517
+B1616094548365N00624472EA0248102517
+B1616114548369N00624486EA0247902515
+B1616134548374N00624501EA0247702514
+B1616154548377N00624516EA0247702513
+B1616174548380N00624531EA0247302511
+B1616194548386N00624547EA0246902507
+B1616214548391N00624563EA0246702505
+B1616234548396N00624579EA0246402503
+B1616254548402N00624593EA0246102500
+B1616274548408N00624610EA0245702496
+B1616294548413N00624627EA0245602494
+B1616314548418N00624644EA0245402492
+B1616334548423N00624660EA0245202490
+B1616354548429N00624676EA0245102489
+B1616374548435N00624691EA0244902487
+B1616394548442N00624706EA0244602484
+B1616414548449N00624721EA0244402483
+B1616434548456N00624735EA0244202480
+B1616454548465N00624748EA0243802476
+B1616474548473N00624762EA0243502473
+B1616494548481N00624774EA0243202471
+B1616514548490N00624786EA0242802467
+B1616534548497N00624801EA0242402463
+B1616554548504N00624817EA0242002459
+B1616574548511N00624832EA0241902457
+B1616594548517N00624847EA0241702455
+B1617014548523N00624861EA0241502453
+B1617034548530N00624874EA0241302451
+B1617054548537N00624887EA0241102448
+B1617074548543N00624901EA0240902446
+B1617094548550N00624914EA0240602443
+B1617114548557N00624927EA0240302440
+B1617134548563N00624942EA0240002437
+B1617154548571N00624956EA0239602433
+B1617174548579N00624969EA0239302430
+B1617194548587N00624981EA0239102428
+B1617214548595N00624994EA0238802425
+B1617234548602N00625006EA0238502422
+B1617254548610N00625019EA0237902418
+B1617274548619N00625031EA0237502413
+B1617294548628N00625043EA0237102409
+B1617314548637N00625055EA0236602405
+B1617334548646N00625069EA0236202400
+B1617354548653N00625083EA0235902397
+B1617374548660N00625098EA0235502393
+B1617394548668N00625112EA0235102388
+B1617414548675N00625128EA0234902385
+B1617434548681N00625144EA0234802383
+B1617454548687N00625159EA0234802382
+B1617474548693N00625172EA0234502379
+B1617494548700N00625184EA0234202377
+B1617514548708N00625196EA0234002375
+B1617534548715N00625207EA0233702372
+B1617554548723N00625219EA0233402369
+B1617574548731N00625230EA0233102366
+B1617594548738N00625241EA0232802363
+B1618014548746N00625253EA0232602361
+B1618034548755N00625263EA0232402358
+B1618054548763N00625274EA0232602358
+B1618074548769N00625288EA0232602359
+B1618094548775N00625299EA0232302358
+B1618114548783N00625313EA0232102355
+B1618134548790N00625329EA0232002355
+B1618154548795N00625342EA0231902354
+B1618174548802N00625354EA0231602351
+B1618194548811N00625367EA0231302348
+B1618214548819N00625378EA0231102346
+B1618234548826N00625388EA0230902344
+B1618254548835N00625398EA0230702342
+B1618274548845N00625408EA0230602341
+B1618294548853N00625417EA0230402339
+B1618314548862N00625426EA0230102336
+B1618334548871N00625437EA0229902334
+B1618354548880N00625447EA0229902334
+B1618374548888N00625458EA0229802333
+B1618394548897N00625467EA0229602331
+B1618414548907N00625477EA0229302328
+B1618434548916N00625487EA0229202327
+B1618454548925N00625497EA0229102326
+B1618474548933N00625508EA0228902324
+B1618494548941N00625519EA0228802323
+B1618514548949N00625529EA0228502321
+B1618534548957N00625539EA0228202318
+B1618554548966N00625549EA0227902315
+B1618574548974N00625562EA0227702312
+B1618594548982N00625574EA0227502310
+B1619014548991N00625584EA0227402308
+B1619034548999N00625595EA0227202306
+B1619054549007N00625605EA0227002304
+B1619074549015N00625614EA0226702302
+B1619094549023N00625625EA0226402299
+B1619114549031N00625634EA0226202297
+B1619134549040N00625643EA0226002295
+B1619154549048N00625652EA0225802292
+B1619174549057N00625660EA0225402288
+B1619194549066N00625668EA0225102286
+B1619214549075N00625677EA0225002284
+B1619234549083N00625687EA0224802282
+B1619254549091N00625699EA0224602280
+B1619274549100N00625712EA0224402278
+B1619294549108N00625723EA0224302276
+B1619314549117N00625734EA0224002274
+B1619334549126N00625744EA0224002273
+B1619354549134N00625753EA0223802272
+B1619374549143N00625762EA0223802271
+B1619394549152N00625771EA0223702271
+B1619414549161N00625779EA0223702270
+B1619434549170N00625787EA0223702270
+B1619454549178N00625794EA0223702270
+B1619474549186N00625801EA0223802271
+B1619494549194N00625809EA0224002272
+B1619514549202N00625817EA0224002272
+B1619534549209N00625825EA0224302274
+B1619554549216N00625832EA0224502277
+B1619574549222N00625838EA0224502279
+B1619594549230N00625844EA0224302279
+B1620014549239N00625849EA0224102277
+B1620034549248N00625856EA0223902275
+B1620054549256N00625864EA0223702273
+B1620074549266N00625873EA0223502270
+B1620094549275N00625882EA0223302268
+B1620114549284N00625892EA0223102266
+B1620134549294N00625901EA0222902264
+B1620154549303N00625910EA0222802262
+B1620174549310N00625921EA0222602260
+B1620194549318N00625931EA0222102257
+B1620214549328N00625938EA0221602252
+B1620234549337N00625947EA0221302249
+B1620254549346N00625957EA0221002245
+B1620274549355N00625965EA0220702242
+B1620294549365N00625975EA0220502239
+B1620314549373N00625986EA0220302237
+B1620334549382N00625997EA0220102234
+B1620354549391N00626008EA0220002233
+B1620374549400N00626018EA0219802231
+B1620394549409N00626026EA0219602229
+B1620414549418N00626037EA0219402226
+B1620434549429N00626047EA0219302225
+B1620454549438N00626054EA0219302225
+B1620474549447N00626061EA0219002223
+B1620494549456N00626068EA0218802221
+B1620514549465N00626075EA0218602218
+B1620534549474N00626081EA0218302215
+B1620554549484N00626089EA0218002212
+B1620574549492N00626095EA0218102211
+B1620594549499N00626101EA0218002210
+B1621014549506N00626110EA0217602208
+B1621034549513N00626120EA0217302205
+B1621054549521N00626129EA0217302204
+B1621074549528N00626139EA0217302204
+B1621094549535N00626149EA0217102202
+B1621114549542N00626158EA0216902200
+B1621134549550N00626166EA0216502197
+B1621154549559N00626174EA0216202194
+B1621174549568N00626180EA0216102192
+B1621194549575N00626185EA0215802190
+B1621214549583N00626189EA0215502187
+B1621234549592N00626193EA0215202184
+B1621254549601N00626200EA0215002182
+B1621274549608N00626207EA0214702179
+B1621294549616N00626212EA0214102175
+B1621314549624N00626218EA0213602170
+B1621334549632N00626224EA0213302167
+B1621354549639N00626228EA0212902163
+B1621374549647N00626230EA0212402158
+B1621394549655N00626231EA0211902153
+B1621414549663N00626233EA0211402148
+B1621434549670N00626230EA0210902143
+B1621454549677N00626224EA0210502138
+B1621474549685N00626218EA0210402134
+B1621494549692N00626214EA0210302132
+B1621514549697N00626211EA0210502131
+B1621534549701N00626207EA0210702134
+B1621554549704N00626204EA0210702135
+B1621574549709N00626201EA0210702135
+B1621594549714N00626200EA0210702136
+B1622014549720N00626200EA0210902138
+B1622034549726N00626203EA0211002139
+B1622054549733N00626206EA0211202142
+B1622074549739N00626211EA0211402144
+B1622094549746N00626216EA0211402145
+B1622114549752N00626222EA0211602147
+B1622134549758N00626229EA0211702148
+B1622154549764N00626235EA0211602149
+B1622174549770N00626241EA0211602149
+B1622194549777N00626247EA0211702149
+B1622214549784N00626254EA0211802150
+B1622234549791N00626261EA0211902150
+B1622254549798N00626268EA0211902151
+B1622274549805N00626275EA0212002152
+B1622294549812N00626282EA0212202154
+B1622314549819N00626289EA0212402156
+B1622334549825N00626298EA0212702158
+B1622354549831N00626307EA0213002161
+B1622374549837N00626317EA0213302164
+B1622394549843N00626328EA0213602167
+B1622414549849N00626338EA0213802169
+B1622434549855N00626348EA0214002172
+B1622454549862N00626358EA0214302174
+B1622474549867N00626369EA0214602177
+B1622494549873N00626379EA0215102182
+B1622514549879N00626390EA0215502185
+B1622534549884N00626403EA0215802189
+B1622554549891N00626414EA0216102192
+B1622574549898N00626418EA0216502196
+B1622594549905N00626411EA0216602199
+B1623014549903N00626396EA0216902202
+B1623034549892N00626390EA0217302206
+B1623054549878N00626392EA0217402208
+B1623074549867N00626392EA0217602209
+B1623094549857N00626384EA0217602210
+B1623114549852N00626374EA0217802211
+B1623134549854N00626366EA0217702212
+B1623154549864N00626368EA0217602212
+B1623174549873N00626381EA0217702212
+B1623194549879N00626398EA0217902214
+B1623214549884N00626412EA0218102216
+B1623234549889N00626425EA0218202217
+B1623254549894N00626439EA0218602219
+B1623274549898N00626455EA0219102223
+B1623294549902N00626470EA0219602227
+B1623314549909N00626480EA0219702230
+B1623334549919N00626479EA0219802232
+B1623354549920N00626468EA0219702232
+B1623374549911N00626459EA0219502233
+B1623394549899N00626454EA0219502233
+B1623414549891N00626444EA0219502231
+B1623434549889N00626431EA0219702232
+B1623454549892N00626424EA0219702232
+B1623474549897N00626420EA0219602231
+B1623494549907N00626424EA0219302228
+B1623514549915N00626443EA0219102226
+B1623534549914N00626465EA0219202226
+B1623554549911N00626483EA0219202226
+B1623574549911N00626502EA0219002224
+B1623594549913N00626523EA0218802222
+B1624014549916N00626544EA0219102222
+B1624034549919N00626563EA0219602224
+B1624054549922N00626580EA0219902226
+B1624074549926N00626598EA0220002228
+B1624094549933N00626614EA0220202230
+B1624114549941N00626622EA0220402232
+B1624134549952N00626619EA0220302232
+B1624154549952N00626608EA0220402234
+B1624174549942N00626601EA0220502235
+B1624194549931N00626598EA0220602238
+B1624214549922N00626593EA0220802239
+B1624234549916N00626587EA0221102241
+B1624254549910N00626581EA0221202243
+B1624274549904N00626574EA0221302244
+B1624294549899N00626565EA0221502246
+B1624314549896N00626556EA0221802249
+B1624334549892N00626548EA0222002251
+B1624354549888N00626539EA0222102253
+B1624374549889N00626531EA0221902253
+B1624394549901N00626533EA0221602252
+B1624414549907N00626555EA0221602251
+B1624434549906N00626578EA0222102253
+B1624454549905N00626596EA0222502255
+B1624474549907N00626612EA0222702258
+B1624494549910N00626627EA0222802259
+B1624514549917N00626641EA0222702259
+B1624534549928N00626642EA0222602258
+B1624554549933N00626632EA0222502257
+B1624574549926N00626620EA0222602257
+B1624594549916N00626613EA0223102259
+B1625014549907N00626607EA0223402263
+B1625034549900N00626599EA0223602266
+B1625054549893N00626592EA0223702267
+B1625074549886N00626583EA0224002270
+B1625094549880N00626575EA0224202272
+B1625114549875N00626566EA0224302273
+B1625134549870N00626556EA0224302274
+B1625154549867N00626547EA0224302275
+B1625174549870N00626538EA0224202274
+B1625194549880N00626541EA0224202274
+B1625214549887N00626563EA0224502274
+B1625234549887N00626585EA0225102278
+B1625254549889N00626600EA0225302281
+B1625274549893N00626616EA0225502283
+B1625294549896N00626633EA0225802286
+B1625314549901N00626646EA0226002290
+B1625334549910N00626649EA0226002292
+B1625354549916N00626642EA0226102293
+B1625374549915N00626631EA0226302296
+B1625394549906N00626622EA0226502298
+B1625414549897N00626615EA0226802300
+B1625434549890N00626606EA0227102303
+B1625454549883N00626597EA0227402307
+B1625474549875N00626590EA0227702310
+B1625494549870N00626582EA0227702311
+B1625514549869N00626575EA0227602311
+B1625534549878N00626576EA0227502310
+B1625554549887N00626589EA0227502310
+B1625574549894N00626606EA0227702311
+B1625594549901N00626618EA0227802312
+B1626014549909N00626628EA0228002313
+B1626034549917N00626637EA0228202315
+B1626054549925N00626642EA0228302316
+B1626074549934N00626647EA0228402317
+B1626094549943N00626652EA0228502318
+B1626114549950N00626659EA0228402318
+B1626134549958N00626667EA0228302317
+B1626154549966N00626674EA0228202316
+B1626174549975N00626684EA0228102314
+B1626194549984N00626693EA0228202314
+B1626214549994N00626702EA0228202314
+B1626234550003N00626710EA0228202314
+B1626254550012N00626718EA0228102313
+B1626274550022N00626725EA0228102312
+B1626294550032N00626732EA0228202313
+B1626314550041N00626737EA0228402314
+B1626334550049N00626740EA0228502315
+B1626354550057N00626743EA0228502316
+B1626374550066N00626746EA0228402316
+B1626394550075N00626750EA0228102314
+B1626414550084N00626754EA0227902312
+B1626434550093N00626758EA0227602309
+B1626454550103N00626761EA0227302306
+B1626474550113N00626764EA0226902302
+B1626494550123N00626764EA0226702299
+B1626514550134N00626765EA0226602297
+B1626534550144N00626769EA0226602297
+B1626554550152N00626772EA0226502296
+B1626574550162N00626776EA0226102293
+B1626594550174N00626780EA0225902291
+B1627014550184N00626784EA0225902290
+B1627034550193N00626789EA0225702289
+B1627054550202N00626795EA0225402287
+B1627074550213N00626798EA0225102284
+B1627094550223N00626800EA0224902282
+B1627114550232N00626800EA0224602279
+B1627134550242N00626802EA0224302276
+B1627154550252N00626805EA0224002273
+B1627174550261N00626806EA0223602269
+B1627194550271N00626807EA0223202265
+B1627214550281N00626807EA0222802261
+B1627234550290N00626809EA0222302256
+B1627254550301N00626814EA0221702250
+B1627274550311N00626822EA0221302246
+B1627294550320N00626832EA0221102242
+B1627314550328N00626843EA0220702239
+B1627334550336N00626852EA0220402235
+B1627354550345N00626858EA0220102232
+B1627374550352N00626865EA0219702229
+B1627394550357N00626878EA0219302225
+B1627414550356N00626895EA0218902221
+B1627434550351N00626913EA0218702218
+B1627454550343N00626929EA0218602216
+B1627474550334N00626943EA0218502214
+B1627494550324N00626956EA0218402213
+B1627514550312N00626964EA0218302211
+B1627534550299N00626971EA0218202210
+B1627554550287N00626976EA0218102209
+B1627574550275N00626982EA0218002209
+B1627594550263N00626987EA0217802207
+B1628014550251N00626989EA0217602205
+B1628034550239N00626986EA0217402204
+B1628054550229N00626982EA0217302203
+B1628074550219N00626976EA0217102202
+B1628094550210N00626968EA0217102201
+B1628114550201N00626960EA0217302201
+B1628134550193N00626952EA0217702204
+B1628154550187N00626945EA0218002207
+B1628174550179N00626939EA0218202210
+B1628194550170N00626934EA0218402212
+B1628214550163N00626928EA0218602214
+B1628234550161N00626919EA0218602216
+B1628254550170N00626915EA0218602216
+B1628274550179N00626927EA0218402216
+B1628294550185N00626941EA0218402216
+B1628314550192N00626948EA0218202216
+B1628334550199N00626946EA0217802214
+B1628354550201N00626933EA0217502211
+B1628374550194N00626921EA0217302209
+B1628394550184N00626913EA0217202207
+B1628414550172N00626906EA0217202206
+B1628434550162N00626898EA0217302207
+B1628454550152N00626888EA0217202206
+B1628474550142N00626878EA0217002204
+B1628494550134N00626868EA0216902203
+B1628514550128N00626857EA0216802203
+B1628534550122N00626847EA0216702202
+B1628554550117N00626837EA0216502201
+B1628574550111N00626825EA0216402199
+B1628594550105N00626813EA0216302198
+B1629014550099N00626802EA0216302198
+B1629034550094N00626792EA0216402199
+B1629054550088N00626783EA0216602201
+B1629074550081N00626776EA0216802203
+B1629094550075N00626771EA0216902204
+B1629114550069N00626763EA0217102206
+B1629134550062N00626756EA0217302207
+B1629154550054N00626750EA0217402210
+B1629174550046N00626744EA0217502211
+B1629194550039N00626738EA0217702212
+B1629214550032N00626729EA0218002214
+B1629234550025N00626722EA0218402218
+B1629254550019N00626716EA0218802222
+B1629274550017N00626707EA0219202226
+B1629294550017N00626699EA0219502230
+B1629314550019N00626692EA0219702233
+B1629334550028N00626691EA0219702235
+B1629354550040N00626704EA0220102237
+B1629374550042N00626722EA0220502241
+B1629394550042N00626739EA0220602243
+B1629414550050N00626750EA0220402244
+B1629434550061N00626747EA0220202243
+B1629454550063N00626734EA0220102243
+B1629474550050N00626725EA0220102243
+B1629494550037N00626724EA0220402244
+B1629514550027N00626724EA0220802247
+B1629534550018N00626722EA0220902248
+B1629554550010N00626719EA0220902248
+B1629574550002N00626715EA0221002248
+B1629594549994N00626711EA0221202250
+B1630014549986N00626708EA0221402251
+B1630034549977N00626707EA0221502253
+B1630054549967N00626705EA0221602254
+B1630074549958N00626702EA0221702255
+B1630094549949N00626698EA0221902256
+B1630114549941N00626691EA0222002257
+B1630134549932N00626684EA0222202259
+B1630154549924N00626676EA0222702262
+B1630174549917N00626668EA0223002266
+B1630194549912N00626661EA0223202267
+B1630214549911N00626652EA0223102268
+B1630234549920N00626648EA0223102269
+B1630254549930N00626660EA0223102269
+B1630274549937N00626675EA0223202271
+B1630294549944N00626686EA0223402272
+B1630314549951N00626695EA0223502272
+B1630334549958N00626702EA0223402272
+B1630354549966N00626708EA0223402271
+B1630374549974N00626714EA0223402271
+B1630394549982N00626718EA0223402270
+B1630414549990N00626722EA0223402271
+B1630434549998N00626726EA0223402270
+B1630454550006N00626729EA0223302270
+B1630474550013N00626731EA0223102268
+B1630494550017N00626727EA0222802265
+B1630514550014N00626715EA0222502262
+B1630534550004N00626708EA0222502260
+B1630554549992N00626708EA0222702260
+B1630574549980N00626710EA0222702260
+B1630594549970N00626709EA0222802261
+B1631014549960N00626707EA0222902263
+B1631034549951N00626705EA0222802263
+B1631054549943N00626700EA0222802263
+B1631074549935N00626692EA0222802264
+B1631094549930N00626683EA0222702263
+B1631114549925N00626672EA0222602262
+B1631134549921N00626662EA0222502262
+B1631154549917N00626651EA0222502261
+B1631174549912N00626640EA0222502261
+B1631194549908N00626629EA0222702262
+B1631214549904N00626619EA0222602262
+B1631234549901N00626607EA0222602261
+B1631254549897N00626594EA0222502260
+B1631274549893N00626579EA0222502260
+B1631294549887N00626566EA0222602261
+B1631314549882N00626554EA0222702262
+B1631334549877N00626540EA0222802263
+B1631354549872N00626528EA0223002265
+B1631374549865N00626518EA0223202266
+B1631394549855N00626510EA0223302268
+B1631414549849N00626499EA0223402269
+B1631434549853N00626491EA0223602271
+B1631454549859N00626492EA0223802273
+B1631474549866N00626500EA0223902275
+B1631494549869N00626514EA0224102276
+B1631514549871N00626531EA0224302279
+B1631534549874N00626546EA0224602281
+B1631554549882N00626548EA0224702283
+B1631574549888N00626542EA0225102286
+B1631594549889N00626531EA0225502291
+B1632014549890N00626520EA0225902295
+B1632034549894N00626513EA0226102297
+B1632054549890N00626503EA0226002299
+B1632074549877N00626503EA0225802301
+B1632094549865N00626520EA0225702301
+B1632114549867N00626542EA0225602300
+B1632134549871N00626563EA0226102303
+B1632154549875N00626578EA0226602307
+B1632174549880N00626591EA0226802309
+B1632194549885N00626603EA0226902309
+B1632214549893N00626606EA0226702309
+B1632234549897N00626597EA0226502306
+B1632254549896N00626584EA0226502305
+B1632274549887N00626573EA0226602305
+B1632294549880N00626563EA0226702305
+B1632314549876N00626551EA0226702305
+B1632334549872N00626540EA0226902305
+B1632354549865N00626531EA0227002306
+B1632374549860N00626521EA0227002306
+B1632394549854N00626511EA0227202307
+B1632414549846N00626504EA0227102307
+B1632434549837N00626499EA0226802306
+B1632454549830N00626489EA0226202303
+B1632474549829N00626477EA0225802299
+B1632494549839N00626474EA0225602296
+B1632514549847N00626482EA0225502293
+B1632534549853N00626497EA0225602293
+B1632554549858N00626513EA0225702293
+B1632574549862N00626530EA0226002294
+B1632594549865N00626544EA0226402297
+B1633014549869N00626554EA0226702299
+B1633034549875N00626561EA0226802301
+B1633054549881N00626555EA0226702301
+B1633074549879N00626544EA0226902302
+B1633094549870N00626537EA0227102304
+B1633114549859N00626533EA0227402306
+B1633134549850N00626526EA0227702310
+B1633154549844N00626518EA0227602311
+B1633174549842N00626508EA0227202311
+B1633194549851N00626508EA0226902308
+B1633214549860N00626523EA0226802307
+B1633234549863N00626540EA0226902307
+B1633254549865N00626555EA0226802305
+B1633274549870N00626569EA0226702303
+B1633294549875N00626583EA0226702303
+B1633314549882N00626597EA0226802303
+B1633334549889N00626605EA0227002304
+B1633354549895N00626600EA0227002304
+B1633374549895N00626588EA0227002305
+B1633394549893N00626577EA0227102305
+B1633414549891N00626566EA0227102305
+B1633434549887N00626555EA0227102305
+B1633454549883N00626543EA0227202306
+B1633474549878N00626532EA0227102307
+B1633494549872N00626522EA0227002306
+B1633514549861N00626514EA0227002306
+B1633534549850N00626508EA0227002305
+B1633554549840N00626502EA0226902305
+B1633574549829N00626495EA0226802303
+B1633594549824N00626485EA0226502301
+B1634014549824N00626474EA0226302299
+B1634034549830N00626469EA0226302298
+B1634054549839N00626477EA0226302298
+B1634074549845N00626490EA0226202297
+B1634094549850N00626507EA0226202297
+B1634114549855N00626523EA0226102296
+B1634134549860N00626538EA0226102296
+B1634154549865N00626554EA0226002295
+B1634174549870N00626568EA0225902295
+B1634194549876N00626582EA0226002295
+B1634214549882N00626596EA0226302296
+B1634234549886N00626609EA0226702300
+B1634254549890N00626619EA0226802302
+B1634274549897N00626625EA0226702302
+B1634294549906N00626621EA0226402301
+B1634314549906N00626607EA0226402300
+B1634334549896N00626596EA0226502300
+B1634354549885N00626590EA0226802302
+B1634374549874N00626586EA0227002303
+B1634394549864N00626581EA0226902303
+B1634414549857N00626572EA0226802303
+B1634434549856N00626561EA0226802302
+B1634454549863N00626559EA0226702301
+B1634474549871N00626569EA0226702301
+B1634494549877N00626585EA0226902303
+B1634514549880N00626601EA0227102305
+B1634534549884N00626616EA0227402308
+B1634554549890N00626631EA0227702311
+B1634574549895N00626645EA0228002314
+B1634594549902N00626654EA0228002316
+B1635014549909N00626651EA0227702316
+B1635034549909N00626637EA0227602316
+B1635054549899N00626627EA0227702316
+B1635074549887N00626624EA0228102318
+B1635094549876N00626623EA0228102319
+B1635114549868N00626619EA0227802319
+B1635134549863N00626609EA0227702317
+B1635154549864N00626601EA0227802316
+B1635174549870N00626599EA0227802316
+B1635194549879N00626604EA0227902316
+B1635214549888N00626612EA0228102317
+B1635234549895N00626620EA0228302319
+B1635254549902N00626623EA0228302320
+B1635274549907N00626619EA0228302319
+B1635294549910N00626609EA0228302319
+B1635314549913N00626599EA0228202319
+B1635334549916N00626590EA0228202318
+B1635354549918N00626579EA0228102316
+B1635374549921N00626568EA0228002316
+B1635394549925N00626556EA0228002315
+B1635414549927N00626544EA0227802314
+B1635434549925N00626532EA0227702313
+B1635454549913N00626525EA0227302311
+B1635474549898N00626529EA0227102310
+B1635494549887N00626543EA0227002308
+B1635514549881N00626562EA0226802306
+B1635534549880N00626583EA0226802305
+B1635554549884N00626603EA0226902305
+B1635574549890N00626619EA0227102307
+B1635594549897N00626631EA0227302308
+B1636014549905N00626640EA0227302309
+B1636034549913N00626648EA0227402310
+B1636054549921N00626657EA0227502311
+B1636074549928N00626665EA0227702313
+B1636094549934N00626672EA0227702314
+B1636114549940N00626678EA0227602313
+B1636134549947N00626690EA0227502312
+B1636154549953N00626709EA0227402311
+B1636174549955N00626730EA0227302310
+B1636194549957N00626752EA0227202308
+B1636214549957N00626776EA0226902306
+B1636234549956N00626802EA0226802304
+B1636254549956N00626828EA0226702302
+B1636274549955N00626854EA0226802302
+B1636294549954N00626880EA0226802302
+B1636314549952N00626907EA0226802301
+B1636334549949N00626935EA0226602300
+B1636354549946N00626961EA0226202298
+B1636374549941N00626987EA0225402295
+B1636394549934N00627014EA0225002292
+B1636414549929N00627035EA0224602287
+B1636434549926N00627056EA0223502282
+B1636454549923N00627081EA0222402275
+B1636474549920N00627105EA0221702268
+B1636494549919N00627126EA0220802259
+B1636514549917N00627147EA0219802247
+B1636534549918N00627169EA0219002237
+B1636554549920N00627192EA0218202228
+B1636574549920N00627213EA0217402219
+B1636594549921N00627233EA0216802211
+B1637014549923N00627252EA0216102203
+B1637034549925N00627271EA0215302193
+B1637054549927N00627292EA0214802186
+B1637074549930N00627309EA0214502179
+B1637094549933N00627325EA0213802171
+B1637114549937N00627345EA0213402164
+B1637134549941N00627365EA0213102159
+B1637154549944N00627384EA0212602154
+B1637174549946N00627403EA0212102150
+B1637194549947N00627420EA0211602145
+B1637214549947N00627439EA0211102139
+B1637234549947N00627458EA0211002135
+B1637254549947N00627474EA0210802133
+B1637274549948N00627490EA0210502129
+B1637294549949N00627509EA0210202127
+B1637314549950N00627526EA0210202126
+B1637334549954N00627542EA0210002125
+B1637354549957N00627558EA0209602122
+B1637374549961N00627576EA0209402120
+B1637394549964N00627592EA0209102117
+B1637414549967N00627609EA0208702114
+B1637434549970N00627626EA0208302111
+B1637454549973N00627641EA0208002108
+B1637474549977N00627656EA0207502103
+B1637494549982N00627671EA0207202100
+B1637514549986N00627685EA0206902097
+B1637534549989N00627699EA0206502093
+B1637554549992N00627715EA0206002089
+B1637574549997N00627732EA0205702086
+B1637594550000N00627748EA0205502083
+B1638014550002N00627765EA0205102080
+B1638034550007N00627780EA0204802076
+B1638054550011N00627796EA0204302072
+B1638074550014N00627813EA0204002068
+B1638094550018N00627830EA0203902065
+B1638114550022N00627844EA0203702063
+B1638134550024N00627858EA0203402060
+B1638154550027N00627873EA0203102057
+B1638174550032N00627887EA0202902055
+B1638194550036N00627899EA0202502052
+B1638214550041N00627913EA0202102048
+B1638234550045N00627929EA0201902046
+B1638254550047N00627945EA0201802044
+B1638274550050N00627959EA0201502042
+B1638294550054N00627974EA0201102038
+B1638314550058N00627990EA0201002037
+B1638334550062N00628005EA0201002036
+B1638354550063N00628021EA0200702034
+B1638374550066N00628037EA0200402032
+B1638394550071N00628054EA0200402031
+B1638414550073N00628069EA0200302030
+B1638434550074N00628085EA0199902028
+B1638454550076N00628102EA0199702026
+B1638474550079N00628118EA0199702025
+B1638494550080N00628132EA0199702024
+B1638514550083N00628147EA0199402021
+B1638534550086N00628163EA0199102019
+B1638554550087N00628181EA0198902017
+B1638574550089N00628199EA0198502013
+B1638594550091N00628217EA0198202011
+B1639014550093N00628234EA0198002009
+B1639034550095N00628250EA0197802006
+B1639054550096N00628267EA0197402003
+B1639074550098N00628285EA0197202000
+B1639094550101N00628302EA0197001998
+B1639114550103N00628318EA0196701996
+B1639134550106N00628336EA0196501993
+B1639154550108N00628354EA0196301991
+B1639174550110N00628370EA0196001988
+B1639194550111N00628388EA0195601984
+B1639214550113N00628407EA0195201981
+B1639234550115N00628425EA0195001978
+B1639254550118N00628443EA0194701976
+B1639274550120N00628461EA0194401973
+B1639294550120N00628481EA0194301971
+B1639314550121N00628500EA0194101969
+B1639334550123N00628519EA0193901967
+B1639354550125N00628539EA0193701965
+B1639374550129N00628557EA0193801965
+B1639394550134N00628573EA0193901966
+B1639414550139N00628589EA0194001968
+B1639434550145N00628604EA0194101969
+B1639454550151N00628618EA0194301970
+B1639474550156N00628633EA0194401972
+B1639494550161N00628647EA0194601974
+B1639514550168N00628657EA0194601975
+B1639534550178N00628653EA0194301975
+B1639554550184N00628642EA0194301974
+B1639574550182N00628630EA0194501975
+B1639594550172N00628622EA0194501976
+B1640014550160N00628626EA0194601977
+B1640034550151N00628638EA0194701978
+B1640054550146N00628656EA0194901980
+B1640074550147N00628674EA0195001981
+B1640094550154N00628689EA0195101982
+B1640114550165N00628695EA0195201983
+B1640134550175N00628689EA0195201984
+B1640154550179N00628678EA0195201984
+B1640174550174N00628666EA0195301984
+B1640194550162N00628664EA0195301984
+B1640214550150N00628675EA0195301984
+B1640234550143N00628691EA0195501985
+B1640254550138N00628708EA0195501985
+B1640274550134N00628727EA0195501985
+B1640294550130N00628749EA0195801987
+B1640314550128N00628768EA0196001989
+B1640334550127N00628783EA0196001989
+B1640354550125N00628801EA0196001990
+B1640374550122N00628817EA0196301992
+B1640394550117N00628829EA0196301994
+B1640414550113N00628841EA0196401994
+B1640434550108N00628855EA0196401995
+B1640454550105N00628868EA0196701997
+B1640474550104N00628882EA0196801998
+B1640494550113N00628891EA0196701998
+B1640514550126N00628890EA0196701998
+B1640534550134N00628877EA0196801999
+B1640554550132N00628862EA0196902000
+B1640574550122N00628854EA0196902000
+B1640594550111N00628860EA0197002000
+B1641014550104N00628872EA0197302002
+B1641034550102N00628885EA0197502005
+B1641054550102N00628897EA0197502006
+B1641074550105N00628911EA0197402005
+B1641094550116N00628919EA0197402004
+B1641114550129N00628916EA0197502004
+B1641134550138N00628904EA0197602006
+B1641154550140N00628889EA0197702007
+B1641174550135N00628876EA0197702007
+B1641194550123N00628873EA0197702007
+B1641214550112N00628882EA0197802009
+B1641234550109N00628898EA0198002010
+B1641254550112N00628913EA0198002011
+B1641274550122N00628923EA0198102011
+B1641294550135N00628921EA0198202012
+B1641314550144N00628909EA0198202013
+B1641334550146N00628894EA0198402014
+B1641354550138N00628882EA0198602016
+B1641374550127N00628883EA0198802018
+B1641394550120N00628895EA0199002020
+B1641414550121N00628911EA0199002022
+B1641434550130N00628923EA0199002022
+B1641454550144N00628925EA0199102023
+B1641474550155N00628917EA0199202024
+B1641494550160N00628903EA0199402026
+B1641514550160N00628889EA0199502027
+B1641534550156N00628875EA0199502028
+B1641554550147N00628866EA0199502029
+B1641574550134N00628868EA0199602029
+B1641594550123N00628876EA0199702029
+B1642014550114N00628888EA0200002032
+B1642034550110N00628901EA0200302035
+B1642054550107N00628913EA0200402036
+B1642074550107N00628927EA0200302036
+B1642094550114N00628942EA0200202036
+B1642114550129N00628946EA0200202036
+B1642134550139N00628937EA0200202036
+B1642154550143N00628923EA0200302036
+B1642174550139N00628910EA0200502038
+B1642194550129N00628902EA0200702040
+B1642214550119N00628900EA0200902042
+B1642234550109N00628901EA0201102045
+B1642254550100N00628904EA0201302047
+B1642274550092N00628908EA0201202048
+B1642294550086N00628919EA0201102047
+B1642314550084N00628935EA0201102047
+B1642334550094N00628948EA0200902045
+B1642354550105N00628951EA0200802043
+B1642374550116N00628943EA0200702041
+B1642394550120N00628928EA0200702041
+B1642414550113N00628916EA0200802041
+B1642434550104N00628910EA0201002043
+B1642454550096N00628908EA0201102044
+B1642474550086N00628910EA0201102044
+B1642494550078N00628920EA0201202044
+B1642514550074N00628934EA0201102044
+B1642534550073N00628949EA0201002043
+B1642554550071N00628966EA0200902042
+B1642574550069N00628984EA0201002043
+B1642594550067N00628999EA0200902043
+B1643014550064N00629015EA0200602041
+B1643034550062N00629032EA0200502039
+B1643054550060N00629049EA0200402039
+B1643074550057N00629065EA0200202036
+B1643094550053N00629082EA0200102034
+B1643114550049N00629099EA0200102034
+B1643134550045N00629113EA0200002033
+B1643154550041N00629128EA0199702030
+B1643174550038N00629145EA0199502028
+B1643194550036N00629160EA0199402027
+B1643214550034N00629175EA0199202025
+B1643234550032N00629191EA0199102023
+B1643254550030N00629208EA0199002022
+B1643274550027N00629225EA0199102022
+B1643294550024N00629241EA0199102022
+B1643314550020N00629257EA0199002021
+B1643334550016N00629274EA0199202022
+B1643354550014N00629290EA0199702025
+B1643374550012N00629303EA0200002028
+B1643394550008N00629314EA0200202031
+B1643414550002N00629320EA0200102032
+B1643434549993N00629310EA0199802030
+B1643454549990N00629292EA0199702029
+B1643474549997N00629276EA0199702029
+B1643494550010N00629272EA0199802029
+B1643514550022N00629280EA0199802029
+B1643534550030N00629294EA0200002030
+B1643554550034N00629310EA0200402033
+B1643574550037N00629324EA0200702037
+B1643594550040N00629337EA0200902039
+B1644014550041N00629352EA0201102041
+B1644034550042N00629369EA0201402044
+B1644054550042N00629383EA0201702047
+B1644074550048N00629394EA0201702049
+B1644094550061N00629396EA0201702050
+B1644114550070N00629386EA0201802051
+B1644134550073N00629370EA0201702051
+B1644154550068N00629356EA0201802051
+B1644174550058N00629352EA0201802051
+B1644194550047N00629359EA0201902052
+B1644214550040N00629371EA0202302054
+B1644234550035N00629385EA0202702058
+B1644254550030N00629398EA0203002061
+B1644274550026N00629410EA0203302064
+B1644294550021N00629422EA0203602067
+B1644314550016N00629432EA0204002071
+B1644334550011N00629442EA0204302074
+B1644354550007N00629454EA0204702078
+B1644374550004N00629464EA0205002082
+B1644394550003N00629475EA0205202085
+B1644414550007N00629488EA0205302086
+B1644434550019N00629494EA0205502088
+B1644454550030N00629486EA0205602089
+B1644474550035N00629472EA0205802091
+B1644494550031N00629457EA0205902092
+B1644514550024N00629446EA0206202095
+B1644534550016N00629438EA0206502098
+B1644554550007N00629434EA0206802101
+B1644574549996N00629434EA0207202104
+B1644594549986N00629434EA0207602108
+B1645014549976N00629435EA0207902112
+B1645034549967N00629439EA0208302116
+B1645054549961N00629454EA0208502118
+B1645074549962N00629470EA0208602120
+B1645094549971N00629483EA0208802122
+B1645114549984N00629487EA0209102125
+B1645134549993N00629477EA0209202127
+B1645154549992N00629463EA0209402128
+B1645174549982N00629455EA0209602130
+B1645194549972N00629458EA0209802132
+B1645214549963N00629464EA0210002134
+B1645234549957N00629474EA0210102135
+B1645254549953N00629488EA0210102135
+B1645274549957N00629504EA0210202136
+B1645294549969N00629516EA0210402138
+B1645314549983N00629515EA0210602140
+B1645334549991N00629504EA0210702141
+B1645354549992N00629490EA0210802143
+B1645374549988N00629480EA0210902143
+B1645394549981N00629473EA0211002145
+B1645414549974N00629471EA0211102145
+B1645434549965N00629472EA0211202146
+B1645454549956N00629476EA0211202147
+B1645474549948N00629482EA0211102146
+B1645494549940N00629492EA0210802144
+B1645514549935N00629508EA0210902143
+B1645534549930N00629528EA0211302144
+B1645554549927N00629545EA0211402146
+B1645574549925N00629560EA0211102145
+B1645594549923N00629578EA0210702143
+B1646014549919N00629597EA0210502141
+B1646034549916N00629614EA0210502141
+B1646054549912N00629630EA0210302139
+B1646074549908N00629649EA0210102136
+B1646094549905N00629669EA0210202136
+B1646114549902N00629687EA0210102135
+B1646134549899N00629706EA0209902133
+B1646154549896N00629724EA0209902132
+B1646174549894N00629743EA0209802131
+B1646194549892N00629763EA0209802130
+B1646214549888N00629783EA0209902131
+B1646234549885N00629802EA0210102132
+B1646254549880N00629817EA0210002133
+B1646274549875N00629833EA0209802132
+B1646294549871N00629853EA0209602130
+B1646314549866N00629870EA0209502129
+B1646334549860N00629885EA0209202127
+B1646354549855N00629901EA0208702123
+B1646374549850N00629919EA0208502120
+B1646394549847N00629936EA0208002116
+B1646414549843N00629953EA0207602111
+B1646434549839N00629971EA0207402107
+B1646454549834N00629987EA0207202105
+B1646474549830N00630002EA0206802101
+B1646494549828N00630020EA0206402097
+B1646514549824N00630037EA0206002093
+B1646534549821N00630054EA0205702090
+B1646554549818N00630072EA0205402086
+B1646574549815N00630089EA0205102083
+B1646594549813N00630107EA0204802079
+B1647014549810N00630125EA0204302075
+B1647034549807N00630143EA0204102072
+B1647054549804N00630160EA0203802069
+B1647074549800N00630177EA0203402066
+B1647094549797N00630194EA0203102062
+B1647114549794N00630211EA0202902060
+B1647134549791N00630227EA0202702058
+B1647154549789N00630243EA0202402054
+B1647174549786N00630260EA0202202052
+B1647194549784N00630277EA0202102051
+B1647214549782N00630293EA0202002049
+B1647234549779N00630310EA0201902048
+B1647254549776N00630326EA0201902048
+B1647274549772N00630343EA0201802047
+B1647294549769N00630359EA0201602045
+B1647314549766N00630376EA0201402044
+B1647334549763N00630394EA0201402043
+B1647354549760N00630410EA0201202042
+B1647374549756N00630427EA0201102040
+B1647394549751N00630444EA0201002039
+B1647414549746N00630461EA0201002039
+B1647434549742N00630476EA0200902038
+B1647454549738N00630492EA0200802037
+B1647474549734N00630509EA0200602035
+B1647494549731N00630527EA0200502035
+B1647514549728N00630545EA0200502034
+B1647534549725N00630561EA0200402033
+B1647554549720N00630579EA0200202031
+B1647574549715N00630597EA0200102031
+B1647594549712N00630614EA0200102030
+B1648014549708N00630632EA0200002029
+B1648034549704N00630649EA0200102029
+B1648054549701N00630665EA0200002029
+B1648074549698N00630681EA0199802027
+B1648094549695N00630700EA0199502025
+B1648114549692N00630718EA0199502025
+B1648134549689N00630734EA0199502024
+B1648154549686N00630751EA0199302022
+B1648174549683N00630768EA0199202021
+B1648194549681N00630786EA0199102020
+B1648214549680N00630804EA0199002019
+B1648234549676N00630822EA0198802017
+B1648254549673N00630841EA0198702016
+B1648274549670N00630860EA0198602015
+B1648294549666N00630879EA0198602014
+B1648314549663N00630896EA0198302012
+B1648334549659N00630914EA0197802008
+B1648354549655N00630932EA0197202004
+B1648374549651N00630950EA0196801999
+B1648394549646N00630969EA0196401994
+B1648414549641N00630987EA0196001990
+B1648434549636N00631005EA0195801987
+B1648454549633N00631023EA0195501984
+B1648474549630N00631042EA0195101981
+B1648494549626N00631061EA0194801977
+B1648514549621N00631079EA0194401974
+B1648534549616N00631096EA0194001970
+B1648554549611N00631113EA0193501964
+B1648574549607N00631132EA0192901959
+B1648594549603N00631150EA0192401954
+B1649014549599N00631167EA0191901948
+B1649034549595N00631185EA0191301942
+B1649054549591N00631204EA0190801937
+B1649074549588N00631223EA0190401932
+B1649094549584N00631241EA0190001928
+B1649114549579N00631259EA0189701924
+B1649134549574N00631277EA0189201920
+B1649154549568N00631294EA0188901916
+B1649174549561N00631309EA0188501912
+B1649194549555N00631326EA0188101908
+B1649214549549N00631343EA0187601904
+B1649234549543N00631361EA0187301900
+B1649254549538N00631379EA0186901896
+B1649274549533N00631397EA0186601892
+B1649294549531N00631416EA0186201889
+B1649314549528N00631434EA0185801885
+B1649334549525N00631453EA0185401881
+B1649354549522N00631473EA0185201878
+B1649374549519N00631489EA0185001875
+B1649394549516N00631505EA0184601871
+B1649414549513N00631524EA0184401869
+B1649434549511N00631542EA0184301867
+B1649454549509N00631558EA0183901864
+B1649474549506N00631576EA0183601861
+B1649494549504N00631594EA0183301859
+B1649514549501N00631611EA0183101856
+B1649534549497N00631627EA0182701853
+B1649554549493N00631645EA0182301849
+B1649574549489N00631662EA0182001846
+B1649594549486N00631679EA0181801844
+B1650014549482N00631695EA0181401840
+B1650034549478N00631712EA0181001836
+B1650054549475N00631731EA0180801834
+B1650074549472N00631748EA0180701832
+B1650094549469N00631763EA0180301829
+B1650114549466N00631780EA0180001826
+B1650134549462N00631797EA0179901824
+B1650154549459N00631813EA0179701822
+B1650174549455N00631830EA0179401819
+B1650194549450N00631847EA0179101817
+B1650214549445N00631863EA0178701813
+B1650234549439N00631880EA0178301809
+B1650254549432N00631898EA0178001805
+B1650274549426N00631916EA0178001802
+B1650294549421N00631930EA0177801801
+B1650314549415N00631945EA0177401797
+B1650334549408N00631961EA0177101795
+B1650354549401N00631977EA0177001793
+B1650374549395N00631991EA0176701790
+B1650394549389N00632008EA0176301787
+B1650414549383N00632024EA0176201785
+B1650434549378N00632040EA0176001784
+B1650454549372N00632056EA0175701781
+B1650474549367N00632073EA0175601780
+B1650494549362N00632089EA0175401778
+B1650514549356N00632105EA0175201776
+B1650534549350N00632121EA0175001774
+B1650554549345N00632138EA0174801772
+B1650574549339N00632153EA0174501769
+B1650594549334N00632169EA0174101766
+B1651014549329N00632186EA0173801762
+B1651034549323N00632202EA0173501759
+B1651054549318N00632219EA0173201757
+B1651074549312N00632235EA0172901754
+B1651094549307N00632252EA0172501750
+B1651114549302N00632270EA0172201746
+B1651134549297N00632289EA0172001743
+B1651154549292N00632308EA0171801742
+B1651174549287N00632326EA0171801741
+B1651194549282N00632343EA0171701740
+B1651214549276N00632361EA0171501738
+B1651234549271N00632379EA0171501737
+B1651254549267N00632397EA0171401737
+B1651274549262N00632414EA0171301735
+B1651294549258N00632433EA0171101734
+B1651314549254N00632451EA0171001733
+B1651334549250N00632468EA0170801731
+B1651354549246N00632486EA0170601729
+B1651374549241N00632503EA0170401728
+B1651394549237N00632521EA0170301726
+B1651414549232N00632539EA0170101724
+B1651434549228N00632556EA0169901722
+B1651454549224N00632574EA0169701720
+B1651474549220N00632592EA0169501718
+B1651494549216N00632610EA0169301716
+B1651514549211N00632628EA0169001714
+B1651534549207N00632646EA0168901712
+B1651554549203N00632663EA0168501709
+B1651574549199N00632681EA0168201706
+B1651594549195N00632698EA0168001703
+B1652014549191N00632716EA0167801701
+B1652034549186N00632734EA0167501698
+B1652054549180N00632751EA0167301696
+B1652074549175N00632767EA0167101693
+B1652094549170N00632785EA0166701690
+B1652114549164N00632802EA0166501688
+B1652134549158N00632818EA0166301686
+B1652154549152N00632834EA0166101683
+B1652174549146N00632851EA0165801681
+B1652194549140N00632868EA0165501678
+B1652214549135N00632885EA0165301675
+B1652234549130N00632903EA0165001673
+B1652254549125N00632921EA0164701670
+B1652274549120N00632938EA0164301666
+B1652294549115N00632957EA0164001662
+B1652314549111N00632976EA0163801660
+B1652334549106N00632995EA0163701658
+B1652354549102N00633014EA0163301656
+B1652374549099N00633035EA0163101653
+B1652394549094N00633056EA0163001652
+B1652414549090N00633076EA0162901650
+B1652434549085N00633096EA0162701649
+B1652454549080N00633115EA0162601647
+B1652474549074N00633133EA0162301645
+B1652494549067N00633151EA0162101642
+B1652514549061N00633170EA0161801640
+B1652534549056N00633188EA0161401637
+B1652554549050N00633206EA0161101633
+B1652574549044N00633225EA0160801630
+B1652594549037N00633242EA0160401627
+B1653014549028N00633259EA0160101623
+B1653034549020N00633277EA0160001621
+B1653054549011N00633292EA0159801619
+B1653074549003N00633306EA0159501616
+B1653094548994N00633323EA0159301614
+B1653114548986N00633341EA0159301613
+B1653134548980N00633358EA0159201611
+B1653154548975N00633377EA0158901610
+B1653174548968N00633398EA0159001610
+B1653194548961N00633415EA0159401612
+B1653214548954N00633428EA0159601615
+B1653234548947N00633440EA0159601615
+B1653254548940N00633454EA0159301615
+B1653274548931N00633469EA0159101613
+B1653294548923N00633483EA0159001612
+B1653314548917N00633500EA0158701610
+B1653334548915N00633520EA0158501608
+B1653354548916N00633542EA0158201605
+B1653374548917N00633564EA0158001603
+B1653394548919N00633586EA0157801600
+B1653414548921N00633609EA0157701599
+B1653434548922N00633630EA0157601598
+B1653454548924N00633651EA0157501596
+B1653474548927N00633675EA0157501595
+B1653494548929N00633697EA0157901596
+B1653514548930N00633714EA0158201598
+B1653534548932N00633730EA0158301599
+B1653554548939N00633735EA0158201600
+B1653574548947N00633731EA0158301602
+B1653594548946N00633720EA0158401603
+B1654014548938N00633709EA0158501604
+B1654034548925N00633706EA0158701606
+B1654054548914N00633714EA0158601607
+B1654074548903N00633730EA0158601607
+B1654094548897N00633749EA0158901609
+B1654114548896N00633765EA0159301613
+B1654134548898N00633778EA0159701617
+B1654154548901N00633790EA0160101621
+B1654174548904N00633800EA0160301623
+B1654194548912N00633798EA0160201625
+B1654214548914N00633786EA0160401627
+B1654234548902N00633777EA0160501628
+B1654254548885N00633780EA0160901631
+B1654274548874N00633791EA0161401636
+B1654294548870N00633807EA0161601639
+B1654314548875N00633821EA0162001642
+B1654334548882N00633822EA0162101645
+B1654354548886N00633811EA0162301647
+B1654374548883N00633797EA0162701650
+B1654394548870N00633789EA0163001654
+B1654414548856N00633793EA0163401657
+B1654434548845N00633808EA0163601660
+B1654454548842N00633824EA0163901664
+B1654474548848N00633834EA0164101666
+B1654494548855N00633835EA0164401669
+B1654514548859N00633828EA0164701672
+B1654534548859N00633818EA0165001675
+B1654554548856N00633807EA0165301679
+B1654574548851N00633799EA0165301681
+B1654594548843N00633791EA0165401682
+B1655014548838N00633781EA0165301682
+B1655034548844N00633774EA0165301682
+B1655054548852N00633781EA0165501682
+B1655074548857N00633795EA0165501682
+B1655094548858N00633813EA0165501681
+B1655114548860N00633832EA0165501681
+B1655134548865N00633847EA0165501680
+B1655154548871N00633862EA0165501680
+B1655174548875N00633879EA0165701682
+B1655194548879N00633893EA0166001684
+B1655214548885N00633905EA0166301686
+B1655234548891N00633915EA0166501689
+B1655254548897N00633926EA0166801692
+B1655274548901N00633938EA0167001695
+B1655294548907N00633950EA0167101697
+B1655314548917N00633949EA0167301698
+B1655334548924N00633937EA0167701701
+B1655354548920N00633924EA0168001705
+B1655374548908N00633920EA0168301707
+B1655394548896N00633930EA0168701710
+B1655414548891N00633947EA0169101714
+B1655434548892N00633962EA0169401718
+B1655454548899N00633974EA0169701721
+B1655474548910N00633974EA0170101725
+B1655494548916N00633964EA0170501729
+B1655514548917N00633951EA0170801733
+B1655534548913N00633939EA0171201737
+B1655554548902N00633934EA0171301740
+B1655574548890N00633941EA0171401742
+B1655594548881N00633956EA0171901746
+B1656014548879N00633972EA0172401750
+B1656034548885N00633983EA0172701753
+B1656054548895N00633992EA0173001756
+B1656074548906N00633996EA0173401760
+B1656094548912N00633987EA0173701764
+B1656114548912N00633971EA0174001767
+B1656134548902N00633962EA0174301770
+B1656154548890N00633970EA0174601773
+B1656174548880N00633983EA0175401778
+B1656194548877N00633998EA0176001784
+B1656214548879N00634013EA0176301788
+B1656234548886N00634028EA0176401791
+B1656254548900N00634035EA0176901795
+B1656274548909N00634029EA0177301800
+B1656294548909N00634017EA0177801805
+B1656314548900N00634008EA0178201809
+B1656334548888N00634012EA0178601814
+B1656354548882N00634027EA0179201819
+B1656374548882N00634044EA0179501824
+B1656394548887N00634060EA0179901828
+B1656414548897N00634067EA0180401832
+B1656434548906N00634063EA0180701836
+B1656454548909N00634051EA0180901839
+B1656474548904N00634039EA0181201842
+B1656494548893N00634035EA0181601845
+B1656514548880N00634040EA0182101850
+B1656534548871N00634052EA0182601855
+B1656554548868N00634069EA0183001859
+B1656574548868N00634088EA0183401863
+B1656594548876N00634101EA0183701866
+B1657014548888N00634101EA0183801869
+B1657034548896N00634090EA0184101872
+B1657054548894N00634076EA0184401875
+B1657074548884N00634066EA0184701878
+B1657094548871N00634069EA0185101882
+B1657114548861N00634081EA0185501886
+B1657134548854N00634097EA0185801889
+B1657154548852N00634115EA0186001892
+B1657174548857N00634129EA0186101893
+B1657194548868N00634137EA0185801892
+B1657214548878N00634134EA0185501889
+B1657234548886N00634121EA0185401887
+B1657254548888N00634107EA0185601887
+B1657274548886N00634093EA0186001889
+B1657294548881N00634079EA0186701893
+B1657314548877N00634067EA0187201899
+B1657334548871N00634056EA0187401902
+B1657354548859N00634052EA0187501904
+B1657374548845N00634058EA0187801907
+B1657394548840N00634071EA0188001910
+B1657414548846N00634083EA0188401914
+B1657434548855N00634082EA0188901919
+B1657454548862N00634070EA0189301924
+B1657474548866N00634057EA0189801930
+B1657494548864N00634044EA0190201934
+B1657514548855N00634031EA0190601938
+B1657534548840N00634030EA0190901942
+B1657554548829N00634042EA0191201945
+B1657574548828N00634055EA0191301946
+B1657594548836N00634064EA0191501947
+B1658014548845N00634065EA0191901950
+B1658034548851N00634057EA0192201953
+B1658054548853N00634043EA0192501955
+B1658074548847N00634029EA0192801957
+B1658094548836N00634020EA0193101960
+B1658114548823N00634018EA0193501964
+B1658134548812N00634025EA0193901967
+B1658154548805N00634037EA0194101970
+B1658174548806N00634051EA0194401973
+B1658194548814N00634060EA0194801977
+B1658214548822N00634054EA0195201981
+B1658234548825N00634042EA0195401984
+B1658254548822N00634028EA0195701986
+B1658274548812N00634016EA0196001989
+B1658294548799N00634012EA0196301992
+B1658314548786N00634015EA0196601995
+B1658334548777N00634025EA0196901998
+B1658354548773N00634040EA0197202001
+B1658374548776N00634052EA0197502004
+B1658394548784N00634056EA0197802007
+B1658414548790N00634051EA0198102010
+B1658434548793N00634038EA0198202012
+B1658454548789N00634024EA0198502014
+B1658474548776N00634013EA0198802016
+B1658494548762N00634012EA0199102020
+B1658514548750N00634018EA0199502024
+B1658534548742N00634030EA0199702027
+B1658554548740N00634043EA0200002029
+B1658574548744N00634054EA0200102030
+B1658594548751N00634057EA0200402033
+B1659014548759N00634049EA0200602035
+B1659034548762N00634035EA0200802037
+B1659054548760N00634020EA0201202040
+B1659074548752N00634008EA0201502042
+B1659094548736N00634004EA0201902046
+B1659114548722N00634009EA0202302051
+B1659134548713N00634020EA0202502056
+B1659154548709N00634034EA0202702058
+B1659174548709N00634048EA0202802060
+B1659194548719N00634058EA0202902062
+B1659214548730N00634060EA0203402065
+B1659234548735N00634053EA0203602069
+B1659254548736N00634039EA0203802071
+B1659274548730N00634022EA0204102074
+B1659294548714N00634010EA0204702077
+B1659314548700N00634012EA0204902081
+B1659334548689N00634023EA0205302084
+B1659354548684N00634038EA0205502088
+B1659374548686N00634052EA0205702090
+B1659394548694N00634058EA0206002093
+B1659414548701N00634056EA0206302096
+B1659434548707N00634048EA0206702100
+B1659454548710N00634036EA0207102104
+B1659474548712N00634025EA0207502108
+B1659494548715N00634013EA0207902112
+B1659514548715N00634000EA0208302115
+B1659534548709N00633989EA0208402119
+B1659554548694N00633988EA0208602122
+B1659574548683N00633998EA0208902125
+B1659594548678N00634013EA0209402128
+B1700014548681N00634026EA0209702131
+B1700034548687N00634034EA0210102135
+B1700054548696N00634038EA0210602139
+B1700074548705N00634035EA0211002144
+B1700094548711N00634026EA0211402148
+B1700114548712N00634013EA0211802152
+B1700134548708N00634000EA0212102156
+B1700154548700N00633993EA0212402159
+B1700174548687N00633995EA0212902163
+B1700194548676N00634006EA0213202167
+B1700214548667N00634019EA0213502170
+B1700234548661N00634033EA0213902173
+B1700254548660N00634050EA0214402177
+B1700274548663N00634065EA0214902182
+B1700294548667N00634075EA0215402187
+B1700314548674N00634079EA0215702191
+B1700334548682N00634071EA0216002195
+B1700354548684N00634060EA0216402199
+B1700374548680N00634048EA0216702202
+B1700394548668N00634044EA0217102205
+B1700414548657N00634049EA0217502209
+B1700434548648N00634062EA0217902214
+B1700454548644N00634077EA0218302218
+B1700474548642N00634091EA0218702222
+B1700494548642N00634101EA0218902225
+B1700514548647N00634106EA0218802226
+B1700534548653N00634106EA0218902226
+B1700554548658N00634100EA0219202227
+B1700574548661N00634089EA0219602229
+B1700594548660N00634078EA0220002233
+B1701014548653N00634068EA0220302236
+B1701034548642N00634063EA0220602239
+B1701054548629N00634066EA0220802241
+B1701074548618N00634075EA0221402245
+B1701094548608N00634088EA0221902250
+B1701114548601N00634100EA0222302255
+B1701134548598N00634111EA0222402258
+B1701154548602N00634121EA0222502259
+B1701174548612N00634121EA0222802262
+B1701194548618N00634113EA0223302265
+B1701214548620N00634100EA0223802270
+B1701234548617N00634087EA0224402275
+B1701254548607N00634078EA0224802280
+B1701274548593N00634083EA0225202285
+B1701294548587N00634099EA0225502290
+B1701314548591N00634112EA0225802294
+B1701334548600N00634118EA0226302299
+B1701354548609N00634117EA0226902305
+B1701374548617N00634112EA0227402311
+B1701394548621N00634103EA0227902316
+B1701414548621N00634091EA0228402321
+B1701434548614N00634081EA0228802325
+B1701454548599N00634079EA0229102329
+B1701474548587N00634089EA0229502332
+B1701494548581N00634104EA0229802336
+B1701514548581N00634120EA0230102339
+B1701534548585N00634135EA0230702344
+B1701554548594N00634141EA0231302350
+B1701574548604N00634136EA0232002355
+B1701594548611N00634127EA0232802363
+B1702014548614N00634116EA0233402370
+B1702034548609N00634102EA0233802376
+B1702054548596N00634094EA0234102381
+B1702074548582N00634101EA0234402384
+B1702094548574N00634117EA0234902389
+B1702114548572N00634135EA0235602394
+B1702134548573N00634151EA0236202400
+B1702154548578N00634164EA0236902407
+B1702174548585N00634172EA0237502414
+B1702194548592N00634174EA0238002418
+B1702214548600N00634167EA0238602424
+B1702234548601N00634150EA0239102429
+B1702254548592N00634140EA0239602434
+B1702274548579N00634144EA0240102440
+B1702294548570N00634156EA0240702445
+B1702314548564N00634172EA0241402452
+B1702334548562N00634189EA0242002458
+B1702354548566N00634202EA0242602465
+B1702374548574N00634204EA0243002469
+B1702394548582N00634198EA0243502473
+B1702414548586N00634190EA0244102479
+B1702434548583N00634178EA0244502484
+B1702454548574N00634167EA0245002489
+B1702474548563N00634163EA0245402494
+B1702494548551N00634167EA0245802498
+B1702514548539N00634176EA0246402504
+B1702534548533N00634190EA0246902508
+B1702554548535N00634205EA0247402513
+B1702574548540N00634216EA0248002519
+B1702594548545N00634222EA0248602525
+B1703014548552N00634219EA0249102531
+B1703034548556N00634207EA0249702537
+B1703054548552N00634192EA0250302543
+B1703074548538N00634187EA0250802548
+B1703094548524N00634193EA0251402555
+B1703114548515N00634209EA0251902561
+B1703134548512N00634226EA0252702568
+B1703154548512N00634238EA0253402575
+B1703174548519N00634242EA0253802580
+B1703194548526N00634235EA0254402585
+B1703214548527N00634221EA0255202591
+B1703234548519N00634208EA0255702597
+B1703254548508N00634202EA0256402603
+B1703274548494N00634205EA0256902610
+B1703294548483N00634216EA0257302614
+B1703314548477N00634234EA0257902619
+B1703334548476N00634251EA0258402625
+B1703354548478N00634266EA0258702629
+B1703374548480N00634281EA0258902633
+B1703394548483N00634297EA0259102635
+B1703414548485N00634313EA0259402638
+B1703434548487N00634329EA0259502639
+B1703454548489N00634345EA0259602640
+B1703474548490N00634362EA0259702641
+B1703494548490N00634378EA0259602641
+B1703514548491N00634394EA0259302640
+B1703534548491N00634414EA0259502639
+B1703554548489N00634434EA0259902639
+B1703574548488N00634452EA0260202642
+B1703594548486N00634468EA0260602644
+B1704014548483N00634487EA0261002647
+B1704034548477N00634503EA0261402651
+B1704054548473N00634518EA0261502654
+B1704074548471N00634535EA0261702655
+B1704094548472N00634551EA0261902658
+B1704114548473N00634567EA0262002660
+B1704134548474N00634583EA0262002661
+B1704154548476N00634601EA0262202663
+B1704174548476N00634617EA0262402665
+B1704194548477N00634632EA0262402665
+B1704214548476N00634650EA0262302664
+B1704234548476N00634669EA0262402665
+B1704254548476N00634687EA0262402666
+B1704274548477N00634704EA0262402666
+B1704294548478N00634723EA0262402666
+B1704314548479N00634741EA0262202665
+B1704334548481N00634758EA0261902663
+B1704354548483N00634778EA0261802662
+B1704374548486N00634796EA0261602660
+B1704394548490N00634812EA0261202657
+B1704414548492N00634831EA0261002653
+B1704434548494N00634852EA0261002652
+B1704454548495N00634870EA0260802650
+B1704474548496N00634888EA0260402647
+B1704494548500N00634908EA0260102643
+B1704514548505N00634927EA0260102641
+B1704534548510N00634945EA0260202640
+B1704554548516N00634962EA0260702641
+B1704574548523N00634977EA0261202644
+B1704594548529N00634992EA0261502648
+B1705014548536N00635007EA0261802650
+B1705034548545N00635025EA0262002654
+B1705054548553N00635042EA0262402658
+B1705074548561N00635058EA0262902662
+B1705094548570N00635072EA0263202666
+B1705114548577N00635086EA0263602671
+B1705134548584N00635101EA0264102675
+B1705154548592N00635116EA0264702681
+B1705174548600N00635131EA0265302687
+B1705194548607N00635147EA0265902694
+B1705214548614N00635163EA0266402699
+B1705234548622N00635180EA0266802704
+B1705254548631N00635197EA0267502710
+B1705274548641N00635212EA0268102717
+B1705294548650N00635226EA0268602723
+B1705314548658N00635239EA0268802729
+B1705334548668N00635251EA0268802733
+B1705354548679N00635265EA0268902735
+B1705374548691N00635278EA0269102737
+B1705394548701N00635289EA0269002738
+B1705414548712N00635303EA0269002738
+B1705434548722N00635317EA0269202739
+B1705454548729N00635331EA0269102740
+B1705474548733N00635346EA0268802739
+B1705494548737N00635364EA0268502736
+B1705514548740N00635384EA0268502734
+B1705534548740N00635403EA0268602733
+B1705554548740N00635420EA0268302731
+B1705574548741N00635437EA0268102729
+B1705594548741N00635455EA0268002727
+B1706014548741N00635472EA0268102726
+B1706034548742N00635486EA0268102726
+B1706054548745N00635499EA0267802725
+B1706074548748N00635514EA0267602722
+B1706094548751N00635530EA0267502721
+B1706114548757N00635542EA0267102718
+B1706134548765N00635554EA0266702713
+B1706154548773N00635566EA0266402709
+B1706174548780N00635579EA0266102706
+B1706194548788N00635592EA0265902703
+B1706214548796N00635605EA0265602700
+B1706234548801N00635620EA0265302696
+B1706254548805N00635636EA0265002693
+B1706274548809N00635652EA0264702690
+B1706294548812N00635668EA0264402687
+B1706314548814N00635685EA0264102684
+B1706334548816N00635701EA0263702680
+B1706354548819N00635718EA0263402677
+B1706374548821N00635735EA0263202674
+B1706394548824N00635751EA0263002672
+B1706414548826N00635767EA0262802669
+B1706434548828N00635783EA0262602667
+B1706454548830N00635800EA0262402665
+B1706474548831N00635817EA0262102663
+B1706494548833N00635834EA0261902661
+B1706514548836N00635850EA0261802659
+B1706534548838N00635866EA0261602657
+B1706554548841N00635881EA0261402655
+B1706574548845N00635896EA0261102652
+B1706594548847N00635912EA0261002650
+B1707014548849N00635927EA0260802648
+B1707034548850N00635942EA0260402645
+B1707054548850N00635959EA0260102641
+B1707074548851N00635975EA0259902639
+B1707094548854N00635991EA0259702637
+B1707114548857N00636006EA0259602636
+B1707134548862N00636021EA0259302633
+B1707154548867N00636035EA0259002631
+B1707174548872N00636050EA0258802628
+B1707194548877N00636065EA0258702627
+B1707214548882N00636080EA0258502625
+B1707234548888N00636095EA0258402623
+B1707254548893N00636111EA0258302622
+B1707274548898N00636126EA0258202621
+B1707294548903N00636141EA0257902619
+B1707314548908N00636156EA0257702616
+B1707334548914N00636172EA0257602615
+B1707354548919N00636188EA0257502614
+B1707374548924N00636203EA0257402613
+B1707394548929N00636218EA0257202611
+B1707414548934N00636234EA0257002609
+B1707434548939N00636249EA0256802607
+B1707454548944N00636264EA0256602605
+B1707474548949N00636280EA0256402603
+B1707494548954N00636296EA0256202601
+B1707514548960N00636311EA0256002599
+B1707534548965N00636326EA0255702597
+B1707554548969N00636342EA0255502594
+B1707574548973N00636359EA0255302592
+B1707594548977N00636374EA0255202591
+B1708014548980N00636390EA0255002589
+B1708034548983N00636406EA0254802587
+B1708054548986N00636422EA0254602585
+B1708074548989N00636438EA0254502583
+B1708094548993N00636454EA0254302582
+B1708114548996N00636470EA0254202580
+B1708134549000N00636486EA0254102579
+B1708154549003N00636503EA0253902577
+B1708174549006N00636519EA0253702575
+B1708194549009N00636536EA0253502573
+B1708214549012N00636553EA0253402572
+B1708234549015N00636570EA0253202570
+B1708254549019N00636586EA0253102569
+B1708274549023N00636602EA0252902567
+B1708294549027N00636618EA0252802566
+B1708314549031N00636635EA0252602564
+B1708334549035N00636651EA0252402562
+B1708354549039N00636667EA0252302561
+B1708374549043N00636683EA0252102559
+B1708394549046N00636698EA0251802557
+B1708414549049N00636715EA0251602554
+B1708434549053N00636733EA0251602552
+B1708454549055N00636750EA0251402551
+B1708474549057N00636766EA0251102549
+B1708494549058N00636783EA0250902547
+B1708514549058N00636801EA0250802545
+B1708534549058N00636817EA0250602543
+B1708554549058N00636833EA0250302540
+B1708574549059N00636849EA0250102537
+B1708594549062N00636866EA0249902535
+B1709014549064N00636882EA0249802533
+B1709034549068N00636898EA0249602531
+B1709054549071N00636914EA0249402530
+B1709074549075N00636930EA0249302528
+B1709094549078N00636946EA0249002526
+B1709114549081N00636962EA0248802523
+B1709134549084N00636979EA0248602522
+B1709154549087N00636995EA0248502520
+B1709174549090N00637012EA0248202518
+B1709194549092N00637029EA0248002516
+B1709214549094N00637046EA0247902514
+B1709234549097N00637062EA0247702513
+B1709254549100N00637079EA0247502511
+B1709274549103N00637096EA0247302508
+B1709294549106N00637113EA0247102506
+B1709314549110N00637129EA0246802504
+B1709334549114N00637145EA0246602502
+B1709354549119N00637162EA0246402499
+B1709374549123N00637179EA0246202497
+B1709394549127N00637195EA0245902495
+B1709414549131N00637213EA0245702493
+B1709434549134N00637230EA0245502490
+B1709454549136N00637248EA0245202488
+B1709474549138N00637265EA0244902485
+B1709494549139N00637283EA0244602483
+B1709514549138N00637301EA0244402480
+B1709534549139N00637318EA0244202478
+B1709554549140N00637336EA0243902475
+B1709574549142N00637353EA0243702473
+B1709594549146N00637370EA0243502470
+B1710014549150N00637387EA0243202468
+B1710034549154N00637404EA0243002466
+B1710054549158N00637420EA0242802463
+B1710074549162N00637437EA0242602462
+B1710094549167N00637453EA0242402459
+B1710114549171N00637470EA0242102456
+B1710134549176N00637487EA0241802454
+B1710154549181N00637503EA0241602451
+B1710174549186N00637520EA0241402449
+B1710194549192N00637536EA0241102447
+B1710214549196N00637552EA0240902444
+B1710234549202N00637568EA0240602441
+B1710254549207N00637585EA0240302438
+B1710274549211N00637602EA0240002436
+B1710294549215N00637619EA0239802433
+B1710314549219N00637635EA0239502430
+B1710334549224N00637652EA0239302428
+B1710354549228N00637669EA0239002425
+B1710374549232N00637686EA0238802423
+B1710394549236N00637702EA0238602421
+B1710414549240N00637719EA0238402419
+B1710434549244N00637735EA0238202417
+B1710454549247N00637751EA0237902414
+B1710474549251N00637767EA0237602411
+B1710494549255N00637783EA0237402409
+B1710514549258N00637799EA0237102407
+B1710534549262N00637815EA0236802403
+B1710554549266N00637832EA0236602401
+B1710574549271N00637847EA0236402399
+B1710594549275N00637862EA0236002396
+B1711014549279N00637879EA0235602392
+B1711034549284N00637895EA0235302389
+B1711054549288N00637911EA0235002385
+B1711074549294N00637927EA0234702382
+B1711094549299N00637943EA0234502379
+B1711114549303N00637959EA0234202376
+B1711134549307N00637975EA0233802373
+B1711154549310N00637992EA0233502370
+B1711174549314N00638008EA0233202366
+B1711194549318N00638025EA0232802363
+B1711214549321N00638041EA0232502360
+B1711234549325N00638058EA0232302357
+B1711254549328N00638074EA0232002355
+B1711274549330N00638090EA0231602351
+B1711294549335N00638107EA0231302348
+B1711314549339N00638125EA0230902344
+B1711334549342N00638142EA0230702342
+B1711354549346N00638159EA0230402339
+B1711374549349N00638177EA0230102335
+B1711394549353N00638194EA0229902333
+B1711414549356N00638211EA0229702331
+B1711434549358N00638229EA0229402328
+B1711454549361N00638247EA0229102325
+B1711474549364N00638264EA0229002323
+B1711494549367N00638282EA0228802321
+B1711514549369N00638299EA0228502319
+B1711534549372N00638317EA0228202316
+B1711554549375N00638335EA0228002314
+B1711574549378N00638353EA0227802312
+B1711594549380N00638371EA0227602310
+B1712014549382N00638389EA0227402308
+B1712034549382N00638408EA0227302306
+B1712054549383N00638427EA0227202305
+B1712074549384N00638444EA0227002303
+B1712094549385N00638463EA0226702301
+B1712114549386N00638482EA0226502298
+B1712134549388N00638501EA0226402297
+B1712154549389N00638519EA0226202295
+B1712174549392N00638537EA0225902292
+B1712194549395N00638555EA0225602290
+B1712214549399N00638573EA0225402288
+B1712234549401N00638591EA0225202285
+B1712254549404N00638609EA0224902283
+B1712274549406N00638626EA0224602280
+B1712294549408N00638644EA0224202277
+B1712314549410N00638662EA0224002274
+B1712334549411N00638681EA0223802271
+B1712354549412N00638699EA0223602269
+B1712374549413N00638717EA0223402267
+B1712394549415N00638735EA0223202265
+B1712414549416N00638752EA0223002263
+B1712434549418N00638770EA0222802261
+B1712454549420N00638788EA0222602259
+B1712474549423N00638807EA0222402258
+B1712494549425N00638824EA0222302256
+B1712514549428N00638842EA0222102254
+B1712534549431N00638860EA0222002252
+B1712554549432N00638878EA0221802251
+B1712574549434N00638896EA0221602249
+B1712594549436N00638914EA0221402247
+B1713014549439N00638933EA0221202245
+B1713034549442N00638951EA0221102244
+B1713054549444N00638969EA0220802242
+B1713074549447N00638987EA0220502239
+B1713094549450N00639005EA0220302236
+B1713114549452N00639025EA0220302235
+B1713134549455N00639041EA0220202234
+B1713154549458N00639057EA0220102232
+B1713174549461N00639073EA0220002232
+B1713194549464N00639089EA0219902231
+B1713214549467N00639104EA0219702229
+B1713234549470N00639120EA0219502227
+B1713254549473N00639136EA0219302226
+B1713274549476N00639151EA0219002223
+B1713294549479N00639168EA0218802221
+B1713314549482N00639185EA0218802220
+B1713334549484N00639202EA0218802219
+B1713354549486N00639219EA0218602218
+B1713374549488N00639237EA0218402216
+B1713394549490N00639255EA0218302214
+B1713414549491N00639272EA0218202213
+B1713434549493N00639289EA0218002212
+B1713454549495N00639305EA0217702209
+B1713474549498N00639322EA0217502207
+B1713494549501N00639338EA0217402206
+B1713514549504N00639354EA0217202204
+B1713534549507N00639369EA0217102203
+B1713554549511N00639385EA0217002202
+B1713574549513N00639401EA0216802200
+B1713594549516N00639417EA0216602198
+B1714014549519N00639434EA0216502197
+B1714034549522N00639451EA0216502197
+B1714054549526N00639467EA0216402196
+B1714074549529N00639483EA0216202194
+B1714094549533N00639500EA0216102193
+B1714114549537N00639515EA0215902192
+B1714134549541N00639530EA0215702190
+B1714154549545N00639547EA0215702189
+B1714174549549N00639564EA0215702188
+B1714194549552N00639580EA0215502187
+B1714214549555N00639597EA0215302185
+B1714234549559N00639616EA0215302184
+B1714254549562N00639634EA0215202184
+B1714274549564N00639650EA0215002182
+B1714294549567N00639668EA0214702180
+B1714314549571N00639685EA0214602178
+B1714334549575N00639702EA0214402177
+B1714354549579N00639718EA0214202174
+B1714374549583N00639735EA0214002172
+B1714394549588N00639751EA0213802170
+B1714414549594N00639767EA0213602169
+B1714434549599N00639782EA0213302166
+B1714454549604N00639798EA0213002163
+B1714474549610N00639814EA0212802160
+B1714494549615N00639830EA0212502158
+B1714514549620N00639845EA0212202155
+B1714534549625N00639861EA0212002152
+B1714554549630N00639876EA0211802150
+B1714574549634N00639891EA0211402147
+B1714594549638N00639907EA0211002143
+B1715014549643N00639923EA0210802140
+B1715034549648N00639938EA0210602138
+B1715054549652N00639953EA0210402135
+B1715074549657N00639968EA0210202133
+B1715094549661N00639984EA0210102131
+B1715114549667N00639999EA0209902130
+B1715134549672N00640013EA0209602128
+B1715154549678N00640027EA0209202124
+B1715174549685N00640043EA0209002122
+B1715194549691N00640057EA0208902120
+B1715214549697N00640071EA0208602117
+B1715234549703N00640086EA0208402114
+B1715254549710N00640101EA0208302113
+B1715274549716N00640115EA0208102112
+B1715294549723N00640130EA0207902110
+B1715314549728N00640145EA0207802108
+B1715334549734N00640160EA0207602106
+B1715354549739N00640176EA0207402104
+B1715374549744N00640192EA0207302102
+B1715394549748N00640209EA0207202101
+B1715414549752N00640225EA0207002100
+B1715434549755N00640242EA0206902099
+B1715454549759N00640259EA0206802098
+B1715474549762N00640277EA0206702097
+B1715494549764N00640295EA0206702096
+B1715514549766N00640313EA0206602095
+B1715534549767N00640331EA0206402095
+B1715554549767N00640349EA0206302093
+B1715574549768N00640367EA0206202091
+B1715594549769N00640386EA0206102091
+B1716014549769N00640403EA0205902090
+B1716034549770N00640421EA0205702088
+B1716054549771N00640440EA0205602087
+B1716074549772N00640458EA0205602086
+B1716094549774N00640476EA0205302084
+B1716114549775N00640494EA0205002082
+B1716134549778N00640512EA0204902080
+B1716154549781N00640529EA0204702078
+B1716174549783N00640547EA0204502076
+B1716194549787N00640564EA0204302074
+B1716214549793N00640580EA0204202073
+B1716234549799N00640595EA0204002071
+B1716254549806N00640610EA0203802069
+B1716274549814N00640625EA0203602067
+B1716294549821N00640639EA0203402065
+B1716314549827N00640654EA0203102062
+B1716334549833N00640670EA0202902060
+B1716354549839N00640687EA0202702058
+B1716374549845N00640703EA0202502056
+B1716394549851N00640719EA0202202053
+B1716414549858N00640735EA0201902051
+B1716434549865N00640750EA0201802048
+B1716454549872N00640765EA0201502046
+B1716474549880N00640780EA0201202043
+B1716494549888N00640794EA0200902040
+B1716514549897N00640808EA0200702038
+B1716534549906N00640821EA0200402035
+B1716554549916N00640833EA0200102032
+B1716574549926N00640845EA0200002030
+B1716594549936N00640857EA0199802029
+B1717014549946N00640868EA0199402026
+B1717034549956N00640879EA0199102023
+B1717054549965N00640893EA0199002020
+B1717074549973N00640906EA0198802019
+B1717094549982N00640919EA0198502017
+B1717114549991N00640932EA0198302014
+B1717134550000N00640944EA0198202012
+B1717154550010N00640956EA0198302011
+B1717174550019N00640969EA0198402012
+B1717194550027N00640982EA0198402013
+B1717214550033N00640993EA0198302013
+B1717234550040N00641003EA0198102012
+B1717254550048N00641015EA0197902010
+B1717274550055N00641026EA0197702008
+B1717294550063N00641037EA0197502006
+B1717314550071N00641048EA0197302004
+B1717334550079N00641060EA0197202003
+B1717354550085N00641071EA0197002001
+B1717374550093N00641081EA0196801999
+B1717394550102N00641092EA0196801998
+B1717414550110N00641102EA0196601997
+B1717434550118N00641112EA0196501996
+B1717454550127N00641120EA0196601995
+B1717474550135N00641128EA0196501995
+B1717494550143N00641135EA0196401994
+B1717514550152N00641139EA0196201992
+B1717534550159N00641131EA0195901990
+B1717554550161N00641116EA0195601988
+B1717574550154N00641102EA0195501986
+B1717594550144N00641095EA0195401984
+B1718014550134N00641090EA0195301983
+B1718034550126N00641082EA0195201981
+B1718054550117N00641073EA0195101981
+B1718074550108N00641067EA0194901980
+B1718094550098N00641059EA0194701978
+B1718114550089N00641049EA0194601977
+B1718134550081N00641039EA0194601977
+B1718154550074N00641029EA0194401975
+B1718174550066N00641019EA0194101972
+B1718194550061N00641005EA0194001970
+B1718214550059N00640990EA0193801968
+B1718234550058N00640975EA0193501965
+B1718254550060N00640959EA0193201962
+B1718274550061N00640943EA0193101959
+B1718294550065N00640928EA0193001958
+B1718314550070N00640915EA0193001958
+B1718334550073N00640902EA0192901957
+B1718354550074N00640889EA0192901957
+B1718374550075N00640877EA0192901957
+B1718394550073N00640864EA0192801956
+B1718414550069N00640851EA0192501954
+B1718434550067N00640837EA0192301952
+B1718454550065N00640823EA0192101949
+B1718474550062N00640809EA0191801946
+B1718494550060N00640793EA0191501943
+B1718514550058N00640777EA0191501941
+B1718534550055N00640760EA0191601941
+B1718554550053N00640743EA0191601941
+B1718574550050N00640729EA0191501941
+B1718594550046N00640715EA0191201940
+B1719014550042N00640702EA0190801937
+B1719034550038N00640688EA0190401934
+B1719054550034N00640672EA0190101930
+B1719074550031N00640656EA0189701926
+B1719094550027N00640641EA0189501923
+B1719114550024N00640626EA0189201919
+B1719134550021N00640610EA0189001917
+B1719154550020N00640593EA0189001915
+B1719174550020N00640578EA0189101915
+B1719194550021N00640564EA0189101915
+B1719214550023N00640549EA0189001915
+B1719234550025N00640534EA0189001915
+B1719254550026N00640519EA0188901914
+B1719274550028N00640504EA0188701912
+B1719294550030N00640487EA0188501911
+B1719314550031N00640472EA0188301909
+B1719334550032N00640456EA0188001907
+B1719354550033N00640440EA0187901905
+B1719374550033N00640424EA0187701903
+B1719394550034N00640408EA0187401900
+B1719414550035N00640391EA0187301898
+B1719434550036N00640376EA0187101897
+B1719454550038N00640362EA0186601895
+B1719474550039N00640346EA0186101891
+B1719494550040N00640328EA0185801887
+B1719514550040N00640311EA0185501884
+B1719534550040N00640295EA0185101880
+B1719554550041N00640278EA0184801876
+B1719574550041N00640261EA0184301873
+B1719594550042N00640245EA0184001869
+B1720014550041N00640229EA0183601865
+B1720034550040N00640213EA0183101861
+B1720054550039N00640198EA0182601856
+B1720074550036N00640181EA0182301852
+B1720094550034N00640165EA0181901848
+B1720114550033N00640151EA0181401843
+B1720134550033N00640134EA0181001839
+B1720154550032N00640117EA0180701835
+B1720174550032N00640102EA0180301832
+B1720194550034N00640087EA0179801827
+B1720214550036N00640070EA0179401823
+B1720234550038N00640054EA0179101819
+B1720254550040N00640039EA0178601815
+B1720274550043N00640022EA0178101809
+B1720294550045N00640005EA0177901806
+B1720314550046N00639989EA0177501802
+B1720334550046N00639973EA0177101798
+B1720354550047N00639956EA0177001794
+B1720374550049N00639939EA0176901792
+B1720394550051N00639923EA0176801791
+B1720414550054N00639907EA0176701790
+B1720434550057N00639892EA0176501789
+B1720454550060N00639876EA0176301788
+B1720474550062N00639859EA0176001785
+B1720494550066N00639843EA0175701783
+B1720514550069N00639827EA0175301779
+B1720534550072N00639810EA0175101776
+B1720554550075N00639793EA0174901775
+B1720574550078N00639778EA0174601772
+B1720594550081N00639762EA0174401769
+B1721014550084N00639744EA0174301767
+B1721034550088N00639728EA0174201766
+B1721054550091N00639712EA0174201766
+B1721074550095N00639697EA0174201766
+B1721094550100N00639682EA0174301767
+B1721114550105N00639668EA0174201767
+B1721134550110N00639654EA0174101766
+B1721154550116N00639639EA0174101765
+B1721174550121N00639626EA0174101766
+B1721194550126N00639612EA0173901765
+B1721214550131N00639597EA0173601764
+B1721234550136N00639582EA0173501762
+B1721254550143N00639568EA0173401761
+B1721274550151N00639555EA0173401760
+B1721294550158N00639543EA0173301760
+B1721314550166N00639531EA0173301759
+B1721334550175N00639521EA0173401759
+B1721354550183N00639511EA0173601761
+B1721374550190N00639503EA0173501761
+B1721394550197N00639495EA0173301761
+B1721414550204N00639484EA0172901759
+B1721434550211N00639471EA0172601756
+B1721454550218N00639457EA0172401753
+B1721474550225N00639444EA0172301752
+B1721494550231N00639431EA0172201751
+B1721514550238N00639418EA0172101749
+B1721534550244N00639405EA0171901747
+B1721554550250N00639393EA0171801746
+B1721574550255N00639380EA0171601744
+B1721594550260N00639366EA0171501742
+B1722014550263N00639351EA0171401740
+B1722034550267N00639336EA0171201738
+B1722054550270N00639320EA0171001737
+B1722074550273N00639305EA0170901735
+B1722094550276N00639289EA0170601733
+B1722114550280N00639274EA0170301730
+B1722134550286N00639259EA0170101728
+B1722154550293N00639246EA0170101726
+B1722174550301N00639236EA0169901725
+B1722194550309N00639228EA0169701723
+B1722214550319N00639221EA0169401719
+B1722234550330N00639215EA0169301718
+B1722254550339N00639210EA0169101717
+B1722274550349N00639205EA0169001715
+B1722294550360N00639200EA0169101714
+B1722314550370N00639197EA0169101715
+B1722334550379N00639196EA0169001714
+B1722354550389N00639192EA0168901713
+B1722374550399N00639187EA0168901712
+B1722394550411N00639188EA0168901712
+B1722414550421N00639190EA0169201713
+B1722434550429N00639191EA0169301714
+B1722454550435N00639198EA0169101715
+B1722474550439N00639211EA0169101715
+B1722494550444N00639224EA0169201715
+B1722514550449N00639236EA0169101715
+B1722534550454N00639251EA0169101714
+B1722554550457N00639267EA0169101714
+B1722574550460N00639283EA0169201715
+B1722594550464N00639295EA0169201715
+B1723014550468N00639304EA0169001715
+B1723034550475N00639311EA0169001714
+B1723054550482N00639318EA0169201715
+B1723074550488N00639325EA0169101715
+B1723094550494N00639333EA0169001714
+B1723114550500N00639341EA0168801713
+B1723134550507N00639350EA0168801712
+B1723154550514N00639360EA0168901712
+B1723174550519N00639369EA0168801712
+B1723194550524N00639376EA0168701711
+B1723214550531N00639382EA0168501710
+B1723234550538N00639388EA0168401709
+B1723254550544N00639393EA0168301708
+B1723274550551N00639396EA0168201707
+B1723294550559N00639399EA0168201706
+B1723314550566N00639400EA0168101705
+B1723334550573N00639398EA0167901703
+B1723354550581N00639394EA0167801702
+B1723374550589N00639390EA0167801702
+B1723394550596N00639385EA0167601702
+B1723414550603N00639380EA0167401700
+B1723434550611N00639373EA0167201699
+B1723454550618N00639366EA0167201699
+B1723474550624N00639359EA0167001698
+B1723494550634N00639346EA0166801697
+B1723524550641N00639337EA0166901697
+B1723544550648N00639330EA0166701696
+B1723564550655N00639323EA0166601694
+B1723584550664N00639316EA0166501694
+B1724004550671N00639310EA0166501694
+B1724024550677N00639302EA0166401693
+B1724044550684N00639294EA0166301692
+B1724064550691N00639289EA0166201691
+B1724084550697N00639282EA0166101690
+B1724104550703N00639274EA0166001689
+B1724124550709N00639266EA0165901688
+B1724144550716N00639259EA0165701687
+B1724164550722N00639252EA0165501685
+B1724184550729N00639243EA0165401683
+B1724204550736N00639233EA0165401682
+B1724224550742N00639225EA0165401683
+B1724244550748N00639218EA0165401683
+B1724264550754N00639210EA0165201681
+B1724284550762N00639203EA0165101680
+B1724304550768N00639196EA0164901678
+B1724324550774N00639188EA0164601676
+B1724344550780N00639182EA0164301672
+B1724364550787N00639175EA0163901669
+B1724384550793N00639168EA0163601666
+B1724404550800N00639160EA0163401663
+B1724424550806N00639151EA0163201661
+B1724444550812N00639144EA0162901658
+B1724464550817N00639135EA0162501654
+B1724484550823N00639125EA0162201651
+B1724504550829N00639116EA0162001649
+B1724524550833N00639108EA0161701645
+B1724544550839N00639098EA0161401642
+B1724564550846N00639090EA0161101640
+B1724584550851N00639081EA0160801638
+B1725004550855N00639071EA0160401635
+B1725024550861N00639061EA0160101632
+B1725044550865N00639051EA0159801628
+B1725064550870N00639040EA0159501625
+B1725084550874N00639028EA0159101622
+B1725104550877N00639017EA0158801618
+B1725124550881N00639005EA0158201614
+B1725144550885N00638992EA0157601610
+B1725164550888N00638977EA0157101605
+B1725184550889N00638961EA0156501599
+B1725204550890N00638944EA0156101594
+B1725224550892N00638929EA0155701589
+B1725244550893N00638913EA0155401585
+B1725264550894N00638898EA0155101580
+B1725284550895N00638882EA0154701575
+B1725304550895N00638865EA0154401572
+B1725324550893N00638848EA0154101568
+B1725344550892N00638833EA0153801565
+B1725364550892N00638818EA0153501561
+B1725384550893N00638803EA0153201558
+B1725404550892N00638787EA0152901555
+B1725424550892N00638771EA0152601552
+B1725444550892N00638755EA0152501550
+B1725464550892N00638739EA0152201547
+B1725484550892N00638723EA0151901544
+B1725504550893N00638706EA0151601541
+B1725524550894N00638690EA0151601539
+B1725544550895N00638674EA0151301537
+B1725564550898N00638659EA0151101535
+B1725584550902N00638645EA0151001533
+B1726004550906N00638633EA0150901532
+B1726024550911N00638621EA0150601530
+B1726044550916N00638609EA0150301527
+B1726064550921N00638598EA0150001524
+B1726084550926N00638586EA0149601521
+B1726104550931N00638572EA0149401519
+B1726124550935N00638559EA0149101518
+B1726144550939N00638546EA0148901517
+B1726164550942N00638533EA0148601514
+B1726184550945N00638518EA0148401512
+B1726204550949N00638505EA0148201510
+B1726224550952N00638494EA0148001507
+B1726244550956N00638482EA0147501504
+B1726264550961N00638469EA0147201500
+B1726284550966N00638455EA0147101497
+B1726304550970N00638443EA0147001495
+B1726324550973N00638430EA0146701493
+B1726344550978N00638417EA0146501490
+B1726364550983N00638404EA0146401488
+B1726384550987N00638393EA0146201486
+B1726404550992N00638381EA0146001483
+B1726424550998N00638370EA0145801480
+B1726444551004N00638361EA0145601478
+B1726464551010N00638351EA0145301476
+B1726484551016N00638340EA0145001473
+B1726504551022N00638330EA0144801471
+B1726524551028N00638320EA0144601468
+B1726544551034N00638311EA0144301466
+B1726564551040N00638300EA0143901462
+B1726584551046N00638288EA0143901461
+B1727004551052N00638277EA0143701460
+B1727024551058N00638266EA0143501457
+B1727044551065N00638254EA0143301457
+B1727064551071N00638243EA0143101455
+B1727084551076N00638232EA0142901453
+B1727104551081N00638220EA0142601450
+B1727124551087N00638208EA0142301448
+B1727144551093N00638197EA0142001445
+B1727164551099N00638185EA0141701442
+B1727184551105N00638174EA0141501438
+B1727204551112N00638163EA0141201436
+B1727224551118N00638151EA0141001434
+B1727244551124N00638140EA0140601431
+B1727264551130N00638127EA0140301428
+B1727284551136N00638115EA0140101426
+B1727304551142N00638102EA0139901425
+B1727324551147N00638090EA0139601424
+B1727344551153N00638077EA0139301422
+B1727364551159N00638064EA0139001422
+B1727384551164N00638050EA0138701421
+B1727404551169N00638037EA0138301419
+B1727424551176N00638025EA0138001417
+B1727444551181N00638012EA0137701415
+B1727464551188N00638000EA0137301411
+B1727484551194N00637990EA0137001406
+B1727504551200N00637979EA0136501401
+B1727524551207N00637967EA0136201396
+B1727544551215N00637955EA0136001393
+B1727564551222N00637945EA0135801391
+B1727584551229N00637935EA0135401388
+B1728004551237N00637924EA0135201385
+B1728024551245N00637914EA0135101383
+B1728044551251N00637905EA0134801380
+B1728064551259N00637896EA0134601378
+B1728084551267N00637886EA0134401376
+B1728104551274N00637876EA0134001373
+B1728124551282N00637866EA0133701369
+B1728144551290N00637856EA0133501366
+B1728164551298N00637847EA0133301363
+B1728184551306N00637837EA0132901359
+B1728204551315N00637826EA0132701356
+B1728224551323N00637816EA0132501353
+B1728244551331N00637807EA0132101349
+B1728264551339N00637796EA0131901346
+B1728284551347N00637784EA0131801344
+B1728304551353N00637773EA0131601342
+B1728324551361N00637763EA0131301339
+B1728344551369N00637753EA0131001337
+B1728364551377N00637745EA0130901335
+B1728384551385N00637737EA0130601333
+B1728404551393N00637727EA0130401330
+B1728424551400N00637717EA0130101327
+B1728444551408N00637706EA0129801324
+B1728464551417N00637696EA0129701321
+B1728484551425N00637689EA0129501319
+B1728504551433N00637681EA0129201317
+B1728524551442N00637672EA0128901313
+B1728544551450N00637662EA0128701311
+B1728564551458N00637651EA0128401309
+B1728584551466N00637639EA0128201307
+B1729004551473N00637628EA0128001306
+B1729024551481N00637617EA0127701304
+B1729044551490N00637609EA0127401300
+B1729064551499N00637603EA0127201297
+B1729084551508N00637599EA0127001294
+B1729104551517N00637594EA0126701291
+B1729124551526N00637587EA0126401287
+B1729144551534N00637579EA0126101285
+B1729164551542N00637570EA0125801282
+B1729184551551N00637561EA0125401278
+B1729204551560N00637551EA0125201275
+B1729224551569N00637542EA0125101273
+B1729244551577N00637536EA0124801270
+B1729264551587N00637529EA0124701267
+B1729284551596N00637525EA0124501266
+B1729304551605N00637520EA0124101264
+B1729324551616N00637516EA0124001261
+B1729344551626N00637511EA0124101261
+B1729364551634N00637506EA0124101260
+B1729384551643N00637500EA0124001258
+B1729404551653N00637497EA0123901257
+B1729424551662N00637496EA0123801255
+B1729444551671N00637497EA0123701254
+B1729464551680N00637499EA0123701253
+B1729484551688N00637499EA0123501252
+B1729504551697N00637499EA0123301250
+B1729524551707N00637500EA0123101248
+B1729544551716N00637502EA0123001246
+B1729564551724N00637505EA0122701244
+B1729584551732N00637498EA0122001241
+B1730004551733N00637477EA0121501237
+B1730024551727N00637458EA0121901234
+B1730044551723N00637448EA0121401232
+B1730064551715N00637431EA0120601226
+B1730084551703N00637413EA0120701223
+B1730104551695N00637401EA0120801221
+B1730124551690N00637388EA0120301217
+B1730144551683N00637371EA0119801213
+B1730164551674N00637354EA0119901212
+B1730184551667N00637340EA0119701210
+B1730204551664N00637325EA0119201208
+B1730224551672N00637314EA0118601204
+B1730244551685N00637317EA0117801198
+B1730264551675N00637333EA0116901191
+B1730284551659N00637320EA0116501184
+B1730304551659N00637301EA0116801181
+B1730324551660N00637287EA0116601180
+B1730344551653N00637272EA0116001175
+B1730364551642N00637257EA0115801173
+B1730384551632N00637247EA0115901173
+B1730404551623N00637238EA0115401170
+B1730424551612N00637226EA0115201167
+B1730444551602N00637213EA0115301166
+B1730464551600N00637199EA0114801163
+B1730484551605N00637178EA0114401161
+B1730504551614N00637165EA0114401161
+B1730524551620N00637156EA0114101159
+B1730544551626N00637144EA0113501157
+B1730564551634N00637131EA0113501155
+B1730584551642N00637122EA0113501154
+B1731004551648N00637114EA0113201151
+B1731024551657N00637112EA0113001148
+B1731044551667N00637124EA0112301143
+B1731064551657N00637145EA0111801137
+B1731084551640N00637149EA0111901133
+B1731104551631N00637154EA0111401130
+B1731124551633N00637169EA0110701124
+B1731144551644N00637176EA0110501119
+B1731164551653N00637178EA0110501117
+B1731184551661N00637185EA0110001114
+B1731204551667N00637196EA0110101112
+B1731224551672N00637205EA0109701111
+B1731244551675N00637214EA0108701108
+B1731264551680N00637224EA0108701104
+B1731284551687N00637234EA0109001102
+B1731304551692N00637241EA0109001101
+B1731324551693N00637243EA0109001100
+B1731344551694N00637244EA0109001100
+B1731364551694N00637244EA0109101100
+B1731384551694N00637244EA0109001100
+B1731404551694N00637244EA0109001100
+B1731424551694N00637244EA0109001100
+B1731444551694N00637244EA0109101100
+B1731464551694N00637244EA0109001100
+B1731484551694N00637244EA0109001100
+B1731504551694N00637244EA0109001100
+B1731524551694N00637244EA0109001100
+B1731544551694N00637244EA0109001100
+B1731564551694N00637244EA0109001100
+B1731584551694N00637244EA0109001100
+B1732004551694N00637244EA0109001100
+B1732024551694N00637244EA0109001100
+B1732044551694N00637244EA0109001100
+B1732064551694N00637244EA0109001100
+B1732084551694N00637244EA0109001100
+B1732104551694N00637244EA0109001100
+B1732124551694N00637244EA0109001100
+B1732144551694N00637244EA0109001100
+B1732164551694N00637244EA0109001100
+B1732184551694N00637244EA0109001100
+B1732204551694N00637244EA0109001100
+B1732224551694N00637244EA0109001100
+B1732244551694N00637244EA0109001100
+B1732264551694N00637244EA0109001100
+B1732284551694N00637244EA0109001100
+B1732304551694N00637244EA0109001100
+B1732324551694N00637244EA0109001100
+B1732344551694N00637244EA0109001100
+B1732364551694N00637244EA0109001098
+B1732384551694N00637244EA0109001098
+B1732404551694N00637244EA0109001099
+B1732424551694N00637244EA0109001100
+B1732444551694N00637244EA0109001100
+B1732464551694N00637244EA0109001101
+B1732484551694N00637244EA0109001101
+B1732504551694N00637244EA0109001101
+B1732524551694N00637244EA0109001101
+B1732544551694N00637244EA0109001101
+B1732564551694N00637244EA0109001101
+B1732584551694N00637244EA0109001101
+B1733004551694N00637244EA0109001101
+B1733024551694N00637244EA0109001101
+B1733044551694N00637244EA0109001101
+B1733064551694N00637244EA0109001101
+B1733084551694N00637245EA0109001101
diff --git a/examples/data/igc/Damien-de-Baenst.igc b/examples/data/igc/Damien-de-Baenst.igc
new file mode 100644
index 0000000..dcd39f6
--- /dev/null
+++ b/examples/data/igc/Damien-de-Baenst.igc
@@ -0,0 +1,3319 @@
+ABRA00326
+HFDTE190411
+HFFXA100
+HFPLTPILOT:Damien de Baesnt
+HFGTYGLIDERTYPE:Ozone R10.2       
+HFGIDGLIDERID:1111              
+HFDTM100GPSDATUM:WGS84
+HFGPSGPS:FURUNO GH-80
+HFRFWFIRMWAREVERSION:2.27
+HFRHWHARDWAREVERSION:1.00
+HFFTYFRTYPE:BRAUNIGER,COMPEO
+I013638TAS
+B0844164556194N00651071EA0203502037000
+B0844264556194N00651071EA0203502038000
+B0844364556194N00651071EA0203502039000
+B0844464556194N00651070EA0203602040000
+B0844564556193N00651071EA0203502040000
+B0845064556193N00651071EA0203602041000
+B0845164556193N00651071EA0203502042000
+B0845264556193N00651070EA0203602042000
+B0845364556193N00651071EA0203502041000
+B0845464556194N00651071EA0203502041000
+B0845564556194N00651071EA0203602040000
+B0846064556195N00651071EA0203602039000
+B0846164556195N00651072EA0203602039000
+B0846264556195N00651072EA0203602039000
+B0846364556195N00651072EA0203602040000
+B0846464556195N00651072EA0203502040001
+B0846564556195N00651071EA0203502040001
+B0847064556195N00651071EA0203502039000
+B0847164556194N00651071EA0203502038000
+B0847264556193N00651071EA0203502036000
+B0847364556193N00651071EA0203502033000
+B0847464556193N00651071EA0203502033000
+B0847564556194N00651070EA0203502033000
+B0848064556194N00651070EA0203502033000
+B0848164556194N00651070EA0203502034000
+B0848264556194N00651070EA0203502035000
+B0848364556194N00651070EA0203502036000
+B0848464556184N00651068EA0202802036003
+B0848564556147N00651045EA0203302035000
+B0849064556120N00651002EA0203902037000
+B0849174556106N00650925EA0204402041000
+B0849274556084N00650863EA0203502042000
+B0849374556056N00650807EA0203502042000
+B0849474556028N00650751EA0205202043000
+B0849574555997N00650710EA0206902048000
+B0850074555959N00650698EA0206402056000
+B0850174555995N00650719EA0206502061000
+B0850274556007N00650753EA0207002065000
+B0850374555968N00650704EA0208202071000
+B0850474555923N00650661EA0206802074000
+B0850574555877N00650603EA0207802076000
+B0851074555827N00650572EA0209402080000
+B0851174555840N00650598EA0209502086000
+B0851274555894N00650558EA0210402091000
+B0851374555916N00650579EA0210202098000
+B0851484555864N00650522EA0210902103000
+B0851584555808N00650494EA0211802108000
+B0852084555781N00650531EA0213102115000
+B0852184555750N00650535EA0212702121000
+B0852284555774N00650500EA0213302126000
+B0852384555725N00650478EA0213902130000
+B0852484555694N00650496EA0215702137000
+B0852584555702N00650445EA0215902144000
+B0853084555664N00650396EA0217802153000
+B0853184555661N00650439EA0221002165000
+B0853284555615N00650432EA0223102184000
+B0853384555639N00650429EA0225202204000
+B0853484555599N00650406EA0226002222000
+B0853584555629N00650372EA0227502237000
+B0854084555661N00650403EA0227202252000
+B0854184555696N00650447EA0225602257000
+B0854284555733N00650486EA0224502258000
+B0854384555779N00650521EA0223602255000
+B0854484555811N00650573EA0222902249000
+B0854584555839N00650630EA0222502243000
+B0855084555858N00650693EA0221502237000
+B0855184555884N00650741EA0220602230000
+B0855284555906N00650786EA0219702223047
+B0855384555924N00650838EA0219002214041
+B0855484555949N00650883EA0217602205042
+B0855584555968N00650908EA0217202199038
+B0856084555985N00650944EA0216602192042
+B0856184555995N00650972EA0218202188027
+B0856284555993N00650995EA0217802187041
+B0856384556001N00651028EA0217602185041
+B0856484556012N00651058EA0216302183041
+B0856584556025N00651094EA0214802177046
+B0857084556041N00651125EA0214702170045
+B0857184556066N00651153EA0214002163041
+B0857284556092N00651182EA0214202157041
+B0857384556133N00651191EA0215702155038
+B0857484556139N00651216EA0217502161045
+B0857584556148N00651179EA0220102172045
+B0858084556123N00651139EA0222202185044
+B0858184556119N00651134EA0224702203045
+B0858284556145N00651090EA0228202224042
+B0858384556123N00651077EA0230102247038
+B0858484556136N00651065EA0232702271048
+B0858584556123N00651015EA0236202298042
+B0859084556107N00651035EA0239002326030
+B0859184556099N00650985EA0242602354052
+B0859294556053N00650995EA0245402386038
+B0859394556068N00650969EA0248602415032
+B0859494556014N00650971EA0250302444040
+B0859594556014N00650890EA0250202467046
+B0900094556012N00650932EA0253002488045
+B0900194556004N00650877EA0252802504042
+B0900294556038N00650897EA0257102520043
+B0900394556007N00650870EA0259602544042
+B0900494556015N00650893EA0263102571046
+B0900594555992N00650859EA0266002597048
+B0901094555972N00650895EA0268102623046
+B0901194555977N00650853EA0270702646038
+B0901294555973N00650904EA0272702673044
+B0901394555923N00650867EA0273402695042
+B0901494555899N00650786EA0274602712044
+B0901594555871N00650704EA0275402727041
+B0902094555840N00650618EA0275502738047
+B0902194555809N00650533EA0274202743044
+B0902294555784N00650449EA0272402742045
+B0902394555764N00650371EA0272002739044
+B0902494555747N00650293EA0272302734038
+B0902594555729N00650215EA0273302733036
+B0903094555714N00650135EA0274302737045
+B0903194555681N00650062EA0274102742045
+B0903294555637N00649978EA0272802743044
+B0903394555599N00649881EA0272702738044
+B0903494555576N00649799EA0275402742038
+B0903594555585N00649806EA0279202752047
+B0904094555601N00649797EA0282102771040
+B0904194555583N00649764EA0284802794044
+B0904294555575N00649796EA0287502820038
+B0904394555571N00649728EA0289802844051
+B0904494555569N00649759EA0292402869042
+B0904594555554N00649715EA0294802893051
+B0905094555502N00649727EA0296002916035
+B0905194555428N00649711EA0295902932044
+B0905294555362N00649670EA0295302942047
+B0905394555322N00649577EA0293902947042
+B0905494555297N00649476EA0291402943046
+B0905594555267N00649374EA0289102931048
+B0906094555242N00649277EA0286402915043
+B0906194555213N00649195EA0283302894038
+B0906294555187N00649115EA0281002872040
+B0906394555149N00649030EA0280202850044
+B0906494555115N00648943EA0279402834048
+B0906594555080N00648866EA0278102820044
+B0907094555041N00648772EA0277902806042
+B0907204555008N00648670EA0278102798044
+B0907304554951N00648603EA0280302797037
+B0907404554910N00648557EA0281002803042
+B0907504554876N00648454EA0278902802061
+B0908004554827N00648342EA0276102793065
+B0908104554778N00648226EA0274202779061
+B0908204554725N00648116EA0272702765058
+B0908304554658N00648001EA0270002747061
+B0908404554595N00647879EA0267402726062
+B0908504554535N00647774EA0265702705057
+B0909004554480N00647669EA0263502684058
+B0909104554424N00647568EA0261102663057
+B0909204554371N00647442EA0259202641060
+B0909304554316N00647324EA0256702620061
+B0909404554268N00647221EA0255602601057
+B0909504554220N00647115EA0254502585057
+B0910004554173N00647009EA0253202570055
+B0910104554120N00646906EA0251202554056
+B0910204554071N00646799EA0249702537058
+B0910304554018N00646700EA0248402522056
+B0910404553972N00646589EA0246902506058
+B0910504553924N00646479EA0245202491061
+B0911004553875N00646370EA0244002476060
+B0911104553827N00646265EA0242002461059
+B0911204553777N00646154EA0240002443060
+B0911304553730N00646048EA0237102424066
+B0911404553677N00645931EA0234602402066
+B0911504553626N00645814EA0232702379067
+B0912004553572N00645703EA0230402358067
+B0912104553517N00645593EA0228102336067
+B0912204553460N00645486EA0226302314065
+B0912304553406N00645393EA0224702294060
+B0912404553349N00645304EA0223002275057
+B0912504553299N00645239EA0222902261044
+B0913004553251N00645165EA0221602248042
+B0913104553216N00645081EA0222102238039
+B0913204553182N00645000EA0223102234037
+B0913304553142N00645006EA0224302236036
+B0913404553177N00645023EA0225402242040
+B0913504553172N00645035EA0227202250051
+B0914004553178N00645007EA0229702260036
+B0914104553137N00644991EA0231402277040
+B0914204553176N00644962EA0233402292036
+B0914304553178N00644893EA0235102311048
+B0914414553153N00644941EA0237402333043
+B0914514553184N00644943EA0239402354040
+B0915014553219N00644878EA0242702378039
+B0915114553188N00644839EA0243702401042
+B0915214553163N00644895EA0245802420036
+B0915314553188N00644920EA0246202438041
+B0915414553223N00644863EA0249302454043
+B0915514553184N00644863EA0251602475041
+B0916014553222N00644851EA0254002496037
+B0916114553214N00644772EA0256302519035
+B0916214553166N00644726EA0256802539042
+B0916314553100N00644689EA0256202552058
+B0916414553035N00644646EA0254402555058
+B0916514552959N00644604EA0255402554047
+B0917014552887N00644569EA0256302556034
+B0917114552878N00644488EA0257402563042
+B0917214552863N00644504EA0258402571040
+B0917314552857N00644430EA0258602579048
+B0917414552819N00644439EA0258602585050
+B0917514552732N00644399EA0257402585055
+B0918014552651N00644360EA0254602577052
+B0918114552575N00644352EA0252502562054
+B0918214552524N00644375EA0255302555038
+B0918314552504N00644332EA0256302558047
+B0918414552509N00644358EA0257902564035
+B0918514552447N00644356EA0259702574039
+B0919014552451N00644356EA0261702586044
+B0919114552426N00644259EA0263302603042
+B0919214552377N00644220EA0265402621039
+B0919314552380N00644262EA0266502636042
+B0919414552403N00644193EA0267402650041
+B0919514552346N00644122EA0268202662044
+B0920014552282N00644059EA0267202670047
+B0920114552210N00643999EA0262702666064
+B0920214552131N00643912EA0259502649062
+B0920314552057N00643833EA0257402628061
+B0920414551982N00643763EA0255002607059
+B0920514551906N00643697EA0252702584059
+B0921014551832N00643622EA0251302562058
+B0921114551759N00643536EA0250002543059
+B0921214551684N00643456EA0248902526060
+B0921314551608N00643379EA0247402512060
+B0921414551529N00643303EA0245802496058
+B0921514551447N00643238EA0243502480062
+B0922014551366N00643175EA0241402461060
+B0922114551283N00643119EA0239502441060
+B0922214551203N00643060EA0237402422058
+B0922324551119N00642981EA0235402399058
+B0922424551041N00642907EA0233302379060
+B0922524550959N00642858EA0231002358060
+B0923024550879N00642814EA0228802337060
+B0923124550805N00642760EA0225902315058
+B0923224550729N00642706EA0224202291055
+B0923324550677N00642660EA0224102275041
+B0923424550637N00642614EA0224202264038
+B0923524550633N00642546EA0224402258044
+B0924024550666N00642504EA0223902255042
+B0924124550651N00642567EA0224002251042
+B0924224550602N00642526EA0224102249039
+B0924324550566N00642458EA0223302247040
+B0924424550541N00642378EA0224402246043
+B0924524550537N00642406EA0224602248043
+B0925024550477N00642362EA0225902251041
+B0925124550467N00642374EA0227002257055
+B0925224550431N00642320EA0228202264037
+B0925324550420N00642371EA0228602270032
+B0925424550353N00642348EA0229402279037
+B0925524550311N00642259EA0230502289043
+B0926024550279N00642168EA0231602299047
+B0926124550288N00642118EA0232802311048
+B0926224550254N00642175EA0234102322046
+B0926324550202N00642129EA0235402333037
+B0926424550184N00642044EA0236102343034
+B0926524550163N00641960EA0235902350041
+B0927024550152N00641871EA0236802356042
+B0927124550135N00641805EA0238802365037
+B0927224550154N00641779EA0239702377039
+B0927324550110N00641802EA0240902387044
+B0927424550121N00641771EA0243102401044
+B0927524550074N00641787EA0245102415042
+B0928024550083N00641766EA0247602433041
+B0928124550040N00641746EA0250002453046
+B0928224550036N00641772EA0252502473037
+B0928324549996N00641728EA0253502493039
+B0928424550019N00641715EA0255902514048
+B0928524550003N00641683EA0258302535048
+B0929024549978N00641715EA0260802557044
+B0929124549989N00641690EA0263102579044
+B0929224549952N00641675EA0265002601046
+B0929324549964N00641695EA0266802622043
+B0929424549903N00641708EA0267202640042
+B0929524549840N00641685EA0267702654042
+B0930024549776N00641655EA0267802665042
+B0930134549713N00641613EA0267602671040
+B0930234549648N00641578EA0266102671045
+B0930334549586N00641551EA0265102667042
+B0930434549523N00641520EA0264902662044
+B0930534549465N00641496EA0265902659038
+B0931034549398N00641467EA0266902662043
+B0931134549329N00641429EA0269902672043
+B0931234549253N00641403EA0271402685043
+B0931334549184N00641372EA0271702698044
+B0931434549115N00641338EA0271402706049
+B0931534549047N00641292EA0270102707044
+B0932034548989N00641228EA0269202704043
+B0932134548931N00641152EA0269502701043
+B0932234548860N00641102EA0268802699043
+B0932334548802N00641031EA0268502696043
+B0932434548746N00640961EA0268702693046
+B0932534548687N00640908EA0269202693039
+B0933034548617N00640840EA0268302691053
+B0933134548546N00640765EA0266902685054
+B0933234548488N00640679EA0266202679050
+B0933334548441N00640602EA0265702672042
+B0933434548392N00640537EA0265602667045
+B0933534548334N00640469EA0263902661055
+B0934034548266N00640403EA0262902650061
+B0934134548209N00640378EA0265302645038
+B0934234548151N00640360EA0264602647051
+B0934334548083N00640321EA0263002645056
+B0934434548032N00640232EA0261502638057
+B0934534547992N00640133EA0260302628059
+B0935034547953N00640047EA0258102616057
+B0935134547920N00639950EA0257002602058
+B0935234547887N00639852EA0255702589057
+B0935334547863N00639744EA0254002575056
+B0935434547845N00639628EA0252302560060
+B0935534547844N00639522EA0254102550043
+B0936034547832N00639443EA0256802552045
+B0936134547809N00639369EA0257102559042
+B0936234547791N00639287EA0257202564046
+B0936334547767N00639201EA0256002565048
+B0936434547735N00639111EA0252302558057
+B0936534547713N00638988EA0249502543061
+B0937034547695N00638872EA0247002524057
+B0937134547682N00638757EA0244602502059
+B0937234547673N00638650EA0242102480058
+B0937334547668N00638544EA0240502458046
+B0937434547665N00638440EA0239002438056
+B0937534547665N00638335EA0239102423049
+B0938034547661N00638257EA0240402416040
+B0938144547652N00638167EA0239402411039
+B0938244547631N00638089EA0238302405045
+B0938344547618N00638012EA0238702399044
+B0938444547603N00637933EA0238602396047
+B0938544547584N00637862EA0238602394044
+B0939044547569N00637804EA0238502393038
+B0939144547554N00637738EA0239102391043
+B0939244547536N00637672EA0240802395039
+B0939344547519N00637616EA0241102402043
+B0939444547502N00637552EA0239402403045
+B0939544547472N00637479EA0236002395060
+B0940044547431N00637404EA0234102379059
+B0940144547394N00637342EA0233702365053
+B0940244547352N00637289EA0232802355042
+B0940344547318N00637236EA0231102344052
+B0940444547300N00637170EA0232102335040
+B0940544547258N00637146EA0234602334034
+B0941044547236N00637114EA0238202346042
+B0941144547264N00637148EA0240302363039
+B0941244547223N00637134EA0243802384035
+B0941344547206N00637070EA0247602409041
+B0941444547186N00637000EA0251002439039
+B0941544547154N00636909EA0251102464050
+B0942044547124N00636805EA0250602481054
+B0942144547080N00636719EA0250602492055
+B0942244547030N00636627EA0248502495056
+B0942344546971N00636542EA0246702490058
+B0942444546920N00636449EA0245002480057
+B0942544546873N00636354EA0245002470044
+B0943044546833N00636264EA0246202466049
+B0943144546795N00636202EA0249902472040
+B0943244546748N00636155EA0251302485041
+B0943344546706N00636089EA0251702495036
+B0943444546671N00636024EA0250902502044
+B0943544546641N00635946EA0249102503038
+B0944044546610N00635869EA0247102497046
+B0944144546584N00635786EA0247402490047
+B0944244546564N00635703EA0249802488043
+B0944344546541N00635627EA0250802494047
+B0944444546518N00635543EA0253002503040
+B0944544546490N00635463EA0253402513046
+B0945044546466N00635381EA0253302521048
+B0945144546441N00635301EA0252802526045
+B0945244546422N00635225EA0253002529042
+B0945344546400N00635146EA0254002530038
+B0945444546383N00635073EA0256202537044
+B0945544546361N00634998EA0256702547044
+B0946054546337N00634908EA0255702554045
+B0946154546318N00634818EA0256002556043
+B0946254546295N00634735EA0255602558045
+B0946354546281N00634647EA0256402559045
+B0946454546259N00634566EA0257102562042
+B0946554546232N00634487EA0256702564039
+B0947054546207N00634421EA0259202570043
+B0947154546176N00634349EA0259702578048
+B0947254546133N00634273EA0260902587044
+B0947354546096N00634197EA0261302596043
+B0947454546059N00634129EA0260202600041
+B0947554546031N00634044EA0259802601045
+B0948054546006N00633951EA0261702604048
+B0948154545974N00633884EA0262702611038
+B0948254545938N00633807EA0263002618048
+B0948354545898N00633726EA0265302625048
+B0948454545849N00633687EA0264102634050
+B0948554545806N00633610EA0262302633050
+B0949054545781N00633514EA0261502629058
+B0949154545756N00633416EA0262702627052
+B0949254545729N00633334EA0263002629053
+B0949354545704N00633240EA0261402629057
+B0949454545675N00633143EA0259102621055
+B0949554545641N00633047EA0257502609063
+B0950054545602N00632965EA0255502596058
+B0950154545566N00632890EA0253402580054
+B0950254545542N00632801EA0251102563056
+B0950354545519N00632702EA0248702543059
+B0950454545492N00632603EA0246402523056
+B0950554545448N00632506EA0243802500061
+B0951054545410N00632407EA0242002478057
+B0951154545383N00632302EA0240302457058
+B0951254545354N00632197EA0238302437060
+B0951354545326N00632094EA0236302417060
+B0951454545297N00631992EA0234502397057
+B0951554545270N00631892EA0231702376058
+B0952054545241N00631796EA0229502355055
+B0952154545219N00631698EA0227102332059
+B0952254545187N00631613EA0225202310057
+B0952354545154N00631522EA0222902288056
+B0952454545108N00631438EA0219602264059
+B0952554545067N00631341EA0217502238057
+B0953054545055N00631252EA0218802218040
+B0953154545034N00631207EA0220702212036
+B0953254545021N00631265EA0222902214039
+B0953354545017N00631245EA0225802223042
+B0953454545015N00631268EA0228102239047
+B0953554545035N00631269EA0230502256043
+B0954064544999N00631240EA0232502276037
+B0954164545039N00631260EA0233502294044
+B0954264545011N00631258EA0235202313047
+B0954364545039N00631286EA0237502330046
+B0954464545045N00631255EA0239402349047
+B0954564545044N00631311EA0241802369043
+B0955064545064N00631294EA0244202390048
+B0955164545041N00631293EA0246802412043
+B0955264545073N00631274EA0248702434049
+B0955364545055N00631275EA0251402457044
+B0955464545075N00631313EA0253802480046
+B0955564545060N00631253EA0255602504041
+B0956064545060N00631170EA0256602524046
+B0956164545059N00631097EA0257902542043
+B0956264545052N00631020EA0257702557046
+B0956364545044N00630941EA0258002566046
+B0956464545035N00630852EA0259002574047
+B0956564545027N00630778EA0260802584037
+B0957064545019N00630698EA0258902591046
+B0957164545006N00630610EA0257302590048
+B0957264544996N00630516EA0257102585042
+B0957364544989N00630423EA0255402579040
+B0957464544979N00630347EA0255202571046
+B0957564544966N00630268EA0256702568046
+B0958064544937N00630218EA0256602568040
+B0958164544889N00630234EA0258802571040
+B0958264544851N00630215EA0261002581038
+B0958364544820N00630159EA0260402591044
+B0958464544790N00630103EA0260002597040
+B0958564544757N00630040EA0258102596041
+B0959064544727N00629965EA0255802589043
+B0959164544699N00629887EA0254202578044
+B0959264544671N00629820EA0253902567038
+B0959364544649N00629750EA0255102559036
+B0959464544636N00629693EA0257402560038
+B0959564544629N00629625EA0256602563046
+B1000064544661N00629540EA0259102567047
+B1000164544700N00629439EA0261502579045
+B1000264544722N00629325EA0261802592047
+B1000364544732N00629214EA0262502602030
+B1000464544731N00629111EA0261702608044
+B1000564544708N00629022EA0259802610044
+B1001064544670N00628946EA0256902603058
+B1001164544631N00628853EA0254202590059
+B1001264544582N00628767EA0252102574060
+B1001364544541N00628679EA0251602557048
+B1001474544501N00628592EA0250702542051
+B1001574544467N00628505EA0249502529052
+B1002074544435N00628409EA0248302516055
+B1002174544406N00628307EA0246802503055
+B1002274544379N00628202EA0244302488056
+B1002374544359N00628082EA0242002470056
+B1002474544345N00627960EA0240102452056
+B1002574544335N00627837EA0238102433057
+B1003074544326N00627709EA0236702415056
+B1003174544313N00627585EA0235302398059
+B1003274544290N00627465EA0233902381059
+B1003374544269N00627346EA0232602365051
+B1003474544247N00627240EA0231602352049
+B1003574544226N00627136EA0230502339048
+B1004074544208N00627031EA0229402328047
+B1004174544195N00626925EA0228202316047
+B1004274544176N00626822EA0227102305048
+B1004374544152N00626721EA0226102293047
+B1004474544130N00626617EA0224802281048
+B1004574544110N00626510EA0223702270047
+B1005074544092N00626401EA0222302258047
+B1005174544080N00626290EA0220502245048
+B1005274544069N00626180EA0218602230047
+B1005374544061N00626069EA0217102215047
+B1005474544051N00625960EA0215702199047
+B1005574544044N00625850EA0214202184049
+B1006074544036N00625744EA0212702169047
+B1006174544028N00625641EA0211102154047
+B1006274544019N00625537EA0209602138047
+B1006374544007N00625433EA0208202123047
+B1006474543995N00625329EA0207002109047
+B1006574543984N00625225EA0205902095049
+B1007074543974N00625121EA0204702083046
+B1007174543955N00625023EA0203402070047
+B1007274543938N00624923EA0202202057047
+B1007374543922N00624824EA0201202045047
+B1007474543911N00624725EA0200302034049
+B1007574543894N00624628EA0199202024047
+B1008074543871N00624533EA0198102013048
+B1008174543848N00624440EA0196802001047
+B1008274543827N00624348EA0195501989048
+B1008374543810N00624256EA0194301977046
+B1008474543794N00624162EA0193201965046
+B1008574543779N00624066EA0192101953047
+B1009074543760N00623970EA0191101942046
+B1009174543739N00623874EA0190101931047
+B1009274543716N00623782EA0189101920045
+B1009384543687N00623682EA0188001908047
+B1009484543664N00623590EA0186901897047
+B1009584543641N00623498EA0185601887048
+B1010084543601N00623399EA0184201875057
+B1010184543561N00623310EA0183301863043
+B1010284543541N00623220EA0182001851048
+B1010384543526N00623127EA0180801839048
+B1010484543511N00623025EA0179401827052
+B1010584543490N00622923EA0178101814053
+B1011084543470N00622820EA0176701801053
+B1011184543453N00622717EA0175201787053
+B1011284543430N00622614EA0173801773053
+B1011384543409N00622510EA0172201758053
+B1011484543389N00622406EA0170701744053
+B1011584543370N00622302EA0169101729053
+B1012084543348N00622201EA0167801714053
+B1012184543326N00622100EA0166501699053
+B1012284543301N00622002EA0164901685053
+B1012384543280N00621912EA0165001672035
+B1012484543279N00621841EA0165401666036
+B1012584543297N00621860EA0165001661043
+B1013084543262N00621827EA0165401658037
+B1013184543292N00621823EA0164801656037
+B1013284543255N00621815EA0164101652039
+B1013384543232N00621736EA0163201649039
+B1013484543186N00621678EA0161401642040
+B1013584543156N00621609EA0160701632032
+B1014084543127N00621576EA0162801627041
+B1014184543159N00621585EA0164501628040
+B1014284543132N00621566EA0165401633039
+B1014384543140N00621629EA0165401640037
+B1014484543160N00621584EA0165901644035
+B1014584543132N00621522EA0167001649042
+B1015084543120N00621556EA0168701657032
+B1015184543154N00621528EA0170301666040
+B1015284543119N00621527EA0171201678036
+B1015384543142N00621581EA0172501689037
+B1015484543169N00621541EA0173301701041
+B1015584543126N00621524EA0174201711042
+B1016084543121N00621593EA0175401722037
+B1016184543153N00621569EA0175201731042
+B1016284543155N00621497EA0175301738039
+B1016384543155N00621420EA0175701744035
+B1016484543183N00621445EA0176301750035
+B1016584543165N00621426EA0176601756043
+B1017084543208N00621466EA0177101760037
+B1017184543184N00621524EA0177901765039
+B1017294543189N00621478EA0178501771038
+B1017394543238N00621506EA0179501778041
+B1017494543226N00621547EA0179901786043
+B1017594543245N00621502EA0181301793039
+B1018094543255N00621535EA0182801802043
+B1018194543220N00621493EA0183601811039
+B1018294543191N00621428EA0184001819045
+B1018394543159N00621362EA0183601824041
+B1018494543125N00621299EA0181601825045
+B1018594543096N00621231EA0180201821043
+B1019094543052N00621148EA0177701811053
+B1019194543007N00621060EA0176001797058
+B1019294542959N00620976EA0174101783056
+B1019394542903N00620899EA0172201767047
+B1019494542857N00620842EA0171201750036
+B1019594542830N00620787EA0173101739033
+B1020094542816N00620810EA0173301735033
+B1020194542871N00620802EA0174101736038
+B1020294542855N00620741EA0174801739041
+B1020394542817N00620716EA0174701742041
+B1020494542782N00620681EA0174601745026
+B1020594542738N00620638EA0174801745040
+B1021094542704N00620585EA0178101749036
+B1021194542687N00620624EA0179701761036
+B1021294542732N00620634EA0181101774038
+B1021394542715N00620657EA0182601789034
+B1021494542720N00620595EA0184501804038
+B1021594542723N00620627EA0186701821040
+B1022094542699N00620575EA0188301839044
+B1022194542708N00620610EA0190601856044
+B1022294542714N00620590EA0192201874048
+B1022394542693N00620567EA0193601890045
+B1022494542701N00620601EA0194601906037
+B1022594542651N00620579EA0195401920044
+B1023094542681N00620541EA0196001932039
+B1023194542670N00620580EA0196501942041
+B1023294542610N00620558EA0196701951039
+B1023394542552N00620521EA0194701955045
+B1023494542494N00620482EA0193201952041
+B1023594542437N00620444EA0192201945044
+B1024094542384N00620394EA0192901938041
+B1024194542334N00620340EA0193601936048
+B1024294542285N00620294EA0193301935050
+B1024394542230N00620253EA0193201933043
+B1024494542188N00620203EA0194501933034
+B1024594542148N00620171EA0195201937047
+B1025094542101N00620135EA0194901941044
+B1025204542051N00620090EA0193901941048
+B1025304542009N00620057EA0193201939043
+B1025404541959N00620029EA0191701934042
+B1025504541907N00620007EA0190101925049
+B1026004541861N00619979EA0190401917036
+B1026104541813N00619954EA0191001913040
+B1026204541765N00619928EA0190501910038
+B1026304541715N00619887EA0190201907038
+B1026404541669N00619851EA0191301905031
+B1026504541627N00619806EA0191101907038
+B1027004541589N00619757EA0191901908042
+B1027104541578N00619700EA0195401915041
+B1027204541578N00619720EA0198901932047
+B1027304541585N00619726EA0201901953051
+B1027404541597N00619719EA0205401978046
+B1027504541578N00619683EA0208402005040
+B1028004541609N00619704EA0210902033040
+B1028104541587N00619680EA0213502061044
+B1028204541596N00619718EA0216402087035
+B1028304541549N00619700EA0218402114037
+B1028404541576N00619671EA0219602138041
+B1028504541618N00619666EA0222202161037
+B1029004541585N00619609EA0223202183045
+B1029104541547N00619546EA0222202199042
+B1029204541515N00619471EA0219702203051
+B1029304541480N00619388EA0217602198062
+B1029404541444N00619290EA0216102188058
+B1029504541420N00619186EA0214902176057
+B1030004541395N00619084EA0212502163056
+B1030104541363N00618972EA0210302146058
+B1030204541333N00618890EA0209402130045
+B1030304541306N00618814EA0208002117046
+B1030404541279N00618723EA0205502103051
+B1030504541271N00618634EA0203902087041
+B1031004541239N00618560EA0202502071051
+B1031104541208N00618485EA0201302056049
+B1031204541182N00618406EA0200002041046
+B1031304541159N00618325EA0199102026042
+B1031404541138N00618245EA0197902013047
+B1031504541105N00618176EA0196802000044
+B1032004541070N00618108EA0195001987056
+B1032104541033N00618019EA0193501972056
+B1032204540994N00617933EA0191701956058
+B1032304540946N00617850EA0189901938055
+B1032404540902N00617765EA0187901920056
+B1032504540857N00617678EA0186201902055
+B1033004540812N00617589EA0184301884056
+B1033114540758N00617500EA0181701863057
+B1033214540709N00617432EA0180201844053
+B1033314540670N00617376EA0179801828042
+B1033414540625N00617311EA0180401817038
+B1033514540581N00617238EA0181201814043
+B1034014540552N00617158EA0180401811043
+B1034114540533N00617082EA0182001811039
+B1034214540493N00617088EA0183301816037
+B1034314540506N00617129EA0184701823035
+B1034414540518N00617073EA0186601835039
+B1034514540482N00617086EA0188301849030
+B1035014540505N00617136EA0190101863039
+B1035114540516N00617085EA0192801880038
+B1035214540486N00617110EA0195401901041
+B1035314540518N00617152EA0198601926034
+B1035414540551N00617094EA0199201950037
+B1035514540513N00617033EA0201001968037
+B1036014540505N00617064EA0204201987042
+B1036114540491N00617029EA0207202011048
+B1036214540520N00617033EA0210302037041
+B1036314540489N00617024EA0213002064041
+B1036414540530N00617038EA0215402090044
+B1036514540535N00616968EA0216402117036
+B1037014540477N00616977EA0217402135039
+B1037114540459N00616936EA0218402151042
+B1037214540457N00616964EA0219602166045
+B1037314540416N00616897EA0218702176045
+B1037414540372N00616831EA0216402177054
+B1037514540317N00616745EA0214302169060
+B1038014540263N00616658EA0212302157057
+B1038114540203N00616580EA0210102142057
+B1038214540150N00616495EA0207302123065
+B1038314540089N00616404EA0205002102065
+B1038414540022N00616322EA0202502079064
+B1038514539954N00616242EA0200302056063
+B1039014539890N00616162EA0198002033061
+B1039114539830N00616097EA0196402011055
+B1039214539771N00616037EA0194401990055
+B1039314539711N00615981EA0192801970051
+B1039414539666N00615942EA0191701954042
+B1039514539621N00615900EA0190501938043
+B1040014539573N00615876EA0189901924040
+B1040114539526N00615848EA0191301916032
+B1040214539501N00615864EA0190601914036
+B1040314539546N00615838EA0191801913032
+B1040424539562N00615861EA0191601915040
+B1040524539550N00615815EA0192401919048
+B1041024539546N00615859EA0192901923038
+B1041124539526N00615823EA0192901927039
+B1041224539556N00615848EA0193801931042
+B1041324539547N00615813EA0193501934043
+B1041424539557N00615851EA0193801936039
+B1041524539511N00615868EA0192901937040
+B1042024539458N00615844EA0193101935038
+B1042124539421N00615797EA0193701936042
+B1042224539433N00615816EA0194001937044
+B1042324539388N00615829EA0195201941041
+B1042424539392N00615862EA0195301946037
+B1042524539403N00615788EA0195601949034
+B1043024539357N00615746EA0195401952041
+B1043124539301N00615740EA0192801949045
+B1043224539236N00615751EA0190501938052
+B1043324539173N00615758EA0189501924048
+B1043424539124N00615764EA0190501916037
+B1043524539077N00615773EA0189001911042
+B1044024539019N00615778EA0188601903040
+B1044124538962N00615772EA0187801896039
+B1044224538918N00615741EA0188901893041
+B1044324538904N00615659EA0189901893035
+B1044424538868N00615630EA0190101896041
+B1044524538852N00615675EA0189901898038
+B1045024538894N00615711EA0189901899044
+B1045124538878N00615745EA0189701901039
+B1045224538874N00615675EA0190101902045
+B1045324538877N00615705EA0190801904037
+B1045424538831N00615724EA0190901907041
+B1045524538794N00615668EA0191001908038
+B1046024538843N00615666EA0190101907039
+B1046124538865N00615722EA0189401905042
+B1046224538877N00615784EA0188601900036
+B1046324538850N00615787EA0188301896043
+B1046424538895N00615772EA0188401891041
+B1046524538935N00615800EA0189201891043
+B1047024538914N00615741EA0191101895040
+B1047124538901N00615791EA0191501902039
+B1047224538935N00615760EA0191801905042
+B1047324538907N00615700EA0193301912032
+B1047424538882N00615734EA0192601918040
+B1047524538920N00615762EA0192801923036
+B1048024538938N00615688EA0193901927035
+B1048124538913N00615674EA0194901933043
+B1048224538949N00615662EA0196201942041
+B1048334538918N00615623EA0197001952042
+B1048434538942N00615649EA0197701960036
+B1048534538952N00615573EA0198201967037
+B1049034538905N00615535EA0196701971042
+B1049134538836N00615492EA0193501964058
+B1049234538763N00615447EA0190601949054
+B1049334538691N00615412EA0188901932057
+B1049434538619N00615382EA0187901915056
+B1049534538542N00615355EA0186401900061
+B1050034538469N00615336EA0184501883055
+B1050134538392N00615329EA0183501867053
+B1050234538315N00615324EA0182201853056
+B1050334538238N00615323EA0181901839046
+B1050434538183N00615317EA0183001834036
+B1050534538126N00615314EA0182301831044
+B1051034538070N00615306EA0183601829039
+B1051134538013N00615305EA0181801826042
+B1051234537950N00615315EA0181401821041
+B1051334537893N00615309EA0181301817043
+B1051434537845N00615286EA0183401817031
+B1051534537800N00615254EA0183001821040
+B1052034537748N00615218EA0183301824041
+B1052134537703N00615166EA0184601827037
+B1052234537669N00615103EA0187401834039
+B1052334537642N00615039EA0187901844037
+B1052434537620N00614968EA0188101853037
+B1052534537591N00614898EA0186801859040
+B1053034537555N00614827EA0185501860044
+B1053134537522N00614755EA0187101860035
+B1053234537489N00614693EA0187101863039
+B1053334537450N00614632EA0185701864043
+B1053434537409N00614575EA0183701859037
+B1053534537365N00614512EA0184601851029
+B1054034537332N00614485EA0185201850040
+B1054134537355N00614537EA0188201853046
+B1054234537353N00614516EA0190401863039
+B1054334537347N00614536EA0192701880043
+B1054434537379N00614500EA0194601898043
+B1054534537353N00614526EA0196201917041
+B1055034537378N00614523EA0198001936041
+B1055134537380N00614481EA0199801953039
+B1055234537399N00614505EA0200601973045
+B1055334537365N00614458EA0201401985041
+B1055434537324N00614405EA0201601997039
+B1055534537273N00614338EA0200702003042
+B1056034537225N00614287EA0199002003045
+B1056144537171N00614228EA0197401995042
+B1056244537126N00614168EA0196801986045
+B1056344537095N00614108EA0198601981040
+B1056444537058N00614046EA0199601984042
+B1056544537024N00613980EA0199601987038
+B1057044536995N00613922EA0198901989043
+B1057144536963N00613860EA0198401987042
+B1057244536930N00613802EA0199401986039
+B1057344536898N00613745EA0199501988043
+B1057444536870N00613687EA0200501989034
+B1057544536846N00613623EA0200501991038
+B1058044536823N00613553EA0202101997044
+B1058144536794N00613487EA0203102004038
+B1058244536764N00613423EA0201702010043
+B1058344536727N00613357EA0201802011041
+B1058444536699N00613296EA0202602013038
+B1058544536672N00613243EA0204902019034
+B1059044536642N00613221EA0206802031043
+B1059144536670N00613252EA0209002045042
+B1059244536656N00613199EA0210802064044
+B1059344536646N00613249EA0212102081040
+B1059444536686N00613251EA0213502098040
+B1059544536681N00613177EA0216002114040
+B1100044536661N00613116EA0219202134037
+B1100144536632N00613049EA0221802158040
+B1100244536604N00612961EA0219802174045
+B1100344536575N00612887EA0217902180036
+B1100444536541N00612814EA0215902176044
+B1100544536510N00612736EA0214602168043
+B1101044536480N00612656EA0215302160036
+B1101144536457N00612598EA0219102162034
+B1101244536450N00612631EA0221702174041
+B1101344536480N00612572EA0225802193039
+B1101444536448N00612562EA0229702220037
+B1101544536478N00612606EA0231302249035
+B1102044536514N00612547EA0233802272028
+B1102144536534N00612498EA0236902299052
+B1102244536516N00612499EA0242002327034
+B1102344536550N00612492EA0244202359043
+B1102444536552N00612469EA0246702391055
+B1102544536531N00612459EA0250202423043
+B1103044536545N00612466EA0253502453039
+B1103144536561N00612397EA0255702483045
+B1103244536558N00612417EA0258702511034
+B1103344536532N00612337EA0260602539042
+B1103454536502N00612239EA0259202561041
+B1103554536476N00612143EA0258502570043
+B1104054536449N00612051EA0258702574053
+B1104154536425N00611960EA0259102579039
+B1104254536383N00611881EA0257602581056
+B1104354536324N00611801EA0256402576057
+B1104454536272N00611719EA0254702569057
+B1104554536228N00611627EA0254802561045
+B1105054536190N00611525EA0253402554054
+B1105154536152N00611420EA0252402545053
+B1105254536111N00611321EA0252102536048
+B1105354536074N00611228EA0251802530049
+B1105454536038N00611122EA0250202523056
+B1105554536002N00611015EA0248602512057
+B1106054535965N00610906EA0247402499053
+B1106154535938N00610799EA0246402488056
+B1106254535907N00610690EA0245402476054
+B1106354535882N00610610EA0247002469041
+B1106454535922N00610596EA0247102468048
+B1106554535881N00610577EA0248002469041
+B1107054535860N00610495EA0247202470042
+B1107154535851N00610407EA0247802470043
+B1107254535835N00610306EA0248002473042
+B1107354535852N00610220EA0249402476048
+B1107454535836N00610222EA0250402481043
+B1107554535793N00610140EA0251202490044
+B1108054535771N00610043EA0251802498041
+B1108154535752N00609942EA0251602504042
+B1108254535736N00609853EA0249802507036
+B1108354535718N00609754EA0248002503044
+B1108454535702N00609660EA0245702494043
+B1108554535700N00609560EA0242602479046
+B1109054535695N00609447EA0239802459057
+B1109154535682N00609314EA0236702437063
+B1109254535640N00609200EA0234202412059
+B1109354535619N00609071EA0231802388058
+B1109454535614N00608929EA0229702363057
+B1109554535626N00608794EA0227502339058
+B1110054535637N00608657EA0225502315054
+B1110154535648N00608522EA0223502292057
+B1110254535661N00608389EA0221602269059
+B1110354535672N00608259EA0219702248058
+B1110454535667N00608125EA0217302227054
+B1110554535670N00607998EA0215502206059
+B1111054535664N00607874EA0213802187054
+B1111154535667N00607748EA0211302166058
+B1111264535671N00607611EA0209202143060
+B1111364535684N00607486EA0206502121060
+B1111464535691N00607360EA0205002098059
+B1111564535683N00607266EA0204302080043
+B1112064535684N00607178EA0202402063043
+B1112164535690N00607090EA0199102044053
+B1112264535700N00606994EA0196902022047
+B1112364535726N00606957EA0198102005037
+B1112464535755N00607008EA0199701999043
+B1112564535715N00606994EA0199101996028
+B1113064535689N00606935EA0200901992031
+B1113164535698N00606942EA0203301998048
+B1113264535665N00606926EA0205302010037
+B1113364535679N00606978EA0205902023048
+B1113464535631N00606982EA0205702034042
+B1113564535638N00606925EA0205302041037
+B1114064535658N00606871EA0205802044034
+B1114164535680N00606833EA0207102051036
+B1114264535668N00606858EA0209602060046
+B1114364535694N00606841EA0212102073043
+B1114464535658N00606852EA0214002090041
+B1114564535687N00606824EA0216402109036
+B1115064535668N00606867EA0218002129042
+B1115164535664N00606819EA0219302145038
+B1115264535696N00606859EA0220602164039
+B1115364535730N00606910EA0222902182035
+B1115464535700N00606932EA0223802199040
+B1115564535724N00606892EA0226102213035
+B1116064535709N00606926EA0227702231039
+B1116164535731N00606882EA0229902249034
+B1116264535718N00606929EA0231702268038
+B1116364535723N00606872EA0232502285042
+B1116464535727N00606920EA0233702300044
+B1116564535723N00606872EA0234002312042
+B1117064535749N00606906EA0236502324046
+B1117164535707N00606904EA0236902338040
+B1117264535747N00606863EA0237602348039
+B1117364535743N00606907EA0238802358047
+B1117464535734N00606854EA0240402370039
+B1117564535740N00606896EA0241502382046
+B1118064535696N00606846EA0240802393047
+B1118164535668N00606749EA0239502397044
+B1118264535640N00606654EA0238702396043
+B1118364535610N00606552EA0236402391044
+B1118464535551N00606475EA0234902382045
+B1118574535484N00606385EA0233002367056
+B1119074535415N00606310EA0231502352059
+B1119174535346N00606227EA0230502338060
+B1119274535277N00606139EA0229302325058
+B1119374535213N00606051EA0227702310058
+B1119474535143N00605977EA0226102296058
+B1119574535077N00605889EA0224802281058
+B1120074535017N00605795EA0223302266058
+B1120174534958N00605699EA0221702251058
+B1120274534899N00605605EA0220002236059
+B1120374534838N00605509EA0218402220058
+B1120474534772N00605421EA0217002204058
+B1120574534710N00605326EA0215802189058
+B1121074534646N00605234EA0214902175058
+B1121174534583N00605140EA0214002162058
+B1121274534523N00605043EA0212802150058
+B1121374534459N00604954EA0211402137057
+B1121474534396N00604861EA0210002124058
+B1121574534334N00604767EA0208502111057
+B1122074534280N00604691EA0207802098045
+B1122174534235N00604618EA0207202087044
+B1122274534192N00604537EA0206002077043
+B1122374534146N00604457EA0204502066044
+B1122474534098N00604385EA0203502054044
+B1122574534044N00604327EA0202802044045
+B1123074533989N00604267EA0202702035042
+B1123174533944N00604202EA0203302030034
+B1123274533969N00604164EA0205002030040
+B1123374533940N00604186EA0206202036037
+B1123474533955N00604135EA0206702043040
+B1123574533983N00604176EA0208902052035
+B1124074533936N00604161EA0210402063045
+B1124174533953N00604160EA0212302076036
+B1124274533916N00604131EA0212602089040
+B1124374533959N00604100EA0214202101042
+B1124474533937N00604104EA0215502113045
+B1124574533954N00604098EA0216802127040
+B1125074533919N00604039EA0217202139039
+B1125174533891N00603953EA0216402149042
+B1125274533862N00603958EA0213202150048
+B1125374533902N00604017EA0212402142050
+B1125474533929N00604082EA0212002134048
+B1125574533949N00604148EA0213802130037
+B1126074533982N00604169EA0213402132042
+B1126174533973N00604087EA0213302131041
+B1126274533918N00604058EA0213202130048
+B1126374533951N00604042EA0213402130039
+B1126484533912N00604085EA0213602131040
+B1126584533848N00604084EA0212602131042
+B1127084533778N00604050EA0211102126044
+B1127184533719N00603990EA0209102117046
+B1127284533662N00603930EA0207602105043
+B1127384533608N00603873EA0205902091045
+B1127484533551N00603827EA0204402076042
+B1127584533491N00603793EA0202602061045
+B1128084533430N00603750EA0202202046040
+B1128184533376N00603707EA0201602035043
+B1128284533324N00603658EA0201002025044
+B1128384533276N00603621EA0201702017033
+B1128484533244N00603628EA0202402016037
+B1128584533287N00603645EA0203802019040
+B1129084533284N00603565EA0204402023035
+B1129184533241N00603517EA0203702027042
+B1129284533189N00603502EA0202802027033
+B1129384533136N00603499EA0202702025040
+B1129484533083N00603520EA0203702024037
+B1129584533083N00603576EA0202702025046
+B1130084533134N00603610EA0204302027044
+B1130184533170N00603567EA0205302032039
+B1130284533145N00603511EA0206802038037
+B1130384533099N00603522EA0208702048034
+B1130484533114N00603564EA0210102060038
+B1130584533138N00603507EA0211002073043
+B1131084533095N00603455EA0212402085039
+B1131184533077N00603497EA0212802096039
+B1131284533111N00603510EA0213402106029
+B1131384533143N00603435EA0213102113039
+B1131484533107N00603361EA0213002118041
+B1131584533063N00603296EA0209802117045
+B1132084533021N00603192EA0206702105056
+B1132184532968N00603086EA0203702087062
+B1132284532922N00602971EA0201302066060
+B1132384532876N00602857EA0198902043059
+B1132484532814N00602764EA0196402019058
+B1132584532746N00602684EA0193801995057
+B1133084532683N00602603EA0190601970056
+B1133184532630N00602511EA0189501944046
+B1133284532588N00602446EA0188301923041
+B1133384532542N00602385EA0187901906043
+B1133484532492N00602325EA0187301893044
+B1133584532447N00602260EA0186601882043
+B1134084532405N00602189EA0185801872042
+B1134184532363N00602117EA0184901862042
+B1134294532312N00602051EA0184101852043
+B1134394532261N00602001EA0182901843045
+B1134494532211N00601941EA0182001833043
+B1134594532161N00601886EA0180701824042
+B1135094532112N00601857EA0179901814043
+B1135194532078N00601826EA0179701806040
+B1135294532054N00601786EA0179201799041
+B1135394532036N00601718EA0178701794045
+B1135494532064N00601677EA0177001788039
+B1135594532027N00601698EA0175101776037
+B1136094531982N00601669EA0173301763045
+B1136194531931N00601620EA0171101748042
+B1136294531867N00601565EA0167801729056
+B1136394531796N00601520EA0164901707056
+B1136494531729N00601454EA0162701682058
+B1136594531666N00601381EA0160901660057
+B1137094531607N00601321EA0159901640047
+B1137194531559N00601265EA0159201624043
+B1137294531516N00601199EA0158401610043
+B1137394531469N00601142EA0157101598042
+B1137494531425N00601077EA0155701584044
+B1137594531385N00600999EA0154901571047
+B1138094531338N00600930EA0153901559045
+B1138194531289N00600860EA0152501546046
+B1138294531247N00600787EA0150901533046
+B1138394531203N00600713EA0149601519048
+B1138494531158N00600641EA0148201506042
+B1138594531110N00600583EA0146701495046
+B1139094531063N00600521EA0145301482047
+B1139194531014N00600450EA0143001466059
+B1139294530957N00600368EA0140901447059
+B1139394530897N00600298EA0138901428058
+B1139494530838N00600225EA0137001408057
+B1139594530785N00600155EA0135401389057
+B1140094530729N00600080EA0133701371058
+B1140194530669N00600014EA0132001353058
+B1140294530609N00559952EA0130301339056
+B1140394530548N00559889EA0128801321057
+B1140494530492N00559822EA0127601303053
+B1140594530445N00559754EA0126301286052
+B1141094530397N00559688EA0124901271051
+B1141194530345N00559628EA0123201255053
+B1141294530293N00559569EA0121601239051
+B1141394530240N00559508EA0120301224052
+B1141494530179N00559458EA0118501209053
+B1141594530118N00559406EA0117001193054
+B1142094530063N00559344EA0115401177050
+B1142204530002N00559281EA0114301161053
+B1142304529945N00559229EA0113301148051
+B1142404529886N00559179EA0112001135052
+B1142504529825N00559129EA0110701122052
+B1143004529768N00559076EA0109401109050
+B1143104529714N00559019EA0108101096052
+B1143204529658N00558962EA0106801083051
+B1143304529602N00558904EA0105101069049
+B1143404529535N00558863EA0103801054052
+B1143504529477N00558814EA0102001039051
+B1144004529421N00558765EA0099701022052
+B1144104529367N00558729EA0097501004040
+B1144204529314N00558680EA0094400982046
+B1144304529258N00558634EA0091600959050
+B1144404529200N00558584EA0088800933045
+B1144504529141N00558540EA0085900906046
+B1145004529081N00558486EA0084600881048
+B1145104529024N00558440EA0084300863034
+B1145204528974N00558406EA0082900850040
+B1145304528923N00558360EA0081600835040
+B1145404528868N00558318EA0079900820038
+B1145504528815N00558267EA0078500804038
+B1146004528763N00558210EA0077900791038
+B1146104528711N00558155EA0077200780040
+B1146204528676N00558096EA0077600773033
+B1146304528678N00558124EA0077500769038
+B1146404528617N00558125EA0078100766035
+B1146504528619N00558086EA0078300766035
+B1147004528618N00558136EA0078600767037
+B1147104528564N00558120EA0078900768031
+B1147204528570N00558088EA0079300770035
+B1147304528564N00558145EA0080500775037
+B1147404528519N00558117EA0080800781031
+B1147504528533N00558108EA0081700785036
+B1148004528488N00558144EA0082600794035
+B1148104528468N00558089EA0083200800037
+B1148204528486N00558101EA0083900805031
+B1148304528444N00558148EA0084400813037
+B1148404528417N00558096EA0085800819034
+B1148504528405N00558134EA0086600826040
+B1149004528370N00558088EA0087700834036
+B1149104528384N00558078EA0088700841039
+B1149204528335N00558089EA0089800853035
+B1149304528336N00558042EA0090300862037
+B1149404528327N00558092EA0091900873041
+B1149504528281N00558062EA0091800883037
+B1150014528308N00558033EA0092500889041
+B1150114528317N00558001EA0094900898037
+B1150214528268N00558002EA0096400911036
+B1150314528278N00558043EA0098000926042
+B1150414528291N00557997EA0098700941036
+B1150514528273N00557930EA0099300953039
+B1151014528286N00557938EA0101100966037
+B1151114528243N00557923EA0102800979034
+B1151214528262N00557933EA0104800995040
+B1151314528218N00557926EA0107101011031
+B1151414528245N00557895EA0107501027039
+B1151514528244N00557951EA0108701041032
+B1152014528201N00557933EA0110801055035
+B1152114528226N00557905EA0111001068038
+B1152214528225N00557963EA0112301079037
+B1152314528192N00557941EA0113901091036
+B1152414528221N00557977EA0114501101045
+B1152514528186N00557993EA0116101114042
+B1153014528217N00557981EA0116401125044
+B1153114528202N00558050EA0117201135047
+B1153214528178N00558007EA0118301143038
+B1153314528211N00558036EA0118401152046
+B1153414528175N00558063EA0119001159042
+B1153514528151N00558011EA0119701165039
+B1154014528173N00558029EA0120401172043
+B1154114528136N00558017EA0120901178043
+B1154214528111N00557964EA0120201183038
+B1154314528075N00557915EA0118901183040
+B1154414528039N00557868EA0116801179042
+B1154514527990N00557836EA0113201167054
+B1155014527920N00557822EA0110101147055
+B1155114527846N00557802EA0109601125044
+B1155214527816N00557753EA0110501110033
+B1155314527837N00557747EA0110001102042
+B1155414527797N00557785EA0109701096035
+B1155514527743N00557757EA0111001091035
+B1156014527734N00557719EA0111501092043
+B1156114527723N00557778EA0112701096036
+B1156214527684N00557744EA0113301102039
+B1156314527676N00557679EA0113501109039
+B1156414527677N00557603EA0115201115032
+B1156514527679N00557636EA0115401123042
+B1157014527662N00557573EA0117101130039
+B1157114527665N00557610EA0117401137033
+B1157214527630N00557553EA0119701146034
+B1157314527593N00557523EA0120501159037
+B1157424527625N00557529EA0122001173037
+B1157524527619N00557463EA0124001189040
+B1158024527631N00557490EA0125701205037
+B1158124527664N00557437EA0126901222040
+B1158224527628N00557397EA0126501233038
+B1158324527574N00557397EA0128101242041
+B1158424527570N00557331EA0129101252043
+B1158524527586N00557345EA0128801262042
+B1159024527544N00557305EA0129601268035
+B1159124527542N00557215EA0129501274044
+B1159224527548N00557118EA0126201274056
+B1159324527553N00557000EA0125001263053
+B1159424527567N00556915EA0126401258037
+B1159524527570N00556933EA0127901257035
+B1200024527574N00556858EA0129301261038
+B1200124527613N00556867EA0131001270037
+B1200224527587N00556855EA0132301282045
+B1200324527622N00556845EA0134501295045
+B1200424527624N00556811EA0136601308038
+B1200524527655N00556835EA0138201324042
+B1201024527625N00556811EA0140001340038
+B1201124527660N00556804EA0142001356039
+B1201224527623N00556798EA0144301373041
+B1201324527652N00556765EA0146501392039
+B1201424527634N00556778EA0148501414047
+B1201524527661N00556787EA0150801435037
+B1202024527641N00556762EA0152801457036
+B1202124527662N00556783EA0154601479041
+B1202224527629N00556754EA0156001500039
+B1202324527656N00556754EA0157401518045
+B1202424527620N00556708EA0158801535041
+B1202524527597N00556622EA0160501551037
+B1203024527558N00556567EA0160801566045
+B1203124527518N00556517EA0159301575043
+B1203224527479N00556466EA0158901578033
+B1203324527436N00556414EA0159401580038
+B1203424527391N00556383EA0160201584040
+B1203524527419N00556423EA0159401587043
+B1204024527469N00556456EA0159201588041
+B1204124527512N00556502EA0157601587040
+B1204224527553N00556546EA0157101582039
+B1204324527597N00556589EA0157901576038
+B1204424527640N00556621EA0160701575040
+B1204524527624N00556599EA0163501583036
+B1205034527629N00556608EA0165701600046
+B1205134527647N00556575EA0168401618046
+B1205234527624N00556565EA0171301640040
+B1205334527655N00556571EA0174601665043
+B1205434527659N00556547EA0178401694050
+B1205534527638N00556548EA0182301727050
+B1206034527644N00556556EA0185501760051
+B1206134527663N00556534EA0189201793047
+B1206234527643N00556508EA0192301827040
+B1206334527672N00556486EA0195401858044
+B1206434527634N00556465EA0198101890044
+B1206534527656N00556457EA0201801922042
+B1207034527634N00556420EA0203501952042
+B1207134527631N00556458EA0205301980037
+B1207234527575N00556443EA0203802001042
+B1207334527517N00556435EA0202602011042
+B1207434527453N00556430EA0200502011053
+B1207534527382N00556415EA0198602005056
+B1208034527311N00556406EA0196401994059
+B1208134527240N00556395EA0194101980056
+B1208234527169N00556398EA0192301963057
+B1208334527103N00556404EA0190801946059
+B1208434527036N00556407EA0189601931055
+B1208534526967N00556413EA0188201916056
+B1209034526901N00556426EA0187101902057
+B1209134526834N00556445EA0186101889048
+B1209234526768N00556449EA0184301875047
+B1209334526706N00556451EA0185501863044
+B1209434526652N00556448EA0188001861045
+B1209534526634N00556488EA0188801866040
+B1210034526682N00556473EA0191001873039
+B1210134526660N00556433EA0192901888039
+B1210234526607N00556422EA0194601904045
+B1210334526556N00556406EA0195101919041
+B1210434526497N00556398EA0195401931044
+B1210534526431N00556390EA0196301938045
+B1211034526372N00556374EA0197901948050
+B1211134526305N00556353EA0198901960052
+B1211234526234N00556335EA0199701969046
+B1211334526169N00556313EA0200001978052
+B1211434526103N00556282EA0200901986057
+B1211534526035N00556252EA0200601994055
+B1212034525963N00556220EA0200901997044
+B1212134525899N00556181EA0201002000060
+B1212234525844N00556141EA0203102006050
+B1212334525801N00556111EA0204502015037
+B1212434525756N00556086EA0207302027031
+B1212544525709N00556058EA0207002044045
+B1213044525643N00556019EA0205702051057
+B1213144525573N00555984EA0203902049044
+B1213244525506N00555970EA0203702045050
+B1213344525447N00555935EA0202402040057
+B1213444525384N00555906EA0202902035038
+B1213544525334N00555873EA0202002031043
+B1214044525280N00555840EA0200802024047
+B1214144525226N00555824EA0200802017039
+B1214244525174N00555795EA0199802012044
+B1214344525122N00555755EA0198902005047
+B1214444525061N00555723EA0198201998041
+B1214544525004N00555698EA0199201993041
+B1215044524948N00555654EA0201801996044
+B1215144524897N00555620EA0203702005044
+B1215244524846N00555583EA0205202018042
+B1215344524787N00555536EA0205502029045
+B1215444524741N00555489EA0206102038040
+B1215544524687N00555459EA0207802048051
+B1216044524638N00555411EA0209702061040
+B1216144524586N00555364EA0209102072042
+B1216244524519N00555315EA0208302075052
+B1216344524455N00555267EA0208102075046
+B1216444524396N00555228EA0212502083036
+B1216544524356N00555176EA0213502099041
+B1217044524307N00555125EA0214102112046
+B1217144524259N00555081EA0214002122051
+B1217244524198N00555029EA0215202129045
+B1217344524132N00554977EA0215602136040
+B1217444524071N00554924EA0215202140053
+B1217544524012N00554874EA0216402145050
+B1218044523950N00554815EA0217002150051
+B1218144523888N00554770EA0217802157047
+B1218244523829N00554731EA0218602163047
+B1218344523772N00554696EA0218402170046
+B1218444523700N00554653EA0216502169056
+B1218544523626N00554599EA0217402167058
+B1219044523551N00554560EA0218302169057
+B1219144523478N00554530EA0220302175051
+B1219244523420N00554505EA0221302185047
+B1219344523359N00554498EA0220402192050
+B1219444523300N00554503EA0220202195041
+B1219544523237N00554479EA0220302196051
+B1220044523167N00554449EA0220802198050
+B1220144523095N00554424EA0219602198055
+B1220244523010N00554392EA0219002195057
+B1220344522929N00554354EA0218102191055
+B1220454522842N00554321EA0217302184060
+B1220554522762N00554298EA0216202176057
+B1221054522681N00554272EA0216102170057
+B1221154522598N00554249EA0215302163055
+B1221254522518N00554218EA0215102157055
+B1221354522444N00554194EA0214002151052
+B1221454522369N00554181EA0213002144057
+B1221554522292N00554153EA0212002136057
+B1222054522216N00554124EA0211202128054
+B1222154522138N00554109EA0211202120061
+B1222254522073N00554103EA0212702117048
+B1222354522021N00554093EA0214402121030
+B1222454521976N00554048EA0215402128045
+B1222554521929N00554012EA0217802139043
+B1223054521880N00553981EA0219102153040
+B1223154521827N00553944EA0219802167039
+B1223254521771N00553912EA0219302175040
+B1223354521717N00553878EA0218802179042
+B1223454521664N00553827EA0219502181045
+B1223554521615N00553773EA0220802186033
+B1224054521571N00553742EA0221802193043
+B1224154521536N00553706EA0225002204040
+B1224254521494N00553676EA0228802225044
+B1224354521443N00553645EA0230902249038
+B1224454521400N00553598EA0232402269038
+B1224554521354N00553554EA0235302290037
+B1225054521305N00553507EA0237102313045
+B1225154521248N00553446EA0237602332052
+B1225254521192N00553398EA0235602343051
+B1225354521131N00553345EA0233502343053
+B1225454521071N00553299EA0230302335059
+B1225554521013N00553254EA0228402321055
+B1226054520966N00553200EA0229202308052
+B1226154520921N00553164EA0227602300046
+B1226254520882N00553121EA0227802290037
+B1226354520843N00553081EA0228702286048
+B1226454520795N00553045EA0228602285045
+B1226554520750N00553018EA0228702285042
+B1227054520707N00552985EA0227402282047
+B1227154520655N00552947EA0227302277046
+B1227254520606N00552910EA0228802276042
+B1227354520560N00552864EA0229002279048
+B1227454520512N00552817EA0229502283047
+B1227554520462N00552780EA0229802285040
+B1228054520411N00552735EA0229502287044
+B1228164520363N00552690EA0231602290044
+B1228264520322N00552656EA0233602300036
+B1228364520270N00552618EA0235602313048
+B1228464520218N00552587EA0238902332044
+B1228564520184N00552541EA0240902353032
+B1229064520140N00552508EA0240802370041
+B1229164520081N00552484EA0240502381046
+B1229264520030N00552439EA0241902388041
+B1229364519980N00552394EA0242502398044
+B1229464519923N00552350EA0244102408048
+B1229564519874N00552310EA0246302420047
+B1230064519818N00552274EA0246602434042
+B1230164519762N00552239EA0245102441046
+B1230264519706N00552208EA0244102441045
+B1230364519651N00552167EA0241502436043
+B1230464519598N00552116EA0240502426046
+B1230564519546N00552063EA0239102416043
+B1231064519484N00552023EA0236202402054
+B1231164519419N00551987EA0235702386049
+B1231264519358N00551956EA0235802376047
+B1231364519306N00551923EA0234302365048
+B1231464519260N00551892EA0234302356050
+B1231564519214N00551853EA0234302350038
+B1232064519168N00551821EA0232802345046
+B1232164519106N00551782EA0231302336052
+B1232264519044N00551748EA0231102326052
+B1232364518983N00551719EA0231002321055
+B1232464518920N00551684EA0230502316055
+B1232564518867N00551644EA0231602312036
+B1233064518818N00551601EA0232202314034
+B1233164518762N00551567EA0232202315045
+B1233264518708N00551535EA0231702316042
+B1233364518654N00551503EA0231702316038
+B1233464518621N00551457EA0232102316040
+B1233564518603N00551408EA0233902319040
+B1234064518591N00551350EA0235502326034
+B1234164518576N00551278EA0236302335048
+B1234264518555N00551211EA0237102345043
+B1234364518537N00551135EA0235402351046
+B1234464518515N00551055EA0234202350044
+B1234564518488N00550976EA0233302346044
+B1235064518465N00550903EA0232502340044
+B1235164518442N00550818EA0231102332055
+B1235264518419N00550732EA0230002324052
+B1235364518401N00550649EA0227602313050
+B1235464518379N00550561EA0224902296057
+B1235564518362N00550474EA0222602277055
+B1236064518345N00550384EA0220602257051
+B1236174518322N00550286EA0218602234048
+B1236274518302N00550193EA0218102216056
+B1236374518290N00550128EA0218002204038
+B1236474518277N00550057EA0216702193042
+B1236574518255N00549997EA0215002181045
+B1237074518234N00549943EA0214802170040
+B1237174518217N00549886EA0213302161041
+B1237274518201N00549822EA0212302149040
+B1237374518237N00549762EA0212502139046
+B1237474518284N00549716EA0212302134040
+B1237574518323N00549757EA0211202128044
+B1238074518284N00549832EA0209702120038
+B1238174518222N00549828EA0209302111044
+B1238274518170N00549833EA0208502104040
+B1238374518118N00549820EA0208102097040
+B1238474518069N00549800EA0207202089043
+B1238574518042N00549799EA0207002083041
+B1239074518017N00549787EA0209102081039
+B1239174518060N00549789EA0210802085042
+B1239274518047N00549814EA0212902093034
+B1239374518094N00549809EA0214602108038
+B1239474518088N00549869EA0216502122029
+B1239574518097N00549841EA0218602140042
+B1240074518106N00549890EA0221402158035
+B1240174518146N00549867EA0222802179040
+B1240274518150N00549940EA0223102197041
+B1240374518121N00549929EA0224202208032
+B1240474518160N00549900EA0224302221044
+B1240574518167N00549969EA0226002232041
+B1241074518166N00549933EA0226602244037
+B1241174518223N00549975EA0225202249042
+B1241274518209N00550061EA0226102252042
+B1241374518174N00550110EA0227302258037
+B1241474518136N00550110EA0228102264039
+B1241574518097N00550076EA0228602271043
+B1242074518066N00550021EA0230402278039
+B1242174518042N00550052EA0232402288044
+B1242274518072N00550030EA0234402303043
+B1242374518039N00550009EA0234102317039
+B1242474518013N00549975EA0236602329039
+B1242574518030N00550007EA0238802346044
+B1243074517991N00550006EA0240102362039
+B1243174517966N00549964EA0242402379041
+B1243274517943N00549911EA0245102399045
+B1243374517918N00549866EA0246902420041
+B1243474517897N00549811EA0245102436050
+B1243584517883N00549726EA0242502439058
+B1244084517882N00549650EA0240902435053
+B1244184517877N00549565EA0238602425058
+B1244284517880N00549485EA0239902414046
+B1244384517892N00549428EA0241202410039
+B1244484517882N00549385EA0242602412043
+B1244584517865N00549321EA0242802416042
+B1245084517843N00549245EA0240302417049
+B1245184517826N00549167EA0238602411056
+B1245284517810N00549076EA0237202400055
+B1245384517791N00548986EA0235802389061
+B1245484517773N00548897EA0235102377056
+B1245584517756N00548804EA0234002367058
+B1246084517742N00548708EA0232302356059
+B1246184517727N00548615EA0230602342062
+B1246284517714N00548517EA0230002329059
+B1246384517700N00548422EA0230202319058
+B1246484517699N00548343EA0232702317033
+B1246584517673N00548360EA0233302320042
+B1247084517726N00548394EA0233702325044
+B1247184517742N00548328EA0234502332040
+B1247284517731N00548247EA0233602335052
+B1247384517718N00548155EA0233002334048
+B1247484517699N00548070EA0232202331054
+B1247584517680N00547982EA0233002329051
+B1248084517657N00547896EA0233102330054
+B1248184517631N00547808EA0233002330050
+B1248284517608N00547739EA0235302332035
+B1248384517603N00547677EA0238402344036
+B1248484517580N00547637EA0239902359037
+B1248584517604N00547668EA0242702377038
+B1249084517634N00547594EA0244702397040
+B1249184517622N00547520EA0248602420036
+B1249284517594N00547474EA0252302450039
+B1249384517616N00547494EA0255602479042
+B1249484517582N00547480EA0258202509038
+B1249584517552N00547511EA0261102538041
+B1250084517588N00547511EA0264302568043
+B1250184517561N00547468EA0265702596045
+B1250284517519N00547423EA0268002617040
+B1250384517489N00547384EA0270302640039
+B1250484517460N00547335EA0271102662048
+B1250584517428N00547264EA0272902680058
+B1251084517407N00547189EA0274602699045
+B1251184517383N00547120EA0275002715046
+B1251284517361N00547051EA0275302727048
+B1251384517338N00546978EA0276602738045
+B1251494517307N00546886EA0276202749045
+B1251594517267N00546786EA0274502750054
+B1252094517225N00546690EA0272602745054
+B1252194517178N00546600EA0270402735057
+B1252294517127N00546515EA0268302721061
+B1252394517076N00546434EA0266202705060
+B1252494517027N00546357EA0264202688059
+B1252594516983N00546272EA0262002669056
+B1253094516939N00546187EA0260402649057
+B1253194516891N00546105EA0259102631058
+B1253294516839N00546033EA0257802615058
+B1253394516787N00545957EA0256202599059
+B1253494516735N00545886EA0254602583059
+B1253594516680N00545819EA0252702566060
+B1254094516626N00545747EA0250802549059
+B1254194516568N00545684EA0248702531056
+B1254294516510N00545620EA0245902511057
+B1254394516450N00545563EA0243102488058
+B1254494516393N00545511EA0240202463056
+B1254594516338N00545466EA0237002437056
+B1255094516283N00545423EA0234402409055
+B1255194516235N00545392EA0231602382057
+B1255294516186N00545372EA0229702356056
+B1255394516134N00545353EA0227902332056
+B1255494516075N00545343EA0226302310058
+B1255594516024N00545337EA0222302287054
+B1256094515966N00545334EA0218702259050
+B1256194515911N00545333EA0215202228051
+B1256294515861N00545346EA0211102195054
+B1256394515807N00545365EA0206902160056
+B1256494515745N00545362EA0205302125050
+B1256594515684N00545364EA0204502098052
+B1257094515635N00545362EA0204702079046
+B1257194515595N00545369EA0204502067041
+B1257294515558N00545376EA0204702059049
+B1257394515525N00545386EA0202602051039
+B1257494515554N00545332EA0200002040039
+B1257594515589N00545410EA0197602023041
+B1258094515613N00545495EA0196402005039
+B1258194515633N00545562EA0196101991037
+B1258294515612N00545529EA0196801980041
+B1258394515655N00545546EA0195801975038
+B1258494515682N00545605EA0196301968035
+B1258594515680N00545658EA0197801968044
+B1259094515691N00545636EA0199101972046
+B1259194515677N00545615EA0200701979040
+B1259304515714N00545642EA0202101989043
+B1259404515699N00545615EA0203702001048
+B1259504515704N00545652EA0206102015041
+B1300004515722N00545607EA0207802032042
+B1300104515720N00545639EA0210102050038
+B1300204515726N00545586EA0211702069045
+B1300304515726N00545613EA0213602088039
+B1300404515742N00545565EA0214902105042
+B1300504515762N00545626EA0215302119044
+B1301004515725N00545628EA0216602133040
+B1301104515754N00545584EA0217202143042
+B1301204515792N00545615EA0216402152043
+B1301304515834N00545651EA0215702155039
+B1301404515871N00545685EA0214802155042
+B1301504515915N00545737EA0215002153048
+B1302004515969N00545787EA0215102152043
+B1302104516021N00545843EA0215002151042
+B1302204516073N00545901EA0216202151043
+B1302304516119N00545966EA0218002155044
+B1302404516102N00545994EA0217902161044
+B1302504516140N00545951EA0219502169042
+B1303004516196N00545999EA0219202177041
+B1303104516240N00546060EA0217402179044
+B1303204516286N00546119EA0215102175042
+B1303304516333N00546196EA0213102165049
+B1303404516384N00546272EA0210802150050
+B1303504516448N00546324EA0211202136036
+B1304004516503N00546373EA0213402130036
+B1304104516528N00546432EA0215702135049
+B1304204516548N00546408EA0218302146041
+B1304304516538N00546425EA0220202161046
+B1304404516599N00546429EA0222302178043
+B1304504516659N00546462EA0222902195041
+B1305004516716N00546510EA0220302204045
+B1305104516777N00546562EA0218402203041
+B1305204516840N00546601EA0216202195042
+B1305304516905N00546649EA0214102183045
+B1305404516979N00546686EA0212102167041
+B1305504517056N00546725EA0210202150045
+B1306004517145N00546762EA0210202134036
+B1306104517224N00546788EA0211102124039
+B1306204517283N00546829EA0210002119041
+B1306304517263N00546845EA0210002113042
+B1306404517273N00546785EA0210402108044
+B1306504517307N00546713EA0210902108039
+B1307004517289N00546716EA0211102108038
+B1307114517343N00546788EA0211902111038
+B1307214517361N00546758EA0212902114033
+B1307314517364N00546812EA0214402120036
+B1307414517422N00546786EA0215302130040
+B1307514517406N00546758EA0216602140036
+B1308014517416N00546836EA0217902150035
+B1308114517484N00546846EA0219302163037
+B1308214517461N00546833EA0221002176037
+B1308314517453N00546829EA0222502189043
+B1308414517472N00546891EA0224702205043
+B1308514517492N00546886EA0226702221044
+B1309014517471N00546924EA0228402239041
+B1309114517493N00546883EA0230202256041
+B1309214517490N00546934EA0231502272043
+B1309314517444N00546938EA0232902288042
+B1309414517392N00546950EA0233302301043
+B1309514517350N00546963EA0233802312037
+B1310014517311N00546961EA0232702319041
+B1310114517274N00546953EA0232302321042
+B1310214517236N00546966EA0233602322043
+B1310314517210N00546967EA0235702329042
+B1310414517256N00547008EA0238202340038
+B1310514517273N00547001EA0240002353043
+B1311014517286N00547075EA0243102372046
+B1311114517324N00547067EA0244702392040
+B1311214517327N00547095EA0247302412039
+B1311314517381N00547120EA0249402435045
+B1311414517383N00547113EA0251902455041
+B1311514517445N00547150EA0253602478039
+B1312014517475N00547251EA0256602501045
+B1312114517502N00547234EA0258102520037
+B1312214517503N00547204EA0260802540043
+B1312314517534N00547277EA0263402566044
+B1312414517538N00547379EA0266002592043
+B1312514517547N00547483EA0269502620037
+B1313014517557N00547583EA0270502646054
+B1313114517571N00547694EA0270202665052
+B1313214517587N00547806EA0270002680054
+B1313314517592N00547925EA0267902684054
+B1313414517591N00548048EA0264802678057
+B1313514517601N00548175EA0261602664058
+B1314014517617N00548274EA0260402648058
+B1314114517628N00548379EA0260102633051
+B1314214517642N00548472EA0258602620040
+B1314314517659N00548558EA0257202607045
+B1314414517673N00548651EA0256302596045
+B1314514517689N00548739EA0255002584045
+B1315024517706N00548845EA0253602571047
+B1315124517720N00548942EA0252402559048
+B1315224517722N00549031EA0251102548043
+B1315324517721N00549114EA0249302534044
+B1315424517724N00549196EA0247402518040
+B1315524517747N00549279EA0247402503046
+B1316024517762N00549352EA0248902495042
+B1316124517772N00549422EA0249902494039
+B1316224517783N00549491EA0250502497040
+B1316324517791N00549570EA0251602501057
+B1316424517805N00549650EA0253902509045
+B1316524517830N00549707EA0254402519047
+B1317024517841N00549787EA0253802526043
+B1317124517850N00549876EA0253202530049
+B1317224517864N00549979EA0252902531054
+B1317324517892N00550087EA0253202531057
+B1317424517920N00550197EA0252002530056
+B1317524517962N00550313EA0250502522055
+B1318024518002N00550430EA0249402513057
+B1318124518037N00550555EA0247502502055
+B1318224518082N00550672EA0246402490054
+B1318324518128N00550786EA0245002477053
+B1318424518182N00550891EA0242802463059
+B1318524518235N00550984EA0240402445057
+B1319024518288N00551085EA0238302425059
+B1319124518357N00551157EA0237402407055
+B1319224518420N00551233EA0237402393050
+B1319324518472N00551295EA0240002389039
+B1319424518522N00551361EA0242402396052
+B1319524518570N00551426EA0245102409049
+B1320024518617N00551498EA0246702425048
+B1320124518671N00551559EA0247502441046
+B1320224518738N00551598EA0247702450055
+B1320324518811N00551641EA0247702458060
+B1320424518889N00551682EA0248702464057
+B1320524518958N00551719EA0249502472052
+B1321024519020N00551751EA0251202482042
+B1321124519070N00551759EA0250602491047
+B1321224519118N00551774EA0249002493040
+B1321324519163N00551819EA0247802488044
+B1321434519210N00551882EA0245802482056
+B1321534519277N00551936EA0244702470059
+B1322034519338N00552000EA0243102459053
+B1322134519398N00552058EA0241502445053
+B1322234519451N00552122EA0239902431055
+B1322334519507N00552181EA0238402417051
+B1322434519553N00552223EA0236102401041
+B1322534519599N00552270EA0233702382046
+B1323034519657N00552326EA0231502361054
+B1323134519711N00552367EA0229402339049
+B1323234519781N00552410EA0229702323053
+B1323334519840N00552450EA0229202313045
+B1323434519891N00552500EA0231402307055
+B1323534519942N00552560EA0232802310050
+B1324034519985N00552609EA0235302320041
+B1324134520031N00552653EA0238302335040
+B1324234520092N00552706EA0240802355048
+B1324334520153N00552763EA0243502377044
+B1324434520206N00552810EA0244902398044
+B1324544520265N00552870EA0246802419046
+B1325044520321N00552921EA0245602433055
+B1325144520377N00552995EA0243702435057
+B1325244520436N00553060EA0243002432057
+B1325344520497N00553121EA0241502427055
+B1325444520554N00553175EA0240302420047
+B1325544520613N00553224EA0238502408042
+B1326044520671N00553276EA0236202395049
+B1326144520736N00553336EA0234202377056
+B1326244520808N00553406EA0232502360059
+B1326344520876N00553476EA0230602343055
+B1326444520940N00553547EA0228902325053
+B1326544521006N00553586EA0226902307054
+B1327044521064N00553628EA0224202286053
+B1327144521115N00553664EA0223402266041
+B1327244521160N00553682EA0223202252045
+B1327344521211N00553695EA0223602244041
+B1327444521262N00553727EA0224802242033
+B1327544521307N00553781EA0225302243044
+B1328044521354N00553831EA0227702248036
+B1328144521393N00553870EA0226902255038
+B1328244521443N00553928EA0226502257047
+B1328344521476N00553991EA0227002259042
+B1328444521469N00554034EA0225902261040
+B1328544521486N00553977EA0225602259040
+B1329044521548N00553955EA0225502259045
+B1329144521612N00553965EA0224502256044
+B1329244521674N00553984EA0224002250037
+B1329344521729N00554021EA0225102247048
+B1329444521782N00554048EA0224902248041
+B1329544521836N00554059EA0224002245043
+B1330044521891N00554060EA0223802242045
+B1330144521951N00554094EA0221802235057
+B1330244522022N00554129EA0220402225056
+B1330344522094N00554164EA0219402214057
+B1330444522158N00554224EA0217502202058
+B1330544522228N00554264EA0215802187058
+B1331044522301N00554291EA0214202172055
+B1331144522374N00554315EA0212802156057
+B1331244522449N00554344EA0211502142057
+B1331344522525N00554365EA0210202127060
+B1331444522596N00554387EA0208802114056
+B1331544522665N00554403EA0207302100055
+B1332044522734N00554420EA0205602085057
+B1332144522801N00554441EA0204202071054
+B1332244522856N00554452EA0205002061047
+B1332344522905N00554461EA0205502058043
+B1332444522953N00554473EA0204902055043
+B1332554523006N00554481EA0203902050041
+B1333054523062N00554493EA0203502044042
+B1333154523115N00554494EA0203302040043
+B1333254523166N00554497EA0204402038037
+B1333354523177N00554527EA0205802043041
+B1333454523177N00554471EA0207602050043
+B1333554523164N00554475EA0209602061042
+B1334054523199N00554419EA0211202076038
+B1334154523217N00554462EA0213302091039
+B1334254523196N00554414EA0214802107039
+B1334354523244N00554415EA0217102125040
+B1334454523226N00554424EA0219802145045
+B1334554523245N00554420EA0222702166046
+B1335054523223N00554366EA0225102190042
+B1335154523222N00554383EA0226802212043
+B1335254523234N00554318EA0228302233040
+B1335354523272N00554355EA0229102251040
+B1335454523276N00554420EA0230002265037
+B1335554523251N00554380EA0231402279044
+B1336054523267N00554414EA0232402292044
+B1336154523244N00554472EA0233402305039
+B1336254523222N00554438EA0233602316043
+B1336354523275N00554404EA0234502324040
+B1336454523327N00554411EA0236002334043
+B1336554523306N00554397EA0237602347049
+B1337054523364N00554349EA0239202360043
+B1337154523427N00554333EA0237902371041
+B1337254523490N00554336EA0235202371053
+B1337354523564N00554343EA0233402362054
+B1337454523635N00554351EA0231502350056
+B1337554523704N00554354EA0230002337056
+B1338054523774N00554357EA0228802323053
+B1338154523842N00554360EA0227602310053
+B1338254523916N00554356EA0226002296055
+B1338354523992N00554342EA0224202281054
+B1338454524063N00554339EA0222802266053
+B1338554524136N00554340EA0221602251056
+B1339054524213N00554322EA0220502237057
+B1339154524286N00554307EA0220102225056
+B1339254524343N00554303EA0219902216047
+B1339354524395N00554291EA0219802209042
+B1339454524447N00554289EA0219202203043
+B1339554524504N00554282EA0218402197042
+B1340054524563N00554280EA0217702190044
+B1340154524620N00554267EA0216302183044
+B1340254524678N00554252EA0214502172051
+B1340354524738N00554268EA0214902162035
+B1340464524795N00554239EA0216102155038
+B1340564524839N00554263EA0218902161037
+B1341064524810N00554289EA0222202174042
+B1341164524837N00554319EA0224602193050
+B1341264524808N00554314EA0227402216042
+B1341364524833N00554324EA0230502242043
+B1341464524784N00554334EA0232902266041
+B1341564524805N00554282EA0235002291042
+B1342064524826N00554317EA0236102314044
+B1342164524772N00554327EA0239002334040
+B1342264524794N00554289EA0241002354041
+B1342364524766N00554332EA0242902374030
+B1342464524749N00554273EA0242602391035
+B1342564524789N00554238EA0243302404041
+B1343064524841N00554238EA0245502417043
+B1343164524903N00554240EA0247702433042
+B1343264524960N00554241EA0249002450042
+B1343364525016N00554242EA0249202464050
+B1343464525090N00554255EA0252002476050
+B1343564525164N00554262EA0253802493058
+B1344064525235N00554280EA0256402512057
+B1344164525310N00554296EA0258202531055
+B1344264525391N00554328EA0259902550051
+B1344364525461N00554376EA0260202565057
+B1344464525523N00554427EA0260402577055
+B1344564525573N00554489EA0261502587053
+B1345064525587N00554516EA0258602594080
+B1345174525578N00554517EV0251002593103
+B1345264525520N00554541EA0247402585078
+B1345364525580N00554517EA0246702561047
+B1345464525652N00554526EA0245002529054
+B1345564525719N00554564EA0243802501055
+B1346064525788N00554621EA0245802482058
+B1346164525857N00554692EA0247002474051
+B1346264525925N00554744EA0246602470056
+B1346364525990N00554789EA0245502466052
+B1346464526061N00554821EA0244302458056
+B1346564526132N00554844EA0242802450058
+B1347064526199N00554866EA0240502439057
+B1347164526268N00554898EA0238502423060
+B1347264526337N00554903EA0236602407063
+B1347364526395N00554919EA0234002387054
+B1347464526461N00554936EA0232602367053
+B1347564526532N00554948EA0231702349050
+B1348064526588N00554941EA0231002336038
+B1348164526644N00554951EA0227802321043
+B1348274526726N00554964EA0224002296056
+B1348374526807N00554988EA0221602271054
+B1348474526879N00555041EA0218402246056
+B1348574526952N00555083EA0216702221052
+B1349074527024N00555119EA0216402201051
+B1349174527094N00555155EA0216202186052
+B1349274527163N00555193EA0214902175055
+B1349374527237N00555231EA0213202162057
+B1349474527306N00555266EA0211802148053
+B1349574527376N00555297EA0210702134056
+B1350074527442N00555323EA0209402122052
+B1350174527514N00555343EA0206902106055
+B1350274527589N00555371EA0205702089056
+B1350374527659N00555393EA0204302074057
+B1350474527728N00555404EA0203202059054
+B1350574527797N00555418EA0202402047051
+B1351074527865N00555432EA0201902035046
+B1351174527927N00555451EA0202002027050
+B1351274527985N00555464EA0203102024037
+B1351374528010N00555427EA0202202023041
+B1351474528062N00555438EA0201902020036
+B1351574528098N00555517EA0200802017044
+B1352074528105N00555623EA0199202010041
+B1352174528132N00555705EA0197502000045
+B1352274528184N00555744EA0196701989040
+B1352374528207N00555712EA0195401978044
+B1352474528186N00555637EA0193801965055
+B1352574528160N00555555EA0192101952054
+B1353074528122N00555479EA0190701937055
+B1353174528071N00555420EA0190101923046
+B1353274528013N00555415EA0189601913039
+B1353374527948N00555420EA0190301906034
+B1353474527944N00555396EA0190901903037
+B1353574527979N00555441EA0191501905034
+B1354074527957N00555419EA0191401905038
+B1354174527896N00555433EA0192701907035
+B1354274527873N00555398EA0194001914042
+B1354374527856N00555437EA0195201923038
+B1354474527844N00555386EA0196001932039
+B1354574527872N00555410EA0197901942044
+B1355074527844N00555384EA0199501954041
+B1355174527874N00555390EA0200201967044
+B1355274527842N00555398EA0202001979042
+B1355374527874N00555408EA0202701991043
+B1355474527833N00555439EA0204502004040
+B1355574527846N00555399EA0205102016039
+B1356074527880N00555455EA0206802028043
+B1356184527847N00555456EA0208502044043
+B1356284527880N00555494EA0210502059043
+B1356384527841N00555494EA0212702075040
+B1356484527870N00555509EA0214102092046
+B1356584527829N00555507EA0216002110038
+B1357084527861N00555521EA0217502127039
+B1357184527827N00555529EA0219002144042
+B1357284527865N00555501EA0220202159036
+B1357384527846N00555462EA0219002170042
+B1357484527791N00555499EA0220102177039
+B1357584527745N00555483EA0219502183041
+B1358084527792N00555463EA0218402183041
+B1358184527844N00555514EA0218102181045
+B1358284527877N00555605EA0218402181040
+B1358384527916N00555681EA0217902180042
+B1358484527962N00555746EA0216602177043
+B1358584528007N00555816EA0214902169042
+B1359084528054N00555899EA0211402156062
+B1359184528113N00555992EA0209102137058
+B1359284528176N00556079EA0206102115059
+B1359384528239N00556172EA0203602090059
+B1359484528296N00556261EA0201402067056
+B1359584528356N00556336EA0198802043056
+B1400084528417N00556414EA0196702018059
+B1400184528483N00556489EA0195101996057
+B1400284528543N00556559EA0194201976039
+B1400384528597N00556612EA0192501960045
+B1400484528654N00556666EA0191501947048
+B1400584528714N00556706EA0190201935044
+B1401084528777N00556740EA0189001922048
+B1401184528839N00556758EA0187501910047
+B1401284528897N00556783EA0186001896046
+B1401384528955N00556812EA0184501882046
+B1401484529011N00556853EA0182401866043
+B1401584529064N00556905EA0181001849044
+B1402084529113N00556974EA0179101831046
+B1402184529160N00557055EA0177001813046
+B1402284529214N00557133EA0175601801046
+B1402384529265N00557210EA0174601784046
+B1402484529314N00557289EA0173501769047
+B1402584529361N00557368EA0172101755046
+B1403084529405N00557445EA0170801741044
+B1403184529447N00557515EA0169301729047
+B1403284529496N00557583EA0168401714046
+B1403384529548N00557645EA0166601701047
+B1403484529599N00557715EA0164801685047
+B1403594529653N00557794EA0164101667045
+B1404094529703N00557856EA0163101654046
+B1404194529752N00557915EA0161901642045
+B1404294529797N00557981EA0160501629047
+B1404394529844N00558041EA0159201617046
+B1404494529893N00558102EA0157601604046
+B1404594529959N00558148EA0155701591055
+B1405094530021N00558214EA0154101575054
+B1405194530078N00558288EA0152301558056
+B1405294530128N00558377EA0150201540057
+B1405394530175N00558467EA0148401522058
+B1405494530228N00558546EA0146301503057
+B1405594530282N00558620EA0144501483054
+B1406094530334N00558687EA0142701464051
+B1406194530385N00558755EA0140801444053
+B1406294530432N00558825EA0138801428054
+B1406394530468N00558916EA0137201410054
+B1406494530501N00559002EA0135301391053
+B1406594530548N00559069EA0133701371055
+B1407094530595N00559136EA0132501352055
+B1407194530634N00559211EA0130701335052
+B1407294530676N00559283EA0129101318052
+B1407394530717N00559360EA0127401301052
+B1407494530759N00559438EA0125601284055
+B1407594530804N00559510EA0124101267054
+B1408094530849N00559580EA0122401250054
+B1408194530894N00559651EA0121101233055
+B1408294530935N00559723EA0119501217054
+B1408394530977N00559796EA0117901201052
+B1408494531019N00559871EA0115901184053
+B1408594531067N00559937EA0115001168053
+B1409094531108N00600013EA0113101153056
+B1409194531147N00600088EA0111901137049
+B1409294531181N00600159EA0109901121052
+B1409394531216N00600220EA0108101103050
+B1409494531257N00600276EA0106101086056
+B1409594531305N00600341EA0103601067057
+B1410094531349N00600407EA0102101047054
+B1410194531388N00600471EA0100201028057
+B1410294531428N00600537EA0098001009055
+B1410394531468N00600608EA0095600989054
+B1410494531516N00600678EA0094000967054
+B1410594531550N00600726EA0092200948048
+B1411094531592N00600774EA0090000929054
+B1411194531634N00600839EA0088100909051
+B1411294531679N00600899EA0086900889046
+B1411394531718N00600961EA0085000873050
+B1411494531754N00601023EA0083800856049
+B1412004531794N00601077EA0083600841038
+B1412104531832N00601099EA0083300831035
+B1412204531875N00601103EA0083300824037
+B1412304531921N00601088EA0083300818040
+B1412404531953N00601074EA0085200817034
+B1412504531984N00601061EA0086600821038
+B1413004532013N00601060EA0088000828034
+B1413104531989N00601054EA0088700837035
+B1413204531934N00601080EA0089600847036
+B1413304531932N00601074EA0092500857029
+B1413404531929N00601067EA0095300872039
+B1413504531909N00601137EA0098100895038
+B1414004531926N00601143EA0101200914038
+B1414104531885N00601193EA0104300946039
+B1414204531907N00601225EA0107400973038
+B1414304531865N00601251EA0110201004040
+B1414404531888N00601298EA0112601033037
+B1414504531866N00601275EA0113601057038
+B1415004531814N00601298EA0115301081037
+B1415104531843N00601295EA0116501100040
+B1415204531888N00601331EA0116201116039
+B1415304531925N00601353EA0115601125041
+B1415404531951N00601343EA0116201129038
+B1415504531983N00601328EA0117901135034
+B1416004531992N00601325EA0118501142038
+B1416104531932N00601358EA0120101153038
+B1416204531944N00601357EA0121601165044
+B1416304531917N00601404EA0123101179042
+B1416404531936N00601415EA0123501192042
+B1416504531890N00601473EA0125601206041
+B1417004531886N00601518EA0127101219049
+B1417104531882N00601508EA0128501229042
+B1417204531876N00601578EA0130401247044
+B1417304531871N00601559EA0132101259038
+B1417404531907N00601547EA0133001277041
+B1417504531924N00601538EA0135601289041
+B1418004531901N00601605EA0138101312040
+B1418104531930N00601607EA0141401329034
+B1418204531907N00601599EA0143301355033
+B1418304531908N00601674EA0145101380043
+B1418404531940N00601665EA0146001399036
+B1418504531954N00601628EA0146401413042
+B1419004531991N00601609EA0147801429040
+B1419104532024N00601596EA0149601443041
+B1419204532059N00601579EA0150601458040
+B1419314532104N00601576EA0150201470044
+B1419414532139N00601571EA0150301477044
+B1419514532176N00601563EA0150101481041
+B1420014532214N00601559EA0150101483041
+B1420114532256N00601554EA0150301484039
+B1420214532296N00601550EA0150601486043
+B1420314532338N00601539EA0151701489038
+B1420414532384N00601528EA0152501495041
+B1420514532430N00601524EA0153501502039
+B1421014532474N00601516EA0155101510038
+B1421114532503N00601486EA0156401521032
+B1421214532492N00601429EA0156501531035
+B1421314532438N00601467EA0155901536039
+B1421414532391N00601510EA0155701539044
+B1421514532358N00601457EA0155501540036
+B1422014532338N00601400EA0152601536038
+B1422114532369N00601386EA0149901524044
+B1422214532434N00601396EA0148201508043
+B1422314532499N00601410EA0147401493040
+B1422414532548N00601406EA0145401479038
+B1422514532514N00601451EA0144001464042
+B1423014532460N00601458EA0143601451036
+B1423114532409N00601467EA0140401437041
+B1423214532363N00601443EA0137801416039
+B1423314532315N00601410EA0136501396044
+B1423414532276N00601373EA0135501380040
+B1423514532242N00601327EA0134201365039
+B1424014532191N00601292EA0134001352037
+B1424114532159N00601261EA0135801346039
+B1424214532162N00601312EA0134501344038
+B1424314532097N00601386EA0136201342035
+B1424414532079N00601392EA0137701345049
+B1424514532036N00601423EA0139701353036
+B1425014532006N00601464EA0141301365048
+B1425114531978N00601525EA0143501379035
+B1425214531943N00601512EA0144801393036
+B1425314531919N00601536EA0146201410051
+B1425414531897N00601579EA0148701426042
+B1425514531892N00601558EA0150401440037
+B1426014531855N00601594EA0151801461043
+B1426114531851N00601626EA0152601476045
+B1426214531799N00601629EA0153601492040
+B1426314531820N00601611EA0155801501043
+B1426414531802N00601654EA0157601519042
+B1426514531792N00601620EA0159601536045
+B1427024531776N00601670EA0161101558040
+B1427124531782N00601666EA0163501573042
+B1427224531742N00601700EA0165301591034
+B1427324531753N00601730EA0167101609046
+B1427424531724N00601728EA0168901627039
+B1427524531725N00601770EA0170601647047
+B1428024531704N00601738EA0172601665039
+B1428124531721N00601783EA0173401685042
+B1428224531688N00601772EA0174401700040
+B1428324531721N00601765EA0173601713042
+B1428424531766N00601790EA0173001715040
+B1428524531817N00601836EA0172701715053
+B1429024531869N00601894EA0171801713058
+B1429124531920N00601967EA0170801709062
+B1429224531968N00602043EA0169801702055
+B1429324532021N00602113EA0168201693057
+B1429424532072N00602185EA0166701681058
+B1429524532131N00602243EA0164201666060
+B1430024532183N00602311EA0161701649060
+B1430124532230N00602381EA0159301629060
+B1430224532280N00602449EA0157601609059
+B1430324532329N00602521EA0156001589058
+B1430424532377N00602601EA0153801570059
+B1430524532426N00602667EA0150601548056
+B1431024532473N00602726EA0147001522057
+B1431124532521N00602783EA0143301492059
+B1431224532573N00602829EA0140101460060
+B1431324532630N00602885EA0137501430059
+B1431424532686N00602942EA0135301402056
+B1431524532733N00602996EA0135301379052
+B1432024532769N00603042EA0135901365040
+B1432124532796N00603105EA0136601357040
+B1432224532824N00603161EA0136801356041
+B1432324532858N00603206EA0137201357038
+B1432424532900N00603237EA0137901359042
+B1432524532945N00603248EA0138001361038
+B1433024532989N00603239EA0138201363039
+B1433124533028N00603234EA0139701365038
+B1433224532984N00603234EA0139801369037
+B1433324532982N00603213EA0140201374034
+B1433424533024N00603227EA0141801380038
+B1433524533038N00603217EA0144601389044
+B1434024533043N00603281EA0147201405038
+B1434124533062N00603272EA0149201421042
+B1434224533010N00603314EA0152001442044
+B1434324533005N00603285EA0154201459047
+B1434424532982N00603340EA0156301486044
+B1434534532985N00603365EA0157701509046
+B1435034532958N00603370EA0159701527038
+B1435134532994N00603393EA0160801551036
+B1435234533034N00603405EA0160901568040
+B1435334533075N00603401EA0163001580035
+B1435434533098N00603404EA0165501593037
+B1435534533059N00603393EA0166801615042
+B1436034533058N00603471EA0169301634036
+B1436134533081N00603492EA0172801653039
+B1436234533042N00603484EA0176601684044
+B1436334533056N00603498EA0180101709044
+B1436434533019N00603468EA0183101743045
+B1436534533011N00603521EA0186301777042
+B1437034533000N00603494EA0189001802034
+B1437134532984N00603557EA0192001837047
+B1437234532977N00603568EA0195401866042
+B1437334532938N00603579EA0198501898040
+B1437434532951N00603618EA0201701929048
+B1437534532910N00603618EA0205301963029
+B1438034532930N00603650EA0208001995030
+B1438134532896N00603716EA0210502030036
+B1438234532893N00603675EA0213902058036
+B1438334532908N00603732EA0216402092043
+B1438434532862N00603736EA0218902122036
+B1438534532881N00603705EA0221402150036
+B1439034532859N00603741EA0223902176047
+B1439134532869N00603706EA0224602199046
+B1439234532825N00603731EA0227302218039
+B1439334532836N00603678EA0227302237040
+B1439434532867N00603711EA0226402247039
+B1439534532892N00603773EA0225702249041
+B1440034532928N00603825EA0224602248041
+B1440134532961N00603877EA0223202244036
+B1440234532989N00603934EA0220202234053
+B1440334533015N00604030EA0217602216062
+B1440434533041N00604119EA0216002196058
+B1440534533064N00604210EA0214202178059
+B1441034533095N00604303EA0212302160057
+B1441134533126N00604394EA0209702139054
+B1441234533156N00604482EA0207202117057
+B1441334533186N00604569EA0204602094057
+B1441434533202N00604660EA0201602070052
+B1441534533208N00604749EA0198102041052
+B1442034533216N00604841EA0195002011054
+B1442134533226N00604936EA0192601982052
+B1442244533241N00605048EA0191001952049
+B1442344533253N00605146EA0189501930049
+B1442444533278N00605231EA0189101913042
+B1442544533311N00605294EA0189501903039
+B1443044533345N00605348EA0188401895042
+B1443144533385N00605403EA0188301887038
+B1443244533430N00605443EA0186901879044
+B1443344533475N00605480EA0187101872034
+B1443444533507N00605519EA0188101870038
+B1443544533543N00605538EA0189701873037
+B1444044533584N00605557EA0191001879040
+B1444144533614N00605596EA0192501889040
+B1444244533573N00605610EA0194401901041
+B1444344533578N00605556EA0195701917041
+B1444444533602N00605598EA0196601931041
+B1444544533557N00605657EA0198001943038
+B1445044533536N00605606EA0199401957040
+B1445144533568N00605587EA0200701970044
+B1445244533584N00605605EA0200901980038
+B1445344533530N00605610EA0201601990040
+B1445444533542N00605572EA0202201998039
+B1445544533574N00605572EA0204202006039
+B1446044533536N00605540EA0206002019040
+B1446144533518N00605619EA0208202035036
+B1446244533553N00605655EA0209502052041
+B1446344533587N00605643EA0211402068040
+B1446444533565N00605689EA0212902085039
+B1446544533563N00605650EA0215202102037
+B1447044533533N00605688EA0216902120042
+B1447144533548N00605658EA0219102138040
+B1447244533522N00605707EA0220502158046
+B1447344533530N00605658EA0222902176045
+B1447444533513N00605716EA0225002195040
+B1447544533520N00605686EA0226902215042
+B1448044533523N00605747EA0229102235039
+B1448144533489N00605718EA0230802255041
+B1448244533520N00605686EA0232702274036
+B1448344533506N00605738EA0233802292047
+B1448444533514N00605692EA0235402308037
+B1448544533538N00605737EA0237702325040
+B1449044533496N00605729EA0238102342045
+B1449144533534N00605704EA0240502357046
+B1449244533528N00605776EA0243302377041
+B1449344533489N00605736EA0245202398042
+B1449444533520N00605675EA0247902420036
+B1449554533523N00605713EA0250302445043
+B1450054533540N00605688EA0252902470040
+B1450154533517N00605699EA0254402491047
+B1450254533558N00605691EA0256702512035
+B1450354533547N00605732EA0258402532039
+B1450454533551N00605674EA0259802552044
+B1450554533602N00605680EA0262302571044
+B1451054533651N00605717EA0263302591043
+B1451154533695N00605761EA0264102607036
+B1451254533737N00605797EA0263002616046
+B1451354533788N00605831EA0262502620040
+B1451454533834N00605879EA0260202616043
+B1451554533879N00605927EA0258802607047
+B1452054533916N00605983EA0257702597047
+B1452154533947N00606035EA0257002587039
+B1452254533977N00606095EA0256902578046
+B1452354534004N00606150EA0257002573046
+B1452454534025N00606206EA0257002570040
+B1452554534047N00606259EA0256302566045
+B1453054534069N00606312EA0256102563041
+B1453154534098N00606361EA0251902553045
+B1453254534139N00606433EA0248302532051
+B1453354534181N00606515EA0245402507054
+B1453454534230N00606607EA0244402484051
+B1453554534278N00606699EA0244002466061
+B1454054534311N00606789EA0246702459035
+B1454154534338N00606828EA0247802464038
+B1454254534366N00606794EA0248302468037
+B1454354534348N00606753EA0247902470042
+B1454454534385N00606774EA0247702471043
+B1454554534427N00606807EA0247702472044
+B1455054534466N00606856EA0244602466046
+B1455154534509N00606888EA0242102452042
+B1455254534550N00606917EA0240902436042
+B1455354534592N00606951EA0239302421042
+B1455454534634N00606980EA0236802403043
+B1455554534681N00607010EA0234202384041
+B1456054534731N00607038EA0232702363041
+B1456154534778N00607066EA0230902344047
+B1456254534813N00607111EA0229502326041
+B1456354534843N00607182EA0228802311057
+B1456454534874N00607271EA0227302298051
+B1456554534901N00607361EA0225402284055
+B1457054534933N00607461EA0223502266051
+B1457154534969N00607559EA0221602247054
+B1457254534997N00607656EA0220102230056
+B1457354535019N00607753EA0218302213055
+B1457464535049N00607859EA0216702194055
+B1457564535079N00607958EA0214702177057
+B1458064535109N00608055EA0212702158056
+B1458164535139N00608151EA0210402139057
+B1458264535162N00608250EA0208202118058
+B1458364535189N00608346EA0206302098058
+B1458464535213N00608443EA0204502078059
+B1458564535231N00608547EA0203202059055
+B1459064535256N00608642EA0202602045056
+B1459164535280N00608728EA0201702034059
+B1459264535297N00608828EA0202002024050
+B1459364535317N00608932EA0202802021055
+B1459464535335N00609021EA0204802025039
+B1459564535363N00609087EA0205202032036
+B1500064535400N00609139EA0204502035040
+B1500164535404N00609223EA0203602034039
+B1500264535406N00609313EA0202302029041
+B1500364535405N00609401EA0201202022038
+B1500464535403N00609486EA0200002013042
+B1500564535416N00609570EA0199502004039
+B1501064535446N00609648EA0198701996041
+B1501164535476N00609727EA0197901988040
+B1501264535488N00609806EA0196901979038
+B1501364535494N00609896EA0196001970040
+B1501464535494N00609992EA0194601960045
+B1501564535487N00610091EA0193801950040
+B1502064535480N00610189EA0191901938040
+B1502164535483N00610286EA0191201925044
+B1502264535490N00610379EA0193601923037
+B1502364535448N00610402EA0194101925039
+B1502464535475N00610400EA0197501932040
+B1502564535439N00610435EA0198801945046
+B1503064535451N00610409EA0201701962039
+B1503164535428N00610448EA0204201982036
+B1503264535418N00610418EA0205302001042
+B1503364535430N00610477EA0206602019038
+B1503464535401N00610454EA0207602034038
+B1503564535431N00610460EA0208002046047
+B1504064535426N00610536EA0209802058045
+B1504164535429N00610497EA0211702070039
+B1504264535442N00610536EA0215402087042
+B1504364535411N00610505EA0218302112044
+B1504464535425N00610546EA0222202140047
+B1504564535405N00610519EA0225502171046
+B1505064535384N00610584EA0229202204034
+B1505164535369N00610541EA0231902235045
+B1505264535360N00610605EA0234602266041
+B1505374535343N00610572EA0237302296044
+B1505474535321N00610628EA0239902327047
+B1505574535330N00610608EA0243102354040
+B1506074535300N00610669EA0244102383040
+B1506174535266N00610608EA0245902404038
+B1506274535273N00610641EA0247902424043
+B1506374535216N00610622EA0248902444043
+B1506474535230N00610600EA0249402458044
+B1506574535206N00610697EA0250702471040
+B1507074535178N00610783EA0247902476039
+B1507174535147N00610878EA0245102471041
+B1507274535119N00610978EA0243302459048
+B1507374535088N00611073EA0241202444042
+B1507474535058N00611161EA0238102425043
+B1507574535025N00611256EA0235502403045
+B1508074534998N00611349EA0233202380038
+B1508174534966N00611446EA0230802356040
+B1508274534937N00611542EA0229102334045
+B1508374534923N00611638EA0227302313041
+B1508474534926N00611733EA0225402294041
+B1508574534932N00611827EA0223502274042
+B1509074534944N00611918EA0221802254045
+B1509174534969N00611999EA0220602238044
+B1509274535023N00612049EA0218502221055
+B1509374535084N00612097EA0216702202055
+B1509474535144N00612143EA0214902184057
+B1509574535206N00612186EA0213102166057
+B1510074535266N00612228EA0211302147058
+B1510174535297N00612313EA0209402129053
+B1510274535291N00612431EA0207102109051
+B1510374535250N00612554EA0204402087058
+B1510474535203N00612677EA0202002064059
+B1510574535160N00612804EA0199602041059
+B1511074535104N00612925EA0197402016056
+B1511174535049N00613044EA0195301993055
+B1511274535006N00613156EA0192901971057
+B1511374534967N00613281EA0191601948056
+B1511474534924N00613390EA0191501931053
+B1511574534891N00613480EA0191601921045
+B1512074534863N00613575EA0190501912043
+B1512174534835N00613665EA0189501903042
+B1512274534805N00613756EA0188101893040
+B1512374534768N00613847EA0187401883044
+B1512474534736N00613935EA0186301874042
+B1512584534704N00614037EA0184801862048
+B1513084534674N00614132EA0183801851042
+B1513184534646N00614229EA0183001840046
+B1513284534620N00614328EA0182001830040
+B1513384534594N00614423EA0180301819045
+B1513484534567N00614522EA0178601807044
+B1513584534546N00614618EA0176801794043
+B1514084534514N00614712EA0175101779044
+B1514184534493N00614808EA0173401763042
+B1514284534481N00614901EA0172101747043
+B1514384534476N00614993EA0170901732043
+B1514484534462N00615086EA0170001718045
+B1514584534448N00615181EA0169201706045
+B1515084534431N00615273EA0168001694043
+B1515184534411N00615363EA0166601682043
+B1515284534385N00615452EA0165701670044
+B1515384534357N00615538EA0164401658044
+B1515484534334N00615638EA0162801645053
+B1515584534314N00615747EA0161601632055
+B1516084534290N00615849EA0160401619053
+B1516184534267N00615957EA0158701605054
+B1516284534241N00616067EA0157401591056
+B1516384534221N00616186EA0156501578053
+B1516484534207N00616298EA0155001566055
+B1516584534190N00616407EA0153401552054
+B1517084534178N00616512EA0151601537053
+B1517184534170N00616620EA0149701520053
+B1517284534171N00616727EA0148001503056
+B1517384534177N00616837EA0146401486055
+B1517484534169N00616949EA0144901469055
+B1517584534160N00617061EA0143401453053
+B1518084534149N00617170EA0141801437054
+B1518184534145N00617281EA0140201421053
+B1518284534145N00617394EA0138901405051
+B1518384534146N00617502EA0137401389042
+B1518484534143N00617616EA0137701376038
+B1518584534139N00617728EA0138101369041
+B1519084534160N00617815EA0139001367034
+B1519184534189N00617821EA0139801369040
+B1519284534136N00617830EA0140801375036
+B1519384534105N00617927EA0141401382037
+B1519484534119N00618029EA0141801389038
+B1519584534161N00618087EA0141501393041
+B1520084534210N00618082EA0141901397038
+B1520184534246N00618124EA0142501400038
+B1520284534232N00618222EA0142301403045
+B1520384534209N00618314EA0141401404039
+B1520484534198N00618400EA0139701399037
+B1520594534200N00618498EA0138701390039
+B1521094534192N00618588EA0137701380042
+B1521194534173N00618676EA0137001371042
+B1521294534137N00618762EA0137601364042
+B1521394534106N00618755EA0138301363044
+B1521494534133N00618766EA0140001366035
+B1521594534113N00618824EA0141301373043
+B1522094534136N00618817EA0142801383041
+B1522194534102N00618864EA0144001394040
+B1522294534127N00618843EA0144901405038
+B1522394534118N00618901EA0146101418044
+B1522494534129N00618871EA0147901430038
+B1522594534114N00618930EA0149101444038
+B1523094534122N00618898EA0150301456040
+B1523194534112N00618973EA0151301467031
+B1523294534079N00618975EA0152201479046
+B1523394534108N00619018EA0153901491036
+B1523494534069N00619092EA0154301502041
+B1523594534069N00619062EA0155001511040
+B1524094534108N00619120EA0155601520036
+B1524194534093N00619219EA0155401526042
+B1524294534050N00619299EA0154701528045
+B1524394534007N00619371EA0155101529040
+B1524494533962N00619412EA0155601531041
+B1524594533993N00619411EA0156401534040
+B1525094533999N00619490EA0157201540039
+B1525194533946N00619517EA0157601546041
+B1525294533897N00619554EA0157001550033
+B1525394533923N00619612EA0155301548043
+B1525494533964N00619588EA0155801544033
+B1525594534008N00619578EA0156001544042
+B1526094534058N00619577EA0157001545037
+B1526194534114N00619587EA0157501549038
+B1526294534170N00619582EA0158301554037
+B1526394534225N00619574EA0158601559039
+B1526494534273N00619554EA0159801565038
+B1526594534312N00619547EA0162201575050
+B1527094534290N00619550EA0164901589039
+B1527194534293N00619579EA0167801608049
+B1527294534298N00619600EA0170701632046
+B1527394534306N00619593EA0174201658049
+B1527494534287N00619588EA0178301688046
+B1527594534291N00619634EA0181901721043
+B1528094534293N00619616EA0185801756037
+B1528194534265N00619661EA0189501792052
+B1528294534286N00619648EA0193401829043
+B1528404534258N00619655EA0197901871041
+B1528504534271N00619687EA0201801910042
+B1529004534277N00619665EA0206001950040
+B1529104534248N00619696EA0209801991048
+B1529204534280N00619697EA0213902030041
+B1529304534245N00619700EA0217902071044
+B1529404534277N00619712EA0222102111037
+B1529504534240N00619714EA0225602151048
+B1530004534281N00619716EA0229402190045
+B1530104534253N00619785EA0232702227046
+B1530204534262N00619745EA0235702263042
+B1530304534263N00619806EA0238402297041
+B1530404534258N00619763EA0240602328040
+B1530504534275N00619822EA0242602356043
+B1531004534254N00619805EA0243302379046
+B1531104534288N00619851EA0244402397045
+B1531204534266N00619922EA0245802413039
+B1531304534264N00619886EA0245302425046
+B1531404534302N00619948EA0245802433039
+B1531504534321N00620028EA0244702437042
+B1532004534339N00620112EA0243302435044
+B1532104534353N00620199EA0241702429046
+B1532204534375N00620282EA0240602421044
+B1532304534402N00620359EA0239502412044
+B1532404534426N00620437EA0238602403043
+B1532504534449N00620517EA0237502393045
+B1533004534473N00620598EA0236502383044
+B1533104534492N00620691EA0233902370056
+B1533204534518N00620801EA0233002354058
+B1533304534543N00620897EA0235002345035
+B1533404534520N00620929EA0235902345046
+B1533504534557N00620931EA0238602349045
+B1534004534525N00620935EA0240402362048
+B1534104534558N00620958EA0243402378043
+B1534204534525N00620985EA0245502398043
+B1534304534562N00621017EA0247702418040
+B1534404534533N00621037EA0249002437044
+B1534504534576N00621059EA0250002454041
+B1535004534611N00621126EA0249002468043
+B1535104534642N00621196EA0247202471046
+B1535204534672N00621274EA0246402468043
+B1535304534702N00621350EA0245002462043
+B1535404534726N00621432EA0243802453046
+B1535504534752N00621506EA0242402444047
+B1536004534771N00621590EA0240802433044
+B1536104534793N00621667EA0238902419043
+B1536214534816N00621754EA0237502404043
+B1536314534844N00621843EA0235002387057
+B1536414534878N00621945EA0233702369053
+B1536514534917N00622043EA0233402354047
+B1537014534958N00622130EA0233102343046
+B1537114534990N00622219EA0233102336045
+B1537214535021N00622298EA0235102335039
+B1537314534993N00622308EA0237102341045
+B1537414535022N00622336EA0238702351043
+B1537514534992N00622341EA0240702363043
+B1538014535001N00622390EA0242502378045
+B1538114534982N00622362EA0244102394044
+B1538214535022N00622406EA0244802408040
+B1538314535058N00622472EA0244202418045
+B1538414535097N00622533EA0243402422044
+B1538514535137N00622583EA0243302423041
+B1539014535179N00622626EA0241402421037
+B1539114535221N00622674EA0238002411046
+B1539214535270N00622727EA0235602395045
+B1539314535319N00622783EA0234502378042
+B1539414535366N00622845EA0233002362044
+B1539514535408N00622906EA0231102347046
+B1540014535458N00622954EA0230602331036
+B1540114535504N00622996EA0230902321044
+B1540214535547N00623034EA0231702316037
+B1540314535601N00623068EA0231402313040
+B1540414535656N00623086EA0231702311038
+B1540514535699N00623086EA0231302311044
+B1541014535748N00623089EA0232202310046
+B1541114535788N00623093EA0233202313040
+B1541214535776N00623056EA0234402319040
+B1541314535748N00623138EA0235202326040
+B1541414535791N00623186EA0235702334042
+B1541514535838N00623183EA0235402340044
+B1542014535883N00623177EA0236202345041
+B1542114535933N00623184EA0236202350046
+B1542214535980N00623200EA0235302352043
+B1542314536029N00623215EA0234902349041
+B1542414536077N00623202EA0235102347047
+B1542514536123N00623172EA0236802348040
+B1543014536142N00623125EA0236702353036
+B1543114536094N00623147EA0235202354040
+B1543214536128N00623205EA0234602350045
+B1543314536177N00623201EA0233702346042
+B1543414536234N00623201EA0232402340044
+B1543514536296N00623220EA0231702332047
+B1544014536361N00623250EA0231302325042
+B1544124536431N00623284EA0228902315058
+B1544224536505N00623298EA0227402301055
+B1544324536580N00623326EA0226402288057
+B1544424536653N00623360EA0225402276058
+B1544524536719N00623378EA0224302263047
+B1545024536770N00623411EA0223202253056
+B1545124536845N00623449EA0221602241052
+B1545224536922N00623485EA0219202227057
+B1545324536999N00623528EA0217102209058
+B1545424537076N00623574EA0214302189058
+B1545524537147N00623613EA0210702165054
+B1546024537213N00623641EA0210102140038
+B1546124537262N00623646EA0211102127035
+B1546224537225N00623663EA0211802119039
+B1546324537252N00623736EA0212502118036
+B1546424537246N00623700EA0212602117039
+B1546524537258N00623671EA0212502118039
+B1547024537222N00623730EA0213502117041
+B1547124537233N00623732EA0213802121039
+B1547224537187N00623774EA0214302123040
+B1547324537209N00623833EA0215902130046
+B1547424537179N00623891EA0217502139036
+B1547524537202N00623908EA0218802151047
+B1548024537189N00623979EA0220202163043
+B1548124537173N00623969EA0220102174041
+B1548224537185N00624054EA0221802185034
+B1548324537238N00624064EA0219002191048
+B1548424537314N00624089EA0216302186061
+B1548524537385N00624112EA0213502173045
+B1549024537452N00624120EA0210202153056
+B1549124537525N00624151EA0207302129055
+B1549224537596N00624188EA0204402104055
+B1549324537665N00624239EA0200702076056
+B1549424537731N00624278EA0196402044054
+B1549524537793N00624290EA0195602011051
+B1550024537851N00624301EA0195501989050
+B1550124537907N00624316EA0194501972048
+B1550224537969N00624342EA0193801958052
+B1550324538033N00624375EA0191601946048
+B1550424538097N00624392EA0187701926054
+B1550524538169N00624417EA0184301900060
+B1551024538246N00624445EA0181001871063
+B1551124538324N00624474EA0178101842060
+B1551224538399N00624504EA0174801813061
+B1551324538482N00624550EA0171901783061
+B1551424538567N00624594EA0168801753062
+B1551524538650N00624635EA0165901723060
+B1552034538728N00624671EA0164201692052
+B1552134538797N00624709EA0162301668055
+B1552234538872N00624743EA0159801644060
+B1552334538943N00624781EA0157801620058
+B1552434539011N00624794EA0155901598055
+B1552534539076N00624809EA0154501578055
+B1553034539140N00624851EA0153401559056
+B1553134539204N00624894EA0152201543058
+B1553234539270N00624943EA0150901528057
+B1553334539335N00624983EA0149701513055
+B1553434539399N00625016EA0148301500054
+B1553534539463N00625053EA0147301488054
+B1554034539526N00625101EA0146201475054
+B1554134539594N00625141EA0145001463055
+B1554234539663N00625169EA0143801451055
+B1554334539731N00625203EA0142401438054
+B1554434539796N00625250EA0141201426055
+B1554534539861N00625290EA0139801412054
+B1555034539929N00625323EA0138601399055
+B1555134539996N00625354EA0137201386055
+B1555234540063N00625388EA0135701373055
+B1555334540131N00625421EA0133801358054
+B1555434540198N00625462EA0132001342056
+B1555534540263N00625495EA0130401326056
+B1556034540333N00625537EA0129701310051
+B1556134540402N00625582EA0128101296046
+B1556234540461N00625615EA0127501284041
+B1556334540520N00625652EA0127101274040
+B1556434540577N00625715EA0127501267039
+B1556534540615N00625802EA0127201263038
+B1557034540621N00625912EA0126801259040
+B1557134540611N00626010EA0127601257039
+B1557234540581N00626081EA0127601256040
+B1557334540548N00626150EA0127901257041
+B1557434540506N00626206EA0128601260036
+B1557534540467N00626262EA0130001264034
+B1558034540449N00626261EA0130501270039
+B1558134540497N00626264EA0131401279040
+B1558234540479N00626247EA0133301287030
+B1558334540449N00626311EA0134601299045
+B1558434540454N00626282EA0137201311047
+B1558534540441N00626300EA0139801329036
+B1559034540453N00626334EA0142001349043
+B1559134540448N00626298EA0143301369041
+B1559234540469N00626374EA0144001386038
+B1559334540432N00626395EA0145701398040
+B1559434540462N00626424EA0146001412038
+B1559534540440N00626440EA0146801424039
+B1600044540481N00626425EA0147601435038
+B1600144540525N00626407EA0147501443044
+B1600244540578N00626404EA0148201450041
+B1600344540635N00626406EA0149201457042
+B1600444540687N00626393EA0148901463042
+B1600544540739N00626369EA0150201468034
+B1601044540730N00626365EA0151201474039
+B1601144540696N00626407EA0151701483039
+B1601244540734N00626389EA0151901490040
+B1601344540796N00626398EA0153701499036
+B1601444540770N00626413EA0155301509039
+B1601544540772N00626399EA0156701521041
+B1602044540773N00626461EA0158301534036
+B1602144540760N00626436EA0159501546040
+B1602244540784N00626493EA0160401560041
+B1602344540745N00626500EA0161801573044
+B1602444540760N00626479EA0163801586044
+B1602544540759N00626556EA0165201601034
+B1603044540721N00626553EA0166601615040
+B1603144540753N00626549EA0169001631043
+B1603244540728N00626602EA0170201648040
+B1603344540705N00626583EA0172601662039
+B1603444540737N00626626EA0174401683037
+B1603544540701N00626636EA0176401700040
+B1604044540728N00626655EA0178301721047
+B1604144540716N00626645EA0180501737041
+B1604244540729N00626693EA0181601758041
+B1604344540717N00626668EA0182901775043
+B1604444540732N00626726EA0183801791042
+B1604544540689N00626783EA0185101805036
+B1605044540664N00626874EA0187001819037
+B1605144540659N00626870EA0188901835032
+B1605244540665N00626942EA0190701852038
+B1605344540669N00626921EA0192001868039
+B1605444540660N00626993EA0193401885042
+B1605544540643N00626986EA0195401901044
+B1606044540640N00627058EA0197401920036
+B1606144540663N00627058EA0198801938042
+B1606244540636N00627121EA0199901956039
+B1606344540658N00627103EA0201001969034
+B1606444540656N00627177EA0201501981041
+B1606544540632N00627161EA0202901991040
+B1607044540666N00627184EA0203302003041
+B1607144540637N00627206EA0204702011036
+B1607244540646N00627177EA0205802020046
+B1607354540644N00627233EA0207302034044
+B1607454540686N00627237EA0208402047037
+B1607554540733N00627258EA0209902060038
+B1608054540774N00627261EA0211402074042
+B1608154540744N00627282EA0213002090035
+B1608254540781N00627350EA0214102104036
+B1608354540827N00627380EA0215502117038
+B1608454540868N00627422EA0217702132038
+B1608554540906N00627455EA0219102149035
+B1609054540883N00627526EA0218802162045
+B1609154540890N00627497EA0219902169041
+B1609254540928N00627520EA0219202178042
+B1609354540968N00627569EA0219002181041
+B1609454540980N00627654EA0219702183044
+B1609554540956N00627710EA0224002193040
+B1610054540947N00627683EA0226702210047
+B1610154540910N00627724EA0229802236043
+B1610254540907N00627703EA0230002254042
+B1610354540936N00627752EA0233402274040
+B1610454540894N00627795EA0238302301037
+B1610554540885N00627780EA0240202323042
+B1611054540889N00627850EA0244502361036
+B1611154540856N00627848EA0247902391034
+B1611254540860N00627903EA0250402427041
+B1611354540829N00627884EA0253502452035
+B1611454540840N00627911EA0255702480031
+B1611554540795N00627953EA0257402510034
+B1612054540782N00627903EA0258602532040
+B1612154540770N00627845EA0260302551037
+B1612254540756N00627794EA0260202568037
+B1612354540785N00627761EA0259902577040
+B1612454540830N00627793EA0260002584041
+B1612554540856N00627848EA0262102592041
+B1613054540827N00627885EA0264102605047
+B1613154540839N00627867EA0267602620042
+B1613254540859N00627916EA0269202643037
+B1613354540903N00627934EA0271102664044
+B1613454540951N00627961EA0272202683041
+B1613554541001N00627985EA0274702699036
+B1614054541051N00628010EA0278202721040
+B1614154541105N00628038EA0280802748044
+B1614254541166N00628076EA0284002772032
+B1614354541215N00628084EA0285002797041
+B1614454541266N00628113EA0284302814042
+B1614554541317N00628144EA0284002822041
+B1615054541364N00628172EA0282402826045
+B1615164541422N00628209EA0280202821044
+B1615264541481N00628245EA0277802810044
+B1615364541538N00628284EA0275702795046
+B1615464541594N00628327EA0274202779044
+B1615564541654N00628357EA0273402766044
+B1616064541717N00628388EA0271702752054
+B1616164541794N00628440EA0270402737061
+B1616264541872N00628491EA0269402724058
+B1616364541952N00628538EA0268502711055
+B1616464542032N00628583EA0266402698054
+B1616564542117N00628623EA0263402680061
+B1617064542194N00628617EA0262202661045
+B1617164542263N00628641EA0260702645055
+B1617264542337N00628695EA0258502627061
+B1617364542413N00628746EA0256602608054
+B1617464542493N00628796EA0254802589055
+B1617564542568N00628851EA0253402572055
+B1618064542645N00628904EA0252102556055
+B1618164542715N00628962EA0250302540059
+B1618264542787N00629023EA0248602523057
+B1618364542857N00629082EA0247202507056
+B1618464542926N00629144EA0245802492057
+B1618564542999N00629205EA0244402477058
+B1619064543070N00629269EA0243202463057
+B1619164543135N00629342EA0242102449056
+B1619264543202N00629415EA0240802436057
+B1619364543266N00629490EA0239602423057
+B1619464543334N00629561EA0238302410057
+B1619564543401N00629629EA0236802396055
+B1620064543468N00629697EA0235202382056
+B1620164543533N00629764EA0233102366057
+B1620264543589N00629828EA0233202350045
+B1620364543615N00629886EA0232002341044
+B1620464543653N00629948EA0231002331042
+B1620564543692N00630015EA0230902321038
+B1621064543731N00630061EA0229402314047
+B1621164543770N00630107EA0228102304044
+B1621264543815N00630122EA0225802292053
+B1621364543868N00630138EA0223502275056
+B1621464543915N00630213EA0221602258054
+B1621564543951N00630307EA0218902239056
+B1622064543983N00630421EA0216602219055
+B1622164544013N00630539EA0213602198058
+B1622264544038N00630667EA0210302174057
+B1622364544055N00630795EA0208102148058
+B1622464544071N00630923EA0205302123058
+B1622564544097N00631040EA0203302097058
+B1623064544124N00631149EA0200802073056
+B1623164544142N00631272EA0198302048054
+B1623274544162N00631402EA0196202021054
+B1623374544186N00631513EA0193901998052
+B1623474544212N00631639EA0191601974056
+B1623574544235N00631766EA0189001951057
+B1624074544260N00631887EA0186101926057
+B1624174544286N00632017EA0183101900055
+B1624274544300N00632157EA0180501872055
+B1624374544320N00632261EA0181701850036
+B1624474544359N00632318EA0182001836036
+B1624574544411N00632345EA0184001830034
+B1625074544434N00632324EA0185001832040
+B1625174544398N00632376EA0186101836032
+B1625274544434N00632444EA0187301843037
+B1625374544485N00632453EA0188401853032
+B1625474544500N00632405EA0188501861039
+B1625574544537N00632391EA0189701869038
+B1626074544530N00632467EA0190501877038
+B1626174544539N00632437EA0191501885036
+B1626274544576N00632510EA0192401893039
+B1626374544541N00632540EA0192801902039
+B1626474544533N00632487EA0193501911039
+B1626574544554N00632446EA0194501918038
+B1627074544575N00632494EA0195701927038
+B1627174544550N00632467EA0197301936035
+B1627274544577N00632492EA0198201948039
+B1627374544546N00632510EA0200101958037
+B1627474544573N00632519EA0200501971038
+B1627574544556N00632590EA0202101981036
+B1628074544541N00632546EA0203201993035
+B1628174544569N00632561EA0204102004040
+B1628274544546N00632618EA0205302016038
+B1628374544540N00632565EA0206302028040
+B1628474544536N00632508EA0206702039042
+B1628574544492N00632566EA0206202045036
+B1629074544523N00632629EA0206902048035
+B1629174544552N00632679EA0208302055042
+B1629274544522N00632663EA0209802064038
+B1629374544553N00632678EA0211602076043
+B1629474544518N00632676EA0212902088039
+B1629574544543N00632664EA0214302100040
+B1630074544524N00632711EA0216102115039
+B1630174544532N00632669EA0217402131043
+B1630274544549N00632727EA0218502144039
+B1630374544500N00632733EA0220502158036
+B1630474544529N00632711EA0221402172040
+B1630574544527N00632779EA0222202184039
+B1631084544477N00632849EA0225002199035
+B1631184544503N00632886EA0227302217034
+B1631284544478N00632847EA0228702236041
+B1631384544430N00632907EA0230402253037
+B1631484544455N00632965EA0232602271036
+B1631584544448N00632937EA0234002291039
+B1632084544411N00633008EA0236102309035
+B1632184544447N00633049EA0237602328040
+B1632284544459N00633007EA0239402346038
+B1632384544403N00633038EA0240302363040
+B1632484544404N00633127EA0241202377042
+B1632584544441N00633121EA0242302390037
+B1633084544459N00633088EA0243602401040
+B1633184544451N00633149EA0244502414040
+B1633284544438N00633109EA0245602425038
+B1633384544474N00633139EA0246702437045
+B1633484544438N00633140EA0247602448038
+B1633584544460N00633097EA0248202457039
+B1634084544498N00633153EA0248802465039
+B1634184544472N00633202EA0249602472039
+B1634284544478N00633149EA0250702481037
+B1634384544513N00633188EA0251302489037
+B1634484544546N00633242EA0251602497038
+B1634584544590N00633208EA0252102504038
+B1635084544603N00633139EA0252602509041
+B1635184544597N00633070EA0253002515037
+B1635284544552N00633073EA0252102518038
+B1635384544553N00633149EA0251502517042
+B1635484544599N00633201EA0251602516043
+B1635584544651N00633252EA0252202516046
+B1636084544706N00633302EA0253002519044
+B1636184544759N00633360EA0253202522047
+B1636284544813N00633416EA0253402525043
+B1636384544867N00633476EA0251502525044
+B1636484544927N00633525EA0249402517042
+B1636584544989N00633559EA0247902506044
+B1637084545051N00633596EA0246702494045
+B1637184545103N00633636EA0245502482044
+B1637284545152N00633691EA0244402469045
+B1637384545198N00633746EA0244102458042
+B1637484545241N00633805EA0243602450043
+B1637584545290N00633850EA0243102443044
+B1638084545337N00633907EA0242602437041
+B1638184545384N00633952EA0241802430044
+B1638284545433N00633997EA0241602424043
+B1638394545489N00634054EA0241702419042
+B1638494545538N00634106EA0241202416043
+B1638594545590N00634143EA0242402415046
+B1639094545644N00634179EA0243202418043
+B1639194545699N00634217EA0243502421043
+B1639294545755N00634261EA0242402424045
+B1639394545805N00634322EA0241802422041
+B1639494545858N00634370EA0240302417045
+B1639594545907N00634420EA0239602409043
+B1640094545954N00634471EA0239102402041
+B1640194546001N00634510EA0238202395045
+B1640294546050N00634553EA0237502388043
+B1640394546100N00634595EA0236802381044
+B1640494546151N00634642EA0236002374043
+B1640594546202N00634682EA0234702366045
+B1641094546258N00634704EA0233302356044
+B1641194546314N00634727EA0232002344046
+B1641294546371N00634748EA0230702332043
+B1641394546430N00634765EA0229102319044
+B1641494546493N00634778EA0227402305053
+B1641594546565N00634791EA0226302291053
+B1642094546634N00634802EA0226102278043
+B1642194546692N00634817EA0225802270041
+B1642294546747N00634838EA0225002262044
+B1642394546806N00634874EA0224202255047
+B1642494546862N00634902EA0223102246044
+B1642594546914N00634915EA0221902237042
+B1643094546968N00634926EA0221202228045
+B1643194547022N00634923EA0220502219042
+B1643294547080N00634935EA0220102211044
+B1643394547135N00634958EA0220302204040
+B1643494547185N00634970EA0221902203036
+B1643594547205N00634940EA0222402206036
+B1644094547159N00634967EA0222902209041
+B1644194547171N00635054EA0223902214036
+B1644294547216N00635060EA0224702222038
+B1644394547224N00635014EA0225202229040
+B1644494547179N00635001EA0226402236038
+B1644594547193N00634972EA0226802244038
+B1645094547218N00635038EA0226702251042
+B1645194547175N00635051EA0227502255043
+B1645294547191N00635013EA0228502261040
+B1645394547200N00635085EA0228502267040
+B1645494547165N00635073EA0229202271042
+B1645594547184N00635034EA0229602276040
+B1646094547210N00635081EA0230202281040
+B1646194547160N00635119EA0230402286036
+B1646304547143N00635069EA0231202290038
+B1646404547162N00635113EA0231302295040
+B1646504547122N00635095EA0231602298037
+B1647004547146N00635046EA0232702302041
+B1647104547155N00635105EA0232902309042
+B1647204547124N00635066EA0234102314035
+B1647304547153N00635087EA0234702321046
+B1647404547116N00635088EA0235902329039
+B1647504547145N00635048EA0236102336037
+B1648004547198N00635084EA0236202341037
+B1648104547243N00635090EA0236902347037
+B1648204547235N00635038EA0236602351043
+B1648304547180N00635044EA0236402354039
+B1648404547167N00635119EA0235402353040
+B1648504547226N00635129EA0235202352041
+B1649004547282N00635120EA0235002351044
+B1649104547336N00635105EA0234902349044
+B1649204547389N00635098EA0235402349044
+B1649304547436N00635098EA0235002349042
+B1649404547490N00635102EA0235002347041
+B1649504547540N00635090EA0235402347042
+B1650004547592N00635071EA0235102347043
+B1650104547638N00635041EA0235202347042
+B1650204547686N00635022EA0234502346043
+B1650304547736N00634996EA0233702342044
+B1650404547784N00634974EA0232602337043
+B1650504547835N00634950EA0232002330042
+B1651004547885N00634923EA0231502323046
+B1651104547927N00634890EA0232602320039
+B1651204547971N00634849EA0232002319042
+B1651304548021N00634818EA0232002317047
+B1651404548075N00634801EA0232302316036
+B1651504548129N00634807EA0231802316041
+B1652004548184N00634795EA0230502313043
+B1652104548237N00634772EA0229502306044
+B1652204548282N00634735EA0229102299038
+B1652304548325N00634699EA0229002291041
+B1652404548361N00634675EA0230202290034
+B1652504548368N00634629EA0230602292038
+B1653004548337N00634582EA0230802295037
+B1653104548286N00634627EA0231202297036
+B1653204548279N00634711EA0232602302033
+B1653304548320N00634764EA0233102309037
+B1653404548331N00634729EA0232802314040
+B1653504548279N00634744EA0233102318038
+B1654004548248N00634820EA0233102321037
+B1654114548217N00634799EA0232202322040
+B1654214548261N00634762EA0231702320044
+B1654314548307N00634732EA0231902319044
+B1654414548348N00634702EA0231502317040
+B1654514548386N00634667EA0231202315040
+B1655014548423N00634626EA0231202312045
+B1655114548453N00634594EA0233002313036
+B1655214548441N00634557EA0234702318040
+B1655314548416N00634639EA0235402327038
+B1655414548453N00634689EA0237602337038
+B1655514548456N00634624EA0237302348039
+B1656014548399N00634611EA0239602359040
+B1656114548391N00634701EA0240702371039
+B1656214548423N00634733EA0242402385036
+B1656314548422N00634673EA0241002394038
+B1656414548365N00634650EA0242202399032
+B1656514548331N00634647EA0242702406043
+B1657014548358N00634680EA0244802416036
+B1657114548317N00634709EA0245302425041
+B1657214548341N00634688EA0246602434034
+B1657314548304N00634737EA0246802443045
+B1657414548288N00634691EA0246902449037
+B1657514548312N00634651EA0246102453046
+B1658014548332N00634687EA0246702456037
+B1658114548294N00634718EA0246202457043
+B1658214548320N00634691EA0245702457034
+B1658314548367N00634716EA0244602453040
+B1658414548400N00634769EA0245902450039
+B1658514548356N00634791EA0246202451043
+B1659014548386N00634778EA0247602454041
+B1659114548400N00634830EA0246702458038
+B1659214548347N00634862EA0247202458043
+B1659314548367N00634840EA0246802461044
+B1659414548403N00634893EA0246702461035
+B1659514548406N00634972EA0248002463042
+B1700014548397N00634955EA0249502469037
+B1700114548382N00635035EA0251002477035
+B1700214548364N00635009EA0253002488035
+B1700314548357N00635064EA0254202501042
+B1700414548364N00635038EA0255802514039
+B1700514548346N00635092EA0257602529044
+B1701014548357N00635062EA0259402545042
+B1701114548333N00635108EA0261302561040
+B1701214548357N00635092EA0263302579043
+B1701314548328N00635131EA0265202597039
+B1701424548372N00635130EA0267402618040
+B1701524548417N00635200EA0269002638043
+B1702024548457N00635281EA0270302658045
+B1702124548497N00635353EA0270302673045
+B1702224548534N00635449EA0269602681054
+B1702324548564N00635560EA0268502683058
+B1702424548588N00635671EA0267402681056
+B1702524548610N00635781EA0266002675058
+B1703024548635N00635885EA0265002667055
+B1703124548661N00635992EA0264502659055
+B1703224548694N00636084EA0263602651045
+B1703324548717N00636173EA0261302640056
+B1703424548738N00636272EA0259602627062
+B1703524548766N00636372EA0257902613057
+B1704024548787N00636475EA0256502598057
+B1704124548808N00636574EA0254902583058
+B1704224548830N00636671EA0253402568057
+B1704324548862N00636767EA0252002552056
+B1704424548882N00636864EA0250902538055
+B1704524548907N00636961EA0249702525057
+B1705024548928N00637062EA0248602512057
+B1705124548951N00637161EA0247402500055
+B1705224548973N00637262EA0246102489057
+B1705324548994N00637364EA0245002477057
+B1705424549018N00637464EA0243902465057
+B1705524549042N00637565EA0242602453057
+B1706024549069N00637667EA0241102441056
+B1706124549091N00637770EA0239802428057
+B1706224549113N00637872EA0238302414056
+B1706324549136N00637974EA0236902399056
+B1706424549160N00638075EA0235702385055
+B1706524549185N00638175EA0234702372055
+B1707024549206N00638273EA0233702360055
+B1707124549228N00638373EA0232502348056
+B1707224549250N00638471EA0231702338056
+B1707324549270N00638568EA0230902327054
+B1707424549293N00638665EA0230102317049
+B1707524549313N00638750EA0229302308046
+B1708024549328N00638838EA0228602300046
+B1708124549340N00638926EA0227702292047
+B1708224549353N00639014EA0226602284048
+B1708324549361N00639114EA0225202274054
+B1708424549374N00639217EA0224002263054
+B1708524549393N00639317EA0222702252053
+B1709024549409N00639422EA0221602240053
+B1709124549423N00639528EA0220702229051
+B1709224549439N00639633EA0219502218052
+B1709324549461N00639737EA0218602207052
+B1709424549482N00639845EA0217202194052
+B1709534549506N00639950EA0215802183055
+B1710034549532N00640057EA0214902171052
+B1710134549549N00640163EA0213702160055
+B1710234549563N00640270EA0212402148055
+B1710334549580N00640367EA0211802137049
+B1710434549598N00640461EA0211202128048
+B1710534549621N00640555EA0210802119046
+B1711034549645N00640647EA0210102112047
+B1711134549674N00640730EA0210002105042
+B1711234549697N00640804EA0209902101040
+B1711334549713N00640877EA0209402098038
+B1711434549741N00640943EA0208402093044
+B1711534549779N00641000EA0207902088042
+B1712034549823N00641046EA0207002081043
+B1712134549874N00641073EA0206002074040
+B1712234549929N00641088EA0205502067045
+B1712334549984N00641103EA0205502061043
+B1712434550039N00641126EA0204802056042
+B1712534550088N00641170EA0204802052040
+B1713034550128N00641233EA0204302049043
+B1713134550178N00641283EA0203202043041
+B1713234550231N00641319EA0202202036041
+B1713334550293N00641338EA0201202028044
+B1713434550351N00641353EA0200802020042
+B1713534550406N00641381EA0200602013039
+B1714034550452N00641447EA0200502008042
+B1714134550466N00641542EA0199902004041
+B1714234550465N00641647EA0199402000044
+B1714334550467N00641756EA0199201996043
+B1714434550478N00641859EA0199301993042
+B1714534550504N00641948EA0199001990042
+B1715034550542N00642020EA0198401987045
+B1715134550584N00642086EA0197101983043
+B1715234550628N00642145EA0195001974043
+B1715334550681N00642202EA0192801959050
+B1715434550740N00642251EA0192701945036
+B1715534550793N00642288EA0191501935044
+B1716034550840N00642329EA0191001923037
+B1716134550842N00642321EA0190301915042
+B1716234550829N00642399EA0189201907043
+B1716334550861N00642482EA0187801897042
+B1716434550884N00642575EA0186201886042
+B1716534550893N00642680EA0183401872053
+B1717034550908N00642805EA0180601853056
+B1717134550924N00642930EA0177701830063
+B1717234550940N00643065EA0174801805062
+B1717334550945N00643204EA0171601777061
+B1717434550948N00643343EA0168401748060
+B1717544550948N00643492EA0165701716059
+B1718044550949N00643629EA0163201687061
+B1718144550957N00643750EA0162401662040
+B1718244550965N00643841EA0161501643041
+B1718344550985N00643923EA0160601628044
+B1718444551009N00643998EA0159501615050
+B1718544551038N00644083EA0158901603050
+B1719044551075N00644164EA0157501592053
+B1719144551118N00644235EA0156501579050
+B1719244551164N00644299EA0155001567046
+B1719344551207N00644352EA0155101556035
+B1719444551234N00644401EA0155301551036
+B1719544551269N00644455EA0155001546039
+B1720044551303N00644510EA0154501542040
+B1720144551349N00644548EA0153801536041
+B1720244551393N00644576EA0154101531038
+B1720344551437N00644610EA0154101529036
+B1720444551479N00644604EA0154301527032
+B1720544551472N00644544EA0154201528037
+B1721044551496N00644545EA0153101526039
+B1721144551447N00644576EA0152501523039
+B1721244551401N00644546EA0150801518042
+B1721344551438N00644516EA0149501510042
+B1721444551482N00644489EA0149101500043
+B1721544551512N00644455EA0149201494044
+B1722044551483N00644488EA0150601491030
+B1722144551515N00644488EA0150301492039
+B1722244551485N00644435EA0150501492035
+B1722344551454N00644491EA0151801493029
+B1722444551476N00644507EA0152601499036
+B1722544551434N00644500EA0153401505037
+B1723044551442N00644558EA0154501512037
+B1723144551438N00644515EA0154701519039
+B1723244551389N00644542EA0155301526036
+B1723344551412N00644603EA0156101533033
+B1723444551432N00644580EA0155501538041
+B1723544551386N00644604EA0155801541032
+B1724044551402N00644661EA0155401544038
+B1724144551444N00644662EA0155201544040
+B1724244551475N00644668EA0155001543033
+B1724344551495N00644730EA0154401541036
+B1724444551516N00644689EA0155101539035
+B1724544551536N00644676EA0155801541040
+B1725044551499N00644701EA0156601543035
+B1725144551496N00644659EA0156801547034
+B1725244551498N00644713EA0156701549038
+B1725354551463N00644676EA0157201551035
+B1725454551470N00644629EA0157201554039
+B1725554551488N00644673EA0156201554037
+B1726054551436N00644668EA0155601551038
+B1726154551424N00644613EA0154601546039
+B1726254551457N00644573EA0154101540040
+B1726354551488N00644528EA0153801535041
+B1726454551505N00644467EA0153501531040
+B1726554551533N00644421EA0151901526041
+B1727054551566N00644373EA0149801515042
+B1727154551615N00644322EA0148001501055
+B1727254551663N00644275EA0146401486052
+B1727354551727N00644255EA0144601470051
+B1727454551790N00644239EA0143501453051
+B1727554551830N00644228EA0142601439039
+B1728054551869N00644211EA0141201428045
+B1728154551912N00644200EA0139801416052
+B1728254551963N00644178EA0138501403050
+B1728354552012N00644146EA0137101389048
+B1728454552054N00644095EA0136601377045
+B1728554552101N00644068EA0136301367045
+B1729054552141N00644053EA0136301360040
+B1729154552180N00644021EA0136701356037
+B1729254552174N00643997EA0137201355041
+B1729354552129N00644032EA0137201355041
+B1729454552153N00644007EA0137401356036
+B1729554552200N00644014EA0137501359041
+B1730054552241N00643985EA0138701363041
+B1730154552280N00643975EA0138401366038
+B1730254552325N00643966EA0138101367037
+B1730354552376N00643955EA0138401368040
+B1730454552425N00643934EA0139001369038
+B1730554552471N00643907EA0138801370037
+B1731054552518N00643879EA0138801370040
+B1731154552558N00643846EA0138801370038
+B1731254552590N00643808EA0138701370033
+B1731354552624N00643774EA0139101370033
+B1731454552639N00643734EA0139901374040
+B1731554552586N00643762EA0139401376043
+B1732054552605N00643737EA0139101376041
+B1732154552650N00643728EA0139201375040
+B1732254552688N00643710EA0139501375038
+B1732354552728N00643689EA0139601376039
+B1732454552763N00643662EA0139801377042
+B1732554552803N00643642EA0139801378037
+B1733064552854N00643617EA0140301379037
+B1733164552902N00643599EA0140401381039
+B1733264552960N00643590EA0140501382037
+B1733364553015N00643580EA0140201383038
+B1733464553071N00643568EA0139201380043
+B1733564553131N00643574EA0139401377038
+B1734064553181N00643584EA0138901374044
+B1734164553235N00643593EA0138301371039
+B1734264553293N00643591EA0137801367048
+B1734364553353N00643601EA0137601363039
+B1734464553408N00643610EA0137801361037
+B1734564553465N00643611EA0137301358044
+B1735064553518N00643608EA0136801355038
+B1735164553575N00643615EA0136301352045
+B1735264553634N00643603EA0136501349038
+B1735364553702N00643632EA0136201347040
+B1735464553774N00643674EA0134801342045
+B1735564553833N00643701EA0134401336040
+B1736064553891N00643719EA0134101331037
+B1736164553951N00643738EA0133301326043
+B1736264554013N00643764EA0133301322036
+B1736364554075N00643782EA0132501317043
+B1736464554139N00643786EA0131701311037
+B1736564554201N00643814EA0130001303035
+B1737064554268N00643844EA0128001291042
+B1737164554340N00643859EA0126201276046
+B1737264554411N00643870EA0124201261041
+B1737364554482N00643882EA0122301244037
+B1737464554550N00643910EA0120301226045
+B1737564554619N00643915EA0118001207044
+B1738064554675N00643854EA0116701189043
+B1738164554706N00643785EA0115101171042
+B1738264554704N00643719EA0114001155042
+B1738364554716N00643648EA0112701139037
+B1738464554720N00643586EA0111901126044
+B1738564554698N00643549EA0111201115043
+B1739064554675N00643515EA0111001106037
+B1739164554646N00643487EA0110401099044
+B1739264554613N00643454EA0110001092034
+B1739364554593N00643430EA0110101088037
+B1739464554573N00643413EA0109701085039
+B1739564554543N00643400EA0110101081038
+B1740064554513N00643385EA0110601080035
+B1740164554485N00643369EA0111001081034
+B1740264554513N00643366EA0110901083036
+B1740364554510N00643428EA0110801084038
+B1740464554478N00643400EA0109901083040
+B1740574554439N00643367EA0109101079038
+B1741074554418N00643315EA0107301072038
+B1741174554423N00643257EA0106601061033
+B1741274554472N00643275EA0106301054036
+B1741374554458N00643328EA0105301048033
+B1741474554429N00643287EA0103801039042
+B1741574554416N00643236EA0102501029037
+B1742074554411N00643190EA0100601018038
+B1742174554466N00643227EA0099601003036
+B1742274554500N00643298EA0098500990035
+B1742374554505N00643363EA0098200980035
+B1742474554491N00643316EA0096200969036
+B1742574554504N00643244EA0094700956040
+B1743074554534N00643189EA0093400943038
+B1743174554557N00643137EA0092100929036
+B1743274554581N00643084EA0091200916044
+B1743374554606N00643034EA0090200904034
+B1743474554633N00642986EA0090900894038
+B1743574554619N00642995EA0091500891041
+B1744074554657N00643053EA0092000891030
+B1744174554678N00643029EA0092400892036
+B1744274554647N00643070EA0093100896033
+B1744374554678N00643125EA0094000901031
+B1744474554703N00643105EA0094100905038
+B1744574554672N00643129EA0094500909033
+B1745074554680N00643128EA0094400912033
+B1745174554713N00643204EA0094200914041
+B1745274554685N00643212EA0093700914044
+B1745374554692N00643163EA0094000913036
+B1745474554739N00643165EA0093500912037
+B1745574554733N00643235EA0092900909038
+B1746074554710N00643256EA0092100905036
+B1746174554735N00643214EA0091700900037
+B1746274554793N00643257EA0091000894038
+B1746374554787N00643263EA0090300889037
+B1746474554825N00643213EA0088700881036
+B1746574554862N00643161EA0087200870035
+B1747074554912N00643115EA0086900859036
+B1747174554934N00643073EA0087200853038
+B1747274554932N00643033EA0087000849040
+B1747374554937N00642991EA0087700847034
+B1747474554922N00643052EA0087500846040
+B1747574554986N00643097EA0087600847038
+B1748074555037N00643065EA0087300847037
+B1748174555021N00643025EA0087000846038
+B1748274555017N00642975EA0086600844038
+B1748374555026N00642931EA0086500842037
+B1748484555038N00642887EA0087200841035
+B1748584555024N00642947EA0087300841039
+B1749084555076N00642986EA0087900842034
+B1749184555124N00642954EA0087100843031
+B1749284555136N00642891EA0087400843037
+B1749384555112N00642903EA0086700841038
+B1749484555147N00642965EA0087000841032
+B1749584555137N00643003EA0086600840039
+B1750084555128N00642971EA0087200840032
+B1750184555167N00643005EA0087000841033
+B1750284555147N00643051EA0086300840036
+B1750384555128N00643016EA0085200836036
+B1750484555110N00642958EA0084900830041
+B1750584555096N00642907EA0084900826040
+B1751084555088N00642868EA0084800824038
+B1751184555092N00642816EA0084500821040
+B1751284555077N00642772EA0084100818038
+B1751384555063N00642722EA0083100814037
+B1751484555053N00642675EA0081900808039
+B1751584555041N00642624EA0081600800036
+B1752084555023N00642582EA0080500793042
+B1752184555027N00642525EA0080000785037
+B1752284555028N00642471EA0079300777040
+B1752384555039N00642410EA0078800771041
+B1752484555046N00642346EA0078700765038
+B1752584555028N00642289EA0077800760043
+B1753084554983N00642269EA0076800753043
+B1753184554936N00642304EA0076000745037
+B1753284554914N00642384EA0074800737040
+B1753384554927N00642482EA0073600728041
+B1753484554964N00642576EA0072000718005
+B1753584555033N00642625EA0071800707002
+B1754084555093N00642588EA0070400697000
+B1754184555113N00642503EA0069400686001
+B1754284555110N00642430EA0068500676000
+B1754384555080N00642396EA0067600665000
+B1754484555043N00642363EA0066800656000
+B1754584555012N00642323EA0065800646000
+B1755084554984N00642342EA0064300636000
+B1755184555015N00642412EA0063300625000
+B1755284554990N00642377EA0062000615002
+B1755384554962N00642364EA0061600606000
+B1755484554962N00642363EA0061600601000
+B1755584554963N00642364EA0061600596000
+B1756084554963N00642365EA0061600591000
+B1756184554964N00642366EA0061600587000
+B1756294554965N00642366EA0061600584000
diff --git a/examples/data/igc/Sylvain-Dhonneur.igc b/examples/data/igc/Sylvain-Dhonneur.igc
new file mode 100644
index 0000000..c24d53b
--- /dev/null
+++ b/examples/data/igc/Sylvain-Dhonneur.igc
@@ -0,0 +1,16374 @@
+AXGD111 6030, SN07178, SW3.29
+HFDTE190411
+HOPLTPILOT: Sylvain Dhonneur
+HOGTYGLIDERTYPE: R10
+HOGTYGLIDERID: None
+HOCIDCOMPETITIONID: 
+HODTM100GPSDATUM: WGS-84
+HOCCLCOMPETITION CLASS: None
+HOSITSite: None
+B0851014556248N00651105EA0000002045
+B0851034556248N00651105EA0000002045
+B0851054556248N00651105EA0000002045
+B0851074556248N00651105EA0000002045
+B0851094556248N00651105EA0000002045
+B0851114556248N00651105EA0000002045
+B0851134556248N00651105EA0000002045
+B0851154556248N00651105EA0000002045
+B0851174556248N00651105EA0000002045
+B0851194556248N00651105EA0000002045
+B0851214556248N00651105EA0000002045
+B0851234556248N00651105EA0000002045
+B0851254556248N00651105EA0000002045
+B0851274556248N00651105EA0000002045
+B0851294556248N00651105EA0000002045
+B0851314556248N00651105EA0000002045
+B0851334556248N00651105EA0000002045
+B0851354556251N00651107EA0000002045
+B0851374556254N00651109EA0000002045
+B0851394556258N00651111EA0000002045
+B0851414556265N00651116EA0000002045
+B0851434556275N00651124EA0000002044
+B0851454556282N00651135EA0000002041
+B0851474556289N00651146EA0000002039
+B0851494556295N00651156EA0000002036
+B0851514556299N00651169EA0000002032
+B0851534556302N00651185EA0000002028
+B0851554556305N00651199EA0000002025
+B0851574556307N00651211EA0000002023
+B0851594556306N00651224EA0000002021
+B0852024556305N00651235EA0000002020
+B0852044556306N00651241EA0000002021
+B0852064556310N00651247EA0000002022
+B0852084556311N00651254EA0000002024
+B0852104556307N00651258EA0000002027
+B0852124556304N00651261EA0000002031
+B0852144556303N00651267EA0000002035
+B0852164556300N00651274EA0000002037
+B0852184556296N00651281EA0000002039
+B0852204556290N00651286EA0000002040
+B0852224556282N00651290EA0000002041
+B0852244556274N00651291EA0000002043
+B0852264556270N00651293EA0000002045
+B0852284556264N00651297EA0000002046
+B0852304556256N00651300EA0000002049
+B0852324556250N00651301EA0000002052
+B0852344556243N00651301EA0000002057
+B0852364556234N00651303EA0000002061
+B0852384556224N00651305EA0000002067
+B0852404556214N00651303EA0000002072
+B0852424556204N00651298EA0000002077
+B0852444556192N00651294EA0000002081
+B0852464556179N00651294EA0000002084
+B0852484556171N00651300EA0000002086
+B0852504556170N00651308EA0000002089
+B0852524556173N00651313EA0000002091
+B0852544556181N00651312EA0000002092
+B0852564556189N00651302EA0000002094
+B0852584556192N00651284EA0000002094
+B0853004556193N00651265EA0000002095
+B0853024556193N00651243EA0000002095
+B0853044556184N00651214EA0000002096
+B0853064556175N00651201EA0000002099
+B0853084556165N00651190EA0000002102
+B0853104556157N00651178EA0000002106
+B0853124556149N00651163EA0000002111
+B0853144556144N00651150EA0000002117
+B0853164556136N00651140EA0000002122
+B0853184556125N00651133EA0000002128
+B0853204556115N00651140EA0000002137
+B0853224556111N00651149EA0000002144
+B0853254556108N00651158EA0000002151
+B0853274556111N00651165EA0000002157
+B0853294556118N00651164EA0000002162
+B0853314556126N00651154EA0000002165
+B0853334556128N00651132EA0000002167
+B0853354556124N00651110EA0000002172
+B0853374556122N00651094EA0000002179
+B0853394556121N00651083EA0000002186
+B0853414556118N00651070EA0000002192
+B0853434556110N00651056EA0000002197
+B0853454556098N00651058EA0000002204
+B0853474556088N00651067EA0000002213
+B0853494556085N00651076EA0000002220
+B0853514556086N00651085EA0000002227
+B0853534556086N00651085EA0000002235
+B0853554556099N00651084EA0000002241
+B0853574556103N00651068EA0000002246
+B0853594556104N00651049EA0000002254
+B0854014556099N00651031EA0000002261
+B0854034556088N00651018EA0000002270
+B0854054556076N00651010EA0000002278
+B0854074556065N00651011EA0000002284
+B0854094556056N00651016EA0000002291
+B0854114556049N00651024EA0000002299
+B0854134556047N00651031EA0000002306
+B0854154556050N00651035EA0000002311
+B0854174556057N00651032EA0000002315
+B0854194556065N00651019EA0000002319
+B0854214556070N00650999EA0000002324
+B0854234556070N00650978EA0000002330
+B0854254556066N00650962EA0000002337
+B0854274556060N00650946EA0000002344
+B0854294556052N00650928EA0000002350
+B0854314556038N00650920EA0000002356
+B0854334556026N00650914EA0000002360
+B0854354556014N00650910EA0000002363
+B0854374556003N00650911EA0000002365
+B0854394555996N00650918EA0000002368
+B0854414555995N00650926EA0000002372
+B0854434555999N00650931EA0000002377
+B0854454556008N00650931EA0000002385
+B0854474556013N00650929EA0000002390
+B0854494556019N00650927EA0000002394
+B0854514556026N00650921EA0000002397
+B0854534556034N00650915EA0000002401
+B0854554556040N00650914EA0000002406
+B0854574556046N00650917EA0000002411
+B0854594556052N00650920EA0000002416
+B0855014556058N00650920EA0000002420
+B0855034556064N00650923EA0000002424
+B0855064556069N00650931EA0000002427
+B0855084556074N00650938EA0000002430
+B0855104556079N00650943EA0000002435
+B0855124556085N00650947EA0000002441
+B0855144556092N00650947EA0000002446
+B0855164556100N00650941EA0000002450
+B0855184556104N00650930EA0000002453
+B0855204556107N00650917EA0000002456
+B0855224556108N00650901EA0000002457
+B0855244556102N00650887EA0000002458
+B0855264556089N00650881EA0000002459
+B0855284556078N00650885EA0000002460
+B0855304556071N00650893EA0000002460
+B0855324556065N00650903EA0000002459
+B0855344556060N00650915EA0000002459
+B0855364556055N00650927EA0000002459
+B0855384556053N00650938EA0000002461
+B0855404556050N00650950EA0000002465
+B0855424556046N00650962EA0000002469
+B0855444556040N00650971EA0000002474
+B0855464556032N00650980EA0000002479
+B0855484556023N00650991EA0000002483
+B0855504556015N00651002EA0000002488
+B0855524556011N00651015EA0000002492
+B0855544556013N00651027EA0000002496
+B0855564556019N00651029EA0000002500
+B0855584556026N00651024EA0000002504
+B0856004556032N00651016EA0000002508
+B0856024556035N00651003EA0000002512
+B0856044556034N00650987EA0000002515
+B0856064556030N00650971EA0000002519
+B0856084556023N00650959EA0000002523
+B0856104556014N00650947EA0000002527
+B0856124556003N00650936EA0000002530
+B0856144555991N00650929EA0000002533
+B0856164555979N00650924EA0000002536
+B0856184555967N00650920EA0000002539
+B0856204555956N00650922EA0000002541
+B0856224555946N00650928EA0000002542
+B0856244555941N00650939EA0000002543
+B0856264555943N00650955EA0000002543
+B0856284555948N00650961EA0000002544
+B0856304555954N00650962EA0000002545
+B0856324555962N00650959EA0000002546
+B0856344555967N00650953EA0000002548
+B0856364555971N00650943EA0000002550
+B0856384555976N00650932EA0000002551
+B0856404555978N00650923EA0000002553
+B0856424555980N00650915EA0000002555
+B0856454555983N00650906EA0000002556
+B0856474555986N00650895EA0000002557
+B0856494555985N00650882EA0000002557
+B0856514555984N00650868EA0000002558
+B0856534555983N00650853EA0000002560
+B0856554555981N00650839EA0000002562
+B0856574555981N00650827EA0000002565
+B0856594555983N00650815EA0000002568
+B0857014555983N00650800EA0000002569
+B0857034555979N00650786EA0000002568
+B0857054555968N00650778EA0000002566
+B0857074555959N00650774EA0000002564
+B0857094555949N00650770EA0000002562
+B0857114555938N00650765EA0000002560
+B0857134555927N00650758EA0000002557
+B0857154555917N00650751EA0000002554
+B0857174555907N00650743EA0000002551
+B0857194555897N00650733EA0000002547
+B0857214555887N00650721EA0000002543
+B0857234555876N00650709EA0000002539
+B0857254555867N00650697EA0000002537
+B0857274555860N00650688EA0000002536
+B0857294555852N00650681EA0000002536
+B0857314555844N00650676EA0000002536
+B0857334555835N00650669EA0000002535
+B0857354555824N00650658EA0000002530
+B0857374555814N00650646EA0000002529
+B0857394555805N00650635EA0000002525
+B0857414555796N00650623EA0000002520
+B0857434555785N00650610EA0000002517
+B0857454555775N00650599EA0000002514
+B0857474555766N00650588EA0000002509
+B0857494555756N00650575EA0000002504
+B0857514555746N00650561EA0000002500
+B0857534555737N00650546EA0000002497
+B0857554555728N00650531EA0000002493
+B0857574555718N00650516EA0000002490
+B0857594555708N00650501EA0000002486
+B0858014555699N00650485EA0000002483
+B0858034555684N00650461EA0000002478
+B0858054555675N00650445EA0000002476
+B0858074555666N00650430EA0000002473
+B0858094555656N00650416EA0000002469
+B0858114555645N00650400EA0000002464
+B0858134555634N00650385EA0000002459
+B0858154555622N00650372EA0000002455
+B0858174555609N00650359EA0000002450
+B0858194555596N00650346EA0000002447
+B0858214555585N00650333EA0000002444
+B0858244555574N00650319EA0000002440
+B0858264555563N00650304EA0000002436
+B0858284555554N00650289EA0000002433
+B0858304555545N00650273EA0000002429
+B0858324555537N00650256EA0000002425
+B0858344555531N00650236EA0000002421
+B0858364555524N00650216EA0000002419
+B0858384555517N00650196EA0000002418
+B0858404555511N00650178EA0000002419
+B0858424555507N00650160EA0000002419
+B0858444555502N00650142EA0000002419
+B0858464555498N00650124EA0000002420
+B0858484555492N00650107EA0000002420
+B0858504555487N00650089EA0000002419
+B0858524555483N00650070EA0000002418
+B0858544555479N00650050EA0000002418
+B0858564555475N00650031EA0000002419
+B0858584555471N00650012EA0000002421
+B0859004555466N00649995EA0000002424
+B0859024555462N00649982EA0000002426
+B0859044555458N00649968EA0000002427
+B0859064555453N00649950EA0000002425
+B0859084555448N00649930EA0000002426
+B0859104555442N00649911EA0000002427
+B0859124555437N00649895EA0000002428
+B0859144555434N00649881EA0000002427
+B0859164555431N00649862EA0000002424
+B0859184555427N00649842EA0000002424
+B0859204555423N00649825EA0000002425
+B0859224555419N00649812EA0000002429
+B0859244555416N00649799EA0000002430
+B0859264555413N00649784EA0000002430
+B0859284555412N00649765EA0000002430
+B0859304555420N00649750EA0000002429
+B0859324555431N00649745EA0000002427
+B0859344555440N00649752EA0000002424
+B0859364555438N00649764EA0000002424
+B0859384555423N00649765EA0000002425
+B0859404555411N00649757EA0000002428
+B0859424555403N00649745EA0000002431
+B0859444555397N00649734EA0000002432
+B0859464555390N00649719EA0000002432
+B0859484555382N00649704EA0000002433
+B0859504555377N00649689EA0000002435
+B0859524555373N00649676EA0000002436
+B0859544555365N00649660EA0000002437
+B0859564555360N00649644EA0000002440
+B0859594555355N00649633EA0000002441
+B0900014555348N00649621EA0000002442
+B0900034555341N00649606EA0000002443
+B0900054555334N00649593EA0000002446
+B0900074555327N00649583EA0000002448
+B0900094555319N00649573EA0000002449
+B0900114555310N00649561EA0000002449
+B0900134555303N00649549EA0000002451
+B0900154555296N00649538EA0000002451
+B0900174555289N00649526EA0000002449
+B0900194555281N00649512EA0000002446
+B0900214555273N00649497EA0000002443
+B0900234555266N00649483EA0000002439
+B0900254555259N00649467EA0000002436
+B0900274555254N00649451EA0000002434
+B0900294555249N00649436EA0000002433
+B0900314555245N00649421EA0000002431
+B0900334555240N00649404EA0000002430
+B0900354555235N00649389EA0000002429
+B0900374555232N00649374EA0000002428
+B0900394555227N00649358EA0000002425
+B0900414555222N00649341EA0000002423
+B0900434555217N00649324EA0000002420
+B0900454555212N00649309EA0000002416
+B0900474555208N00649296EA0000002412
+B0900494555202N00649281EA0000002408
+B0900514555194N00649265EA0000002406
+B0900534555190N00649252EA0000002405
+B0900554555187N00649237EA0000002405
+B0900574555182N00649219EA0000002406
+B0900594555179N00649203EA0000002410
+B0901014555176N00649188EA0000002414
+B0901034555171N00649170EA0000002420
+B0901054555167N00649152EA0000002426
+B0901074555165N00649134EA0000002433
+B0901094555165N00649121EA0000002440
+B0901114555163N00649111EA0000002445
+B0901134555161N00649102EA0000002448
+B0901154555153N00649083EA0000002449
+B0901174555146N00649071EA0000002453
+B0901194555136N00649060EA0000002455
+B0901214555126N00649051EA0000002458
+B0901234555118N00649048EA0000002461
+B0901254555112N00649054EA0000002464
+B0901274555111N00649061EA0000002466
+B0901294555115N00649068EA0000002468
+B0901324555121N00649073EA0000002470
+B0901344555127N00649078EA0000002470
+B0901364555134N00649084EA0000002470
+B0901384555141N00649091EA0000002470
+B0901404555147N00649098EA0000002471
+B0901424555152N00649107EA0000002471
+B0901444555157N00649115EA0000002472
+B0901464555161N00649122EA0000002474
+B0901484555166N00649128EA0000002475
+B0901504555170N00649136EA0000002477
+B0901524555173N00649145EA0000002479
+B0901544555176N00649153EA0000002480
+B0901564555177N00649161EA0000002483
+B0901584555177N00649161EA0000002484
+B0902004555175N00649182EA0000002485
+B0902024555171N00649192EA0000002487
+B0902044555164N00649200EA0000002488
+B0902064555155N00649201EA0000002489
+B0902084555144N00649192EA0000002489
+B0902104555136N00649174EA0000002488
+B0902124555133N00649155EA0000002489
+B0902144555134N00649136EA0000002490
+B0902164555135N00649115EA0000002491
+B0902184555136N00649094EA0000002491
+B0902204555137N00649074EA0000002491
+B0902224555139N00649054EA0000002490
+B0902244555140N00649034EA0000002489
+B0902264555140N00649019EA0000002490
+B0902284555141N00649001EA0000002489
+B0902304555142N00648981EA0000002489
+B0902324555142N00648961EA0000002490
+B0902344555144N00648941EA0000002492
+B0902364555146N00648921EA0000002495
+B0902384555147N00648901EA0000002498
+B0902404555149N00648881EA0000002500
+B0902424555156N00648862EA0000002501
+B0902444555168N00648850EA0000002502
+B0902464555182N00648850EA0000002504
+B0902484555191N00648857EA0000002506
+B0902504555185N00648863EA0000002511
+B0902524555178N00648857EA0000002516
+B0902544555176N00648839EA0000002522
+B0902564555182N00648818EA0000002526
+B0902584555196N00648817EA0000002532
+B0903004555207N00648827EA0000002537
+B0903024555210N00648836EA0000002543
+B0903044555204N00648840EA0000002550
+B0903064555196N00648837EA0000002557
+B0903084555191N00648825EA0000002563
+B0903114555191N00648808EA0000002571
+B0903134555197N00648794EA0000002578
+B0903154555207N00648782EA0000002586
+B0903174555219N00648776EA0000002594
+B0903194555232N00648779EA0000002602
+B0903214555242N00648788EA0000002610
+B0903234555247N00648799EA0000002618
+B0903254555244N00648807EA0000002625
+B0903274555237N00648812EA0000002632
+B0903294555231N00648813EA0000002640
+B0903314555227N00648810EA0000002649
+B0903334555223N00648802EA0000002656
+B0903354555222N00648785EA0000002662
+B0903374555228N00648767EA0000002669
+B0903394555240N00648758EA0000002677
+B0903414555255N00648763EA0000002687
+B0903434555264N00648774EA0000002698
+B0903454555267N00648785EA0000002708
+B0903474555259N00648787EA0000002718
+B0903494555253N00648780EA0000002728
+B0903514555252N00648769EA0000002739
+B0903534555252N00648755EA0000002748
+B0903554555250N00648743EA0000002759
+B0903574555248N00648731EA0000002770
+B0903594555245N00648719EA0000002780
+B0904014555240N00648707EA0000002789
+B0904034555235N00648695EA0000002797
+B0904054555229N00648684EA0000002804
+B0904074555222N00648673EA0000002810
+B0904094555215N00648661EA0000002814
+B0904114555207N00648648EA0000002816
+B0904134555199N00648635EA0000002819
+B0904154555193N00648625EA0000002823
+B0904174555187N00648616EA0000002826
+B0904194555179N00648605EA0000002828
+B0904214555173N00648593EA0000002830
+B0904234555167N00648583EA0000002832
+B0904254555161N00648572EA0000002832
+B0904274555152N00648552EA0000002830
+B0904294555146N00648543EA0000002829
+B0904314555139N00648538EA0000002827
+B0904334555130N00648531EA0000002824
+B0904354555124N00648518EA0000002816
+B0904374555119N00648505EA0000002815
+B0904394555114N00648494EA0000002815
+B0904414555109N00648484EA0000002812
+B0904434555103N00648471EA0000002811
+B0904454555098N00648457EA0000002810
+B0904474555092N00648443EA0000002807
+B0904504555085N00648427EA0000002804
+B0904524555079N00648411EA0000002802
+B0904544555074N00648394EA0000002800
+B0904564555068N00648380EA0000002797
+B0904584555061N00648366EA0000002794
+B0905004555055N00648351EA0000002791
+B0905024555050N00648335EA0000002790
+B0905044555045N00648321EA0000002790
+B0905064555039N00648309EA0000002789
+B0905084555034N00648295EA0000002788
+B0905104555028N00648280EA0000002787
+B0905124555021N00648267EA0000002786
+B0905144555014N00648255EA0000002783
+B0905164555005N00648241EA0000002779
+B0905184554996N00648227EA0000002773
+B0905204554987N00648212EA0000002766
+B0905224554978N00648197EA0000002760
+B0905244554968N00648181EA0000002754
+B0905264554958N00648166EA0000002749
+B0905284554948N00648150EA0000002743
+B0905304554939N00648133EA0000002736
+B0905324554928N00648116EA0000002730
+B0905344554918N00648100EA0000002723
+B0905364554907N00648083EA0000002715
+B0905384554895N00648063EA0000002707
+B0905404554884N00648044EA0000002701
+B0905424554873N00648030EA0000002695
+B0905444554859N00648018EA0000002688
+B0905464554845N00648004EA0000002683
+B0905484554832N00647991EA0000002678
+B0905504554819N00647978EA0000002671
+B0905524554804N00647964EA0000002665
+B0905544554790N00647950EA0000002661
+B0905564554777N00647936EA0000002658
+B0905584554765N00647923EA0000002655
+B0906004554752N00647910EA0000002653
+B0906024554740N00647896EA0000002651
+B0906044554729N00647881EA0000002648
+B0906064554718N00647867EA0000002645
+B0906084554700N00647848EA0000002638
+B0906104554688N00647834EA0000002634
+B0906124554678N00647818EA0000002630
+B0906144554667N00647804EA0000002626
+B0906164554655N00647792EA0000002622
+B0906184554643N00647778EA0000002617
+B0906204554631N00647761EA0000002614
+B0906224554619N00647745EA0000002610
+B0906244554608N00647729EA0000002607
+B0906264554596N00647713EA0000002604
+B0906284554585N00647699EA0000002602
+B0906314554572N00647686EA0000002600
+B0906334554560N00647674EA0000002597
+B0906354554549N00647659EA0000002593
+B0906374554537N00647644EA0000002590
+B0906394554525N00647627EA0000002587
+B0906414554514N00647608EA0000002584
+B0906434554504N00647590EA0000002582
+B0906454554495N00647570EA0000002579
+B0906474554486N00647550EA0000002577
+B0906494554479N00647532EA0000002573
+B0906514554471N00647512EA0000002568
+B0906534554464N00647489EA0000002564
+B0906554554457N00647467EA0000002561
+B0906574554449N00647446EA0000002557
+B0906594554442N00647423EA0000002554
+B0907014554435N00647401EA0000002552
+B0907034554428N00647380EA0000002548
+B0907054554421N00647356EA0000002546
+B0907074554414N00647335EA0000002544
+B0907094554408N00647315EA0000002541
+B0907114554403N00647295EA0000002538
+B0907134554398N00647274EA0000002536
+B0907154554392N00647255EA0000002534
+B0907174554385N00647238EA0000002532
+B0907194554378N00647221EA0000002530
+B0907214554371N00647205EA0000002528
+B0907234554366N00647190EA0000002526
+B0907254554360N00647173EA0000002522
+B0907274554355N00647156EA0000002519
+B0907294554347N00647139EA0000002515
+B0907314554339N00647121EA0000002511
+B0907334554331N00647103EA0000002508
+B0907354554322N00647087EA0000002506
+B0907374554312N00647072EA0000002504
+B0907394554303N00647057EA0000002501
+B0907414554295N00647042EA0000002499
+B0907434554288N00647025EA0000002496
+B0907454554281N00647008EA0000002492
+B0907474554273N00646992EA0000002489
+B0907494554261N00646968EA0000002482
+B0907514554252N00646951EA0000002478
+B0907534554242N00646933EA0000002474
+B0907554554233N00646914EA0000002471
+B0907574554223N00646895EA0000002467
+B0907594554213N00646877EA0000002465
+B0908014554201N00646860EA0000002463
+B0908034554190N00646844EA0000002462
+B0908054554181N00646830EA0000002462
+B0908074554172N00646815EA0000002460
+B0908104554161N00646799EA0000002458
+B0908124554152N00646782EA0000002458
+B0908144554144N00646766EA0000002459
+B0908164554135N00646749EA0000002458
+B0908184554127N00646731EA0000002458
+B0908204554120N00646713EA0000002457
+B0908224554114N00646695EA0000002456
+B0908244554107N00646677EA0000002453
+B0908264554099N00646659EA0000002452
+B0908284554092N00646642EA0000002451
+B0908304554084N00646626EA0000002449
+B0908324554076N00646610EA0000002447
+B0908344554069N00646594EA0000002445
+B0908364554062N00646577EA0000002443
+B0908384554062N00646577EA0000002441
+B0908404554048N00646543EA0000002439
+B0908424554040N00646527EA0000002437
+B0908444554032N00646511EA0000002434
+B0908464554023N00646496EA0000002431
+B0908484554015N00646480EA0000002429
+B0908504554007N00646464EA0000002427
+B0908524553999N00646448EA0000002424
+B0908544553991N00646432EA0000002420
+B0908564553982N00646415EA0000002417
+B0908584553973N00646398EA0000002414
+B0909004553964N00646383EA0000002411
+B0909024553954N00646368EA0000002408
+B0909044553945N00646351EA0000002404
+B0909064553936N00646333EA0000002402
+B0909084553928N00646319EA0000002401
+B0909104553920N00646304EA0000002397
+B0909124553911N00646288EA0000002394
+B0909144553902N00646272EA0000002393
+B0909164553894N00646257EA0000002391
+B0909184553886N00646241EA0000002387
+B0909204553877N00646225EA0000002385
+B0909224553868N00646209EA0000002382
+B0909244553859N00646195EA0000002379
+B0909264553849N00646180EA0000002376
+B0909284553838N00646165EA0000002373
+B0909304553824N00646143EA0000002369
+B0909324553814N00646128EA0000002366
+B0909344553805N00646114EA0000002364
+B0909364553796N00646100EA0000002361
+B0909384553787N00646085EA0000002357
+B0909404553778N00646068EA0000002355
+B0909424553770N00646053EA0000002353
+B0909444553762N00646039EA0000002350
+B0909464553753N00646023EA0000002346
+B0909484553744N00646008EA0000002344
+B0909514553735N00645995EA0000002342
+B0909534553727N00645980EA0000002339
+B0909554553717N00645965EA0000002337
+B0909574553708N00645951EA0000002336
+B0909594553699N00645938EA0000002334
+B0910014553689N00645924EA0000002332
+B0910034553680N00645910EA0000002331
+B0910054553671N00645897EA0000002329
+B0910074553662N00645883EA0000002327
+B0910094553653N00645869EA0000002325
+B0910114553643N00645856EA0000002323
+B0910134553633N00645844EA0000002320
+B0910154553622N00645831EA0000002318
+B0910174553612N00645819EA0000002315
+B0910194553602N00645806EA0000002313
+B0910214553592N00645792EA0000002311
+B0910234553583N00645777EA0000002308
+B0910254553575N00645762EA0000002306
+B0910274553567N00645747EA0000002303
+B0910294553559N00645731EA0000002301
+B0910314553550N00645715EA0000002298
+B0910334553542N00645699EA0000002296
+B0910354553534N00645683EA0000002294
+B0910374553526N00645668EA0000002292
+B0910394553518N00645653EA0000002289
+B0910414553510N00645637EA0000002286
+B0910434553504N00645619EA0000002283
+B0910454553500N00645601EA0000002281
+B0910474553496N00645583EA0000002278
+B0910494553490N00645565EA0000002275
+B0910514553484N00645548EA0000002274
+B0910534553478N00645531EA0000002272
+B0910554553472N00645514EA0000002269
+B0910574553468N00645495EA0000002266
+B0910594553465N00645477EA0000002265
+B0911014553463N00645459EA0000002263
+B0911034553459N00645441EA0000002260
+B0911054553454N00645423EA0000002258
+B0911074553447N00645406EA0000002257
+B0911094553440N00645391EA0000002256
+B0911114553430N00645367EA0000002253
+B0911134553422N00645352EA0000002251
+B0911154553413N00645339EA0000002248
+B0911174553405N00645324EA0000002245
+B0911194553396N00645307EA0000002242
+B0911214553386N00645294EA0000002240
+B0911234553378N00645285EA0000002239
+B0911254553370N00645274EA0000002235
+B0911274553357N00645261EA0000002230
+B0911294553343N00645248EA0000002228
+B0911324553331N00645239EA0000002225
+B0911344553319N00645228EA0000002219
+B0911364553304N00645214EA0000002216
+B0911384553294N00645205EA0000002215
+B0911404553286N00645197EA0000002215
+B0911424553276N00645187EA0000002215
+B0911444553264N00645177EA0000002216
+B0911464553253N00645167EA0000002219
+B0911484553243N00645156EA0000002223
+B0911504553233N00645144EA0000002228
+B0911524553224N00645131EA0000002234
+B0911544553218N00645118EA0000002240
+B0911564553212N00645106EA0000002245
+B0911584553204N00645094EA0000002249
+B0912004553194N00645086EA0000002252
+B0912024553188N00645087EA0000002255
+B0912044553176N00645102EA0000002258
+B0912064553176N00645118EA0000002260
+B0912084553179N00645129EA0000002263
+B0912104553186N00645135EA0000002264
+B0912124553195N00645136EA0000002265
+B0912144553201N00645125EA0000002267
+B0912164553204N00645113EA0000002270
+B0912184553205N00645100EA0000002274
+B0912204553204N00645084EA0000002278
+B0912224553198N00645069EA0000002282
+B0912244553191N00645058EA0000002286
+B0912264553180N00645057EA0000002289
+B0912284553171N00645065EA0000002291
+B0912304553169N00645080EA0000002292
+B0912324553174N00645095EA0000002292
+B0912344553184N00645102EA0000002296
+B0912364553193N00645097EA0000002298
+B0912384553201N00645090EA0000002301
+B0912404553206N00645079EA0000002306
+B0912424553206N00645064EA0000002308
+B0912444553204N00645048EA0000002312
+B0912464553198N00645033EA0000002316
+B0912484553187N00645025EA0000002319
+B0912504553177N00645028EA0000002322
+B0912524553167N00645042EA0000002325
+B0912544553166N00645055EA0000002326
+B0912564553173N00645066EA0000002326
+B0912584553184N00645070EA0000002327
+B0913004553193N00645071EA0000002329
+B0913024553201N00645068EA0000002331
+B0913044553209N00645060EA0000002332
+B0913064553215N00645049EA0000002333
+B0913084553218N00645033EA0000002334
+B0913104553216N00645015EA0000002336
+B0913134553212N00645000EA0000002338
+B0913154553205N00644987EA0000002341
+B0913174553198N00644976EA0000002345
+B0913194553189N00644969EA0000002349
+B0913214553180N00644971EA0000002352
+B0913234553173N00644980EA0000002354
+B0913254553174N00644991EA0000002356
+B0913274553179N00644998EA0000002358
+B0913294553186N00645001EA0000002361
+B0913314553194N00644998EA0000002364
+B0913334553201N00644989EA0000002367
+B0913354553207N00644976EA0000002370
+B0913374553209N00644961EA0000002374
+B0913394553206N00644944EA0000002376
+B0913414553197N00644932EA0000002380
+B0913434553186N00644934EA0000002385
+B0913454553180N00644945EA0000002389
+B0913474553182N00644956EA0000002393
+B0913494553190N00644960EA0000002396
+B0913514553199N00644954EA0000002399
+B0913534553206N00644942EA0000002402
+B0913554553209N00644924EA0000002405
+B0913574553205N00644906EA0000002408
+B0913594553196N00644897EA0000002412
+B0914014553188N00644899EA0000002417
+B0914034553180N00644905EA0000002421
+B0914054553172N00644913EA0000002427
+B0914074553167N00644922EA0000002431
+B0914094553170N00644933EA0000002434
+B0914114553180N00644937EA0000002436
+B0914134553191N00644930EA0000002437
+B0914154553200N00644919EA0000002441
+B0914174553207N00644905EA0000002445
+B0914194553210N00644889EA0000002450
+B0914214553212N00644872EA0000002454
+B0914234553208N00644856EA0000002458
+B0914254553198N00644848EA0000002461
+B0914274553189N00644853EA0000002464
+B0914294553185N00644864EA0000002468
+B0914314553187N00644874EA0000002472
+B0914334553200N00644878EA0000002477
+B0914354553209N00644868EA0000002480
+B0914374553214N00644850EA0000002484
+B0914394553214N00644833EA0000002486
+B0914414553206N00644822EA0000002490
+B0914434553195N00644817EA0000002492
+B0914454553186N00644818EA0000002495
+B0914474553178N00644821EA0000002496
+B0914504553172N00644830EA0000002496
+B0914524553170N00644844EA0000002498
+B0914544553175N00644854EA0000002502
+B0914564553184N00644858EA0000002504
+B0914584553194N00644860EA0000002505
+B0915004553205N00644858EA0000002507
+B0915024553215N00644852EA0000002509
+B0915044553225N00644840EA0000002511
+B0915064553230N00644824EA0000002513
+B0915084553231N00644805EA0000002514
+B0915104553226N00644787EA0000002516
+B0915124553216N00644777EA0000002517
+B0915144553204N00644780EA0000002518
+B0915164553195N00644788EA0000002521
+B0915184553188N00644796EA0000002525
+B0915204553183N00644801EA0000002530
+B0915224553179N00644807EA0000002534
+B0915244553179N00644816EA0000002537
+B0915264553183N00644826EA0000002538
+B0915284553189N00644832EA0000002539
+B0915304553199N00644829EA0000002540
+B0915324553206N00644818EA0000002543
+B0915344553211N00644802EA0000002543
+B0915364553215N00644780EA0000002542
+B0915384553214N00644760EA0000002544
+B0915404553210N00644744EA0000002546
+B0915424553202N00644734EA0000002546
+B0915444553192N00644730EA0000002547
+B0915464553185N00644733EA0000002547
+B0915484553179N00644741EA0000002546
+B0915504553176N00644755EA0000002546
+B0915524553175N00644769EA0000002547
+B0915544553176N00644781EA0000002548
+B0915564553178N00644794EA0000002549
+B0915584553179N00644808EA0000002551
+B0916004553177N00644818EA0000002553
+B0916024553175N00644828EA0000002557
+B0916044553172N00644836EA0000002562
+B0916064553170N00644842EA0000002566
+B0916084553172N00644850EA0000002569
+B0916104553180N00644856EA0000002572
+B0916124553194N00644850EA0000002577
+B0916144553202N00644842EA0000002582
+B0916164553206N00644827EA0000002586
+B0916184553207N00644810EA0000002590
+B0916204553203N00644796EA0000002593
+B0916224553194N00644786EA0000002597
+B0916244553184N00644781EA0000002601
+B0916264553174N00644779EA0000002605
+B0916284553165N00644778EA0000002608
+B0916314553154N00644771EA0000002611
+B0916334553143N00644762EA0000002612
+B0916354553130N00644753EA0000002615
+B0916374553119N00644749EA0000002619
+B0916394553110N00644747EA0000002621
+B0916414553100N00644747EA0000002621
+B0916434553086N00644746EA0000002622
+B0916454553073N00644743EA0000002626
+B0916474553061N00644738EA0000002627
+B0916494553049N00644734EA0000002627
+B0916514553036N00644728EA0000002625
+B0916534553023N00644722EA0000002625
+B0916554553010N00644716EA0000002624
+B0916574552997N00644707EA0000002624
+B0916594552986N00644696EA0000002626
+B0917014552975N00644688EA0000002628
+B0917034552962N00644681EA0000002631
+B0917054552950N00644675EA0000002635
+B0917074552940N00644676EA0000002639
+B0917094552930N00644680EA0000002641
+B0917114552918N00644683EA0000002640
+B0917134552905N00644677EA0000002639
+B0917154552894N00644660EA0000002636
+B0917174552888N00644641EA0000002633
+B0917194552881N00644622EA0000002630
+B0917214552871N00644605EA0000002628
+B0917234552860N00644591EA0000002627
+B0917254552846N00644580EA0000002627
+B0917274552832N00644568EA0000002627
+B0917294552820N00644555EA0000002626
+B0917314552805N00644544EA0000002623
+B0917334552789N00644533EA0000002621
+B0917354552775N00644522EA0000002621
+B0917374552762N00644511EA0000002618
+B0917394552755N00644506EA0000002614
+B0917414552732N00644491EA0000002611
+B0917434552714N00644481EA0000002607
+B0917454552696N00644471EA0000002602
+B0917474552679N00644459EA0000002598
+B0917494552665N00644447EA0000002595
+B0917514552646N00644436EA0000002590
+B0917534552632N00644427EA0000002588
+B0917554552623N00644420EA0000002587
+B0917574552613N00644415EA0000002583
+B0917594552600N00644405EA0000002580
+B0918014552588N00644395EA0000002580
+B0918034552581N00644390EA0000002583
+B0918054552573N00644386EA0000002584
+B0918074552561N00644382EA0000002585
+B0918104552549N00644377EA0000002588
+B0918124552539N00644368EA0000002593
+B0918144552530N00644358EA0000002599
+B0918164552524N00644341EA0000002603
+B0918184552525N00644323EA0000002608
+B0918204552533N00644320EA0000002611
+B0918224552539N00644333EA0000002614
+B0918244552533N00644345EA0000002617
+B0918264552521N00644345EA0000002621
+B0918284552511N00644333EA0000002624
+B0918304552508N00644314EA0000002626
+B0918324552516N00644302EA0000002628
+B0918344552526N00644311EA0000002631
+B0918364552528N00644325EA0000002634
+B0918384552520N00644333EA0000002637
+B0918404552509N00644333EA0000002640
+B0918424552497N00644325EA0000002641
+B0918444552487N00644311EA0000002643
+B0918464552479N00644300EA0000002645
+B0918484552471N00644290EA0000002647
+B0918504552462N00644276EA0000002648
+B0918524552452N00644261EA0000002648
+B0918544552442N00644245EA0000002651
+B0918564552435N00644231EA0000002655
+B0918584552426N00644220EA0000002657
+B0919004552415N00644212EA0000002658
+B0919024552404N00644209EA0000002660
+B0919044552395N00644212EA0000002660
+B0919064552386N00644218EA0000002661
+B0919084552376N00644223EA0000002664
+B0919104552368N00644229EA0000002666
+B0919124552361N00644234EA0000002667
+B0919144552352N00644239EA0000002669
+B0919164552343N00644244EA0000002673
+B0919184552337N00644250EA0000002674
+B0919204552331N00644256EA0000002674
+B0919224552325N00644262EA0000002674
+B0919244552316N00644266EA0000002672
+B0919264552303N00644264EA0000002670
+B0919284552293N00644255EA0000002670
+B0919304552278N00644243EA0000002667
+B0919324552265N00644234EA0000002662
+B0919344552252N00644223EA0000002656
+B0919364552240N00644212EA0000002648
+B0919384552225N00644199EA0000002639
+B0919404552209N00644184EA0000002633
+B0919424552195N00644171EA0000002628
+B0919444552181N00644157EA0000002621
+B0919464552167N00644143EA0000002616
+B0919484552153N00644128EA0000002609
+B0919514552138N00644112EA0000002603
+B0919534552123N00644097EA0000002598
+B0919554552109N00644083EA0000002592
+B0919574552096N00644068EA0000002586
+B0919594552082N00644054EA0000002579
+B0920014552068N00644040EA0000002573
+B0920034552055N00644026EA0000002567
+B0920054552042N00644012EA0000002561
+B0920074552029N00643997EA0000002556
+B0920094552017N00643980EA0000002552
+B0920114552004N00643965EA0000002547
+B0920134551991N00643950EA0000002541
+B0920154551978N00643934EA0000002535
+B0920174551964N00643917EA0000002528
+B0920194551950N00643900EA0000002521
+B0920214551935N00643881EA0000002514
+B0920234551919N00643863EA0000002508
+B0920254551904N00643846EA0000002503
+B0920274551888N00643829EA0000002497
+B0920294551872N00643812EA0000002492
+B0920314551856N00643795EA0000002487
+B0920334551839N00643779EA0000002482
+B0920354551823N00643763EA0000002479
+B0920374551807N00643747EA0000002475
+B0920394551790N00643731EA0000002472
+B0920414551773N00643715EA0000002469
+B0920434551757N00643700EA0000002465
+B0920454551739N00643685EA0000002461
+B0920474551722N00643670EA0000002458
+B0920494551704N00643655EA0000002454
+B0920514551687N00643640EA0000002451
+B0920534551671N00643624EA0000002446
+B0920554551653N00643608EA0000002442
+B0920574551635N00643593EA0000002439
+B0920594551619N00643577EA0000002438
+B0921014551602N00643562EA0000002437
+B0921034551586N00643547EA0000002434
+B0921054551571N00643530EA0000002430
+B0921074551554N00643514EA0000002426
+B0921094551536N00643500EA0000002422
+B0921114551509N00643482EA0000002419
+B0921134551493N00643469EA0000002416
+B0921154551476N00643458EA0000002413
+B0921174551459N00643445EA0000002409
+B0921194551442N00643432EA0000002405
+B0921214551426N00643419EA0000002402
+B0921234551410N00643406EA0000002399
+B0921254551394N00643392EA0000002395
+B0921274551379N00643378EA0000002392
+B0921294551364N00643363EA0000002388
+B0921324551349N00643349EA0000002385
+B0921344551335N00643335EA0000002384
+B0921364551323N00643322EA0000002382
+B0921384551311N00643310EA0000002378
+B0921404551296N00643298EA0000002375
+B0921424551283N00643286EA0000002374
+B0921444551271N00643273EA0000002371
+B0921464551257N00643261EA0000002368
+B0921484551244N00643248EA0000002365
+B0921504551231N00643235EA0000002363
+B0921524551218N00643223EA0000002360
+B0921544551205N00643210EA0000002357
+B0921564551192N00643197EA0000002355
+B0921584551179N00643184EA0000002352
+B0922004551165N00643173EA0000002349
+B0922024551151N00643163EA0000002346
+B0922044551137N00643151EA0000002344
+B0922064551123N00643140EA0000002341
+B0922084551110N00643127EA0000002338
+B0922104551097N00643113EA0000002336
+B0922124551084N00643099EA0000002333
+B0922144551072N00643086EA0000002330
+B0922164551060N00643071EA0000002327
+B0922184551047N00643058EA0000002324
+B0922204551034N00643045EA0000002322
+B0922224551022N00643032EA0000002319
+B0922244551009N00643020EA0000002316
+B0922264550996N00643009EA0000002314
+B0922284550982N00642999EA0000002312
+B0922304550970N00642989EA0000002309
+B0922324550957N00642978EA0000002305
+B0922344550943N00642966EA0000002301
+B0922364550931N00642952EA0000002299
+B0922384550919N00642938EA0000002295
+B0922404550908N00642923EA0000002292
+B0922424550896N00642908EA0000002289
+B0922444550886N00642894EA0000002286
+B0922464550876N00642878EA0000002281
+B0922484550865N00642862EA0000002277
+B0922504550853N00642846EA0000002273
+B0922524550838N00642824EA0000002267
+B0922544550828N00642808EA0000002262
+B0922564550818N00642791EA0000002258
+B0922584550808N00642777EA0000002254
+B0923004550797N00642765EA0000002248
+B0923024550784N00642752EA0000002242
+B0923044550773N00642740EA0000002239
+B0923064550764N00642732EA0000002237
+B0923084550754N00642723EA0000002233
+B0923114550742N00642713EA0000002231
+B0923134550729N00642704EA0000002231
+B0923154550718N00642695EA0000002230
+B0923174550707N00642683EA0000002231
+B0923194550698N00642675EA0000002233
+B0923214550690N00642668EA0000002233
+B0923234550682N00642661EA0000002231
+B0923254550673N00642650EA0000002229
+B0923274550663N00642639EA0000002230
+B0923294550653N00642631EA0000002232
+B0923314550645N00642623EA0000002233
+B0923334550638N00642613EA0000002233
+B0923354550631N00642603EA0000002234
+B0923374550623N00642594EA0000002234
+B0923394550616N00642584EA0000002234
+B0923414550609N00642575EA0000002232
+B0923434550601N00642565EA0000002229
+B0923454550593N00642552EA0000002225
+B0923474550587N00642537EA0000002221
+B0923494550580N00642522EA0000002219
+B0923514550575N00642508EA0000002217
+B0923534550570N00642493EA0000002216
+B0923554550564N00642478EA0000002217
+B0923574550558N00642464EA0000002217
+B0923594550553N00642451EA0000002217
+B0924014550549N00642437EA0000002215
+B0924034550543N00642420EA0000002213
+B0924054550537N00642403EA0000002212
+B0924074550531N00642388EA0000002214
+B0924094550526N00642374EA0000002218
+B0924114550520N00642360EA0000002221
+B0924134550514N00642346EA0000002224
+B0924154550508N00642333EA0000002227
+B0924174550505N00642320EA0000002232
+B0924194550507N00642311EA0000002235
+B0924214550516N00642311EA0000002238
+B0924234550520N00642324EA0000002240
+B0924254550512N00642340EA0000002241
+B0924274550496N00642341EA0000002242
+B0924294550483N00642327EA0000002244
+B0924314550475N00642313EA0000002248
+B0924334550463N00642296EA0000002251
+B0924354550456N00642282EA0000002251
+B0924374550447N00642268EA0000002251
+B0924394550434N00642257EA0000002251
+B0924414550422N00642246EA0000002250
+B0924434550410N00642231EA0000002251
+B0924454550398N00642219EA0000002252
+B0924474550388N00642209EA0000002256
+B0924504550379N00642200EA0000002259
+B0924524550370N00642188EA0000002262
+B0924544550362N00642178EA0000002266
+B0924564550354N00642169EA0000002271
+B0924584550346N00642158EA0000002276
+B0925004550342N00642145EA0000002280
+B0925024550343N00642132EA0000002284
+B0925044550352N00642127EA0000002287
+B0925064550360N00642133EA0000002291
+B0925084550362N00642145EA0000002295
+B0925104550356N00642157EA0000002299
+B0925124550344N00642161EA0000002304
+B0925144550333N00642156EA0000002310
+B0925164550326N00642146EA0000002315
+B0925184550322N00642133EA0000002319
+B0925204550324N00642119EA0000002322
+B0925224550332N00642114EA0000002325
+B0925244550340N00642120EA0000002328
+B0925264550342N00642135EA0000002331
+B0925284550337N00642147EA0000002334
+B0925304550325N00642153EA0000002337
+B0925324550313N00642148EA0000002341
+B0925344550305N00642138EA0000002346
+B0925364550299N00642128EA0000002350
+B0925384550295N00642115EA0000002353
+B0925404550296N00642101EA0000002356
+B0925424550302N00642091EA0000002358
+B0925444550310N00642091EA0000002361
+B0925464550315N00642101EA0000002364
+B0925484550314N00642115EA0000002366
+B0925504550306N00642126EA0000002369
+B0925524550293N00642128EA0000002372
+B0925544550283N00642119EA0000002375
+B0925564550277N00642107EA0000002379
+B0925584550272N00642097EA0000002383
+B0926004550268N00642087EA0000002385
+B0926024550266N00642073EA0000002387
+B0926044550270N00642061EA0000002389
+B0926064550279N00642059EA0000002391
+B0926084550285N00642075EA0000002393
+B0926104550280N00642087EA0000002394
+B0926124550268N00642089EA0000002396
+B0926144550259N00642078EA0000002399
+B0926164550252N00642068EA0000002402
+B0926184550243N00642058EA0000002405
+B0926204550237N00642047EA0000002408
+B0926224550231N00642036EA0000002410
+B0926244550225N00642025EA0000002412
+B0926264550217N00642013EA0000002414
+B0926294550209N00642001EA0000002416
+B0926314550203N00641990EA0000002419
+B0926334550195N00641982EA0000002422
+B0926354550186N00641973EA0000002422
+B0926374550179N00641963EA0000002421
+B0926394550177N00641953EA0000002420
+B0926414550180N00641944EA0000002418
+B0926434550189N00641945EA0000002416
+B0926454550196N00641957EA0000002415
+B0926474550197N00641975EA0000002414
+B0926494550191N00641992EA0000002414
+B0926514550179N00642006EA0000002413
+B0926534550166N00642007EA0000002412
+B0926554550157N00641997EA0000002410
+B0926574550149N00641986EA0000002410
+B0926594550141N00641974EA0000002410
+B0927014550135N00641961EA0000002410
+B0927034550127N00641948EA0000002411
+B0927054550120N00641935EA0000002412
+B0927074550114N00641921EA0000002414
+B0927094550110N00641907EA0000002415
+B0927114550106N00641893EA0000002417
+B0927134550103N00641880EA0000002419
+B0927154550099N00641865EA0000002422
+B0927174550099N00641850EA0000002425
+B0927194550097N00641834EA0000002429
+B0927214550096N00641818EA0000002433
+B0927234550096N00641804EA0000002439
+B0927254550097N00641794EA0000002446
+B0927274550102N00641787EA0000002452
+B0927294550110N00641797EA0000002458
+B0927314550114N00641814EA0000002464
+B0927334550108N00641827EA0000002472
+B0927354550096N00641829EA0000002479
+B0927374550083N00641821EA0000002485
+B0927394550075N00641807EA0000002492
+B0927414550070N00641793EA0000002501
+B0927434550066N00641774EA0000002511
+B0927454550068N00641762EA0000002517
+B0927474550073N00641758EA0000002522
+B0927494550079N00641764EA0000002527
+B0927514550082N00641777EA0000002531
+B0927534550077N00641792EA0000002535
+B0927554550064N00641801EA0000002539
+B0927574550054N00641799EA0000002546
+B0928004550043N00641797EA0000002551
+B0928024550031N00641792EA0000002555
+B0928044550023N00641777EA0000002558
+B0928064550022N00641757EA0000002561
+B0928084550029N00641744EA0000002564
+B0928104550038N00641746EA0000002569
+B0928124550041N00641759EA0000002574
+B0928144550037N00641772EA0000002579
+B0928164550027N00641784EA0000002584
+B0928184550014N00641788EA0000002589
+B0928204550002N00641781EA0000002593
+B0928224549993N00641767EA0000002597
+B0928244549990N00641748EA0000002601
+B0928264549994N00641733EA0000002606
+B0928284550002N00641727EA0000002610
+B0928304550009N00641732EA0000002613
+B0928324550012N00641747EA0000002617
+B0928344550006N00641760EA0000002621
+B0928364549995N00641768EA0000002627
+B0928384549983N00641769EA0000002631
+B0928404549971N00641763EA0000002634
+B0928424549961N00641753EA0000002637
+B0928444549955N00641735EA0000002640
+B0928464549955N00641718EA0000002643
+B0928484549959N00641708EA0000002647
+B0928504549965N00641704EA0000002650
+B0928524549972N00641706EA0000002653
+B0928544549975N00641717EA0000002655
+B0928564549971N00641731EA0000002657
+B0928584549960N00641738EA0000002659
+B0929004549947N00641738EA0000002662
+B0929024549934N00641735EA0000002664
+B0929044549922N00641731EA0000002666
+B0929064549908N00641727EA0000002668
+B0929084549895N00641724EA0000002671
+B0929104549883N00641719EA0000002673
+B0929124549872N00641716EA0000002676
+B0929144549860N00641714EA0000002677
+B0929164549848N00641712EA0000002676
+B0929184549831N00641707EA0000002675
+B0929204549819N00641702EA0000002674
+B0929224549805N00641696EA0000002673
+B0929244549793N00641691EA0000002672
+B0929264549780N00641687EA0000002671
+B0929284549767N00641684EA0000002669
+B0929304549753N00641681EA0000002666
+B0929324549740N00641674EA0000002663
+B0929344549728N00641666EA0000002661
+B0929374549716N00641662EA0000002660
+B0929394549702N00641658EA0000002657
+B0929414549687N00641652EA0000002654
+B0929434549674N00641647EA0000002652
+B0929454549661N00641644EA0000002650
+B0929474549648N00641639EA0000002647
+B0929494549636N00641635EA0000002645
+B0929514549623N00641631EA0000002641
+B0929534549610N00641628EA0000002639
+B0929554549598N00641624EA0000002637
+B0929574549587N00641618EA0000002635
+B0929594549576N00641614EA0000002633
+B0930014549564N00641610EA0000002632
+B0930034549551N00641604EA0000002632
+B0930054549540N00641600EA0000002633
+B0930074549528N00641596EA0000002632
+B0930094549514N00641588EA0000002630
+B0930114549500N00641579EA0000002631
+B0930134549486N00641573EA0000002630
+B0930154549471N00641565EA0000002628
+B0930174549454N00641556EA0000002627
+B0930194549438N00641547EA0000002628
+B0930214549422N00641537EA0000002629
+B0930234549407N00641525EA0000002630
+B0930254549394N00641513EA0000002633
+B0930274549385N00641505EA0000002638
+B0930294549376N00641498EA0000002642
+B0930314549365N00641493EA0000002646
+B0930334549353N00641486EA0000002651
+B0930354549342N00641477EA0000002656
+B0930374549330N00641467EA0000002659
+B0930394549319N00641458EA0000002662
+B0930414549307N00641448EA0000002664
+B0930434549295N00641435EA0000002667
+B0930454549283N00641424EA0000002671
+B0930474549271N00641415EA0000002676
+B0930494549258N00641407EA0000002680
+B0930514549244N00641400EA0000002683
+B0930534549231N00641387EA0000002685
+B0930554549221N00641375EA0000002687
+B0930574549210N00641365EA0000002687
+B0930594549192N00641345EA0000002690
+B0931014549180N00641335EA0000002693
+B0931034549170N00641327EA0000002697
+B0931054549159N00641319EA0000002699
+B0931074549149N00641311EA0000002700
+B0931094549137N00641301EA0000002700
+B0931114549125N00641290EA0000002697
+B0931134549113N00641275EA0000002697
+B0931154549104N00641261EA0000002697
+B0931184549094N00641249EA0000002696
+B0931204549083N00641238EA0000002696
+B0931224549074N00641227EA0000002697
+B0931244549066N00641218EA0000002700
+B0931264549056N00641208EA0000002701
+B0931284549046N00641196EA0000002705
+B0931304549037N00641183EA0000002710
+B0931324549030N00641171EA0000002716
+B0931344549019N00641163EA0000002720
+B0931364549007N00641159EA0000002725
+B0931384548996N00641156EA0000002728
+B0931404548984N00641151EA0000002731
+B0931424548972N00641141EA0000002733
+B0931444548961N00641131EA0000002734
+B0931464548949N00641122EA0000002734
+B0931484548936N00641112EA0000002734
+B0931504548925N00641102EA0000002735
+B0931524548913N00641093EA0000002735
+B0931544548900N00641082EA0000002734
+B0931564548886N00641069EA0000002735
+B0931584548872N00641056EA0000002737
+B0932004548862N00641047EA0000002741
+B0932024548853N00641042EA0000002742
+B0932044548843N00641035EA0000002742
+B0932064548828N00641021EA0000002743
+B0932084548816N00641008EA0000002745
+B0932104548809N00641003EA0000002749
+B0932124548800N00640997EA0000002751
+B0932144548786N00640988EA0000002754
+B0932164548775N00640977EA0000002759
+B0932184548766N00640967EA0000002761
+B0932204548755N00640958EA0000002762
+B0932224548744N00640947EA0000002764
+B0932244548735N00640936EA0000002765
+B0932264548725N00640925EA0000002764
+B0932284548712N00640912EA0000002762
+B0932304548700N00640896EA0000002763
+B0932324548690N00640883EA0000002763
+B0932344548680N00640870EA0000002762
+B0932364548665N00640848EA0000002761
+B0932384548655N00640833EA0000002760
+B0932404548646N00640820EA0000002760
+B0932424548637N00640807EA0000002758
+B0932444548629N00640793EA0000002756
+B0932464548620N00640778EA0000002753
+B0932484548610N00640764EA0000002751
+B0932504548601N00640749EA0000002748
+B0932524548592N00640733EA0000002746
+B0932544548584N00640719EA0000002745
+B0932574548575N00640707EA0000002743
+B0932594548565N00640692EA0000002742
+B0933014548556N00640676EA0000002741
+B0933034548547N00640661EA0000002740
+B0933054548536N00640647EA0000002738
+B0933074548525N00640631EA0000002737
+B0933094548514N00640617EA0000002738
+B0933114548503N00640605EA0000002740
+B0933134548493N00640592EA0000002741
+B0933154548482N00640579EA0000002740
+B0933174548471N00640564EA0000002740
+B0933194548462N00640549EA0000002740
+B0933214548454N00640534EA0000002738
+B0933234548445N00640518EA0000002737
+B0933254548437N00640501EA0000002736
+B0933274548428N00640487EA0000002735
+B0933294548418N00640473EA0000002733
+B0933314548409N00640458EA0000002733
+B0933334548402N00640447EA0000002734
+B0933354548394N00640438EA0000002732
+B0933374548385N00640426EA0000002729
+B0933394548376N00640410EA0000002728
+B0933414548367N00640398EA0000002727
+B0933434548359N00640386EA0000002726
+B0933454548351N00640373EA0000002725
+B0933474548344N00640361EA0000002723
+B0933494548335N00640348EA0000002722
+B0933514548326N00640335EA0000002722
+B0933534548317N00640324EA0000002724
+B0933554548311N00640318EA0000002727
+B0933574548302N00640314EA0000002730
+B0933594548293N00640307EA0000002734
+B0934014548285N00640301EA0000002738
+B0934034548277N00640295EA0000002740
+B0934054548269N00640289EA0000002742
+B0934074548260N00640283EA0000002745
+B0934094548252N00640279EA0000002747
+B0934114548243N00640274EA0000002747
+B0934134548235N00640267EA0000002748
+B0934154548226N00640260EA0000002749
+B0934174548213N00640248EA0000002751
+B0934194548203N00640242EA0000002754
+B0934214548196N00640240EA0000002756
+B0934234548188N00640237EA0000002757
+B0934254548179N00640233EA0000002757
+B0934274548168N00640227EA0000002753
+B0934294548158N00640218EA0000002750
+B0934314548150N00640205EA0000002745
+B0934334548140N00640191EA0000002740
+B0934354548130N00640174EA0000002733
+B0934384548119N00640154EA0000002728
+B0934404548111N00640136EA0000002724
+B0934424548103N00640124EA0000002721
+B0934444548094N00640114EA0000002715
+B0934464548083N00640101EA0000002711
+B0934484548074N00640087EA0000002709
+B0934504548067N00640072EA0000002705
+B0934524548059N00640055EA0000002701
+B0934544548051N00640036EA0000002699
+B0934564548044N00640022EA0000002698
+B0934584548034N00640011EA0000002694
+B0935004548023N00639998EA0000002690
+B0935024548017N00639989EA0000002685
+B0935044547999N00639962EA0000002683
+B0935064547995N00639954EA0000002684
+B0935084547984N00639943EA0000002682
+B0935104547974N00639932EA0000002680
+B0935124547966N00639919EA0000002681
+B0935144547960N00639905EA0000002682
+B0935164547956N00639890EA0000002681
+B0935184547953N00639870EA0000002679
+B0935204547948N00639848EA0000002677
+B0935224547945N00639827EA0000002677
+B0935244547942N00639808EA0000002676
+B0935264547939N00639787EA0000002672
+B0935284547936N00639765EA0000002669
+B0935304547934N00639743EA0000002667
+B0935324547933N00639723EA0000002664
+B0935344547932N00639701EA0000002660
+B0935364547933N00639678EA0000002656
+B0935384547933N00639656EA0000002654
+B0935404547934N00639635EA0000002650
+B0935424547935N00639613EA0000002647
+B0935444547937N00639590EA0000002645
+B0935464547936N00639570EA0000002643
+B0935484547936N00639551EA0000002642
+B0935504547936N00639533EA0000002641
+B0935524547932N00639519EA0000002640
+B0935544547926N00639502EA0000002639
+B0935564547923N00639483EA0000002637
+B0935584547916N00639449EA0000002633
+B0936004547914N00639424EA0000002633
+B0936024547913N00639398EA0000002634
+B0936044547912N00639377EA0000002638
+B0936064547908N00639365EA0000002643
+B0936084547899N00639352EA0000002646
+B0936104547891N00639333EA0000002649
+B0936124547883N00639314EA0000002651
+B0936144547873N00639295EA0000002651
+B0936164547864N00639275EA0000002652
+B0936194547856N00639253EA0000002652
+B0936214547849N00639232EA0000002652
+B0936234547842N00639211EA0000002652
+B0936254547837N00639188EA0000002650
+B0936274547832N00639165EA0000002650
+B0936294547827N00639143EA0000002650
+B0936314547822N00639121EA0000002648
+B0936334547818N00639097EA0000002646
+B0936354547816N00639073EA0000002645
+B0936374547816N00639051EA0000002645
+B0936394547816N00639041EA0000002642
+B0936414547814N00639010EA0000002639
+B0936434547814N00638988EA0000002636
+B0936454547811N00638971EA0000002635
+B0936474547805N00638960EA0000002633
+B0936494547801N00638944EA0000002628
+B0936514547799N00638921EA0000002622
+B0936534547798N00638896EA0000002618
+B0936554547796N00638876EA0000002615
+B0936574547793N00638857EA0000002611
+B0936594547790N00638839EA0000002609
+B0937014547789N00638822EA0000002605
+B0937034547788N00638803EA0000002600
+B0937054547789N00638781EA0000002597
+B0937074547793N00638763EA0000002595
+B0937094547795N00638748EA0000002590
+B0937114547797N00638731EA0000002585
+B0937134547801N00638711EA0000002580
+B0937154547804N00638691EA0000002577
+B0937174547805N00638672EA0000002574
+B0937194547805N00638654EA0000002570
+B0937214547806N00638636EA0000002568
+B0937234547806N00638618EA0000002567
+B0937254547804N00638602EA0000002566
+B0937274547801N00638584EA0000002563
+B0937294547799N00638564EA0000002562
+B0937314547798N00638543EA0000002560
+B0937334547796N00638524EA0000002558
+B0937354547794N00638506EA0000002556
+B0937374547794N00638488EA0000002555
+B0937394547791N00638462EA0000002555
+B0937414547791N00638449EA0000002556
+B0937434547790N00638432EA0000002556
+B0937454547789N00638412EA0000002558
+B0937474547792N00638394EA0000002561
+B0937494547793N00638378EA0000002563
+B0937514547791N00638360EA0000002563
+B0937534547790N00638341EA0000002565
+B0937554547790N00638323EA0000002567
+B0937584547789N00638306EA0000002568
+B0938004547789N00638287EA0000002568
+B0938024547788N00638266EA0000002569
+B0938044547785N00638250EA0000002572
+B0938064547781N00638235EA0000002573
+B0938084547776N00638220EA0000002575
+B0938104547771N00638205EA0000002578
+B0938124547766N00638190EA0000002579
+B0938144547761N00638174EA0000002579
+B0938164547757N00638166EA0000002580
+B0938184547748N00638141EA0000002581
+B0938204547745N00638126EA0000002582
+B0938224547741N00638110EA0000002581
+B0938244547734N00638095EA0000002580
+B0938264547729N00638080EA0000002578
+B0938284547724N00638065EA0000002576
+B0938304547720N00638048EA0000002573
+B0938324547717N00638031EA0000002572
+B0938344547712N00638014EA0000002572
+B0938364547708N00637997EA0000002574
+B0938384547703N00637981EA0000002576
+B0938404547697N00637965EA0000002577
+B0938424547689N00637950EA0000002578
+B0938444547682N00637937EA0000002578
+B0938464547675N00637923EA0000002576
+B0938484547667N00637904EA0000002574
+B0938504547660N00637884EA0000002574
+B0938524547655N00637864EA0000002576
+B0938544547650N00637846EA0000002577
+B0938564547645N00637828EA0000002578
+B0938584547639N00637810EA0000002577
+B0939004547632N00637790EA0000002577
+B0939024547626N00637777EA0000002580
+B0939044547623N00637772EA0000002583
+B0939064547619N00637764EA0000002584
+B0939084547614N00637750EA0000002587
+B0939104547610N00637738EA0000002592
+B0939124547608N00637730EA0000002598
+B0939144547607N00637720EA0000002603
+B0939164547607N00637706EA0000002607
+B0939184547605N00637692EA0000002611
+B0939204547602N00637671EA0000002616
+B0939224547599N00637657EA0000002618
+B0939244547596N00637641EA0000002619
+B0939264547593N00637625EA0000002618
+B0939284547590N00637608EA0000002616
+B0939304547586N00637591EA0000002613
+B0939324547582N00637572EA0000002611
+B0939344547580N00637554EA0000002609
+B0939364547576N00637540EA0000002607
+B0939394547570N00637526EA0000002603
+B0939414547564N00637509EA0000002599
+B0939434547561N00637491EA0000002598
+B0939454547556N00637476EA0000002596
+B0939474547550N00637461EA0000002592
+B0939494547544N00637445EA0000002588
+B0939514547539N00637428EA0000002584
+B0939534547534N00637412EA0000002582
+B0939554547528N00637396EA0000002578
+B0939574547523N00637381EA0000002573
+B0939594547519N00637362EA0000002568
+B0940014547516N00637343EA0000002565
+B0940034547512N00637327EA0000002562
+B0940054547508N00637310EA0000002558
+B0940074547505N00637294EA0000002555
+B0940094547502N00637281EA0000002552
+B0940114547496N00637266EA0000002547
+B0940134547491N00637250EA0000002545
+B0940154547484N00637234EA0000002542
+B0940174547475N00637219EA0000002539
+B0940194547467N00637203EA0000002537
+B0940214547460N00637188EA0000002536
+B0940234547454N00637174EA0000002533
+B0940254547445N00637160EA0000002529
+B0940274547436N00637145EA0000002526
+B0940294547426N00637131EA0000002525
+B0940314547417N00637118EA0000002522
+B0940334547407N00637104EA0000002518
+B0940354547397N00637088EA0000002516
+B0940374547386N00637074EA0000002514
+B0940394547377N00637061EA0000002512
+B0940414547369N00637047EA0000002509
+B0940434547359N00637034EA0000002504
+B0940454547348N00637022EA0000002500
+B0940474547337N00637011EA0000002495
+B0940494547326N00637000EA0000002491
+B0940514547314N00636990EA0000002488
+B0940534547304N00636980EA0000002486
+B0940554547294N00636971EA0000002485
+B0940574547283N00636962EA0000002485
+B0940594547275N00636953EA0000002487
+B0941014547260N00636941EA0000002486
+B0941034547250N00636932EA0000002486
+B0941054547242N00636923EA0000002485
+B0941074547235N00636913EA0000002483
+B0941094547225N00636900EA0000002482
+B0941114547215N00636889EA0000002483
+B0941134547206N00636879EA0000002482
+B0941154547197N00636868EA0000002483
+B0941174547186N00636859EA0000002485
+B0941204547178N00636849EA0000002485
+B0941224547170N00636836EA0000002486
+B0941244547162N00636824EA0000002488
+B0941264547155N00636812EA0000002489
+B0941284547147N00636799EA0000002490
+B0941304547140N00636785EA0000002490
+B0941324547133N00636770EA0000002491
+B0941344547126N00636755EA0000002491
+B0941364547117N00636743EA0000002491
+B0941384547107N00636731EA0000002491
+B0941404547099N00636719EA0000002489
+B0941424547090N00636707EA0000002486
+B0941444547080N00636692EA0000002482
+B0941464547070N00636673EA0000002479
+B0941484547062N00636657EA0000002477
+B0941504547058N00636649EA0000002473
+B0941524547045N00636623EA0000002467
+B0941544547036N00636605EA0000002464
+B0941564547026N00636590EA0000002460
+B0941584547016N00636574EA0000002456
+B0942004547008N00636555EA0000002452
+B0942024547000N00636536EA0000002450
+B0942044546992N00636518EA0000002446
+B0942064546985N00636499EA0000002442
+B0942084546977N00636479EA0000002439
+B0942104546968N00636461EA0000002437
+B0942124546959N00636444EA0000002436
+B0942144546949N00636427EA0000002434
+B0942164546939N00636410EA0000002433
+B0942184546928N00636393EA0000002433
+B0942204546918N00636377EA0000002433
+B0942224546907N00636361EA0000002432
+B0942244546897N00636346EA0000002433
+B0942264546887N00636333EA0000002436
+B0942284546879N00636321EA0000002440
+B0942304546873N00636311EA0000002446
+B0942324546865N00636305EA0000002450
+B0942344546858N00636295EA0000002455
+B0942364546853N00636281EA0000002461
+B0942384546846N00636271EA0000002469
+B0942404546838N00636264EA0000002475
+B0942424546826N00636252EA0000002483
+B0942444546816N00636242EA0000002487
+B0942464546808N00636232EA0000002490
+B0942484546799N00636219EA0000002492
+B0942504546791N00636203EA0000002496
+B0942524546784N00636188EA0000002501
+B0942544546778N00636176EA0000002507
+B0942564546772N00636164EA0000002510
+B0942584546766N00636150EA0000002513
+B0943014546759N00636136EA0000002517
+B0943034546751N00636125EA0000002519
+B0943054546743N00636111EA0000002520
+B0943074546734N00636096EA0000002523
+B0943094546726N00636088EA0000002526
+B0943114546719N00636083EA0000002528
+B0943134546713N00636075EA0000002527
+B0943154546704N00636062EA0000002526
+B0943174546696N00636049EA0000002526
+B0943194546689N00636037EA0000002525
+B0943214546683N00636024EA0000002523
+B0943234546676N00636009EA0000002520
+B0943254546668N00635993EA0000002517
+B0943274546660N00635978EA0000002515
+B0943294546654N00635965EA0000002513
+B0943314546648N00635950EA0000002509
+B0943334546642N00635935EA0000002507
+B0943354546636N00635921EA0000002506
+B0943374546631N00635906EA0000002502
+B0943394546624N00635889EA0000002497
+B0943414546618N00635873EA0000002495
+B0943434546615N00635860EA0000002494
+B0943454546610N00635848EA0000002492
+B0943474546605N00635834EA0000002490
+B0943494546599N00635820EA0000002490
+B0943514546594N00635808EA0000002487
+B0943534546587N00635792EA0000002484
+B0943554546578N00635774EA0000002483
+B0943574546570N00635757EA0000002483
+B0943594546564N00635738EA0000002482
+B0944014546556N00635718EA0000002483
+B0944034546548N00635700EA0000002485
+B0944054546542N00635687EA0000002490
+B0944074546536N00635678EA0000002494
+B0944094546530N00635667EA0000002496
+B0944114546523N00635654EA0000002498
+B0944134546517N00635641EA0000002500
+B0944154546511N00635629EA0000002502
+B0944174546503N00635615EA0000002503
+B0944194546498N00635599EA0000002506
+B0944214546492N00635588EA0000002509
+B0944234546483N00635569EA0000002509
+B0944254546477N00635554EA0000002510
+B0944274546470N00635541EA0000002510
+B0944294546464N00635527EA0000002509
+B0944314546459N00635509EA0000002508
+B0944334546453N00635491EA0000002508
+B0944354546448N00635472EA0000002509
+B0944374546444N00635455EA0000002511
+B0944404546440N00635441EA0000002511
+B0944424546435N00635427EA0000002510
+B0944444546430N00635411EA0000002508
+B0944464546422N00635392EA0000002506
+B0944484546413N00635373EA0000002507
+B0944504546406N00635357EA0000002505
+B0944524546398N00635339EA0000002503
+B0944544546391N00635320EA0000002500
+B0944564546384N00635303EA0000002499
+B0944584546378N00635287EA0000002496
+B0945004546371N00635269EA0000002492
+B0945024546363N00635251EA0000002490
+B0945044546354N00635235EA0000002490
+B0945064546347N00635222EA0000002491
+B0945084546340N00635208EA0000002491
+B0945104546332N00635192EA0000002493
+B0945124546324N00635177EA0000002495
+B0945144546317N00635164EA0000002496
+B0945164546309N00635149EA0000002495
+B0945184546301N00635134EA0000002495
+B0945204546294N00635121EA0000002494
+B0945224546287N00635108EA0000002493
+B0945244546282N00635094EA0000002490
+B0945264546275N00635080EA0000002488
+B0945284546268N00635065EA0000002485
+B0945304546259N00635048EA0000002482
+B0945324546251N00635031EA0000002480
+B0945344546244N00635015EA0000002478
+B0945364546236N00634999EA0000002475
+B0945384546227N00634982EA0000002472
+B0945404546219N00634965EA0000002468
+B0945424546210N00634949EA0000002464
+B0945444546200N00634933EA0000002461
+B0945464546191N00634917EA0000002459
+B0945484546182N00634903EA0000002456
+B0945504546173N00634888EA0000002453
+B0945524546165N00634872EA0000002450
+B0945544546156N00634856EA0000002447
+B0945564546148N00634839EA0000002445
+B0945584546141N00634823EA0000002442
+B0946004546129N00634799EA0000002439
+B0946024546121N00634783EA0000002437
+B0946044546112N00634768EA0000002434
+B0946064546103N00634754EA0000002433
+B0946084546093N00634739EA0000002431
+B0946104546083N00634726EA0000002430
+B0946124546073N00634713EA0000002428
+B0946144546064N00634701EA0000002428
+B0946164546055N00634690EA0000002426
+B0946194546045N00634678EA0000002423
+B0946214546034N00634662EA0000002421
+B0946234546025N00634647EA0000002421
+B0946254546015N00634633EA0000002419
+B0946274546005N00634617EA0000002418
+B0946294545995N00634601EA0000002418
+B0946314545985N00634585EA0000002420
+B0946334545976N00634572EA0000002424
+B0946354545969N00634561EA0000002432
+B0946374545963N00634551EA0000002438
+B0946394545957N00634538EA0000002445
+B0946414545955N00634521EA0000002450
+B0946434545960N00634505EA0000002456
+B0946454545970N00634499EA0000002461
+B0946474545980N00634510EA0000002466
+B0946494545983N00634525EA0000002471
+B0946514545974N00634533EA0000002477
+B0946534545961N00634523EA0000002485
+B0946554545954N00634510EA0000002492
+B0946574545949N00634496EA0000002498
+B0946594545946N00634480EA0000002503
+B0947014545941N00634464EA0000002508
+B0947034545937N00634451EA0000002515
+B0947054545933N00634440EA0000002519
+B0947074545927N00634428EA0000002522
+B0947094545920N00634415EA0000002523
+B0947114545914N00634403EA0000002523
+B0947134545909N00634391EA0000002523
+B0947154545903N00634375EA0000002520
+B0947174545897N00634357EA0000002514
+B0947194545889N00634338EA0000002506
+B0947214545882N00634316EA0000002501
+B0947234545874N00634296EA0000002498
+B0947254545867N00634276EA0000002495
+B0947274545860N00634256EA0000002491
+B0947294545853N00634237EA0000002489
+B0947314545845N00634219EA0000002487
+B0947334545840N00634200EA0000002484
+B0947354545835N00634180EA0000002482
+B0947374545830N00634161EA0000002480
+B0947394545825N00634142EA0000002479
+B0947414545818N00634112EA0000002477
+B0947434545812N00634089EA0000002478
+B0947454545808N00634078EA0000002482
+B0947474545804N00634073EA0000002489
+B0947494545797N00634065EA0000002496
+B0947514545790N00634052EA0000002503
+B0947534545787N00634042EA0000002511
+B0947554545784N00634033EA0000002517
+B0947574545778N00634022EA0000002522
+B0948004545769N00634013EA0000002530
+B0948024545764N00634008EA0000002538
+B0948044545759N00634000EA0000002543
+B0948064545753N00633988EA0000002549
+B0948084545748N00633975EA0000002557
+B0948104545746N00633962EA0000002562
+B0948124545744N00633949EA0000002566
+B0948144545741N00633936EA0000002568
+B0948164545738N00633923EA0000002568
+B0948184545736N00633909EA0000002567
+B0948204545734N00633894EA0000002563
+B0948224545731N00633877EA0000002560
+B0948244545728N00633859EA0000002557
+B0948264545725N00633840EA0000002552
+B0948284545721N00633819EA0000002550
+B0948304545719N00633809EA0000002548
+B0948324545714N00633782EA0000002545
+B0948344545711N00633762EA0000002543
+B0948364545708N00633742EA0000002542
+B0948384545706N00633722EA0000002540
+B0948404545703N00633701EA0000002538
+B0948424545700N00633679EA0000002537
+B0948444545697N00633658EA0000002537
+B0948464545695N00633636EA0000002535
+B0948484545692N00633614EA0000002533
+B0948504545688N00633592EA0000002532
+B0948524545682N00633570EA0000002532
+B0948544545677N00633552EA0000002533
+B0948564545671N00633544EA0000002538
+B0948584545664N00633535EA0000002539
+B0949004545655N00633523EA0000002541
+B0949024545648N00633509EA0000002545
+B0949044545641N00633498EA0000002550
+B0949064545634N00633489EA0000002554
+B0949084545626N00633482EA0000002558
+B0949104545620N00633476EA0000002561
+B0949124545613N00633470EA0000002562
+B0949144545604N00633461EA0000002561
+B0949164545596N00633448EA0000002560
+B0949184545589N00633437EA0000002562
+B0949204545582N00633429EA0000002562
+B0949224545571N00633413EA0000002559
+B0949244545562N00633399EA0000002558
+B0949264545554N00633383EA0000002556
+B0949284545549N00633363EA0000002555
+B0949304545546N00633344EA0000002556
+B0949324545543N00633323EA0000002559
+B0949344545542N00633305EA0000002564
+B0949364545538N00633295EA0000002570
+B0949384545530N00633283EA0000002574
+B0949414545522N00633268EA0000002579
+B0949434545515N00633254EA0000002585
+B0949454545509N00633242EA0000002590
+B0949474545501N00633230EA0000002593
+B0949494545493N00633217EA0000002596
+B0949514545485N00633200EA0000002596
+B0949534545479N00633184EA0000002598
+B0949554545472N00633170EA0000002598
+B0949574545464N00633157EA0000002597
+B0949594545456N00633142EA0000002595
+B0950014545447N00633125EA0000002594
+B0950034545440N00633110EA0000002594
+B0950054545433N00633095EA0000002591
+B0950074545429N00633088EA0000002587
+B0950094545416N00633063EA0000002583
+B0950114545413N00633054EA0000002580
+B0950134545403N00633029EA0000002576
+B0950154545397N00633011EA0000002571
+B0950174545390N00632993EA0000002567
+B0950194545384N00632974EA0000002564
+B0950214545380N00632956EA0000002563
+B0950234545376N00632941EA0000002561
+B0950254545371N00632925EA0000002558
+B0950274545366N00632906EA0000002556
+B0950294545362N00632890EA0000002553
+B0950314545359N00632873EA0000002549
+B0950334545355N00632854EA0000002544
+B0950354545351N00632835EA0000002541
+B0950374545347N00632818EA0000002536
+B0950394545342N00632801EA0000002531
+B0950414545337N00632783EA0000002525
+B0950434545330N00632766EA0000002520
+B0950454545324N00632749EA0000002515
+B0950474545319N00632731EA0000002511
+B0950494545314N00632714EA0000002507
+B0950514545309N00632696EA0000002501
+B0950534545304N00632677EA0000002497
+B0950554545299N00632660EA0000002493
+B0950574545294N00632643EA0000002488
+B0950594545290N00632625EA0000002484
+B0951014545285N00632608EA0000002481
+B0951034545278N00632583EA0000002474
+B0951054545272N00632566EA0000002469
+B0951074545267N00632547EA0000002465
+B0951094545263N00632529EA0000002461
+B0951114545259N00632511EA0000002457
+B0951134545255N00632493EA0000002453
+B0951154545250N00632475EA0000002449
+B0951174545245N00632457EA0000002445
+B0951194545239N00632440EA0000002442
+B0951224545233N00632424EA0000002439
+B0951244545228N00632406EA0000002435
+B0951264545222N00632384EA0000002429
+B0951284545217N00632362EA0000002425
+B0951304545212N00632341EA0000002422
+B0951324545207N00632323EA0000002416
+B0951344545201N00632302EA0000002411
+B0951364545195N00632281EA0000002407
+B0951384545191N00632262EA0000002405
+B0951404545188N00632250EA0000002405
+B0951424545186N00632237EA0000002402
+B0951444545184N00632230EA0000002401
+B0951464545178N00632208EA0000002402
+B0951484545173N00632195EA0000002400
+B0951504545167N00632179EA0000002397
+B0951524545167N00632179EA0000002396
+B0951544545156N00632149EA0000002394
+B0951564545151N00632133EA0000002391
+B0951584545145N00632117EA0000002390
+B0952004545140N00632102EA0000002390
+B0952024545137N00632086EA0000002389
+B0952044545133N00632070EA0000002387
+B0952064545126N00632054EA0000002387
+B0952084545120N00632038EA0000002387
+B0952104545115N00632021EA0000002387
+B0952124545112N00632003EA0000002388
+B0952144545107N00631985EA0000002389
+B0952164545102N00631969EA0000002389
+B0952184545099N00631951EA0000002390
+B0952204545095N00631935EA0000002393
+B0952224545088N00631921EA0000002396
+B0952244545081N00631910EA0000002397
+B0952264545073N00631897EA0000002398
+B0952284545066N00631882EA0000002401
+B0952304545060N00631868EA0000002403
+B0952324545054N00631855EA0000002404
+B0952344545047N00631839EA0000002405
+B0952364545039N00631823EA0000002408
+B0952384545030N00631807EA0000002410
+B0952404545022N00631789EA0000002412
+B0952424545015N00631769EA0000002415
+B0952444545007N00631740EA0000002420
+B0952464545000N00631723EA0000002422
+B0952484544993N00631704EA0000002425
+B0952504544988N00631684EA0000002428
+B0952524544985N00631665EA0000002432
+B0952544544980N00631645EA0000002435
+B0952564544975N00631626EA0000002440
+B0952584544972N00631609EA0000002447
+B0953014544969N00631594EA0000002452
+B0953034544965N00631578EA0000002457
+B0953054544962N00631561EA0000002464
+B0953074544961N00631548EA0000002470
+B0953094544958N00631538EA0000002475
+B0953114544953N00631530EA0000002478
+B0953134544946N00631524EA0000002480
+B0953154544939N00631518EA0000002481
+B0953174544933N00631510EA0000002483
+B0953194544927N00631503EA0000002485
+B0953214544924N00631500EA0000002486
+B0953234544916N00631486EA0000002486
+B0953254544912N00631475EA0000002486
+B0953274544908N00631464EA0000002485
+B0953294544904N00631451EA0000002483
+B0953314544899N00631438EA0000002480
+B0953334544896N00631421EA0000002478
+B0953354544894N00631405EA0000002478
+B0953374544890N00631392EA0000002476
+B0953394544886N00631376EA0000002474
+B0953414544882N00631360EA0000002472
+B0953434544878N00631345EA0000002470
+B0953454544876N00631332EA0000002468
+B0953474544872N00631317EA0000002463
+B0953494544868N00631302EA0000002460
+B0953514544864N00631287EA0000002456
+B0953534544860N00631271EA0000002452
+B0953554544856N00631255EA0000002448
+B0953574544853N00631240EA0000002443
+B0953594544850N00631225EA0000002439
+B0954014544847N00631210EA0000002435
+B0954034544845N00631196EA0000002432
+B0954054544842N00631181EA0000002430
+B0954074544841N00631166EA0000002429
+B0954094544840N00631151EA0000002426
+B0954114544838N00631134EA0000002424
+B0954134544837N00631117EA0000002423
+B0954154544837N00631102EA0000002425
+B0954174544835N00631088EA0000002425
+B0954194544834N00631073EA0000002424
+B0954214544834N00631058EA0000002423
+B0954234544834N00631038EA0000002418
+B0954254544833N00631022EA0000002414
+B0954274544832N00631006EA0000002413
+B0954294544832N00630992EA0000002412
+B0954314544831N00630980EA0000002413
+B0954334544830N00630968EA0000002414
+B0954354544828N00630956EA0000002416
+B0954374544825N00630943EA0000002417
+B0954394544822N00630929EA0000002418
+B0954424544819N00630914EA0000002419
+B0954444544818N00630898EA0000002419
+B0954464544818N00630884EA0000002419
+B0954484544817N00630870EA0000002417
+B0954504544815N00630854EA0000002413
+B0954524544812N00630837EA0000002409
+B0954544544809N00630819EA0000002406
+B0954564544807N00630803EA0000002402
+B0954584544806N00630795EA0000002398
+B0955004544803N00630768EA0000002395
+B0955024544801N00630751EA0000002392
+B0955044544800N00630737EA0000002388
+B0955064544798N00630719EA0000002383
+B0955084544798N00630699EA0000002380
+B0955104544797N00630681EA0000002380
+B0955124544796N00630666EA0000002382
+B0955144544794N00630644EA0000002385
+B0955174544791N00630630EA0000002388
+B0955194544789N00630616EA0000002391
+B0955214544787N00630604EA0000002393
+B0955234544784N00630593EA0000002393
+B0955254544781N00630579EA0000002392
+B0955274544777N00630563EA0000002388
+B0955294544772N00630548EA0000002385
+B0955314544771N00630540EA0000002382
+B0955334544772N00630516EA0000002378
+B0955354544772N00630498EA0000002375
+B0955374544772N00630481EA0000002371
+B0955394544773N00630462EA0000002367
+B0955414544772N00630443EA0000002365
+B0955434544771N00630424EA0000002362
+B0955454544771N00630405EA0000002360
+B0955474544772N00630385EA0000002359
+B0955494544773N00630370EA0000002361
+B0955514544774N00630359EA0000002363
+B0955534544774N00630346EA0000002361
+B0955554544776N00630333EA0000002362
+B0955574544781N00630323EA0000002362
+B0955594544789N00630315EA0000002363
+B0956014544795N00630306EA0000002363
+B0956034544802N00630296EA0000002364
+B0956054544808N00630285EA0000002365
+B0956074544815N00630276EA0000002365
+B0956094544825N00630266EA0000002367
+B0956114544835N00630257EA0000002370
+B0956134544844N00630248EA0000002375
+B0956154544850N00630240EA0000002380
+B0956174544858N00630230EA0000002385
+B0956194544872N00630229EA0000002390
+B0956214544884N00630239EA0000002397
+B0956234544891N00630254EA0000002403
+B0956254544889N00630275EA0000002414
+B0956274544879N00630278EA0000002422
+B0956294544872N00630273EA0000002431
+B0956314544870N00630265EA0000002438
+B0956334544870N00630252EA0000002443
+B0956354544876N00630240EA0000002448
+B0956374544887N00630233EA0000002454
+B0956394544898N00630237EA0000002460
+B0956424544908N00630250EA0000002465
+B0956444544910N00630266EA0000002469
+B0956464544904N00630273EA0000002475
+B0956484544897N00630270EA0000002481
+B0956504544892N00630264EA0000002488
+B0956524544889N00630257EA0000002494
+B0956544544884N00630247EA0000002498
+B0956564544884N00630234EA0000002503
+B0956584544892N00630225EA0000002507
+B0957004544905N00630221EA0000002512
+B0957024544916N00630226EA0000002517
+B0957044544922N00630239EA0000002521
+B0957064544919N00630253EA0000002526
+B0957084544913N00630250EA0000002530
+B0957104544908N00630241EA0000002536
+B0957124544907N00630231EA0000002542
+B0957144544910N00630218EA0000002547
+B0957164544919N00630208EA0000002552
+B0957184544930N00630209EA0000002556
+B0957204544937N00630221EA0000002560
+B0957224544939N00630236EA0000002563
+B0957244544935N00630248EA0000002566
+B0957264544927N00630252EA0000002570
+B0957284544921N00630252EA0000002574
+B0957304544915N00630248EA0000002578
+B0957324544911N00630238EA0000002580
+B0957344544911N00630223EA0000002582
+B0957364544917N00630211EA0000002584
+B0957384544929N00630204EA0000002584
+B0957404544941N00630207EA0000002585
+B0957424544949N00630219EA0000002585
+B0957444544949N00630236EA0000002581
+B0957464544944N00630246EA0000002583
+B0957484544934N00630243EA0000002585
+B0957504544927N00630236EA0000002587
+B0957524544919N00630233EA0000002588
+B0957544544911N00630230EA0000002589
+B0957564544903N00630225EA0000002592
+B0957584544896N00630224EA0000002596
+B0958004544882N00630221EA0000002603
+B0958024544873N00630218EA0000002609
+B0958044544865N00630216EA0000002616
+B0958064544858N00630216EA0000002622
+B0958084544849N00630214EA0000002627
+B0958104544840N00630209EA0000002631
+B0958124544833N00630200EA0000002633
+B0958144544826N00630188EA0000002633
+B0958164544818N00630175EA0000002631
+B0958194544813N00630165EA0000002630
+B0958214544809N00630153EA0000002627
+B0958234544804N00630142EA0000002625
+B0958254544799N00630133EA0000002626
+B0958274544794N00630123EA0000002627
+B0958294544789N00630113EA0000002629
+B0958314544784N00630107EA0000002629
+B0958334544779N00630101EA0000002628
+B0958354544774N00630092EA0000002625
+B0958374544768N00630080EA0000002621
+B0958394544762N00630067EA0000002617
+B0958414544756N00630054EA0000002615
+B0958434544751N00630041EA0000002612
+B0958454544748N00630034EA0000002606
+B0958474544742N00630010EA0000002600
+B0958494544742N00630010EA0000002596
+B0958514544734N00629981EA0000002593
+B0958534544730N00629966EA0000002587
+B0958554544724N00629950EA0000002582
+B0958574544718N00629934EA0000002578
+B0958594544713N00629919EA0000002576
+B0959014544707N00629906EA0000002572
+B0959034544702N00629892EA0000002569
+B0959054544697N00629877EA0000002567
+B0959074544691N00629863EA0000002565
+B0959094544686N00629850EA0000002563
+B0959114544680N00629837EA0000002561
+B0959134544673N00629823EA0000002560
+B0959154544667N00629811EA0000002558
+B0959174544660N00629798EA0000002556
+B0959194544653N00629785EA0000002554
+B0959214544645N00629771EA0000002553
+B0959234544639N00629761EA0000002556
+B0959254544633N00629754EA0000002560
+B0959274544626N00629747EA0000002566
+B0959294544619N00629740EA0000002573
+B0959314544613N00629731EA0000002576
+B0959334544607N00629722EA0000002581
+B0959354544604N00629715EA0000002585
+B0959374544601N00629712EA0000002588
+B0959394544596N00629703EA0000002587
+B0959414544593N00629681EA0000002583
+B0959434544591N00629668EA0000002579
+B0959454544588N00629653EA0000002578
+B0959474544584N00629638EA0000002578
+B0959494544583N00629626EA0000002582
+B0959514544584N00629614EA0000002589
+B0959534544583N00629599EA0000002597
+B0959564544582N00629579EA0000002603
+B0959584544583N00629558EA0000002610
+B1000004544582N00629538EA0000002616
+B1000024544580N00629522EA0000002620
+B1000044544578N00629504EA0000002624
+B1000064544575N00629484EA0000002626
+B1000084544568N00629468EA0000002629
+B1000104544562N00629454EA0000002632
+B1000124544556N00629438EA0000002633
+B1000144544553N00629416EA0000002633
+B1000164544549N00629400EA0000002635
+B1000184544546N00629385EA0000002635
+B1000204544542N00629366EA0000002636
+B1000224544539N00629357EA0000002638
+B1000244544539N00629357EA0000002639
+B1000264544524N00629312EA0000002639
+B1000284544519N00629291EA0000002639
+B1000304544516N00629273EA0000002639
+B1000324544513N00629256EA0000002638
+B1000344544511N00629238EA0000002635
+B1000364544507N00629219EA0000002632
+B1000384544503N00629199EA0000002630
+B1000404544500N00629180EA0000002629
+B1000424544496N00629163EA0000002629
+B1000444544493N00629147EA0000002628
+B1000464544490N00629130EA0000002626
+B1000484544486N00629114EA0000002625
+B1000504544482N00629098EA0000002623
+B1000524544478N00629082EA0000002621
+B1000544544474N00629065EA0000002617
+B1000564544470N00629049EA0000002613
+B1000584544464N00629031EA0000002607
+B1001004544456N00629015EA0000002601
+B1001024544447N00628998EA0000002594
+B1001044544440N00628978EA0000002587
+B1001064544434N00628958EA0000002580
+B1001084544430N00628938EA0000002575
+B1001104544429N00628922EA0000002571
+B1001124544426N00628904EA0000002566
+B1001144544419N00628875EA0000002560
+B1001164544415N00628858EA0000002556
+B1001184544413N00628841EA0000002551
+B1001204544409N00628821EA0000002544
+B1001224544403N00628801EA0000002538
+B1001244544398N00628780EA0000002533
+B1001264544393N00628759EA0000002529
+B1001284544390N00628740EA0000002527
+B1001304544387N00628720EA0000002524
+B1001334544385N00628699EA0000002521
+B1001354544381N00628678EA0000002518
+B1001374544377N00628658EA0000002515
+B1001394544372N00628637EA0000002510
+B1001414544369N00628616EA0000002507
+B1001434544366N00628595EA0000002504
+B1001454544363N00628573EA0000002500
+B1001474544361N00628551EA0000002497
+B1001494544359N00628529EA0000002495
+B1001514544356N00628509EA0000002491
+B1001534544355N00628487EA0000002487
+B1001554544354N00628466EA0000002484
+B1001574544352N00628445EA0000002481
+B1001594544351N00628434EA0000002478
+B1002014544347N00628402EA0000002474
+B1002034544344N00628380EA0000002471
+B1002054544340N00628358EA0000002468
+B1002074544336N00628337EA0000002465
+B1002094544331N00628316EA0000002461
+B1002114544327N00628295EA0000002458
+B1002134544322N00628274EA0000002454
+B1002154544318N00628253EA0000002451
+B1002174544314N00628232EA0000002447
+B1002194544310N00628210EA0000002443
+B1002214544306N00628189EA0000002439
+B1002234544302N00628166EA0000002436
+B1002254544299N00628144EA0000002433
+B1002274544296N00628121EA0000002429
+B1002294544293N00628099EA0000002425
+B1002314544290N00628077EA0000002421
+B1002334544286N00628055EA0000002417
+B1002354544284N00628033EA0000002413
+B1002374544280N00628010EA0000002410
+B1002394544277N00627988EA0000002407
+B1002414544275N00627965EA0000002403
+B1002434544273N00627943EA0000002400
+B1002454544271N00627920EA0000002397
+B1002474544269N00627897EA0000002393
+B1002494544266N00627874EA0000002390
+B1002514544264N00627852EA0000002388
+B1002534544261N00627829EA0000002385
+B1002554544256N00627795EA0000002382
+B1002574544253N00627773EA0000002380
+B1002594544250N00627750EA0000002378
+B1003014544247N00627728EA0000002375
+B1003034544244N00627705EA0000002372
+B1003054544242N00627682EA0000002370
+B1003074544240N00627660EA0000002367
+B1003094544236N00627636EA0000002364
+B1003114544234N00627613EA0000002362
+B1003144544232N00627591EA0000002360
+B1003164544230N00627570EA0000002357
+B1003184544229N00627547EA0000002354
+B1003204544228N00627524EA0000002352
+B1003224544226N00627502EA0000002350
+B1003244544224N00627480EA0000002348
+B1003264544223N00627457EA0000002345
+B1003284544221N00627434EA0000002343
+B1003304544218N00627412EA0000002341
+B1003324544216N00627390EA0000002339
+B1003344544213N00627367EA0000002337
+B1003364544211N00627356EA0000002335
+B1003384544206N00627321EA0000002333
+B1003404544204N00627298EA0000002332
+B1003424544200N00627276EA0000002329
+B1003444544197N00627254EA0000002327
+B1003464544194N00627231EA0000002325
+B1003484544191N00627208EA0000002323
+B1003504544189N00627185EA0000002320
+B1003524544186N00627162EA0000002318
+B1003544544183N00627139EA0000002316
+B1003564544180N00627116EA0000002313
+B1003584544178N00627093EA0000002311
+B1004004544175N00627070EA0000002308
+B1004024544172N00627048EA0000002305
+B1004044544170N00627025EA0000002302
+B1004064544167N00627002EA0000002300
+B1004084544164N00626979EA0000002297
+B1004104544161N00626956EA0000002294
+B1004124544157N00626934EA0000002292
+B1004144544154N00626912EA0000002289
+B1004164544150N00626889EA0000002287
+B1004184544145N00626868EA0000002284
+B1004204544141N00626846EA0000002281
+B1004224544136N00626824EA0000002279
+B1004244544132N00626802EA0000002276
+B1004264544128N00626780EA0000002273
+B1004284544123N00626758EA0000002270
+B1004304544120N00626735EA0000002267
+B1004324544116N00626712EA0000002264
+B1004344544114N00626688EA0000002261
+B1004364544110N00626652EA0000002256
+B1004384544108N00626628EA0000002254
+B1004404544106N00626604EA0000002252
+B1004424544104N00626580EA0000002249
+B1004444544102N00626557EA0000002246
+B1004464544100N00626533EA0000002244
+B1004484544098N00626509EA0000002241
+B1004504544095N00626485EA0000002238
+B1004524544093N00626461EA0000002235
+B1004554544092N00626437EA0000002233
+B1004574544089N00626413EA0000002230
+B1004594544088N00626390EA0000002226
+B1005014544086N00626366EA0000002223
+B1005034544083N00626342EA0000002220
+B1005054544081N00626319EA0000002217
+B1005074544079N00626295EA0000002214
+B1005094544076N00626272EA0000002211
+B1005114544074N00626248EA0000002208
+B1005134544073N00626236EA0000002204
+B1005154544070N00626201EA0000002201
+B1005174544069N00626177EA0000002198
+B1005194544067N00626154EA0000002195
+B1005214544065N00626130EA0000002191
+B1005234544063N00626107EA0000002188
+B1005254544061N00626083EA0000002185
+B1005274544059N00626060EA0000002182
+B1005294544058N00626037EA0000002179
+B1005314544056N00626013EA0000002176
+B1005334544054N00625990EA0000002173
+B1005354544053N00625966EA0000002170
+B1005374544051N00625943EA0000002167
+B1005394544049N00625920EA0000002164
+B1005414544048N00625896EA0000002161
+B1005434544047N00625873EA0000002158
+B1005454544045N00625850EA0000002156
+B1005474544043N00625827EA0000002153
+B1005494544041N00625805EA0000002150
+B1005514544039N00625783EA0000002146
+B1005534544037N00625760EA0000002143
+B1005554544036N00625738EA0000002140
+B1005574544034N00625716EA0000002137
+B1005594544032N00625694EA0000002133
+B1006014544031N00625672EA0000002130
+B1006034544029N00625650EA0000002127
+B1006054544027N00625628EA0000002124
+B1006074544025N00625606EA0000002120
+B1006094544024N00625584EA0000002117
+B1006114544021N00625562EA0000002114
+B1006134544020N00625540EA0000002111
+B1006154544018N00625517EA0000002108
+B1006174544016N00625484EA0000002104
+B1006194544014N00625462EA0000002101
+B1006214544012N00625440EA0000002098
+B1006234544010N00625417EA0000002095
+B1006254544009N00625394EA0000002092
+B1006274544008N00625372EA0000002089
+B1006294544006N00625350EA0000002086
+B1006314544005N00625327EA0000002083
+B1006334544003N00625305EA0000002081
+B1006364544002N00625282EA0000002078
+B1006384544000N00625260EA0000002075
+B1006404543999N00625237EA0000002072
+B1006424543997N00625215EA0000002069
+B1006444543996N00625193EA0000002066
+B1006464543995N00625171EA0000002063
+B1006484543994N00625148EA0000002060
+B1006504543993N00625126EA0000002057
+B1006524543992N00625104EA0000002054
+B1006544543992N00625081EA0000002051
+B1006564543991N00625059EA0000002049
+B1006584543990N00625037EA0000002046
+B1007004543989N00625014EA0000002043
+B1007024543988N00624992EA0000002041
+B1007044543987N00624970EA0000002038
+B1007064543986N00624959EA0000002036
+B1007084543984N00624927EA0000002034
+B1007104543983N00624906EA0000002031
+B1007124543981N00624885EA0000002027
+B1007144543979N00624863EA0000002025
+B1007164543976N00624842EA0000002023
+B1007184543972N00624822EA0000002020
+B1007204543969N00624801EA0000002016
+B1007224543965N00624779EA0000002013
+B1007244543961N00624759EA0000002011
+B1007264543957N00624738EA0000002007
+B1007284543954N00624717EA0000002004
+B1007304543949N00624695EA0000002001
+B1007324543945N00624675EA0000001998
+B1007344543941N00624654EA0000001995
+B1007364543937N00624633EA0000001992
+B1007384543934N00624612EA0000001989
+B1007404543931N00624590EA0000001986
+B1007424543928N00624570EA0000001983
+B1007444543926N00624550EA0000001980
+B1007464543924N00624529EA0000001977
+B1007484543922N00624509EA0000001974
+B1007504543920N00624489EA0000001971
+B1007524543918N00624468EA0000001968
+B1007544543916N00624448EA0000001966
+B1007564543914N00624428EA0000001962
+B1007584543910N00624397EA0000001958
+B1008004543908N00624377EA0000001955
+B1008024543905N00624357EA0000001952
+B1008044543902N00624337EA0000001949
+B1008064543900N00624317EA0000001946
+B1008084543897N00624296EA0000001943
+B1008104543894N00624276EA0000001940
+B1008124543891N00624256EA0000001937
+B1008154543888N00624235EA0000001933
+B1008174543885N00624214EA0000001930
+B1008194543882N00624194EA0000001928
+B1008214543879N00624173EA0000001925
+B1008234543877N00624152EA0000001922
+B1008254543874N00624132EA0000001920
+B1008274543872N00624111EA0000001917
+B1008294543869N00624091EA0000001914
+B1008314543867N00624070EA0000001912
+B1008334543865N00624049EA0000001910
+B1008354543862N00624028EA0000001908
+B1008374543859N00624008EA0000001905
+B1008394543857N00623987EA0000001903
+B1008414543854N00623966EA0000001900
+B1008434543851N00623945EA0000001897
+B1008454543848N00623924EA0000001894
+B1008474543845N00623903EA0000001891
+B1008494543842N00623882EA0000001888
+B1008514543839N00623862EA0000001885
+B1008534543836N00623841EA0000001883
+B1008554543833N00623820EA0000001880
+B1008574543829N00623799EA0000001877
+B1008594543826N00623779EA0000001874
+B1009014543822N00623758EA0000001871
+B1009034543819N00623737EA0000001869
+B1009054543815N00623717EA0000001867
+B1009074543810N00623697EA0000001864
+B1009094543805N00623677EA0000001861
+B1009114543800N00623656EA0000001858
+B1009134543794N00623637EA0000001856
+B1009154543789N00623617EA0000001853
+B1009174543783N00623597EA0000001850
+B1009194543777N00623577EA0000001847
+B1009214543771N00623557EA0000001844
+B1009234543765N00623537EA0000001842
+B1009254543759N00623518EA0000001840
+B1009274543753N00623498EA0000001836
+B1009294543748N00623478EA0000001833
+B1009314543743N00623458EA0000001830
+B1009334543737N00623438EA0000001828
+B1009354543729N00623409EA0000001824
+B1009374543724N00623389EA0000001821
+B1009394543719N00623370EA0000001818
+B1009414543712N00623351EA0000001815
+B1009434543706N00623332EA0000001812
+B1009454543698N00623313EA0000001810
+B1009474543691N00623294EA0000001807
+B1009494543683N00623276EA0000001805
+B1009514543676N00623258EA0000001802
+B1009534543668N00623239EA0000001800
+B1009564543661N00623221EA0000001797
+B1009584543653N00623203EA0000001794
+B1010004543646N00623185EA0000001792
+B1010024543638N00623167EA0000001789
+B1010044543630N00623150EA0000001786
+B1010064543623N00623131EA0000001783
+B1010084543616N00623113EA0000001781
+B1010104543608N00623094EA0000001778
+B1010124543601N00623076EA0000001776
+B1010144543594N00623058EA0000001773
+B1010164543586N00623040EA0000001770
+B1010184543579N00623021EA0000001767
+B1010204543576N00623012EA0000001765
+B1010224543566N00622984EA0000001762
+B1010244543560N00622965EA0000001759
+B1010264543554N00622946EA0000001756
+B1010284543547N00622927EA0000001753
+B1010304543540N00622909EA0000001751
+B1010324543533N00622891EA0000001748
+B1010344543526N00622873EA0000001745
+B1010364543518N00622855EA0000001743
+B1010384543511N00622837EA0000001740
+B1010404543504N00622820EA0000001737
+B1010424543497N00622802EA0000001734
+B1010444543489N00622784EA0000001732
+B1010464543481N00622766EA0000001729
+B1010484543473N00622749EA0000001727
+B1010504543465N00622731EA0000001724
+B1010524543458N00622712EA0000001721
+B1010544543450N00622694EA0000001718
+B1010564543442N00622675EA0000001715
+B1010584543436N00622656EA0000001712
+B1011004543428N00622638EA0000001709
+B1011024543421N00622619EA0000001706
+B1011044543414N00622601EA0000001703
+B1011064543407N00622582EA0000001700
+B1011084543400N00622563EA0000001696
+B1011104543393N00622544EA0000001693
+B1011124543383N00622516EA0000001688
+B1011144543377N00622497EA0000001685
+B1011164543371N00622478EA0000001682
+B1011184543365N00622459EA0000001679
+B1011204543359N00622440EA0000001676
+B1011224543354N00622421EA0000001672
+B1011244543348N00622402EA0000001669
+B1011264543342N00622382EA0000001666
+B1011284543336N00622364EA0000001663
+B1011304543330N00622344EA0000001660
+B1011324543325N00622325EA0000001657
+B1011344543319N00622307EA0000001654
+B1011374543313N00622288EA0000001651
+B1011394543307N00622269EA0000001648
+B1011414543301N00622250EA0000001645
+B1011434543295N00622231EA0000001642
+B1011454543289N00622213EA0000001639
+B1011474543282N00622194EA0000001636
+B1011494543277N00622176EA0000001633
+B1011514543271N00622158EA0000001630
+B1011534543264N00622141EA0000001626
+B1011554543258N00622123EA0000001623
+B1011574543251N00622106EA0000001620
+B1011594543244N00622089EA0000001617
+B1012014543240N00622081EA0000001615
+B1012034543231N00622055EA0000001613
+B1012054543227N00622038EA0000001610
+B1012074543223N00622020EA0000001607
+B1012094543220N00622001EA0000001604
+B1012114543219N00621981EA0000001601
+B1012134543218N00621961EA0000001599
+B1012154543216N00621938EA0000001597
+B1012174543213N00621919EA0000001596
+B1012194543208N00621907EA0000001594
+B1012214543203N00621893EA0000001590
+B1012234543200N00621875EA0000001586
+B1012254543196N00621860EA0000001582
+B1012274543190N00621846EA0000001579
+B1012294543186N00621831EA0000001576
+B1012314543182N00621816EA0000001573
+B1012334543176N00621800EA0000001571
+B1012354543171N00621789EA0000001569
+B1012374543164N00621776EA0000001566
+B1012394543159N00621761EA0000001564
+B1012414543153N00621749EA0000001563
+B1012434543146N00621735EA0000001559
+B1012454543138N00621720EA0000001557
+B1012474543129N00621707EA0000001556
+B1012494543121N00621694EA0000001555
+B1012514543114N00621681EA0000001555
+B1012534543105N00621665EA0000001553
+B1012554543100N00621648EA0000001551
+B1012574543098N00621630EA0000001550
+B1012594543098N00621614EA0000001547
+B1013014543096N00621601EA0000001543
+B1013034543095N00621585EA0000001539
+B1013054543096N00621567EA0000001536
+B1013074543098N00621549EA0000001534
+B1013094543097N00621536EA0000001535
+B1013114543097N00621521EA0000001534
+B1013134543100N00621504EA0000001534
+B1013154543107N00621490EA0000001535
+B1013184543114N00621476EA0000001536
+B1013204543120N00621461EA0000001536
+B1013224543125N00621445EA0000001537
+B1013244543128N00621431EA0000001538
+B1013264543130N00621418EA0000001539
+B1013284543130N00621405EA0000001539
+B1013304543128N00621392EA0000001539
+B1013324543124N00621380EA0000001540
+B1013344543122N00621369EA0000001540
+B1013364543120N00621357EA0000001539
+B1013384543118N00621344EA0000001539
+B1013404543117N00621332EA0000001538
+B1013424543113N00621320EA0000001536
+B1013444543110N00621307EA0000001535
+B1013464543110N00621295EA0000001534
+B1013484543111N00621282EA0000001532
+B1013504543111N00621267EA0000001529
+B1013524543111N00621251EA0000001527
+B1013544543110N00621236EA0000001524
+B1013564543106N00621222EA0000001521
+B1013584543099N00621209EA0000001519
+B1014004543092N00621197EA0000001518
+B1014024543085N00621185EA0000001517
+B1014044543077N00621175EA0000001517
+B1014064543068N00621165EA0000001518
+B1014084543061N00621157EA0000001519
+B1014104543054N00621150EA0000001518
+B1014124543046N00621141EA0000001515
+B1014144543038N00621130EA0000001514
+B1014164543030N00621119EA0000001513
+B1014184543021N00621110EA0000001512
+B1014204543013N00621099EA0000001511
+B1014224543004N00621084EA0000001511
+B1014244542997N00621069EA0000001512
+B1014264542990N00621058EA0000001515
+B1014284542984N00621051EA0000001518
+B1014304542979N00621044EA0000001522
+B1014324542971N00621033EA0000001525
+B1014344542964N00621029EA0000001526
+B1014364542955N00621030EA0000001527
+B1014384542947N00621037EA0000001527
+B1014404542946N00621052EA0000001526
+B1014424542954N00621062EA0000001525
+B1014444542968N00621061EA0000001524
+B1014464542977N00621051EA0000001525
+B1014484542981N00621038EA0000001526
+B1014504542981N00621024EA0000001526
+B1014524542979N00621011EA0000001529
+B1014544542975N00621001EA0000001531
+B1014564542971N00620993EA0000001531
+B1014594542965N00620983EA0000001530
+B1015014542959N00620973EA0000001528
+B1015034542951N00620964EA0000001525
+B1015054542943N00620954EA0000001522
+B1015074542935N00620944EA0000001520
+B1015094542927N00620935EA0000001518
+B1015114542917N00620927EA0000001517
+B1015134542908N00620921EA0000001516
+B1015154542899N00620915EA0000001515
+B1015174542888N00620910EA0000001514
+B1015194542878N00620904EA0000001515
+B1015214542868N00620898EA0000001516
+B1015234542858N00620893EA0000001515
+B1015254542849N00620890EA0000001513
+B1015274542838N00620886EA0000001512
+B1015294542827N00620882EA0000001513
+B1015314542822N00620881EA0000001514
+B1015334542816N00620880EA0000001514
+B1015354542807N00620877EA0000001514
+B1015374542800N00620872EA0000001516
+B1015394542795N00620870EA0000001520
+B1015414542790N00620875EA0000001523
+B1015434542789N00620884EA0000001525
+B1015454542792N00620895EA0000001526
+B1015474542800N00620901EA0000001528
+B1015494542811N00620897EA0000001529
+B1015514542821N00620886EA0000001529
+B1015534542824N00620869EA0000001530
+B1015554542820N00620852EA0000001530
+B1015574542813N00620843EA0000001531
+B1015594542806N00620838EA0000001533
+B1016014542800N00620836EA0000001536
+B1016034542793N00620836EA0000001537
+B1016054542784N00620835EA0000001537
+B1016074542774N00620832EA0000001537
+B1016094542767N00620829EA0000001536
+B1016114542758N00620827EA0000001534
+B1016134542741N00620825EA0000001531
+B1016154542731N00620823EA0000001529
+B1016174542720N00620821EA0000001526
+B1016194542709N00620817EA0000001524
+B1016214542699N00620812EA0000001523
+B1016234542689N00620805EA0000001522
+B1016254542681N00620798EA0000001523
+B1016274542677N00620795EA0000001526
+B1016294542670N00620795EA0000001527
+B1016314542665N00620801EA0000001529
+B1016334542667N00620812EA0000001531
+B1016354542678N00620815EA0000001533
+B1016384542689N00620810EA0000001536
+B1016404542693N00620794EA0000001539
+B1016424542693N00620775EA0000001544
+B1016444542689N00620760EA0000001548
+B1016464542682N00620754EA0000001552
+B1016484542676N00620760EA0000001556
+B1016504542677N00620771EA0000001559
+B1016524542685N00620775EA0000001563
+B1016544542696N00620766EA0000001567
+B1016564542703N00620750EA0000001572
+B1016584542701N00620733EA0000001576
+B1017004542696N00620720EA0000001580
+B1017024542689N00620713EA0000001584
+B1017044542684N00620720EA0000001588
+B1017064542681N00620737EA0000001596
+B1017084542686N00620744EA0000001598
+B1017104542694N00620750EA0000001600
+B1017124542705N00620748EA0000001602
+B1017144542717N00620738EA0000001606
+B1017164542724N00620722EA0000001609
+B1017184542718N00620704EA0000001611
+B1017204542708N00620692EA0000001614
+B1017224542700N00620689EA0000001620
+B1017244542692N00620685EA0000001623
+B1017264542683N00620682EA0000001627
+B1017284542676N00620686EA0000001632
+B1017304542674N00620694EA0000001636
+B1017324542673N00620704EA0000001637
+B1017344542674N00620717EA0000001639
+B1017364542684N00620725EA0000001640
+B1017384542696N00620723EA0000001641
+B1017404542703N00620710EA0000001642
+B1017424542703N00620691EA0000001644
+B1017444542698N00620679EA0000001646
+B1017464542691N00620671EA0000001649
+B1017484542684N00620663EA0000001652
+B1017504542676N00620657EA0000001656
+B1017524542669N00620653EA0000001661
+B1017544542661N00620657EA0000001666
+B1017564542658N00620667EA0000001668
+B1017584542661N00620679EA0000001672
+B1018004542669N00620684EA0000001676
+B1018024542679N00620683EA0000001677
+B1018044542689N00620677EA0000001678
+B1018064542696N00620659EA0000001679
+B1018084542692N00620641EA0000001680
+B1018104542684N00620631EA0000001685
+B1018124542677N00620626EA0000001688
+B1018144542671N00620618EA0000001690
+B1018164542663N00620615EA0000001691
+B1018194542656N00620620EA0000001691
+B1018214542653N00620631EA0000001691
+B1018234542656N00620643EA0000001691
+B1018254542665N00620644EA0000001692
+B1018274542675N00620633EA0000001694
+B1018294542678N00620618EA0000001698
+B1018314542675N00620605EA0000001703
+B1018334542668N00620597EA0000001706
+B1018354542661N00620593EA0000001709
+B1018374542653N00620597EA0000001711
+B1018394542648N00620607EA0000001712
+B1018414542647N00620618EA0000001713
+B1018434542652N00620630EA0000001714
+B1018454542662N00620635EA0000001714
+B1018474542672N00620629EA0000001715
+B1018494542678N00620615EA0000001716
+B1018514542675N00620601EA0000001717
+B1018534542668N00620591EA0000001719
+B1018554542662N00620583EA0000001721
+B1018574542656N00620575EA0000001723
+B1018594542648N00620567EA0000001725
+B1019014542640N00620564EA0000001729
+B1019034542634N00620570EA0000001733
+B1019054542629N00620582EA0000001737
+B1019074542629N00620597EA0000001739
+B1019094542635N00620606EA0000001741
+B1019114542644N00620609EA0000001741
+B1019134542653N00620606EA0000001740
+B1019154542659N00620592EA0000001739
+B1019174542658N00620575EA0000001738
+B1019194542651N00620561EA0000001737
+B1019214542642N00620551EA0000001737
+B1019234542635N00620543EA0000001739
+B1019254542629N00620537EA0000001742
+B1019274542623N00620531EA0000001745
+B1019294542619N00620525EA0000001748
+B1019314542608N00620519EA0000001750
+B1019334542599N00620523EA0000001749
+B1019354542595N00620532EA0000001748
+B1019374542596N00620544EA0000001746
+B1019394542605N00620553EA0000001744
+B1019414542616N00620553EA0000001742
+B1019434542628N00620549EA0000001739
+B1019454542640N00620549EA0000001736
+B1019474542651N00620552EA0000001734
+B1019494542662N00620557EA0000001732
+B1019514542673N00620564EA0000001732
+B1019534542680N00620570EA0000001733
+B1019564542684N00620576EA0000001735
+B1019584542689N00620583EA0000001736
+B1020004542696N00620589EA0000001739
+B1020024542700N00620598EA0000001743
+B1020044542699N00620608EA0000001746
+B1020064542693N00620616EA0000001749
+B1020084542684N00620610EA0000001751
+B1020104542678N00620594EA0000001753
+B1020124542681N00620588EA0000001755
+B1020144542688N00620595EA0000001757
+B1020164542688N00620606EA0000001760
+B1020184542681N00620611EA0000001763
+B1020204542676N00620610EA0000001767
+B1020224542667N00620593EA0000001769
+B1020244542670N00620577EA0000001772
+B1020264542679N00620569EA0000001774
+B1020284542688N00620572EA0000001777
+B1020304542693N00620580EA0000001781
+B1020324542696N00620589EA0000001785
+B1020344542693N00620601EA0000001788
+B1020364542684N00620606EA0000001791
+B1020384542673N00620598EA0000001795
+B1020404542667N00620584EA0000001798
+B1020424542670N00620572EA0000001801
+B1020444542679N00620562EA0000001804
+B1020464542690N00620562EA0000001805
+B1020484542699N00620567EA0000001807
+B1020504542707N00620572EA0000001811
+B1020524542714N00620573EA0000001816
+B1020544542720N00620575EA0000001820
+B1020564542724N00620582EA0000001824
+B1020584542723N00620592EA0000001827
+B1021004542714N00620593EA0000001830
+B1021024542704N00620583EA0000001832
+B1021044542700N00620568EA0000001835
+B1021064542706N00620558EA0000001837
+B1021084542717N00620562EA0000001840
+B1021104542722N00620569EA0000001842
+B1021124542709N00620567EA0000001847
+B1021144542700N00620557EA0000001850
+B1021164542696N00620543EA0000001852
+B1021184542701N00620531EA0000001855
+B1021204542714N00620531EA0000001856
+B1021224542725N00620538EA0000001859
+B1021244542733N00620546EA0000001863
+B1021264542738N00620550EA0000001869
+B1021284542742N00620557EA0000001873
+B1021304542746N00620568EA0000001878
+B1021324542747N00620578EA0000001883
+B1021344542741N00620585EA0000001888
+B1021374542731N00620583EA0000001893
+B1021394542725N00620571EA0000001898
+B1021414542726N00620555EA0000001903
+B1021434542736N00620549EA0000001909
+B1021454542746N00620550EA0000001915
+B1021474542754N00620556EA0000001921
+B1021494542756N00620567EA0000001925
+B1021514542750N00620579EA0000001927
+B1021534542739N00620578EA0000001929
+B1021554542731N00620564EA0000001932
+B1021574542730N00620555EA0000001934
+B1021594542737N00620535EA0000001937
+B1022014542747N00620535EA0000001940
+B1022034542753N00620543EA0000001942
+B1022054542754N00620554EA0000001943
+B1022074542748N00620565EA0000001943
+B1022094542742N00620573EA0000001944
+B1022114542737N00620577EA0000001946
+B1022134542729N00620581EA0000001946
+B1022154542720N00620577EA0000001947
+B1022174542714N00620562EA0000001948
+B1022194542716N00620545EA0000001949
+B1022214542725N00620544EA0000001952
+B1022234542735N00620552EA0000001954
+B1022254542735N00620560EA0000001958
+B1022274542728N00620566EA0000001961
+B1022294542718N00620566EA0000001962
+B1022314542707N00620557EA0000001964
+B1022334542702N00620542EA0000001967
+B1022354542707N00620535EA0000001969
+B1022374542716N00620539EA0000001972
+B1022394542722N00620549EA0000001976
+B1022414542721N00620558EA0000001980
+B1022434542716N00620569EA0000001982
+B1022454542708N00620576EA0000001983
+B1022474542697N00620573EA0000001985
+B1022494542691N00620561EA0000001988
+B1022514542690N00620547EA0000001991
+B1022534542703N00620535EA0000001995
+B1022554542713N00620539EA0000001997
+B1022574542716N00620551EA0000002001
+B1022594542713N00620564EA0000002004
+B1023014542706N00620574EA0000002006
+B1023034542695N00620576EA0000002008
+B1023054542686N00620569EA0000002011
+B1023074542679N00620556EA0000002014
+B1023094542679N00620541EA0000002017
+B1023114542683N00620530EA0000002021
+B1023134542691N00620523EA0000002025
+B1023164542701N00620521EA0000002029
+B1023184542708N00620529EA0000002032
+B1023204542709N00620544EA0000002035
+B1023224542703N00620556EA0000002039
+B1023244542693N00620558EA0000002042
+B1023264542684N00620548EA0000002044
+B1023284542682N00620532EA0000002046
+B1023304542689N00620525EA0000002049
+B1023324542698N00620530EA0000002052
+B1023344542701N00620536EA0000002055
+B1023364542699N00620557EA0000002057
+B1023384542689N00620565EA0000002060
+B1023404542679N00620562EA0000002062
+B1023424542673N00620551EA0000002063
+B1023444542673N00620536EA0000002064
+B1023464542682N00620529EA0000002065
+B1023484542692N00620535EA0000002066
+B1023504542696N00620548EA0000002067
+B1023524542691N00620559EA0000002069
+B1023544542682N00620565EA0000002070
+B1023564542671N00620563EA0000002070
+B1023584542662N00620554EA0000002070
+B1024004542653N00620547EA0000002071
+B1024024542647N00620546EA0000002074
+B1024044542640N00620551EA0000002078
+B1024064542632N00620558EA0000002082
+B1024084542629N00620569EA0000002087
+B1024104542629N00620584EA0000002090
+B1024124542634N00620596EA0000002094
+B1024144542642N00620599EA0000002096
+B1024164542649N00620591EA0000002098
+B1024184542648N00620580EA0000002100
+B1024204542643N00620568EA0000002101
+B1024224542636N00620560EA0000002104
+B1024244542629N00620554EA0000002107
+B1024264542620N00620549EA0000002112
+B1024284542607N00620543EA0000002119
+B1024304542599N00620536EA0000002122
+B1024324542590N00620529EA0000002124
+B1024344542580N00620522EA0000002124
+B1024364542568N00620513EA0000002123
+B1024384542557N00620503EA0000002120
+B1024404542546N00620494EA0000002117
+B1024424542536N00620486EA0000002114
+B1024444542525N00620476EA0000002110
+B1024464542514N00620466EA0000002106
+B1024484542504N00620457EA0000002103
+B1024504542494N00620447EA0000002099
+B1024534542483N00620439EA0000002095
+B1024554542471N00620430EA0000002091
+B1024574542460N00620421EA0000002087
+B1024594542449N00620410EA0000002084
+B1025014542440N00620401EA0000002082
+B1025034542430N00620391EA0000002080
+B1025054542419N00620380EA0000002077
+B1025074542408N00620372EA0000002076
+B1025094542396N00620366EA0000002075
+B1025114542391N00620363EA0000002076
+B1025134542377N00620351EA0000002077
+B1025154542366N00620340EA0000002078
+B1025174542355N00620329EA0000002080
+B1025194542345N00620319EA0000002081
+B1025214542335N00620308EA0000002081
+B1025234542323N00620297EA0000002082
+B1025254542312N00620289EA0000002083
+B1025274542302N00620281EA0000002083
+B1025294542292N00620274EA0000002081
+B1025314542282N00620265EA0000002079
+B1025334542272N00620254EA0000002079
+B1025354542263N00620245EA0000002079
+B1025374542254N00620237EA0000002079
+B1025394542246N00620228EA0000002079
+B1025414542237N00620218EA0000002080
+B1025434542227N00620209EA0000002083
+B1025454542219N00620200EA0000002084
+B1025474542211N00620191EA0000002085
+B1025494542201N00620181EA0000002088
+B1025514542192N00620174EA0000002092
+B1025534542184N00620171EA0000002097
+B1025554542178N00620168EA0000002100
+B1025574542171N00620164EA0000002102
+B1025594542164N00620157EA0000002102
+B1026014542161N00620148EA0000002102
+B1026034542164N00620133EA0000002103
+B1026054542168N00620119EA0000002105
+B1026074542174N00620110EA0000002105
+B1026094542194N00620107EA0000002105
+B1026114542204N00620121EA0000002107
+B1026134542202N00620135EA0000002110
+B1026154542189N00620144EA0000002114
+B1026174542180N00620140EA0000002120
+B1026194542175N00620129EA0000002125
+B1026214542175N00620117EA0000002128
+B1026234542182N00620106EA0000002129
+B1026254542195N00620103EA0000002130
+B1026274542206N00620114EA0000002131
+B1026294542204N00620128EA0000002132
+B1026324542195N00620133EA0000002134
+B1026344542186N00620130EA0000002136
+B1026364542179N00620126EA0000002140
+B1026384542173N00620122EA0000002141
+B1026404542165N00620116EA0000002143
+B1026424542158N00620109EA0000002145
+B1026444542152N00620104EA0000002147
+B1026464542145N00620100EA0000002148
+B1026484542140N00620098EA0000002149
+B1026504542125N00620090EA0000002150
+B1026524542117N00620085EA0000002150
+B1026544542107N00620078EA0000002149
+B1026564542096N00620070EA0000002148
+B1026584542086N00620064EA0000002147
+B1027004542076N00620058EA0000002145
+B1027024542064N00620049EA0000002141
+B1027044542051N00620040EA0000002138
+B1027064542040N00620030EA0000002130
+B1027084542029N00620022EA0000002126
+B1027104542018N00620015EA0000002121
+B1027124542006N00620007EA0000002117
+B1027144541994N00620000EA0000002113
+B1027164541981N00619993EA0000002108
+B1027184541968N00619990EA0000002102
+B1027204541954N00619985EA0000002097
+B1027224541941N00619975EA0000002091
+B1027244541929N00619965EA0000002086
+B1027264541916N00619957EA0000002082
+B1027284541904N00619948EA0000002079
+B1027304541891N00619940EA0000002075
+B1027324541878N00619933EA0000002071
+B1027344541865N00619925EA0000002069
+B1027364541853N00619916EA0000002067
+B1027384541839N00619907EA0000002064
+B1027404541825N00619896EA0000002061
+B1027424541813N00619885EA0000002060
+B1027444541800N00619876EA0000002058
+B1027464541786N00619867EA0000002055
+B1027484541765N00619853EA0000002052
+B1027504541751N00619844EA0000002050
+B1027524541738N00619833EA0000002047
+B1027544541724N00619822EA0000002045
+B1027564541711N00619812EA0000002044
+B1027584541697N00619800EA0000002043
+B1028004541684N00619788EA0000002043
+B1028024541674N00619779EA0000002045
+B1028044541666N00619773EA0000002047
+B1028064541657N00619766EA0000002049
+B1028084541648N00619758EA0000002052
+B1028104541641N00619751EA0000002058
+B1028134541633N00619746EA0000002066
+B1028154541626N00619742EA0000002071
+B1028174541618N00619738EA0000002076
+B1028194541610N00619735EA0000002082
+B1028214541604N00619729EA0000002089
+B1028234541598N00619720EA0000002096
+B1028254541595N00619716EA0000002105
+B1028274541585N00619710EA0000002113
+B1028294541576N00619711EA0000002119
+B1028314541568N00619720EA0000002126
+B1028334541566N00619734EA0000002134
+B1028354541570N00619745EA0000002143
+B1028374541577N00619753EA0000002152
+B1028394541586N00619759EA0000002161
+B1028414541595N00619758EA0000002168
+B1028434541602N00619749EA0000002174
+B1028454541608N00619738EA0000002177
+B1028474541614N00619727EA0000002180
+B1028494541617N00619712EA0000002184
+B1028514541618N00619696EA0000002188
+B1028534541615N00619682EA0000002192
+B1028554541608N00619671EA0000002195
+B1028574541598N00619664EA0000002198
+B1028594541590N00619660EA0000002200
+B1029014541581N00619657EA0000002200
+B1029034541572N00619653EA0000002202
+B1029054541564N00619648EA0000002204
+B1029074541556N00619644EA0000002204
+B1029094541547N00619640EA0000002203
+B1029114541537N00619633EA0000002203
+B1029134541528N00619627EA0000002204
+B1029154541520N00619623EA0000002203
+B1029174541511N00619618EA0000002200
+B1029194541501N00619611EA0000002195
+B1029214541490N00619604EA0000002190
+B1029234541479N00619593EA0000002184
+B1029254541467N00619579EA0000002179
+B1029274541457N00619568EA0000002176
+B1029294541441N00619554EA0000002167
+B1029314541429N00619543EA0000002163
+B1029334541418N00619532EA0000002160
+B1029354541408N00619523EA0000002157
+B1029374541396N00619513EA0000002153
+B1029394541382N00619505EA0000002151
+B1029414541371N00619498EA0000002149
+B1029434541358N00619491EA0000002146
+B1029454541345N00619483EA0000002141
+B1029474541333N00619474EA0000002138
+B1029494541323N00619463EA0000002136
+B1029514541312N00619451EA0000002132
+B1029544541301N00619438EA0000002130
+B1029564541289N00619427EA0000002128
+B1029584541278N00619415EA0000002125
+B1030004541267N00619400EA0000002123
+B1030024541257N00619386EA0000002123
+B1030044541249N00619374EA0000002122
+B1030064541240N00619362EA0000002120
+B1030084541231N00619347EA0000002117
+B1030104541221N00619333EA0000002117
+B1030124541213N00619320EA0000002117
+B1030144541205N00619306EA0000002114
+B1030164541197N00619288EA0000002110
+B1030184541188N00619269EA0000002106
+B1030204541183N00619260EA0000002103
+B1030224541169N00619236EA0000002097
+B1030244541158N00619222EA0000002091
+B1030264541146N00619206EA0000002086
+B1030284541135N00619190EA0000002082
+B1030304541127N00619176EA0000002077
+B1030324541118N00619159EA0000002070
+B1030344541109N00619139EA0000002066
+B1030364541100N00619121EA0000002063
+B1030384541092N00619103EA0000002060
+B1030404541084N00619084EA0000002059
+B1030424541077N00619067EA0000002057
+B1030444541069N00619049EA0000002053
+B1030464541061N00619030EA0000002050
+B1030484541053N00619012EA0000002048
+B1030504541046N00618993EA0000002044
+B1030524541038N00618975EA0000002039
+B1030544541029N00618958EA0000002033
+B1030564541019N00618940EA0000002028
+B1030584541010N00618923EA0000002024
+B1031004541002N00618907EA0000002020
+B1031024540993N00618889EA0000002016
+B1031044540984N00618870EA0000002013
+B1031064540976N00618852EA0000002011
+B1031084540969N00618833EA0000002008
+B1031104540958N00618805EA0000002004
+B1031124540949N00618788EA0000002002
+B1031144540941N00618771EA0000001998
+B1031164540933N00618752EA0000001993
+B1031184540924N00618734EA0000001989
+B1031204540915N00618717EA0000001986
+B1031224540908N00618699EA0000001983
+B1031244540900N00618681EA0000001979
+B1031264540892N00618663EA0000001977
+B1031284540885N00618644EA0000001974
+B1031304540877N00618627EA0000001971
+B1031334540869N00618609EA0000001968
+B1031354540861N00618590EA0000001965
+B1031374540853N00618573EA0000001962
+B1031394540844N00618556EA0000001959
+B1031414540835N00618538EA0000001956
+B1031434540829N00618519EA0000001954
+B1031454540821N00618501EA0000001951
+B1031474540814N00618483EA0000001948
+B1031494540808N00618465EA0000001946
+B1031514540801N00618446EA0000001944
+B1031534540795N00618428EA0000001942
+B1031554540787N00618410EA0000001940
+B1031574540780N00618392EA0000001937
+B1031594540774N00618373EA0000001934
+B1032014540768N00618354EA0000001931
+B1032034540762N00618334EA0000001929
+B1032054540757N00618315EA0000001925
+B1032074540751N00618295EA0000001922
+B1032094540745N00618276EA0000001919
+B1032114540739N00618256EA0000001916
+B1032134540734N00618237EA0000001913
+B1032154540728N00618218EA0000001909
+B1032174540721N00618200EA0000001905
+B1032194540715N00618179EA0000001900
+B1032214540709N00618156EA0000001895
+B1032234540703N00618134EA0000001891
+B1032254540698N00618112EA0000001887
+B1032274540694N00618089EA0000001882
+B1032294540690N00618066EA0000001877
+B1032314540686N00618043EA0000001872
+B1032334540683N00618020EA0000001868
+B1032354540679N00617997EA0000001865
+B1032374540675N00617974EA0000001862
+B1032394540672N00617952EA0000001858
+B1032414540668N00617930EA0000001855
+B1032434540664N00617908EA0000001851
+B1032454540660N00617886EA0000001847
+B1032474540657N00617862EA0000001843
+B1032494540653N00617840EA0000001840
+B1032514540649N00617817EA0000001836
+B1032534540644N00617783EA0000001831
+B1032554540641N00617760EA0000001828
+B1032574540638N00617739EA0000001825
+B1032594540636N00617717EA0000001824
+B1033014540635N00617701EA0000001823
+B1033034540634N00617689EA0000001821
+B1033054540630N00617675EA0000001817
+B1033074540627N00617660EA0000001817
+B1033094540624N00617647EA0000001817
+B1033114540620N00617633EA0000001815
+B1033144540616N00617615EA0000001813
+B1033164540613N00617596EA0000001812
+B1033184540609N00617576EA0000001810
+B1033204540606N00617556EA0000001807
+B1033224540603N00617536EA0000001805
+B1033244540599N00617514EA0000001802
+B1033264540598N00617494EA0000001800
+B1033284540600N00617479EA0000001800
+B1033304540600N00617462EA0000001798
+B1033324540600N00617441EA0000001798
+B1033344540600N00617421EA0000001800
+B1033364540598N00617407EA0000001801
+B1033384540596N00617392EA0000001800
+B1033404540594N00617375EA0000001798
+B1033424540592N00617355EA0000001797
+B1033444540593N00617335EA0000001798
+B1033464540594N00617318EA0000001799
+B1033484540596N00617302EA0000001798
+B1033504540598N00617282EA0000001799
+B1033524540597N00617261EA0000001800
+B1033544540594N00617243EA0000001802
+B1033564540592N00617227EA0000001803
+B1033584540590N00617209EA0000001802
+B1034004540589N00617193EA0000001801
+B1034024540587N00617178EA0000001799
+B1034044540585N00617162EA0000001796
+B1034064540584N00617147EA0000001795
+B1034084540581N00617134EA0000001793
+B1034104540576N00617120EA0000001793
+B1034124540571N00617107EA0000001794
+B1034144540569N00617094EA0000001795
+B1034164540564N00617080EA0000001797
+B1034184540558N00617066EA0000001800
+B1034204540554N00617054EA0000001803
+B1034224540551N00617042EA0000001804
+B1034244540544N00617031EA0000001805
+B1034264540533N00617032EA0000001804
+B1034284540525N00617038EA0000001801
+B1034304540520N00617047EA0000001799
+B1034324540516N00617059EA0000001797
+B1034344540512N00617070EA0000001797
+B1034364540505N00617083EA0000001801
+B1034384540501N00617090EA0000001805
+B1034404540496N00617096EA0000001809
+B1034424540491N00617103EA0000001812
+B1034444540488N00617111EA0000001815
+B1034464540488N00617122EA0000001817
+B1034484540494N00617130EA0000001819
+B1034504540505N00617132EA0000001822
+B1034524540514N00617121EA0000001826
+B1034554540516N00617104EA0000001831
+B1034574540513N00617089EA0000001836
+B1034594540507N00617075EA0000001841
+B1035014540499N00617067EA0000001845
+B1035034540490N00617063EA0000001849
+B1035054540483N00617061EA0000001851
+B1035074540477N00617066EA0000001853
+B1035094540473N00617075EA0000001855
+B1035114540472N00617086EA0000001858
+B1035134540476N00617097EA0000001863
+B1035154540483N00617104EA0000001868
+B1035174540489N00617109EA0000001875
+B1035194540494N00617115EA0000001882
+B1035214540499N00617122EA0000001886
+B1035234540503N00617133EA0000001893
+B1035254540503N00617145EA0000001900
+B1035274540499N00617156EA0000001907
+B1035294540493N00617164EA0000001913
+B1035314540486N00617164EA0000001917
+B1035334540477N00617155EA0000001920
+B1035354540476N00617136EA0000001921
+B1035374540485N00617121EA0000001924
+B1035394540496N00617118EA0000001927
+B1035414540507N00617118EA0000001932
+B1035434540517N00617120EA0000001936
+B1035454540527N00617124EA0000001942
+B1035474540536N00617123EA0000001950
+B1035494540543N00617116EA0000001956
+B1035514540551N00617107EA0000001960
+B1035534540560N00617099EA0000001962
+B1035554540566N00617088EA0000001962
+B1035574540569N00617072EA0000001964
+B1035594540567N00617056EA0000001965
+B1036014540559N00617045EA0000001966
+B1036034540547N00617044EA0000001967
+B1036054540538N00617048EA0000001969
+B1036074540532N00617051EA0000001973
+B1036094540525N00617056EA0000001976
+B1036114540517N00617062EA0000001980
+B1036134540508N00617069EA0000001985
+B1036154540504N00617074EA0000001992
+B1036174540494N00617076EA0000002000
+B1036194540485N00617070EA0000002004
+B1036214540480N00617057EA0000002006
+B1036234540482N00617040EA0000002008
+B1036254540491N00617028EA0000002009
+B1036274540502N00617021EA0000002010
+B1036294540510N00617019EA0000002013
+B1036314540517N00617020EA0000002017
+B1036344540521N00617025EA0000002020
+B1036364540523N00617034EA0000002024
+B1036384540524N00617044EA0000002027
+B1036404540522N00617056EA0000002030
+B1036424540518N00617066EA0000002035
+B1036444540509N00617070EA0000002040
+B1036464540498N00617065EA0000002045
+B1036484540490N00617053EA0000002051
+B1036504540489N00617037EA0000002056
+B1036524540495N00617025EA0000002060
+B1036544540506N00617023EA0000002063
+B1036564540516N00617026EA0000002067
+B1036584540525N00617029EA0000002070
+B1037004540537N00617034EA0000002070
+B1037024540543N00617040EA0000002074
+B1037044540548N00617044EA0000002079
+B1037064540552N00617052EA0000002083
+B1037084540555N00617065EA0000002085
+B1037104540549N00617076EA0000002088
+B1037124540539N00617076EA0000002091
+B1037144540530N00617070EA0000002094
+B1037164540526N00617053EA0000002097
+B1037184540529N00617035EA0000002100
+B1037204540538N00617023EA0000002104
+B1037224540549N00617017EA0000002109
+B1037244540558N00617025EA0000002113
+B1037264540557N00617038EA0000002116
+B1037284540548N00617045EA0000002120
+B1037304540538N00617042EA0000002123
+B1037324540531N00617034EA0000002126
+B1037344540525N00617020EA0000002130
+B1037364540526N00617003EA0000002134
+B1037384540534N00616991EA0000002138
+B1037404540546N00616986EA0000002141
+B1037424540554N00616995EA0000002145
+B1037444540551N00617010EA0000002149
+B1037464540540N00617014EA0000002154
+B1037484540530N00617004EA0000002158
+B1037504540523N00616984EA0000002165
+B1037524540527N00616969EA0000002169
+B1037544540536N00616956EA0000002173
+B1037564540547N00616951EA0000002178
+B1037584540554N00616958EA0000002182
+B1038004540555N00616969EA0000002185
+B1038024540548N00616980EA0000002187
+B1038044540537N00616984EA0000002191
+B1038064540529N00616983EA0000002195
+B1038094540519N00616983EA0000002199
+B1038114540509N00616983EA0000002204
+B1038134540501N00616983EA0000002209
+B1038154540493N00616982EA0000002212
+B1038174540483N00616983EA0000002213
+B1038194540472N00616980EA0000002215
+B1038214540463N00616973EA0000002218
+B1038234540455N00616963EA0000002219
+B1038254540445N00616952EA0000002220
+B1038274540436N00616940EA0000002220
+B1038294540428N00616928EA0000002220
+B1038314540419N00616917EA0000002220
+B1038334540411N00616905EA0000002219
+B1038354540403N00616893EA0000002216
+B1038374540393N00616879EA0000002213
+B1038394540383N00616865EA0000002211
+B1038414540375N00616853EA0000002208
+B1038434540366N00616843EA0000002204
+B1038454540357N00616830EA0000002199
+B1038474540348N00616816EA0000002196
+B1038494540339N00616805EA0000002190
+B1038514540328N00616792EA0000002184
+B1038534540319N00616773EA0000002180
+B1038554540310N00616756EA0000002177
+B1038574540301N00616741EA0000002172
+B1038594540292N00616724EA0000002167
+B1039014540283N00616707EA0000002163
+B1039034540272N00616693EA0000002160
+B1039054540262N00616679EA0000002155
+B1039074540251N00616665EA0000002151
+B1039094540239N00616652EA0000002147
+B1039114540228N00616639EA0000002143
+B1039134540217N00616627EA0000002139
+B1039154540205N00616614EA0000002134
+B1039174540194N00616600EA0000002130
+B1039194540183N00616586EA0000002127
+B1039214540173N00616572EA0000002123
+B1039234540158N00616550EA0000002117
+B1039254540147N00616536EA0000002113
+B1039274540136N00616521EA0000002109
+B1039294540126N00616508EA0000002106
+B1039314540115N00616494EA0000002101
+B1039334540103N00616478EA0000002094
+B1039354540089N00616462EA0000002089
+B1039374540076N00616447EA0000002085
+B1039394540064N00616431EA0000002081
+B1039414540052N00616416EA0000002075
+B1039434540039N00616400EA0000002070
+B1039454540026N00616384EA0000002065
+B1039484540013N00616369EA0000002060
+B1039504540000N00616353EA0000002055
+B1039524539988N00616337EA0000002050
+B1039544539975N00616322EA0000002045
+B1039564539963N00616306EA0000002040
+B1039584539950N00616290EA0000002035
+B1040004539937N00616274EA0000002031
+B1040024539925N00616259EA0000002026
+B1040044539912N00616244EA0000002022
+B1040064539899N00616230EA0000002017
+B1040084539885N00616216EA0000002012
+B1040104539871N00616202EA0000002007
+B1040124539858N00616188EA0000002003
+B1040144539845N00616175EA0000001998
+B1040164539831N00616161EA0000001993
+B1040184539817N00616148EA0000001988
+B1040204539804N00616135EA0000001983
+B1040224539790N00616122EA0000001978
+B1040244539776N00616109EA0000001973
+B1040264539763N00616097EA0000001968
+B1040284539749N00616084EA0000001963
+B1040304539735N00616071EA0000001959
+B1040324539722N00616058EA0000001954
+B1040344539709N00616045EA0000001949
+B1040364539696N00616031EA0000001944
+B1040384539682N00616018EA0000001939
+B1040404539669N00616004EA0000001934
+B1040424539656N00615991EA0000001929
+B1040444539643N00615977EA0000001925
+B1040464539631N00615964EA0000001921
+B1040484539621N00615950EA0000001919
+B1040504539614N00615937EA0000001916
+B1040524539605N00615925EA0000001914
+B1040544539596N00615915EA0000001914
+B1040564539589N00615907EA0000001913
+B1040584539580N00615899EA0000001912
+B1041004539571N00615892EA0000001913
+B1041024539566N00615889EA0000001915
+B1041044539548N00615880EA0000001918
+B1041064539540N00615876EA0000001920
+B1041084539533N00615872EA0000001921
+B1041104539526N00615868EA0000001921
+B1041124539520N00615861EA0000001920
+B1041144539513N00615856EA0000001919
+B1041164539504N00615853EA0000001917
+B1041184539494N00615852EA0000001914
+B1041204539484N00615849EA0000001911
+B1041224539475N00615846EA0000001910
+B1041244539465N00615844EA0000001908
+B1041264539455N00615839EA0000001907
+B1041294539444N00615835EA0000001906
+B1041314539433N00615833EA0000001906
+B1041334539422N00615831EA0000001906
+B1041354539410N00615826EA0000001908
+B1041374539399N00615822EA0000001910
+B1041394539389N00615818EA0000001911
+B1041414539380N00615811EA0000001911
+B1041434539371N00615803EA0000001911
+B1041454539361N00615801EA0000001911
+B1041474539352N00615799EA0000001910
+B1041494539343N00615796EA0000001909
+B1041514539333N00615793EA0000001909
+B1041534539324N00615791EA0000001907
+B1041554539313N00615788EA0000001905
+B1041574539303N00615785EA0000001902
+B1041594539294N00615783EA0000001898
+B1042014539283N00615783EA0000001893
+B1042034539272N00615783EA0000001889
+B1042054539261N00615785EA0000001885
+B1042074539250N00615786EA0000001881
+B1042094539239N00615789EA0000001876
+B1042114539228N00615791EA0000001871
+B1042134539217N00615793EA0000001867
+B1042154539206N00615796EA0000001863
+B1042174539196N00615797EA0000001859
+B1042194539188N00615798EA0000001856
+B1042214539178N00615797EA0000001852
+B1042234539169N00615796EA0000001849
+B1042254539163N00615800EA0000001847
+B1042274539159N00615804EA0000001848
+B1042294539153N00615804EA0000001850
+B1042314539148N00615806EA0000001851
+B1042334539141N00615807EA0000001852
+B1042354539132N00615803EA0000001854
+B1042374539126N00615793EA0000001856
+B1042394539124N00615779EA0000001859
+B1042414539134N00615758EA0000001862
+B1042434539148N00615755EA0000001863
+B1042454539157N00615762EA0000001865
+B1042474539160N00615772EA0000001868
+B1042494539158N00615781EA0000001870
+B1042514539152N00615785EA0000001871
+B1042534539146N00615787EA0000001873
+B1042554539141N00615790EA0000001875
+B1042574539134N00615793EA0000001877
+B1042594539125N00615794EA0000001877
+B1043014539115N00615796EA0000001875
+B1043034539107N00615800EA0000001873
+B1043064539098N00615803EA0000001870
+B1043084539087N00615804EA0000001866
+B1043104539076N00615804EA0000001864
+B1043124539065N00615802EA0000001862
+B1043144539054N00615801EA0000001859
+B1043164539043N00615801EA0000001857
+B1043184539031N00615800EA0000001854
+B1043204539020N00615797EA0000001851
+B1043224539008N00615792EA0000001850
+B1043244538997N00615787EA0000001848
+B1043264538986N00615781EA0000001847
+B1043284538975N00615774EA0000001847
+B1043304538965N00615767EA0000001848
+B1043324538956N00615760EA0000001847
+B1043344538947N00615751EA0000001847
+B1043364538939N00615743EA0000001848
+B1043384538934N00615735EA0000001850
+B1043404538928N00615724EA0000001852
+B1043424538921N00615718EA0000001854
+B1043444538915N00615717EA0000001857
+B1043464538908N00615719EA0000001859
+B1043484538902N00615723EA0000001863
+B1043504538897N00615733EA0000001867
+B1043524538895N00615746EA0000001870
+B1043544538902N00615761EA0000001873
+B1043564538913N00615765EA0000001875
+B1043584538923N00615759EA0000001877
+B1044004538929N00615744EA0000001878
+B1044024538928N00615727EA0000001881
+B1044044538924N00615716EA0000001884
+B1044064538919N00615706EA0000001887
+B1044084538914N00615695EA0000001890
+B1044104538910N00615685EA0000001892
+B1044124538905N00615678EA0000001896
+B1044144538900N00615671EA0000001900
+B1044164538894N00615669EA0000001904
+B1044184538887N00615672EA0000001905
+B1044204538880N00615690EA0000001907
+B1044224538882N00615704EA0000001909
+B1044244538889N00615714EA0000001910
+B1044264538899N00615718EA0000001910
+B1044284538908N00615712EA0000001910
+B1044304538916N00615698EA0000001910
+B1044324538917N00615681EA0000001911
+B1044344538914N00615667EA0000001913
+B1044364538909N00615655EA0000001915
+B1044384538903N00615647EA0000001916
+B1044404538895N00615642EA0000001917
+B1044424538887N00615636EA0000001919
+B1044454538880N00615639EA0000001920
+B1044474538872N00615645EA0000001920
+B1044494538864N00615649EA0000001922
+B1044514538859N00615654EA0000001922
+B1044534538856N00615661EA0000001920
+B1044554538855N00615670EA0000001918
+B1044574538859N00615679EA0000001917
+B1044594538864N00615685EA0000001916
+B1045014538867N00615692EA0000001914
+B1045034538866N00615703EA0000001913
+B1045054538862N00615712EA0000001912
+B1045074538858N00615718EA0000001913
+B1045094538853N00615725EA0000001914
+B1045114538847N00615732EA0000001915
+B1045134538842N00615740EA0000001916
+B1045154538836N00615746EA0000001918
+B1045174538827N00615747EA0000001919
+B1045194538817N00615737EA0000001920
+B1045214538813N00615720EA0000001920
+B1045234538818N00615704EA0000001920
+B1045254538828N00615699EA0000001920
+B1045274538834N00615705EA0000001921
+B1045294538829N00615714EA0000001922
+B1045314538820N00615717EA0000001925
+B1045334538811N00615712EA0000001927
+B1045354538804N00615698EA0000001928
+B1045374538804N00615682EA0000001929
+B1045394538813N00615672EA0000001931
+B1045414538824N00615675EA0000001932
+B1045434538828N00615685EA0000001934
+B1045454538826N00615694EA0000001936
+B1045474538818N00615700EA0000001937
+B1045494538809N00615700EA0000001939
+B1045514538801N00615691EA0000001940
+B1045534538796N00615676EA0000001941
+B1045554538796N00615660EA0000001942
+B1045574538804N00615648EA0000001941
+B1045594538816N00615645EA0000001940
+B1046014538827N00615657EA0000001939
+B1046034538831N00615666EA0000001940
+B1046054538835N00615675EA0000001941
+B1046074538839N00615682EA0000001943
+B1046094538842N00615688EA0000001944
+B1046114538841N00615699EA0000001944
+B1046134538834N00615708EA0000001943
+B1046154538822N00615707EA0000001940
+B1046174538811N00615700EA0000001938
+B1046194538799N00615694EA0000001936
+B1046214538788N00615690EA0000001936
+B1046234538777N00615684EA0000001936
+B1046264538766N00615676EA0000001935
+B1046284538753N00615667EA0000001935
+B1046304538742N00615660EA0000001936
+B1046324538733N00615654EA0000001935
+B1046344538723N00615650EA0000001934
+B1046364538711N00615645EA0000001927
+B1046384538698N00615639EA0000001924
+B1046404538686N00615634EA0000001921
+B1046424538675N00615629EA0000001916
+B1046444538662N00615621EA0000001910
+B1046464538649N00615614EA0000001904
+B1046484538635N00615605EA0000001900
+B1046504538622N00615598EA0000001896
+B1046524538609N00615591EA0000001891
+B1046544538595N00615582EA0000001888
+B1046564538582N00615574EA0000001886
+B1046584538570N00615567EA0000001883
+B1047004538557N00615559EA0000001880
+B1047024538544N00615551EA0000001876
+B1047044538532N00615543EA0000001873
+B1047064538519N00615535EA0000001870
+B1047084538507N00615526EA0000001866
+B1047104538494N00615517EA0000001863
+B1047124538482N00615507EA0000001860
+B1047144538469N00615497EA0000001857
+B1047164538457N00615487EA0000001853
+B1047184538444N00615478EA0000001850
+B1047204538432N00615468EA0000001847
+B1047224538419N00615459EA0000001844
+B1047244538407N00615449EA0000001841
+B1047264538394N00615439EA0000001838
+B1047284538381N00615428EA0000001837
+B1047304538370N00615417EA0000001837
+B1047324538361N00615406EA0000001839
+B1047344538351N00615396EA0000001842
+B1047364538342N00615385EA0000001845
+B1047384538333N00615375EA0000001848
+B1047404538325N00615365EA0000001850
+B1047424538316N00615354EA0000001850
+B1047444538303N00615338EA0000001851
+B1047464538293N00615328EA0000001852
+B1047484538282N00615319EA0000001854
+B1047504538273N00615308EA0000001857
+B1047524538266N00615300EA0000001861
+B1047544538258N00615294EA0000001862
+B1047564538248N00615288EA0000001865
+B1047584538239N00615283EA0000001867
+B1048004538228N00615284EA0000001869
+B1048024538216N00615285EA0000001873
+B1048054538206N00615283EA0000001878
+B1048074538199N00615282EA0000001880
+B1048094538190N00615281EA0000001882
+B1048114538180N00615278EA0000001884
+B1048134538173N00615274EA0000001885
+B1048154538165N00615272EA0000001885
+B1048174538155N00615268EA0000001883
+B1048194538144N00615265EA0000001881
+B1048214538132N00615263EA0000001878
+B1048234538120N00615261EA0000001876
+B1048254538108N00615258EA0000001875
+B1048274538108N00615258EA0000001875
+B1048294538088N00615254EA0000001876
+B1048314538079N00615254EA0000001878
+B1048334538069N00615252EA0000001882
+B1048354538061N00615250EA0000001885
+B1048374538051N00615249EA0000001886
+B1048394538040N00615247EA0000001887
+B1048414538029N00615248EA0000001887
+B1048434538017N00615249EA0000001884
+B1048454538007N00615252EA0000001879
+B1048474537997N00615255EA0000001874
+B1048494537986N00615258EA0000001869
+B1048514537976N00615264EA0000001863
+B1048534537965N00615269EA0000001858
+B1048554537953N00615274EA0000001854
+B1048574537942N00615279EA0000001850
+B1048594537930N00615284EA0000001848
+B1049014537918N00615286EA0000001845
+B1049034537905N00615286EA0000001844
+B1049054537892N00615285EA0000001843
+B1049074537880N00615282EA0000001842
+B1049094537868N00615276EA0000001842
+B1049114537857N00615268EA0000001843
+B1049134537850N00615261EA0000001845
+B1049154537844N00615258EA0000001848
+B1049174537836N00615251EA0000001849
+B1049194537824N00615239EA0000001855
+B1049214537815N00615240EA0000001859
+B1049234537808N00615244EA0000001862
+B1049254537803N00615252EA0000001864
+B1049274537803N00615262EA0000001866
+B1049294537810N00615271EA0000001866
+B1049314537820N00615267EA0000001868
+B1049334537827N00615255EA0000001870
+B1049354537830N00615242EA0000001873
+B1049374537828N00615230EA0000001874
+B1049394537822N00615219EA0000001874
+B1049424537813N00615208EA0000001874
+B1049444537804N00615198EA0000001875
+B1049464537796N00615192EA0000001874
+B1049484537786N00615189EA0000001872
+B1049504537776N00615185EA0000001870
+B1049524537767N00615182EA0000001870
+B1049544537758N00615182EA0000001868
+B1049564537748N00615182EA0000001866
+B1049584537738N00615178EA0000001864
+B1050004537728N00615173EA0000001864
+B1050024537720N00615169EA0000001865
+B1050044537711N00615165EA0000001863
+B1050064537701N00615156EA0000001862
+B1050084537701N00615156EA0000001862
+B1050104537687N00615137EA0000001862
+B1050124537681N00615126EA0000001862
+B1050144537674N00615113EA0000001864
+B1050164537668N00615102EA0000001867
+B1050184537662N00615092EA0000001873
+B1050204537657N00615086EA0000001878
+B1050224537651N00615082EA0000001881
+B1050244537643N00615079EA0000001885
+B1050264537636N00615081EA0000001888
+B1050284537631N00615092EA0000001889
+B1050304537630N00615104EA0000001890
+B1050324537633N00615116EA0000001888
+B1050344537642N00615128EA0000001889
+B1050364537650N00615128EA0000001892
+B1050384537657N00615122EA0000001894
+B1050404537665N00615113EA0000001898
+B1050424537669N00615097EA0000001900
+B1050444537667N00615080EA0000001903
+B1050464537659N00615069EA0000001907
+B1050484537651N00615063EA0000001911
+B1050504537643N00615065EA0000001915
+B1050524537636N00615074EA0000001918
+B1050544537632N00615086EA0000001921
+B1050564537634N00615097EA0000001924
+B1050584537641N00615102EA0000001925
+B1051004537655N00615093EA0000001926
+B1051024537661N00615079EA0000001928
+B1051044537661N00615061EA0000001931
+B1051064537657N00615050EA0000001934
+B1051084537654N00615040EA0000001937
+B1051104537650N00615028EA0000001939
+B1051124537647N00615017EA0000001943
+B1051144537644N00615005EA0000001945
+B1051164537642N00614994EA0000001946
+B1051184537638N00614980EA0000001945
+B1051204537633N00614966EA0000001943
+B1051234537629N00614950EA0000001940
+B1051254537625N00614934EA0000001937
+B1051274537619N00614918EA0000001934
+B1051294537613N00614903EA0000001931
+B1051314537606N00614889EA0000001928
+B1051334537599N00614875EA0000001925
+B1051354537592N00614861EA0000001923
+B1051374537584N00614846EA0000001922
+B1051394537576N00614832EA0000001923
+B1051414537571N00614819EA0000001924
+B1051434537564N00614806EA0000001924
+B1051454537557N00614793EA0000001926
+B1051474537551N00614781EA0000001928
+B1051494537545N00614767EA0000001929
+B1051514537540N00614753EA0000001931
+B1051534537534N00614741EA0000001934
+B1051554537530N00614729EA0000001935
+B1051574537525N00614715EA0000001935
+B1051594537520N00614701EA0000001935
+B1052014537513N00614688EA0000001936
+B1052034537507N00614677EA0000001935
+B1052054537500N00614665EA0000001933
+B1052074537491N00614653EA0000001929
+B1052094537481N00614641EA0000001926
+B1052114537472N00614628EA0000001923
+B1052134537464N00614617EA0000001921
+B1052154537456N00614605EA0000001918
+B1052174537448N00614593EA0000001917
+B1052194537439N00614579EA0000001916
+B1052214537432N00614569EA0000001917
+B1052234537425N00614559EA0000001915
+B1052254537416N00614549EA0000001916
+B1052274537409N00614539EA0000001919
+B1052294537404N00614528EA0000001921
+B1052314537397N00614515EA0000001924
+B1052334537393N00614508EA0000001928
+B1052354537389N00614505EA0000001937
+B1052374537379N00614497EA0000001949
+B1052394537375N00614504EA0000001956
+B1052414537374N00614519EA0000001963
+B1052434537379N00614531EA0000001969
+B1052454537390N00614535EA0000001973
+B1052474537402N00614531EA0000001977
+B1052494537409N00614521EA0000001982
+B1052514537411N00614505EA0000001989
+B1052534537410N00614492EA0000001997
+B1052554537405N00614487EA0000002004
+B1052584537398N00614490EA0000002009
+B1053004537395N00614503EA0000002015
+B1053024537399N00614514EA0000002020
+B1053044537410N00614519EA0000002024
+B1053064537424N00614516EA0000002028
+B1053084537433N00614501EA0000002032
+B1053104537434N00614485EA0000002036
+B1053124537431N00614472EA0000002042
+B1053144537425N00614465EA0000002047
+B1053164537418N00614464EA0000002053
+B1053184537413N00614473EA0000002056
+B1053204537413N00614485EA0000002059
+B1053224537418N00614498EA0000002062
+B1053244537430N00614501EA0000002065
+B1053264537442N00614494EA0000002068
+B1053284537448N00614481EA0000002072
+B1053304537451N00614465EA0000002076
+B1053324537450N00614452EA0000002081
+B1053344537446N00614439EA0000002086
+B1053364537437N00614432EA0000002090
+B1053384537430N00614436EA0000002092
+B1053404537427N00614447EA0000002094
+B1053424537432N00614459EA0000002096
+B1053444537441N00614468EA0000002098
+B1053464537454N00614468EA0000002099
+B1053484537467N00614456EA0000002100
+B1053504537469N00614438EA0000002102
+B1053524537462N00614424EA0000002107
+B1053544537458N00614414EA0000002113
+B1053564537457N00614402EA0000002116
+B1053584537461N00614384EA0000002120
+B1054004537472N00614370EA0000002126
+B1054024537484N00614368EA0000002132
+B1054044537494N00614373EA0000002138
+B1054064537497N00614384EA0000002142
+B1054084537495N00614394EA0000002148
+B1054104537490N00614399EA0000002153
+B1054124537479N00614395EA0000002156
+B1054144537471N00614383EA0000002161
+B1054164537476N00614358EA0000002165
+B1054184537489N00614349EA0000002168
+B1054204537500N00614356EA0000002172
+B1054224537499N00614367EA0000002176
+B1054244537488N00614373EA0000002179
+B1054264537479N00614360EA0000002184
+B1054284537480N00614340EA0000002186
+B1054304537492N00614327EA0000002188
+B1054324537505N00614331EA0000002190
+B1054354537507N00614343EA0000002191
+B1054374537499N00614350EA0000002193
+B1054394537490N00614345EA0000002195
+B1054414537484N00614332EA0000002197
+B1054434537484N00614312EA0000002191
+B1054454537497N00614301EA0000002189
+B1054474537510N00614312EA0000002188
+B1054494537507N00614327EA0000002187
+B1054514537495N00614329EA0000002187
+B1054534537486N00614326EA0000002189
+B1054554537478N00614325EA0000002188
+B1054574537468N00614320EA0000002186
+B1054594537457N00614313EA0000002186
+B1055014537449N00614307EA0000002186
+B1055034537439N00614300EA0000002185
+B1055054537428N00614293EA0000002183
+B1055074537416N00614286EA0000002181
+B1055094537403N00614277EA0000002178
+B1055114537389N00614268EA0000002176
+B1055134537377N00614262EA0000002175
+B1055154537364N00614257EA0000002172
+B1055174537351N00614247EA0000002170
+B1055194537341N00614242EA0000002169
+B1055214537332N00614237EA0000002166
+B1055234537321N00614228EA0000002162
+B1055254537307N00614215EA0000002158
+B1055274537297N00614201EA0000002154
+B1055294537288N00614188EA0000002149
+B1055314537276N00614176EA0000002144
+B1055334537264N00614161EA0000002139
+B1055354537253N00614148EA0000002135
+B1055374537242N00614136EA0000002130
+B1055394537230N00614122EA0000002126
+B1055414537218N00614109EA0000002122
+B1055434537207N00614097EA0000002120
+B1055454537199N00614086EA0000002120
+B1055474537190N00614077EA0000002119
+B1055494537178N00614067EA0000002118
+B1055514537167N00614056EA0000002118
+B1055534537159N00614045EA0000002120
+B1055554537147N00614030EA0000002124
+B1055574537138N00614019EA0000002126
+B1055594537128N00614009EA0000002127
+B1056014537117N00613997EA0000002126
+B1056034537107N00613983EA0000002125
+B1056054537097N00613969EA0000002125
+B1056074537088N00613954EA0000002124
+B1056094537079N00613939EA0000002123
+B1056114537067N00613925EA0000002121
+B1056144537056N00613910EA0000002120
+B1056164537046N00613897EA0000002120
+B1056184537038N00613886EA0000002120
+B1056204537031N00613872EA0000002122
+B1056224537024N00613860EA0000002128
+B1056244537016N00613849EA0000002133
+B1056264537009N00613838EA0000002137
+B1056284537005N00613825EA0000002141
+B1056304537002N00613811EA0000002143
+B1056324536997N00613798EA0000002144
+B1056344536989N00613785EA0000002145
+B1056364536982N00613773EA0000002145
+B1056384536977N00613760EA0000002145
+B1056404536971N00613746EA0000002144
+B1056424536965N00613731EA0000002144
+B1056444536959N00613715EA0000002144
+B1056464536953N00613701EA0000002145
+B1056484536947N00613687EA0000002144
+B1056504536940N00613674EA0000002142
+B1056524536933N00613661EA0000002139
+B1056544536925N00613647EA0000002136
+B1056564536917N00613635EA0000002134
+B1056584536908N00613625EA0000002132
+B1057004536900N00613615EA0000002131
+B1057024536892N00613607EA0000002132
+B1057044536884N00613601EA0000002135
+B1057064536878N00613592EA0000002137
+B1057084536870N00613582EA0000002141
+B1057104536864N00613574EA0000002146
+B1057124536858N00613565EA0000002149
+B1057144536852N00613557EA0000002152
+B1057164536845N00613546EA0000002156
+B1057184536839N00613535EA0000002161
+B1057204536837N00613524EA0000002165
+B1057224536836N00613510EA0000002167
+B1057244536835N00613495EA0000002168
+B1057264536831N00613482EA0000002168
+B1057284536825N00613470EA0000002166
+B1057304536817N00613457EA0000002163
+B1057324536810N00613442EA0000002161
+B1057344536799N00613423EA0000002159
+B1057364536792N00613412EA0000002156
+B1057384536785N00613400EA0000002153
+B1057404536779N00613388EA0000002151
+B1057424536771N00613374EA0000002149
+B1057444536763N00613361EA0000002147
+B1057464536756N00613346EA0000002145
+B1057484536749N00613332EA0000002145
+B1057504536743N00613319EA0000002145
+B1057524536738N00613306EA0000002147
+B1057554536732N00613293EA0000002148
+B1057574536727N00613280EA0000002147
+B1057594536720N00613266EA0000002146
+B1058014536712N00613250EA0000002145
+B1058034536705N00613235EA0000002144
+B1058054536698N00613221EA0000002144
+B1058074536692N00613210EA0000002145
+B1058094536685N00613200EA0000002144
+B1058114536678N00613186EA0000002145
+B1058134536669N00613173EA0000002147
+B1058154536662N00613162EA0000002149
+B1058174536656N00613148EA0000002149
+B1058194536648N00613131EA0000002151
+B1058214536640N00613115EA0000002155
+B1058234536636N00613104EA0000002162
+B1058254536631N00613094EA0000002169
+B1058274536624N00613083EA0000002175
+B1058294536617N00613083EA0000002183
+B1058314536610N00613088EA0000002190
+B1058334536605N00613094EA0000002197
+B1058354536603N00613106EA0000002202
+B1058374536607N00613117EA0000002206
+B1058394536614N00613127EA0000002208
+B1058414536625N00613131EA0000002211
+B1058434536637N00613126EA0000002214
+B1058454536645N00613115EA0000002215
+B1058474536649N00613099EA0000002215
+B1058494536649N00613077EA0000002217
+B1058514536647N00613058EA0000002221
+B1058534536645N00613049EA0000002227
+B1058554536644N00613040EA0000002232
+B1058574536640N00613024EA0000002238
+B1058594536635N00613008EA0000002247
+B1059014536629N00613002EA0000002254
+B1059034536622N00613000EA0000002259
+B1059054536611N00612999EA0000002266
+B1059074536604N00613010EA0000002273
+B1059094536605N00613021EA0000002279
+B1059114536616N00613030EA0000002288
+B1059134536621N00613028EA0000002292
+B1059154536629N00613021EA0000002300
+B1059174536638N00613002EA0000002310
+B1059194536641N00612985EA0000002316
+B1059214536643N00612965EA0000002323
+B1059234536642N00612947EA0000002330
+B1059254536639N00612932EA0000002335
+B1059274536635N00612918EA0000002339
+B1059294536628N00612906EA0000002341
+B1059314536618N00612901EA0000002341
+B1059344536610N00612905EA0000002337
+B1059364536603N00612910EA0000002333
+B1059384536595N00612913EA0000002327
+B1059404536585N00612911EA0000002322
+B1059424536577N00612897EA0000002317
+B1059444536579N00612879EA0000002312
+B1059464536590N00612866EA0000002305
+B1059484536604N00612866EA0000002299
+B1059504536614N00612875EA0000002295
+B1059524536624N00612883EA0000002293
+B1059544536634N00612889EA0000002293
+B1059564536645N00612896EA0000002294
+B1059584536656N00612900EA0000002296
+B1100004536666N00612903EA0000002300
+B1100024536675N00612906EA0000002304
+B1100044536684N00612909EA0000002307
+B1100064536696N00612909EA0000002311
+B1100084536706N00612904EA0000002315
+B1100104536716N00612894EA0000002319
+B1100124536723N00612882EA0000002323
+B1100144536723N00612869EA0000002327
+B1100164536720N00612856EA0000002328
+B1100184536716N00612839EA0000002331
+B1100204536711N00612825EA0000002335
+B1100224536707N00612816EA0000002339
+B1100244536703N00612806EA0000002341
+B1100264536697N00612795EA0000002344
+B1100284536693N00612784EA0000002346
+B1100304536688N00612773EA0000002346
+B1100324536683N00612764EA0000002346
+B1100344536678N00612754EA0000002344
+B1100364536672N00612743EA0000002342
+B1100384536666N00612730EA0000002338
+B1100404536660N00612717EA0000002333
+B1100424536653N00612705EA0000002329
+B1100444536647N00612694EA0000002325
+B1100464536641N00612681EA0000002320
+B1100484536634N00612670EA0000002315
+B1100504536626N00612658EA0000002308
+B1100524536617N00612645EA0000002302
+B1100544536607N00612632EA0000002295
+B1100564536596N00612617EA0000002289
+B1100584536580N00612595EA0000002282
+B1101004536571N00612583EA0000002278
+B1101024536561N00612570EA0000002276
+B1101044536555N00612560EA0000002276
+B1101064536548N00612550EA0000002278
+B1101084536540N00612539EA0000002283
+B1101104536535N00612532EA0000002292
+B1101124536529N00612523EA0000002299
+B1101154536524N00612512EA0000002307
+B1101174536520N00612503EA0000002315
+B1101194536517N00612495EA0000002320
+B1101214536512N00612488EA0000002324
+B1101234536506N00612480EA0000002326
+B1101254536500N00612471EA0000002329
+B1101274536494N00612463EA0000002330
+B1101294536487N00612454EA0000002330
+B1101314536480N00612442EA0000002329
+B1101334536474N00612430EA0000002331
+B1101354536468N00612420EA0000002334
+B1101374536465N00612411EA0000002335
+B1101394536462N00612400EA0000002335
+B1101414536456N00612389EA0000002334
+B1101434536450N00612378EA0000002334
+B1101454536443N00612366EA0000002334
+B1101474536435N00612355EA0000002333
+B1101494536428N00612343EA0000002332
+B1101514536420N00612331EA0000002330
+B1101534536412N00612319EA0000002328
+B1101554536404N00612306EA0000002325
+B1101574536395N00612293EA0000002322
+B1101594536385N00612280EA0000002317
+B1102014536374N00612264EA0000002315
+B1102034536364N00612250EA0000002315
+B1102054536357N00612239EA0000002318
+B1102074536352N00612228EA0000002324
+B1102094536346N00612218EA0000002330
+B1102114536339N00612207EA0000002335
+B1102134536332N00612196EA0000002340
+B1102154536328N00612184EA0000002345
+B1102174536326N00612170EA0000002348
+B1102194536322N00612158EA0000002350
+B1102214536315N00612147EA0000002351
+B1102234536308N00612136EA0000002351
+B1102254536301N00612124EA0000002349
+B1102274536293N00612112EA0000002349
+B1102294536286N00612100EA0000002349
+B1102314536276N00612080EA0000002347
+B1102334536268N00612070EA0000002347
+B1102354536261N00612060EA0000002346
+B1102374536257N00612054EA0000002345
+B1102394536245N00612037EA0000002344
+B1102414536236N00612027EA0000002343
+B1102434536227N00612015EA0000002343
+B1102454536219N00612003EA0000002345
+B1102474536212N00611993EA0000002345
+B1102494536204N00611985EA0000002344
+B1102514536194N00611974EA0000002340
+B1102534536184N00611960EA0000002336
+B1102564536174N00611945EA0000002333
+B1102584536164N00611930EA0000002330
+B1103004536156N00611913EA0000002327
+B1103024536147N00611896EA0000002325
+B1103044536140N00611884EA0000002325
+B1103064536135N00611874EA0000002322
+B1103084536127N00611862EA0000002319
+B1103104536117N00611848EA0000002318
+B1103124536109N00611836EA0000002316
+B1103144536100N00611821EA0000002313
+B1103164536092N00611804EA0000002312
+B1103184536084N00611788EA0000002310
+B1103204536075N00611771EA0000002305
+B1103224536065N00611751EA0000002303
+B1103244536055N00611733EA0000002300
+B1103264536045N00611715EA0000002296
+B1103284536036N00611696EA0000002292
+B1103304536026N00611675EA0000002290
+B1103324536018N00611656EA0000002288
+B1103344536011N00611634EA0000002285
+B1103364536003N00611611EA0000002282
+B1103384535996N00611587EA0000002281
+B1103404535989N00611565EA0000002281
+B1103424535982N00611545EA0000002282
+B1103444535977N00611525EA0000002284
+B1103464535971N00611509EA0000002284
+B1103484535963N00611493EA0000002283
+B1103504535953N00611474EA0000002279
+B1103524535945N00611451EA0000002278
+B1103544535937N00611430EA0000002277
+B1103564535930N00611411EA0000002274
+B1103584535921N00611388EA0000002269
+B1104004535911N00611365EA0000002267
+B1104024535903N00611345EA0000002265
+B1104044535893N00611328EA0000002263
+B1104064535883N00611312EA0000002263
+B1104084535876N00611299EA0000002261
+B1104104535867N00611284EA0000002259
+B1104124535857N00611269EA0000002258
+B1104144535843N00611245EA0000002254
+B1104164535833N00611227EA0000002253
+B1104184535825N00611210EA0000002253
+B1104204535819N00611192EA0000002251
+B1104224535813N00611173EA0000002248
+B1104244535806N00611153EA0000002247
+B1104264535801N00611134EA0000002244
+B1104284535796N00611115EA0000002241
+B1104304535789N00611095EA0000002239
+B1104324535783N00611076EA0000002237
+B1104344535778N00611057EA0000002235
+B1104374535772N00611038EA0000002233
+B1104394535768N00611018EA0000002230
+B1104414535763N00610998EA0000002226
+B1104434535759N00610976EA0000002223
+B1104454535754N00610955EA0000002220
+B1104474535750N00610935EA0000002216
+B1104494535744N00610913EA0000002212
+B1104514535738N00610893EA0000002209
+B1104534535734N00610874EA0000002207
+B1104554535731N00610855EA0000002203
+B1104574535726N00610833EA0000002200
+B1104594535721N00610812EA0000002199
+B1105014535721N00610812EA0000002200
+B1105034535717N00610778EA0000002203
+B1105054535715N00610765EA0000002208
+B1105074535712N00610749EA0000002214
+B1105094535708N00610734EA0000002218
+B1105114535705N00610719EA0000002221
+B1105134535702N00610701EA0000002222
+B1105154535698N00610682EA0000002224
+B1105174535695N00610664EA0000002227
+B1105194535691N00610647EA0000002228
+B1105214535687N00610629EA0000002232
+B1105234535682N00610611EA0000002235
+B1105254535678N00610596EA0000002238
+B1105274535674N00610580EA0000002238
+B1105294535669N00610562EA0000002238
+B1105314535663N00610544EA0000002239
+B1105334535656N00610526EA0000002240
+B1105354535651N00610508EA0000002240
+B1105374535646N00610489EA0000002241
+B1105394535641N00610471EA0000002242
+B1105414535636N00610453EA0000002243
+B1105434535631N00610434EA0000002243
+B1105454535627N00610413EA0000002244
+B1105474535624N00610391EA0000002246
+B1105494535620N00610371EA0000002249
+B1105514535617N00610347EA0000002251
+B1105534535615N00610329EA0000002250
+B1105554535613N00610311EA0000002251
+B1105574535611N00610297EA0000002251
+B1105594535608N00610282EA0000002249
+B1106014535604N00610263EA0000002246
+B1106034535602N00610246EA0000002246
+B1106054535600N00610231EA0000002243
+B1106074535597N00610215EA0000002240
+B1106094535593N00610197EA0000002235
+B1106124535590N00610178EA0000002232
+B1106144535586N00610162EA0000002228
+B1106164535581N00610148EA0000002223
+B1106184535576N00610131EA0000002218
+B1106204535571N00610115EA0000002214
+B1106224535568N00610099EA0000002209
+B1106244535568N00610083EA0000002204
+B1106264535567N00610066EA0000002198
+B1106284535563N00610049EA0000002194
+B1106304535558N00610031EA0000002190
+B1106324535555N00610023EA0000002188
+B1106344535549N00610000EA0000002185
+B1106364535545N00609984EA0000002180
+B1106384535540N00609966EA0000002177
+B1106404535537N00609949EA0000002175
+B1106424535532N00609934EA0000002172
+B1106444535527N00609917EA0000002167
+B1106464535519N00609899EA0000002165
+B1106484535513N00609882EA0000002163
+B1106504535508N00609865EA0000002160
+B1106524535503N00609845EA0000002158
+B1106544535499N00609825EA0000002158
+B1106564535495N00609808EA0000002156
+B1106584535491N00609790EA0000002155
+B1107004535487N00609770EA0000002154
+B1107024535486N00609752EA0000002154
+B1107044535484N00609735EA0000002153
+B1107064535482N00609715EA0000002150
+B1107084535480N00609692EA0000002149
+B1107104535478N00609672EA0000002149
+B1107124535477N00609653EA0000002147
+B1107144535475N00609632EA0000002144
+B1107164535473N00609608EA0000002143
+B1107184535473N00609588EA0000002142
+B1107204535473N00609568EA0000002138
+B1107224535472N00609545EA0000002135
+B1107244535471N00609513EA0000002130
+B1107264535471N00609492EA0000002125
+B1107284535470N00609470EA0000002121
+B1107304535470N00609447EA0000002118
+B1107324535471N00609425EA0000002115
+B1107344535471N00609404EA0000002113
+B1107364535471N00609382EA0000002110
+B1107384535470N00609360EA0000002107
+B1107404535471N00609339EA0000002104
+B1107424535471N00609317EA0000002101
+B1107444535470N00609295EA0000002099
+B1107464535469N00609273EA0000002098
+B1107494535467N00609253EA0000002096
+B1107514535466N00609231EA0000002095
+B1107534535465N00609209EA0000002094
+B1107554535464N00609188EA0000002093
+B1107574535462N00609167EA0000002091
+B1107594535461N00609146EA0000002088
+B1108014535461N00609125EA0000002086
+B1108034535459N00609104EA0000002084
+B1108054535459N00609084EA0000002084
+B1108074535459N00609065EA0000002084
+B1108094535459N00609048EA0000002082
+B1108114535459N00609031EA0000002078
+B1108134535460N00609022EA0000002076
+B1108154535462N00608991EA0000002071
+B1108174535463N00608972EA0000002069
+B1108194535463N00608955EA0000002066
+B1108214535464N00608936EA0000002062
+B1108234535466N00608917EA0000002060
+B1108254535468N00608898EA0000002057
+B1108274535469N00608880EA0000002055
+B1108294535470N00608863EA0000002053
+B1108314535471N00608845EA0000002051
+B1108334535470N00608827EA0000002048
+B1108354535469N00608808EA0000002046
+B1108374535468N00608789EA0000002044
+B1108394535467N00608771EA0000002042
+B1108414535466N00608753EA0000002040
+B1108434535464N00608734EA0000002038
+B1108454535463N00608716EA0000002035
+B1108474535461N00608697EA0000002032
+B1108494535460N00608679EA0000002030
+B1108514535457N00608661EA0000002029
+B1108534535454N00608644EA0000002026
+B1108554535451N00608625EA0000002023
+B1108574535449N00608606EA0000002022
+B1108594535447N00608589EA0000002020
+B1109014535444N00608571EA0000002018
+B1109034535442N00608552EA0000002016
+B1109054535439N00608525EA0000002014
+B1109074535436N00608506EA0000002012
+B1109094535433N00608489EA0000002010
+B1109114535431N00608471EA0000002007
+B1109134535429N00608452EA0000002006
+B1109154535428N00608434EA0000002005
+B1109174535427N00608416EA0000002003
+B1109194535426N00608399EA0000002001
+B1109214535425N00608380EA0000002000
+B1109234535426N00608362EA0000001999
+B1109254535426N00608345EA0000001997
+B1109284535425N00608327EA0000001996
+B1109304535425N00608309EA0000001994
+B1109324535425N00608291EA0000001993
+B1109344535424N00608274EA0000001992
+B1109364535424N00608256EA0000001990
+B1109384535424N00608238EA0000001988
+B1109404535423N00608219EA0000001985
+B1109424535423N00608197EA0000001982
+B1109444535423N00608176EA0000001980
+B1109464535422N00608156EA0000001977
+B1109484535423N00608135EA0000001973
+B1109504535424N00608113EA0000001970
+B1109524535425N00608091EA0000001968
+B1109544535426N00608070EA0000001965
+B1109564535428N00608048EA0000001962
+B1109584535431N00608026EA0000001960
+B1110004535434N00608004EA0000001957
+B1110024535436N00607984EA0000001954
+B1110044535439N00607962EA0000001949
+B1110064535442N00607940EA0000001946
+B1110084535446N00607919EA0000001943
+B1110104535448N00607899EA0000001940
+B1110124535450N00607879EA0000001936
+B1110144535453N00607857EA0000001932
+B1110164535455N00607835EA0000001929
+B1110184535456N00607814EA0000001925
+B1110204535457N00607792EA0000001920
+B1110224535458N00607768EA0000001917
+B1110244535458N00607746EA0000001915
+B1110264535458N00607724EA0000001913
+B1110284535460N00607702EA0000001909
+B1110304535463N00607680EA0000001906
+B1110324535467N00607658EA0000001905
+B1110344535469N00607639EA0000001903
+B1110364535471N00607619EA0000001899
+B1110384535474N00607598EA0000001895
+B1110404535479N00607567EA0000001891
+B1110424535482N00607549EA0000001887
+B1110444535485N00607529EA0000001882
+B1110464535488N00607509EA0000001879
+B1110484535491N00607490EA0000001875
+B1110504535494N00607472EA0000001871
+B1110524535497N00607454EA0000001866
+B1110544535500N00607435EA0000001862
+B1110564535504N00607418EA0000001857
+B1110584535509N00607399EA0000001852
+B1111004535513N00607379EA0000001849
+B1111024535518N00607363EA0000001847
+B1111044535522N00607346EA0000001844
+B1111074535527N00607326EA0000001841
+B1111094535532N00607306EA0000001840
+B1111114535535N00607289EA0000001839
+B1111134535539N00607271EA0000001836
+B1111154535544N00607251EA0000001834
+B1111174535549N00607232EA0000001834
+B1111194535554N00607215EA0000001832
+B1111214535559N00607200EA0000001828
+B1111234535563N00607182EA0000001827
+B1111254535566N00607167EA0000001826
+B1111274535568N00607153EA0000001823
+B1111294535571N00607136EA0000001820
+B1111314535574N00607120EA0000001819
+B1111334535576N00607107EA0000001816
+B1111354535579N00607091EA0000001812
+B1111374535582N00607074EA0000001810
+B1111394535585N00607060EA0000001808
+B1111414535588N00607048EA0000001804
+B1111434535591N00607033EA0000001799
+B1111454535593N00607015EA0000001794
+B1111474535596N00606994EA0000001790
+B1111494535599N00606978EA0000001788
+B1111514535601N00606962EA0000001785
+B1111534535604N00606943EA0000001782
+B1111554535609N00606925EA0000001780
+B1111574535615N00606909EA0000001778
+B1111594535621N00606893EA0000001775
+B1112014535626N00606876EA0000001773
+B1112034535632N00606859EA0000001771
+B1112054535639N00606844EA0000001771
+B1112074535643N00606829EA0000001770
+B1112094535648N00606814EA0000001767
+B1112114535654N00606798EA0000001766
+B1112134535659N00606784EA0000001765
+B1112154535666N00606773EA0000001765
+B1112174535673N00606763EA0000001765
+B1112194535679N00606752EA0000001767
+B1112214535683N00606741EA0000001771
+B1112234535685N00606733EA0000001771
+B1112254535689N00606721EA0000001773
+B1112274535696N00606718EA0000001777
+B1112294535702N00606720EA0000001779
+B1112314535710N00606724EA0000001779
+B1112334535717N00606734EA0000001780
+B1112354535720N00606749EA0000001781
+B1112374535719N00606762EA0000001783
+B1112394535715N00606773EA0000001788
+B1112414535710N00606784EA0000001794
+B1112434535702N00606792EA0000001800
+B1112464535693N00606791EA0000001805
+B1112484535686N00606783EA0000001808
+B1112504535685N00606770EA0000001812
+B1112524535690N00606760EA0000001816
+B1112544535696N00606758EA0000001819
+B1112564535704N00606761EA0000001821
+B1112584535712N00606770EA0000001824
+B1113004535715N00606785EA0000001827
+B1113024535713N00606799EA0000001832
+B1113044535710N00606809EA0000001840
+B1113064535704N00606817EA0000001846
+B1113084535695N00606822EA0000001852
+B1113104535687N00606820EA0000001856
+B1113124535681N00606815EA0000001859
+B1113144535678N00606807EA0000001861
+B1113164535679N00606796EA0000001862
+B1113184535690N00606788EA0000001863
+B1113204535699N00606791EA0000001864
+B1113224535706N00606799EA0000001865
+B1113244535714N00606806EA0000001866
+B1113264535723N00606813EA0000001869
+B1113284535729N00606819EA0000001875
+B1113304535733N00606823EA0000001880
+B1113324535739N00606833EA0000001885
+B1113344535738N00606848EA0000001890
+B1113364535727N00606862EA0000001895
+B1113384535715N00606862EA0000001901
+B1113404535707N00606852EA0000001907
+B1113424535706N00606836EA0000001913
+B1113444535714N00606829EA0000001919
+B1113464535722N00606829EA0000001925
+B1113484535728N00606840EA0000001932
+B1113504535727N00606855EA0000001936
+B1113524535719N00606869EA0000001941
+B1113544535705N00606873EA0000001946
+B1113564535693N00606866EA0000001952
+B1113584535686N00606854EA0000001957
+B1114004535689N00606839EA0000001962
+B1114024535695N00606832EA0000001964
+B1114044535704N00606835EA0000001967
+B1114064535707N00606851EA0000001969
+B1114084535698N00606866EA0000001973
+B1114104535686N00606868EA0000001978
+B1114124535677N00606862EA0000001980
+B1114144535670N00606855EA0000001981
+B1114164535666N00606844EA0000001981
+B1114184535666N00606831EA0000001980
+B1114204535675N00606820EA0000001980
+B1114224535687N00606821EA0000001979
+B1114254535694N00606828EA0000001980
+B1114274535699N00606835EA0000001982
+B1114294535703N00606842EA0000001981
+B1114314535710N00606853EA0000001982
+B1114334535720N00606864EA0000001984
+B1114354535728N00606872EA0000001988
+B1114374535735N00606881EA0000001995
+B1114394535739N00606893EA0000002003
+B1114414535736N00606908EA0000002008
+B1114434535730N00606924EA0000002014
+B1114454535720N00606933EA0000002021
+B1114474535708N00606934EA0000002027
+B1114494535700N00606927EA0000002034
+B1114514535699N00606916EA0000002040
+B1114534535702N00606907EA0000002046
+B1114554535707N00606901EA0000002055
+B1114574535711N00606898EA0000002062
+B1114594535718N00606898EA0000002069
+B1115014535726N00606906EA0000002074
+B1115034535730N00606923EA0000002079
+B1115054535727N00606939EA0000002085
+B1115074535721N00606951EA0000002093
+B1115094535712N00606956EA0000002101
+B1115114535702N00606958EA0000002108
+B1115134535693N00606957EA0000002114
+B1115154535685N00606950EA0000002120
+B1115174535683N00606939EA0000002125
+B1115194535685N00606929EA0000002131
+B1115214535692N00606924EA0000002135
+B1115234535698N00606920EA0000002140
+B1115254535707N00606917EA0000002144
+B1115274535717N00606915EA0000002150
+B1115294535726N00606917EA0000002156
+B1115314535731N00606927EA0000002162
+B1115334535732N00606941EA0000002169
+B1115354535732N00606956EA0000002176
+B1115374535728N00606972EA0000002182
+B1115394535720N00606982EA0000002187
+B1115414535708N00606984EA0000002189
+B1115434535703N00606975EA0000002189
+B1115454535702N00606964EA0000002192
+B1115474535703N00606954EA0000002195
+B1115494535704N00606944EA0000002199
+B1115514535707N00606933EA0000002203
+B1115534535712N00606923EA0000002207
+B1115554535718N00606914EA0000002213
+B1115574535724N00606912EA0000002217
+B1115594535732N00606911EA0000002220
+B1116014535743N00606913EA0000002226
+B1116034535747N00606923EA0000002232
+B1116064535749N00606937EA0000002238
+B1116084535747N00606948EA0000002243
+B1116104535740N00606956EA0000002248
+B1116124535731N00606960EA0000002251
+B1116144535720N00606961EA0000002252
+B1116164535711N00606952EA0000002253
+B1116184535707N00606938EA0000002256
+B1116204535707N00606925EA0000002258
+B1116224535708N00606912EA0000002260
+B1116244535712N00606900EA0000002261
+B1116264535718N00606891EA0000002261
+B1116284535727N00606886EA0000002261
+B1116304535732N00606885EA0000002262
+B1116324535747N00606889EA0000002265
+B1116344535755N00606893EA0000002269
+B1116364535763N00606894EA0000002276
+B1116384535771N00606894EA0000002283
+B1116404535777N00606892EA0000002290
+B1116424535783N00606893EA0000002295
+B1116444535789N00606900EA0000002298
+B1116464535793N00606913EA0000002300
+B1116484535788N00606929EA0000002301
+B1116504535776N00606941EA0000002304
+B1116524535765N00606940EA0000002308
+B1116544535756N00606935EA0000002313
+B1116564535748N00606929EA0000002317
+B1116584535741N00606920EA0000002321
+B1117004535736N00606910EA0000002325
+B1117024535733N00606898EA0000002329
+B1117044535733N00606886EA0000002334
+B1117064535736N00606876EA0000002338
+B1117084535744N00606870EA0000002341
+B1117104535753N00606876EA0000002345
+B1117124535758N00606889EA0000002349
+B1117144535758N00606903EA0000002353
+B1117164535751N00606914EA0000002357
+B1117184535740N00606918EA0000002362
+B1117204535730N00606914EA0000002367
+B1117224535721N00606900EA0000002371
+B1117244535720N00606886EA0000002373
+B1117264535725N00606873EA0000002376
+B1117284535731N00606865EA0000002378
+B1117304535737N00606858EA0000002380
+B1117324535744N00606849EA0000002382
+B1117344535751N00606844EA0000002383
+B1117364535760N00606846EA0000002384
+B1117384535768N00606852EA0000002386
+B1117404535770N00606864EA0000002388
+B1117424535765N00606878EA0000002390
+B1117444535753N00606884EA0000002394
+B1117474535742N00606882EA0000002398
+B1117494535734N00606874EA0000002400
+B1117514535730N00606862EA0000002402
+B1117534535732N00606847EA0000002403
+B1117554535736N00606835EA0000002404
+B1117574535742N00606822EA0000002406
+B1117594535747N00606810EA0000002409
+B1118014535752N00606797EA0000002412
+B1118034535757N00606785EA0000002415
+B1118054535761N00606775EA0000002418
+B1118074535766N00606765EA0000002421
+B1118094535770N00606754EA0000002423
+B1118114535775N00606745EA0000002425
+B1118134535782N00606739EA0000002426
+B1118154535792N00606742EA0000002428
+B1118174535798N00606751EA0000002432
+B1118194535800N00606762EA0000002435
+B1118214535797N00606774EA0000002438
+B1118234535792N00606784EA0000002442
+B1118254535784N00606788EA0000002444
+B1118274535774N00606790EA0000002446
+B1118294535762N00606786EA0000002448
+B1118314535754N00606774EA0000002449
+B1118334535751N00606759EA0000002450
+B1118354535754N00606745EA0000002452
+B1118374535758N00606732EA0000002452
+B1118394535763N00606721EA0000002453
+B1118414535767N00606709EA0000002453
+B1118434535770N00606697EA0000002453
+B1118454535774N00606683EA0000002452
+B1118474535775N00606668EA0000002451
+B1118494535774N00606653EA0000002451
+B1118514535773N00606638EA0000002450
+B1118534535774N00606621EA0000002449
+B1118554535775N00606605EA0000002448
+B1118574535775N00606590EA0000002447
+B1118594535774N00606575EA0000002444
+B1119014535777N00606548EA0000002441
+B1119034535779N00606531EA0000002441
+B1119054535780N00606516EA0000002438
+B1119074535781N00606500EA0000002436
+B1119094535780N00606484EA0000002435
+B1119114535780N00606468EA0000002434
+B1119134535780N00606453EA0000002434
+B1119154535779N00606439EA0000002435
+B1119174535776N00606426EA0000002434
+B1119194535772N00606413EA0000002433
+B1119214535768N00606399EA0000002433
+B1119234535763N00606386EA0000002431
+B1119254535759N00606372EA0000002429
+B1119284535756N00606353EA0000002426
+B1119304535752N00606335EA0000002425
+B1119324535747N00606320EA0000002422
+B1119344535742N00606303EA0000002419
+B1119364535736N00606286EA0000002417
+B1119384535731N00606270EA0000002414
+B1119404535726N00606253EA0000002412
+B1119424535721N00606235EA0000002409
+B1119444535714N00606219EA0000002408
+B1119464535710N00606202EA0000002407
+B1119484535704N00606185EA0000002404
+B1119504535697N00606166EA0000002401
+B1119524535688N00606145EA0000002399
+B1119544535681N00606123EA0000002398
+B1119564535675N00606102EA0000002395
+B1119584535667N00606083EA0000002393
+B1120004535659N00606066EA0000002391
+B1120024535651N00606047EA0000002387
+B1120044535643N00606027EA0000002381
+B1120064535633N00606006EA0000002378
+B1120084535623N00605989EA0000002375
+B1120104535612N00605974EA0000002372
+B1120124535600N00605958EA0000002367
+B1120144535586N00605943EA0000002365
+B1120164535573N00605932EA0000002364
+B1120184535562N00605918EA0000002362
+B1120204535552N00605901EA0000002358
+B1120224535539N00605886EA0000002354
+B1120244535525N00605873EA0000002352
+B1120264535514N00605857EA0000002348
+B1120284535504N00605841EA0000002343
+B1120304535491N00605827EA0000002339
+B1120324535478N00605812EA0000002336
+B1120344535467N00605797EA0000002332
+B1120364535454N00605784EA0000002328
+B1120384535441N00605770EA0000002325
+B1120404535428N00605756EA0000002322
+B1120424535409N00605736EA0000002316
+B1120444535396N00605723EA0000002312
+B1120464535384N00605709EA0000002308
+B1120484535371N00605697EA0000002304
+B1120504535358N00605685EA0000002300
+B1120524535346N00605671EA0000002296
+B1120544535335N00605656EA0000002292
+B1120564535324N00605642EA0000002288
+B1120584535313N00605626EA0000002283
+B1121004535301N00605609EA0000002279
+B1121024535289N00605593EA0000002277
+B1121044535279N00605577EA0000002274
+B1121074535267N00605561EA0000002271
+B1121094535255N00605545EA0000002269
+B1121114535243N00605530EA0000002267
+B1121134535232N00605514EA0000002265
+B1121154535220N00605499EA0000002264
+B1121174535208N00605483EA0000002264
+B1121194535197N00605467EA0000002262
+B1121214535187N00605449EA0000002260
+B1121234535176N00605431EA0000002259
+B1121254535164N00605414EA0000002259
+B1121274535152N00605398EA0000002258
+B1121294535141N00605381EA0000002257
+B1121314535128N00605364EA0000002258
+B1121334535115N00605349EA0000002258
+B1121354535103N00605333EA0000002257
+B1121374535090N00605317EA0000002256
+B1121394535075N00605302EA0000002256
+B1121414535062N00605287EA0000002256
+B1121434535050N00605271EA0000002255
+B1121454535036N00605255EA0000002252
+B1121474535022N00605240EA0000002252
+B1121494535009N00605224EA0000002251
+B1121514534996N00605209EA0000002248
+B1121534534982N00605194EA0000002245
+B1121554534969N00605179EA0000002242
+B1121574534955N00605164EA0000002240
+B1121594534942N00605151EA0000002238
+B1122014534929N00605137EA0000002235
+B1122034534915N00605123EA0000002231
+B1122054534901N00605108EA0000002228
+B1122074534888N00605093EA0000002226
+B1122094534874N00605079EA0000002223
+B1122114534861N00605065EA0000002220
+B1122134534847N00605050EA0000002217
+B1122154534834N00605033EA0000002214
+B1122174534821N00605019EA0000002212
+B1122194534807N00605005EA0000002208
+B1122214534793N00604990EA0000002205
+B1122234534779N00604976EA0000002203
+B1122254534759N00604956EA0000002198
+B1122274534745N00604942EA0000002196
+B1122294534731N00604928EA0000002193
+B1122314534718N00604914EA0000002190
+B1122334534704N00604901EA0000002187
+B1122354534691N00604887EA0000002184
+B1122374534677N00604873EA0000002182
+B1122394534664N00604859EA0000002179
+B1122414534651N00604845EA0000002177
+B1122434534637N00604831EA0000002174
+B1122454534624N00604818EA0000002172
+B1122484534611N00604805EA0000002169
+B1122504534598N00604792EA0000002166
+B1122524534584N00604778EA0000002164
+B1122544534571N00604764EA0000002161
+B1122564534558N00604750EA0000002158
+B1122584534545N00604736EA0000002155
+B1123004534531N00604723EA0000002152
+B1123024534518N00604709EA0000002149
+B1123044534505N00604696EA0000002146
+B1123064534492N00604683EA0000002143
+B1123084534478N00604671EA0000002140
+B1123104534465N00604658EA0000002136
+B1123124534452N00604645EA0000002133
+B1123144534445N00604638EA0000002131
+B1123164534426N00604619EA0000002128
+B1123184534413N00604607EA0000002125
+B1123204534400N00604594EA0000002123
+B1123224534386N00604582EA0000002120
+B1123244534373N00604570EA0000002118
+B1123264534359N00604558EA0000002115
+B1123284534346N00604545EA0000002113
+B1123304534333N00604532EA0000002110
+B1123324534320N00604519EA0000002108
+B1123344534307N00604507EA0000002105
+B1123364534294N00604495EA0000002102
+B1123384534280N00604483EA0000002099
+B1123404534266N00604471EA0000002096
+B1123424534252N00604460EA0000002093
+B1123444534239N00604448EA0000002091
+B1123464534226N00604437EA0000002089
+B1123484534213N00604426EA0000002086
+B1123504534200N00604414EA0000002083
+B1123524534187N00604402EA0000002079
+B1123544534174N00604388EA0000002076
+B1123564534162N00604376EA0000002072
+B1123584534149N00604363EA0000002070
+B1124004534137N00604350EA0000002067
+B1124024534125N00604337EA0000002065
+B1124044534113N00604326EA0000002063
+B1124064534094N00604309EA0000002060
+B1124084534080N00604299EA0000002059
+B1124104534067N00604288EA0000002057
+B1124124534052N00604277EA0000002055
+B1124144534039N00604267EA0000002054
+B1124164534025N00604256EA0000002052
+B1124184534012N00604246EA0000002050
+B1124204533997N00604238EA0000002048
+B1124224533986N00604233EA0000002048
+B1124244533979N00604228EA0000002049
+B1124264533970N00604221EA0000002050
+B1124294533959N00604212EA0000002051
+B1124314533949N00604204EA0000002053
+B1124334533939N00604197EA0000002059
+B1124354533930N00604187EA0000002061
+B1124374533924N00604171EA0000002064
+B1124394533918N00604158EA0000002066
+B1124414533912N00604146EA0000002066
+B1124434533908N00604129EA0000002067
+B1124454533911N00604111EA0000002069
+B1124474533921N00604101EA0000002070
+B1124494533932N00604100EA0000002071
+B1124514533942N00604104EA0000002072
+B1124534533951N00604109EA0000002074
+B1124554533958N00604112EA0000002075
+B1124574533966N00604116EA0000002077
+B1124594533972N00604122EA0000002081
+B1125014533975N00604130EA0000002086
+B1125034533978N00604136EA0000002090
+B1125054533979N00604145EA0000002092
+B1125074533974N00604156EA0000002097
+B1125094533962N00604158EA0000002101
+B1125114533953N00604148EA0000002105
+B1125134533952N00604128EA0000002109
+B1125154533961N00604114EA0000002111
+B1125174533973N00604116EA0000002114
+B1125194533979N00604122EA0000002118
+B1125214533977N00604133EA0000002124
+B1125234533973N00604138EA0000002128
+B1125254533967N00604141EA0000002131
+B1125274533955N00604139EA0000002133
+B1125294533944N00604126EA0000002136
+B1125314533943N00604107EA0000002140
+B1125334533952N00604093EA0000002143
+B1125354533964N00604091EA0000002147
+B1125374533970N00604099EA0000002151
+B1125394533970N00604107EA0000002154
+B1125414533963N00604113EA0000002157
+B1125434533950N00604109EA0000002159
+B1125454533936N00604089EA0000002162
+B1125474533937N00604069EA0000002164
+B1125494533944N00604053EA0000002167
+B1125514533954N00604050EA0000002168
+B1125534533962N00604058EA0000002170
+B1125554533962N00604068EA0000002173
+B1125574533958N00604075EA0000002177
+B1125594533955N00604082EA0000002180
+B1126014533955N00604089EA0000002183
+B1126034533953N00604095EA0000002184
+B1126054533947N00604100EA0000002184
+B1126074533937N00604104EA0000002184
+B1126104533926N00604097EA0000002185
+B1126124533916N00604082EA0000002185
+B1126144533914N00604063EA0000002183
+B1126164533921N00604051EA0000002181
+B1126184533932N00604052EA0000002179
+B1126204533936N00604058EA0000002177
+B1126224533938N00604065EA0000002176
+B1126244533938N00604072EA0000002177
+B1126264533937N00604079EA0000002178
+B1126284533936N00604088EA0000002180
+B1126304533929N00604092EA0000002181
+B1126324533920N00604092EA0000002182
+B1126344533908N00604083EA0000002181
+B1126364533901N00604067EA0000002180
+B1126384533903N00604049EA0000002178
+B1126404533913N00604038EA0000002175
+B1126424533923N00604033EA0000002173
+B1126444533931N00604033EA0000002172
+B1126464533936N00604034EA0000002171
+B1126484533941N00604038EA0000002170
+B1126504533945N00604045EA0000002169
+B1126524533944N00604053EA0000002169
+B1126544533938N00604059EA0000002168
+B1126564533929N00604059EA0000002167
+B1126584533919N00604056EA0000002165
+B1127004533907N00604051EA0000002163
+B1127024533894N00604046EA0000002161
+B1127044533883N00604041EA0000002161
+B1127064533873N00604035EA0000002160
+B1127084533861N00604027EA0000002158
+B1127104533850N00604020EA0000002153
+B1127124533837N00604013EA0000002149
+B1127144533825N00604002EA0000002144
+B1127164533812N00603992EA0000002139
+B1127184533799N00603984EA0000002135
+B1127204533786N00603975EA0000002133
+B1127224533773N00603968EA0000002130
+B1127244533762N00603961EA0000002127
+B1127264533743N00603947EA0000002121
+B1127284533730N00603939EA0000002118
+B1127304533717N00603929EA0000002115
+B1127324533706N00603920EA0000002112
+B1127344533694N00603913EA0000002108
+B1127364533681N00603905EA0000002104
+B1127384533668N00603896EA0000002102
+B1127404533657N00603888EA0000002100
+B1127424533646N00603881EA0000002096
+B1127444533634N00603872EA0000002093
+B1127474533622N00603862EA0000002091
+B1127494533612N00603853EA0000002087
+B1127514533601N00603844EA0000002082
+B1127534533588N00603834EA0000002079
+B1127554533577N00603825EA0000002076
+B1127574533566N00603816EA0000002073
+B1127594533555N00603807EA0000002069
+B1128014533544N00603799EA0000002066
+B1128034533534N00603792EA0000002062
+B1128054533523N00603785EA0000002057
+B1128074533510N00603779EA0000002054
+B1128094533498N00603771EA0000002051
+B1128114533488N00603764EA0000002048
+B1128134533476N00603759EA0000002046
+B1128154533465N00603752EA0000002044
+B1128174533454N00603745EA0000002043
+B1128194533441N00603739EA0000002042
+B1128214533429N00603733EA0000002042
+B1128234533418N00603727EA0000002041
+B1128254533407N00603720EA0000002040
+B1128274533395N00603711EA0000002041
+B1128294533384N00603702EA0000002040
+B1128314533374N00603694EA0000002038
+B1128334533362N00603685EA0000002037
+B1128354533351N00603676EA0000002037
+B1128374533341N00603669EA0000002035
+B1128394533331N00603661EA0000002032
+B1128414533321N00603653EA0000002032
+B1128434533312N00603646EA0000002032
+B1128454533305N00603640EA0000002031
+B1128474533296N00603633EA0000002031
+B1128494533287N00603623EA0000002033
+B1128514533278N00603613EA0000002036
+B1128534533271N00603607EA0000002041
+B1128554533266N00603607EA0000002045
+B1128574533262N00603611EA0000002047
+B1128594533264N00603622EA0000002048
+B1129014533271N00603633EA0000002050
+B1129034533286N00603637EA0000002054
+B1129054533298N00603628EA0000002056
+B1129074533306N00603614EA0000002059
+B1129094533309N00603596EA0000002060
+B1129114533306N00603578EA0000002062
+B1129134533301N00603566EA0000002063
+B1129154533294N00603556EA0000002064
+B1129174533288N00603547EA0000002063
+B1129194533281N00603540EA0000002062
+B1129214533273N00603533EA0000002061
+B1129234533265N00603527EA0000002060
+B1129264533257N00603523EA0000002058
+B1129284533247N00603520EA0000002056
+B1129304533237N00603515EA0000002055
+B1129324533228N00603509EA0000002053
+B1129344533219N00603503EA0000002051
+B1129364533210N00603499EA0000002050
+B1129384533201N00603497EA0000002049
+B1129404533194N00603497EA0000002046
+B1129424533185N00603501EA0000002043
+B1129444533175N00603510EA0000002042
+B1129464533165N00603517EA0000002043
+B1129484533159N00603518EA0000002045
+B1129504533154N00603519EA0000002045
+B1129524533145N00603520EA0000002046
+B1129544533137N00603523EA0000002048
+B1129564533132N00603532EA0000002050
+B1129584533127N00603542EA0000002053
+B1130004533124N00603554EA0000002056
+B1130024533126N00603566EA0000002062
+B1130044533133N00603576EA0000002068
+B1130064533142N00603582EA0000002073
+B1130084533155N00603576EA0000002077
+B1130104533162N00603562EA0000002082
+B1130124533161N00603548EA0000002087
+B1130144533155N00603539EA0000002092
+B1130164533146N00603538EA0000002097
+B1130184533138N00603545EA0000002104
+B1130204533135N00603555EA0000002110
+B1130224533137N00603566EA0000002115
+B1130244533142N00603575EA0000002118
+B1130264533151N00603577EA0000002121
+B1130284533162N00603565EA0000002123
+B1130304533164N00603549EA0000002126
+B1130324533160N00603535EA0000002129
+B1130344533152N00603526EA0000002134
+B1130364533145N00603521EA0000002138
+B1130384533137N00603516EA0000002141
+B1130404533127N00603512EA0000002146
+B1130424533119N00603521EA0000002149
+B1130444533114N00603539EA0000002158
+B1130464533118N00603545EA0000002164
+B1130484533127N00603548EA0000002167
+B1130504533138N00603542EA0000002169
+B1130524533144N00603527EA0000002171
+B1130544533146N00603509EA0000002172
+B1130564533141N00603493EA0000002175
+B1130584533131N00603485EA0000002179
+B1131004533122N00603481EA0000002184
+B1131024533115N00603478EA0000002187
+B1131054533106N00603479EA0000002189
+B1131074533100N00603489EA0000002191
+B1131094533102N00603499EA0000002194
+B1131114533110N00603503EA0000002196
+B1131134533120N00603493EA0000002197
+B1131154533125N00603474EA0000002198
+B1131174533120N00603454EA0000002199
+B1131194533110N00603440EA0000002201
+B1131214533099N00603431EA0000002205
+B1131234533092N00603422EA0000002206
+B1131254533083N00603414EA0000002206
+B1131274533072N00603414EA0000002205
+B1131294533066N00603422EA0000002202
+B1131314533063N00603430EA0000002198
+B1131334533062N00603439EA0000002195
+B1131354533066N00603447EA0000002193
+B1131374533072N00603452EA0000002193
+B1131394533076N00603455EA0000002193
+B1131414533080N00603459EA0000002191
+B1131434533087N00603459EA0000002189
+B1131454533096N00603446EA0000002186
+B1131474533101N00603429EA0000002185
+B1131494533100N00603409EA0000002184
+B1131514533096N00603391EA0000002183
+B1131534533086N00603379EA0000002182
+B1131554533075N00603370EA0000002180
+B1131574533063N00603359EA0000002177
+B1131594533051N00603348EA0000002173
+B1132014533038N00603337EA0000002168
+B1132034533027N00603324EA0000002162
+B1132054533017N00603311EA0000002155
+B1132074533006N00603300EA0000002149
+B1132094532996N00603285EA0000002143
+B1132114532986N00603269EA0000002139
+B1132134532977N00603254EA0000002135
+B1132154532967N00603238EA0000002130
+B1132174532957N00603221EA0000002124
+B1132194532937N00603199EA0000002116
+B1132214532923N00603187EA0000002112
+B1132234532910N00603175EA0000002106
+B1132254532897N00603160EA0000002101
+B1132274532883N00603146EA0000002097
+B1132294532871N00603133EA0000002093
+B1132314532858N00603120EA0000002087
+B1132334532844N00603105EA0000002083
+B1132354532832N00603091EA0000002079
+B1132374532819N00603077EA0000002075
+B1132394532806N00603064EA0000002070
+B1132414532792N00603050EA0000002065
+B1132444532779N00603037EA0000002059
+B1132464532766N00603021EA0000002054
+B1132484532754N00603008EA0000002049
+B1132504532741N00602995EA0000002043
+B1132524532727N00602980EA0000002038
+B1132544532714N00602966EA0000002034
+B1132564532701N00602953EA0000002030
+B1132584532688N00602939EA0000002026
+B1133004532675N00602925EA0000002023
+B1133024532661N00602913EA0000002019
+B1133044532648N00602899EA0000002015
+B1133064532635N00602884EA0000002011
+B1133084532622N00602871EA0000002007
+B1133104532609N00602857EA0000002003
+B1133124532596N00602846EA0000001998
+B1133144532583N00602834EA0000001994
+B1133164532569N00602821EA0000001990
+B1133184532557N00602807EA0000001986
+B1133204532546N00602790EA0000001983
+B1133224532537N00602772EA0000001980
+B1133244532526N00602756EA0000001975
+B1133264532515N00602739EA0000001972
+B1133284532504N00602723EA0000001968
+B1133304532492N00602709EA0000001964
+B1133324532481N00602693EA0000001960
+B1133344532470N00602676EA0000001956
+B1133364532459N00602661EA0000001953
+B1133384532448N00602644EA0000001949
+B1133404532437N00602628EA0000001946
+B1133424532426N00602612EA0000001943
+B1133444532414N00602596EA0000001939
+B1133464532403N00602580EA0000001936
+B1133484532391N00602565EA0000001933
+B1133504532379N00602551EA0000001930
+B1133524532367N00602536EA0000001928
+B1133544532355N00602521EA0000001925
+B1133564532343N00602508EA0000001923
+B1133584532330N00602495EA0000001920
+B1134004532311N00602476EA0000001916
+B1134024532298N00602464EA0000001913
+B1134044532286N00602451EA0000001910
+B1134064532274N00602437EA0000001907
+B1134084532262N00602421EA0000001904
+B1134104532251N00602406EA0000001901
+B1134124532239N00602390EA0000001897
+B1134144532228N00602374EA0000001894
+B1134164532217N00602357EA0000001891
+B1134184532206N00602341EA0000001888
+B1134204532195N00602326EA0000001885
+B1134234532183N00602311EA0000001882
+B1134254532172N00602295EA0000001879
+B1134274532160N00602281EA0000001876
+B1134294532147N00602268EA0000001873
+B1134314532135N00602254EA0000001870
+B1134334532123N00602240EA0000001867
+B1134354532111N00602225EA0000001865
+B1134374532099N00602211EA0000001862
+B1134394532087N00602197EA0000001860
+B1134414532074N00602183EA0000001857
+B1134434532062N00602169EA0000001854
+B1134454532049N00602156EA0000001852
+B1134474532036N00602144EA0000001850
+B1134494532023N00602132EA0000001847
+B1134514532010N00602120EA0000001845
+B1134534531997N00602108EA0000001843
+B1134554531984N00602096EA0000001841
+B1134574531972N00602085EA0000001839
+B1134594531959N00602075EA0000001837
+B1135014531946N00602064EA0000001834
+B1135034531932N00602054EA0000001831
+B1135054531919N00602043EA0000001827
+B1135074531908N00602030EA0000001825
+B1135094531901N00602017EA0000001821
+B1135114531893N00602004EA0000001818
+B1135134531889N00601988EA0000001815
+B1135154531887N00601972EA0000001812
+B1135174531882N00601957EA0000001810
+B1135194531878N00601942EA0000001809
+B1135214531874N00601929EA0000001806
+B1135234531868N00601917EA0000001803
+B1135254531858N00601907EA0000001802
+B1135274531849N00601899EA0000001799
+B1135294531841N00601892EA0000001796
+B1135314531831N00601886EA0000001794
+B1135334531820N00601877EA0000001790
+B1135364531803N00601870EA0000001789
+B1135384531792N00601864EA0000001789
+B1135404531782N00601861EA0000001788
+B1135424531772N00601858EA0000001786
+B1135444531761N00601855EA0000001782
+B1135464531747N00601852EA0000001778
+B1135484531735N00601850EA0000001777
+B1135504531723N00601848EA0000001775
+B1135524531712N00601849EA0000001771
+B1135544531700N00601849EA0000001767
+B1135564531686N00601848EA0000001763
+B1135584531666N00601846EA0000001761
+B1136004531654N00601845EA0000001759
+B1136024531642N00601842EA0000001758
+B1136044531630N00601838EA0000001757
+B1136064531618N00601833EA0000001754
+B1136084531605N00601824EA0000001751
+B1136104531593N00601816EA0000001750
+B1136124531580N00601809EA0000001748
+B1136144531568N00601801EA0000001747
+B1136164531555N00601790EA0000001745
+B1136184531543N00601779EA0000001743
+B1136214531530N00601769EA0000001740
+B1136234531517N00601757EA0000001738
+B1136254531504N00601746EA0000001737
+B1136274531493N00601737EA0000001734
+B1136294531482N00601728EA0000001730
+B1136314531469N00601719EA0000001728
+B1136334531457N00601714EA0000001727
+B1136354531445N00601710EA0000001725
+B1136374531433N00601706EA0000001722
+B1136394531421N00601702EA0000001721
+B1136414531410N00601695EA0000001720
+B1136434531401N00601689EA0000001718
+B1136454531392N00601683EA0000001715
+B1136474531381N00601676EA0000001711
+B1136494531375N00601672EA0000001709
+B1136514531358N00601664EA0000001706
+B1136534531348N00601658EA0000001703
+B1136554531337N00601653EA0000001699
+B1136574531325N00601646EA0000001696
+B1136594531314N00601637EA0000001694
+B1137014531304N00601629EA0000001692
+B1137034531294N00601621EA0000001689
+B1137054531283N00601613EA0000001687
+B1137074531273N00601604EA0000001683
+B1137094531261N00601595EA0000001679
+B1137114531247N00601585EA0000001676
+B1137134531235N00601577EA0000001673
+B1137154531223N00601568EA0000001669
+B1137174531210N00601559EA0000001664
+B1137194531197N00601550EA0000001661
+B1137214531185N00601540EA0000001657
+B1137234531174N00601531EA0000001653
+B1137254531162N00601522EA0000001649
+B1137274531150N00601513EA0000001647
+B1137294531139N00601505EA0000001644
+B1137314531127N00601495EA0000001641
+B1137334531116N00601485EA0000001638
+B1137354531104N00601476EA0000001635
+B1137374531093N00601467EA0000001632
+B1137394531080N00601459EA0000001628
+B1137414531061N00601446EA0000001624
+B1137434531048N00601437EA0000001622
+B1137454531036N00601430EA0000001620
+B1137474531023N00601422EA0000001616
+B1137494531010N00601414EA0000001613
+B1137514530996N00601405EA0000001612
+B1137534530985N00601395EA0000001611
+B1137554530975N00601385EA0000001608
+B1137574530964N00601374EA0000001605
+B1137594530953N00601364EA0000001604
+B1138024530943N00601354EA0000001602
+B1138044530932N00601343EA0000001599
+B1138064530921N00601332EA0000001596
+B1138084530910N00601322EA0000001595
+B1138104530899N00601312EA0000001592
+B1138124530888N00601301EA0000001589
+B1138144530878N00601290EA0000001585
+B1138164530866N00601279EA0000001582
+B1138184530854N00601269EA0000001579
+B1138204530843N00601258EA0000001576
+B1138224530832N00601248EA0000001573
+B1138244530820N00601237EA0000001570
+B1138264530808N00601227EA0000001568
+B1138284530797N00601217EA0000001565
+B1138304530785N00601207EA0000001561
+B1138324530773N00601197EA0000001558
+B1138344530761N00601187EA0000001554
+B1138364530749N00601177EA0000001552
+B1138384530739N00601167EA0000001550
+B1138404530727N00601157EA0000001547
+B1138424530715N00601146EA0000001543
+B1138444530703N00601134EA0000001540
+B1138464530692N00601122EA0000001537
+B1138484530680N00601111EA0000001534
+B1138504530668N00601099EA0000001532
+B1138524530658N00601086EA0000001530
+B1138544530647N00601073EA0000001527
+B1138564530636N00601059EA0000001523
+B1138584530624N00601045EA0000001521
+B1139004530612N00601032EA0000001519
+B1139024530600N00601021EA0000001516
+B1139044530587N00601009EA0000001513
+B1139064530574N00600999EA0000001511
+B1139084530560N00600991EA0000001508
+B1139104530546N00600982EA0000001505
+B1139124530532N00600972EA0000001504
+B1139144530520N00600964EA0000001503
+B1139164530508N00600957EA0000001501
+B1139184530495N00600949EA0000001497
+B1139204530475N00600938EA0000001494
+B1139224530462N00600932EA0000001491
+B1139244530449N00600926EA0000001487
+B1139264530435N00600919EA0000001484
+B1139284530422N00600912EA0000001482
+B1139304530409N00600905EA0000001479
+B1139324530396N00600898EA0000001475
+B1139344530383N00600890EA0000001472
+B1139364530370N00600882EA0000001470
+B1139384530357N00600874EA0000001467
+B1139404530344N00600865EA0000001464
+B1139434530331N00600855EA0000001461
+B1139454530319N00600844EA0000001459
+B1139474530307N00600834EA0000001456
+B1139494530294N00600824EA0000001453
+B1139514530281N00600814EA0000001450
+B1139534530268N00600806EA0000001448
+B1139554530255N00600798EA0000001445
+B1139574530241N00600790EA0000001443
+B1139594530227N00600783EA0000001440
+B1140014530213N00600777EA0000001437
+B1140034530199N00600770EA0000001435
+B1140054530185N00600762EA0000001431
+B1140074530172N00600753EA0000001428
+B1140094530158N00600745EA0000001426
+B1140114530144N00600737EA0000001423
+B1140134530131N00600729EA0000001420
+B1140154530117N00600721EA0000001416
+B1140174530103N00600713EA0000001414
+B1140194530089N00600705EA0000001411
+B1140214530075N00600698EA0000001408
+B1140234530061N00600690EA0000001405
+B1140254530047N00600683EA0000001403
+B1140274530033N00600676EA0000001401
+B1140294530019N00600670EA0000001398
+B1140314530005N00600662EA0000001396
+B1140334529991N00600654EA0000001394
+B1140354529977N00600646EA0000001392
+B1140374529963N00600637EA0000001389
+B1140394529949N00600630EA0000001387
+B1140414529935N00600622EA0000001385
+B1140434529922N00600614EA0000001383
+B1140454529909N00600605EA0000001380
+B1140474529895N00600596EA0000001378
+B1140494529883N00600586EA0000001375
+B1140514529871N00600575EA0000001373
+B1140534529860N00600564EA0000001371
+B1140554529849N00600553EA0000001368
+B1140574529838N00600543EA0000001365
+B1140594529826N00600533EA0000001363
+B1141014529809N00600519EA0000001358
+B1141034529798N00600509EA0000001355
+B1141054529786N00600500EA0000001352
+B1141074529774N00600491EA0000001349
+B1141094529763N00600483EA0000001346
+B1141114529751N00600473EA0000001343
+B1141134529741N00600463EA0000001341
+B1141154529730N00600454EA0000001337
+B1141174529719N00600444EA0000001334
+B1141194529708N00600434EA0000001331
+B1141224529697N00600425EA0000001328
+B1141244529685N00600416EA0000001325
+B1141264529674N00600407EA0000001321
+B1141284529661N00600399EA0000001318
+B1141304529650N00600390EA0000001315
+B1141324529639N00600380EA0000001312
+B1141344529628N00600371EA0000001308
+B1141364529616N00600362EA0000001305
+B1141384529605N00600353EA0000001303
+B1141404529595N00600345EA0000001300
+B1141424529583N00600336EA0000001297
+B1141444529573N00600327EA0000001294
+B1141464529562N00600318EA0000001292
+B1141484529551N00600310EA0000001290
+B1141504529540N00600301EA0000001287
+B1141524529530N00600293EA0000001285
+B1141544529519N00600285EA0000001282
+B1141564529508N00600275EA0000001279
+B1141584529497N00600264EA0000001276
+B1142004529487N00600256EA0000001274
+B1142024529477N00600247EA0000001271
+B1142044529466N00600238EA0000001268
+B1142064529456N00600229EA0000001265
+B1142084529446N00600221EA0000001263
+B1142104529436N00600212EA0000001260
+B1142124529426N00600204EA0000001257
+B1142144529415N00600196EA0000001255
+B1142164529405N00600188EA0000001252
+B1142184529395N00600180EA0000001249
+B1142204529384N00600172EA0000001246
+B1142224529373N00600164EA0000001244
+B1142244529363N00600156EA0000001242
+B1142264529353N00600148EA0000001239
+B1142284529342N00600139EA0000001236
+B1142304529332N00600131EA0000001234
+B1142324529321N00600122EA0000001231
+B1142344529311N00600113EA0000001228
+B1142364529301N00600102EA0000001226
+B1142384529290N00600092EA0000001224
+B1142404529274N00600078EA0000001221
+B1142424529263N00600070EA0000001219
+B1142444529252N00600061EA0000001217
+B1142464529241N00600053EA0000001215
+B1142484529230N00600045EA0000001212
+B1142504529218N00600037EA0000001210
+B1142524529208N00600028EA0000001209
+B1142544529197N00600019EA0000001207
+B1142564529186N00600011EA0000001205
+B1142584529175N00600001EA0000001204
+B1143014529164N00559993EA0000001202
+B1143034529153N00559985EA0000001201
+B1143054529143N00559976EA0000001199
+B1143074529132N00559967EA0000001197
+B1143094529122N00559960EA0000001195
+B1143114529110N00559953EA0000001193
+B1143134529099N00559946EA0000001191
+B1143154529087N00559939EA0000001188
+B1143174529075N00559932EA0000001187
+B1143194529064N00559926EA0000001184
+B1143214529052N00559921EA0000001182
+B1143234529040N00559915EA0000001179
+B1143254529028N00559909EA0000001177
+B1143274529016N00559902EA0000001174
+B1143294529005N00559896EA0000001172
+B1143314528993N00559888EA0000001170
+B1143334528982N00559881EA0000001167
+B1143354528971N00559872EA0000001165
+B1143374528961N00559864EA0000001162
+B1143394528950N00559856EA0000001160
+B1143414528939N00559848EA0000001158
+B1143434528927N00559841EA0000001156
+B1143454528916N00559834EA0000001153
+B1143474528905N00559827EA0000001150
+B1143494528893N00559821EA0000001148
+B1143514528883N00559813EA0000001146
+B1143534528872N00559806EA0000001143
+B1143554528860N00559800EA0000001141
+B1143574528848N00559795EA0000001140
+B1143594528837N00559790EA0000001138
+B1144014528825N00559784EA0000001136
+B1144034528813N00559777EA0000001135
+B1144054528802N00559771EA0000001134
+B1144074528791N00559764EA0000001132
+B1144094528780N00559757EA0000001130
+B1144114528769N00559749EA0000001129
+B1144134528758N00559742EA0000001128
+B1144154528746N00559735EA0000001126
+B1144174528734N00559728EA0000001125
+B1144194528723N00559722EA0000001124
+B1144214528712N00559716EA0000001121
+B1144234528696N00559707EA0000001117
+B1144254528687N00559700EA0000001113
+B1144274528676N00559694EA0000001108
+B1144294528665N00559688EA0000001103
+B1144314528653N00559682EA0000001100
+B1144334528642N00559676EA0000001097
+B1144354528631N00559670EA0000001094
+B1144374528621N00559663EA0000001091
+B1144404528611N00559654EA0000001088
+B1144424528601N00559644EA0000001086
+B1144444528591N00559635EA0000001083
+B1144464528580N00559627EA0000001080
+B1144484528568N00559618EA0000001078
+B1144504528556N00559610EA0000001077
+B1144524528544N00559603EA0000001075
+B1144544528531N00559595EA0000001073
+B1144564528518N00559586EA0000001072
+B1144584528506N00559578EA0000001071
+B1145004528495N00559568EA0000001069
+B1145024528482N00559560EA0000001067
+B1145044528469N00559552EA0000001067
+B1145064528458N00559542EA0000001065
+B1145084528447N00559531EA0000001064
+B1145104528436N00559521EA0000001063
+B1145124528425N00559510EA0000001063
+B1145144528416N00559498EA0000001061
+B1145164528406N00559486EA0000001060
+B1145184528395N00559475EA0000001059
+B1145204528384N00559464EA0000001059
+B1145224528373N00559453EA0000001058
+B1145244528362N00559442EA0000001057
+B1145264528350N00559431EA0000001056
+B1145284528338N00559421EA0000001056
+B1145304528326N00559412EA0000001057
+B1145324528316N00559404EA0000001058
+B1145344528305N00559398EA0000001057
+B1145364528295N00559389EA0000001058
+B1145384528284N00559382EA0000001060
+B1145404528273N00559376EA0000001061
+B1145424528262N00559371EA0000001063
+B1145444528253N00559364EA0000001064
+B1145464528247N00559356EA0000001065
+B1145484528244N00559348EA0000001065
+B1145504528250N00559343EA0000001062
+B1145524528258N00559349EA0000001061
+B1145544528262N00559365EA0000001060
+B1145564528259N00559384EA0000001059
+B1145584528247N00559402EA0000001059
+B1146004528226N00559411EA0000001061
+B1146024528213N00559410EA0000001062
+B1146044528202N00559406EA0000001062
+B1146064528192N00559399EA0000001061
+B1146084528181N00559390EA0000001060
+B1146104528172N00559381EA0000001059
+B1146124528163N00559371EA0000001057
+B1146144528157N00559361EA0000001056
+B1146164528149N00559352EA0000001054
+B1146184528142N00559342EA0000001052
+B1146214528134N00559332EA0000001050
+B1146234528127N00559322EA0000001048
+B1146254528119N00559312EA0000001047
+B1146274528111N00559302EA0000001046
+B1146294528104N00559293EA0000001045
+B1146314528097N00559284EA0000001042
+B1146334528090N00559273EA0000001039
+B1146354528083N00559263EA0000001038
+B1146374528077N00559254EA0000001037
+B1146394528071N00559245EA0000001036
+B1146414528065N00559236EA0000001036
+B1146434528058N00559228EA0000001035
+B1146454528052N00559219EA0000001034
+B1146474528045N00559209EA0000001033
+B1146494528036N00559200EA0000001033
+B1146514528028N00559191EA0000001032
+B1146534528021N00559182EA0000001031
+B1146554528014N00559172EA0000001030
+B1146574528006N00559162EA0000001030
+B1146594527999N00559153EA0000001028
+B1147014527990N00559142EA0000001028
+B1147034527981N00559131EA0000001028
+B1147054527973N00559121EA0000001030
+B1147074527964N00559110EA0000001031
+B1147094527956N00559099EA0000001032
+B1147114527947N00559089EA0000001035
+B1147134527939N00559079EA0000001036
+B1147154527933N00559069EA0000001037
+B1147174527928N00559058EA0000001038
+B1147194527923N00559046EA0000001039
+B1147214527920N00559036EA0000001041
+B1147234527922N00559026EA0000001042
+B1147254527928N00559022EA0000001043
+B1147274527936N00559026EA0000001043
+B1147294527940N00559040EA0000001043
+B1147314527936N00559061EA0000001045
+B1147334527922N00559071EA0000001047
+B1147354527910N00559071EA0000001049
+B1147374527899N00559066EA0000001050
+B1147394527892N00559056EA0000001051
+B1147414527888N00559038EA0000001055
+B1147434527894N00559029EA0000001056
+B1147454527901N00559028EA0000001056
+B1147474527908N00559034EA0000001056
+B1147494527911N00559049EA0000001056
+B1147514527906N00559067EA0000001057
+B1147534527895N00559077EA0000001058
+B1147554527883N00559079EA0000001059
+B1147574527871N00559076EA0000001061
+B1147594527861N00559070EA0000001062
+B1148024527853N00559060EA0000001062
+B1148044527846N00559049EA0000001063
+B1148064527843N00559038EA0000001064
+B1148084527840N00559026EA0000001065
+B1148104527841N00559015EA0000001065
+B1148124527847N00559010EA0000001065
+B1148144527855N00559012EA0000001064
+B1148164527860N00559022EA0000001063
+B1148184527857N00559037EA0000001062
+B1148204527847N00559048EA0000001062
+B1148224527834N00559048EA0000001062
+B1148244527823N00559041EA0000001061
+B1148264527814N00559030EA0000001061
+B1148284527805N00559018EA0000001060
+B1148304527797N00559005EA0000001059
+B1148324527790N00558991EA0000001058
+B1148344527782N00558977EA0000001057
+B1148364527774N00558963EA0000001057
+B1148384527769N00558951EA0000001058
+B1148404527763N00558938EA0000001058
+B1148424527757N00558924EA0000001057
+B1148444527753N00558910EA0000001057
+B1148464527748N00558897EA0000001057
+B1148484527743N00558885EA0000001057
+B1148504527739N00558871EA0000001056
+B1148524527735N00558855EA0000001056
+B1148544527730N00558841EA0000001057
+B1148564527726N00558826EA0000001057
+B1148584527720N00558810EA0000001057
+B1149004527714N00558796EA0000001058
+B1149024527709N00558782EA0000001059
+B1149044527704N00558767EA0000001059
+B1149064527698N00558751EA0000001058
+B1149084527692N00558735EA0000001058
+B1149104527686N00558720EA0000001059
+B1149124527681N00558703EA0000001059
+B1149144527676N00558687EA0000001059
+B1149164527671N00558671EA0000001058
+B1149184527667N00558654EA0000001058
+B1149204527660N00558633EA0000001059
+B1149224527656N00558619EA0000001059
+B1149244527652N00558605EA0000001060
+B1149264527647N00558590EA0000001060
+B1149284527643N00558574EA0000001059
+B1149304527638N00558557EA0000001058
+B1149324527632N00558542EA0000001057
+B1149344527627N00558529EA0000001057
+B1149364527621N00558514EA0000001057
+B1149394527617N00558496EA0000001055
+B1149414527615N00558480EA0000001054
+B1149434527613N00558464EA0000001053
+B1149454527610N00558446EA0000001052
+B1149474527609N00558427EA0000001052
+B1149494527607N00558412EA0000001052
+B1149514527604N00558396EA0000001050
+B1149534527600N00558380EA0000001050
+B1149554527594N00558365EA0000001049
+B1149574527589N00558348EA0000001049
+B1149594527583N00558332EA0000001048
+B1150014527577N00558315EA0000001047
+B1150034527573N00558297EA0000001046
+B1150054527569N00558280EA0000001046
+B1150074527565N00558264EA0000001046
+B1150094527561N00558248EA0000001047
+B1150114527560N00558233EA0000001047
+B1150134527558N00558218EA0000001046
+B1150154527555N00558201EA0000001047
+B1150174527553N00558186EA0000001046
+B1150194527549N00558169EA0000001044
+B1150214527545N00558151EA0000001041
+B1150234527542N00558135EA0000001039
+B1150254527540N00558119EA0000001036
+B1150274527537N00558103EA0000001034
+B1150294527533N00558085EA0000001031
+B1150314527532N00558068EA0000001031
+B1150334527531N00558053EA0000001031
+B1150354527531N00558039EA0000001029
+B1150374527531N00558024EA0000001027
+B1150394527532N00558011EA0000001024
+B1150414527534N00557998EA0000001021
+B1150434527536N00557984EA0000001018
+B1150454527535N00557970EA0000001015
+B1150474527534N00557957EA0000001011
+B1150494527533N00557942EA0000001007
+B1150514527535N00557927EA0000001004
+B1150534527537N00557914EA0000001001
+B1150554527535N00557901EA0000000998
+B1150574527533N00557895EA0000000993
+B1150594527517N00557882EA0000000992
+B1151014527508N00557882EA0000000993
+B1151034527499N00557882EA0000000996
+B1151054527487N00557879EA0000001000
+B1151074527479N00557871EA0000001007
+B1151094527476N00557860EA0000001011
+B1151114527473N00557848EA0000001013
+B1151134527473N00557835EA0000001014
+B1151154527482N00557829EA0000001013
+B1151184527492N00557829EA0000001016
+B1151204527497N00557834EA0000001021
+B1151224527496N00557844EA0000001027
+B1151244527492N00557853EA0000001033
+B1151264527486N00557861EA0000001037
+B1151284527477N00557866EA0000001043
+B1151304527469N00557862EA0000001047
+B1151324527464N00557849EA0000001052
+B1151344527467N00557831EA0000001054
+B1151364527476N00557822EA0000001056
+B1151384527484N00557820EA0000001059
+B1151404527490N00557825EA0000001064
+B1151424527491N00557836EA0000001068
+B1151444527483N00557846EA0000001072
+B1151464527470N00557843EA0000001076
+B1151484527463N00557831EA0000001081
+B1151504527461N00557815EA0000001085
+B1151524527465N00557799EA0000001088
+B1151544527473N00557787EA0000001092
+B1151564527482N00557790EA0000001096
+B1151584527484N00557800EA0000001100
+B1152004527472N00557812EA0000001106
+B1152024527460N00557809EA0000001112
+B1152044527453N00557797EA0000001114
+B1152064527448N00557782EA0000001117
+B1152084527450N00557767EA0000001122
+B1152104527457N00557769EA0000001125
+B1152124527462N00557782EA0000001128
+B1152144527451N00557797EA0000001132
+B1152164527438N00557794EA0000001136
+B1152184527429N00557780EA0000001138
+B1152204527426N00557766EA0000001139
+B1152224527434N00557754EA0000001138
+B1152244527444N00557751EA0000001139
+B1152264527451N00557756EA0000001142
+B1152284527455N00557762EA0000001143
+B1152304527460N00557769EA0000001145
+B1152324527466N00557776EA0000001149
+B1152344527473N00557781EA0000001154
+B1152364527480N00557786EA0000001158
+B1152384527489N00557800EA0000001161
+B1152404527491N00557815EA0000001162
+B1152424527480N00557828EA0000001162
+B1152444527466N00557828EA0000001162
+B1152464527459N00557820EA0000001164
+B1152484527460N00557810EA0000001169
+B1152504527465N00557798EA0000001174
+B1152524527474N00557787EA0000001177
+B1152544527484N00557779EA0000001181
+B1152574527494N00557779EA0000001186
+B1152594527502N00557784EA0000001189
+B1153014527508N00557794EA0000001191
+B1153034527514N00557810EA0000001190
+B1153054527516N00557828EA0000001188
+B1153074527508N00557843EA0000001183
+B1153094527494N00557850EA0000001178
+B1153114527480N00557845EA0000001173
+B1153134527471N00557833EA0000001169
+B1153154527469N00557818EA0000001167
+B1153174527470N00557805EA0000001167
+B1153194527474N00557795EA0000001168
+B1153214527481N00557788EA0000001166
+B1153234527488N00557782EA0000001163
+B1153254527491N00557773EA0000001161
+B1153274527490N00557766EA0000001158
+B1153294527485N00557761EA0000001157
+B1153314527481N00557752EA0000001156
+B1153334527477N00557740EA0000001155
+B1153354527473N00557729EA0000001155
+B1153374527470N00557716EA0000001156
+B1153394527467N00557704EA0000001157
+B1153414527465N00557693EA0000001158
+B1153434527461N00557678EA0000001158
+B1153454527456N00557665EA0000001160
+B1153474527452N00557656EA0000001162
+B1153494527448N00557643EA0000001163
+B1153514527448N00557627EA0000001164
+B1153534527456N00557617EA0000001165
+B1153554527465N00557618EA0000001167
+B1153574527468N00557627EA0000001169
+B1153594527461N00557633EA0000001171
+B1154014527452N00557630EA0000001174
+B1154034527436N00557625EA0000001179
+B1154054527434N00557606EA0000001180
+B1154074527441N00557591EA0000001181
+B1154094527451N00557591EA0000001183
+B1154114527456N00557601EA0000001186
+B1154134527455N00557614EA0000001190
+B1154154527453N00557631EA0000001195
+B1154174527453N00557640EA0000001196
+B1154194527452N00557652EA0000001198
+B1154214527448N00557661EA0000001200
+B1154234527441N00557664EA0000001201
+B1154254527430N00557661EA0000001202
+B1154274527421N00557653EA0000001203
+B1154294527413N00557643EA0000001203
+B1154314527409N00557628EA0000001203
+B1154334527411N00557611EA0000001204
+B1154364527419N00557605EA0000001203
+B1154384527428N00557610EA0000001203
+B1154404527431N00557620EA0000001202
+B1154424527429N00557634EA0000001204
+B1154444527425N00557646EA0000001206
+B1154464527422N00557657EA0000001207
+B1154484527419N00557668EA0000001207
+B1154504527416N00557679EA0000001207
+B1154524527416N00557691EA0000001207
+B1154544527416N00557703EA0000001206
+B1154564527413N00557717EA0000001208
+B1154584527410N00557730EA0000001210
+B1155004527408N00557740EA0000001213
+B1155024527407N00557750EA0000001214
+B1155044527406N00557761EA0000001216
+B1155064527407N00557771EA0000001217
+B1155084527410N00557782EA0000001217
+B1155104527412N00557798EA0000001216
+B1155124527403N00557811EA0000001215
+B1155144527393N00557811EA0000001217
+B1155164527383N00557808EA0000001218
+B1155184527372N00557805EA0000001219
+B1155204527362N00557797EA0000001219
+B1155224527358N00557784EA0000001220
+B1155244527360N00557772EA0000001220
+B1155264527369N00557769EA0000001221
+B1155284527376N00557776EA0000001221
+B1155304527370N00557787EA0000001220
+B1155324527357N00557790EA0000001221
+B1155344527346N00557784EA0000001222
+B1155364527339N00557776EA0000001222
+B1155384527334N00557766EA0000001221
+B1155404527330N00557755EA0000001219
+B1155424527319N00557750EA0000001213
+B1155444527311N00557743EA0000001213
+B1155464527301N00557728EA0000001213
+B1155484527295N00557717EA0000001214
+B1155504527292N00557713EA0000001214
+B1155524527280N00557697EA0000001213
+B1155544527274N00557684EA0000001213
+B1155564527269N00557670EA0000001213
+B1155584527261N00557658EA0000001214
+B1156004527254N00557647EA0000001215
+B1156024527246N00557637EA0000001216
+B1156044527238N00557627EA0000001216
+B1156064527230N00557615EA0000001215
+B1156084527223N00557602EA0000001213
+B1156104527215N00557591EA0000001210
+B1156124527205N00557579EA0000001207
+B1156154527196N00557566EA0000001205
+B1156174527188N00557554EA0000001201
+B1156194527180N00557539EA0000001197
+B1156214527170N00557525EA0000001193
+B1156234527159N00557513EA0000001191
+B1156254527149N00557502EA0000001188
+B1156274527140N00557490EA0000001183
+B1156294527130N00557477EA0000001179
+B1156314527120N00557464EA0000001176
+B1156334527113N00557451EA0000001173
+B1156354527107N00557436EA0000001168
+B1156374527109N00557417EA0000001163
+B1156394527119N00557408EA0000001158
+B1156414527130N00557410EA0000001153
+B1156434527138N00557418EA0000001149
+B1156454527146N00557426EA0000001145
+B1156474527153N00557436EA0000001141
+B1156494527160N00557447EA0000001136
+B1156514527169N00557459EA0000001131
+B1156534527178N00557472EA0000001127
+B1156554527184N00557486EA0000001124
+B1156574527190N00557498EA0000001119
+B1156594527198N00557511EA0000001114
+B1157014527207N00557526EA0000001108
+B1157034527213N00557541EA0000001104
+B1157054527219N00557553EA0000001101
+B1157074527223N00557562EA0000001099
+B1157094527226N00557570EA0000001098
+B1157114527234N00557579EA0000001097
+B1157134527240N00557589EA0000001097
+B1157154527245N00557598EA0000001098
+B1157174527248N00557607EA0000001098
+B1157194527248N00557619EA0000001097
+B1157214527248N00557633EA0000001097
+B1157234527250N00557639EA0000001098
+B1157254527257N00557640EA0000001099
+B1157274527264N00557646EA0000001102
+B1157294527266N00557655EA0000001102
+B1157314527265N00557665EA0000001101
+B1157334527263N00557670EA0000001101
+B1157354527248N00557678EA0000001100
+B1157374527234N00557674EA0000001100
+B1157394527222N00557663EA0000001101
+B1157414527215N00557648EA0000001101
+B1157434527216N00557628EA0000001100
+B1157454527224N00557613EA0000001101
+B1157474527231N00557602EA0000001102
+B1157494527237N00557592EA0000001103
+B1157514527243N00557583EA0000001104
+B1157544527246N00557571EA0000001104
+B1157564527245N00557552EA0000001104
+B1157584527242N00557536EA0000001105
+B1158004527234N00557529EA0000001105
+B1158024527224N00557526EA0000001102
+B1158044527214N00557531EA0000001099
+B1158064527205N00557538EA0000001097
+B1158084527195N00557542EA0000001096
+B1158104527186N00557549EA0000001094
+B1158124527178N00557555EA0000001093
+B1158144527172N00557560EA0000001091
+B1158164527165N00557568EA0000001088
+B1158184527157N00557577EA0000001086
+B1158204527147N00557585EA0000001085
+B1158224527140N00557592EA0000001084
+B1158244527135N00557599EA0000001081
+B1158264527127N00557607EA0000001079
+B1158284527118N00557613EA0000001077
+B1158304527111N00557623EA0000001073
+B1158324527101N00557635EA0000001070
+B1158344527090N00557646EA0000001069
+B1158364527081N00557656EA0000001069
+B1158384527073N00557665EA0000001071
+B1158404527068N00557671EA0000001071
+B1158424527064N00557678EA0000001071
+B1158444527059N00557684EA0000001071
+B1158464527055N00557690EA0000001073
+B1158484527053N00557695EA0000001074
+B1158504527053N00557702EA0000001075
+B1158524527058N00557708EA0000001075
+B1158544527067N00557710EA0000001074
+B1158564527077N00557706EA0000001073
+B1158584527085N00557688EA0000001073
+B1159004527087N00557670EA0000001073
+B1159024527081N00557659EA0000001073
+B1159044527073N00557657EA0000001072
+B1159064527064N00557660EA0000001072
+B1159084527057N00557660EA0000001073
+B1159104527049N00557658EA0000001072
+B1159124527036N00557660EA0000001071
+B1159144527034N00557663EA0000001070
+B1159164527029N00557672EA0000001069
+B1159184527019N00557686EA0000001069
+B1159204527014N00557695EA0000001070
+B1159224527010N00557703EA0000001069
+B1159244527004N00557714EA0000001068
+B1159264526997N00557722EA0000001068
+B1159284526991N00557730EA0000001068
+B1159304526985N00557740EA0000001067
+B1159324526978N00557749EA0000001068
+B1159354526975N00557756EA0000001069
+B1159374526970N00557763EA0000001069
+B1159394526964N00557770EA0000001068
+B1159414526956N00557774EA0000001068
+B1159434526949N00557780EA0000001067
+B1159454526942N00557789EA0000001067
+B1159474526935N00557796EA0000001067
+B1159494526928N00557803EA0000001066
+B1159514526920N00557810EA0000001063
+B1159534526911N00557814EA0000001061
+B1159554526903N00557820EA0000001059
+B1159574526896N00557827EA0000001056
+B1159594526888N00557834EA0000001053
+B1200014526882N00557840EA0000001051
+B1200034526875N00557847EA0000001048
+B1200054526865N00557855EA0000001046
+B1200074526855N00557859EA0000001045
+B1200094526846N00557861EA0000001045
+B1200114526835N00557863EA0000001044
+B1200134526823N00557865EA0000001044
+B1200154526812N00557866EA0000001044
+B1200174526803N00557866EA0000001044
+B1200194526792N00557867EA0000001042
+B1200214526778N00557866EA0000001040
+B1200234526768N00557867EA0000001038
+B1200254526757N00557869EA0000001036
+B1200274526744N00557868EA0000001033
+B1200294526733N00557868EA0000001031
+B1200314526723N00557870EA0000001029
+B1200334526712N00557869EA0000001027
+B1200354526700N00557870EA0000001025
+B1200374526689N00557871EA0000001023
+B1200394526678N00557872EA0000001021
+B1200414526666N00557872EA0000001018
+B1200434526655N00557869EA0000001017
+B1200454526645N00557863EA0000001016
+B1200474526635N00557858EA0000001016
+B1200494526625N00557856EA0000001018
+B1200514526611N00557852EA0000001024
+B1200534526603N00557841EA0000001027
+B1200554526600N00557826EA0000001031
+B1200574526605N00557815EA0000001035
+B1200594526614N00557814EA0000001039
+B1201014526622N00557815EA0000001045
+B1201034526630N00557820EA0000001049
+B1201054526635N00557830EA0000001053
+B1201074526633N00557837EA0000001056
+B1201094526627N00557844EA0000001058
+B1201124526620N00557849EA0000001060
+B1201144526610N00557847EA0000001063
+B1201164526601N00557836EA0000001065
+B1201184526596N00557822EA0000001070
+B1201204526592N00557811EA0000001075
+B1201224526588N00557802EA0000001080
+B1201244526586N00557791EA0000001084
+B1201264526592N00557782EA0000001087
+B1201284526602N00557782EA0000001090
+B1201304526607N00557795EA0000001090
+B1201324526596N00557807EA0000001093
+B1201344526582N00557802EA0000001095
+B1201364526576N00557794EA0000001098
+B1201384526569N00557787EA0000001101
+B1201404526563N00557776EA0000001103
+B1201424526561N00557769EA0000001105
+B1201444526568N00557753EA0000001107
+B1201464526577N00557755EA0000001109
+B1201484526584N00557762EA0000001112
+B1201504526589N00557767EA0000001114
+B1201524526594N00557769EA0000001116
+B1201544526602N00557766EA0000001116
+B1201564526607N00557757EA0000001114
+B1201584526602N00557743EA0000001114
+B1202004526593N00557729EA0000001111
+B1202024526583N00557718EA0000001108
+B1202044526572N00557716EA0000001104
+B1202064526560N00557722EA0000001101
+B1202084526550N00557729EA0000001102
+B1202104526542N00557734EA0000001101
+B1202124526533N00557738EA0000001099
+B1202144526523N00557740EA0000001100
+B1202164526516N00557742EA0000001102
+B1202184526509N00557739EA0000001101
+B1202204526501N00557732EA0000001101
+B1202224526495N00557718EA0000001102
+B1202244526502N00557700EA0000001101
+B1202264526513N00557694EA0000001102
+B1202284526522N00557706EA0000001105
+B1202304526520N00557711EA0000001106
+B1202324526500N00557714EA0000001110
+B1202344526490N00557703EA0000001112
+B1202364526483N00557691EA0000001115
+B1202384526476N00557681EA0000001115
+B1202404526469N00557673EA0000001115
+B1202424526460N00557672EA0000001114
+B1202444526451N00557676EA0000001113
+B1202464526442N00557678EA0000001111
+B1202484526434N00557682EA0000001108
+B1202504526425N00557688EA0000001104
+B1202534526415N00557693EA0000001101
+B1202554526406N00557699EA0000001097
+B1202574526398N00557704EA0000001092
+B1202594526388N00557709EA0000001088
+B1203014526378N00557715EA0000001085
+B1203034526368N00557719EA0000001081
+B1203054526357N00557724EA0000001076
+B1203074526346N00557729EA0000001073
+B1203094526336N00557733EA0000001069
+B1203114526325N00557736EA0000001063
+B1203134526313N00557740EA0000001056
+B1203154526301N00557746EA0000001049
+B1203174526290N00557752EA0000001041
+B1203194526279N00557760EA0000001033
+B1203214526268N00557769EA0000001026
+B1203234526257N00557778EA0000001020
+B1203254526245N00557786EA0000001015
+B1203274526235N00557793EA0000001010
+B1203294526223N00557799EA0000001005
+B1203314526211N00557805EA0000001002
+B1203334526200N00557811EA0000000999
+B1203354526190N00557816EA0000000998
+B1203374526181N00557818EA0000000999
+B1203394526172N00557819EA0000001000
+B1203414526159N00557819EA0000001001
+B1203434526146N00557818EA0000001001
+B1203454526133N00557818EA0000001002
+B1203474526122N00557819EA0000001002
+B1203494526110N00557819EA0000001002
+B1203514526097N00557818EA0000001000
+B1203534526084N00557815EA0000000998
+B1203554526071N00557815EA0000000997
+B1203574526059N00557814EA0000000995
+B1203594526047N00557812EA0000000993
+B1204014526034N00557811EA0000000992
+B1204034526022N00557813EA0000000991
+B1204054526010N00557815EA0000000990
+B1204074525990N00557819EA0000000987
+B1204094525978N00557823EA0000000986
+B1204114525972N00557824EA0000000985
+B1204134525960N00557827EA0000000982
+B1204154525943N00557834EA0000000978
+B1204174525932N00557840EA0000000976
+B1204194525923N00557847EA0000000973
+B1204214525913N00557854EA0000000969
+B1204234525903N00557863EA0000000966
+B1204254525894N00557872EA0000000964
+B1204274525886N00557881EA0000000962
+B1204294525879N00557890EA0000000961
+B1204324525871N00557900EA0000000959
+B1204344525861N00557909EA0000000958
+B1204364525855N00557918EA0000000959
+B1204384525851N00557925EA0000000962
+B1204404525845N00557931EA0000000965
+B1204424525838N00557933EA0000000967
+B1204444525830N00557935EA0000000968
+B1204464525821N00557938EA0000000968
+B1204484525814N00557945EA0000000967
+B1204504525810N00557948EA0000000965
+B1204524525794N00557947EA0000000963
+B1204544525782N00557946EA0000000960
+B1204564525771N00557945EA0000000958
+B1204584525760N00557943EA0000000956
+B1205004525748N00557942EA0000000956
+B1205024525737N00557940EA0000000957
+B1205044525726N00557938EA0000000958
+B1205064525715N00557935EA0000000958
+B1205084525704N00557932EA0000000958
+B1205104525692N00557929EA0000000958
+B1205124525682N00557927EA0000000957
+B1205144525671N00557925EA0000000955
+B1205164525658N00557923EA0000000953
+B1205184525647N00557920EA0000000952
+B1205204525635N00557919EA0000000950
+B1205224525622N00557917EA0000000947
+B1205244525610N00557916EA0000000946
+B1205264525599N00557914EA0000000944
+B1205284525586N00557912EA0000000942
+B1205304525573N00557908EA0000000939
+B1205324525560N00557905EA0000000937
+B1205344525546N00557903EA0000000936
+B1205364525531N00557903EA0000000936
+B1205384525518N00557904EA0000000937
+B1205404525507N00557903EA0000000936
+B1205424525494N00557904EA0000000935
+B1205444525475N00557908EA0000000935
+B1205464525469N00557908EA0000000936
+B1205484525458N00557905EA0000000937
+B1205504525443N00557899EA0000000938
+B1205524525432N00557893EA0000000937
+B1205544525419N00557889EA0000000935
+B1205564525408N00557886EA0000000934
+B1205584525398N00557880EA0000000933
+B1206004525385N00557875EA0000000930
+B1206024525370N00557870EA0000000928
+B1206044525357N00557864EA0000000927
+B1206074525345N00557858EA0000000927
+B1206094525333N00557850EA0000000928
+B1206114525321N00557843EA0000000930
+B1206134525312N00557837EA0000000933
+B1206154525306N00557829EA0000000937
+B1206174525299N00557823EA0000000940
+B1206194525291N00557820EA0000000944
+B1206214525285N00557825EA0000000948
+B1206234525284N00557833EA0000000951
+B1206254525291N00557840EA0000000954
+B1206274525300N00557834EA0000000957
+B1206294525308N00557820EA0000000960
+B1206314525308N00557801EA0000000964
+B1206334525303N00557790EA0000000967
+B1206354525297N00557793EA0000000971
+B1206374525298N00557802EA0000000974
+B1206394525304N00557805EA0000000976
+B1206414525312N00557797EA0000000978
+B1206434525316N00557783EA0000000982
+B1206454525313N00557769EA0000000986
+B1206474525308N00557767EA0000000990
+B1206494525307N00557776EA0000000994
+B1206514525314N00557780EA0000000997
+B1206534525322N00557772EA0000000999
+B1206554525326N00557756EA0000001002
+B1206574525322N00557739EA0000001005
+B1206594525315N00557737EA0000001008
+B1207014525309N00557744EA0000001011
+B1207034525304N00557751EA0000001015
+B1207054525298N00557756EA0000001018
+B1207074525294N00557762EA0000001021
+B1207094525295N00557771EA0000001023
+B1207114525302N00557778EA0000001026
+B1207134525311N00557775EA0000001028
+B1207154525318N00557762EA0000001030
+B1207174525315N00557745EA0000001033
+B1207194525304N00557733EA0000001037
+B1207214525298N00557739EA0000001040
+B1207234525297N00557749EA0000001042
+B1207254525302N00557757EA0000001043
+B1207274525312N00557758EA0000001045
+B1207294525322N00557749EA0000001046
+B1207314525328N00557735EA0000001047
+B1207334525327N00557716EA0000001049
+B1207354525323N00557702EA0000001052
+B1207374525316N00557698EA0000001055
+B1207394525311N00557704EA0000001058
+B1207414525311N00557714EA0000001060
+B1207434525316N00557722EA0000001062
+B1207464525325N00557723EA0000001064
+B1207484525335N00557703EA0000001064
+B1207504525333N00557681EA0000001070
+B1207524525327N00557669EA0000001075
+B1207544525320N00557666EA0000001079
+B1207564525312N00557669EA0000001081
+B1207584525307N00557683EA0000001084
+B1208004525313N00557694EA0000001088
+B1208024525320N00557698EA0000001092
+B1208044525329N00557697EA0000001094
+B1208064525338N00557690EA0000001096
+B1208084525347N00557669EA0000001098
+B1208104525345N00557651EA0000001100
+B1208124525338N00557646EA0000001103
+B1208144525330N00557649EA0000001110
+B1208164525326N00557656EA0000001113
+B1208184525325N00557665EA0000001116
+B1208204525330N00557675EA0000001119
+B1208224525338N00557680EA0000001122
+B1208244525348N00557675EA0000001124
+B1208264525357N00557661EA0000001126
+B1208284525362N00557645EA0000001128
+B1208304525363N00557627EA0000001129
+B1208324525357N00557610EA0000001130
+B1208344525349N00557602EA0000001131
+B1208364525340N00557602EA0000001132
+B1208384525333N00557603EA0000001135
+B1208404525327N00557608EA0000001138
+B1208424525324N00557618EA0000001140
+B1208444525325N00557628EA0000001143
+B1208464525331N00557632EA0000001146
+B1208484525342N00557632EA0000001148
+B1208504525352N00557622EA0000001149
+B1208524525357N00557607EA0000001151
+B1208544525354N00557589EA0000001153
+B1208564525347N00557573EA0000001155
+B1208584525341N00557567EA0000001159
+B1209004525332N00557565EA0000001162
+B1209024525323N00557568EA0000001165
+B1209044525319N00557584EA0000001171
+B1209064525325N00557594EA0000001174
+B1209084525334N00557596EA0000001177
+B1209104525342N00557589EA0000001179
+B1209124525349N00557573EA0000001181
+B1209144525352N00557555EA0000001183
+B1209164525351N00557539EA0000001187
+B1209184525347N00557528EA0000001192
+B1209204525343N00557516EA0000001197
+B1209234525335N00557506EA0000001201
+B1209254525326N00557504EA0000001205
+B1209274525319N00557508EA0000001209
+B1209294525314N00557516EA0000001212
+B1209314525314N00557525EA0000001216
+B1209334525318N00557533EA0000001219
+B1209354525325N00557534EA0000001222
+B1209374525333N00557528EA0000001224
+B1209394525338N00557516EA0000001227
+B1209414525342N00557503EA0000001230
+B1209434525344N00557488EA0000001234
+B1209454525344N00557474EA0000001239
+B1209474525341N00557464EA0000001243
+B1209494525337N00557455EA0000001246
+B1209514525329N00557453EA0000001248
+B1209534525324N00557461EA0000001251
+B1209554525322N00557471EA0000001255
+B1209574525323N00557480EA0000001259
+B1209594525328N00557485EA0000001264
+B1210014525336N00557483EA0000001268
+B1210034525344N00557473EA0000001273
+B1210054525347N00557460EA0000001277
+B1210074525344N00557447EA0000001281
+B1210094525341N00557433EA0000001284
+B1210114525337N00557421EA0000001286
+B1210134525329N00557416EA0000001289
+B1210154525319N00557418EA0000001292
+B1210174525312N00557423EA0000001296
+B1210194525305N00557429EA0000001299
+B1210214525300N00557439EA0000001302
+B1210234525300N00557449EA0000001304
+B1210254525309N00557451EA0000001306
+B1210274525317N00557442EA0000001308
+B1210294525320N00557426EA0000001311
+B1210314525320N00557410EA0000001314
+B1210334525316N00557397EA0000001318
+B1210354525306N00557381EA0000001322
+B1210374525303N00557377EA0000001323
+B1210394525290N00557376EA0000001326
+B1210414525285N00557382EA0000001328
+B1210434525283N00557391EA0000001324
+B1210454525287N00557399EA0000001325
+B1210474525296N00557399EA0000001326
+B1210494525304N00557388EA0000001326
+B1210514525308N00557371EA0000001327
+B1210534525307N00557355EA0000001331
+B1210554525302N00557344EA0000001334
+B1210584525293N00557334EA0000001336
+B1211004525283N00557331EA0000001337
+B1211024525275N00557338EA0000001339
+B1211044525275N00557345EA0000001340
+B1211064525282N00557346EA0000001342
+B1211084525289N00557335EA0000001344
+B1211104525294N00557318EA0000001345
+B1211124525296N00557301EA0000001346
+B1211144525294N00557285EA0000001347
+B1211164525289N00557272EA0000001348
+B1211184525280N00557264EA0000001347
+B1211204525270N00557265EA0000001345
+B1211224525263N00557272EA0000001343
+B1211244525262N00557283EA0000001341
+B1211264525269N00557288EA0000001339
+B1211284525277N00557285EA0000001337
+B1211304525283N00557274EA0000001335
+B1211324525286N00557257EA0000001333
+B1211344525280N00557240EA0000001332
+B1211364525274N00557226EA0000001331
+B1211384525267N00557210EA0000001328
+B1211404525260N00557194EA0000001326
+B1211424525255N00557176EA0000001323
+B1211444525249N00557157EA0000001320
+B1211464525241N00557142EA0000001319
+B1211484525233N00557128EA0000001317
+B1211504525223N00557115EA0000001315
+B1211524525212N00557107EA0000001312
+B1211544525201N00557101EA0000001307
+B1211564525187N00557097EA0000001301
+B1211584525174N00557095EA0000001296
+B1212004525161N00557093EA0000001292
+B1212024525147N00557092EA0000001286
+B1212044525131N00557090EA0000001282
+B1212064525116N00557086EA0000001276
+B1212084525099N00557082EA0000001272
+B1212104525082N00557079EA0000001268
+B1212124525058N00557073EA0000001263
+B1212144525042N00557068EA0000001259
+B1212164525025N00557064EA0000001255
+B1212184525010N00557058EA0000001251
+B1212204524994N00557051EA0000001246
+B1212224524978N00557045EA0000001241
+B1212244524963N00557038EA0000001237
+B1212264524948N00557034EA0000001231
+B1212284524933N00557032EA0000001226
+B1212304524918N00557029EA0000001221
+B1212324524904N00557028EA0000001215
+B1212344524888N00557027EA0000001211
+B1212374524873N00557025EA0000001207
+B1212394524862N00557024EA0000001205
+B1212414524850N00557021EA0000001202
+B1212434524836N00557019EA0000001201
+B1212454524825N00557019EA0000001201
+B1212474524819N00557021EA0000001204
+B1212494524812N00557020EA0000001205
+B1212514524803N00557021EA0000001208
+B1212534524796N00557022EA0000001213
+B1212554524791N00557027EA0000001216
+B1212574524786N00557035EA0000001220
+B1212594524785N00557046EA0000001224
+B1213014524785N00557046EA0000001228
+B1213034524796N00557062EA0000001231
+B1213054524805N00557058EA0000001235
+B1213074524813N00557049EA0000001239
+B1213094524814N00557036EA0000001242
+B1213114524808N00557024EA0000001245
+B1213134524801N00557016EA0000001249
+B1213154524794N00557009EA0000001252
+B1213174524788N00557003EA0000001255
+B1213194524779N00557003EA0000001257
+B1213214524771N00557009EA0000001259
+B1213234524768N00557021EA0000001261
+B1213254524770N00557031EA0000001264
+B1213274524776N00557037EA0000001266
+B1213294524783N00557038EA0000001267
+B1213314524792N00557035EA0000001269
+B1213334524800N00557030EA0000001273
+B1213354524807N00557024EA0000001276
+B1213374524812N00557014EA0000001278
+B1213394524812N00556999EA0000001278
+B1213414524805N00556985EA0000001281
+B1213434524796N00556983EA0000001282
+B1213454524790N00556991EA0000001284
+B1213474524788N00557002EA0000001288
+B1213494524792N00557011EA0000001291
+B1213514524799N00557014EA0000001293
+B1213534524811N00557007EA0000001295
+B1213554524816N00556995EA0000001296
+B1213574524816N00556980EA0000001296
+B1213594524812N00556966EA0000001299
+B1214014524805N00556957EA0000001300
+B1214034524796N00556953EA0000001302
+B1214054524787N00556952EA0000001306
+B1214074524779N00556950EA0000001310
+B1214094524772N00556951EA0000001312
+B1214114524765N00556956EA0000001314
+B1214134524762N00556967EA0000001316
+B1214154524766N00556978EA0000001317
+B1214184524776N00556981EA0000001318
+B1214204524786N00556976EA0000001319
+B1214224524792N00556964EA0000001321
+B1214244524795N00556951EA0000001321
+B1214264524794N00556934EA0000001322
+B1214284524789N00556918EA0000001325
+B1214304524782N00556908EA0000001328
+B1214324524774N00556902EA0000001330
+B1214344524766N00556902EA0000001330
+B1214364524757N00556908EA0000001331
+B1214384524753N00556917EA0000001334
+B1214404524752N00556921EA0000001334
+B1214424524753N00556935EA0000001334
+B1214444524757N00556946EA0000001334
+B1214464524766N00556950EA0000001333
+B1214484524776N00556944EA0000001332
+B1214504524782N00556927EA0000001331
+B1214524524778N00556910EA0000001331
+B1214544524770N00556899EA0000001334
+B1214564524761N00556891EA0000001333
+B1214584524751N00556884EA0000001334
+B1215004524740N00556880EA0000001335
+B1215024524729N00556877EA0000001336
+B1215044524719N00556871EA0000001336
+B1215064524708N00556867EA0000001334
+B1215084524696N00556861EA0000001331
+B1215104524685N00556853EA0000001329
+B1215124524674N00556847EA0000001326
+B1215144524662N00556842EA0000001323
+B1215164524649N00556838EA0000001319
+B1215184524635N00556834EA0000001317
+B1215204524622N00556829EA0000001315
+B1215224524610N00556823EA0000001312
+B1215244524596N00556817EA0000001309
+B1215264524582N00556810EA0000001306
+B1215284524570N00556803EA0000001303
+B1215304524551N00556795EA0000001298
+B1215324524538N00556791EA0000001293
+B1215344524525N00556785EA0000001289
+B1215364524512N00556780EA0000001284
+B1215384524499N00556775EA0000001278
+B1215404524486N00556770EA0000001272
+B1215424524473N00556767EA0000001267
+B1215444524461N00556762EA0000001260
+B1215464524448N00556756EA0000001253
+B1215484524435N00556752EA0000001247
+B1215504524422N00556748EA0000001241
+B1215524524408N00556741EA0000001235
+B1215554524395N00556735EA0000001230
+B1215574524382N00556728EA0000001224
+B1215594524367N00556718EA0000001217
+B1216014524351N00556710EA0000001210
+B1216034524337N00556706EA0000001205
+B1216054524324N00556701EA0000001200
+B1216074524310N00556694EA0000001195
+B1216094524297N00556687EA0000001191
+B1216114524284N00556680EA0000001187
+B1216134524270N00556673EA0000001182
+B1216154524255N00556666EA0000001178
+B1216174524242N00556658EA0000001175
+B1216194524229N00556651EA0000001172
+B1216214524214N00556645EA0000001168
+B1216234524199N00556639EA0000001164
+B1216254524184N00556634EA0000001160
+B1216274524169N00556628EA0000001156
+B1216294524155N00556624EA0000001153
+B1216314524142N00556619EA0000001152
+B1216334524130N00556616EA0000001151
+B1216354524120N00556616EA0000001151
+B1216374524112N00556614EA0000001152
+B1216394524105N00556612EA0000001154
+B1216414524099N00556611EA0000001155
+B1216434524092N00556608EA0000001156
+B1216454524082N00556602EA0000001155
+B1216474524075N00556598EA0000001156
+B1216494524068N00556598EA0000001158
+B1216514524061N00556599EA0000001160
+B1216534524055N00556600EA0000001164
+B1216554524050N00556600EA0000001168
+B1216574524043N00556597EA0000001171
+B1216594524038N00556586EA0000001173
+B1217014524039N00556571EA0000001175
+B1217034524050N00556564EA0000001177
+B1217054524065N00556566EA0000001180
+B1217074524074N00556575EA0000001184
+B1217094524069N00556588EA0000001190
+B1217114524061N00556585EA0000001194
+B1217134524057N00556574EA0000001199
+B1217154524059N00556560EA0000001203
+B1217174524068N00556549EA0000001207
+B1217194524079N00556548EA0000001211
+B1217214524088N00556554EA0000001215
+B1217234524088N00556563EA0000001219
+B1217254524081N00556565EA0000001222
+B1217274524076N00556553EA0000001226
+B1217294524078N00556540EA0000001231
+B1217314524085N00556533EA0000001235
+B1217344524094N00556531EA0000001241
+B1217364524103N00556537EA0000001246
+B1217384524106N00556550EA0000001251
+B1217404524100N00556559EA0000001255
+B1217424524094N00556557EA0000001260
+B1217444524089N00556545EA0000001264
+B1217464524087N00556532EA0000001269
+B1217484524091N00556521EA0000001274
+B1217504524101N00556515EA0000001278
+B1217524524111N00556517EA0000001282
+B1217544524118N00556528EA0000001286
+B1217564524118N00556541EA0000001289
+B1217584524110N00556546EA0000001292
+B1218004524101N00556540EA0000001296
+B1218024524097N00556526EA0000001299
+B1218044524099N00556513EA0000001302
+B1218064524107N00556505EA0000001306
+B1218084524117N00556507EA0000001310
+B1218104524126N00556517EA0000001313
+B1218124524125N00556529EA0000001317
+B1218144524118N00556533EA0000001321
+B1218164524109N00556528EA0000001323
+B1218184524105N00556515EA0000001326
+B1218204524108N00556502EA0000001327
+B1218224524116N00556495EA0000001330
+B1218244524125N00556493EA0000001334
+B1218264524134N00556490EA0000001338
+B1218284524144N00556492EA0000001341
+B1218304524149N00556501EA0000001344
+B1218324524147N00556507EA0000001347
+B1218344524140N00556502EA0000001349
+B1218364524135N00556490EA0000001351
+B1218384524134N00556477EA0000001354
+B1218404524136N00556463EA0000001356
+B1218424524139N00556449EA0000001354
+B1218444524151N00556444EA0000001355
+B1218464524161N00556451EA0000001355
+B1218484524161N00556465EA0000001356
+B1218504524147N00556468EA0000001355
+B1218524524138N00556460EA0000001357
+B1218544524134N00556446EA0000001360
+B1218564524134N00556433EA0000001362
+B1218584524134N00556420EA0000001364
+B1219004524131N00556408EA0000001365
+B1219024524130N00556395EA0000001367
+B1219044524137N00556382EA0000001368
+B1219064524148N00556379EA0000001369
+B1219084524157N00556383EA0000001370
+B1219104524158N00556392EA0000001370
+B1219124524148N00556394EA0000001369
+B1219154524139N00556385EA0000001369
+B1219174524136N00556372EA0000001371
+B1219194524133N00556361EA0000001374
+B1219214524131N00556348EA0000001377
+B1219234524132N00556334EA0000001378
+B1219254524140N00556326EA0000001379
+B1219274524150N00556328EA0000001380
+B1219294524155N00556338EA0000001381
+B1219314524152N00556346EA0000001381
+B1219334524143N00556344EA0000001382
+B1219354524136N00556331EA0000001382
+B1219374524135N00556315EA0000001383
+B1219394524137N00556300EA0000001385
+B1219414524139N00556283EA0000001386
+B1219434524140N00556266EA0000001388
+B1219454524140N00556249EA0000001389
+B1219474524142N00556233EA0000001389
+B1219494524146N00556219EA0000001389
+B1219514524151N00556205EA0000001387
+B1219534524155N00556188EA0000001384
+B1219554524161N00556170EA0000001381
+B1219574524169N00556154EA0000001379
+B1219594524176N00556139EA0000001379
+B1220014524183N00556125EA0000001380
+B1220034524189N00556110EA0000001381
+B1220054524196N00556096EA0000001383
+B1220074524202N00556084EA0000001384
+B1220094524210N00556076EA0000001385
+B1220114524223N00556076EA0000001383
+B1220134524235N00556089EA0000001382
+B1220154524235N00556104EA0000001380
+B1220174524225N00556108EA0000001378
+B1220194524218N00556096EA0000001376
+B1220214524218N00556080EA0000001376
+B1220234524224N00556069EA0000001376
+B1220254524231N00556059EA0000001373
+B1220274524236N00556046EA0000001372
+B1220294524243N00556024EA0000001369
+B1220314524248N00556008EA0000001366
+B1220334524255N00555991EA0000001362
+B1220354524261N00555974EA0000001359
+B1220374524266N00555957EA0000001356
+B1220394524273N00555939EA0000001352
+B1220414524280N00555921EA0000001351
+B1220434524285N00555905EA0000001349
+B1220454524289N00555888EA0000001346
+B1220474524293N00555870EA0000001344
+B1220494524295N00555850EA0000001343
+B1220514524296N00555832EA0000001343
+B1220544524295N00555816EA0000001341
+B1220564524291N00555802EA0000001338
+B1220584524285N00555788EA0000001338
+B1221004524280N00555778EA0000001337
+B1221024524273N00555770EA0000001334
+B1221044524265N00555759EA0000001330
+B1221064524257N00555748EA0000001328
+B1221084524249N00555737EA0000001326
+B1221104524241N00555728EA0000001323
+B1221124524233N00555719EA0000001320
+B1221144524224N00555710EA0000001318
+B1221164524213N00555700EA0000001317
+B1221184524203N00555691EA0000001318
+B1221204524196N00555682EA0000001321
+B1221224524190N00555672EA0000001323
+B1221244524183N00555666EA0000001325
+B1221264524178N00555666EA0000001325
+B1221284524171N00555670EA0000001324
+B1221304524166N00555676EA0000001324
+B1221324524162N00555684EA0000001323
+B1221344524154N00555688EA0000001322
+B1221364524143N00555683EA0000001322
+B1221384524133N00555675EA0000001324
+B1221404524126N00555667EA0000001327
+B1221424524120N00555657EA0000001328
+B1221444524117N00555643EA0000001328
+B1221464524124N00555629EA0000001329
+B1221484524135N00555628EA0000001329
+B1221504524140N00555643EA0000001330
+B1221524524135N00555653EA0000001331
+B1221544524124N00555649EA0000001332
+B1221564524117N00555636EA0000001332
+B1221584524115N00555618EA0000001333
+B1222004524112N00555602EA0000001332
+B1222024524109N00555585EA0000001330
+B1222044524107N00555565EA0000001329
+B1222064524105N00555547EA0000001328
+B1222084524102N00555530EA0000001328
+B1222104524099N00555502EA0000001328
+B1222124524097N00555486EA0000001329
+B1222144524092N00555471EA0000001329
+B1222164524087N00555455EA0000001329
+B1222184524084N00555439EA0000001331
+B1222204524081N00555425EA0000001333
+B1222224524077N00555414EA0000001338
+B1222244524071N00555409EA0000001339
+B1222264524064N00555413EA0000001340
+B1222284524064N00555425EA0000001341
+B1222314524073N00555434EA0000001342
+B1222334524084N00555435EA0000001344
+B1222354524094N00555430EA0000001346
+B1222374524103N00555417EA0000001346
+B1222394524108N00555398EA0000001348
+B1222414524106N00555382EA0000001351
+B1222434524101N00555373EA0000001355
+B1222454524095N00555364EA0000001357
+B1222474524089N00555363EA0000001358
+B1222494524085N00555370EA0000001359
+B1222514524087N00555381EA0000001360
+B1222534524098N00555383EA0000001361
+B1222554524110N00555376EA0000001362
+B1222574524119N00555361EA0000001362
+B1222594524121N00555342EA0000001362
+B1223014524115N00555328EA0000001362
+B1223034524108N00555320EA0000001363
+B1223054524099N00555315EA0000001362
+B1223074524088N00555314EA0000001362
+B1223094524080N00555311EA0000001362
+B1223114524074N00555304EA0000001364
+B1223134524068N00555299EA0000001366
+B1223154524061N00555298EA0000001367
+B1223174524056N00555303EA0000001368
+B1223194524058N00555312EA0000001369
+B1223214524065N00555318EA0000001370
+B1223234524076N00555318EA0000001370
+B1223254524086N00555319EA0000001370
+B1223274524095N00555325EA0000001370
+B1223294524100N00555336EA0000001371
+B1223314524097N00555346EA0000001371
+B1223334524090N00555347EA0000001372
+B1223354524083N00555339EA0000001374
+B1223374524079N00555328EA0000001376
+B1223394524079N00555315EA0000001378
+B1223414524079N00555302EA0000001379
+B1223434524075N00555292EA0000001379
+B1223454524066N00555287EA0000001379
+B1223474524062N00555294EA0000001380
+B1223494524061N00555304EA0000001380
+B1223514524062N00555315EA0000001379
+B1223534524057N00555324EA0000001380
+B1223554524048N00555326EA0000001382
+B1223574524042N00555315EA0000001383
+B1223594524044N00555298EA0000001384
+B1224014524057N00555288EA0000001384
+B1224034524071N00555292EA0000001384
+B1224054524077N00555305EA0000001383
+B1224074524072N00555316EA0000001385
+B1224104524065N00555320EA0000001390
+B1224124524060N00555326EA0000001392
+B1224144524055N00555334EA0000001397
+B1224164524049N00555339EA0000001402
+B1224184524045N00555338EA0000001405
+B1224204524040N00555331EA0000001407
+B1224224524040N00555321EA0000001409
+B1224244524047N00555310EA0000001411
+B1224264524057N00555310EA0000001413
+B1224284524062N00555320EA0000001414
+B1224304524059N00555328EA0000001416
+B1224324524054N00555330EA0000001419
+B1224344524051N00555325EA0000001422
+B1224364524051N00555315EA0000001424
+B1224384524057N00555305EA0000001427
+B1224404524067N00555300EA0000001428
+B1224424524079N00555310EA0000001430
+B1224444524083N00555325EA0000001431
+B1224464524080N00555334EA0000001432
+B1224484524073N00555333EA0000001433
+B1224504524068N00555331EA0000001436
+B1224524524063N00555329EA0000001438
+B1224544524058N00555325EA0000001440
+B1224564524055N00555316EA0000001442
+B1224584524056N00555306EA0000001443
+B1225004524062N00555295EA0000001444
+B1225024524071N00555289EA0000001445
+B1225044524081N00555296EA0000001446
+B1225064524086N00555307EA0000001447
+B1225084524082N00555316EA0000001447
+B1225104524074N00555315EA0000001448
+B1225124524066N00555313EA0000001448
+B1225144524058N00555308EA0000001447
+B1225164524050N00555299EA0000001446
+B1225184524042N00555290EA0000001446
+B1225204524034N00555285EA0000001447
+B1225224524025N00555283EA0000001448
+B1225244524010N00555282EA0000001447
+B1225264523999N00555276EA0000001445
+B1225284523989N00555270EA0000001442
+B1225304523978N00555263EA0000001438
+B1225324523967N00555254EA0000001434
+B1225344523957N00555245EA0000001431
+B1225364523948N00555237EA0000001428
+B1225384523939N00555227EA0000001425
+B1225404523928N00555217EA0000001421
+B1225424523918N00555207EA0000001418
+B1225454523909N00555197EA0000001417
+B1225474523901N00555186EA0000001415
+B1225494523891N00555173EA0000001412
+B1225514523884N00555161EA0000001411
+B1225534523877N00555150EA0000001410
+B1225554523868N00555141EA0000001410
+B1225574523858N00555133EA0000001411
+B1225594523849N00555127EA0000001413
+B1226014523840N00555122EA0000001416
+B1226034523834N00555117EA0000001419
+B1226054523827N00555112EA0000001421
+B1226074523819N00555112EA0000001422
+B1226094523814N00555120EA0000001423
+B1226114523816N00555131EA0000001423
+B1226134523823N00555138EA0000001424
+B1226154523833N00555133EA0000001424
+B1226174523841N00555118EA0000001424
+B1226194523842N00555102EA0000001426
+B1226214523839N00555089EA0000001427
+B1226234523832N00555079EA0000001429
+B1226254523825N00555071EA0000001431
+B1226274523817N00555066EA0000001432
+B1226294523810N00555064EA0000001435
+B1226314523803N00555068EA0000001437
+B1226334523799N00555076EA0000001440
+B1226354523801N00555085EA0000001442
+B1226374523808N00555091EA0000001443
+B1226394523820N00555084EA0000001445
+B1226414523823N00555067EA0000001445
+B1226434523820N00555049EA0000001446
+B1226454523814N00555038EA0000001448
+B1226474523805N00555034EA0000001449
+B1226494523796N00555032EA0000001452
+B1226514523788N00555030EA0000001456
+B1226534523780N00555029EA0000001459
+B1226554523773N00555028EA0000001461
+B1226574523767N00555032EA0000001463
+B1226594523767N00555045EA0000001465
+B1227014523775N00555053EA0000001466
+B1227034523788N00555045EA0000001469
+B1227054523794N00555029EA0000001471
+B1227074523792N00555013EA0000001473
+B1227094523784N00555007EA0000001475
+B1227114523778N00555009EA0000001477
+B1227134523775N00555018EA0000001479
+B1227154523779N00555027EA0000001480
+B1227174523787N00555032EA0000001482
+B1227194523797N00555027EA0000001484
+B1227214523802N00555012EA0000001485
+B1227244523801N00554994EA0000001486
+B1227264523794N00554983EA0000001487
+B1227284523785N00554980EA0000001489
+B1227304523776N00554978EA0000001492
+B1227324523767N00554979EA0000001495
+B1227344523760N00554987EA0000001499
+B1227364523760N00554999EA0000001502
+B1227384523766N00555012EA0000001505
+B1227404523778N00555018EA0000001508
+B1227424523789N00555010EA0000001511
+B1227444523797N00554994EA0000001514
+B1227464523795N00554979EA0000001517
+B1227484523788N00554970EA0000001519
+B1227504523780N00554964EA0000001522
+B1227524523771N00554961EA0000001525
+B1227544523764N00554956EA0000001529
+B1227564523758N00554953EA0000001533
+B1227584523751N00554959EA0000001536
+B1228004523747N00554971EA0000001538
+B1228024523750N00554984EA0000001540
+B1228044523759N00554996EA0000001540
+B1228064523771N00555000EA0000001541
+B1228084523783N00554992EA0000001541
+B1228104523790N00554977EA0000001543
+B1228124523789N00554963EA0000001544
+B1228144523783N00554956EA0000001547
+B1228164523777N00554959EA0000001549
+B1228184523772N00554967EA0000001550
+B1228204523773N00554978EA0000001550
+B1228224523779N00554990EA0000001551
+B1228244523789N00554993EA0000001551
+B1228264523797N00554985EA0000001551
+B1228284523796N00554973EA0000001552
+B1228304523791N00554963EA0000001555
+B1228324523784N00554958EA0000001557
+B1228344523778N00554958EA0000001558
+B1228364523774N00554965EA0000001560
+B1228384523776N00554976EA0000001562
+B1228404523788N00554982EA0000001565
+B1228424523798N00554980EA0000001568
+B1228444523807N00554972EA0000001570
+B1228464523812N00554958EA0000001573
+B1228484523810N00554943EA0000001575
+B1228504523803N00554935EA0000001576
+B1228524523794N00554941EA0000001579
+B1228544523791N00554953EA0000001582
+B1228564523794N00554965EA0000001585
+B1228584523804N00554972EA0000001588
+B1229004523817N00554971EA0000001591
+B1229034523827N00554962EA0000001594
+B1229054523829N00554946EA0000001596
+B1229074523826N00554938EA0000001598
+B1229094523821N00554941EA0000001601
+B1229114523820N00554952EA0000001603
+B1229134523826N00554964EA0000001606
+B1229154523834N00554971EA0000001609
+B1229174523844N00554967EA0000001611
+B1229194523849N00554955EA0000001613
+B1229214523846N00554939EA0000001616
+B1229234523838N00554938EA0000001619
+B1229254523831N00554946EA0000001623
+B1229274523825N00554959EA0000001626
+B1229294523826N00554974EA0000001629
+B1229314523832N00554982EA0000001632
+B1229334523841N00554981EA0000001634
+B1229354523846N00554969EA0000001637
+B1229374523842N00554955EA0000001639
+B1229394523835N00554948EA0000001642
+B1229414523826N00554948EA0000001645
+B1229434523820N00554954EA0000001647
+B1229454523821N00554966EA0000001650
+B1229474523829N00554975EA0000001652
+B1229494523840N00554973EA0000001655
+B1229514523849N00554960EA0000001657
+B1229534523848N00554940EA0000001659
+B1229554523842N00554929EA0000001661
+B1229574523836N00554936EA0000001665
+B1229594523834N00554946EA0000001670
+B1230014523837N00554957EA0000001673
+B1230034523845N00554967EA0000001677
+B1230054523855N00554965EA0000001679
+B1230074523864N00554952EA0000001682
+B1230094523864N00554936EA0000001684
+B1230114523858N00554927EA0000001686
+B1230134523850N00554932EA0000001689
+B1230154523848N00554937EA0000001694
+B1230174523854N00554961EA0000001698
+B1230194523865N00554966EA0000001700
+B1230214523877N00554959EA0000001702
+B1230234523883N00554946EA0000001703
+B1230254523881N00554933EA0000001704
+B1230274523874N00554926EA0000001707
+B1230294523867N00554920EA0000001711
+B1230314523860N00554915EA0000001716
+B1230334523851N00554915EA0000001720
+B1230354523843N00554921EA0000001724
+B1230374523841N00554931EA0000001729
+B1230394523843N00554942EA0000001732
+B1230424523850N00554952EA0000001734
+B1230444523861N00554954EA0000001734
+B1230464523871N00554944EA0000001735
+B1230484523876N00554929EA0000001735
+B1230504523871N00554913EA0000001736
+B1230524523864N00554906EA0000001738
+B1230544523856N00554900EA0000001739
+B1230564523847N00554893EA0000001741
+B1230584523837N00554890EA0000001744
+B1231004523830N00554888EA0000001749
+B1231024523823N00554883EA0000001753
+B1231044523816N00554881EA0000001757
+B1231064523810N00554887EA0000001759
+B1231084523806N00554899EA0000001762
+B1231104523809N00554911EA0000001763
+B1231124523818N00554920EA0000001764
+B1231144523828N00554920EA0000001765
+B1231164523832N00554907EA0000001766
+B1231184523830N00554893EA0000001769
+B1231204523823N00554888EA0000001772
+B1231224523815N00554891EA0000001775
+B1231244523809N00554900EA0000001776
+B1231264523806N00554912EA0000001777
+B1231284523809N00554924EA0000001776
+B1231304523817N00554932EA0000001774
+B1231324523827N00554930EA0000001773
+B1231344523834N00554922EA0000001771
+B1231364523834N00554908EA0000001769
+B1231384523831N00554896EA0000001768
+B1231404523824N00554889EA0000001769
+B1231424523817N00554881EA0000001771
+B1231444523811N00554870EA0000001773
+B1231464523806N00554860EA0000001777
+B1231484523799N00554856EA0000001782
+B1231504523791N00554851EA0000001787
+B1231524523785N00554839EA0000001791
+B1231544523786N00554823EA0000001795
+B1231564523793N00554811EA0000001801
+B1231584523799N00554821EA0000001805
+B1232004523801N00554835EA0000001810
+B1232024523803N00554846EA0000001814
+B1232044523802N00554857EA0000001817
+B1232064523793N00554863EA0000001819
+B1232084523787N00554856EA0000001820
+B1232104523785N00554844EA0000001821
+B1232124523794N00554841EA0000001822
+B1232144523803N00554849EA0000001824
+B1232164523808N00554862EA0000001827
+B1232194523805N00554874EA0000001829
+B1232214523796N00554876EA0000001831
+B1232234523791N00554864EA0000001833
+B1232254523793N00554850EA0000001835
+B1232274523800N00554846EA0000001838
+B1232294523811N00554851EA0000001840
+B1232314523818N00554860EA0000001844
+B1232334523819N00554872EA0000001846
+B1232354523812N00554879EA0000001848
+B1232374523804N00554875EA0000001850
+B1232394523802N00554863EA0000001851
+B1232414523802N00554863EA0000001854
+B1232434523819N00554859EA0000001856
+B1232454523823N00554870EA0000001858
+B1232474523819N00554883EA0000001860
+B1232494523812N00554887EA0000001862
+B1232514523805N00554878EA0000001863
+B1232534523806N00554864EA0000001864
+B1232554523811N00554857EA0000001866
+B1232574523817N00554864EA0000001868
+B1232594523815N00554876EA0000001870
+B1233014523806N00554881EA0000001871
+B1233034523799N00554874EA0000001872
+B1233054523800N00554863EA0000001872
+B1233074523809N00554856EA0000001875
+B1233094523816N00554850EA0000001879
+B1233114523823N00554844EA0000001882
+B1233134523832N00554843EA0000001884
+B1233154523841N00554850EA0000001886
+B1233174523842N00554863EA0000001888
+B1233194523836N00554873EA0000001889
+B1233214523827N00554869EA0000001891
+B1233234523820N00554860EA0000001894
+B1233254523815N00554847EA0000001896
+B1233274523816N00554834EA0000001898
+B1233294523822N00554826EA0000001900
+B1233314523829N00554828EA0000001902
+B1233334523830N00554848EA0000001905
+B1233354523821N00554858EA0000001907
+B1233374523812N00554855EA0000001909
+B1233394523805N00554846EA0000001913
+B1233414523796N00554832EA0000001915
+B1233434523802N00554821EA0000001919
+B1233454523814N00554822EA0000001922
+B1233474523821N00554839EA0000001925
+B1233494523817N00554859EA0000001929
+B1233514523804N00554864EA0000001931
+B1233534523794N00554851EA0000001933
+B1233564523794N00554837EA0000001936
+B1233584523806N00554833EA0000001941
+B1234004523817N00554839EA0000001946
+B1234024523823N00554854EA0000001951
+B1234044523816N00554867EA0000001954
+B1234064523803N00554868EA0000001957
+B1234084523796N00554857EA0000001959
+B1234104523800N00554842EA0000001961
+B1234124523809N00554837EA0000001966
+B1234144523818N00554845EA0000001970
+B1234164523823N00554863EA0000001974
+B1234184523818N00554877EA0000001977
+B1234204523807N00554881EA0000001979
+B1234224523807N00554881EA0000001981
+B1234244523798N00554856EA0000001983
+B1234264523807N00554849EA0000001986
+B1234284523816N00554859EA0000001988
+B1234304523819N00554881EA0000001993
+B1234324523813N00554892EA0000001996
+B1234344523804N00554892EA0000001997
+B1234364523795N00554888EA0000001996
+B1234384523788N00554880EA0000001999
+B1234404523785N00554868EA0000002001
+B1234424523786N00554855EA0000002004
+B1234444523787N00554844EA0000002009
+B1234464523784N00554836EA0000002015
+B1234484523778N00554829EA0000002019
+B1234504523770N00554827EA0000002023
+B1234524523761N00554833EA0000002029
+B1234544523756N00554845EA0000002033
+B1234564523753N00554862EA0000002038
+B1234584523754N00554879EA0000002043
+B1235004523761N00554892EA0000002046
+B1235024523771N00554896EA0000002051
+B1235044523779N00554889EA0000002056
+B1235064523782N00554877EA0000002060
+B1235084523780N00554866EA0000002065
+B1235104523776N00554858EA0000002073
+B1235124523765N00554850EA0000002079
+B1235144523756N00554848EA0000002085
+B1235164523749N00554857EA0000002090
+B1235184523745N00554870EA0000002095
+B1235204523741N00554885EA0000002099
+B1235224523743N00554902EA0000002102
+B1235244523752N00554915EA0000002106
+B1235264523764N00554914EA0000002109
+B1235284523771N00554906EA0000002113
+B1235304523775N00554894EA0000002120
+B1235324523777N00554884EA0000002127
+B1235354523776N00554875EA0000002133
+B1235374523773N00554866EA0000002138
+B1235394523766N00554858EA0000002142
+B1235414523757N00554853EA0000002147
+B1235434523748N00554857EA0000002152
+B1235454523741N00554867EA0000002157
+B1235474523739N00554882EA0000002161
+B1235494523742N00554898EA0000002164
+B1235514523750N00554909EA0000002168
+B1235534523759N00554910EA0000002172
+B1235554523766N00554904EA0000002176
+B1235574523767N00554894EA0000002182
+B1235594523765N00554884EA0000002186
+B1236014523762N00554875EA0000002191
+B1236034523758N00554866EA0000002196
+B1236054523749N00554860EA0000002201
+B1236074523740N00554863EA0000002206
+B1236094523732N00554873EA0000002212
+B1236114523727N00554886EA0000002218
+B1236134523727N00554901EA0000002223
+B1236154523732N00554916EA0000002228
+B1236174523741N00554925EA0000002232
+B1236194523751N00554926EA0000002237
+B1236214523757N00554920EA0000002241
+B1236234523759N00554911EA0000002244
+B1236254523759N00554901EA0000002246
+B1236274523754N00554891EA0000002250
+B1236294523747N00554884EA0000002254
+B1236314523739N00554882EA0000002258
+B1236334523729N00554884EA0000002263
+B1236354523720N00554884EA0000002268
+B1236374523711N00554880EA0000002271
+B1236394523703N00554877EA0000002274
+B1236414523695N00554874EA0000002277
+B1236434523687N00554871EA0000002278
+B1236454523678N00554865EA0000002278
+B1236474523666N00554859EA0000002279
+B1236494523655N00554854EA0000002281
+B1236514523638N00554848EA0000002281
+B1236534523626N00554843EA0000002283
+B1236554523615N00554838EA0000002286
+B1236574523606N00554834EA0000002288
+B1236594523596N00554830EA0000002288
+B1237014523585N00554825EA0000002290
+B1237034523574N00554820EA0000002292
+B1237054523563N00554817EA0000002295
+B1237074523552N00554812EA0000002296
+B1237094523541N00554807EA0000002298
+B1237114523530N00554803EA0000002300
+B1237144523518N00554802EA0000002300
+B1237164523504N00554800EA0000002301
+B1237184523492N00554797EA0000002302
+B1237204523482N00554792EA0000002302
+B1237224523471N00554789EA0000002300
+B1237244523458N00554784EA0000002298
+B1237264523446N00554779EA0000002298
+B1237284523434N00554775EA0000002297
+B1237304523423N00554769EA0000002296
+B1237324523410N00554762EA0000002293
+B1237344523396N00554756EA0000002291
+B1237364523383N00554748EA0000002290
+B1237384523371N00554740EA0000002289
+B1237404523357N00554732EA0000002288
+B1237424523343N00554724EA0000002288
+B1237444523331N00554716EA0000002288
+B1237464523318N00554710EA0000002287
+B1237484523305N00554702EA0000002285
+B1237504523294N00554695EA0000002285
+B1237524523285N00554690EA0000002286
+B1237544523275N00554684EA0000002285
+B1237564523265N00554677EA0000002286
+B1237584523255N00554671EA0000002287
+B1238004523245N00554668EA0000002287
+B1238024523234N00554662EA0000002286
+B1238044523222N00554656EA0000002285
+B1238064523210N00554651EA0000002284
+B1238084523198N00554644EA0000002282
+B1238104523184N00554636EA0000002281
+B1238124523170N00554630EA0000002278
+B1238144523156N00554623EA0000002274
+B1238164523140N00554614EA0000002271
+B1238184523125N00554611EA0000002269
+B1238204523111N00554605EA0000002265
+B1238224523096N00554596EA0000002263
+B1238244523082N00554589EA0000002260
+B1238264523069N00554582EA0000002256
+B1238284523055N00554574EA0000002251
+B1238304523035N00554564EA0000002245
+B1238324523022N00554559EA0000002243
+B1238344523008N00554553EA0000002239
+B1238364522992N00554544EA0000002234
+B1238384522977N00554534EA0000002231
+B1238404522963N00554527EA0000002227
+B1238424522948N00554521EA0000002222
+B1238444522932N00554513EA0000002215
+B1238464522915N00554506EA0000002210
+B1238484522899N00554498EA0000002206
+B1238504522884N00554489EA0000002204
+B1238534522868N00554480EA0000002203
+B1238554522853N00554471EA0000002203
+B1238574522838N00554463EA0000002205
+B1238594522827N00554457EA0000002208
+B1239014522819N00554451EA0000002210
+B1239034522811N00554446EA0000002210
+B1239054522801N00554440EA0000002210
+B1239074522790N00554434EA0000002211
+B1239094522778N00554429EA0000002213
+B1239114522765N00554425EA0000002216
+B1239134522752N00554420EA0000002219
+B1239154522741N00554415EA0000002223
+B1239174522731N00554409EA0000002226
+B1239194522731N00554409EA0000002228
+B1239214522707N00554396EA0000002229
+B1239234522695N00554390EA0000002231
+B1239254522683N00554385EA0000002233
+B1239274522670N00554380EA0000002234
+B1239294522657N00554376EA0000002234
+B1239314522643N00554371EA0000002233
+B1239334522630N00554368EA0000002232
+B1239354522618N00554362EA0000002231
+B1239374522606N00554357EA0000002229
+B1239394522592N00554349EA0000002226
+B1239414522580N00554342EA0000002225
+B1239434522569N00554335EA0000002224
+B1239454522556N00554330EA0000002223
+B1239474522542N00554326EA0000002221
+B1239494522527N00554322EA0000002221
+B1239514522514N00554320EA0000002221
+B1239534522500N00554318EA0000002220
+B1239554522485N00554315EA0000002219
+B1239574522470N00554310EA0000002219
+B1239594522457N00554306EA0000002220
+B1240014522444N00554302EA0000002220
+B1240034522429N00554295EA0000002219
+B1240054522416N00554288EA0000002220
+B1240074522404N00554281EA0000002221
+B1240094522389N00554274EA0000002222
+B1240114522370N00554263EA0000002226
+B1240134522357N00554258EA0000002228
+B1240154522344N00554255EA0000002228
+B1240174522332N00554251EA0000002227
+B1240194522319N00554247EA0000002226
+B1240214522306N00554244EA0000002226
+B1240234522293N00554239EA0000002227
+B1240254522282N00554235EA0000002231
+B1240274522269N00554231EA0000002234
+B1240294522258N00554227EA0000002239
+B1240314522249N00554223EA0000002243
+B1240344522240N00554218EA0000002246
+B1240364522231N00554212EA0000002247
+B1240384522222N00554206EA0000002249
+B1240404522214N00554199EA0000002251
+B1240424522204N00554193EA0000002253
+B1240444522194N00554186EA0000002255
+B1240464522185N00554182EA0000002256
+B1240484522176N00554177EA0000002256
+B1240504522165N00554171EA0000002254
+B1240524522152N00554164EA0000002251
+B1240544522139N00554156EA0000002250
+B1240564522133N00554153EA0000002247
+B1240584522115N00554148EA0000002243
+B1241004522115N00554148EA0000002237
+B1241024522090N00554137EA0000002231
+B1241044522076N00554133EA0000002227
+B1241064522063N00554128EA0000002223
+B1241084522051N00554123EA0000002219
+B1241104522037N00554118EA0000002214
+B1241124522023N00554108EA0000002210
+B1241144522011N00554102EA0000002208
+B1241164522005N00554105EA0000002207
+B1241184522002N00554104EA0000002209
+B1241204521995N00554100EA0000002210
+B1241224521986N00554095EA0000002213
+B1241244521979N00554089EA0000002218
+B1241264521972N00554084EA0000002220
+B1241284521963N00554078EA0000002222
+B1241304521953N00554072EA0000002225
+B1241324521945N00554069EA0000002228
+B1241344521935N00554063EA0000002230
+B1241364521927N00554056EA0000002231
+B1241384521917N00554050EA0000002231
+B1241404521905N00554041EA0000002230
+B1241424521895N00554033EA0000002231
+B1241444521887N00554028EA0000002232
+B1241464521876N00554022EA0000002232
+B1241484521864N00554012EA0000002233
+B1241504521851N00553999EA0000002241
+B1241524521845N00553992EA0000002249
+B1241544521838N00553983EA0000002258
+B1241564521833N00553975EA0000002265
+B1241584521829N00553966EA0000002271
+B1242004521823N00553957EA0000002278
+B1242024521818N00553949EA0000002284
+B1242044521812N00553940EA0000002291
+B1242064521808N00553934EA0000002297
+B1242084521802N00553928EA0000002301
+B1242104521796N00553919EA0000002304
+B1242124521789N00553911EA0000002306
+B1242154521782N00553900EA0000002308
+B1242174521775N00553887EA0000002310
+B1242194521767N00553875EA0000002314
+B1242214521761N00553865EA0000002319
+B1242234521754N00553856EA0000002322
+B1242254521745N00553844EA0000002327
+B1242274521738N00553836EA0000002334
+B1242294521732N00553832EA0000002339
+B1242314521723N00553828EA0000002342
+B1242334521718N00553825EA0000002345
+B1242354521704N00553819EA0000002348
+B1242374521695N00553814EA0000002349
+B1242394521685N00553806EA0000002350
+B1242414521672N00553796EA0000002348
+B1242434521658N00553785EA0000002348
+B1242454521645N00553775EA0000002350
+B1242474521635N00553768EA0000002352
+B1242494521624N00553760EA0000002352
+B1242514521612N00553750EA0000002354
+B1242534521601N00553741EA0000002357
+B1242554521591N00553731EA0000002360
+B1242574521582N00553719EA0000002365
+B1242594521573N00553709EA0000002370
+B1243014521563N00553699EA0000002377
+B1243034521552N00553687EA0000002384
+B1243054521544N00553682EA0000002393
+B1243074521538N00553686EA0000002403
+B1243094521532N00553689EA0000002409
+B1243114521524N00553684EA0000002414
+B1243134521517N00553675EA0000002419
+B1243154521510N00553667EA0000002422
+B1243174521501N00553662EA0000002424
+B1243194521489N00553654EA0000002424
+B1243214521477N00553643EA0000002426
+B1243234521466N00553632EA0000002425
+B1243254521454N00553620EA0000002423
+B1243274521441N00553606EA0000002423
+B1243294521428N00553595EA0000002425
+B1243314521410N00553581EA0000002426
+B1243334521397N00553573EA0000002424
+B1243354521381N00553564EA0000002424
+B1243374521368N00553558EA0000002426
+B1243394521359N00553553EA0000002428
+B1243414521349N00553546EA0000002427
+B1243434521336N00553537EA0000002425
+B1243454521326N00553531EA0000002424
+B1243474521318N00553526EA0000002421
+B1243494521309N00553522EA0000002418
+B1243514521298N00553515EA0000002411
+B1243544521287N00553507EA0000002403
+B1243564521274N00553501EA0000002397
+B1243584521262N00553493EA0000002393
+B1244004521251N00553484EA0000002389
+B1244024521239N00553476EA0000002385
+B1244044521228N00553466EA0000002381
+B1244064521216N00553456EA0000002377
+B1244084521204N00553447EA0000002374
+B1244104521193N00553439EA0000002371
+B1244124521183N00553428EA0000002366
+B1244144521170N00553418EA0000002360
+B1244164521157N00553407EA0000002356
+B1244184521144N00553399EA0000002353
+B1244204521132N00553393EA0000002349
+B1244224521121N00553386EA0000002344
+B1244244521108N00553379EA0000002338
+B1244264521095N00553372EA0000002333
+B1244284521084N00553365EA0000002328
+B1244304521072N00553357EA0000002321
+B1244324521060N00553348EA0000002316
+B1244344521048N00553340EA0000002311
+B1244364521036N00553331EA0000002307
+B1244384521025N00553322EA0000002301
+B1244404521013N00553314EA0000002296
+B1244424521001N00553305EA0000002292
+B1244444520989N00553297EA0000002288
+B1244464520978N00553289EA0000002284
+B1244484520965N00553282EA0000002280
+B1244504520952N00553274EA0000002277
+B1244524520940N00553266EA0000002273
+B1244544520928N00553258EA0000002271
+B1244564520915N00553250EA0000002269
+B1244584520904N00553242EA0000002268
+B1245004520894N00553233EA0000002266
+B1245024520882N00553221EA0000002264
+B1245044520870N00553208EA0000002264
+B1245064520859N00553195EA0000002264
+B1245084520848N00553184EA0000002263
+B1245104520831N00553169EA0000002260
+B1245124520819N00553160EA0000002257
+B1245144520807N00553153EA0000002255
+B1245164520794N00553149EA0000002253
+B1245184520783N00553144EA0000002250
+B1245204520772N00553138EA0000002247
+B1245224520762N00553130EA0000002242
+B1245244520751N00553122EA0000002237
+B1245264520741N00553116EA0000002233
+B1245284520730N00553107EA0000002228
+B1245304520720N00553096EA0000002223
+B1245324520709N00553086EA0000002219
+B1245354520699N00553075EA0000002215
+B1245374520688N00553063EA0000002211
+B1245394520677N00553054EA0000002208
+B1245414520666N00553045EA0000002205
+B1245434520656N00553034EA0000002201
+B1245454520643N00553025EA0000002195
+B1245474520630N00553018EA0000002192
+B1245494520620N00553010EA0000002189
+B1245514520612N00553001EA0000002186
+B1245534520602N00552993EA0000002182
+B1245554520591N00552985EA0000002180
+B1245574520581N00552978EA0000002178
+B1245594520581N00552978EA0000002175
+B1246014520560N00552961EA0000002173
+B1246034520548N00552953EA0000002173
+B1246054520536N00552945EA0000002173
+B1246074520525N00552938EA0000002175
+B1246094520512N00552932EA0000002177
+B1246114520503N00552926EA0000002181
+B1246134520499N00552919EA0000002184
+B1246154520492N00552913EA0000002187
+B1246174520484N00552905EA0000002191
+B1246194520478N00552897EA0000002197
+B1246214520472N00552890EA0000002204
+B1246234520464N00552882EA0000002208
+B1246254520452N00552872EA0000002212
+B1246274520440N00552864EA0000002218
+B1246294520430N00552859EA0000002223
+B1246314520419N00552851EA0000002225
+B1246334520405N00552842EA0000002225
+B1246354520394N00552831EA0000002223
+B1246374520386N00552819EA0000002222
+B1246394520377N00552811EA0000002220
+B1246414520367N00552803EA0000002217
+B1246434520357N00552792EA0000002215
+B1246454520345N00552784EA0000002214
+B1246474520333N00552777EA0000002214
+B1246494520326N00552774EA0000002216
+B1246514520300N00552760EA0000002222
+B1246534520288N00552755EA0000002228
+B1246554520277N00552752EA0000002235
+B1246574520269N00552744EA0000002245
+B1246594520260N00552735EA0000002256
+B1247014520251N00552726EA0000002267
+B1247034520242N00552718EA0000002279
+B1247054520236N00552712EA0000002291
+B1247074520228N00552706EA0000002301
+B1247094520219N00552699EA0000002309
+B1247114520210N00552689EA0000002316
+B1247144520201N00552681EA0000002322
+B1247164520192N00552673EA0000002327
+B1247184520181N00552666EA0000002330
+B1247204520169N00552659EA0000002330
+B1247224520158N00552653EA0000002331
+B1247244520151N00552648EA0000002333
+B1247264520146N00552641EA0000002334
+B1247284520137N00552636EA0000002333
+B1247304520128N00552628EA0000002332
+B1247324520120N00552620EA0000002333
+B1247344520111N00552614EA0000002332
+B1247364520101N00552608EA0000002330
+B1247384520090N00552600EA0000002326
+B1247404520079N00552592EA0000002321
+B1247424520067N00552583EA0000002315
+B1247444520055N00552573EA0000002309
+B1247464520047N00552565EA0000002305
+B1247484520040N00552558EA0000002301
+B1247504520029N00552549EA0000002297
+B1247524520018N00552538EA0000002294
+B1247544520009N00552528EA0000002293
+B1247564520001N00552516EA0000002295
+B1247584519993N00552504EA0000002299
+B1248004519986N00552492EA0000002306
+B1248024519980N00552478EA0000002310
+B1248044519973N00552466EA0000002316
+B1248064519964N00552455EA0000002321
+B1248084519955N00552445EA0000002327
+B1248104519945N00552433EA0000002331
+B1248124519934N00552422EA0000002337
+B1248144519923N00552411EA0000002345
+B1248164519915N00552405EA0000002353
+B1248184519907N00552398EA0000002359
+B1248204519897N00552390EA0000002364
+B1248224519886N00552382EA0000002372
+B1248244519879N00552373EA0000002381
+B1248264519873N00552365EA0000002389
+B1248284519866N00552358EA0000002396
+B1248304519851N00552349EA0000002407
+B1248324519843N00552343EA0000002414
+B1248344519832N00552336EA0000002420
+B1248364519819N00552332EA0000002424
+B1248384519807N00552328EA0000002429
+B1248404519798N00552324EA0000002433
+B1248424519787N00552321EA0000002436
+B1248444519776N00552317EA0000002436
+B1248464519765N00552309EA0000002433
+B1248484519756N00552299EA0000002429
+B1248504519748N00552294EA0000002424
+B1248524519738N00552291EA0000002417
+B1248554519726N00552285EA0000002411
+B1248574519716N00552279EA0000002407
+B1248594519707N00552275EA0000002402
+B1249014519696N00552268EA0000002395
+B1249034519682N00552262EA0000002391
+B1249054519671N00552257EA0000002388
+B1249074519664N00552255EA0000002385
+B1249094519653N00552251EA0000002380
+B1249114519641N00552243EA0000002377
+B1249134519629N00552236EA0000002375
+B1249154519618N00552229EA0000002370
+B1249174519605N00552220EA0000002367
+B1249194519594N00552212EA0000002365
+B1249214519583N00552205EA0000002364
+B1249234519571N00552197EA0000002360
+B1249254519558N00552189EA0000002357
+B1249274519545N00552181EA0000002355
+B1249294519534N00552174EA0000002354
+B1249314519523N00552166EA0000002351
+B1249334519512N00552158EA0000002349
+B1249354519500N00552150EA0000002348
+B1249374519489N00552142EA0000002345
+B1249394519478N00552134EA0000002342
+B1249414519466N00552125EA0000002337
+B1249434519455N00552116EA0000002334
+B1249454519444N00552105EA0000002331
+B1249474519433N00552095EA0000002328
+B1249494519421N00552085EA0000002324
+B1249514519408N00552076EA0000002322
+B1249534519396N00552069EA0000002319
+B1249554519383N00552063EA0000002317
+B1249574519369N00552056EA0000002314
+B1249594519356N00552051EA0000002312
+B1250014519343N00552046EA0000002308
+B1250034519330N00552040EA0000002305
+B1250054519316N00552033EA0000002302
+B1250074519303N00552026EA0000002300
+B1250094519291N00552017EA0000002297
+B1250114519273N00552004EA0000002292
+B1250134519260N00551996EA0000002288
+B1250154519248N00551988EA0000002283
+B1250174519234N00551980EA0000002279
+B1250194519221N00551970EA0000002275
+B1250214519208N00551962EA0000002274
+B1250234519196N00551954EA0000002272
+B1250254519183N00551944EA0000002270
+B1250274519171N00551934EA0000002267
+B1250294519158N00551923EA0000002263
+B1250314519143N00551911EA0000002260
+B1250334519130N00551899EA0000002258
+B1250364519118N00551890EA0000002258
+B1250384519105N00551879EA0000002258
+B1250404519093N00551867EA0000002259
+B1250424519082N00551854EA0000002261
+B1250444519070N00551843EA0000002261
+B1250464519056N00551832EA0000002261
+B1250484519042N00551823EA0000002262
+B1250504519029N00551813EA0000002263
+B1250524519015N00551802EA0000002263
+B1250544519002N00551791EA0000002265
+B1250564518990N00551779EA0000002268
+B1250584518980N00551766EA0000002271
+B1251004518971N00551754EA0000002277
+B1251024518962N00551742EA0000002281
+B1251044518953N00551731EA0000002287
+B1251064518945N00551722EA0000002293
+B1251084518937N00551715EA0000002299
+B1251104518928N00551708EA0000002304
+B1251124518919N00551700EA0000002310
+B1251144518911N00551693EA0000002317
+B1251164518904N00551684EA0000002323
+B1251184518897N00551675EA0000002328
+B1251204518889N00551667EA0000002334
+B1251224518882N00551659EA0000002339
+B1251244518874N00551649EA0000002342
+B1251264518864N00551639EA0000002346
+B1251284518854N00551629EA0000002350
+B1251304518845N00551618EA0000002353
+B1251324518835N00551608EA0000002356
+B1251344518825N00551598EA0000002361
+B1251364518816N00551592EA0000002367
+B1251384518811N00551590EA0000002371
+B1251404518802N00551586EA0000002373
+B1251424518793N00551580EA0000002374
+B1251444518783N00551573EA0000002374
+B1251464518771N00551566EA0000002371
+B1251484518761N00551561EA0000002371
+B1251504518752N00551558EA0000002368
+B1251524518739N00551551EA0000002363
+B1251544518730N00551546EA0000002362
+B1251564518723N00551539EA0000002360
+B1251584518716N00551533EA0000002356
+B1252004518706N00551525EA0000002353
+B1252024518696N00551518EA0000002351
+B1252044518688N00551513EA0000002348
+B1252064518679N00551507EA0000002344
+B1252084518667N00551499EA0000002338
+B1252104518655N00551489EA0000002335
+B1252124518644N00551479EA0000002334
+B1252144518634N00551470EA0000002334
+B1252174518623N00551465EA0000002335
+B1252194518614N00551462EA0000002334
+B1252214518603N00551461EA0000002331
+B1252234518591N00551459EA0000002329
+B1252254518580N00551457EA0000002329
+B1252274518569N00551455EA0000002330
+B1252294518558N00551451EA0000002332
+B1252314518550N00551448EA0000002337
+B1252334518544N00551448EA0000002340
+B1252354518535N00551446EA0000002345
+B1252374518528N00551444EA0000002351
+B1252394518528N00551444EA0000002356
+B1252414518515N00551451EA0000002362
+B1252434518509N00551452EA0000002369
+B1252454518506N00551444EA0000002374
+B1252474518510N00551434EA0000002380
+B1252494518522N00551432EA0000002386
+B1252514518534N00551441EA0000002391
+B1252534518537N00551460EA0000002397
+B1252554518531N00551476EA0000002402
+B1252574518522N00551480EA0000002407
+B1252594518515N00551469EA0000002412
+B1253014518515N00551454EA0000002418
+B1253034518525N00551447EA0000002423
+B1253054518536N00551456EA0000002429
+B1253074518542N00551472EA0000002435
+B1253094518538N00551489EA0000002439
+B1253114518528N00551497EA0000002443
+B1253134518520N00551491EA0000002447
+B1253154518518N00551480EA0000002451
+B1253174518528N00551473EA0000002457
+B1253194518539N00551479EA0000002461
+B1253214518544N00551494EA0000002466
+B1253234518540N00551510EA0000002469
+B1253254518532N00551516EA0000002473
+B1253274518523N00551509EA0000002476
+B1253294518513N00551499EA0000002477
+B1253314518497N00551479EA0000002477
+B1253334518488N00551462EA0000002476
+B1253354518476N00551443EA0000002467
+B1253374518465N00551433EA0000002464
+B1253394518456N00551421EA0000002460
+B1253414518447N00551410EA0000002456
+B1253434518436N00551401EA0000002451
+B1253454518426N00551389EA0000002448
+B1253474518418N00551378EA0000002446
+B1253494518410N00551367EA0000002443
+B1253514518402N00551356EA0000002441
+B1253544518393N00551343EA0000002439
+B1253564518385N00551332EA0000002438
+B1253584518377N00551321EA0000002439
+B1254004518369N00551308EA0000002438
+B1254024518360N00551295EA0000002438
+B1254044518351N00551281EA0000002439
+B1254064518344N00551267EA0000002439
+B1254084518336N00551253EA0000002438
+B1254104518325N00551239EA0000002438
+B1254124518315N00551225EA0000002438
+B1254144518306N00551212EA0000002437
+B1254164518295N00551198EA0000002436
+B1254184518285N00551184EA0000002436
+B1254204518275N00551171EA0000002435
+B1254224518266N00551158EA0000002433
+B1254244518256N00551143EA0000002431
+B1254264518246N00551129EA0000002429
+B1254284518236N00551115EA0000002429
+B1254304518229N00551101EA0000002427
+B1254324518221N00551087EA0000002425
+B1254344518212N00551074EA0000002424
+B1254364518205N00551060EA0000002423
+B1254384518198N00551046EA0000002422
+B1254404518191N00551033EA0000002421
+B1254424518183N00551020EA0000002420
+B1254444518177N00551006EA0000002419
+B1254464518169N00550993EA0000002417
+B1254484518161N00550978EA0000002413
+B1254504518151N00550962EA0000002410
+B1254524518142N00550948EA0000002408
+B1254544518133N00550935EA0000002404
+B1254564518123N00550920EA0000002399
+B1254584518112N00550905EA0000002395
+B1255004518102N00550890EA0000002392
+B1255024518091N00550877EA0000002388
+B1255044518081N00550864EA0000002384
+B1255064518071N00550850EA0000002379
+B1255084518059N00550835EA0000002372
+B1255104518043N00550813EA0000002365
+B1255124518035N00550797EA0000002362
+B1255144518029N00550783EA0000002360
+B1255164518027N00550771EA0000002358
+B1255184518023N00550758EA0000002354
+B1255204518017N00550743EA0000002351
+B1255224518011N00550729EA0000002350
+B1255244518005N00550716EA0000002348
+B1255264517999N00550702EA0000002344
+B1255284517992N00550687EA0000002342
+B1255304517986N00550673EA0000002340
+B1255324517981N00550660EA0000002337
+B1255354517975N00550647EA0000002333
+B1255374517968N00550632EA0000002328
+B1255394517961N00550616EA0000002322
+B1255414517953N00550599EA0000002318
+B1255434517946N00550583EA0000002314
+B1255454517939N00550567EA0000002309
+B1255474517932N00550549EA0000002303
+B1255494517924N00550531EA0000002298
+B1255514517917N00550514EA0000002295
+B1255534517910N00550497EA0000002290
+B1255554517904N00550481EA0000002285
+B1255574517895N00550467EA0000002282
+B1255594517889N00550456EA0000002280
+B1256014517884N00550448EA0000002275
+B1256034517877N00550437EA0000002270
+B1256054517870N00550422EA0000002267
+B1256074517866N00550412EA0000002264
+B1256094517862N00550402EA0000002258
+B1256114517856N00550386EA0000002253
+B1256134517852N00550369EA0000002250
+B1256154517850N00550358EA0000002248
+B1256174517847N00550349EA0000002243
+B1256194517841N00550335EA0000002238
+B1256214517832N00550322EA0000002236
+B1256234517824N00550312EA0000002232
+B1256254517815N00550302EA0000002227
+B1256274517806N00550290EA0000002223
+B1256294517798N00550279EA0000002220
+B1256314517790N00550270EA0000002218
+B1256334517780N00550260EA0000002216
+B1256354517769N00550249EA0000002213
+B1256374517759N00550237EA0000002210
+B1256394517750N00550226EA0000002209
+B1256414517741N00550215EA0000002206
+B1256434517729N00550203EA0000002203
+B1256454517720N00550191EA0000002199
+B1256474517711N00550179EA0000002197
+B1256494517702N00550167EA0000002193
+B1256514517685N00550148EA0000002185
+B1256534517673N00550135EA0000002181
+B1256554517662N00550123EA0000002177
+B1256574517650N00550111EA0000002172
+B1256594517638N00550097EA0000002167
+B1257014517627N00550083EA0000002164
+B1257034517616N00550070EA0000002161
+B1257054517604N00550059EA0000002157
+B1257074517592N00550047EA0000002153
+B1257094517580N00550033EA0000002148
+B1257114517567N00550020EA0000002144
+B1257134517556N00550006EA0000002141
+B1257164517544N00549992EA0000002137
+B1257184517531N00549978EA0000002133
+B1257204517520N00549966EA0000002130
+B1257224517508N00549953EA0000002127
+B1257244517496N00549941EA0000002123
+B1257264517485N00549928EA0000002118
+B1257284517474N00549913EA0000002113
+B1257304517463N00549899EA0000002108
+B1257324517452N00549886EA0000002102
+B1257344517440N00549872EA0000002096
+B1257364517428N00549858EA0000002091
+B1257384517422N00549851EA0000002085
+B1257404517404N00549831EA0000002080
+B1257424517392N00549817EA0000002075
+B1257444517380N00549803EA0000002068
+B1257464517367N00549789EA0000002062
+B1257484517354N00549774EA0000002057
+B1257504517342N00549759EA0000002053
+B1257524517330N00549745EA0000002050
+B1257544517318N00549731EA0000002047
+B1257564517306N00549716EA0000002044
+B1257584517295N00549701EA0000002042
+B1258004517283N00549687EA0000002041
+B1258024517271N00549675EA0000002039
+B1258044517257N00549664EA0000002036
+B1258064517246N00549651EA0000002032
+B1258084517235N00549636EA0000002027
+B1258104517222N00549623EA0000002022
+B1258124517209N00549609EA0000002019
+B1258144517198N00549595EA0000002016
+B1258164517185N00549582EA0000002012
+B1258184517172N00549570EA0000002008
+B1258204517160N00549556EA0000002004
+B1258224517149N00549544EA0000002001
+B1258244517139N00549538EA0000002000
+B1258264517131N00549532EA0000001996
+B1258284517122N00549524EA0000001993
+B1258304517112N00549517EA0000001992
+B1258324517096N00549510EA0000001987
+B1258344517086N00549503EA0000001983
+B1258364517076N00549495EA0000001980
+B1258384517066N00549487EA0000001977
+B1258404517057N00549479EA0000001973
+B1258424517047N00549469EA0000001969
+B1258444517038N00549460EA0000001966
+B1258464517029N00549452EA0000001962
+B1258484517020N00549441EA0000001957
+B1258504517010N00549429EA0000001950
+B1258524516998N00549415EA0000001945
+B1258544516989N00549399EA0000001942
+B1258574516980N00549384EA0000001937
+B1258594516972N00549369EA0000001933
+B1259014516965N00549356EA0000001931
+B1259034516958N00549346EA0000001927
+B1259054516949N00549339EA0000001923
+B1259074516939N00549332EA0000001919
+B1259094516927N00549325EA0000001914
+B1259114516915N00549319EA0000001912
+B1259134516904N00549312EA0000001908
+B1259154516898N00549307EA0000001902
+B1259174516877N00549291EA0000001898
+B1259194516864N00549279EA0000001895
+B1259214516858N00549273EA0000001892
+B1259234516840N00549252EA0000001887
+B1259254516826N00549239EA0000001883
+B1259274516814N00549227EA0000001880
+B1259294516807N00549215EA0000001879
+B1259314516799N00549202EA0000001875
+B1259334516788N00549189EA0000001871
+B1259354516775N00549179EA0000001868
+B1259374516762N00549172EA0000001863
+B1259394516750N00549162EA0000001858
+B1259414516738N00549153EA0000001853
+B1259434516729N00549147EA0000001850
+B1259454516725N00549148EA0000001847
+B1259474516719N00549147EA0000001843
+B1259494516710N00549145EA0000001841
+B1259514516703N00549140EA0000001839
+B1259534516699N00549131EA0000001836
+B1259554516692N00549124EA0000001832
+B1259574516684N00549118EA0000001830
+B1259594516678N00549112EA0000001831
+B1300014516672N00549106EA0000001829
+B1300034516664N00549098EA0000001828
+B1300054516655N00549090EA0000001827
+B1300074516646N00549083EA0000001828
+B1300094516639N00549075EA0000001830
+B1300114516631N00549068EA0000001830
+B1300134516618N00549059EA0000001831
+B1300154516612N00549053EA0000001830
+B1300174516603N00549046EA0000001828
+B1300194516593N00549039EA0000001827
+B1300214516584N00549032EA0000001827
+B1300234516577N00549021EA0000001826
+B1300254516570N00549009EA0000001827
+B1300274516563N00548999EA0000001829
+B1300294516556N00548992EA0000001832
+B1300314516550N00548989EA0000001835
+B1300334516543N00548982EA0000001839
+B1300354516537N00548975EA0000001845
+B1300384516534N00548971EA0000001853
+B1300404516531N00548964EA0000001860
+B1300424516531N00548953EA0000001867
+B1300444516540N00548939EA0000001873
+B1300464516554N00548936EA0000001881
+B1300484516565N00548945EA0000001887
+B1300504516569N00548965EA0000001896
+B1300524516564N00548978EA0000001905
+B1300544516556N00548975EA0000001913
+B1300564516552N00548968EA0000001922
+B1300584516551N00548960EA0000001928
+B1301004516552N00548949EA0000001935
+B1301024516560N00548936EA0000001941
+B1301044516576N00548935EA0000001946
+B1301064516585N00548943EA0000001951
+B1301084516583N00548957EA0000001956
+B1301104516576N00548962EA0000001961
+B1301124516573N00548959EA0000001968
+B1301144516569N00548961EA0000001972
+B1301164516567N00548950EA0000001976
+B1301184516563N00548940EA0000001982
+B1301204516559N00548934EA0000001990
+B1301224516554N00548928EA0000001995
+B1301244516547N00548922EA0000002000
+B1301264516538N00548915EA0000002007
+B1301284516535N00548911EA0000002016
+B1301304516535N00548908EA0000002022
+B1301324516532N00548902EA0000002027
+B1301344516525N00548891EA0000002030
+B1301364516522N00548882EA0000002033
+B1301384516518N00548873EA0000002034
+B1301404516511N00548864EA0000002039
+B1301424516506N00548856EA0000002044
+B1301444516502N00548849EA0000002048
+B1301464516496N00548842EA0000002050
+B1301484516489N00548831EA0000002049
+B1301504516480N00548822EA0000002048
+B1301524516471N00548814EA0000002046
+B1301544516459N00548799EA0000002041
+B1301564516450N00548787EA0000002039
+B1301584516442N00548775EA0000002039
+B1302004516434N00548763EA0000002041
+B1302024516422N00548753EA0000002044
+B1302044516412N00548746EA0000002048
+B1302064516408N00548739EA0000002052
+B1302084516403N00548730EA0000002055
+B1302104516395N00548717EA0000002059
+B1302124516388N00548703EA0000002065
+B1302144516383N00548693EA0000002070
+B1302174516376N00548680EA0000002074
+B1302194516367N00548664EA0000002080
+B1302214516359N00548650EA0000002087
+B1302234516351N00548638EA0000002091
+B1302254516341N00548624EA0000002094
+B1302274516331N00548610EA0000002096
+B1302294516320N00548597EA0000002096
+B1302314516310N00548585EA0000002095
+B1302334516301N00548575EA0000002093
+B1302354516291N00548565EA0000002090
+B1302374516281N00548555EA0000002086
+B1302394516272N00548544EA0000002084
+B1302414516264N00548534EA0000002082
+B1302434516258N00548525EA0000002079
+B1302454516250N00548516EA0000002074
+B1302474516242N00548506EA0000002071
+B1302494516234N00548498EA0000002067
+B1302514516224N00548489EA0000002063
+B1302534516215N00548478EA0000002059
+B1302554516207N00548469EA0000002055
+B1302574516199N00548458EA0000002050
+B1302594516188N00548445EA0000002044
+B1303014516178N00548431EA0000002040
+B1303034516169N00548417EA0000002038
+B1303054516161N00548405EA0000002034
+B1303074516151N00548395EA0000002029
+B1303094516141N00548383EA0000002026
+B1303114516133N00548372EA0000002025
+B1303134516126N00548364EA0000002022
+B1303154516118N00548355EA0000002018
+B1303174516109N00548344EA0000002013
+B1303194516099N00548335EA0000002008
+B1303214516089N00548328EA0000002002
+B1303234516078N00548320EA0000001997
+B1303254516068N00548311EA0000001991
+B1303274516058N00548300EA0000001985
+B1303294516049N00548290EA0000001980
+B1303314516038N00548281EA0000001973
+B1303334516022N00548261EA0000001963
+B1303354516012N00548247EA0000001958
+B1303374516002N00548232EA0000001954
+B1303394515993N00548217EA0000001951
+B1303414515986N00548201EA0000001947
+B1303434515982N00548187EA0000001944
+B1303454515979N00548171EA0000001940
+B1303474515974N00548158EA0000001938
+B1303494515967N00548148EA0000001935
+B1303514515960N00548137EA0000001932
+B1303534515951N00548125EA0000001929
+B1303554515941N00548117EA0000001928
+B1303584515932N00548110EA0000001927
+B1304004515924N00548102EA0000001924
+B1304024515914N00548094EA0000001919
+B1304044515904N00548086EA0000001915
+B1304064515895N00548078EA0000001911
+B1304084515884N00548071EA0000001905
+B1304104515873N00548058EA0000001898
+B1304124515861N00548041EA0000001893
+B1304144515851N00548027EA0000001889
+B1304164515840N00548014EA0000001882
+B1304184515828N00548000EA0000001877
+B1304204515817N00547985EA0000001872
+B1304224515811N00547972EA0000001870
+B1304244515804N00547960EA0000001867
+B1304264515795N00547946EA0000001864
+B1304284515785N00547929EA0000001862
+B1304304515777N00547913EA0000001862
+B1304324515772N00547900EA0000001865
+B1304344515765N00547888EA0000001870
+B1304364515759N00547877EA0000001879
+B1304384515753N00547869EA0000001886
+B1304404515746N00547863EA0000001889
+B1304424515738N00547856EA0000001892
+B1304444515730N00547851EA0000001895
+B1304464515724N00547846EA0000001897
+B1304484515717N00547840EA0000001897
+B1304504515710N00547835EA0000001895
+B1304524515702N00547829EA0000001893
+B1304544515694N00547824EA0000001892
+B1304564515686N00547819EA0000001889
+B1304584515676N00547811EA0000001885
+B1305004515665N00547803EA0000001882
+B1305024515653N00547795EA0000001879
+B1305044515643N00547785EA0000001875
+B1305064515634N00547778EA0000001870
+B1305084515623N00547772EA0000001865
+B1305104515613N00547764EA0000001861
+B1305124515603N00547758EA0000001856
+B1305144515589N00547745EA0000001850
+B1305164515583N00547734EA0000001848
+B1305184515578N00547724EA0000001849
+B1305204515574N00547716EA0000001852
+B1305224515571N00547707EA0000001857
+B1305244515565N00547698EA0000001863
+B1305264515558N00547690EA0000001870
+B1305284515551N00547683EA0000001874
+B1305304515540N00547676EA0000001879
+B1305324515532N00547669EA0000001886
+B1305344515528N00547669EA0000001892
+B1305364515522N00547669EA0000001897
+B1305394515513N00547665EA0000001899
+B1305414515505N00547660EA0000001900
+B1305434515498N00547654EA0000001900
+B1305454515491N00547649EA0000001899
+B1305474515483N00547644EA0000001897
+B1305494515474N00547639EA0000001895
+B1305514515464N00547633EA0000001895
+B1305534515456N00547626EA0000001893
+B1305554515447N00547620EA0000001890
+B1305574515437N00547615EA0000001885
+B1305594515427N00547607EA0000001879
+B1306014515417N00547599EA0000001872
+B1306034515406N00547591EA0000001865
+B1306054515395N00547581EA0000001858
+B1306074515385N00547571EA0000001853
+B1306094515374N00547564EA0000001847
+B1306114515362N00547557EA0000001842
+B1306134515351N00547551EA0000001838
+B1306154515339N00547548EA0000001835
+B1306174515327N00547547EA0000001833
+B1306194515316N00547546EA0000001833
+B1306214515308N00547543EA0000001833
+B1306234515299N00547539EA0000001831
+B1306254515288N00547533EA0000001829
+B1306274515277N00547525EA0000001829
+B1306294515268N00547519EA0000001830
+B1306314515258N00547513EA0000001829
+B1306334515245N00547506EA0000001828
+B1306354515232N00547498EA0000001830
+B1306374515221N00547489EA0000001830
+B1306394515209N00547480EA0000001830
+B1306414515198N00547472EA0000001829
+B1306434515187N00547464EA0000001828
+B1306454515176N00547458EA0000001829
+B1306474515167N00547452EA0000001828
+B1306494515159N00547445EA0000001827
+B1306514515149N00547436EA0000001824
+B1306534515139N00547427EA0000001823
+B1306554515127N00547411EA0000001819
+B1306574515117N00547400EA0000001816
+B1306594515105N00547389EA0000001815
+B1307014515096N00547378EA0000001814
+B1307034515087N00547368EA0000001812
+B1307054515076N00547359EA0000001808
+B1307074515065N00547350EA0000001804
+B1307094515053N00547340EA0000001802
+B1307114515044N00547330EA0000001802
+B1307134515044N00547327EA0000001804
+B1307154515044N00547325EA0000001803
+B1307184515038N00547316EA0000001801
+B1307204515031N00547304EA0000001803
+B1307224515024N00547295EA0000001802
+B1307244515014N00547283EA0000001802
+B1307264515004N00547270EA0000001804
+B1307284514996N00547260EA0000001807
+B1307304514990N00547252EA0000001813
+B1307324514983N00547241EA0000001816
+B1307344514975N00547230EA0000001822
+B1307364514968N00547220EA0000001828
+B1307384514961N00547210EA0000001832
+B1307404514957N00547204EA0000001835
+B1307424514943N00547188EA0000001838
+B1307444514936N00547180EA0000001838
+B1307464514929N00547172EA0000001838
+B1307484514921N00547161EA0000001836
+B1307504514914N00547151EA0000001836
+B1307524514907N00547143EA0000001836
+B1307544514899N00547133EA0000001834
+B1307564514890N00547122EA0000001833
+B1307584514881N00547110EA0000001832
+B1308004514873N00547098EA0000001832
+B1308024514865N00547086EA0000001833
+B1308044514857N00547072EA0000001834
+B1308064514850N00547060EA0000001835
+B1308084514843N00547048EA0000001835
+B1308104514834N00547036EA0000001833
+B1308124514824N00547023EA0000001831
+B1308144514816N00547011EA0000001829
+B1308164514809N00546998EA0000001826
+B1308184514800N00546986EA0000001823
+B1308204514793N00546976EA0000001820
+B1308224514785N00546966EA0000001815
+B1308244514778N00546953EA0000001809
+B1308264514768N00546940EA0000001802
+B1308284514758N00546924EA0000001797
+B1308304514745N00546904EA0000001793
+B1308324514737N00546891EA0000001788
+B1308344514729N00546875EA0000001783
+B1308364514722N00546858EA0000001780
+B1308384514714N00546846EA0000001778
+B1308404514705N00546839EA0000001777
+B1308424514696N00546831EA0000001777
+B1308444514686N00546823EA0000001777
+B1308464514678N00546814EA0000001778
+B1308484514672N00546809EA0000001780
+B1308504514663N00546803EA0000001782
+B1308524514655N00546794EA0000001786
+B1308554514648N00546785EA0000001792
+B1308574514641N00546777EA0000001796
+B1308594514635N00546768EA0000001800
+B1309014514628N00546757EA0000001805
+B1309034514621N00546745EA0000001810
+B1309054514614N00546736EA0000001815
+B1309074514607N00546726EA0000001818
+B1309094514599N00546714EA0000001821
+B1309114514592N00546701EA0000001824
+B1309134514585N00546690EA0000001826
+B1309154514577N00546681EA0000001827
+B1309174514568N00546671EA0000001826
+B1309194514558N00546658EA0000001825
+B1309214514553N00546652EA0000001827
+B1309234514545N00546635EA0000001828
+B1309254514540N00546628EA0000001827
+B1309274514534N00546619EA0000001825
+B1309294514528N00546606EA0000001826
+B1309314514521N00546595EA0000001826
+B1309334514514N00546586EA0000001825
+B1309354514507N00546575EA0000001826
+B1309374514501N00546564EA0000001828
+B1309394514494N00546553EA0000001830
+B1309414514487N00546541EA0000001830
+B1309434514478N00546527EA0000001831
+B1309454514469N00546510EA0000001833
+B1309474514464N00546496EA0000001836
+B1309494514460N00546483EA0000001839
+B1309514514453N00546466EA0000001841
+B1309534514446N00546450EA0000001843
+B1309554514439N00546436EA0000001845
+B1309574514431N00546425EA0000001846
+B1309594514425N00546412EA0000001847
+B1310014514420N00546399EA0000001850
+B1310034514415N00546385EA0000001852
+B1310054514411N00546370EA0000001853
+B1310074514404N00546356EA0000001855
+B1310094514398N00546343EA0000001856
+B1310114514387N00546321EA0000001859
+B1310134514381N00546308EA0000001862
+B1310154514376N00546297EA0000001865
+B1310174514372N00546286EA0000001866
+B1310194514366N00546272EA0000001867
+B1310214514359N00546260EA0000001868
+B1310234514353N00546250EA0000001867
+B1310254514346N00546238EA0000001865
+B1310274514337N00546224EA0000001863
+B1310294514329N00546212EA0000001862
+B1310314514322N00546201EA0000001858
+B1310334514313N00546188EA0000001854
+B1310364514304N00546173EA0000001852
+B1310384514295N00546158EA0000001851
+B1310404514287N00546146EA0000001849
+B1310424514279N00546134EA0000001847
+B1310444514273N00546120EA0000001847
+B1310464514266N00546109EA0000001845
+B1310484514256N00546099EA0000001843
+B1310504514249N00546086EA0000001843
+B1310524514243N00546074EA0000001842
+B1310544514236N00546064EA0000001839
+B1310564514229N00546051EA0000001838
+B1310584514222N00546037EA0000001837
+B1311004514215N00546025EA0000001836
+B1311024514208N00546010EA0000001834
+B1311044514202N00545994EA0000001832
+B1311064514196N00545980EA0000001830
+B1311084514190N00545964EA0000001827
+B1311104514184N00545949EA0000001823
+B1311124514178N00545934EA0000001820
+B1311144514172N00545921EA0000001816
+B1311164514165N00545908EA0000001811
+B1311184514158N00545893EA0000001806
+B1311204514150N00545880EA0000001802
+B1311224514142N00545867EA0000001798
+B1311244514135N00545854EA0000001794
+B1311264514126N00545842EA0000001788
+B1311284514117N00545829EA0000001784
+B1311304514108N00545816EA0000001780
+B1311324514103N00545807EA0000001779
+B1311344514098N00545800EA0000001775
+B1311364514091N00545790EA0000001772
+B1311384514084N00545780EA0000001771
+B1311404514078N00545770EA0000001768
+B1311424514070N00545763EA0000001766
+B1311444514061N00545767EA0000001763
+B1311464514054N00545781EA0000001760
+B1311484514052N00545795EA0000001758
+B1311504514056N00545810EA0000001754
+B1311524514064N00545832EA0000001748
+B1311544514070N00545849EA0000001744
+B1311564514076N00545867EA0000001740
+B1311584514084N00545885EA0000001736
+B1312004514091N00545902EA0000001734
+B1312024514099N00545916EA0000001730
+B1312044514108N00545932EA0000001726
+B1312064514117N00545947EA0000001724
+B1312084514126N00545962EA0000001721
+B1312104514136N00545978EA0000001716
+B1312124514146N00545995EA0000001713
+B1312144514156N00546013EA0000001710
+B1312174514165N00546028EA0000001707
+B1312194514174N00546045EA0000001703
+B1312214514184N00546061EA0000001700
+B1312234514193N00546076EA0000001699
+B1312254514202N00546089EA0000001696
+B1312274514211N00546103EA0000001692
+B1312294514221N00546118EA0000001691
+B1312314514230N00546132EA0000001690
+B1312334514238N00546145EA0000001689
+B1312354514246N00546159EA0000001688
+B1312374514253N00546171EA0000001687
+B1312394514262N00546184EA0000001683
+B1312414514272N00546198EA0000001682
+B1312434514279N00546213EA0000001682
+B1312454514288N00546225EA0000001683
+B1312474514297N00546232EA0000001684
+B1312494514309N00546244EA0000001685
+B1312514514320N00546259EA0000001687
+B1312534514329N00546273EA0000001691
+B1312554514337N00546285EA0000001692
+B1312574514345N00546295EA0000001692
+B1312594514351N00546306EA0000001691
+B1313014514358N00546318EA0000001688
+B1313034514366N00546329EA0000001685
+B1313054514374N00546339EA0000001683
+B1313074514382N00546351EA0000001680
+B1313094514389N00546364EA0000001678
+B1313114514397N00546376EA0000001676
+B1313134514405N00546387EA0000001675
+B1313154514412N00546396EA0000001675
+B1313174514417N00546401EA0000001676
+B1313194514424N00546406EA0000001675
+B1313214514432N00546417EA0000001675
+B1313234514441N00546429EA0000001675
+B1313254514449N00546440EA0000001676
+B1313274514457N00546453EA0000001677
+B1313294514466N00546467EA0000001678
+B1313314514473N00546480EA0000001681
+B1313334514482N00546496EA0000001684
+B1313354514492N00546507EA0000001685
+B1313374514502N00546517EA0000001688
+B1313394514510N00546522EA0000001691
+B1313414514516N00546528EA0000001693
+B1313434514523N00546539EA0000001694
+B1313454514529N00546550EA0000001695
+B1313474514535N00546559EA0000001696
+B1313494514541N00546568EA0000001696
+B1313514514550N00546579EA0000001695
+B1313534514559N00546590EA0000001695
+B1313554514567N00546600EA0000001697
+B1313584514573N00546609EA0000001698
+B1314004514583N00546621EA0000001698
+B1314024514592N00546634EA0000001699
+B1314044514600N00546641EA0000001702
+B1314064514604N00546640EA0000001710
+B1314084514612N00546648EA0000001716
+B1314104514621N00546657EA0000001723
+B1314124514627N00546664EA0000001733
+B1314144514628N00546671EA0000001740
+B1314164514626N00546680EA0000001746
+B1314184514619N00546686EA0000001753
+B1314204514614N00546683EA0000001759
+B1314224514608N00546653EA0000001766
+B1314244514619N00546642EA0000001774
+B1314264514632N00546643EA0000001783
+B1314284514639N00546649EA0000001792
+B1314304514644N00546659EA0000001798
+B1314324514646N00546672EA0000001804
+B1314344514643N00546685EA0000001812
+B1314364514635N00546687EA0000001817
+B1314384514627N00546673EA0000001823
+B1314404514627N00546656EA0000001828
+B1314424514638N00546648EA0000001833
+B1314444514650N00546651EA0000001839
+B1314464514656N00546658EA0000001846
+B1314484514662N00546666EA0000001851
+B1314504514664N00546678EA0000001854
+B1314524514665N00546689EA0000001858
+B1314544514670N00546700EA0000001861
+B1314564514680N00546708EA0000001864
+B1314584514687N00546716EA0000001867
+B1315004514694N00546724EA0000001868
+B1315024514705N00546735EA0000001869
+B1315044514714N00546745EA0000001871
+B1315064514720N00546752EA0000001875
+B1315084514728N00546758EA0000001877
+B1315104514737N00546767EA0000001881
+B1315124514751N00546783EA0000001889
+B1315144514759N00546791EA0000001896
+B1315164514766N00546798EA0000001901
+B1315184514774N00546806EA0000001907
+B1315204514777N00546817EA0000001915
+B1315224514773N00546826EA0000001922
+B1315244514759N00546826EA0000001929
+B1315264514750N00546814EA0000001935
+B1315284514750N00546797EA0000001942
+B1315304514762N00546786EA0000001949
+B1315324514774N00546788EA0000001956
+B1315344514783N00546797EA0000001966
+B1315374514787N00546806EA0000001975
+B1315394514787N00546818EA0000001982
+B1315414514784N00546831EA0000001988
+B1315434514774N00546837EA0000001993
+B1315454514764N00546829EA0000001998
+B1315474514763N00546810EA0000002004
+B1315494514773N00546798EA0000002011
+B1315514514785N00546799EA0000002018
+B1315534514799N00546814EA0000002030
+B1315554514806N00546819EA0000002036
+B1315574514811N00546829EA0000002041
+B1316004514808N00546847EA0000002045
+B1316024514799N00546851EA0000002047
+B1316044514790N00546838EA0000002047
+B1316064514791N00546820EA0000002049
+B1316084514804N00546817EA0000002051
+B1316104514815N00546827EA0000002056
+B1316124514823N00546836EA0000002060
+B1316144514831N00546841EA0000002062
+B1316164514837N00546849EA0000002062
+B1316184514844N00546862EA0000002060
+B1316204514850N00546870EA0000002061
+B1316224514856N00546873EA0000002062
+B1316244514859N00546876EA0000002062
+B1316264514867N00546884EA0000002062
+B1316284514877N00546895EA0000002062
+B1316304514886N00546904EA0000002064
+B1316324514893N00546913EA0000002066
+B1316344514901N00546924EA0000002067
+B1316364514910N00546932EA0000002071
+B1316384514916N00546940EA0000002075
+B1316404514922N00546947EA0000002079
+B1316424514928N00546953EA0000002084
+B1316444514936N00546959EA0000002091
+B1316464514943N00546962EA0000002099
+B1316484514949N00546963EA0000002105
+B1316504514956N00546967EA0000002111
+B1316524514963N00546972EA0000002118
+B1316544514969N00546974EA0000002127
+B1316564514974N00546977EA0000002133
+B1316584514979N00546979EA0000002138
+B1317004514985N00546986EA0000002142
+B1317024514990N00546995EA0000002146
+B1317044514994N00547000EA0000002149
+B1317064515000N00547004EA0000002151
+B1317084515007N00547012EA0000002150
+B1317104515015N00547019EA0000002148
+B1317124515025N00547026EA0000002143
+B1317144515035N00547036EA0000002138
+B1317164515053N00547050EA0000002134
+B1317184515067N00547060EA0000002133
+B1317204515080N00547071EA0000002135
+B1317224515091N00547082EA0000002138
+B1317244515100N00547093EA0000002142
+B1317264515109N00547103EA0000002144
+B1317284515117N00547115EA0000002144
+B1317304515126N00547128EA0000002144
+B1317324515135N00547139EA0000002142
+B1317344515143N00547151EA0000002139
+B1317364515149N00547163EA0000002135
+B1317394515155N00547175EA0000002130
+B1317414515163N00547189EA0000002128
+B1317434515173N00547196EA0000002126
+B1317454515183N00547200EA0000002124
+B1317474515193N00547207EA0000002123
+B1317494515203N00547214EA0000002123
+B1317514515212N00547222EA0000002121
+B1317534515221N00547232EA0000002119
+B1317554515231N00547243EA0000002118
+B1317574515241N00547256EA0000002117
+B1317594515250N00547269EA0000002118
+B1318014515258N00547281EA0000002117
+B1318034515266N00547295EA0000002115
+B1318054515276N00547310EA0000002115
+B1318074515284N00547320EA0000002115
+B1318094515292N00547331EA0000002113
+B1318114515300N00547345EA0000002110
+B1318134515309N00547358EA0000002107
+B1318154515317N00547371EA0000002105
+B1318174515324N00547384EA0000002105
+B1318194515328N00547394EA0000002105
+B1318214515334N00547406EA0000002103
+B1318234515341N00547420EA0000002101
+B1318254515347N00547434EA0000002100
+B1318274515354N00547447EA0000002097
+B1318294515363N00547461EA0000002094
+B1318314515372N00547475EA0000002092
+B1318334515381N00547489EA0000002088
+B1318354515389N00547504EA0000002085
+B1318374515399N00547518EA0000002081
+B1318394515408N00547532EA0000002077
+B1318414515417N00547546EA0000002073
+B1318434515428N00547560EA0000002068
+B1318454515437N00547575EA0000002062
+B1318474515447N00547590EA0000002056
+B1318494515458N00547603EA0000002050
+B1318514515468N00547617EA0000002043
+B1318534515479N00547631EA0000002036
+B1318554515497N00547647EA0000002027
+B1318574515508N00547656EA0000002020
+B1318594515521N00547668EA0000002015
+B1319014515533N00547682EA0000002010
+B1319034515545N00547693EA0000002008
+B1319054515555N00547704EA0000002005
+B1319074515566N00547716EA0000002002
+B1319094515577N00547729EA0000002001
+B1319114515585N00547742EA0000001999
+B1319134515594N00547756EA0000001997
+B1319154515606N00547770EA0000001995
+B1319174515619N00547784EA0000001994
+B1319204515630N00547798EA0000001993
+B1319224515643N00547813EA0000001993
+B1319244515657N00547829EA0000001994
+B1319264515669N00547843EA0000001995
+B1319284515680N00547857EA0000001995
+B1319304515693N00547873EA0000001996
+B1319324515704N00547888EA0000001999
+B1319344515714N00547901EA0000001999
+B1319364515722N00547915EA0000001997
+B1319384515732N00547927EA0000001998
+B1319404515741N00547939EA0000001997
+B1319424515750N00547952EA0000001994
+B1319444515755N00547959EA0000001991
+B1319464515771N00547981EA0000001990
+B1319484515780N00547996EA0000001986
+B1319504515789N00548012EA0000001982
+B1319524515800N00548026EA0000001980
+B1319544515809N00548041EA0000001979
+B1319564515817N00548056EA0000001975
+B1319584515826N00548072EA0000001970
+B1320004515837N00548088EA0000001968
+B1320024515847N00548103EA0000001964
+B1320044515858N00548117EA0000001959
+B1320064515869N00548133EA0000001955
+B1320084515877N00548147EA0000001953
+B1320104515884N00548155EA0000001952
+B1320124515891N00548163EA0000001948
+B1320144515901N00548175EA0000001945
+B1320164515912N00548188EA0000001943
+B1320184515922N00548204EA0000001942
+B1320204515932N00548217EA0000001944
+B1320224515941N00548228EA0000001943
+B1320244515950N00548242EA0000001941
+B1320264515960N00548257EA0000001938
+B1320284515970N00548271EA0000001935
+B1320304515981N00548285EA0000001931
+B1320324515992N00548300EA0000001928
+B1320344516004N00548315EA0000001927
+B1320364516020N00548336EA0000001923
+B1320384516031N00548350EA0000001920
+B1320404516042N00548364EA0000001918
+B1320424516052N00548376EA0000001915
+B1320444516062N00548387EA0000001911
+B1320464516075N00548398EA0000001907
+B1320484516086N00548408EA0000001904
+B1320504516096N00548418EA0000001900
+B1320524516108N00548428EA0000001895
+B1320544516120N00548439EA0000001892
+B1320564516131N00548451EA0000001891
+B1320584516138N00548457EA0000001890
+B1321014516146N00548466EA0000001887
+B1321034516155N00548474EA0000001887
+B1321054516163N00548481EA0000001888
+B1321074516171N00548490EA0000001887
+B1321094516182N00548502EA0000001886
+B1321114516194N00548513EA0000001887
+B1321134516203N00548522EA0000001888
+B1321154516213N00548529EA0000001887
+B1321174516224N00548538EA0000001885
+B1321194516235N00548549EA0000001883
+B1321214516241N00548554EA0000001880
+B1321234516257N00548569EA0000001877
+B1321254516257N00548569EA0000001874
+B1321274516279N00548591EA0000001871
+B1321294516291N00548602EA0000001868
+B1321314516302N00548611EA0000001866
+B1321334516315N00548620EA0000001862
+B1321354516329N00548633EA0000001859
+B1321374516342N00548647EA0000001857
+B1321394516352N00548655EA0000001856
+B1321414516359N00548660EA0000001858
+B1321434516367N00548668EA0000001863
+B1321454516376N00548673EA0000001869
+B1321474516382N00548676EA0000001876
+B1321494516387N00548679EA0000001882
+B1321514516397N00548683EA0000001889
+B1321534516404N00548689EA0000001898
+B1321554516407N00548697EA0000001907
+B1321574516408N00548703EA0000001915
+B1321594516409N00548711EA0000001923
+B1322014516417N00548719EA0000001930
+B1322034516431N00548714EA0000001934
+B1322054516445N00548706EA0000001939
+B1322074516455N00548698EA0000001943
+B1322094516464N00548688EA0000001946
+B1322114516475N00548681EA0000001948
+B1322134516484N00548681EA0000001950
+B1322154516492N00548684EA0000001951
+B1322174516506N00548693EA0000001949
+B1322194516517N00548698EA0000001946
+B1322214516527N00548704EA0000001942
+B1322234516539N00548711EA0000001938
+B1322254516550N00548718EA0000001936
+B1322274516562N00548724EA0000001936
+B1322294516575N00548729EA0000001934
+B1322314516589N00548735EA0000001933
+B1322334516603N00548742EA0000001932
+B1322354516616N00548751EA0000001932
+B1322374516626N00548757EA0000001933
+B1322394516636N00548766EA0000001934
+B1322424516648N00548774EA0000001936
+B1322444516657N00548780EA0000001939
+B1322464516666N00548786EA0000001941
+B1322484516675N00548795EA0000001944
+B1322504516685N00548806EA0000001947
+B1322524516693N00548814EA0000001952
+B1322544516701N00548820EA0000001958
+B1322564516707N00548829EA0000001964
+B1322584516709N00548835EA0000001971
+B1323004516704N00548854EA0000001978
+B1323024516704N00548854EA0000001985
+B1323044516689N00548844EA0000001993
+B1323064516685N00548829EA0000002002
+B1323084516687N00548817EA0000002011
+B1323104516694N00548811EA0000002018
+B1323124516702N00548814EA0000002025
+B1323144516706N00548825EA0000002031
+B1323164516703N00548838EA0000002037
+B1323184516695N00548841EA0000002045
+B1323204516684N00548838EA0000002050
+B1323224516673N00548837EA0000002055
+B1323244516663N00548829EA0000002061
+B1323264516659N00548820EA0000002065
+B1323284516661N00548812EA0000002069
+B1323304516670N00548814EA0000002072
+B1323324516680N00548822EA0000002074
+B1323344516691N00548830EA0000002075
+B1323364516703N00548841EA0000002077
+B1323384516715N00548853EA0000002080
+B1323404516725N00548863EA0000002084
+B1323424516735N00548872EA0000002090
+B1323444516744N00548879EA0000002098
+B1323464516750N00548889EA0000002106
+B1323484516751N00548903EA0000002113
+B1323504516748N00548918EA0000002120
+B1323524516739N00548923EA0000002126
+B1323544516726N00548907EA0000002136
+B1323564516726N00548895EA0000002142
+B1323584516734N00548887EA0000002148
+B1324004516744N00548884EA0000002155
+B1324024516754N00548885EA0000002163
+B1324044516764N00548885EA0000002171
+B1324064516772N00548887EA0000002179
+B1324084516781N00548895EA0000002186
+B1324104516787N00548910EA0000002192
+B1324124516786N00548925EA0000002198
+B1324144516779N00548931EA0000002202
+B1324174516772N00548923EA0000002206
+B1324194516772N00548910EA0000002211
+B1324214516781N00548908EA0000002217
+B1324234516791N00548911EA0000002224
+B1324254516802N00548916EA0000002230
+B1324274516814N00548921EA0000002237
+B1324294516826N00548923EA0000002245
+B1324314516839N00548927EA0000002252
+B1324334516854N00548927EA0000002256
+B1324354516861N00548930EA0000002262
+B1324374516882N00548940EA0000002268
+B1324394516896N00548949EA0000002272
+B1324414516907N00548959EA0000002275
+B1324434516920N00548967EA0000002277
+B1324454516935N00548975EA0000002279
+B1324474516947N00548986EA0000002280
+B1324494516959N00548998EA0000002280
+B1324514516971N00549008EA0000002279
+B1324534516984N00549018EA0000002277
+B1324554516998N00549028EA0000002277
+B1324574517011N00549039EA0000002277
+B1324594517024N00549051EA0000002275
+B1325014517040N00549061EA0000002273
+B1325034517055N00549071EA0000002273
+B1325054517066N00549081EA0000002275
+B1325074517076N00549091EA0000002274
+B1325094517087N00549102EA0000002273
+B1325114517101N00549115EA0000002271
+B1325134517115N00549128EA0000002271
+B1325154517127N00549137EA0000002272
+B1325174517139N00549146EA0000002270
+B1325194517154N00549158EA0000002266
+B1325214517168N00549171EA0000002265
+B1325234517182N00549186EA0000002264
+B1325254517195N00549200EA0000002265
+B1325274517207N00549213EA0000002264
+B1325294517223N00549234EA0000002265
+B1325314517231N00549244EA0000002266
+B1325334517240N00549253EA0000002266
+B1325354517249N00549263EA0000002264
+B1325374517259N00549275EA0000002258
+B1325394517269N00549289EA0000002251
+B1325414517279N00549304EA0000002244
+B1325434517288N00549319EA0000002237
+B1325454517298N00549336EA0000002229
+B1325474517308N00549353EA0000002222
+B1325494517314N00549369EA0000002217
+B1325514517319N00549383EA0000002210
+B1325544517327N00549398EA0000002202
+B1325564517337N00549411EA0000002196
+B1325584517345N00549423EA0000002190
+B1326004517353N00549436EA0000002183
+B1326024517364N00549445EA0000002177
+B1326044517375N00549448EA0000002173
+B1326064517379N00549455EA0000002172
+B1326084517384N00549462EA0000002172
+B1326104517394N00549470EA0000002171
+B1326124517400N00549475EA0000002171
+B1326144517412N00549487EA0000002172
+B1326164517416N00549495EA0000002170
+B1326184517421N00549506EA0000002167
+B1326204517429N00549517EA0000002163
+B1326224517439N00549524EA0000002160
+B1326244517449N00549528EA0000002155
+B1326264517460N00549532EA0000002149
+B1326284517472N00549534EA0000002141
+B1326304517486N00549537EA0000002134
+B1326324517500N00549543EA0000002128
+B1326344517513N00549550EA0000002123
+B1326364517527N00549558EA0000002119
+B1326384517540N00549568EA0000002117
+B1326404517552N00549579EA0000002115
+B1326424517564N00549592EA0000002113
+B1326444517575N00549609EA0000002109
+B1326464517584N00549627EA0000002107
+B1326484517591N00549643EA0000002105
+B1326504517598N00549656EA0000002102
+B1326524517607N00549674EA0000002098
+B1326544517616N00549696EA0000002094
+B1326564517625N00549717EA0000002091
+B1326584517635N00549735EA0000002088
+B1327004517644N00549754EA0000002086
+B1327024517654N00549775EA0000002083
+B1327044517664N00549795EA0000002081
+B1327064517675N00549813EA0000002079
+B1327084517686N00549831EA0000002077
+B1327104517702N00549858EA0000002072
+B1327124517714N00549877EA0000002068
+B1327144517727N00549896EA0000002063
+B1327164517738N00549916EA0000002060
+B1327184517750N00549936EA0000002057
+B1327204517763N00549956EA0000002054
+B1327224517778N00549971EA0000002053
+B1327244517791N00549981EA0000002053
+B1327264517800N00549992EA0000002052
+B1327284517810N00550010EA0000002051
+B1327304517817N00550028EA0000002050
+B1327324517823N00550043EA0000002051
+B1327354517830N00550058EA0000002051
+B1327374517839N00550077EA0000002050
+B1327394517849N00550096EA0000002051
+B1327414517858N00550115EA0000002052
+B1327434517868N00550133EA0000002054
+B1327454517877N00550149EA0000002055
+B1327474517887N00550165EA0000002056
+B1327494517895N00550185EA0000002056
+B1327514517904N00550206EA0000002055
+B1327534517912N00550225EA0000002054
+B1327554517919N00550244EA0000002052
+B1327574517927N00550264EA0000002048
+B1327594517935N00550285EA0000002043
+B1328014517943N00550306EA0000002032
+B1328034517952N00550326EA0000002029
+B1328054517959N00550341EA0000002026
+B1328074517965N00550354EA0000002023
+B1328094517970N00550367EA0000002018
+B1328114517980N00550383EA0000002013
+B1328134517991N00550397EA0000002009
+B1328154518001N00550412EA0000002004
+B1328174518010N00550429EA0000001997
+B1328194518020N00550450EA0000001989
+B1328214518031N00550473EA0000001983
+B1328234518041N00550493EA0000001977
+B1328254518052N00550512EA0000001970
+B1328274518063N00550531EA0000001962
+B1328294518072N00550551EA0000001954
+B1328314518083N00550570EA0000001948
+B1328334518091N00550584EA0000001942
+B1328354518100N00550598EA0000001935
+B1328374518112N00550613EA0000001927
+B1328394518125N00550628EA0000001922
+B1328414518136N00550643EA0000001916
+B1328434518147N00550657EA0000001909
+B1328454518160N00550674EA0000001903
+B1328474518171N00550690EA0000001899
+B1328494518180N00550704EA0000001895
+B1328514518193N00550726EA0000001885
+B1328534518202N00550742EA0000001880
+B1328554518209N00550758EA0000001876
+B1328574518217N00550773EA0000001870
+B1328594518224N00550791EA0000001865
+B1329014518230N00550810EA0000001861
+B1329034518235N00550826EA0000001857
+B1329054518241N00550843EA0000001852
+B1329074518247N00550861EA0000001847
+B1329094518253N00550879EA0000001844
+B1329114518260N00550894EA0000001841
+B1329134518265N00550909EA0000001839
+B1329164518269N00550924EA0000001837
+B1329184518274N00550940EA0000001833
+B1329204518279N00550957EA0000001830
+B1329224518284N00550975EA0000001829
+B1329244518289N00550992EA0000001829
+B1329264518293N00551008EA0000001830
+B1329284518298N00551023EA0000001833
+B1329304518303N00551039EA0000001836
+B1329324518308N00551054EA0000001839
+B1329344518311N00551068EA0000001843
+B1329364518313N00551079EA0000001846
+B1329384518315N00551091EA0000001847
+B1329404518317N00551105EA0000001849
+B1329424518319N00551118EA0000001853
+B1329444518321N00551126EA0000001858
+B1329464518321N00551136EA0000001862
+B1329484518320N00551146EA0000001868
+B1329504518314N00551150EA0000001872
+B1329524518307N00551143EA0000001876
+B1329544518304N00551125EA0000001881
+B1329564518314N00551112EA0000001884
+B1329584518329N00551116EA0000001888
+B1330004518333N00551132EA0000001891
+B1330024518332N00551144EA0000001899
+B1330044518330N00551155EA0000001905
+B1330064518328N00551168EA0000001910
+B1330084518328N00551177EA0000001915
+B1330104518328N00551182EA0000001919
+B1330124518322N00551188EA0000001920
+B1330144518314N00551192EA0000001924
+B1330164518305N00551184EA0000001925
+B1330184518302N00551165EA0000001927
+B1330204518309N00551152EA0000001929
+B1330224518321N00551154EA0000001931
+B1330244518326N00551167EA0000001934
+B1330264518325N00551177EA0000001938
+B1330284518326N00551187EA0000001940
+B1330304518319N00551199EA0000001941
+B1330324518308N00551196EA0000001939
+B1330344518301N00551177EA0000001937
+B1330364518303N00551159EA0000001934
+B1330384518310N00551150EA0000001934
+B1330404518318N00551158EA0000001933
+B1330424518320N00551168EA0000001935
+B1330444518324N00551176EA0000001935
+B1330464518330N00551189EA0000001935
+B1330484518336N00551200EA0000001936
+B1330504518342N00551209EA0000001937
+B1330524518347N00551220EA0000001936
+B1330554518352N00551231EA0000001937
+B1330574518357N00551239EA0000001939
+B1330594518362N00551247EA0000001939
+B1331014518368N00551256EA0000001940
+B1331034518374N00551264EA0000001941
+B1331054518380N00551272EA0000001942
+B1331074518386N00551279EA0000001945
+B1331094518393N00551286EA0000001946
+B1331114518399N00551295EA0000001947
+B1331134518406N00551303EA0000001947
+B1331154518414N00551311EA0000001946
+B1331174518421N00551320EA0000001945
+B1331194518429N00551329EA0000001945
+B1331214518436N00551338EA0000001944
+B1331234518443N00551349EA0000001943
+B1331254518450N00551360EA0000001941
+B1331274518458N00551371EA0000001940
+B1331294518466N00551382EA0000001938
+B1331314518475N00551391EA0000001938
+B1331334518482N00551398EA0000001938
+B1331354518490N00551406EA0000001938
+B1331374518498N00551412EA0000001939
+B1331394518505N00551419EA0000001941
+B1331414518511N00551425EA0000001943
+B1331434518518N00551432EA0000001946
+B1331454518525N00551440EA0000001949
+B1331474518531N00551449EA0000001953
+B1331494518533N00551460EA0000001957
+B1331514518532N00551473EA0000001961
+B1331534518524N00551481EA0000001965
+B1331554518513N00551476EA0000001969
+B1331574518507N00551462EA0000001973
+B1331594518510N00551451EA0000001976
+B1332014518522N00551450EA0000001980
+B1332034518532N00551459EA0000001983
+B1332054518539N00551466EA0000001987
+B1332074518548N00551472EA0000001991
+B1332094518564N00551486EA0000001996
+B1332114518575N00551493EA0000002000
+B1332134518584N00551502EA0000002004
+B1332154518595N00551509EA0000002007
+B1332174518607N00551514EA0000002012
+B1332194518618N00551517EA0000002017
+B1332214518629N00551521EA0000002024
+B1332234518639N00551524EA0000002030
+B1332254518649N00551526EA0000002037
+B1332274518656N00551527EA0000002042
+B1332294518663N00551529EA0000002046
+B1332314518668N00551537EA0000002050
+B1332344518664N00551550EA0000002053
+B1332364518654N00551555EA0000002056
+B1332384518646N00551547EA0000002060
+B1332404518648N00551530EA0000002063
+B1332424518658N00551522EA0000002068
+B1332444518669N00551524EA0000002073
+B1332464518675N00551531EA0000002078
+B1332484518677N00551540EA0000002080
+B1332504518676N00551553EA0000002083
+B1332524518663N00551561EA0000002086
+B1332544518652N00551555EA0000002088
+B1332564518649N00551537EA0000002091
+B1332584518654N00551527EA0000002094
+B1333004518663N00551528EA0000002096
+B1333024518673N00551532EA0000002099
+B1333044518684N00551538EA0000002103
+B1333064518694N00551545EA0000002108
+B1333084518701N00551552EA0000002113
+B1333104518705N00551562EA0000002118
+B1333124518702N00551578EA0000002123
+B1333144518692N00551588EA0000002128
+B1333164518682N00551584EA0000002132
+B1333184518677N00551569EA0000002137
+B1333204518680N00551557EA0000002142
+B1333224518687N00551556EA0000002147
+B1333244518689N00551570EA0000002152
+B1333264518686N00551586EA0000002156
+B1333284518679N00551600EA0000002160
+B1333304518675N00551603EA0000002166
+B1333324518670N00551584EA0000002169
+B1333344518677N00551571EA0000002171
+B1333364518685N00551570EA0000002175
+B1333384518694N00551590EA0000002180
+B1333404518698N00551601EA0000002185
+B1333424518705N00551613EA0000002190
+B1333444518707N00551631EA0000002196
+B1333464518699N00551646EA0000002200
+B1333484518687N00551646EA0000002203
+B1333504518682N00551622EA0000002205
+B1333524518690N00551615EA0000002209
+B1333544518700N00551621EA0000002214
+B1333564518707N00551627EA0000002222
+B1333584518714N00551630EA0000002229
+B1334004518721N00551634EA0000002235
+B1334024518729N00551635EA0000002241
+B1334044518734N00551629EA0000002245
+B1334064518733N00551617EA0000002249
+B1334084518724N00551609EA0000002253
+B1334104518713N00551605EA0000002257
+B1334124518702N00551608EA0000002260
+B1334154518693N00551619EA0000002265
+B1334174518689N00551634EA0000002270
+B1334194518689N00551648EA0000002275
+B1334214518692N00551662EA0000002279
+B1334234518698N00551672EA0000002282
+B1334254518706N00551671EA0000002285
+B1334274518714N00551660EA0000002287
+B1334294518717N00551647EA0000002290
+B1334314518712N00551636EA0000002294
+B1334334518705N00551631EA0000002300
+B1334354518696N00551631EA0000002305
+B1334374518685N00551636EA0000002309
+B1334394518678N00551649EA0000002313
+B1334414518677N00551664EA0000002317
+B1334434518681N00551677EA0000002320
+B1334454518688N00551689EA0000002322
+B1334474518697N00551698EA0000002323
+B1334494518706N00551700EA0000002323
+B1334514518715N00551699EA0000002320
+B1334534518725N00551696EA0000002322
+B1334554518733N00551700EA0000002326
+B1334574518741N00551706EA0000002328
+B1334594518750N00551712EA0000002332
+B1335014518759N00551715EA0000002337
+B1335034518765N00551717EA0000002339
+B1335054518772N00551721EA0000002341
+B1335074518780N00551724EA0000002341
+B1335094518790N00551729EA0000002338
+B1335114518799N00551735EA0000002336
+B1335134518809N00551741EA0000002334
+B1335154518820N00551746EA0000002333
+B1335174518830N00551750EA0000002332
+B1335194518839N00551756EA0000002332
+B1335214518848N00551761EA0000002331
+B1335234518859N00551767EA0000002329
+B1335254518872N00551775EA0000002327
+B1335274518885N00551782EA0000002326
+B1335294518896N00551788EA0000002324
+B1335314518913N00551797EA0000002319
+B1335334518927N00551804EA0000002316
+B1335354518939N00551811EA0000002314
+B1335374518951N00551817EA0000002312
+B1335394518963N00551823EA0000002309
+B1335414518976N00551830EA0000002305
+B1335434518988N00551837EA0000002303
+B1335454519001N00551844EA0000002302
+B1335474519013N00551851EA0000002299
+B1335494519024N00551857EA0000002295
+B1335514519035N00551864EA0000002290
+B1335534519049N00551870EA0000002284
+B1335564519063N00551874EA0000002280
+B1335584519075N00551881EA0000002275
+B1336004519087N00551887EA0000002269
+B1336024519100N00551893EA0000002263
+B1336044519114N00551904EA0000002258
+B1336064519126N00551914EA0000002256
+B1336084519137N00551920EA0000002254
+B1336104519150N00551926EA0000002251
+B1336124519162N00551933EA0000002249
+B1336144519175N00551938EA0000002247
+B1336164519188N00551946EA0000002244
+B1336184519200N00551954EA0000002243
+B1336204519213N00551960EA0000002240
+B1336224519226N00551965EA0000002236
+B1336244519240N00551971EA0000002234
+B1336264519253N00551978EA0000002232
+B1336284519264N00551985EA0000002229
+B1336304519275N00551992EA0000002225
+B1336324519289N00551998EA0000002221
+B1336344519302N00552005EA0000002219
+B1336364519314N00552013EA0000002217
+B1336384519326N00552019EA0000002213
+B1336404519339N00552027EA0000002210
+B1336424519351N00552036EA0000002207
+B1336444519363N00552043EA0000002206
+B1336464519375N00552049EA0000002203
+B1336484519387N00552057EA0000002200
+B1336504519401N00552064EA0000002198
+B1336524519412N00552072EA0000002197
+B1336544519424N00552080EA0000002194
+B1336564519436N00552089EA0000002190
+B1336584519449N00552098EA0000002187
+B1337004519461N00552108EA0000002185
+B1337024519473N00552117EA0000002182
+B1337044519484N00552127EA0000002178
+B1337064519495N00552136EA0000002172
+B1337084519508N00552146EA0000002167
+B1337104519527N00552163EA0000002161
+B1337124519537N00552172EA0000002158
+B1337144519549N00552181EA0000002155
+B1337164519561N00552190EA0000002152
+B1337184519574N00552199EA0000002150
+B1337204519586N00552208EA0000002150
+B1337224519597N00552217EA0000002151
+B1337244519608N00552227EA0000002152
+B1337264519620N00552238EA0000002153
+B1337284519632N00552248EA0000002155
+B1337304519643N00552258EA0000002156
+B1337324519654N00552267EA0000002157
+B1337354519667N00552278EA0000002155
+B1337374519680N00552290EA0000002155
+B1337394519691N00552300EA0000002154
+B1337414519701N00552309EA0000002152
+B1337434519711N00552317EA0000002151
+B1337454519721N00552322EA0000002151
+B1337474519728N00552326EA0000002153
+B1337494519734N00552331EA0000002152
+B1337514519741N00552340EA0000002153
+B1337534519745N00552351EA0000002156
+B1337554519750N00552358EA0000002158
+B1337574519757N00552362EA0000002159
+B1337594519764N00552369EA0000002162
+B1338014519772N00552375EA0000002164
+B1338034519782N00552380EA0000002166
+B1338054519792N00552387EA0000002168
+B1338074519800N00552395EA0000002169
+B1338094519811N00552401EA0000002170
+B1338114519823N00552409EA0000002169
+B1338134519835N00552417EA0000002171
+B1338154519846N00552421EA0000002172
+B1338174519857N00552426EA0000002175
+B1338194519864N00552432EA0000002179
+B1338214519869N00552437EA0000002180
+B1338234519877N00552443EA0000002183
+B1338254519884N00552449EA0000002188
+B1338274519891N00552454EA0000002191
+B1338294519899N00552460EA0000002193
+B1338314519907N00552468EA0000002196
+B1338334519912N00552483EA0000002198
+B1338354519914N00552503EA0000002201
+B1338374519905N00552519EA0000002204
+B1338394519896N00552521EA0000002207
+B1338414519891N00552508EA0000002209
+B1338434519895N00552495EA0000002210
+B1338454519908N00552494EA0000002217
+B1338474519918N00552503EA0000002223
+B1338494519932N00552517EA0000002229
+B1338514519941N00552524EA0000002232
+B1338534519952N00552533EA0000002235
+B1338554519962N00552541EA0000002240
+B1338574519967N00552545EA0000002245
+B1338594519971N00552549EA0000002249
+B1339014519975N00552560EA0000002252
+B1339034519974N00552575EA0000002255
+B1339054519961N00552579EA0000002248
+B1339074519953N00552561EA0000002248
+B1339094519957N00552547EA0000002249
+B1339124519964N00552540EA0000002252
+B1339144519970N00552535EA0000002255
+B1339164519978N00552534EA0000002255
+B1339184519989N00552537EA0000002258
+B1339204519998N00552542EA0000002259
+B1339224520007N00552546EA0000002260
+B1339244520017N00552554EA0000002261
+B1339264520026N00552561EA0000002262
+B1339284520037N00552568EA0000002263
+B1339304520050N00552579EA0000002262
+B1339324520061N00552588EA0000002263
+B1339344520069N00552595EA0000002264
+B1339364520079N00552603EA0000002265
+B1339384520088N00552611EA0000002267
+B1339404520096N00552616EA0000002269
+B1339424520107N00552623EA0000002271
+B1339444520119N00552630EA0000002275
+B1339464520130N00552636EA0000002279
+B1339484520139N00552642EA0000002284
+B1339504520146N00552651EA0000002290
+B1339524520147N00552663EA0000002295
+B1339544520141N00552672EA0000002299
+B1339564520132N00552671EA0000002303
+B1339584520123N00552659EA0000002307
+B1340004520123N00552644EA0000002312
+B1340024520131N00552637EA0000002318
+B1340044520140N00552635EA0000002323
+B1340064520149N00552639EA0000002328
+B1340084520157N00552651EA0000002332
+B1340104520158N00552666EA0000002336
+B1340124520153N00552677EA0000002340
+B1340144520145N00552677EA0000002342
+B1340164520141N00552664EA0000002343
+B1340184520148N00552652EA0000002345
+B1340204520158N00552651EA0000002348
+B1340224520168N00552651EA0000002350
+B1340244520180N00552647EA0000002350
+B1340264520193N00552650EA0000002350
+B1340284520210N00552657EA0000002350
+B1340304520223N00552663EA0000002350
+B1340324520236N00552670EA0000002351
+B1340344520247N00552675EA0000002352
+B1340364520257N00552681EA0000002353
+B1340384520269N00552689EA0000002352
+B1340404520281N00552698EA0000002350
+B1340424520296N00552706EA0000002348
+B1340444520311N00552714EA0000002346
+B1340464520325N00552722EA0000002344
+B1340484520339N00552731EA0000002343
+B1340504520355N00552741EA0000002340
+B1340534520371N00552750EA0000002339
+B1340554520384N00552761EA0000002339
+B1340574520394N00552774EA0000002339
+B1340594520407N00552785EA0000002337
+B1341014520420N00552797EA0000002335
+B1341034520433N00552808EA0000002335
+B1341054520445N00552818EA0000002334
+B1341074520456N00552828EA0000002333
+B1341094520468N00552840EA0000002330
+B1341114520480N00552855EA0000002326
+B1341134520492N00552869EA0000002324
+B1341154520504N00552883EA0000002321
+B1341174520516N00552898EA0000002318
+B1341194520529N00552912EA0000002315
+B1341214520542N00552924EA0000002313
+B1341234520555N00552939EA0000002311
+B1341254520567N00552954EA0000002309
+B1341274520580N00552969EA0000002306
+B1341294520593N00552982EA0000002305
+B1341314520606N00552994EA0000002303
+B1341334520621N00553007EA0000002301
+B1341354520635N00553020EA0000002301
+B1341374520647N00553030EA0000002300
+B1341394520662N00553039EA0000002299
+B1341414520677N00553050EA0000002298
+B1341434520690N00553061EA0000002298
+B1341454520703N00553073EA0000002297
+B1341474520716N00553088EA0000002295
+B1341494520726N00553103EA0000002295
+B1341514520737N00553116EA0000002294
+B1341534520750N00553127EA0000002293
+B1341554520762N00553140EA0000002290
+B1341574520775N00553151EA0000002288
+B1341594520788N00553162EA0000002287
+B1342014520800N00553176EA0000002286
+B1342034520811N00553187EA0000002285
+B1342054520824N00553197EA0000002283
+B1342074520845N00553216EA0000002279
+B1342094520857N00553227EA0000002277
+B1342114520870N00553238EA0000002275
+B1342134520883N00553249EA0000002272
+B1342154520896N00553261EA0000002270
+B1342174520910N00553272EA0000002268
+B1342194520923N00553279EA0000002266
+B1342214520936N00553286EA0000002263
+B1342234520947N00553297EA0000002260
+B1342254520959N00553308EA0000002257
+B1342274520970N00553318EA0000002254
+B1342294520979N00553331EA0000002249
+B1342324520990N00553342EA0000002244
+B1342344521002N00553352EA0000002241
+B1342364521013N00553364EA0000002239
+B1342384521024N00553374EA0000002236
+B1342404521036N00553383EA0000002234
+B1342424521047N00553393EA0000002230
+B1342444521058N00553402EA0000002226
+B1342464521072N00553411EA0000002223
+B1342484521084N00553422EA0000002222
+B1342504521095N00553431EA0000002219
+B1342524521108N00553440EA0000002215
+B1342544521114N00553445EA0000002214
+B1342564521130N00553458EA0000002212
+B1342584521140N00553464EA0000002209
+B1343004521154N00553474EA0000002206
+B1343024521168N00553483EA0000002204
+B1343044521180N00553491EA0000002203
+B1343064521190N00553501EA0000002200
+B1343084521201N00553512EA0000002195
+B1343104521213N00553521EA0000002192
+B1343124521225N00553529EA0000002188
+B1343144521237N00553537EA0000002183
+B1343164521250N00553545EA0000002180
+B1343184521261N00553553EA0000002179
+B1343204521273N00553560EA0000002176
+B1343224521285N00553569EA0000002173
+B1343244521297N00553581EA0000002170
+B1343264521310N00553593EA0000002169
+B1343284521322N00553604EA0000002168
+B1343304521334N00553612EA0000002170
+B1343324521344N00553620EA0000002174
+B1343344521354N00553626EA0000002180
+B1343364521363N00553634EA0000002183
+B1343384521367N00553647EA0000002186
+B1343404521361N00553659EA0000002188
+B1343424521352N00553660EA0000002191
+B1343444521346N00553644EA0000002197
+B1343464521346N00553629EA0000002203
+B1343484521354N00553612EA0000002209
+B1343504521368N00553611EA0000002213
+B1343524521379N00553623EA0000002216
+B1343544521383N00553637EA0000002219
+B1343564521380N00553651EA0000002223
+B1343584521375N00553661EA0000002229
+B1344004521367N00553665EA0000002234
+B1344024521359N00553660EA0000002240
+B1344044521354N00553648EA0000002245
+B1344064521354N00553630EA0000002250
+B1344084521365N00553621EA0000002255
+B1344104521378N00553628EA0000002260
+B1344134521383N00553644EA0000002265
+B1344154521381N00553658EA0000002270
+B1344174521378N00553668EA0000002277
+B1344194521373N00553678EA0000002283
+B1344214521366N00553683EA0000002289
+B1344234521360N00553679EA0000002294
+B1344254521356N00553666EA0000002298
+B1344274521362N00553645EA0000002297
+B1344294521373N00553641EA0000002301
+B1344314521378N00553643EA0000002305
+B1344334521393N00553656EA0000002309
+B1344354521393N00553656EA0000002313
+B1344374521412N00553673EA0000002317
+B1344394521423N00553678EA0000002322
+B1344414521432N00553684EA0000002326
+B1344434521441N00553689EA0000002331
+B1344454521451N00553694EA0000002336
+B1344474521461N00553697EA0000002341
+B1344494521471N00553701EA0000002346
+B1344514521484N00553706EA0000002352
+B1344534521497N00553711EA0000002359
+B1344554521508N00553716EA0000002368
+B1344574521518N00553722EA0000002379
+B1344594521528N00553725EA0000002387
+B1345014521540N00553730EA0000002393
+B1345034521551N00553738EA0000002402
+B1345054521557N00553747EA0000002410
+B1345074521562N00553753EA0000002416
+B1345094521569N00553758EA0000002420
+B1345114521576N00553761EA0000002422
+B1345134521585N00553763EA0000002423
+B1345154521594N00553767EA0000002426
+B1345174521604N00553769EA0000002428
+B1345194521613N00553773EA0000002429
+B1345214521623N00553778EA0000002430
+B1345234521634N00553784EA0000002430
+B1345254521645N00553792EA0000002431
+B1345274521661N00553806EA0000002432
+B1345294521671N00553812EA0000002432
+B1345314521682N00553819EA0000002431
+B1345334521693N00553827EA0000002430
+B1345354521704N00553836EA0000002428
+B1345374521715N00553844EA0000002426
+B1345394521728N00553854EA0000002422
+B1345414521743N00553863EA0000002420
+B1345434521758N00553872EA0000002420
+B1345454521771N00553881EA0000002418
+B1345474521784N00553888EA0000002418
+B1345504521796N00553893EA0000002417
+B1345524521809N00553899EA0000002415
+B1345544521824N00553905EA0000002413
+B1345564521839N00553912EA0000002413
+B1345584521853N00553918EA0000002413
+B1346004521866N00553922EA0000002411
+B1346024521881N00553929EA0000002409
+B1346044521895N00553936EA0000002408
+B1346064521909N00553944EA0000002407
+B1346084521916N00553949EA0000002404
+B1346104521938N00553963EA0000002400
+B1346124521953N00553972EA0000002398
+B1346144521969N00553977EA0000002394
+B1346164521969N00553977EA0000002391
+B1346184521999N00553993EA0000002387
+B1346204522014N00554001EA0000002382
+B1346224522030N00554009EA0000002378
+B1346244522046N00554017EA0000002375
+B1346264522060N00554024EA0000002372
+B1346284522075N00554031EA0000002368
+B1346304522090N00554039EA0000002365
+B1346324522105N00554047EA0000002363
+B1346344522119N00554053EA0000002361
+B1346364522135N00554058EA0000002357
+B1346384522151N00554062EA0000002356
+B1346404522165N00554067EA0000002354
+B1346424522180N00554071EA0000002351
+B1346444522196N00554075EA0000002347
+B1346464522211N00554080EA0000002345
+B1346484522226N00554083EA0000002342
+B1346504522242N00554085EA0000002338
+B1346524522258N00554084EA0000002335
+B1346544522272N00554084EA0000002333
+B1346564522286N00554085EA0000002331
+B1346584522300N00554085EA0000002328
+B1347004522316N00554084EA0000002325
+B1347024522331N00554083EA0000002324
+B1347044522344N00554082EA0000002322
+B1347064522365N00554082EA0000002317
+B1347084522381N00554081EA0000002315
+B1347104522396N00554080EA0000002314
+B1347124522410N00554080EA0000002312
+B1347144522425N00554080EA0000002309
+B1347164522441N00554081EA0000002307
+B1347184522457N00554082EA0000002306
+B1347204522472N00554083EA0000002304
+B1347224522488N00554086EA0000002301
+B1347244522503N00554092EA0000002300
+B1347264522517N00554098EA0000002299
+B1347284522530N00554103EA0000002297
+B1347314522543N00554109EA0000002294
+B1347334522558N00554114EA0000002292
+B1347354522571N00554118EA0000002289
+B1347374522585N00554121EA0000002287
+B1347394522598N00554125EA0000002285
+B1347414522612N00554128EA0000002282
+B1347434522627N00554132EA0000002279
+B1347454522641N00554136EA0000002277
+B1347474522654N00554140EA0000002274
+B1347494522669N00554144EA0000002271
+B1347514522683N00554148EA0000002270
+B1347534522695N00554152EA0000002268
+B1347554522709N00554156EA0000002264
+B1347574522723N00554162EA0000002260
+B1347594522737N00554169EA0000002257
+B1348014522751N00554176EA0000002254
+B1348034522765N00554183EA0000002251
+B1348054522779N00554190EA0000002248
+B1348074522793N00554196EA0000002246
+B1348094522806N00554201EA0000002244
+B1348114522819N00554206EA0000002240
+B1348134522833N00554212EA0000002236
+B1348154522847N00554216EA0000002234
+B1348174522860N00554219EA0000002231
+B1348194522873N00554224EA0000002227
+B1348214522887N00554229EA0000002224
+B1348234522901N00554235EA0000002222
+B1348254522914N00554240EA0000002220
+B1348274522925N00554244EA0000002219
+B1348294522937N00554247EA0000002215
+B1348314522951N00554251EA0000002212
+B1348334522965N00554255EA0000002210
+B1348354522976N00554256EA0000002210
+B1348374522987N00554259EA0000002207
+B1348394522998N00554261EA0000002204
+B1348414523011N00554264EA0000002202
+B1348434523022N00554267EA0000002202
+B1348454523031N00554269EA0000002199
+B1348474523049N00554273EA0000002191
+B1348494523061N00554279EA0000002188
+B1348514523073N00554283EA0000002185
+B1348534523084N00554287EA0000002179
+B1348554523096N00554290EA0000002173
+B1348574523111N00554291EA0000002169
+B1348594523124N00554294EA0000002167
+B1349014523137N00554297EA0000002163
+B1349034523152N00554300EA0000002161
+B1349054523166N00554301EA0000002160
+B1349074523179N00554303EA0000002161
+B1349094523191N00554305EA0000002163
+B1349124523201N00554306EA0000002165
+B1349144523211N00554309EA0000002166
+B1349164523222N00554312EA0000002169
+B1349184523232N00554314EA0000002172
+B1349204523242N00554318EA0000002174
+B1349224523252N00554321EA0000002175
+B1349244523264N00554322EA0000002175
+B1349264523275N00554322EA0000002175
+B1349284523286N00554321EA0000002175
+B1349304523298N00554321EA0000002176
+B1349324523310N00554322EA0000002179
+B1349344523319N00554323EA0000002181
+B1349364523329N00554324EA0000002181
+B1349384523341N00554325EA0000002179
+B1349404523356N00554325EA0000002178
+B1349424523369N00554327EA0000002179
+B1349444523381N00554331EA0000002177
+B1349464523395N00554333EA0000002174
+B1349484523409N00554338EA0000002173
+B1349504523421N00554342EA0000002171
+B1349524523432N00554343EA0000002168
+B1349544523444N00554347EA0000002163
+B1349564523459N00554353EA0000002157
+B1349584523475N00554356EA0000002153
+B1350004523488N00554361EA0000002150
+B1350024523500N00554365EA0000002145
+B1350044523514N00554365EA0000002139
+B1350064523528N00554367EA0000002135
+B1350084523541N00554370EA0000002132
+B1350104523554N00554373EA0000002127
+B1350124523568N00554376EA0000002122
+B1350144523582N00554377EA0000002117
+B1350164523596N00554376EA0000002112
+B1350184523610N00554374EA0000002109
+B1350204523623N00554372EA0000002106
+B1350224523634N00554369EA0000002103
+B1350244523647N00554366EA0000002098
+B1350264523661N00554363EA0000002092
+B1350284523682N00554360EA0000002088
+B1350304523695N00554358EA0000002085
+B1350324523708N00554357EA0000002080
+B1350344523722N00554355EA0000002076
+B1350364523735N00554353EA0000002073
+B1350384523748N00554351EA0000002068
+B1350404523761N00554347EA0000002064
+B1350424523774N00554344EA0000002060
+B1350444523787N00554339EA0000002056
+B1350464523800N00554335EA0000002052
+B1350484523813N00554330EA0000002050
+B1350504523824N00554326EA0000002047
+B1350534523837N00554322EA0000002042
+B1350554523851N00554319EA0000002039
+B1350574523864N00554316EA0000002036
+B1350594523877N00554313EA0000002035
+B1351014523889N00554310EA0000002032
+B1351034523902N00554306EA0000002028
+B1351054523915N00554303EA0000002025
+B1351074523929N00554299EA0000002023
+B1351094523942N00554296EA0000002021
+B1351114523948N00554294EA0000002019
+B1351134523968N00554292EA0000002016
+B1351154523981N00554289EA0000002013
+B1351174523981N00554289EA0000002011
+B1351194524007N00554283EA0000002009
+B1351214524021N00554279EA0000002007
+B1351234524034N00554276EA0000002005
+B1351254524048N00554274EA0000002003
+B1351274524062N00554271EA0000002001
+B1351294524076N00554268EA0000001998
+B1351314524090N00554265EA0000001996
+B1351334524103N00554262EA0000001994
+B1351354524117N00554259EA0000001992
+B1351374524131N00554257EA0000001990
+B1351394524144N00554253EA0000001988
+B1351414524158N00554250EA0000001986
+B1351434524171N00554247EA0000001983
+B1351454524184N00554243EA0000001979
+B1351474524198N00554240EA0000001975
+B1351494524212N00554238EA0000001972
+B1351514524226N00554236EA0000001970
+B1351534524241N00554235EA0000001967
+B1351554524255N00554233EA0000001965
+B1351574524269N00554229EA0000001965
+B1351594524281N00554227EA0000001963
+B1352014524295N00554224EA0000001960
+B1352034524308N00554220EA0000001958
+B1352054524321N00554217EA0000001956
+B1352074524334N00554214EA0000001952
+B1352094524355N00554209EA0000001947
+B1352114524369N00554206EA0000001943
+B1352134524381N00554198EA0000001940
+B1352154524393N00554190EA0000001936
+B1352174524405N00554184EA0000001932
+B1352194524417N00554179EA0000001929
+B1352214524429N00554176EA0000001927
+B1352234524440N00554174EA0000001926
+B1352254524451N00554171EA0000001923
+B1352274524461N00554167EA0000001919
+B1352294524474N00554164EA0000001916
+B1352314524486N00554160EA0000001915
+B1352344524497N00554156EA0000001913
+B1352364524507N00554151EA0000001909
+B1352384524519N00554147EA0000001906
+B1352404524531N00554144EA0000001904
+B1352424524542N00554142EA0000001901
+B1352444524554N00554139EA0000001898
+B1352464524567N00554136EA0000001894
+B1352484524581N00554135EA0000001892
+B1352504524593N00554136EA0000001891
+B1352524524602N00554136EA0000001894
+B1352544524613N00554137EA0000001899
+B1352564524624N00554139EA0000001905
+B1352584524624N00554139EA0000001914
+B1353004524639N00554143EA0000001919
+B1353024524647N00554142EA0000001925
+B1353044524656N00554140EA0000001932
+B1353064524663N00554137EA0000001938
+B1353084524671N00554134EA0000001943
+B1353104524681N00554132EA0000001949
+B1353124524689N00554130EA0000001955
+B1353144524694N00554124EA0000001960
+B1353164524701N00554117EA0000001966
+B1353184524709N00554112EA0000001971
+B1353204524717N00554108EA0000001976
+B1353224524727N00554104EA0000001981
+B1353244524738N00554101EA0000001986
+B1353264524748N00554098EA0000001989
+B1353284524758N00554095EA0000001993
+B1353304524767N00554091EA0000001997
+B1353324524777N00554089EA0000002000
+B1353344524786N00554088EA0000002002
+B1353364524798N00554085EA0000002002
+B1353384524810N00554084EA0000002003
+B1353404524818N00554076EA0000002002
+B1353424524822N00554063EA0000002001
+B1353444524822N00554050EA0000002000
+B1353464524814N00554041EA0000001999
+B1353484524802N00554043EA0000001997
+B1353504524794N00554067EA0000001995
+B1353524524793N00554080EA0000001995
+B1353544524790N00554090EA0000001995
+B1353564524786N00554101EA0000001994
+B1353584524779N00554112EA0000001994
+B1354004524773N00554122EA0000001995
+B1354024524766N00554133EA0000001997
+B1354044524759N00554145EA0000002001
+B1354064524753N00554156EA0000002006
+B1354084524747N00554162EA0000002013
+B1354104524738N00554163EA0000002020
+B1354134524732N00554152EA0000002028
+B1354154524736N00554137EA0000002034
+B1354174524751N00554141EA0000002043
+B1354194524755N00554163EA0000002051
+B1354214524750N00554179EA0000002063
+B1354234524743N00554187EA0000002073
+B1354254524735N00554186EA0000002081
+B1354274524731N00554172EA0000002088
+B1354294524737N00554160EA0000002095
+B1354314524751N00554165EA0000002101
+B1354334524757N00554182EA0000002107
+B1354354524749N00554202EA0000002116
+B1354374524736N00554210EA0000002125
+B1354394524732N00554209EA0000002131
+B1354414524726N00554195EA0000002138
+B1354434524730N00554184EA0000002145
+B1354454524740N00554178EA0000002151
+B1354474524753N00554184EA0000002156
+B1354494524760N00554202EA0000002161
+B1354514524761N00554220EA0000002166
+B1354534524755N00554234EA0000002171
+B1354554524745N00554238EA0000002175
+B1354574524738N00554228EA0000002179
+B1354594524740N00554216EA0000002183
+B1355014524754N00554214EA0000002188
+B1355034524765N00554226EA0000002192
+B1355054524768N00554247EA0000002196
+B1355074524764N00554265EA0000002202
+B1355094524756N00554276EA0000002205
+B1355114524745N00554274EA0000002207
+B1355134524743N00554260EA0000002209
+B1355154524752N00554253EA0000002213
+B1355174524762N00554255EA0000002219
+B1355194524770N00554259EA0000002226
+B1355214524779N00554265EA0000002231
+B1355234524787N00554278EA0000002233
+B1355254524787N00554301EA0000002236
+B1355274524777N00554314EA0000002239
+B1355294524764N00554299EA0000002242
+B1355314524769N00554286EA0000002244
+B1355334524779N00554285EA0000002247
+B1355354524788N00554293EA0000002248
+B1355374524794N00554305EA0000002251
+B1355394524797N00554319EA0000002253
+B1355414524793N00554332EA0000002255
+B1355434524784N00554336EA0000002256
+B1355454524775N00554329EA0000002257
+B1355474524774N00554315EA0000002257
+B1355494524781N00554305EA0000002257
+B1355524524790N00554300EA0000002258
+B1355544524798N00554297EA0000002259
+B1355564524809N00554297EA0000002261
+B1355584524820N00554297EA0000002263
+B1356004524830N00554299EA0000002268
+B1356024524840N00554299EA0000002272
+B1356044524850N00554301EA0000002277
+B1356064524860N00554309EA0000002281
+B1356084524870N00554319EA0000002286
+B1356104524882N00554323EA0000002290
+B1356124524895N00554320EA0000002293
+B1356144524906N00554316EA0000002297
+B1356164524914N00554309EA0000002299
+B1356184524922N00554298EA0000002301
+B1356204524926N00554286EA0000002302
+B1356224524924N00554274EA0000002304
+B1356244524917N00554265EA0000002304
+B1356264524909N00554260EA0000002305
+B1356284524901N00554256EA0000002305
+B1356304524894N00554247EA0000002304
+B1356324524890N00554232EA0000002303
+B1356344524893N00554221EA0000002303
+B1356364524899N00554215EA0000002304
+B1356384524908N00554210EA0000002306
+B1356404524917N00554207EA0000002308
+B1356424524927N00554203EA0000002311
+B1356444524936N00554199EA0000002315
+B1356464524946N00554196EA0000002318
+B1356484524957N00554195EA0000002323
+B1356504524968N00554192EA0000002328
+B1356524524979N00554190EA0000002334
+B1356544524991N00554192EA0000002338
+B1356564525003N00554192EA0000002341
+B1356584525014N00554191EA0000002345
+B1357004525026N00554193EA0000002349
+B1357024525037N00554194EA0000002353
+B1357044525046N00554189EA0000002358
+B1357064525052N00554178EA0000002361
+B1357084525050N00554162EA0000002365
+B1357104525044N00554157EA0000002366
+B1357124525036N00554156EA0000002368
+B1357144525028N00554162EA0000002369
+B1357164525024N00554175EA0000002369
+B1357184525023N00554191EA0000002369
+B1357204525027N00554207EA0000002372
+B1357224525037N00554218EA0000002374
+B1357244525050N00554221EA0000002377
+B1357264525062N00554221EA0000002380
+B1357294525075N00554222EA0000002383
+B1357314525089N00554222EA0000002387
+B1357334525101N00554221EA0000002392
+B1357354525114N00554220EA0000002395
+B1357374525127N00554222EA0000002399
+B1357394525141N00554223EA0000002405
+B1357414525153N00554222EA0000002411
+B1357434525164N00554221EA0000002416
+B1357454525178N00554220EA0000002420
+B1357474525185N00554219EA0000002426
+B1357494525206N00554216EA0000002432
+B1357514525218N00554217EA0000002437
+B1357534525218N00554217EA0000002442
+B1357554525239N00554220EA0000002445
+B1357574525252N00554220EA0000002446
+B1357594525266N00554224EA0000002446
+B1358014525278N00554226EA0000002445
+B1358034525290N00554229EA0000002443
+B1358054525303N00554235EA0000002441
+B1358074525316N00554240EA0000002441
+B1358094525328N00554243EA0000002441
+B1358114525338N00554247EA0000002438
+B1358134525350N00554253EA0000002435
+B1358154525364N00554258EA0000002431
+B1358174525377N00554262EA0000002428
+B1358194525390N00554266EA0000002424
+B1358214525404N00554271EA0000002421
+B1358234525417N00554277EA0000002418
+B1358254525429N00554282EA0000002416
+B1358274525442N00554288EA0000002412
+B1358294525455N00554294EA0000002410
+B1358314525467N00554300EA0000002408
+B1358334525479N00554306EA0000002405
+B1358354525491N00554313EA0000002401
+B1358374525505N00554318EA0000002399
+B1358394525517N00554320EA0000002397
+B1358414525530N00554325EA0000002394
+B1358434525542N00554328EA0000002391
+B1358454525559N00554332EA0000002385
+B1358474525572N00554336EA0000002379
+B1358494525586N00554342EA0000002375
+B1358514525600N00554346EA0000002373
+B1358534525614N00554352EA0000002371
+B1358554525627N00554361EA0000002370
+B1358574525640N00554367EA0000002370
+B1358594525650N00554370EA0000002371
+B1359014525657N00554375EA0000002371
+B1359034525667N00554380EA0000002368
+B1359054525680N00554386EA0000002365
+B1359074525694N00554392EA0000002364
+B1359104525706N00554398EA0000002364
+B1359124525716N00554404EA0000002363
+B1359144525729N00554409EA0000002360
+B1359164525742N00554412EA0000002359
+B1359184525754N00554416EA0000002359
+B1359204525765N00554423EA0000002358
+B1359224525778N00554431EA0000002358
+B1359244525791N00554439EA0000002360
+B1359264525802N00554447EA0000002363
+B1359284525814N00554454EA0000002364
+B1359304525827N00554459EA0000002366
+B1359324525840N00554465EA0000002368
+B1359344525840N00554465EA0000002368
+B1359364525866N00554480EA0000002368
+B1359384525881N00554488EA0000002368
+B1359404525894N00554495EA0000002369
+B1359424525907N00554502EA0000002369
+B1359444525921N00554506EA0000002371
+B1359464525933N00554512EA0000002374
+B1359484525943N00554521EA0000002374
+B1359504525955N00554527EA0000002373
+B1359524525967N00554533EA0000002374
+B1359544525978N00554542EA0000002376
+B1359564525991N00554549EA0000002379
+B1359584526004N00554557EA0000002384
+B1400004526014N00554565EA0000002390
+B1400024526021N00554570EA0000002395
+B1400044526028N00554575EA0000002398
+B1400064526033N00554589EA0000002401
+B1400084526031N00554608EA0000002403
+B1400104526019N00554617EA0000002405
+B1400124526010N00554610EA0000002408
+B1400144526007N00554601EA0000002413
+B1400164526008N00554593EA0000002415
+B1400184526013N00554587EA0000002417
+B1400204526021N00554584EA0000002419
+B1400224526032N00554592EA0000002421
+B1400244526037N00554608EA0000002422
+B1400264526027N00554630EA0000002425
+B1400284526017N00554627EA0000002426
+B1400304526016N00554612EA0000002428
+B1400324526025N00554604EA0000002429
+B1400344526036N00554607EA0000002430
+B1400364526047N00554611EA0000002433
+B1400384526057N00554612EA0000002434
+B1400404526068N00554616EA0000002433
+B1400424526080N00554624EA0000002431
+B1400454526093N00554630EA0000002427
+B1400474526106N00554634EA0000002422
+B1400494526121N00554640EA0000002418
+B1400514526135N00554648EA0000002415
+B1400534526147N00554654EA0000002413
+B1400554526160N00554656EA0000002410
+B1400574526175N00554660EA0000002407
+B1400594526190N00554664EA0000002404
+B1401014526204N00554666EA0000002402
+B1401034526217N00554669EA0000002401
+B1401054526230N00554670EA0000002401
+B1401074526243N00554670EA0000002401
+B1401094526257N00554671EA0000002400
+B1401114526272N00554672EA0000002399
+B1401134526285N00554672EA0000002400
+B1401154526298N00554674EA0000002400
+B1401174526313N00554676EA0000002401
+B1401194526327N00554676EA0000002402
+B1401214526341N00554675EA0000002404
+B1401234526354N00554674EA0000002408
+B1401254526367N00554672EA0000002411
+B1401274526382N00554672EA0000002414
+B1401294526396N00554673EA0000002419
+B1401314526404N00554673EA0000002424
+B1401334526412N00554672EA0000002428
+B1401354526422N00554672EA0000002430
+B1401374526433N00554672EA0000002431
+B1401394526445N00554674EA0000002431
+B1401414526459N00554674EA0000002430
+B1401434526475N00554674EA0000002429
+B1401454526491N00554677EA0000002429
+B1401474526505N00554681EA0000002430
+B1401494526519N00554684EA0000002430
+B1401514526534N00554684EA0000002430
+B1401534526549N00554685EA0000002429
+B1401554526565N00554689EA0000002429
+B1401574526579N00554692EA0000002429
+B1401594526594N00554695EA0000002427
+B1402014526619N00554706EA0000002425
+B1402034526633N00554713EA0000002425
+B1402054526646N00554717EA0000002425
+B1402074526658N00554721EA0000002425
+B1402094526670N00554723EA0000002424
+B1402114526682N00554725EA0000002422
+B1402134526696N00554727EA0000002418
+B1402154526709N00554733EA0000002414
+B1402174526722N00554737EA0000002410
+B1402194526737N00554740EA0000002406
+B1402214526753N00554749EA0000002401
+B1402234526768N00554756EA0000002397
+B1402264526784N00554759EA0000002392
+B1402284526800N00554764EA0000002386
+B1402304526816N00554773EA0000002380
+B1402324526834N00554778EA0000002375
+B1402344526849N00554784EA0000002370
+B1402364526864N00554791EA0000002364
+B1402384526880N00554797EA0000002359
+B1402404526896N00554805EA0000002354
+B1402424526908N00554816EA0000002350
+B1402444526921N00554825EA0000002344
+B1402464526936N00554833EA0000002338
+B1402484526951N00554843EA0000002333
+B1402504526951N00554843EA0000002328
+B1402524526978N00554861EA0000002322
+B1402544526992N00554871EA0000002317
+B1402564527005N00554880EA0000002314
+B1402584527018N00554886EA0000002311
+B1403004527031N00554893EA0000002307
+B1403024527045N00554900EA0000002302
+B1403044527061N00554908EA0000002296
+B1403064527078N00554915EA0000002291
+B1403084527095N00554921EA0000002288
+B1403104527111N00554928EA0000002285
+B1403124527127N00554936EA0000002280
+B1403144527144N00554944EA0000002276
+B1403164527161N00554953EA0000002273
+B1403184527178N00554962EA0000002269
+B1403204527195N00554970EA0000002266
+B1403224527212N00554979EA0000002263
+B1403244527229N00554988EA0000002260
+B1403264527246N00554996EA0000002258
+B1403284527262N00555006EA0000002256
+B1403304527278N00555017EA0000002253
+B1403324527294N00555027EA0000002249
+B1403344527310N00555036EA0000002245
+B1403364527326N00555049EA0000002241
+B1403384527341N00555060EA0000002237
+B1403404527358N00555073EA0000002234
+B1403424527381N00555094EA0000002229
+B1403444527396N00555107EA0000002225
+B1403464527412N00555121EA0000002221
+B1403484527428N00555135EA0000002217
+B1403504527443N00555148EA0000002215
+B1403524527458N00555159EA0000002212
+B1403544527474N00555172EA0000002207
+B1403564527490N00555185EA0000002203
+B1403584527507N00555197EA0000002201
+B1404004527523N00555209EA0000002198
+B1404024527538N00555219EA0000002195
+B1404044527554N00555230EA0000002190
+B1404074527571N00555241EA0000002186
+B1404094527587N00555251EA0000002184
+B1404114527603N00555263EA0000002181
+B1404134527617N00555276EA0000002177
+B1404154527632N00555289EA0000002174
+B1404174527648N00555300EA0000002171
+B1404194527664N00555309EA0000002167
+B1404214527680N00555318EA0000002164
+B1404234527696N00555327EA0000002160
+B1404254527713N00555333EA0000002157
+B1404274527730N00555338EA0000002153
+B1404294527746N00555343EA0000002148
+B1404314527746N00555343EA0000002144
+B1404334527781N00555350EA0000002140
+B1404354527798N00555354EA0000002136
+B1404374527814N00555362EA0000002132
+B1404394527831N00555370EA0000002127
+B1404414527848N00555377EA0000002122
+B1404434527864N00555387EA0000002118
+B1404454527881N00555396EA0000002114
+B1404474527898N00555402EA0000002110
+B1404494527915N00555407EA0000002105
+B1404514527931N00555411EA0000002101
+B1404534527948N00555412EA0000002096
+B1404554527959N00555413EA0000002092
+B1404574527965N00555412EA0000002088
+B1404594527973N00555409EA0000002084
+B1405014527986N00555404EA0000002079
+B1405034527995N00555400EA0000002075
+B1405054528002N00555398EA0000002073
+B1405074528011N00555395EA0000002070
+B1405094528023N00555392EA0000002069
+B1405114528034N00555394EA0000002068
+B1405134528044N00555398EA0000002067
+B1405154528055N00555403EA0000002064
+B1405174528066N00555412EA0000002064
+B1405194528075N00555422EA0000002064
+B1405214528084N00555433EA0000002063
+B1405234528099N00555450EA0000002061
+B1405254528108N00555459EA0000002060
+B1405274528118N00555469EA0000002059
+B1405294528128N00555480EA0000002058
+B1405314528138N00555491EA0000002057
+B1405334528146N00555503EA0000002056
+B1405354528155N00555515EA0000002053
+B1405374528167N00555528EA0000002049
+B1405394528180N00555541EA0000002048
+B1405414528191N00555553EA0000002046
+B1405434528202N00555566EA0000002043
+B1405454528214N00555578EA0000002040
+B1405484528226N00555589EA0000002037
+B1405504528237N00555599EA0000002034
+B1405524528249N00555610EA0000002029
+B1405544528262N00555621EA0000002026
+B1405564528274N00555631EA0000002023
+B1405584528285N00555642EA0000002020
+B1406004528296N00555652EA0000002016
+B1406024528308N00555664EA0000002010
+B1406044528320N00555677EA0000002006
+B1406064528330N00555690EA0000002003
+B1406084528340N00555702EA0000001999
+B1406104528351N00555714EA0000001993
+B1406124528362N00555726EA0000001988
+B1406144528373N00555740EA0000001985
+B1406164528383N00555754EA0000001983
+B1406184528393N00555767EA0000001981
+B1406204528405N00555779EA0000001980
+B1406224528416N00555791EA0000001979
+B1406244528426N00555801EA0000001978
+B1406264528437N00555813EA0000001976
+B1406284528449N00555824EA0000001975
+B1406304528459N00555835EA0000001973
+B1406324528471N00555847EA0000001970
+B1406344528482N00555859EA0000001968
+B1406364528494N00555869EA0000001966
+B1406384528505N00555881EA0000001963
+B1406404528516N00555894EA0000001962
+B1406424528527N00555907EA0000001961
+B1406444528538N00555921EA0000001961
+B1406464528549N00555934EA0000001961
+B1406484528558N00555947EA0000001961
+B1406504528566N00555961EA0000001961
+B1406524528575N00555973EA0000001961
+B1406544528584N00555984EA0000001961
+B1406564528592N00555996EA0000001960
+B1406584528600N00556007EA0000001958
+B1407004528609N00556019EA0000001956
+B1407024528622N00556036EA0000001953
+B1407044528631N00556046EA0000001951
+B1407064528641N00556057EA0000001950
+B1407084528651N00556067EA0000001949
+B1407104528661N00556078EA0000001948
+B1407124528670N00556088EA0000001947
+B1407144528679N00556100EA0000001945
+B1407164528687N00556114EA0000001943
+B1407184528694N00556129EA0000001940
+B1407204528700N00556145EA0000001938
+B1407224528705N00556163EA0000001934
+B1407244528710N00556181EA0000001930
+B1407274528718N00556196EA0000001926
+B1407294528726N00556211EA0000001922
+B1407314528735N00556225EA0000001917
+B1407334528744N00556240EA0000001913
+B1407354528753N00556255EA0000001910
+B1407374528762N00556269EA0000001907
+B1407394528772N00556282EA0000001903
+B1407414528781N00556296EA0000001900
+B1407434528791N00556310EA0000001897
+B1407454528799N00556324EA0000001894
+B1407474528809N00556338EA0000001890
+B1407494528818N00556353EA0000001887
+B1407514528826N00556367EA0000001884
+B1407534528835N00556381EA0000001880
+B1407554528844N00556396EA0000001877
+B1407574528852N00556410EA0000001874
+B1407594528860N00556424EA0000001870
+B1408014528869N00556438EA0000001865
+B1408034528878N00556451EA0000001861
+B1408054528886N00556467EA0000001857
+B1408074528895N00556482EA0000001855
+B1408094528904N00556494EA0000001852
+B1408114528914N00556507EA0000001849
+B1408134528924N00556520EA0000001847
+B1408154528934N00556532EA0000001845
+B1408174528944N00556543EA0000001843
+B1408194528954N00556552EA0000001841
+B1408214528965N00556559EA0000001840
+B1408234528975N00556567EA0000001838
+B1408254528987N00556573EA0000001835
+B1408274528998N00556578EA0000001834
+B1408294529010N00556582EA0000001832
+B1408314529021N00556586EA0000001830
+B1408334529033N00556589EA0000001829
+B1408354529045N00556592EA0000001828
+B1408374529056N00556597EA0000001826
+B1408394529068N00556603EA0000001823
+B1408414529082N00556620EA0000001818
+B1408434529092N00556632EA0000001815
+B1408454529103N00556643EA0000001812
+B1408474529114N00556652EA0000001809
+B1408494529124N00556661EA0000001807
+B1408514529135N00556669EA0000001805
+B1408534529146N00556679EA0000001802
+B1408554529156N00556689EA0000001799
+B1408574529167N00556699EA0000001796
+B1408594529177N00556708EA0000001794
+B1409014529187N00556717EA0000001792
+B1409044529198N00556726EA0000001789
+B1409064529208N00556735EA0000001787
+B1409084529219N00556743EA0000001784
+B1409104529230N00556750EA0000001780
+B1409124529241N00556757EA0000001777
+B1409144529252N00556765EA0000001774
+B1409164529263N00556772EA0000001771
+B1409184529274N00556779EA0000001768
+B1409204529285N00556786EA0000001766
+B1409224529295N00556795EA0000001763
+B1409244529306N00556803EA0000001760
+B1409264529316N00556812EA0000001758
+B1409284529326N00556823EA0000001755
+B1409304529337N00556833EA0000001752
+B1409324529348N00556843EA0000001750
+B1409344529358N00556853EA0000001747
+B1409364529370N00556863EA0000001745
+B1409384529381N00556872EA0000001742
+B1409404529391N00556883EA0000001740
+B1409424529402N00556894EA0000001737
+B1409444529413N00556904EA0000001734
+B1409464529423N00556915EA0000001730
+B1409484529433N00556929EA0000001727
+B1409504529442N00556942EA0000001724
+B1409524529452N00556955EA0000001721
+B1409544529461N00556969EA0000001718
+B1409564529470N00556983EA0000001716
+B1409584529480N00556996EA0000001713
+B1410004529490N00557008EA0000001711
+B1410024529500N00557021EA0000001708
+B1410044529510N00557034EA0000001706
+B1410064529520N00557047EA0000001704
+B1410084529529N00557061EA0000001701
+B1410104529537N00557075EA0000001700
+B1410124529545N00557089EA0000001699
+B1410144529554N00557102EA0000001697
+B1410164529563N00557116EA0000001695
+B1410184529570N00557130EA0000001694
+B1410204529582N00557150EA0000001692
+B1410224529590N00557163EA0000001691
+B1410244529599N00557174EA0000001690
+B1410264529607N00557186EA0000001688
+B1410284529616N00557198EA0000001685
+B1410304529625N00557210EA0000001682
+B1410324529634N00557222EA0000001680
+B1410344529642N00557234EA0000001677
+B1410364529651N00557246EA0000001674
+B1410384529660N00557258EA0000001671
+B1410404529668N00557269EA0000001669
+B1410424529676N00557281EA0000001666
+B1410454529684N00557293EA0000001664
+B1410474529693N00557304EA0000001662
+B1410494529701N00557316EA0000001660
+B1410514529709N00557328EA0000001658
+B1410534529717N00557341EA0000001655
+B1410554529724N00557354EA0000001653
+B1410574529732N00557366EA0000001650
+B1410594529741N00557378EA0000001647
+B1411014529750N00557390EA0000001644
+B1411034529758N00557404EA0000001641
+B1411054529768N00557419EA0000001636
+B1411074529777N00557434EA0000001633
+B1411094529785N00557448EA0000001630
+B1411114529794N00557462EA0000001626
+B1411134529804N00557476EA0000001621
+B1411154529814N00557489EA0000001618
+B1411174529823N00557502EA0000001614
+B1411194529834N00557514EA0000001610
+B1411214529845N00557526EA0000001606
+B1411234529856N00557537EA0000001603
+B1411254529866N00557549EA0000001600
+B1411274529876N00557562EA0000001597
+B1411294529885N00557575EA0000001594
+B1411314529895N00557590EA0000001591
+B1411334529904N00557605EA0000001589
+B1411354529913N00557619EA0000001586
+B1411374529922N00557633EA0000001583
+B1411394529932N00557646EA0000001580
+B1411414529941N00557660EA0000001577
+B1411434529951N00557672EA0000001573
+B1411454529961N00557685EA0000001570
+B1411474529971N00557699EA0000001567
+B1411494529980N00557713EA0000001564
+B1411514529989N00557726EA0000001561
+B1411534529998N00557739EA0000001557
+B1411554530008N00557753EA0000001554
+B1411574530022N00557772EA0000001550
+B1411594530032N00557784EA0000001547
+B1412014530041N00557796EA0000001544
+B1412034530051N00557808EA0000001542
+B1412054530061N00557818EA0000001539
+B1412074530071N00557829EA0000001536
+B1412094530082N00557841EA0000001533
+B1412114530092N00557853EA0000001531
+B1412134530102N00557864EA0000001528
+B1412154530113N00557874EA0000001525
+B1412174530123N00557886EA0000001522
+B1412194530133N00557898EA0000001521
+B1412224530143N00557909EA0000001518
+B1412244530153N00557919EA0000001515
+B1412264530163N00557931EA0000001512
+B1412284530173N00557942EA0000001510
+B1412304530183N00557952EA0000001507
+B1412324530192N00557963EA0000001504
+B1412344530202N00557974EA0000001502
+B1412364530212N00557985EA0000001499
+B1412384530222N00557996EA0000001497
+B1412404530232N00558007EA0000001494
+B1412424530242N00558018EA0000001491
+B1412444530251N00558030EA0000001489
+B1412464530261N00558042EA0000001486
+B1412484530271N00558054EA0000001484
+B1412504530280N00558067EA0000001481
+B1412524530289N00558080EA0000001478
+B1412544530298N00558092EA0000001475
+B1412564530307N00558105EA0000001473
+B1412584530317N00558118EA0000001470
+B1413004530326N00558131EA0000001467
+B1413024530335N00558143EA0000001465
+B1413044530345N00558155EA0000001462
+B1413064530354N00558168EA0000001459
+B1413084530363N00558180EA0000001457
+B1413104530373N00558192EA0000001455
+B1413124530383N00558204EA0000001452
+B1413144530392N00558216EA0000001449
+B1413164530402N00558228EA0000001447
+B1413184530412N00558240EA0000001444
+B1413204530421N00558252EA0000001441
+B1413224530431N00558264EA0000001439
+B1413244530441N00558277EA0000001436
+B1413264530450N00558290EA0000001434
+B1413284530460N00558302EA0000001431
+B1413304530469N00558316EA0000001429
+B1413324530477N00558329EA0000001426
+B1413344530485N00558343EA0000001424
+B1413364530498N00558365EA0000001419
+B1413384530506N00558378EA0000001416
+B1413404530514N00558391EA0000001413
+B1413424530523N00558405EA0000001410
+B1413444530531N00558419EA0000001407
+B1413464530539N00558433EA0000001404
+B1413484530547N00558447EA0000001401
+B1413504530555N00558461EA0000001399
+B1413524530564N00558474EA0000001396
+B1413544530572N00558488EA0000001393
+B1413564530581N00558502EA0000001390
+B1413584530589N00558515EA0000001388
+B1414004530597N00558528EA0000001385
+B1414034530605N00558541EA0000001382
+B1414054530614N00558554EA0000001379
+B1414074530622N00558567EA0000001377
+B1414094530630N00558581EA0000001374
+B1414114530638N00558595EA0000001372
+B1414134530646N00558608EA0000001370
+B1414154530653N00558621EA0000001368
+B1414174530661N00558634EA0000001365
+B1414194530669N00558647EA0000001363
+B1414214530676N00558660EA0000001360
+B1414234530683N00558674EA0000001357
+B1414254530689N00558688EA0000001354
+B1414274530696N00558702EA0000001351
+B1414294530703N00558716EA0000001348
+B1414314530710N00558729EA0000001345
+B1414334530717N00558743EA0000001340
+B1414354530725N00558757EA0000001337
+B1414374530732N00558770EA0000001334
+B1414394530740N00558783EA0000001331
+B1414414530748N00558795EA0000001328
+B1414434530757N00558806EA0000001325
+B1414454530766N00558819EA0000001322
+B1414474530774N00558831EA0000001319
+B1414494530782N00558844EA0000001316
+B1414514530790N00558858EA0000001312
+B1414534530800N00558873EA0000001309
+B1414554530809N00558888EA0000001307
+B1414574530817N00558903EA0000001305
+B1414594530826N00558917EA0000001301
+B1415014530835N00558932EA0000001298
+B1415034530844N00558947EA0000001296
+B1415054530852N00558961EA0000001294
+B1415074530860N00558976EA0000001292
+B1415094530868N00558990EA0000001290
+B1415114530876N00559003EA0000001287
+B1415134530883N00559018EA0000001284
+B1415154530895N00559040EA0000001281
+B1415174530902N00559054EA0000001279
+B1415194530909N00559069EA0000001277
+B1415214530916N00559083EA0000001275
+B1415234530923N00559097EA0000001272
+B1415254530930N00559111EA0000001270
+B1415274530938N00559123EA0000001267
+B1415294530946N00559136EA0000001264
+B1415314530955N00559150EA0000001261
+B1415334530963N00559163EA0000001259
+B1415354530971N00559177EA0000001256
+B1415374530980N00559191EA0000001253
+B1415404530989N00559205EA0000001252
+B1415424530996N00559219EA0000001251
+B1415444531002N00559232EA0000001248
+B1415464531012N00559242EA0000001245
+B1415484531022N00559252EA0000001243
+B1415504531030N00559263EA0000001240
+B1415524531037N00559275EA0000001236
+B1415544531045N00559289EA0000001232
+B1415564531052N00559304EA0000001229
+B1415584531058N00559317EA0000001226
+B1416004531064N00559330EA0000001221
+B1416024531071N00559346EA0000001217
+B1416044531077N00559362EA0000001212
+B1416064531084N00559378EA0000001209
+B1416084531090N00559392EA0000001205
+B1416104531096N00559407EA0000001201
+B1416124531103N00559422EA0000001197
+B1416144531109N00559438EA0000001193
+B1416164531114N00559455EA0000001187
+B1416184531119N00559472EA0000001183
+B1416204531125N00559488EA0000001179
+B1416224531131N00559503EA0000001175
+B1416244531138N00559519EA0000001171
+B1416264531143N00559536EA0000001167
+B1416284531149N00559553EA0000001164
+B1416304531154N00559570EA0000001160
+B1416324531160N00559586EA0000001158
+B1416344531166N00559600EA0000001154
+B1416364531172N00559615EA0000001151
+B1416384531179N00559633EA0000001149
+B1416404531186N00559651EA0000001147
+B1416424531194N00559670EA0000001146
+B1416444531201N00559687EA0000001147
+B1416464531207N00559700EA0000001145
+B1416484531215N00559713EA0000001142
+B1416504531223N00559729EA0000001141
+B1416524531229N00559744EA0000001141
+B1416544531235N00559758EA0000001138
+B1416564531246N00559782EA0000001133
+B1416584531253N00559799EA0000001130
+B1417004531259N00559815EA0000001126
+B1417024531267N00559831EA0000001123
+B1417044531273N00559846EA0000001119
+B1417064531280N00559863EA0000001115
+B1417084531287N00559880EA0000001110
+B1417104531294N00559898EA0000001107
+B1417124531301N00559915EA0000001104
+B1417144531308N00559930EA0000001101
+B1417164531315N00559946EA0000001098
+B1417184531322N00559963EA0000001095
+B1417214531329N00559979EA0000001093
+B1417234531334N00559995EA0000001090
+B1417254531341N00600011EA0000001085
+B1417274531349N00600028EA0000001081
+B1417294531355N00600044EA0000001078
+B1417314531361N00600059EA0000001074
+B1417334531367N00600078EA0000001068
+B1417354531374N00600097EA0000001064
+B1417374531381N00600114EA0000001062
+B1417394531387N00600131EA0000001059
+B1417414531394N00600148EA0000001054
+B1417434531403N00600165EA0000001050
+B1417454531407N00600174EA0000001048
+B1417474531417N00600199EA0000001045
+B1417494531424N00600214EA0000001041
+B1417514531431N00600232EA0000001038
+B1417534531438N00600250EA0000001035
+B1417554531445N00600268EA0000001033
+B1417574531451N00600283EA0000001033
+B1417594531456N00600299EA0000001030
+B1418014531463N00600316EA0000001027
+B1418034531470N00600335EA0000001026
+B1418054531476N00600350EA0000001025
+B1418074531483N00600364EA0000001023
+B1418094531489N00600380EA0000001022
+B1418114531495N00600394EA0000001021
+B1418134531502N00600407EA0000001021
+B1418154531508N00600420EA0000001019
+B1418174531514N00600433EA0000001017
+B1418194531522N00600446EA0000001014
+B1418214531529N00600461EA0000001011
+B1418234531535N00600475EA0000001008
+B1418254531542N00600491EA0000001004
+B1418274531550N00600507EA0000001001
+B1418294531556N00600524EA0000000999
+B1418314531563N00600539EA0000000997
+B1418334531570N00600554EA0000000995
+B1418354531579N00600575EA0000000989
+B1418374531587N00600588EA0000000984
+B1418394531594N00600601EA0000000980
+B1418414531601N00600614EA0000000975
+B1418434531608N00600626EA0000000970
+B1418454531616N00600641EA0000000965
+B1418474531622N00600656EA0000000962
+B1418494531628N00600671EA0000000957
+B1418514531635N00600687EA0000000953
+B1418534531643N00600702EA0000000949
+B1418554531650N00600716EA0000000946
+B1418574531657N00600730EA0000000943
+B1419004531666N00600745EA0000000940
+B1419024531673N00600760EA0000000939
+B1419044531680N00600774EA0000000938
+B1419064531687N00600788EA0000000937
+B1419084531694N00600803EA0000000936
+B1419104531701N00600819EA0000000936
+B1419124531707N00600832EA0000000937
+B1419144531714N00600845EA0000000936
+B1419164531721N00600858EA0000000934
+B1419184531731N00600870EA0000000933
+B1419204531741N00600885EA0000000933
+B1419224531747N00600899EA0000000934
+B1419244531753N00600913EA0000000934
+B1419264531760N00600929EA0000000932
+B1419284531767N00600946EA0000000932
+B1419304531772N00600962EA0000000931
+B1419324531780N00600974EA0000000929
+B1419344531787N00600987EA0000000928
+B1419364531795N00601002EA0000000926
+B1419384531802N00601015EA0000000925
+B1419404531809N00601030EA0000000922
+B1419424531815N00601046EA0000000921
+B1419444531821N00601062EA0000000919
+B1419464531828N00601078EA0000000917
+B1419484531834N00601094EA0000000916
+B1419504531841N00601108EA0000000914
+B1419524531848N00601121EA0000000914
+B1419544531853N00601130EA0000000914
+B1419564531859N00601139EA0000000913
+B1419584531866N00601148EA0000000912
+B1420004531872N00601154EA0000000912
+B1420024531878N00601160EA0000000913
+B1420044531885N00601164EA0000000913
+B1420064531891N00601169EA0000000914
+B1420084531897N00601172EA0000000914
+B1420104531904N00601173EA0000000914
+B1420124531912N00601172EA0000000914
+B1420144531921N00601170EA0000000914
+B1420164531928N00601168EA0000000915
+B1420184531934N00601165EA0000000915
+B1420204531938N00601163EA0000000917
+B1420224531943N00601160EA0000000917
+B1420244531949N00601154EA0000000918
+B1420264531954N00601148EA0000000919
+B1420284531959N00601145EA0000000920
+B1420304531965N00601141EA0000000922
+B1420324531972N00601137EA0000000924
+B1420344531978N00601133EA0000000927
+B1420364531983N00601132EA0000000930
+B1420384531991N00601131EA0000000933
+B1420414531998N00601131EA0000000937
+B1420434532002N00601128EA0000000940
+B1420454532008N00601125EA0000000944
+B1420474532016N00601123EA0000000949
+B1420494532022N00601121EA0000000954
+B1420514532029N00601119EA0000000959
+B1420534532037N00601120EA0000000963
+B1420554532045N00601118EA0000000968
+B1420574532051N00601114EA0000000974
+B1420594532057N00601111EA0000000978
+B1421014532064N00601109EA0000000984
+B1421034532069N00601106EA0000000990
+B1421054532075N00601104EA0000000996
+B1421074532081N00601102EA0000001001
+B1421094532089N00601098EA0000001005
+B1421114532097N00601095EA0000001010
+B1421134532101N00601091EA0000001014
+B1421154532105N00601086EA0000001017
+B1421174532112N00601083EA0000001019
+B1421194532119N00601080EA0000001022
+B1421214532125N00601078EA0000001026
+B1421234532131N00601075EA0000001030
+B1421254532136N00601071EA0000001034
+B1421274532142N00601067EA0000001037
+B1421294532150N00601064EA0000001040
+B1421314532156N00601060EA0000001044
+B1421334532160N00601056EA0000001046
+B1421354532167N00601051EA0000001048
+B1421374532176N00601048EA0000001050
+B1421394532182N00601046EA0000001054
+B1421414532188N00601042EA0000001058
+B1421434532195N00601040EA0000001063
+B1421454532202N00601039EA0000001068
+B1421474532209N00601037EA0000001074
+B1421494532214N00601036EA0000001079
+B1421514532220N00601034EA0000001083
+B1421534532228N00601034EA0000001087
+B1421554532236N00601034EA0000001091
+B1421574532248N00601037EA0000001094
+B1421594532258N00601040EA0000001098
+B1422014532267N00601039EA0000001104
+B1422034532272N00601035EA0000001111
+B1422054532276N00601034EA0000001117
+B1422074532280N00601034EA0000001122
+B1422094532283N00601030EA0000001126
+B1422114532283N00601023EA0000001129
+B1422134532280N00601014EA0000001131
+B1422154532268N00601007EA0000001132
+B1422174532252N00601012EA0000001134
+B1422204532242N00601032EA0000001135
+B1422224532242N00601052EA0000001135
+B1422244532244N00601066EA0000001138
+B1422264532250N00601078EA0000001143
+B1422284532257N00601088EA0000001148
+B1422304532262N00601099EA0000001155
+B1422324532268N00601109EA0000001162
+B1422344532274N00601115EA0000001169
+B1422364532278N00601116EA0000001175
+B1422384532283N00601114EA0000001182
+B1422404532284N00601110EA0000001188
+B1422424532280N00601102EA0000001194
+B1422444532271N00601098EA0000001198
+B1422464532259N00601102EA0000001203
+B1422484532250N00601114EA0000001209
+B1422504532247N00601133EA0000001214
+B1422524532250N00601149EA0000001220
+B1422544532256N00601157EA0000001225
+B1422564532262N00601164EA0000001224
+B1422584532265N00601159EA0000001227
+B1423004532260N00601152EA0000001229
+B1423024532251N00601149EA0000001234
+B1423044532241N00601153EA0000001239
+B1423064532233N00601166EA0000001244
+B1423084532228N00601186EA0000001250
+B1423104532227N00601206EA0000001255
+B1423124532229N00601222EA0000001257
+B1423144532232N00601232EA0000001258
+B1423164532237N00601235EA0000001255
+B1423184532241N00601231EA0000001252
+B1423204532238N00601222EA0000001248
+B1423224532227N00601220EA0000001248
+B1423244532214N00601231EA0000001249
+B1423264532203N00601246EA0000001253
+B1423284532194N00601258EA0000001254
+B1423304532185N00601273EA0000001255
+B1423324532180N00601292EA0000001256
+B1423344532182N00601306EA0000001254
+B1423364532191N00601314EA0000001252
+B1423384532194N00601309EA0000001249
+B1423404532198N00601302EA0000001245
+B1423424532203N00601298EA0000001242
+B1423444532208N00601293EA0000001241
+B1423464532210N00601288EA0000001241
+B1423484532209N00601283EA0000001242
+B1423504532211N00601278EA0000001242
+B1423524532214N00601275EA0000001244
+B1423544532215N00601272EA0000001244
+B1423564532217N00601267EA0000001245
+B1423584532218N00601264EA0000001243
+B1424014532222N00601263EA0000001242
+B1424034532228N00601265EA0000001240
+B1424054532235N00601268EA0000001240
+B1424074532241N00601268EA0000001240
+B1424094532247N00601269EA0000001240
+B1424114532254N00601269EA0000001240
+B1424134532259N00601268EA0000001239
+B1424154532265N00601265EA0000001238
+B1424174532270N00601260EA0000001237
+B1424194532275N00601255EA0000001237
+B1424214532279N00601249EA0000001235
+B1424234532283N00601243EA0000001234
+B1424254532287N00601236EA0000001233
+B1424274532291N00601229EA0000001233
+B1424294532296N00601224EA0000001231
+B1424314532301N00601219EA0000001231
+B1424334532305N00601215EA0000001230
+B1424354532310N00601212EA0000001228
+B1424374532314N00601207EA0000001225
+B1424394532318N00601201EA0000001224
+B1424414532321N00601195EA0000001222
+B1424434532326N00601187EA0000001221
+B1424454532331N00601181EA0000001220
+B1424474532335N00601176EA0000001220
+B1424494532339N00601171EA0000001219
+B1424514532345N00601167EA0000001217
+B1424534532351N00601163EA0000001216
+B1424554532356N00601158EA0000001217
+B1424574532360N00601152EA0000001216
+B1424594532364N00601147EA0000001216
+B1425014532368N00601142EA0000001215
+B1425034532371N00601136EA0000001213
+B1425054532375N00601131EA0000001212
+B1425074532380N00601127EA0000001212
+B1425094532384N00601127EA0000001213
+B1425114532388N00601128EA0000001214
+B1425134532393N00601126EA0000001216
+B1425154532396N00601122EA0000001219
+B1425174532401N00601121EA0000001222
+B1425194532407N00601123EA0000001225
+B1425214532414N00601132EA0000001227
+B1425234532418N00601151EA0000001229
+B1425254532411N00601172EA0000001232
+B1425274532399N00601179EA0000001232
+B1425294532389N00601169EA0000001233
+B1425314532391N00601159EA0000001234
+B1425334532400N00601160EA0000001235
+B1425354532409N00601168EA0000001239
+B1425374532414N00601178EA0000001243
+B1425394532416N00601193EA0000001245
+B1425424532413N00601212EA0000001248
+B1425444532402N00601221EA0000001250
+B1425464532391N00601219EA0000001251
+B1425484532386N00601207EA0000001250
+B1425504532389N00601194EA0000001252
+B1425524532398N00601194EA0000001254
+B1425544532405N00601206EA0000001257
+B1425564532404N00601223EA0000001260
+B1425584532396N00601234EA0000001262
+B1426004532385N00601235EA0000001264
+B1426024532380N00601224EA0000001266
+B1426044532386N00601218EA0000001268
+B1426064532394N00601228EA0000001270
+B1426084532397N00601245EA0000001273
+B1426104532397N00601260EA0000001277
+B1426124532394N00601275EA0000001279
+B1426144532386N00601287EA0000001281
+B1426164532375N00601291EA0000001283
+B1426184532366N00601284EA0000001283
+B1426204532365N00601274EA0000001284
+B1426224532372N00601274EA0000001284
+B1426244532381N00601284EA0000001286
+B1426264532388N00601293EA0000001287
+B1426284532396N00601299EA0000001289
+B1426304532402N00601311EA0000001288
+B1426324532406N00601328EA0000001288
+B1426344532403N00601344EA0000001289
+B1426364532396N00601357EA0000001290
+B1426384532387N00601368EA0000001291
+B1426404532377N00601377EA0000001291
+B1426424532368N00601383EA0000001292
+B1426444532358N00601386EA0000001291
+B1426464532348N00601380EA0000001290
+B1426484532345N00601369EA0000001290
+B1426504532347N00601359EA0000001289
+B1426524532349N00601351EA0000001290
+B1426544532350N00601339EA0000001293
+B1426564532351N00601331EA0000001295
+B1426584532352N00601324EA0000001298
+B1427004532354N00601317EA0000001302
+B1427024532356N00601311EA0000001306
+B1427044532358N00601307EA0000001309
+B1427064532360N00601302EA0000001311
+B1427084532367N00601299EA0000001312
+B1427104532374N00601304EA0000001313
+B1427124532378N00601318EA0000001313
+B1427144532377N00601335EA0000001313
+B1427164532368N00601350EA0000001312
+B1427194532358N00601360EA0000001312
+B1427214532346N00601367EA0000001312
+B1427234532332N00601376EA0000001313
+B1427254532320N00601384EA0000001314
+B1427274532309N00601391EA0000001317
+B1427294532300N00601398EA0000001321
+B1427314532290N00601398EA0000001324
+B1427334532280N00601390EA0000001327
+B1427354532278N00601382EA0000001329
+B1427374532284N00601382EA0000001332
+B1427394532290N00601399EA0000001334
+B1427414532290N00601417EA0000001337
+B1427434532285N00601429EA0000001340
+B1427454532276N00601438EA0000001343
+B1427474532264N00601443EA0000001346
+B1427494532254N00601437EA0000001349
+B1427514532251N00601427EA0000001353
+B1427534532256N00601420EA0000001357
+B1427554532264N00601420EA0000001361
+B1427574532272N00601432EA0000001363
+B1427594532275N00601452EA0000001367
+B1428014532269N00601469EA0000001373
+B1428034532259N00601478EA0000001377
+B1428054532247N00601482EA0000001379
+B1428074532237N00601478EA0000001381
+B1428094532232N00601466EA0000001384
+B1428114532237N00601461EA0000001389
+B1428134532244N00601463EA0000001393
+B1428154532252N00601472EA0000001394
+B1428174532256N00601488EA0000001396
+B1428194532256N00601504EA0000001399
+B1428214532246N00601516EA0000001401
+B1428234532236N00601523EA0000001403
+B1428254532221N00601526EA0000001400
+B1428274532211N00601517EA0000001402
+B1428294532208N00601506EA0000001404
+B1428314532211N00601499EA0000001408
+B1428334532219N00601497EA0000001414
+B1428354532224N00601497EA0000001415
+B1428374532231N00601505EA0000001416
+B1428394532234N00601526EA0000001415
+B1428414532225N00601548EA0000001414
+B1428434532210N00601556EA0000001413
+B1428454532198N00601557EA0000001414
+B1428474532186N00601558EA0000001416
+B1428494532175N00601558EA0000001420
+B1428514532165N00601558EA0000001423
+B1428534532155N00601556EA0000001425
+B1428554532148N00601546EA0000001426
+B1428584532151N00601537EA0000001426
+B1429004532160N00601542EA0000001424
+B1429024532165N00601560EA0000001422
+B1429044532157N00601580EA0000001420
+B1429064532141N00601589EA0000001418
+B1429084532125N00601592EA0000001418
+B1429104532114N00601595EA0000001420
+B1429124532104N00601596EA0000001420
+B1429144532093N00601596EA0000001422
+B1429164532082N00601598EA0000001424
+B1429184532072N00601596EA0000001427
+B1429204532065N00601588EA0000001429
+B1429224532065N00601578EA0000001434
+B1429244532074N00601577EA0000001437
+B1429264532080N00601586EA0000001439
+B1429284532080N00601606EA0000001440
+B1429304532068N00601622EA0000001441
+B1429324532054N00601623EA0000001443
+B1429344532048N00601613EA0000001445
+B1429364532052N00601604EA0000001450
+B1429384532059N00601600EA0000001454
+B1429404532064N00601597EA0000001458
+B1429424532070N00601599EA0000001462
+B1429444532077N00601611EA0000001466
+B1429464532074N00601629EA0000001468
+B1429484532062N00601639EA0000001471
+B1429504532049N00601636EA0000001473
+B1429524532042N00601626EA0000001474
+B1429544532041N00601614EA0000001476
+B1429564532048N00601607EA0000001479
+B1429584532057N00601605EA0000001482
+B1430004532064N00601613EA0000001487
+B1430024532067N00601627EA0000001490
+B1430044532064N00601644EA0000001493
+B1430064532053N00601655EA0000001495
+B1430084532034N00601650EA0000001498
+B1430104532032N00601638EA0000001501
+B1430124532035N00601631EA0000001505
+B1430144532040N00601630EA0000001508
+B1430164532047N00601635EA0000001511
+B1430184532051N00601651EA0000001515
+B1430204532042N00601669EA0000001518
+B1430224532029N00601676EA0000001521
+B1430244532018N00601671EA0000001524
+B1430264532012N00601660EA0000001527
+B1430284532014N00601651EA0000001529
+B1430304532020N00601647EA0000001533
+B1430334532027N00601648EA0000001538
+B1430354532033N00601661EA0000001544
+B1430374532033N00601681EA0000001552
+B1430394532026N00601699EA0000001563
+B1430414532012N00601707EA0000001569
+B1430434532000N00601702EA0000001573
+B1430454531994N00601688EA0000001577
+B1430474531999N00601681EA0000001582
+B1430494532007N00601684EA0000001588
+B1430514532012N00601692EA0000001598
+B1430534532015N00601699EA0000001606
+B1430554532020N00601705EA0000001614
+B1430574532024N00601720EA0000001619
+B1430594532021N00601741EA0000001625
+B1431014532009N00601753EA0000001632
+B1431034531997N00601748EA0000001638
+B1431054531994N00601736EA0000001645
+B1431074531996N00601730EA0000001654
+B1431094532002N00601729EA0000001664
+B1431114532007N00601731EA0000001673
+B1431134532011N00601737EA0000001680
+B1431154532017N00601751EA0000001686
+B1431174532015N00601773EA0000001691
+B1431194532004N00601784EA0000001695
+B1431214531992N00601785EA0000001700
+B1431234531984N00601776EA0000001705
+B1431254531984N00601766EA0000001712
+B1431274531991N00601761EA0000001718
+B1431294531998N00601764EA0000001723
+B1431314532002N00601777EA0000001727
+B1431334532000N00601795EA0000001729
+B1431354531990N00601805EA0000001731
+B1431374531978N00601799EA0000001732
+B1431394531971N00601787EA0000001735
+B1431414531971N00601779EA0000001739
+B1431434531974N00601773EA0000001741
+B1431454531980N00601768EA0000001743
+B1431474531991N00601778EA0000001745
+B1431494531992N00601794EA0000001746
+B1431514531984N00601810EA0000001746
+B1431534531973N00601816EA0000001746
+B1431554531965N00601811EA0000001747
+B1431574531961N00601800EA0000001749
+B1431594531957N00601790EA0000001755
+B1432014531955N00601778EA0000001760
+B1432034531956N00601765EA0000001766
+B1432054531960N00601757EA0000001771
+B1432074531965N00601759EA0000001776
+B1432094531967N00601771EA0000001779
+B1432124531962N00601785EA0000001782
+B1432144531950N00601791EA0000001784
+B1432164531939N00601787EA0000001786
+B1432184531930N00601781EA0000001790
+B1432204531923N00601776EA0000001793
+B1432224531918N00601769EA0000001795
+B1432244531918N00601761EA0000001797
+B1432264531923N00601759EA0000001798
+B1432284531929N00601764EA0000001799
+B1432304531935N00601767EA0000001801
+B1432324531939N00601763EA0000001802
+B1432344531943N00601759EA0000001803
+B1432364531947N00601758EA0000001803
+B1432384531953N00601756EA0000001802
+B1432404531958N00601752EA0000001802
+B1432424531963N00601748EA0000001801
+B1432444531969N00601744EA0000001799
+B1432464531976N00601738EA0000001798
+B1432484531982N00601733EA0000001797
+B1432504531988N00601728EA0000001796
+B1432524531995N00601725EA0000001794
+B1432544532002N00601721EA0000001793
+B1432564532009N00601720EA0000001793
+B1432584532016N00601719EA0000001792
+B1433004532024N00601718EA0000001791
+B1433024532032N00601718EA0000001792
+B1433044532039N00601719EA0000001793
+B1433064532047N00601721EA0000001793
+B1433084532055N00601723EA0000001795
+B1433104532063N00601722EA0000001796
+B1433124532070N00601722EA0000001796
+B1433144532079N00601723EA0000001795
+B1433164532088N00601723EA0000001795
+B1433184532096N00601724EA0000001794
+B1433204532105N00601727EA0000001793
+B1433224532113N00601730EA0000001792
+B1433244532122N00601733EA0000001791
+B1433264532135N00601736EA0000001790
+B1433284532144N00601738EA0000001788
+B1433304532153N00601741EA0000001786
+B1433324532162N00601744EA0000001785
+B1433344532170N00601748EA0000001783
+B1433364532178N00601754EA0000001782
+B1433384532186N00601759EA0000001781
+B1433404532194N00601766EA0000001779
+B1433424532203N00601775EA0000001776
+B1433444532214N00601786EA0000001773
+B1433464532224N00601796EA0000001771
+B1433484532233N00601806EA0000001768
+B1433514532242N00601816EA0000001764
+B1433534532252N00601828EA0000001761
+B1433554532262N00601839EA0000001760
+B1433574532271N00601850EA0000001757
+B1433594532280N00601860EA0000001753
+B1434014532290N00601872EA0000001750
+B1434034532300N00601883EA0000001747
+B1434054532309N00601894EA0000001744
+B1434074532319N00601906EA0000001740
+B1434094532329N00601919EA0000001736
+B1434114532340N00601934EA0000001731
+B1434134532352N00601949EA0000001726
+B1434154532358N00601956EA0000001723
+B1434174532374N00601978EA0000001718
+B1434194532385N00601993EA0000001713
+B1434214532396N00602008EA0000001708
+B1434234532407N00602023EA0000001704
+B1434254532418N00602038EA0000001699
+B1434274532428N00602053EA0000001694
+B1434294532439N00602069EA0000001688
+B1434314532448N00602085EA0000001683
+B1434334532459N00602101EA0000001678
+B1434354532469N00602117EA0000001672
+B1434374532479N00602133EA0000001666
+B1434394532490N00602148EA0000001660
+B1434414532499N00602163EA0000001653
+B1434434532508N00602180EA0000001647
+B1434454532517N00602196EA0000001640
+B1434474532526N00602214EA0000001633
+B1434494532535N00602231EA0000001626
+B1434514532544N00602248EA0000001619
+B1434534532552N00602266EA0000001613
+B1434554532559N00602284EA0000001609
+B1434574532562N00602299EA0000001606
+B1434594532566N00602314EA0000001602
+B1435014532572N00602332EA0000001599
+B1435034532578N00602347EA0000001597
+B1435054532583N00602361EA0000001599
+B1435074532593N00602384EA0000001596
+B1435094532599N00602400EA0000001595
+B1435114532605N00602416EA0000001595
+B1435134532611N00602431EA0000001593
+B1435154532616N00602447EA0000001591
+B1435174532622N00602462EA0000001589
+B1435194532628N00602478EA0000001588
+B1435214532633N00602494EA0000001585
+B1435234532639N00602509EA0000001583
+B1435254532644N00602525EA0000001580
+B1435274532649N00602541EA0000001578
+B1435304532654N00602555EA0000001576
+B1435324532660N00602568EA0000001573
+B1435344532667N00602580EA0000001569
+B1435364532674N00602592EA0000001567
+B1435384532679N00602605EA0000001564
+B1435404532685N00602618EA0000001561
+B1435424532691N00602632EA0000001557
+B1435444532695N00602648EA0000001554
+B1435464532701N00602663EA0000001551
+B1435484532706N00602678EA0000001548
+B1435504532711N00602694EA0000001544
+B1435524532717N00602712EA0000001542
+B1435544532722N00602729EA0000001541
+B1435564532727N00602743EA0000001538
+B1435584532731N00602759EA0000001535
+B1436004532737N00602777EA0000001532
+B1436024532742N00602793EA0000001531
+B1436044532747N00602806EA0000001529
+B1436064532752N00602821EA0000001525
+B1436084532758N00602839EA0000001523
+B1436104532763N00602855EA0000001521
+B1436124532770N00602867EA0000001518
+B1436144532778N00602879EA0000001513
+B1436164532784N00602893EA0000001508
+B1436184532792N00602905EA0000001503
+B1436204532801N00602916EA0000001497
+B1436224532809N00602928EA0000001493
+B1436244532815N00602945EA0000001488
+B1436264532820N00602961EA0000001483
+B1436284532825N00602979EA0000001478
+B1436304532827N00602999EA0000001474
+B1436324532829N00603018EA0000001471
+B1436344532832N00603036EA0000001467
+B1436364532834N00603055EA0000001463
+B1436384532837N00603074EA0000001460
+B1436404532839N00603093EA0000001456
+B1436424532842N00603112EA0000001452
+B1436444532844N00603131EA0000001447
+B1436464532847N00603160EA0000001441
+B1436484532846N00603181EA0000001437
+B1436504532845N00603203EA0000001435
+B1436524532843N00603223EA0000001434
+B1436544532843N00603242EA0000001434
+B1436564532843N00603257EA0000001439
+B1436584532845N00603268EA0000001443
+B1437004532847N00603277EA0000001445
+B1437024532850N00603284EA0000001447
+B1437044532852N00603294EA0000001449
+B1437064532855N00603305EA0000001452
+B1437094532860N00603315EA0000001456
+B1437114532864N00603323EA0000001461
+B1437134532869N00603329EA0000001466
+B1437154532875N00603332EA0000001469
+B1437174532880N00603336EA0000001472
+B1437194532885N00603336EA0000001473
+B1437214532890N00603330EA0000001473
+B1437234532887N00603316EA0000001472
+B1437254532876N00603311EA0000001472
+B1437274532863N00603319EA0000001474
+B1437294532854N00603327EA0000001478
+B1437314532843N00603332EA0000001480
+B1437334532831N00603333EA0000001482
+B1437354532822N00603327EA0000001484
+B1437374532818N00603317EA0000001489
+B1437394532822N00603311EA0000001492
+B1437414532829N00603316EA0000001494
+B1437434532834N00603324EA0000001498
+B1437454532838N00603330EA0000001501
+B1437474532844N00603336EA0000001502
+B1437494532851N00603340EA0000001502
+B1437514532858N00603342EA0000001502
+B1437534532866N00603342EA0000001504
+B1437554532873N00603342EA0000001505
+B1437574532878N00603343EA0000001505
+B1437594532886N00603346EA0000001505
+B1438014532896N00603353EA0000001506
+B1438034532906N00603359EA0000001507
+B1438054532913N00603362EA0000001510
+B1438074532922N00603365EA0000001511
+B1438094532932N00603369EA0000001514
+B1438114532940N00603371EA0000001515
+B1438134532948N00603371EA0000001517
+B1438154532953N00603371EA0000001520
+B1438174532959N00603372EA0000001521
+B1438194532967N00603370EA0000001521
+B1438214532975N00603368EA0000001521
+B1438234532986N00603366EA0000001519
+B1438254532996N00603362EA0000001517
+B1438274533009N00603355EA0000001515
+B1438294533019N00603350EA0000001513
+B1438314533020N00603348EA0000001514
+B1438334533020N00603345EA0000001514
+B1438354533022N00603336EA0000001513
+B1438374533028N00603327EA0000001513
+B1438394533034N00603325EA0000001513
+B1438414533042N00603319EA0000001512
+B1438434533050N00603314EA0000001510
+B1438454533057N00603314EA0000001508
+B1438484533064N00603311EA0000001505
+B1438504533073N00603307EA0000001504
+B1438524533079N00603302EA0000001503
+B1438544533082N00603295EA0000001502
+B1438564533088N00603287EA0000001501
+B1438584533098N00603281EA0000001500
+B1439004533106N00603279EA0000001501
+B1439024533114N00603276EA0000001503
+B1439044533123N00603272EA0000001506
+B1439064533132N00603270EA0000001510
+B1439084533139N00603270EA0000001514
+B1439104533146N00603275EA0000001519
+B1439124533150N00603278EA0000001530
+B1439144533152N00603282EA0000001534
+B1439164533153N00603292EA0000001534
+B1439184533144N00603312EA0000001533
+B1439204533131N00603307EA0000001530
+B1439224533129N00603290EA0000001529
+B1439244533140N00603284EA0000001530
+B1439264533148N00603286EA0000001531
+B1439284533153N00603291EA0000001529
+B1439304533158N00603303EA0000001528
+B1439324533161N00603316EA0000001528
+B1439344533167N00603326EA0000001526
+B1439364533173N00603336EA0000001524
+B1439384533179N00603346EA0000001521
+B1439404533187N00603354EA0000001517
+B1439424533195N00603362EA0000001514
+B1439444533204N00603371EA0000001511
+B1439464533213N00603380EA0000001510
+B1439484533221N00603388EA0000001507
+B1439504533230N00603397EA0000001505
+B1439524533238N00603407EA0000001503
+B1439544533245N00603415EA0000001500
+B1439564533253N00603424EA0000001497
+B1439584533262N00603432EA0000001494
+B1440004533269N00603439EA0000001491
+B1440024533277N00603448EA0000001487
+B1440044533289N00603462EA0000001483
+B1440064533297N00603471EA0000001480
+B1440084533306N00603481EA0000001476
+B1440104533314N00603490EA0000001474
+B1440124533322N00603497EA0000001471
+B1440144533332N00603505EA0000001468
+B1440164533341N00603513EA0000001465
+B1440184533350N00603522EA0000001463
+B1440204533357N00603533EA0000001463
+B1440224533363N00603545EA0000001462
+B1440244533370N00603558EA0000001460
+B1440264533379N00603571EA0000001457
+B1440294533388N00603583EA0000001455
+B1440314533397N00603596EA0000001452
+B1440334533406N00603609EA0000001451
+B1440354533415N00603624EA0000001449
+B1440374533423N00603639EA0000001447
+B1440394533432N00603653EA0000001446
+B1440414533440N00603667EA0000001445
+B1440434533448N00603682EA0000001443
+B1440454533457N00603696EA0000001441
+B1440474533466N00603710EA0000001439
+B1440494533476N00603725EA0000001437
+B1440514533486N00603740EA0000001435
+B1440534533496N00603754EA0000001434
+B1440554533507N00603767EA0000001434
+B1440574533519N00603780EA0000001434
+B1440594533530N00603792EA0000001435
+B1441014533541N00603803EA0000001437
+B1441034533552N00603814EA0000001440
+B1441054533561N00603824EA0000001445
+B1441074533569N00603832EA0000001451
+B1441094533578N00603840EA0000001457
+B1441114533586N00603843EA0000001463
+B1441134533590N00603842EA0000001469
+B1441154533594N00603840EA0000001474
+B1441174533595N00603831EA0000001479
+B1441194533593N00603824EA0000001481
+B1441214533585N00603818EA0000001481
+B1441234533572N00603827EA0000001483
+B1441254533565N00603836EA0000001489
+B1441274533562N00603837EA0000001494
+B1441294533558N00603830EA0000001499
+B1441314533561N00603822EA0000001503
+B1441334533568N00603817EA0000001507
+B1441354533579N00603819EA0000001509
+B1441374533591N00603834EA0000001512
+B1441394533593N00603854EA0000001514
+B1441414533579N00603870EA0000001517
+B1441434533568N00603873EA0000001521
+B1441454533563N00603862EA0000001530
+B1441474533568N00603854EA0000001534
+B1441494533578N00603858EA0000001539
+B1441514533583N00603873EA0000001542
+B1441534533577N00603893EA0000001546
+B1441554533567N00603903EA0000001549
+B1441574533557N00603900EA0000001551
+B1441594533552N00603894EA0000001557
+B1442014533550N00603888EA0000001560
+B1442034533550N00603878EA0000001564
+B1442064533559N00603873EA0000001567
+B1442084533570N00603886EA0000001570
+B1442104533573N00603907EA0000001572
+B1442124533562N00603922EA0000001573
+B1442144533548N00603925EA0000001576
+B1442164533542N00603919EA0000001581
+B1442184533541N00603913EA0000001587
+B1442204533543N00603908EA0000001591
+B1442224533547N00603905EA0000001593
+B1442244533558N00603912EA0000001595
+B1442264533566N00603932EA0000001596
+B1442284533564N00603954EA0000001597
+B1442304533559N00603962EA0000001599
+B1442324533545N00603969EA0000001600
+B1442344533539N00603965EA0000001604
+B1442364533536N00603959EA0000001606
+B1442384533539N00603954EA0000001608
+B1442404533549N00603960EA0000001610
+B1442424533560N00603972EA0000001611
+B1442444533570N00603980EA0000001612
+B1442464533579N00603981EA0000001613
+B1442484533588N00603982EA0000001614
+B1442504533597N00603982EA0000001616
+B1442524533605N00603981EA0000001617
+B1442544533612N00603977EA0000001617
+B1442564533620N00603976EA0000001617
+B1442584533627N00603975EA0000001618
+B1443004533635N00603973EA0000001618
+B1443024533643N00603971EA0000001620
+B1443044533650N00603970EA0000001621
+B1443064533656N00603969EA0000001622
+B1443084533663N00603965EA0000001622
+B1443104533672N00603962EA0000001621
+B1443124533679N00603959EA0000001620
+B1443144533686N00603954EA0000001618
+B1443164533695N00603949EA0000001616
+B1443184533705N00603946EA0000001615
+B1443204533717N00603942EA0000001614
+B1443224533727N00603939EA0000001612
+B1443244533736N00603935EA0000001610
+B1443264533745N00603932EA0000001608
+B1443284533756N00603927EA0000001606
+B1443304533768N00603922EA0000001605
+B1443324533776N00603917EA0000001605
+B1443344533783N00603910EA0000001605
+B1443364533793N00603901EA0000001603
+B1443384533805N00603892EA0000001602
+B1443404533815N00603886EA0000001602
+B1443424533822N00603879EA0000001602
+B1443454533831N00603871EA0000001602
+B1443474533840N00603866EA0000001604
+B1443494533851N00603863EA0000001605
+B1443514533861N00603860EA0000001608
+B1443534533869N00603858EA0000001612
+B1443554533875N00603856EA0000001617
+B1443574533881N00603856EA0000001623
+B1443594533886N00603856EA0000001628
+B1444014533889N00603852EA0000001633
+B1444034533890N00603843EA0000001636
+B1444054533886N00603836EA0000001639
+B1444074533879N00603834EA0000001642
+B1444094533871N00603840EA0000001645
+B1444114533863N00603854EA0000001646
+B1444134533862N00603872EA0000001648
+B1444154533868N00603885EA0000001650
+B1444174533879N00603891EA0000001652
+B1444194533886N00603890EA0000001656
+B1444214533892N00603887EA0000001659
+B1444234533898N00603884EA0000001660
+B1444254533902N00603879EA0000001661
+B1444274533900N00603872EA0000001660
+B1444294533894N00603866EA0000001659
+B1444314533884N00603872EA0000001657
+B1444334533876N00603890EA0000001656
+B1444354533876N00603910EA0000001655
+B1444374533884N00603922EA0000001655
+B1444394533892N00603920EA0000001655
+B1444414533897N00603913EA0000001655
+B1444434533905N00603910EA0000001657
+B1444454533913N00603910EA0000001659
+B1444474533921N00603912EA0000001660
+B1444494533931N00603917EA0000001661
+B1444514533942N00603925EA0000001664
+B1444534533951N00603935EA0000001667
+B1444554533960N00603945EA0000001671
+B1444574533967N00603952EA0000001677
+B1444594533974N00603957EA0000001687
+B1445014533980N00603952EA0000001692
+B1445034533980N00603943EA0000001698
+B1445054533973N00603934EA0000001703
+B1445074533965N00603932EA0000001710
+B1445094533956N00603938EA0000001716
+B1445114533949N00603951EA0000001723
+B1445134533946N00603967EA0000001730
+B1445154533949N00603978EA0000001735
+B1445174533956N00603986EA0000001742
+B1445194533962N00603991EA0000001747
+B1445214533969N00603991EA0000001753
+B1445244533974N00603987EA0000001758
+B1445264533974N00603980EA0000001762
+B1445284533972N00603973EA0000001767
+B1445304533965N00603967EA0000001773
+B1445324533954N00603970EA0000001779
+B1445344533946N00603982EA0000001786
+B1445364533943N00603999EA0000001794
+B1445384533945N00604015EA0000001800
+B1445404533950N00604029EA0000001806
+B1445424533956N00604039EA0000001812
+B1445444533963N00604039EA0000001817
+B1445464533966N00604035EA0000001821
+B1445484533966N00604029EA0000001825
+B1445504533963N00604019EA0000001829
+B1445524533958N00604014EA0000001834
+B1445544533951N00604014EA0000001841
+B1445564533941N00604021EA0000001848
+B1445584533931N00604035EA0000001854
+B1446004533926N00604054EA0000001860
+B1446024533925N00604073EA0000001867
+B1446044533929N00604088EA0000001874
+B1446064533936N00604097EA0000001879
+B1446084533942N00604098EA0000001884
+B1446104533944N00604091EA0000001889
+B1446124533943N00604084EA0000001894
+B1446144533938N00604078EA0000001900
+B1446164533930N00604076EA0000001906
+B1446184533921N00604079EA0000001912
+B1446204533910N00604087EA0000001917
+B1446224533901N00604104EA0000001922
+B1446244533895N00604125EA0000001927
+B1446264533894N00604146EA0000001932
+B1446284533898N00604163EA0000001936
+B1446304533906N00604170EA0000001939
+B1446324533912N00604169EA0000001943
+B1446344533915N00604169EA0000001946
+B1446364533920N00604164EA0000001950
+B1446384533918N00604157EA0000001954
+B1446404533915N00604150EA0000001958
+B1446424533911N00604146EA0000001964
+B1446444533906N00604142EA0000001969
+B1446464533898N00604141EA0000001974
+B1446484533888N00604145EA0000001980
+B1446504533876N00604154EA0000001986
+B1446524533867N00604176EA0000001991
+B1446544533864N00604198EA0000001997
+B1446564533866N00604215EA0000002003
+B1446584533870N00604226EA0000002006
+B1447014533875N00604233EA0000002009
+B1447034533880N00604235EA0000002012
+B1447054533884N00604235EA0000002014
+B1447074533889N00604232EA0000002015
+B1447094533896N00604228EA0000002017
+B1447114533899N00604222EA0000002021
+B1447134533898N00604215EA0000002026
+B1447154533896N00604212EA0000002032
+B1447174533891N00604209EA0000002036
+B1447194533883N00604206EA0000002042
+B1447214533873N00604207EA0000002049
+B1447234533867N00604214EA0000002056
+B1447254533853N00604240EA0000002061
+B1447274533846N00604259EA0000002067
+B1447294533844N00604278EA0000002072
+B1447314533851N00604293EA0000002077
+B1447334533858N00604300EA0000002081
+B1447354533865N00604304EA0000002084
+B1447374533871N00604305EA0000002086
+B1447394533875N00604301EA0000002089
+B1447414533878N00604295EA0000002093
+B1447434533879N00604287EA0000002096
+B1447454533875N00604278EA0000002097
+B1447474533866N00604271EA0000002100
+B1447494533854N00604272EA0000002104
+B1447514533845N00604281EA0000002107
+B1447534533836N00604295EA0000002108
+B1447554533827N00604310EA0000002112
+B1447574533822N00604327EA0000002115
+B1447594533827N00604342EA0000002118
+B1448014533833N00604351EA0000002121
+B1448034533839N00604356EA0000002122
+B1448054533847N00604358EA0000002125
+B1448074533854N00604358EA0000002128
+B1448094533859N00604355EA0000002132
+B1448114533861N00604348EA0000002137
+B1448134533860N00604337EA0000002140
+B1448154533850N00604324EA0000002145
+B1448174533842N00604320EA0000002148
+B1448194533831N00604318EA0000002149
+B1448214533815N00604334EA0000002147
+B1448234533806N00604357EA0000002149
+B1448254533803N00604375EA0000002152
+B1448274533801N00604390EA0000002154
+B1448294533802N00604405EA0000002155
+B1448314533811N00604409EA0000002156
+B1448334533818N00604408EA0000002159
+B1448354533822N00604405EA0000002163
+B1448374533824N00604400EA0000002167
+B1448404533825N00604392EA0000002170
+B1448424533824N00604381EA0000002172
+B1448444533821N00604369EA0000002174
+B1448464533815N00604362EA0000002175
+B1448484533807N00604356EA0000002176
+B1448504533796N00604352EA0000002175
+B1448524533784N00604351EA0000002174
+B1448544533770N00604350EA0000002171
+B1448564533755N00604350EA0000002169
+B1448584533739N00604352EA0000002168
+B1449004533723N00604350EA0000002168
+B1449024533709N00604348EA0000002167
+B1449044533694N00604348EA0000002168
+B1449064533680N00604349EA0000002169
+B1449084533666N00604351EA0000002171
+B1449104533654N00604359EA0000002172
+B1449124533644N00604373EA0000002173
+B1449144533639N00604387EA0000002173
+B1449164533639N00604400EA0000002172
+B1449184533644N00604411EA0000002170
+B1449204533649N00604418EA0000002166
+B1449224533657N00604418EA0000002161
+B1449244533664N00604410EA0000002157
+B1449264533669N00604403EA0000002156
+B1449284533669N00604393EA0000002153
+B1449304533667N00604379EA0000002151
+B1449324533663N00604365EA0000002150
+B1449344533654N00604354EA0000002152
+B1449364533642N00604347EA0000002152
+B1449384533629N00604341EA0000002154
+B1449404533615N00604343EA0000002155
+B1449424533604N00604352EA0000002155
+B1449444533596N00604365EA0000002156
+B1449464533594N00604380EA0000002156
+B1449484533594N00604395EA0000002156
+B1449504533592N00604409EA0000002154
+B1449524533588N00604425EA0000002151
+B1449544533588N00604443EA0000002147
+B1449564533586N00604470EA0000002143
+B1449584533583N00604485EA0000002141
+B1450004533582N00604498EA0000002137
+B1450024533580N00604513EA0000002133
+B1450044533577N00604528EA0000002131
+B1450064533576N00604541EA0000002128
+B1450084533575N00604554EA0000002125
+B1450104533573N00604568EA0000002123
+B1450124533572N00604580EA0000002121
+B1450144533570N00604593EA0000002119
+B1450164533569N00604607EA0000002118
+B1450184533568N00604619EA0000002117
+B1450214533568N00604631EA0000002115
+B1450234533567N00604643EA0000002113
+B1450254533566N00604657EA0000002111
+B1450274533566N00604669EA0000002110
+B1450294533564N00604681EA0000002109
+B1450314533563N00604696EA0000002107
+B1450334533563N00604710EA0000002107
+B1450354533562N00604723EA0000002106
+B1450374533561N00604736EA0000002105
+B1450394533561N00604749EA0000002103
+B1450414533562N00604763EA0000002103
+B1450434533564N00604775EA0000002102
+B1450454533566N00604786EA0000002100
+B1450474533568N00604799EA0000002100
+B1450494533570N00604812EA0000002100
+B1450514533571N00604824EA0000002098
+B1450534533572N00604837EA0000002095
+B1450554533573N00604851EA0000002093
+B1450574533574N00604865EA0000002092
+B1450594533576N00604876EA0000002090
+B1451014533577N00604889EA0000002087
+B1451034533577N00604903EA0000002085
+B1451054533575N00604918EA0000002083
+B1451074533573N00604933EA0000002081
+B1451094533573N00604948EA0000002079
+B1451114533573N00604963EA0000002078
+B1451134533572N00604978EA0000002076
+B1451154533572N00604993EA0000002074
+B1451174533573N00605007EA0000002072
+B1451194533573N00605021EA0000002069
+B1451214533574N00605034EA0000002066
+B1451234533575N00605048EA0000002062
+B1451254533576N00605062EA0000002058
+B1451274533578N00605074EA0000002054
+B1451294533581N00605086EA0000002048
+B1451314533585N00605101EA0000002043
+B1451334533595N00605124EA0000002035
+B1451354533601N00605137EA0000002032
+B1451374533607N00605151EA0000002028
+B1451394533612N00605166EA0000002025
+B1451414533618N00605181EA0000002023
+B1451434533624N00605193EA0000002022
+B1451454533628N00605206EA0000002019
+B1451474533634N00605219EA0000002016
+B1451494533639N00605232EA0000002015
+B1451514533644N00605245EA0000002013
+B1451534533649N00605258EA0000002010
+B1451554533656N00605272EA0000002007
+B1451584533662N00605284EA0000002006
+B1452004533670N00605297EA0000002004
+B1452024533678N00605308EA0000002002
+B1452044533687N00605319EA0000002000
+B1452064533695N00605330EA0000001998
+B1452084533702N00605341EA0000001996
+B1452104533711N00605352EA0000001994
+B1452124533719N00605361EA0000001993
+B1452144533727N00605369EA0000001991
+B1452164533735N00605378EA0000001988
+B1452184533744N00605387EA0000001986
+B1452204533752N00605397EA0000001984
+B1452224533759N00605409EA0000001981
+B1452244533768N00605419EA0000001978
+B1452264533777N00605429EA0000001975
+B1452284533786N00605441EA0000001972
+B1452304533794N00605450EA0000001969
+B1452324533803N00605459EA0000001965
+B1452344533812N00605467EA0000001962
+B1452364533821N00605476EA0000001961
+B1452384533830N00605482EA0000001959
+B1452404533839N00605490EA0000001958
+B1452424533846N00605499EA0000001957
+B1452444533855N00605506EA0000001954
+B1452464533864N00605513EA0000001952
+B1452484533873N00605523EA0000001950
+B1452504533883N00605529EA0000001949
+B1452524533895N00605531EA0000001947
+B1452544533906N00605536EA0000001946
+B1452564533917N00605543EA0000001945
+B1452584533926N00605551EA0000001945
+B1453004533934N00605561EA0000001944
+B1453024533942N00605572EA0000001944
+B1453044533951N00605580EA0000001943
+B1453064533959N00605589EA0000001942
+B1453084533967N00605598EA0000001939
+B1453104533976N00605606EA0000001936
+B1453124533985N00605616EA0000001931
+B1453144534000N00605631EA0000001924
+B1453164534010N00605639EA0000001920
+B1453184534019N00605648EA0000001918
+B1453204534028N00605656EA0000001916
+B1453224534038N00605663EA0000001913
+B1453244534048N00605671EA0000001910
+B1453264534058N00605681EA0000001908
+B1453284534068N00605691EA0000001906
+B1453304534078N00605701EA0000001903
+B1453324534088N00605711EA0000001901
+B1453344534099N00605720EA0000001900
+B1453364534109N00605729EA0000001899
+B1453394534119N00605737EA0000001896
+B1453414534130N00605747EA0000001893
+B1453434534141N00605756EA0000001891
+B1453454534151N00605764EA0000001890
+B1453474534160N00605772EA0000001888
+B1453494534171N00605782EA0000001885
+B1453514534181N00605790EA0000001883
+B1453534534190N00605796EA0000001881
+B1453554534200N00605805EA0000001878
+B1453574534211N00605815EA0000001874
+B1453594534223N00605822EA0000001870
+B1454014534234N00605830EA0000001865
+B1454034534244N00605839EA0000001860
+B1454054534255N00605846EA0000001855
+B1454074534264N00605855EA0000001850
+B1454094534273N00605865EA0000001845
+B1454114534283N00605876EA0000001840
+B1454134534293N00605888EA0000001836
+B1454154534303N00605899EA0000001832
+B1454174534314N00605910EA0000001828
+B1454194534326N00605920EA0000001823
+B1454214534339N00605929EA0000001819
+B1454234534350N00605937EA0000001817
+B1454254534360N00605945EA0000001814
+B1454274534372N00605954EA0000001810
+B1454294534384N00605964EA0000001805
+B1454314534396N00605975EA0000001802
+B1454334534407N00605985EA0000001798
+B1454354534419N00605994EA0000001795
+B1454374534432N00606002EA0000001791
+B1454394534444N00606009EA0000001788
+B1454414534456N00606016EA0000001786
+B1454434534470N00606024EA0000001783
+B1454454534483N00606034EA0000001781
+B1454474534495N00606043EA0000001780
+B1454494534507N00606052EA0000001780
+B1454514534520N00606062EA0000001779
+B1454534534536N00606077EA0000001781
+B1454554534545N00606084EA0000001782
+B1454574534555N00606093EA0000001783
+B1454594534565N00606101EA0000001784
+B1455014534576N00606107EA0000001785
+B1455034534586N00606113EA0000001791
+B1455054534596N00606121EA0000001793
+B1455074534606N00606129EA0000001796
+B1455094534616N00606135EA0000001799
+B1455114534625N00606137EA0000001803
+B1455134534632N00606141EA0000001806
+B1455154534640N00606144EA0000001809
+B1455184534647N00606147EA0000001813
+B1455204534655N00606150EA0000001817
+B1455224534664N00606153EA0000001821
+B1455244534673N00606158EA0000001827
+B1455264534679N00606161EA0000001832
+B1455284534686N00606163EA0000001837
+B1455304534695N00606167EA0000001842
+B1455324534702N00606172EA0000001849
+B1455344534709N00606179EA0000001855
+B1455364534716N00606185EA0000001861
+B1455384534723N00606185EA0000001865
+B1455404534730N00606180EA0000001868
+B1455424534733N00606171EA0000001871
+B1455444534732N00606159EA0000001873
+B1455464534727N00606148EA0000001876
+B1455484534718N00606141EA0000001879
+B1455504534707N00606139EA0000001881
+B1455524534697N00606144EA0000001883
+B1455544534691N00606156EA0000001885
+B1455564534689N00606170EA0000001889
+B1455584534690N00606184EA0000001895
+B1456004534691N00606197EA0000001902
+B1456024534696N00606208EA0000001908
+B1456044534703N00606216EA0000001914
+B1456064534710N00606220EA0000001919
+B1456084534719N00606219EA0000001922
+B1456104534726N00606211EA0000001925
+B1456124534725N00606193EA0000001928
+B1456154534714N00606182EA0000001932
+B1456174534704N00606185EA0000001934
+B1456194534695N00606187EA0000001935
+B1456214534685N00606191EA0000001936
+B1456234534674N00606199EA0000001938
+B1456254534662N00606205EA0000001942
+B1456274534652N00606211EA0000001948
+B1456294534647N00606215EA0000001956
+B1456314534635N00606230EA0000001964
+B1456334534630N00606242EA0000001971
+B1456354534628N00606257EA0000001978
+B1456374534628N00606273EA0000001986
+B1456394534635N00606285EA0000001993
+B1456414534645N00606292EA0000002002
+B1456434534656N00606287EA0000002009
+B1456454534660N00606273EA0000002016
+B1456474534655N00606259EA0000002022
+B1456494534642N00606257EA0000002029
+B1456514534632N00606264EA0000002037
+B1456534534624N00606274EA0000002045
+B1456554534620N00606288EA0000002054
+B1456574534618N00606302EA0000002063
+B1456594534620N00606314EA0000002072
+B1457014534625N00606326EA0000002080
+B1457034534631N00606335EA0000002087
+B1457054534639N00606341EA0000002094
+B1457074534648N00606343EA0000002102
+B1457094534655N00606335EA0000002110
+B1457114534655N00606324EA0000002117
+B1457134534650N00606312EA0000002123
+B1457154534641N00606302EA0000002130
+B1457174534632N00606299EA0000002136
+B1457194534622N00606300EA0000002142
+B1457214534606N00606309EA0000002153
+B1457234534598N00606319EA0000002162
+B1457254534593N00606330EA0000002172
+B1457274534589N00606345EA0000002181
+B1457294534590N00606364EA0000002190
+B1457314534600N00606373EA0000002200
+B1457334534609N00606373EA0000002211
+B1457354534614N00606365EA0000002220
+B1457374534614N00606352EA0000002228
+B1457394534611N00606343EA0000002235
+B1457414534603N00606333EA0000002242
+B1457434534592N00606328EA0000002251
+B1457464534581N00606328EA0000002261
+B1457484534569N00606328EA0000002272
+B1457504534560N00606334EA0000002282
+B1457524534553N00606346EA0000002291
+B1457544534549N00606360EA0000002299
+B1457564534547N00606374EA0000002306
+B1457584534552N00606388EA0000002313
+B1458004534561N00606396EA0000002323
+B1458024534570N00606397EA0000002334
+B1458044534576N00606397EA0000002344
+B1458064534582N00606392EA0000002353
+B1458084534584N00606383EA0000002359
+B1458104534584N00606377EA0000002366
+B1458124534572N00606363EA0000002372
+B1458144534559N00606362EA0000002380
+B1458164534546N00606364EA0000002390
+B1458184534536N00606366EA0000002400
+B1458204534528N00606369EA0000002407
+B1458224534518N00606378EA0000002415
+B1458244534513N00606395EA0000002424
+B1458264534516N00606407EA0000002435
+B1458284534519N00606418EA0000002446
+B1458304534524N00606427EA0000002456
+B1458324534530N00606433EA0000002466
+B1458344534536N00606434EA0000002474
+B1458364534543N00606431EA0000002482
+B1458384534548N00606423EA0000002489
+B1458404534549N00606412EA0000002496
+B1458424534546N00606399EA0000002502
+B1458444534536N00606389EA0000002508
+B1458464534523N00606384EA0000002516
+B1458484534507N00606387EA0000002524
+B1458504534496N00606400EA0000002534
+B1458524534488N00606413EA0000002544
+B1458544534483N00606426EA0000002553
+B1458564534482N00606440EA0000002561
+B1458584534484N00606452EA0000002570
+B1459004534497N00606454EA0000002583
+B1459024534504N00606450EA0000002593
+B1459044534508N00606443EA0000002601
+B1459064534511N00606431EA0000002607
+B1459084534508N00606415EA0000002614
+B1459104534497N00606406EA0000002620
+B1459124534482N00606409EA0000002627
+B1459144534472N00606424EA0000002634
+B1459164534469N00606439EA0000002641
+B1459184534469N00606452EA0000002649
+B1459204534470N00606465EA0000002656
+B1459224534473N00606480EA0000002664
+B1459254534474N00606494EA0000002671
+B1459274534474N00606505EA0000002678
+B1459294534476N00606518EA0000002682
+B1459314534477N00606536EA0000002686
+B1459334534479N00606553EA0000002692
+B1459354534480N00606566EA0000002698
+B1459374534482N00606580EA0000002702
+B1459394534484N00606598EA0000002707
+B1459414534484N00606614EA0000002714
+B1459434534484N00606629EA0000002718
+B1459454534485N00606646EA0000002721
+B1459474534488N00606664EA0000002727
+B1459494534489N00606683EA0000002734
+B1459514534490N00606700EA0000002740
+B1459534534492N00606717EA0000002746
+B1459554534494N00606732EA0000002752
+B1459574534497N00606746EA0000002758
+B1459594534499N00606757EA0000002763
+B1500014534502N00606771EA0000002766
+B1500034534505N00606787EA0000002768
+B1500054534507N00606801EA0000002767
+B1500074534510N00606821EA0000002764
+B1500094534513N00606841EA0000002764
+B1500114534515N00606854EA0000002763
+B1500134534519N00606865EA0000002760
+B1500154534524N00606878EA0000002754
+B1500174534527N00606894EA0000002750
+B1500194534529N00606909EA0000002748
+B1500214534532N00606922EA0000002744
+B1500234534535N00606936EA0000002739
+B1500254534539N00606953EA0000002734
+B1500274534544N00606969EA0000002732
+B1500294534550N00606985EA0000002728
+B1500314534555N00607001EA0000002725
+B1500334534562N00607017EA0000002724
+B1500354534568N00607029EA0000002723
+B1500374534575N00607043EA0000002720
+B1500394534585N00607067EA0000002719
+B1500414534591N00607080EA0000002720
+B1500434534599N00607089EA0000002718
+B1500454534611N00607094EA0000002717
+B1500474534624N00607095EA0000002716
+B1500494534636N00607094EA0000002714
+B1500514534650N00607092EA0000002712
+B1500534534663N00607089EA0000002712
+B1500554534676N00607083EA0000002711
+B1500574534687N00607076EA0000002708
+B1500594534700N00607068EA0000002706
+B1501014534714N00607061EA0000002704
+B1501044534727N00607052EA0000002701
+B1501064534743N00607044EA0000002697
+B1501084534759N00607037EA0000002696
+B1501104534774N00607030EA0000002695
+B1501124534788N00607023EA0000002692
+B1501144534804N00607017EA0000002688
+B1501164534819N00607011EA0000002686
+B1501184534833N00607004EA0000002685
+B1501204534848N00606998EA0000002682
+B1501224534864N00606994EA0000002680
+B1501244534878N00606988EA0000002678
+B1501264534892N00606980EA0000002676
+B1501284534907N00606973EA0000002673
+B1501304534921N00606967EA0000002670
+B1501324534935N00606959EA0000002668
+B1501344534949N00606951EA0000002664
+B1501364534963N00606944EA0000002661
+B1501384534977N00606934EA0000002658
+B1501404534990N00606925EA0000002655
+B1501424535003N00606917EA0000002653
+B1501444535017N00606908EA0000002649
+B1501464535034N00606900EA0000002644
+B1501484535050N00606894EA0000002641
+B1501504535063N00606888EA0000002640
+B1501524535075N00606882EA0000002637
+B1501544535088N00606874EA0000002633
+B1501564535100N00606866EA0000002628
+B1501584535112N00606859EA0000002623
+B1502004535126N00606855EA0000002617
+B1502024535140N00606853EA0000002613
+B1502044535152N00606849EA0000002610
+B1502064535164N00606843EA0000002608
+B1502084535178N00606840EA0000002605
+B1502104535191N00606835EA0000002603
+B1502124535202N00606828EA0000002600
+B1502144535215N00606823EA0000002595
+B1502164535229N00606815EA0000002591
+B1502184535241N00606806EA0000002588
+B1502204535258N00606792EA0000002584
+B1502224535270N00606778EA0000002582
+B1502244535281N00606767EA0000002582
+B1502264535291N00606757EA0000002583
+B1502284535301N00606747EA0000002582
+B1502304535312N00606737EA0000002583
+B1502324535323N00606730EA0000002583
+B1502344535333N00606724EA0000002582
+B1502364535344N00606715EA0000002579
+B1502384535357N00606706EA0000002577
+B1502404535367N00606697EA0000002576
+B1502424535377N00606686EA0000002574
+B1502454535388N00606675EA0000002572
+B1502474535399N00606665EA0000002571
+B1502494535410N00606655EA0000002569
+B1502514535420N00606646EA0000002567
+B1502534535432N00606637EA0000002563
+B1502554535445N00606629EA0000002560
+B1502574535457N00606621EA0000002558
+B1502594535468N00606611EA0000002557
+B1503014535480N00606602EA0000002554
+B1503034535493N00606593EA0000002550
+B1503054535505N00606582EA0000002547
+B1503074535517N00606573EA0000002545
+B1503094535530N00606563EA0000002541
+B1503114535542N00606553EA0000002538
+B1503134535554N00606544EA0000002535
+B1503154535566N00606536EA0000002531
+B1503174535578N00606529EA0000002527
+B1503194535591N00606521EA0000002523
+B1503214535604N00606515EA0000002519
+B1503234535617N00606507EA0000002516
+B1503254535629N00606499EA0000002512
+B1503274535641N00606492EA0000002509
+B1503294535653N00606486EA0000002504
+B1503314535666N00606478EA0000002499
+B1503334535679N00606472EA0000002496
+B1503354535691N00606467EA0000002492
+B1503374535704N00606458EA0000002488
+B1503394535718N00606450EA0000002486
+B1503414535731N00606442EA0000002485
+B1503434535742N00606434EA0000002482
+B1503454535755N00606423EA0000002478
+B1503474535768N00606413EA0000002476
+B1503494535781N00606405EA0000002474
+B1503514535794N00606397EA0000002470
+B1503534535806N00606390EA0000002467
+B1503554535819N00606384EA0000002464
+B1503574535832N00606377EA0000002460
+B1503594535847N00606373EA0000002458
+B1504014535868N00606366EA0000002458
+B1504034535880N00606359EA0000002459
+B1504054535892N00606353EA0000002461
+B1504074535904N00606345EA0000002463
+B1504094535916N00606337EA0000002466
+B1504114535929N00606333EA0000002467
+B1504134535942N00606328EA0000002468
+B1504154535954N00606322EA0000002468
+B1504174535967N00606316EA0000002469
+B1504194535980N00606311EA0000002470
+B1504214535994N00606305EA0000002470
+B1504234536008N00606301EA0000002470
+B1504264536022N00606297EA0000002471
+B1504284536034N00606292EA0000002472
+B1504304536046N00606288EA0000002470
+B1504324536059N00606284EA0000002467
+B1504344536070N00606277EA0000002463
+B1504364536081N00606270EA0000002457
+B1504384536093N00606262EA0000002451
+B1504404536104N00606251EA0000002446
+B1504424536116N00606240EA0000002442
+B1504444536128N00606232EA0000002438
+B1504464536140N00606223EA0000002435
+B1504484536152N00606214EA0000002433
+B1504504536164N00606206EA0000002430
+B1504524536176N00606200EA0000002427
+B1504544536188N00606193EA0000002423
+B1504564536200N00606188EA0000002421
+B1504584536212N00606183EA0000002418
+B1505004536224N00606177EA0000002414
+B1505024536237N00606173EA0000002410
+B1505044536251N00606170EA0000002406
+B1505064536263N00606168EA0000002403
+B1505084536274N00606164EA0000002401
+B1505104536284N00606158EA0000002398
+B1505124536295N00606153EA0000002395
+B1505144536305N00606149EA0000002391
+B1505164536315N00606143EA0000002386
+B1505184536326N00606137EA0000002381
+B1505204536336N00606131EA0000002376
+B1505224536347N00606123EA0000002372
+B1505244536357N00606117EA0000002369
+B1505264536368N00606110EA0000002366
+B1505284536381N00606103EA0000002363
+B1505304536394N00606101EA0000002361
+B1505324536403N00606099EA0000002360
+B1505344536412N00606094EA0000002359
+B1505364536425N00606091EA0000002357
+B1505384536438N00606089EA0000002357
+B1505404536453N00606085EA0000002359
+B1505424536464N00606081EA0000002359
+B1505444536475N00606077EA0000002360
+B1505464536484N00606073EA0000002366
+B1505484536495N00606073EA0000002366
+B1505504536506N00606071EA0000002366
+B1505524536518N00606069EA0000002366
+B1505544536528N00606068EA0000002367
+B1505564536539N00606066EA0000002366
+B1505584536550N00606065EA0000002366
+B1506004536562N00606064EA0000002366
+B1506024536573N00606062EA0000002366
+B1506054536585N00606062EA0000002367
+B1506074536597N00606064EA0000002369
+B1506094536608N00606065EA0000002369
+B1506114536619N00606065EA0000002369
+B1506134536631N00606063EA0000002369
+B1506154536642N00606062EA0000002371
+B1506174536652N00606062EA0000002371
+B1506194536663N00606061EA0000002371
+B1506214536675N00606059EA0000002371
+B1506234536686N00606059EA0000002371
+B1506254536697N00606059EA0000002370
+B1506274536708N00606058EA0000002368
+B1506294536719N00606056EA0000002367
+B1506314536730N00606055EA0000002368
+B1506334536741N00606053EA0000002369
+B1506354536752N00606051EA0000002371
+B1506374536763N00606052EA0000002373
+B1506394536775N00606055EA0000002377
+B1506414536784N00606058EA0000002381
+B1506434536791N00606059EA0000002387
+B1506454536798N00606058EA0000002392
+B1506474536804N00606055EA0000002397
+B1506494536811N00606053EA0000002404
+B1506514536818N00606051EA0000002411
+B1506534536824N00606050EA0000002418
+B1506554536831N00606048EA0000002423
+B1506574536840N00606047EA0000002428
+B1506594536847N00606051EA0000002434
+B1507014536851N00606060EA0000002439
+B1507034536852N00606075EA0000002443
+B1507054536847N00606092EA0000002447
+B1507074536832N00606103EA0000002451
+B1507094536818N00606098EA0000002455
+B1507114536812N00606085EA0000002459
+B1507134536817N00606074EA0000002464
+B1507154536825N00606073EA0000002470
+B1507174536834N00606077EA0000002479
+B1507194536841N00606083EA0000002488
+B1507214536854N00606089EA0000002496
+B1507234536864N00606092EA0000002503
+B1507254536872N00606095EA0000002508
+B1507274536882N00606098EA0000002513
+B1507294536892N00606101EA0000002518
+B1507314536901N00606104EA0000002525
+B1507334536908N00606106EA0000002532
+B1507354536915N00606107EA0000002538
+B1507374536925N00606106EA0000002545
+B1507394536933N00606104EA0000002553
+B1507414536939N00606104EA0000002558
+B1507444536949N00606102EA0000002561
+B1507464536962N00606104EA0000002563
+B1507484536975N00606106EA0000002567
+B1507504536985N00606104EA0000002572
+B1507524536995N00606101EA0000002578
+B1507544537003N00606103EA0000002586
+B1507564537008N00606104EA0000002592
+B1507584537015N00606102EA0000002598
+B1508004537022N00606104EA0000002602
+B1508024537028N00606106EA0000002606
+B1508044537036N00606105EA0000002608
+B1508064537044N00606104EA0000002610
+B1508084537052N00606104EA0000002613
+B1508104537061N00606102EA0000002616
+B1508124537069N00606100EA0000002621
+B1508144537076N00606097EA0000002627
+B1508164537085N00606094EA0000002633
+B1508184537093N00606091EA0000002639
+B1508204537098N00606083EA0000002646
+B1508224537103N00606071EA0000002651
+B1508244537112N00606062EA0000002657
+B1508264537120N00606054EA0000002663
+B1508284537125N00606043EA0000002667
+B1508304537131N00606033EA0000002670
+B1508324537141N00606026EA0000002671
+B1508344537149N00606017EA0000002671
+B1508364537158N00606006EA0000002670
+B1508384537172N00605997EA0000002668
+B1508404537185N00605991EA0000002669
+B1508424537196N00605987EA0000002670
+B1508444537207N00605981EA0000002670
+B1508464537220N00605976EA0000002668
+B1508484537233N00605975EA0000002665
+B1508504537246N00605975EA0000002662
+B1508524537259N00605975EA0000002659
+B1508544537272N00605976EA0000002657
+B1508564537285N00605980EA0000002654
+B1508584537307N00605980EA0000002647
+B1509004537321N00605977EA0000002644
+B1509024537335N00605977EA0000002641
+B1509044537350N00605978EA0000002637
+B1509064537365N00605979EA0000002635
+B1509084537378N00605981EA0000002633
+B1509104537391N00605984EA0000002631
+B1509124537404N00605986EA0000002628
+B1509144537418N00605991EA0000002626
+B1509164537431N00605996EA0000002623
+B1509184537445N00606000EA0000002621
+B1509204537459N00606004EA0000002618
+B1509234537472N00606009EA0000002616
+B1509254537485N00606014EA0000002615
+B1509274537498N00606020EA0000002615
+B1509294537511N00606027EA0000002616
+B1509314537524N00606034EA0000002616
+B1509334537536N00606038EA0000002615
+B1509354537549N00606039EA0000002613
+B1509374537562N00606043EA0000002610
+B1509394537576N00606048EA0000002607
+B1509414537589N00606050EA0000002605
+B1509434537601N00606054EA0000002603
+B1509454537613N00606059EA0000002600
+B1509474537626N00606062EA0000002597
+B1509494537639N00606067EA0000002594
+B1509514537652N00606071EA0000002591
+B1509534537665N00606074EA0000002589
+B1509554537677N00606078EA0000002587
+B1509574537689N00606082EA0000002584
+B1509594537702N00606087EA0000002580
+B1510014537715N00606094EA0000002576
+B1510034537728N00606100EA0000002573
+B1510054537740N00606105EA0000002569
+B1510074537753N00606112EA0000002564
+B1510094537767N00606121EA0000002559
+B1510114537779N00606128EA0000002554
+B1510134537793N00606136EA0000002549
+B1510154537806N00606143EA0000002544
+B1510174537820N00606149EA0000002540
+B1510194537831N00606155EA0000002537
+B1510214537842N00606163EA0000002534
+B1510234537854N00606169EA0000002530
+B1510254537865N00606175EA0000002527
+B1510274537875N00606183EA0000002523
+B1510294537886N00606192EA0000002517
+B1510314537897N00606201EA0000002511
+B1510334537910N00606211EA0000002505
+B1510354537921N00606221EA0000002499
+B1510374537939N00606232EA0000002491
+B1510394537951N00606241EA0000002485
+B1510414537964N00606249EA0000002480
+B1510434537975N00606255EA0000002475
+B1510454537986N00606265EA0000002469
+B1510474537999N00606276EA0000002463
+B1510494538012N00606285EA0000002458
+B1510514538023N00606294EA0000002455
+B1510534538033N00606305EA0000002450
+B1510554538045N00606315EA0000002446
+B1510574538056N00606327EA0000002443
+B1510594538066N00606338EA0000002440
+B1511014538077N00606351EA0000002438
+B1511044538087N00606364EA0000002435
+B1511064538098N00606377EA0000002434
+B1511084538108N00606389EA0000002433
+B1511104538119N00606400EA0000002431
+B1511124538129N00606414EA0000002429
+B1511144538138N00606428EA0000002428
+B1511164538148N00606440EA0000002426
+B1511184538158N00606453EA0000002425
+B1511204538169N00606465EA0000002424
+B1511224538180N00606477EA0000002423
+B1511244538190N00606489EA0000002422
+B1511264538201N00606502EA0000002421
+B1511284538212N00606516EA0000002419
+B1511304538223N00606531EA0000002417
+B1511324538233N00606545EA0000002417
+B1511344538243N00606556EA0000002416
+B1511364538253N00606567EA0000002415
+B1511384538263N00606580EA0000002414
+B1511404538273N00606593EA0000002414
+B1511424538280N00606604EA0000002414
+B1511444538288N00606614EA0000002413
+B1511464538298N00606623EA0000002412
+B1511484538307N00606632EA0000002411
+B1511504538314N00606643EA0000002412
+B1511524538322N00606652EA0000002414
+B1511544538331N00606661EA0000002417
+B1511564538339N00606670EA0000002421
+B1511584538347N00606677EA0000002423
+B1512004538357N00606684EA0000002425
+B1512024538367N00606692EA0000002426
+B1512044538377N00606701EA0000002426
+B1512064538387N00606710EA0000002426
+B1512084538397N00606719EA0000002426
+B1512104538407N00606728EA0000002425
+B1512124538418N00606736EA0000002423
+B1512144538428N00606743EA0000002423
+B1512164538439N00606748EA0000002421
+B1512184538457N00606757EA0000002418
+B1512204538468N00606764EA0000002417
+B1512224538481N00606770EA0000002418
+B1512244538494N00606775EA0000002420
+B1512264538506N00606780EA0000002421
+B1512284538518N00606785EA0000002422
+B1512304538528N00606788EA0000002422
+B1512324538541N00606795EA0000002419
+B1512344538554N00606805EA0000002418
+B1512364538563N00606812EA0000002416
+B1512384538573N00606816EA0000002412
+B1512404538584N00606821EA0000002408
+B1512424538597N00606824EA0000002406
+B1512454538608N00606827EA0000002402
+B1512474538619N00606832EA0000002398
+B1512494538631N00606838EA0000002394
+B1512514538644N00606844EA0000002392
+B1512534538655N00606852EA0000002391
+B1512554538668N00606857EA0000002390
+B1512574538680N00606863EA0000002390
+B1512594538691N00606870EA0000002390
+B1513014538703N00606876EA0000002388
+B1513034538715N00606882EA0000002387
+B1513054538728N00606891EA0000002388
+B1513074538739N00606899EA0000002389
+B1513094538751N00606906EA0000002389
+B1513114538762N00606913EA0000002389
+B1513134538772N00606923EA0000002390
+B1513154538778N00606927EA0000002393
+B1513174538784N00606931EA0000002393
+B1513194538792N00606939EA0000002395
+B1513214538799N00606941EA0000002399
+B1513234538805N00606941EA0000002400
+B1513254538814N00606942EA0000002402
+B1513274538823N00606943EA0000002406
+B1513294538831N00606943EA0000002411
+B1513314538837N00606943EA0000002416
+B1513334538844N00606944EA0000002419
+B1513354538852N00606948EA0000002422
+B1513374538860N00606951EA0000002426
+B1513394538867N00606951EA0000002430
+B1513414538872N00606952EA0000002433
+B1513434538878N00606955EA0000002434
+B1513454538885N00606959EA0000002435
+B1513474538892N00606961EA0000002437
+B1513494538898N00606963EA0000002438
+B1513514538904N00606963EA0000002438
+B1513534538910N00606965EA0000002436
+B1513554538918N00606970EA0000002434
+B1513574538927N00606976EA0000002432
+B1513594538941N00606984EA0000002430
+B1514014538950N00606991EA0000002428
+B1514034538960N00606998EA0000002424
+B1514054538971N00607005EA0000002421
+B1514074538982N00607012EA0000002420
+B1514094538993N00607019EA0000002418
+B1514114539004N00607026EA0000002414
+B1514134539015N00607033EA0000002410
+B1514154539027N00607042EA0000002407
+B1514174539038N00607052EA0000002406
+B1514194539047N00607063EA0000002404
+B1514214539057N00607073EA0000002403
+B1514244539066N00607082EA0000002401
+B1514264539076N00607092EA0000002399
+B1514284539086N00607102EA0000002397
+B1514304539097N00607111EA0000002396
+B1514324539109N00607118EA0000002396
+B1514344539119N00607124EA0000002398
+B1514364539130N00607131EA0000002398
+B1514384539141N00607138EA0000002399
+B1514404539151N00607144EA0000002400
+B1514424539161N00607148EA0000002399
+B1514444539170N00607155EA0000002400
+B1514464539176N00607164EA0000002400
+B1514484539179N00607167EA0000002399
+B1514504539191N00607175EA0000002396
+B1514524539201N00607185EA0000002396
+B1514544539211N00607193EA0000002398
+B1514564539221N00607201EA0000002400
+B1514584539229N00607211EA0000002403
+B1515004539234N00607219EA0000002406
+B1515024539240N00607226EA0000002409
+B1515044539247N00607234EA0000002413
+B1515064539254N00607238EA0000002419
+B1515084539259N00607240EA0000002425
+B1515104539265N00607243EA0000002430
+B1515124539271N00607247EA0000002435
+B1515144539278N00607253EA0000002438
+B1515164539285N00607260EA0000002441
+B1515184539292N00607266EA0000002443
+B1515204539297N00607269EA0000002443
+B1515224539305N00607276EA0000002442
+B1515244539314N00607286EA0000002441
+B1515264539322N00607293EA0000002439
+B1515284539332N00607300EA0000002436
+B1515304539343N00607309EA0000002432
+B1515324539355N00607317EA0000002430
+B1515344539366N00607326EA0000002428
+B1515364539377N00607337EA0000002426
+B1515384539389N00607346EA0000002424
+B1515404539405N00607359EA0000002418
+B1515424539416N00607368EA0000002414
+B1515444539426N00607376EA0000002409
+B1515464539437N00607384EA0000002404
+B1515484539447N00607390EA0000002400
+B1515504539458N00607396EA0000002396
+B1515524539468N00607402EA0000002392
+B1515544539479N00607407EA0000002387
+B1515564539490N00607411EA0000002381
+B1515584539502N00607416EA0000002376
+B1516004539513N00607422EA0000002371
+B1516024539524N00607428EA0000002366
+B1516054539537N00607434EA0000002362
+B1516074539549N00607439EA0000002357
+B1516094539561N00607443EA0000002352
+B1516114539574N00607448EA0000002347
+B1516134539587N00607453EA0000002343
+B1516154539599N00607459EA0000002339
+B1516174539611N00607465EA0000002335
+B1516194539624N00607471EA0000002331
+B1516214539636N00607477EA0000002326
+B1516234539649N00607482EA0000002323
+B1516254539661N00607489EA0000002319
+B1516274539673N00607495EA0000002315
+B1516294539679N00607498EA0000002310
+B1516314539699N00607509EA0000002303
+B1516334539715N00607518EA0000002298
+B1516354539731N00607526EA0000002293
+B1516374539745N00607533EA0000002289
+B1516394539760N00607541EA0000002283
+B1516414539775N00607548EA0000002277
+B1516434539791N00607554EA0000002273
+B1516454539805N00607562EA0000002268
+B1516474539819N00607569EA0000002262
+B1516494539835N00607576EA0000002256
+B1516514539851N00607584EA0000002250
+B1516534539865N00607593EA0000002246
+B1516554539879N00607602EA0000002242
+B1516574539893N00607610EA0000002237
+B1516594539908N00607618EA0000002233
+B1517014539921N00607628EA0000002228
+B1517034539935N00607636EA0000002224
+B1517054539949N00607645EA0000002220
+B1517074539962N00607655EA0000002217
+B1517094539975N00607665EA0000002213
+B1517114539989N00607676EA0000002208
+B1517134540002N00607686EA0000002204
+B1517154540016N00607696EA0000002199
+B1517174540029N00607706EA0000002195
+B1517194540043N00607715EA0000002190
+B1517214540063N00607729EA0000002184
+B1517234540077N00607739EA0000002179
+B1517254540090N00607749EA0000002174
+B1517274540104N00607758EA0000002170
+B1517294540118N00607767EA0000002165
+B1517314540131N00607778EA0000002160
+B1517334540145N00607788EA0000002155
+B1517354540158N00607798EA0000002150
+B1517374540172N00607809EA0000002145
+B1517394540185N00607819EA0000002140
+B1517414540199N00607829EA0000002136
+B1517434540212N00607838EA0000002132
+B1517464540225N00607848EA0000002128
+B1517484540238N00607858EA0000002123
+B1517504540252N00607868EA0000002119
+B1517524540265N00607877EA0000002115
+B1517544540278N00607887EA0000002112
+B1517564540290N00607897EA0000002108
+B1517584540303N00607906EA0000002103
+B1518004540315N00607916EA0000002099
+B1518024540327N00607927EA0000002094
+B1518044540340N00607939EA0000002089
+B1518064540351N00607950EA0000002084
+B1518084540364N00607962EA0000002079
+B1518104540375N00607977EA0000002075
+B1518124540385N00607993EA0000002071
+B1518144540394N00608010EA0000002067
+B1518164540404N00608027EA0000002062
+B1518184540415N00608043EA0000002058
+B1518204540426N00608058EA0000002053
+B1518224540437N00608073EA0000002047
+B1518244540448N00608087EA0000002042
+B1518264540460N00608102EA0000002037
+B1518284540472N00608117EA0000002032
+B1518304540484N00608132EA0000002027
+B1518324540495N00608147EA0000002021
+B1518344540507N00608163EA0000002016
+B1518364540517N00608181EA0000002011
+B1518384540528N00608198EA0000002006
+B1518404540539N00608216EA0000002001
+B1518424540550N00608232EA0000001996
+B1518444540562N00608248EA0000001991
+B1518464540574N00608263EA0000001985
+B1518484540585N00608278EA0000001980
+B1518504540597N00608293EA0000001975
+B1518524540608N00608308EA0000001970
+B1518544540620N00608323EA0000001964
+B1518564540632N00608338EA0000001958
+B1518584540643N00608354EA0000001952
+B1519004540661N00608378EA0000001946
+B1519024540672N00608394EA0000001942
+B1519044540684N00608410EA0000001938
+B1519064540695N00608426EA0000001934
+B1519084540706N00608441EA0000001930
+B1519104540717N00608457EA0000001926
+B1519124540729N00608473EA0000001922
+B1519144540740N00608488EA0000001918
+B1519164540751N00608503EA0000001915
+B1519184540762N00608517EA0000001912
+B1519204540773N00608531EA0000001909
+B1519224540785N00608544EA0000001906
+B1519244540796N00608558EA0000001902
+B1519274540807N00608572EA0000001899
+B1519294540817N00608586EA0000001895
+B1519314540828N00608600EA0000001892
+B1519334540839N00608614EA0000001888
+B1519354540848N00608630EA0000001884
+B1519374540858N00608645EA0000001879
+B1519394540869N00608658EA0000001874
+B1519414540879N00608672EA0000001869
+B1519434540890N00608685EA0000001864
+B1519454540901N00608697EA0000001860
+B1519474540911N00608709EA0000001855
+B1519494540922N00608722EA0000001850
+B1519514540933N00608735EA0000001845
+B1519534540944N00608750EA0000001841
+B1519554540954N00608763EA0000001838
+B1519574540962N00608774EA0000001835
+B1519594540972N00608785EA0000001831
+B1520014540982N00608798EA0000001827
+B1520034540993N00608811EA0000001822
+B1520054541002N00608824EA0000001819
+B1520074541012N00608836EA0000001816
+B1520094541022N00608847EA0000001813
+B1520114541033N00608859EA0000001810
+B1520134541043N00608872EA0000001808
+B1520154541052N00608886EA0000001806
+B1520174541062N00608898EA0000001802
+B1520194541071N00608909EA0000001798
+B1520214541079N00608921EA0000001793
+B1520234541089N00608933EA0000001787
+B1520254541099N00608946EA0000001782
+B1520274541110N00608958EA0000001777
+B1520294541122N00608970EA0000001772
+B1520314541133N00608983EA0000001767
+B1520334541145N00608994EA0000001764
+B1520354541155N00609004EA0000001759
+B1520374541165N00609015EA0000001753
+B1520394541175N00609025EA0000001746
+B1520414541192N00609040EA0000001739
+B1520434541203N00609052EA0000001734
+B1520454541213N00609064EA0000001729
+B1520474541225N00609076EA0000001725
+B1520494541236N00609088EA0000001721
+B1520514541247N00609100EA0000001718
+B1520534541258N00609111EA0000001717
+B1520554541269N00609122EA0000001716
+B1520574541276N00609134EA0000001717
+B1520594541281N00609143EA0000001715
+B1521014541289N00609157EA0000001712
+B1521034541297N00609170EA0000001713
+B1521064541305N00609177EA0000001712
+B1521084541314N00609187EA0000001710
+B1521104541323N00609199EA0000001709
+B1521124541333N00609208EA0000001708
+B1521144541342N00609215EA0000001708
+B1521164541351N00609224EA0000001706
+B1521184541362N00609233EA0000001704
+B1521204541373N00609239EA0000001704
+B1521224541383N00609246EA0000001704
+B1521244541394N00609253EA0000001702
+B1521264541405N00609259EA0000001701
+B1521284541414N00609265EA0000001701
+B1521304541423N00609272EA0000001700
+B1521324541437N00609285EA0000001700
+B1521344541447N00609290EA0000001699
+B1521364541456N00609293EA0000001699
+B1521384541464N00609299EA0000001698
+B1521404541473N00609304EA0000001696
+B1521424541483N00609308EA0000001693
+B1521444541492N00609315EA0000001690
+B1521464541500N00609322EA0000001686
+B1521484541509N00609327EA0000001681
+B1521504541519N00609332EA0000001677
+B1521524541527N00609337EA0000001673
+B1521544541537N00609342EA0000001669
+B1521574541548N00609349EA0000001666
+B1521594541558N00609357EA0000001663
+B1522014541569N00609362EA0000001662
+B1522034541579N00609369EA0000001662
+B1522054541591N00609375EA0000001662
+B1522074541602N00609381EA0000001662
+B1522094541613N00609388EA0000001663
+B1522114541624N00609394EA0000001663
+B1522134541636N00609401EA0000001663
+B1522154541649N00609408EA0000001664
+B1522174541660N00609414EA0000001666
+B1522194541672N00609421EA0000001668
+B1522214541678N00609424EA0000001670
+B1522234541695N00609434EA0000001673
+B1522254541704N00609439EA0000001677
+B1522274541712N00609444EA0000001682
+B1522294541718N00609449EA0000001688
+B1522314541726N00609453EA0000001695
+B1522334541732N00609458EA0000001703
+B1522354541735N00609460EA0000001712
+B1522374541738N00609460EA0000001720
+B1522394541743N00609459EA0000001727
+B1522414541747N00609459EA0000001736
+B1522434541750N00609458EA0000001744
+B1522454541754N00609458EA0000001751
+B1522474541758N00609457EA0000001757
+B1522494541760N00609451EA0000001764
+B1522514541759N00609442EA0000001769
+B1522534541758N00609436EA0000001774
+B1522554541755N00609427EA0000001777
+B1522574541750N00609416EA0000001780
+B1522594541747N00609404EA0000001781
+B1523014541750N00609403EA0000001782
+B1523034541752N00609413EA0000001783
+B1523054541755N00609423EA0000001786
+B1523074541756N00609429EA0000001790
+B1523094541760N00609432EA0000001792
+B1523114541765N00609437EA0000001795
+B1523134541766N00609445EA0000001800
+B1523154541766N00609450EA0000001803
+B1523174541771N00609453EA0000001806
+B1523194541772N00609454EA0000001810
+B1523214541771N00609454EA0000001813
+B1523234541776N00609455EA0000001816
+B1523254541780N00609459EA0000001820
+B1523274541781N00609463EA0000001826
+B1523294541784N00609465EA0000001831
+B1523314541789N00609468EA0000001836
+B1523334541792N00609472EA0000001840
+B1523354541796N00609475EA0000001842
+B1523384541803N00609474EA0000001846
+B1523404541808N00609473EA0000001850
+B1523424541810N00609472EA0000001854
+B1523444541813N00609467EA0000001858
+B1523464541815N00609461EA0000001863
+B1523484541815N00609456EA0000001867
+B1523504541818N00609452EA0000001870
+B1523524541821N00609448EA0000001873
+B1523544541825N00609446EA0000001877
+B1523564541828N00609445EA0000001880
+B1523584541832N00609441EA0000001885
+B1524004541837N00609439EA0000001889
+B1524024541839N00609439EA0000001893
+B1524044541846N00609438EA0000001895
+B1524064541851N00609439EA0000001896
+B1524084541857N00609440EA0000001897
+B1524104541864N00609441EA0000001899
+B1524124541871N00609440EA0000001902
+B1524144541876N00609439EA0000001906
+B1524164541881N00609438EA0000001910
+B1524184541886N00609439EA0000001913
+B1524204541890N00609441EA0000001917
+B1524224541893N00609441EA0000001921
+B1524244541896N00609442EA0000001925
+B1524264541899N00609441EA0000001929
+B1524284541901N00609442EA0000001934
+B1524304541902N00609443EA0000001937
+B1524324541904N00609446EA0000001939
+B1524344541908N00609449EA0000001942
+B1524364541911N00609452EA0000001945
+B1524384541914N00609454EA0000001947
+B1524404541918N00609459EA0000001948
+B1524424541921N00609461EA0000001950
+B1524444541924N00609462EA0000001950
+B1524464541928N00609465EA0000001950
+B1524484541933N00609467EA0000001952
+B1524504541938N00609468EA0000001952
+B1524524541944N00609469EA0000001952
+B1524544541955N00609471EA0000001951
+B1524564541962N00609472EA0000001952
+B1524584541965N00609468EA0000001952
+B1525004541965N00609458EA0000001951
+B1525024541961N00609444EA0000001951
+B1525044541947N00609435EA0000001951
+B1525064541930N00609434EA0000001951
+B1525084541915N00609438EA0000001952
+B1525104541900N00609443EA0000001954
+B1525124541887N00609448EA0000001956
+B1525144541875N00609452EA0000001957
+B1525174541863N00609455EA0000001956
+B1525194541849N00609458EA0000001957
+B1525214541836N00609462EA0000001958
+B1525234541822N00609464EA0000001959
+B1525254541808N00609466EA0000001961
+B1525274541794N00609466EA0000001962
+B1525294541780N00609466EA0000001962
+B1525314541766N00609467EA0000001961
+B1525334541753N00609466EA0000001961
+B1525354541739N00609464EA0000001959
+B1525374541725N00609470EA0000001956
+B1525394541714N00609485EA0000001954
+B1525414541713N00609496EA0000001954
+B1525434541718N00609497EA0000001955
+B1525454541723N00609497EA0000001957
+B1525474541727N00609495EA0000001957
+B1525494541730N00609494EA0000001956
+B1525514541736N00609492EA0000001957
+B1525534541741N00609488EA0000001959
+B1525554541743N00609485EA0000001962
+B1525574541746N00609481EA0000001965
+B1525594541750N00609478EA0000001968
+B1526014541753N00609477EA0000001970
+B1526034541757N00609477EA0000001972
+B1526054541762N00609477EA0000001972
+B1526074541765N00609475EA0000001972
+B1526094541769N00609476EA0000001972
+B1526114541774N00609477EA0000001971
+B1526134541779N00609480EA0000001972
+B1526154541785N00609482EA0000001974
+B1526174541791N00609483EA0000001977
+B1526194541796N00609483EA0000001980
+B1526214541801N00609481EA0000001982
+B1526234541805N00609478EA0000001983
+B1526254541811N00609476EA0000001983
+B1526274541817N00609475EA0000001981
+B1526294541827N00609476EA0000001977
+B1526314541835N00609476EA0000001973
+B1526334541844N00609477EA0000001969
+B1526354541851N00609480EA0000001966
+B1526374541858N00609483EA0000001963
+B1526394541868N00609483EA0000001960
+B1526414541874N00609484EA0000001957
+B1526434541878N00609487EA0000001955
+B1526454541886N00609488EA0000001952
+B1526474541898N00609486EA0000001949
+B1526494541909N00609484EA0000001948
+B1526514541918N00609484EA0000001948
+B1526534541927N00609486EA0000001947
+B1526564541936N00609486EA0000001947
+B1526584541946N00609487EA0000001946
+B1527004541955N00609489EA0000001945
+B1527024541963N00609491EA0000001944
+B1527044541971N00609492EA0000001943
+B1527064541978N00609494EA0000001943
+B1527084541984N00609495EA0000001944
+B1527104541989N00609495EA0000001947
+B1527124541996N00609496EA0000001945
+B1527144542004N00609498EA0000001945
+B1527164542008N00609502EA0000001946
+B1527184542011N00609505EA0000001945
+B1527204542016N00609506EA0000001945
+B1527224542023N00609504EA0000001946
+B1527244542026N00609502EA0000001947
+B1527264542029N00609502EA0000001946
+B1527284542034N00609503EA0000001946
+B1527304542042N00609505EA0000001947
+B1527324542046N00609507EA0000001947
+B1527344542050N00609508EA0000001947
+B1527364542059N00609510EA0000001946
+B1527384542068N00609511EA0000001948
+B1527404542074N00609512EA0000001951
+B1527424542078N00609513EA0000001952
+B1527444542083N00609513EA0000001953
+B1527464542089N00609513EA0000001955
+B1527484542095N00609516EA0000001956
+B1527504542101N00609517EA0000001955
+B1527524542108N00609517EA0000001956
+B1527544542114N00609519EA0000001957
+B1527564542120N00609523EA0000001955
+B1527584542128N00609524EA0000001954
+B1528004542135N00609525EA0000001954
+B1528024542140N00609527EA0000001954
+B1528044542144N00609529EA0000001952
+B1528064542151N00609528EA0000001949
+B1528084542159N00609530EA0000001948
+B1528104542168N00609535EA0000001943
+B1528124542176N00609537EA0000001940
+B1528144542183N00609539EA0000001937
+B1528164542189N00609540EA0000001934
+B1528184542196N00609539EA0000001930
+B1528204542205N00609539EA0000001924
+B1528224542213N00609538EA0000001919
+B1528244542221N00609539EA0000001914
+B1528264542230N00609539EA0000001908
+B1528284542242N00609539EA0000001901
+B1528304542254N00609540EA0000001895
+B1528324542262N00609541EA0000001890
+B1528354542271N00609542EA0000001885
+B1528374542284N00609544EA0000001879
+B1528394542296N00609545EA0000001874
+B1528414542305N00609545EA0000001871
+B1528434542313N00609547EA0000001868
+B1528454542324N00609548EA0000001864
+B1528474542335N00609550EA0000001861
+B1528494542344N00609555EA0000001860
+B1528514542353N00609559EA0000001859
+B1528534542363N00609562EA0000001858
+B1528554542372N00609567EA0000001858
+B1528574542382N00609570EA0000001857
+B1528594542392N00609572EA0000001857
+B1529014542402N00609574EA0000001855
+B1529034542413N00609577EA0000001853
+B1529054542423N00609581EA0000001851
+B1529074542432N00609585EA0000001849
+B1529094542442N00609589EA0000001846
+B1529114542452N00609595EA0000001842
+B1529134542462N00609600EA0000001839
+B1529154542471N00609605EA0000001836
+B1529174542480N00609612EA0000001831
+B1529194542491N00609618EA0000001826
+B1529214542502N00609623EA0000001821
+B1529234542512N00609626EA0000001817
+B1529254542520N00609629EA0000001814
+B1529274542529N00609631EA0000001812
+B1529294542542N00609634EA0000001811
+B1529314542553N00609636EA0000001811
+B1529334542559N00609640EA0000001813
+B1529354542564N00609644EA0000001818
+B1529374542568N00609647EA0000001824
+B1529394542571N00609647EA0000001830
+B1529414542575N00609649EA0000001835
+B1529434542579N00609652EA0000001839
+B1529454542581N00609651EA0000001843
+B1529474542582N00609645EA0000001846
+B1529494542580N00609637EA0000001849
+B1529514542568N00609627EA0000001854
+B1529534542557N00609625EA0000001855
+B1529554542543N00609631EA0000001856
+B1529574542533N00609645EA0000001857
+B1529594542531N00609661EA0000001857
+B1530014542536N00609672EA0000001859
+B1530034542543N00609684EA0000001865
+B1530054542553N00609689EA0000001868
+B1530074542562N00609694EA0000001869
+B1530094542572N00609697EA0000001872
+B1530114542581N00609699EA0000001877
+B1530134542589N00609701EA0000001882
+B1530164542596N00609702EA0000001886
+B1530184542605N00609704EA0000001887
+B1530204542616N00609708EA0000001889
+B1530224542624N00609710EA0000001890
+B1530244542631N00609711EA0000001890
+B1530264542639N00609715EA0000001888
+B1530284542648N00609720EA0000001886
+B1530304542656N00609724EA0000001882
+B1530324542664N00609731EA0000001878
+B1530344542675N00609738EA0000001874
+B1530364542686N00609745EA0000001871
+B1530384542696N00609751EA0000001868
+B1530404542706N00609758EA0000001863
+B1530424542718N00609765EA0000001859
+B1530444542729N00609773EA0000001856
+B1530464542738N00609780EA0000001852
+B1530484542748N00609787EA0000001848
+B1530504542759N00609795EA0000001844
+B1530524542770N00609801EA0000001842
+B1530544542780N00609806EA0000001839
+B1530564542790N00609813EA0000001836
+B1530584542800N00609818EA0000001834
+B1531004542810N00609823EA0000001831
+B1531024542820N00609828EA0000001829
+B1531044542830N00609834EA0000001825
+B1531064542840N00609839EA0000001821
+B1531084542850N00609843EA0000001817
+B1531104542860N00609848EA0000001813
+B1531124542870N00609854EA0000001809
+B1531144542880N00609860EA0000001804
+B1531164542891N00609865EA0000001801
+B1531184542901N00609870EA0000001798
+B1531204542911N00609875EA0000001794
+B1531224542921N00609882EA0000001791
+B1531244542931N00609889EA0000001788
+B1531264542941N00609895EA0000001786
+B1531284542950N00609901EA0000001785
+B1531304542960N00609908EA0000001782
+B1531324542976N00609918EA0000001779
+B1531344542986N00609924EA0000001777
+B1531364542997N00609931EA0000001774
+B1531384543008N00609935EA0000001772
+B1531404543018N00609940EA0000001770
+B1531424543028N00609945EA0000001769
+B1531444543037N00609948EA0000001770
+B1531464543044N00609951EA0000001771
+B1531484543050N00609957EA0000001771
+B1531504543059N00609960EA0000001771
+B1531524543069N00609963EA0000001770
+B1531544543078N00609969EA0000001767
+B1531574543088N00609975EA0000001764
+B1531594543099N00609981EA0000001762
+B1532014543110N00609984EA0000001759
+B1532034543121N00609988EA0000001756
+B1532054543133N00609994EA0000001752
+B1532074543144N00609999EA0000001748
+B1532094543154N00610003EA0000001745
+B1532114543165N00610009EA0000001741
+B1532134543176N00610014EA0000001738
+B1532154543187N00610019EA0000001735
+B1532174543198N00610025EA0000001733
+B1532194543209N00610031EA0000001730
+B1532214543220N00610038EA0000001727
+B1532234543231N00610043EA0000001725
+B1532254543241N00610048EA0000001722
+B1532274543252N00610054EA0000001720
+B1532294543263N00610060EA0000001717
+B1532314543274N00610066EA0000001714
+B1532334543284N00610072EA0000001712
+B1532354543295N00610080EA0000001709
+B1532374543305N00610088EA0000001706
+B1532394543316N00610095EA0000001704
+B1532414543327N00610101EA0000001702
+B1532434543337N00610106EA0000001699
+B1532454543349N00610112EA0000001697
+B1532474543360N00610117EA0000001697
+B1532494543370N00610123EA0000001695
+B1532514543380N00610128EA0000001693
+B1532534543392N00610133EA0000001691
+B1532554543403N00610139EA0000001689
+B1532574543414N00610144EA0000001687
+B1532594543425N00610150EA0000001685
+B1533014543437N00610157EA0000001683
+B1533034543448N00610164EA0000001682
+B1533054543459N00610170EA0000001680
+B1533074543470N00610175EA0000001678
+B1533094543482N00610182EA0000001675
+B1533114543499N00610189EA0000001671
+B1533134543511N00610195EA0000001669
+B1533154543523N00610200EA0000001667
+B1533174543536N00610205EA0000001666
+B1533194543548N00610209EA0000001665
+B1533214543559N00610214EA0000001663
+B1533234543571N00610219EA0000001663
+B1533254543582N00610225EA0000001661
+B1533274543592N00610232EA0000001658
+B1533294543603N00610237EA0000001653
+B1533314543615N00610241EA0000001651
+B1533334543627N00610246EA0000001649
+B1533364543639N00610251EA0000001645
+B1533384543652N00610253EA0000001641
+B1533404543665N00610256EA0000001638
+B1533424543676N00610260EA0000001634
+B1533444543689N00610262EA0000001630
+B1533464543701N00610262EA0000001627
+B1533484543712N00610263EA0000001626
+B1533504543722N00610265EA0000001624
+B1533524543733N00610267EA0000001622
+B1533544543745N00610270EA0000001620
+B1533564543757N00610274EA0000001620
+B1533584543768N00610279EA0000001622
+B1534004543785N00610287EA0000001623
+B1534024543796N00610292EA0000001626
+B1534044543804N00610299EA0000001629
+B1534064543810N00610305EA0000001631
+B1534084543817N00610311EA0000001634
+B1534104543823N00610316EA0000001638
+B1534124543829N00610322EA0000001640
+B1534144543835N00610327EA0000001643
+B1534164543840N00610327EA0000001646
+B1534184543844N00610324EA0000001649
+B1534204543846N00610320EA0000001651
+B1534234543845N00610314EA0000001655
+B1534254543844N00610309EA0000001659
+B1534274543845N00610304EA0000001661
+B1534294543850N00610301EA0000001663
+B1534314543856N00610305EA0000001667
+B1534334543862N00610315EA0000001669
+B1534354543864N00610332EA0000001671
+B1534374543858N00610352EA0000001673
+B1534394543845N00610360EA0000001676
+B1534414543836N00610354EA0000001678
+B1534434543836N00610344EA0000001681
+B1534454543846N00610345EA0000001685
+B1534474543854N00610359EA0000001690
+B1534494543853N00610379EA0000001693
+B1534514543845N00610396EA0000001698
+B1534534543833N00610399EA0000001701
+B1534554543825N00610387EA0000001704
+B1534574543830N00610380EA0000001708
+B1534594543839N00610384EA0000001712
+B1535014543846N00610398EA0000001716
+B1535034543848N00610416EA0000001719
+B1535054543844N00610434EA0000001723
+B1535074543831N00610443EA0000001726
+B1535094543820N00610438EA0000001728
+B1535114543821N00610427EA0000001731
+B1535134543830N00610426EA0000001734
+B1535154543838N00610436EA0000001738
+B1535174543843N00610453EA0000001742
+B1535194543843N00610472EA0000001746
+B1535214543836N00610489EA0000001750
+B1535234543826N00610494EA0000001755
+B1535254543819N00610489EA0000001758
+B1535274543818N00610479EA0000001762
+B1535294543825N00610474EA0000001765
+B1535314543834N00610481EA0000001769
+B1535334543840N00610496EA0000001774
+B1535354543839N00610524EA0000001782
+B1535374543831N00610536EA0000001788
+B1535394543822N00610536EA0000001793
+B1535414543816N00610528EA0000001798
+B1535434543817N00610518EA0000001802
+B1535454543824N00610516EA0000001807
+B1535474543833N00610524EA0000001813
+B1535494543840N00610538EA0000001819
+B1535514543843N00610558EA0000001824
+B1535534543839N00610578EA0000001830
+B1535554543830N00610583EA0000001835
+B1535574543822N00610577EA0000001840
+B1536004543820N00610567EA0000001846
+B1536024543827N00610563EA0000001852
+B1536044543837N00610569EA0000001860
+B1536064543846N00610582EA0000001866
+B1536084543851N00610600EA0000001873
+B1536104543848N00610620EA0000001880
+B1536124543841N00610631EA0000001889
+B1536144543831N00610628EA0000001897
+B1536164543828N00610618EA0000001904
+B1536184543832N00610609EA0000001911
+B1536204543844N00610609EA0000001918
+B1536224543855N00610620EA0000001926
+B1536244543860N00610639EA0000001934
+B1536264543857N00610658EA0000001942
+B1536284543847N00610664EA0000001950
+B1536304543838N00610658EA0000001958
+B1536324543836N00610647EA0000001966
+B1536344543842N00610639EA0000001973
+B1536364543853N00610641EA0000001980
+B1536384543863N00610654EA0000001986
+B1536404543865N00610675EA0000001992
+B1536424543860N00610693EA0000001999
+B1536444543852N00610695EA0000002006
+B1536464543846N00610685EA0000002014
+B1536484543847N00610675EA0000002022
+B1536504543854N00610669EA0000002029
+B1536524543863N00610672EA0000002037
+B1536544543871N00610685EA0000002044
+B1536564543873N00610702EA0000002051
+B1536584543869N00610722EA0000002058
+B1537004543859N00610734EA0000002064
+B1537024543849N00610731EA0000002070
+B1537044543845N00610719EA0000002078
+B1537064543847N00610711EA0000002086
+B1537084543850N00610704EA0000002094
+B1537104543857N00610702EA0000002102
+B1537124543865N00610709EA0000002110
+B1537144543868N00610735EA0000002122
+B1537164543861N00610754EA0000002129
+B1537184543851N00610766EA0000002137
+B1537204543842N00610768EA0000002145
+B1537224543834N00610764EA0000002152
+B1537244543830N00610755EA0000002160
+B1537264543834N00610749EA0000002166
+B1537284543843N00610754EA0000002173
+B1537304543848N00610768EA0000002180
+B1537324543848N00610789EA0000002187
+B1537344543841N00610807EA0000002194
+B1537374543832N00610817EA0000002202
+B1537394543821N00610817EA0000002209
+B1537414543812N00610816EA0000002216
+B1537434543805N00610809EA0000002221
+B1537454543806N00610796EA0000002228
+B1537474543815N00610791EA0000002234
+B1537494543824N00610800EA0000002243
+B1537514543829N00610816EA0000002251
+B1537534543828N00610835EA0000002259
+B1537554543820N00610850EA0000002266
+B1537574543806N00610851EA0000002271
+B1537594543798N00610846EA0000002277
+B1538014543795N00610841EA0000002281
+B1538034543793N00610825EA0000002286
+B1538054543800N00610817EA0000002292
+B1538074543811N00610821EA0000002299
+B1538094543817N00610835EA0000002306
+B1538114543817N00610854EA0000002313
+B1538134543812N00610873EA0000002321
+B1538154543802N00610886EA0000002328
+B1538174543792N00610887EA0000002334
+B1538194543784N00610879EA0000002339
+B1538214543783N00610868EA0000002343
+B1538234543789N00610862EA0000002348
+B1538254543799N00610868EA0000002355
+B1538274543810N00610882EA0000002365
+B1538294543813N00610897EA0000002374
+B1538314543814N00610913EA0000002382
+B1538334543810N00610931EA0000002389
+B1538354543801N00610946EA0000002396
+B1538374543789N00610946EA0000002401
+B1538394543783N00610935EA0000002406
+B1538414543785N00610924EA0000002412
+B1538434543791N00610918EA0000002418
+B1538454543800N00610919EA0000002427
+B1538474543807N00610925EA0000002435
+B1538494543814N00610938EA0000002443
+B1538514543815N00610965EA0000002456
+B1538534543807N00610979EA0000002465
+B1538554543796N00610980EA0000002472
+B1538574543790N00610973EA0000002478
+B1538594543788N00610963EA0000002483
+B1539014543792N00610954EA0000002489
+B1539034543801N00610951EA0000002497
+B1539054543810N00610955EA0000002505
+B1539074543817N00610965EA0000002513
+B1539094543822N00610982EA0000002520
+B1539114543821N00610999EA0000002528
+B1539134543814N00611012EA0000002535
+B1539154543803N00611014EA0000002542
+B1539184543796N00611005EA0000002548
+B1539204543796N00610993EA0000002555
+B1539224543802N00610985EA0000002560
+B1539244543813N00610981EA0000002567
+B1539264543824N00610986EA0000002574
+B1539284543831N00610997EA0000002579
+B1539304543837N00611013EA0000002584
+B1539324543840N00611031EA0000002588
+B1539344543843N00611044EA0000002592
+B1539364543849N00611051EA0000002593
+B1539384543858N00611056EA0000002593
+B1539404543867N00611057EA0000002591
+B1539424543877N00611058EA0000002590
+B1539444543887N00611064EA0000002588
+B1539464543898N00611071EA0000002587
+B1539484543907N00611072EA0000002587
+B1539504543914N00611073EA0000002589
+B1539524543920N00611075EA0000002589
+B1539544543927N00611078EA0000002588
+B1539564543934N00611079EA0000002588
+B1539584543940N00611081EA0000002587
+B1540004543948N00611083EA0000002585
+B1540024543955N00611085EA0000002583
+B1540044543964N00611087EA0000002580
+B1540064543972N00611088EA0000002578
+B1540084543978N00611083EA0000002576
+B1540104543984N00611076EA0000002574
+B1540124543992N00611071EA0000002572
+B1540144543999N00611065EA0000002571
+B1540164544005N00611057EA0000002570
+B1540184544012N00611049EA0000002568
+B1540204544020N00611041EA0000002567
+B1540224544026N00611032EA0000002566
+B1540244544034N00611026EA0000002566
+B1540264544043N00611021EA0000002566
+B1540284544050N00611015EA0000002567
+B1540304544058N00611009EA0000002567
+B1540324544071N00611001EA0000002565
+B1540344544078N00610995EA0000002563
+B1540364544086N00610990EA0000002561
+B1540384544097N00610986EA0000002561
+B1540404544105N00610981EA0000002560
+B1540424544113N00610977EA0000002559
+B1540444544123N00610975EA0000002557
+B1540464544132N00610972EA0000002555
+B1540484544140N00610967EA0000002552
+B1540504544151N00610962EA0000002547
+B1540524544163N00610956EA0000002543
+B1540544544175N00610949EA0000002541
+B1540564544187N00610945EA0000002537
+B1540594544200N00610941EA0000002534
+B1541014544214N00610935EA0000002532
+B1541034544228N00610929EA0000002531
+B1541054544239N00610927EA0000002529
+B1541074544251N00610921EA0000002526
+B1541094544264N00610913EA0000002523
+B1541114544278N00610907EA0000002522
+B1541134544290N00610903EA0000002520
+B1541154544304N00610899EA0000002517
+B1541174544318N00610893EA0000002515
+B1541194544331N00610887EA0000002515
+B1541214544342N00610880EA0000002513
+B1541234544354N00610873EA0000002511
+B1541254544369N00610867EA0000002510
+B1541274544381N00610860EA0000002510
+B1541294544394N00610852EA0000002509
+B1541314544407N00610846EA0000002509
+B1541334544418N00610839EA0000002509
+B1541354544429N00610830EA0000002509
+B1541374544442N00610826EA0000002510
+B1541394544454N00610823EA0000002511
+B1541414544465N00610818EA0000002513
+B1541434544477N00610811EA0000002514
+B1541454544488N00610804EA0000002515
+B1541474544499N00610798EA0000002516
+B1541494544510N00610794EA0000002517
+B1541514544522N00610789EA0000002518
+B1541534544533N00610784EA0000002520
+B1541554544544N00610783EA0000002520
+B1541574544556N00610780EA0000002519
+B1541594544568N00610777EA0000002519
+B1542014544580N00610774EA0000002519
+B1542034544591N00610771EA0000002518
+B1542054544603N00610766EA0000002516
+B1542074544616N00610763EA0000002514
+B1542094544628N00610760EA0000002511
+B1542114544640N00610756EA0000002510
+B1542134544655N00610741EA0000002507
+B1542154544666N00610733EA0000002503
+B1542174544678N00610725EA0000002499
+B1542194544687N00610713EA0000002496
+B1542214544696N00610703EA0000002492
+B1542234544706N00610697EA0000002487
+B1542254544717N00610693EA0000002481
+B1542274544727N00610687EA0000002476
+B1542294544737N00610681EA0000002471
+B1542314544747N00610676EA0000002466
+B1542334544757N00610671EA0000002460
+B1542354544767N00610667EA0000002456
+B1542374544775N00610666EA0000002451
+B1542404544784N00610665EA0000002444
+B1542424544793N00610662EA0000002437
+B1542444544801N00610659EA0000002433
+B1542464544807N00610654EA0000002426
+B1542484544813N00610645EA0000002418
+B1542504544821N00610634EA0000002413
+B1542524544828N00610623EA0000002408
+B1542544544836N00610613EA0000002405
+B1542564544845N00610605EA0000002403
+B1542584544854N00610597EA0000002401
+B1543004544861N00610589EA0000002399
+B1543024544870N00610582EA0000002395
+B1543044544880N00610574EA0000002393
+B1543064544890N00610565EA0000002392
+B1543084544900N00610558EA0000002390
+B1543104544911N00610551EA0000002388
+B1543124544922N00610544EA0000002388
+B1543144544931N00610535EA0000002388
+B1543164544940N00610528EA0000002387
+B1543184544950N00610520EA0000002385
+B1543204544960N00610513EA0000002385
+B1543224544970N00610507EA0000002385
+B1543244544979N00610499EA0000002383
+B1543264544990N00610491EA0000002381
+B1543284545001N00610483EA0000002381
+B1543304545012N00610477EA0000002382
+B1543324545022N00610470EA0000002384
+B1543344545029N00610465EA0000002384
+B1543364545038N00610462EA0000002383
+B1543384545047N00610458EA0000002382
+B1543404545056N00610455EA0000002381
+B1543424545064N00610454EA0000002379
+B1543444545075N00610451EA0000002379
+B1543464545085N00610448EA0000002379
+B1543484545094N00610446EA0000002378
+B1543504545103N00610445EA0000002375
+B1543524545115N00610444EA0000002372
+B1543544545133N00610446EA0000002371
+B1543564545142N00610449EA0000002370
+B1543584545152N00610451EA0000002369
+B1544004545164N00610447EA0000002369
+B1544024545174N00610447EA0000002370
+B1544044545182N00610451EA0000002372
+B1544064545189N00610452EA0000002371
+B1544084545195N00610450EA0000002369
+B1544104545204N00610447EA0000002369
+B1544124545213N00610442EA0000002370
+B1544144545221N00610438EA0000002372
+B1544164545230N00610437EA0000002375
+B1544194545238N00610435EA0000002377
+B1544214545245N00610429EA0000002377
+B1544234545255N00610421EA0000002379
+B1544254545262N00610413EA0000002380
+B1544274545270N00610405EA0000002380
+B1544294545277N00610396EA0000002378
+B1544314545286N00610390EA0000002375
+B1544334545297N00610386EA0000002372
+B1544354545307N00610381EA0000002369
+B1544374545316N00610376EA0000002365
+B1544394545326N00610372EA0000002362
+B1544414545336N00610367EA0000002359
+B1544434545344N00610361EA0000002357
+B1544454545354N00610357EA0000002354
+B1544474545364N00610353EA0000002352
+B1544494545373N00610348EA0000002348
+B1544514545384N00610343EA0000002345
+B1544534545395N00610340EA0000002343
+B1544554545405N00610336EA0000002340
+B1544574545414N00610333EA0000002336
+B1544594545425N00610331EA0000002332
+B1545014545436N00610329EA0000002328
+B1545034545446N00610328EA0000002324
+B1545054545456N00610328EA0000002319
+B1545074545467N00610327EA0000002315
+B1545094545476N00610327EA0000002312
+B1545114545485N00610328EA0000002308
+B1545134545495N00610328EA0000002302
+B1545154545507N00610327EA0000002297
+B1545174545519N00610328EA0000002293
+B1545194545533N00610330EA0000002291
+B1545214545545N00610331EA0000002292
+B1545234545555N00610329EA0000002294
+B1545254545559N00610328EA0000002299
+B1545274545559N00610329EA0000002305
+B1545294545561N00610326EA0000002310
+B1545314545561N00610318EA0000002316
+B1545334545551N00610307EA0000002327
+B1545354545541N00610299EA0000002333
+B1545374545524N00610298EA0000002339
+B1545394545508N00610307EA0000002347
+B1545414545497N00610323EA0000002355
+B1545434545491N00610339EA0000002363
+B1545454545492N00610352EA0000002369
+B1545474545497N00610359EA0000002374
+B1545494545501N00610362EA0000002381
+B1545514545503N00610358EA0000002386
+B1545534545502N00610349EA0000002392
+B1545554545496N00610339EA0000002399
+B1545584545486N00610332EA0000002407
+B1546004545475N00610328EA0000002413
+B1546024545460N00610332EA0000002417
+B1546044545445N00610342EA0000002423
+B1546064545435N00610357EA0000002428
+B1546084545431N00610374EA0000002431
+B1546104545433N00610389EA0000002434
+B1546124545439N00610395EA0000002437
+B1546144545444N00610396EA0000002441
+B1546164545447N00610396EA0000002445
+B1546184545449N00610395EA0000002450
+B1546204545452N00610394EA0000002454
+B1546224545455N00610391EA0000002460
+B1546244545456N00610382EA0000002463
+B1546264545453N00610372EA0000002465
+B1546284545452N00610362EA0000002468
+B1546304545454N00610356EA0000002473
+B1546334545456N00610353EA0000002476
+B1546354545460N00610352EA0000002478
+B1546374545465N00610349EA0000002482
+B1546394545470N00610347EA0000002486
+B1546414545475N00610347EA0000002487
+B1546434545481N00610347EA0000002488
+B1546454545487N00610344EA0000002487
+B1546474545494N00610339EA0000002484
+B1546494545502N00610336EA0000002483
+B1546514545509N00610335EA0000002483
+B1546534545517N00610335EA0000002483
+B1546554545525N00610334EA0000002482
+B1546574545534N00610332EA0000002481
+B1546594545545N00610331EA0000002479
+B1547014545556N00610329EA0000002478
+B1547034545568N00610327EA0000002476
+B1547054545579N00610326EA0000002474
+B1547074545591N00610326EA0000002472
+B1547094545603N00610326EA0000002469
+B1547114545615N00610327EA0000002466
+B1547134545626N00610327EA0000002465
+B1547154545637N00610328EA0000002463
+B1547174545649N00610331EA0000002461
+B1547194545662N00610334EA0000002460
+B1547214545674N00610337EA0000002459
+B1547234545686N00610338EA0000002459
+B1547254545698N00610340EA0000002458
+B1547274545711N00610345EA0000002455
+B1547294545723N00610348EA0000002452
+B1547314545736N00610349EA0000002449
+B1547334545748N00610352EA0000002446
+B1547354545760N00610354EA0000002442
+B1547374545773N00610354EA0000002439
+B1547394545786N00610356EA0000002435
+B1547414545798N00610360EA0000002432
+B1547434545811N00610364EA0000002428
+B1547454545825N00610367EA0000002424
+B1547474545845N00610369EA0000002419
+B1547494545852N00610369EA0000002418
+B1547514545872N00610370EA0000002413
+B1547534545886N00610371EA0000002411
+B1547554545898N00610374EA0000002409
+B1547574545910N00610378EA0000002407
+B1547594545923N00610381EA0000002404
+B1548014545936N00610383EA0000002402
+B1548034545948N00610388EA0000002399
+B1548054545960N00610393EA0000002396
+B1548074545973N00610397EA0000002394
+B1548094545985N00610402EA0000002392
+B1548114545996N00610406EA0000002391
+B1548144546008N00610412EA0000002389
+B1548164546020N00610418EA0000002388
+B1548184546031N00610426EA0000002386
+B1548204546042N00610434EA0000002385
+B1548224546053N00610442EA0000002384
+B1548244546064N00610452EA0000002384
+B1548264546074N00610462EA0000002383
+B1548284546085N00610471EA0000002382
+B1548304546096N00610482EA0000002381
+B1548324546106N00610493EA0000002379
+B1548344546118N00610504EA0000002377
+B1548364546129N00610515EA0000002376
+B1548384546140N00610525EA0000002375
+B1548404546151N00610535EA0000002374
+B1548424546162N00610546EA0000002373
+B1548444546173N00610557EA0000002371
+B1548464546184N00610569EA0000002369
+B1548484546195N00610581EA0000002368
+B1548504546205N00610594EA0000002367
+B1548524546215N00610605EA0000002365
+B1548544546226N00610617EA0000002363
+B1548564546237N00610629EA0000002361
+B1548584546246N00610641EA0000002359
+B1549004546256N00610654EA0000002357
+B1549024546265N00610668EA0000002354
+B1549044546273N00610682EA0000002351
+B1549064546282N00610697EA0000002348
+B1549084546292N00610713EA0000002345
+B1549104546300N00610729EA0000002343
+B1549124546309N00610745EA0000002340
+B1549144546319N00610757EA0000002336
+B1549164546330N00610771EA0000002334
+B1549184546339N00610785EA0000002331
+B1549204546349N00610797EA0000002327
+B1549224546359N00610809EA0000002324
+B1549244546369N00610821EA0000002320
+B1549264546379N00610832EA0000002316
+B1549284546395N00610849EA0000002309
+B1549304546405N00610863EA0000002304
+B1549324546416N00610877EA0000002299
+B1549344546425N00610891EA0000002296
+B1549364546434N00610905EA0000002291
+B1549384546442N00610919EA0000002285
+B1549404546451N00610933EA0000002280
+B1549424546460N00610948EA0000002275
+B1549444546468N00610962EA0000002270
+B1549464546476N00610976EA0000002263
+B1549484546485N00610991EA0000002257
+B1549504546493N00611006EA0000002251
+B1549524546502N00611019EA0000002247
+B1549554546509N00611031EA0000002242
+B1549574546515N00611045EA0000002236
+B1549594546522N00611059EA0000002228
+B1550014546529N00611077EA0000002221
+B1550034546538N00611093EA0000002215
+B1550054546547N00611107EA0000002211
+B1550074546555N00611123EA0000002207
+B1550094546561N00611138EA0000002203
+B1550114546568N00611151EA0000002198
+B1550134546575N00611164EA0000002194
+B1550154546582N00611180EA0000002190
+B1550174546589N00611197EA0000002186
+B1550194546598N00611212EA0000002181
+B1550214546607N00611228EA0000002177
+B1550234546614N00611245EA0000002173
+B1550254546622N00611260EA0000002168
+B1550274546632N00611276EA0000002163
+B1550294546639N00611295EA0000002159
+B1550314546648N00611310EA0000002155
+B1550334546658N00611326EA0000002151
+B1550354546666N00611345EA0000002149
+B1550374546674N00611364EA0000002147
+B1550394546682N00611383EA0000002146
+B1550414546689N00611402EA0000002146
+B1550434546696N00611420EA0000002144
+B1550454546705N00611438EA0000002142
+B1550474546716N00611456EA0000002141
+B1550494546726N00611473EA0000002142
+B1550514546736N00611490EA0000002141
+B1550534546746N00611504EA0000002142
+B1550554546755N00611516EA0000002141
+B1550574546765N00611528EA0000002139
+B1550594546776N00611539EA0000002138
+B1551014546787N00611548EA0000002138
+B1551034546797N00611559EA0000002137
+B1551054546807N00611571EA0000002137
+B1551074546817N00611583EA0000002137
+B1551094546832N00611600EA0000002136
+B1551114546842N00611614EA0000002135
+B1551134546853N00611627EA0000002134
+B1551154546865N00611637EA0000002133
+B1551174546876N00611647EA0000002131
+B1551194546889N00611657EA0000002128
+B1551214546902N00611667EA0000002126
+B1551234546914N00611677EA0000002125
+B1551254546925N00611688EA0000002122
+B1551274546937N00611698EA0000002118
+B1551294546949N00611709EA0000002115
+B1551314546962N00611719EA0000002113
+B1551344546973N00611728EA0000002109
+B1551364546985N00611738EA0000002105
+B1551384546997N00611748EA0000002101
+B1551404547008N00611759EA0000002097
+B1551424547019N00611771EA0000002095
+B1551444547029N00611781EA0000002091
+B1551464547040N00611792EA0000002087
+B1551484547050N00611804EA0000002082
+B1551504547060N00611816EA0000002078
+B1551524547071N00611827EA0000002074
+B1551544547081N00611839EA0000002069
+B1551564547091N00611851EA0000002065
+B1551584547100N00611862EA0000002060
+B1552004547110N00611873EA0000002055
+B1552024547120N00611884EA0000002051
+B1552044547130N00611895EA0000002047
+B1552064547141N00611904EA0000002044
+B1552084547151N00611913EA0000002040
+B1552104547161N00611923EA0000002036
+B1552124547172N00611933EA0000002032
+B1552144547182N00611943EA0000002028
+B1552164547193N00611953EA0000002024
+B1552184547203N00611964EA0000002020
+B1552204547213N00611975EA0000002017
+B1552224547223N00611986EA0000002014
+B1552244547233N00611997EA0000002011
+B1552264547243N00612008EA0000002009
+B1552284547254N00612019EA0000002006
+B1552304547264N00612031EA0000002005
+B1552324547274N00612044EA0000002003
+B1552344547284N00612056EA0000002000
+B1552364547294N00612068EA0000001997
+B1552384547304N00612081EA0000001993
+B1552404547315N00612094EA0000001990
+B1552424547325N00612108EA0000001987
+B1552444547336N00612118EA0000001984
+B1552464547346N00612129EA0000001982
+B1552484547356N00612141EA0000001979
+B1552504547371N00612163EA0000001974
+B1552524547381N00612177EA0000001972
+B1552544547390N00612189EA0000001971
+B1552564547400N00612201EA0000001968
+B1552584547411N00612214EA0000001966
+B1553004547421N00612227EA0000001965
+B1553024547430N00612239EA0000001962
+B1553044547440N00612252EA0000001960
+B1553064547450N00612266EA0000001958
+B1553084547459N00612280EA0000001957
+B1553104547468N00612294EA0000001956
+B1553124547477N00612309EA0000001955
+B1553154547484N00612323EA0000001954
+B1553174547493N00612336EA0000001952
+B1553194547502N00612351EA0000001951
+B1553214547511N00612364EA0000001950
+B1553234547520N00612375EA0000001949
+B1553254547529N00612387EA0000001947
+B1553274547539N00612398EA0000001945
+B1553294547549N00612407EA0000001942
+B1553314547559N00612417EA0000001940
+B1553334547569N00612427EA0000001938
+B1553354547579N00612436EA0000001935
+B1553374547589N00612446EA0000001933
+B1553394547594N00612451EA0000001930
+B1553414547610N00612465EA0000001928
+B1553434547620N00612476EA0000001926
+B1553454547629N00612486EA0000001926
+B1553474547637N00612498EA0000001923
+B1553494547647N00612510EA0000001921
+B1553514547657N00612521EA0000001920
+B1553534547665N00612532EA0000001917
+B1553554547673N00612542EA0000001914
+B1553574547683N00612555EA0000001910
+B1553594547693N00612568EA0000001907
+B1554014547702N00612581EA0000001904
+B1554034547711N00612595EA0000001900
+B1554054547720N00612608EA0000001897
+B1554074547729N00612620EA0000001894
+B1554094547737N00612634EA0000001891
+B1554114547746N00612648EA0000001888
+B1554134547755N00612661EA0000001885
+B1554154547763N00612674EA0000001881
+B1554174547771N00612688EA0000001877
+B1554194547779N00612701EA0000001874
+B1554214547786N00612715EA0000001870
+B1554234547794N00612731EA0000001866
+B1554254547801N00612746EA0000001864
+B1554274547808N00612761EA0000001861
+B1554294547816N00612775EA0000001857
+B1554314547827N00612797EA0000001851
+B1554334547835N00612810EA0000001848
+B1554354547842N00612823EA0000001844
+B1554374547850N00612837EA0000001841
+B1554394547857N00612850EA0000001838
+B1554414547864N00612864EA0000001836
+B1554434547871N00612876EA0000001834
+B1554454547878N00612888EA0000001832
+B1554474547885N00612901EA0000001829
+B1554494547891N00612914EA0000001825
+B1554514547898N00612928EA0000001822
+B1554534547905N00612941EA0000001819
+B1554564547911N00612954EA0000001816
+B1554584547918N00612966EA0000001813
+B1555004547926N00612978EA0000001810
+B1555024547933N00612989EA0000001807
+B1555044547941N00612998EA0000001803
+B1555064547950N00613006EA0000001800
+B1555084547958N00613015EA0000001796
+B1555104547967N00613023EA0000001793
+B1555124547975N00613032EA0000001788
+B1555144547984N00613042EA0000001784
+B1555164547992N00613054EA0000001782
+B1555184547999N00613065EA0000001779
+B1555204548006N00613077EA0000001775
+B1555224548013N00613090EA0000001771
+B1555244548020N00613103EA0000001768
+B1555264548027N00613117EA0000001765
+B1555284548034N00613130EA0000001762
+B1555304548040N00613143EA0000001758
+B1555324548047N00613157EA0000001755
+B1555344548054N00613170EA0000001752
+B1555364548061N00613183EA0000001748
+B1555384548068N00613196EA0000001745
+B1555404548075N00613210EA0000001742
+B1555424548081N00613223EA0000001739
+B1555444548088N00613237EA0000001736
+B1555464548094N00613252EA0000001734
+B1555484548101N00613265EA0000001732
+B1555504548108N00613278EA0000001730
+B1555524548115N00613292EA0000001727
+B1555544548121N00613306EA0000001723
+B1555564548128N00613320EA0000001720
+B1555584548135N00613335EA0000001717
+B1556004548141N00613350EA0000001714
+B1556024548148N00613365EA0000001710
+B1556044548154N00613380EA0000001707
+B1556064548161N00613394EA0000001704
+B1556084548167N00613409EA0000001701
+B1556104548177N00613432EA0000001695
+B1556124548184N00613448EA0000001692
+B1556144548191N00613465EA0000001690
+B1556164548197N00613480EA0000001687
+B1556184548204N00613494EA0000001682
+B1556204548212N00613509EA0000001677
+B1556224548220N00613524EA0000001673
+B1556244548228N00613538EA0000001668
+B1556264548236N00613551EA0000001663
+B1556284548244N00613568EA0000001658
+B1556304548251N00613584EA0000001655
+B1556324548259N00613600EA0000001652
+B1556344548265N00613617EA0000001648
+B1556374548273N00613634EA0000001644
+B1556394548280N00613652EA0000001640
+B1556414548288N00613669EA0000001637
+B1556434548296N00613685EA0000001633
+B1556454548303N00613700EA0000001629
+B1556474548311N00613715EA0000001625
+B1556494548319N00613732EA0000001621
+B1556514548326N00613749EA0000001617
+B1556534548334N00613766EA0000001613
+B1556554548341N00613782EA0000001610
+B1556574548349N00613798EA0000001606
+B1556594548356N00613815EA0000001602
+B1557014548364N00613832EA0000001598
+B1557034548372N00613848EA0000001594
+B1557054548380N00613865EA0000001590
+B1557074548387N00613881EA0000001587
+B1557094548395N00613898EA0000001582
+B1557114548403N00613914EA0000001577
+B1557134548412N00613930EA0000001572
+B1557154548420N00613945EA0000001568
+B1557174548429N00613959EA0000001562
+B1557194548438N00613975EA0000001556
+B1557214548448N00613993EA0000001552
+B1557234548455N00614012EA0000001549
+B1557254548457N00614027EA0000001545
+B1557274548462N00614045EA0000001541
+B1557294548467N00614063EA0000001539
+B1557314548471N00614079EA0000001538
+B1557334548476N00614093EA0000001534
+B1557354548483N00614109EA0000001530
+B1557374548489N00614127EA0000001529
+B1557394548495N00614142EA0000001527
+B1557414548502N00614157EA0000001525
+B1557434548509N00614172EA0000001523
+B1557454548517N00614186EA0000001521
+B1557474548524N00614202EA0000001520
+B1557494548531N00614218EA0000001518
+B1557514548542N00614240EA0000001516
+B1557534548549N00614255EA0000001515
+B1557554548557N00614269EA0000001513
+B1557574548564N00614284EA0000001510
+B1557594548572N00614299EA0000001508
+B1558014548581N00614315EA0000001506
+B1558034548588N00614330EA0000001504
+B1558054548596N00614345EA0000001502
+B1558074548603N00614360EA0000001501
+B1558094548610N00614376EA0000001500
+B1558114548617N00614392EA0000001498
+B1558134548623N00614409EA0000001495
+B1558154548630N00614426EA0000001494
+B1558184548636N00614442EA0000001494
+B1558204548641N00614456EA0000001491
+B1558224548648N00614472EA0000001489
+B1558244548655N00614487EA0000001487
+B1558264548662N00614500EA0000001485
+B1558284548668N00614514EA0000001482
+B1558304548676N00614528EA0000001480
+B1558324548683N00614543EA0000001478
+B1558344548691N00614558EA0000001476
+B1558364548698N00614571EA0000001475
+B1558384548706N00614584EA0000001473
+B1558404548714N00614597EA0000001472
+B1558424548721N00614609EA0000001471
+B1558444548728N00614622EA0000001469
+B1558464548735N00614636EA0000001468
+B1558484548741N00614650EA0000001466
+B1558504548748N00614663EA0000001465
+B1558524548754N00614674EA0000001462
+B1558544548762N00614685EA0000001458
+B1558564548770N00614694EA0000001455
+B1558584548778N00614703EA0000001451
+B1559004548785N00614712EA0000001448
+B1559024548793N00614722EA0000001445
+B1559044548801N00614734EA0000001444
+B1559064548808N00614746EA0000001442
+B1559084548817N00614756EA0000001443
+B1559104548822N00614764EA0000001445
+B1559124548826N00614775EA0000001445
+B1559144548830N00614787EA0000001444
+B1559164548835N00614795EA0000001444
+B1559184548839N00614803EA0000001445
+B1559204548844N00614810EA0000001446
+B1559224548851N00614816EA0000001448
+B1559244548856N00614823EA0000001452
+B1559264548860N00614828EA0000001454
+B1559284548865N00614831EA0000001455
+B1559304548875N00614837EA0000001456
+B1559324548881N00614844EA0000001456
+B1559344548890N00614851EA0000001456
+B1559364548899N00614859EA0000001457
+B1559384548906N00614868EA0000001459
+B1559404548914N00614877EA0000001463
+B1559424548922N00614884EA0000001467
+B1559444548928N00614889EA0000001473
+B1559464548933N00614894EA0000001477
+B1559484548938N00614899EA0000001481
+B1559504548944N00614906EA0000001483
+B1559524548952N00614912EA0000001486
+B1559544548959N00614917EA0000001489
+B1559574548965N00614921EA0000001493
+B1559594548970N00614927EA0000001496
+B1600014548976N00614933EA0000001498
+B1600034548983N00614939EA0000001499
+B1600054548990N00614947EA0000001498
+B1600074548998N00614954EA0000001497
+B1600094549006N00614962EA0000001495
+B1600114549015N00614970EA0000001494
+B1600134549025N00614978EA0000001494
+B1600154549033N00614987EA0000001496
+B1600174549039N00614995EA0000001499
+B1600194549047N00615004EA0000001502
+B1600214549051N00615009EA0000001506
+B1600234549059N00615018EA0000001509
+B1600254549065N00615025EA0000001512
+B1600274549075N00615033EA0000001515
+B1600294549084N00615038EA0000001519
+B1600314549090N00615042EA0000001527
+B1600334549096N00615048EA0000001533
+B1600354549102N00615056EA0000001538
+B1600374549108N00615067EA0000001542
+B1600394549114N00615073EA0000001546
+B1600414549117N00615074EA0000001549
+B1600434549121N00615076EA0000001551
+B1600454549127N00615081EA0000001553
+B1600474549135N00615085EA0000001557
+B1600494549142N00615089EA0000001561
+B1600514549151N00615093EA0000001565
+B1600534549161N00615099EA0000001570
+B1600554549168N00615101EA0000001574
+B1600574549176N00615105EA0000001579
+B1600594549185N00615109EA0000001584
+B1601014549193N00615111EA0000001589
+B1601034549199N00615113EA0000001593
+B1601054549208N00615116EA0000001596
+B1601074549218N00615118EA0000001601
+B1601094549226N00615122EA0000001606
+B1601114549233N00615125EA0000001609
+B1601134549247N00615128EA0000001613
+B1601154549255N00615132EA0000001615
+B1601174549264N00615136EA0000001616
+B1601194549273N00615141EA0000001619
+B1601214549282N00615147EA0000001622
+B1601234549289N00615152EA0000001625
+B1601254549297N00615156EA0000001629
+B1601274549305N00615161EA0000001632
+B1601294549312N00615166EA0000001636
+B1601314549319N00615170EA0000001638
+B1601334549327N00615175EA0000001641
+B1601364549336N00615181EA0000001645
+B1601384549344N00615187EA0000001649
+B1601404549352N00615193EA0000001653
+B1601424549360N00615200EA0000001657
+B1601444549368N00615207EA0000001659
+B1601464549377N00615215EA0000001661
+B1601484549386N00615224EA0000001663
+B1601504549395N00615233EA0000001665
+B1601524549405N00615243EA0000001668
+B1601544549414N00615253EA0000001672
+B1601564549422N00615262EA0000001675
+B1601584549427N00615267EA0000001677
+B1602004549442N00615282EA0000001681
+B1602024549451N00615291EA0000001683
+B1602044549460N00615300EA0000001683
+B1602064549469N00615308EA0000001683
+B1602084549480N00615317EA0000001684
+B1602104549490N00615324EA0000001686
+B1602124549499N00615331EA0000001689
+B1602144549508N00615339EA0000001691
+B1602164549517N00615349EA0000001692
+B1602184549527N00615358EA0000001691
+B1602204549538N00615366EA0000001693
+B1602224549548N00615375EA0000001695
+B1602244549559N00615384EA0000001698
+B1602264549570N00615392EA0000001703
+B1602284549579N00615402EA0000001707
+B1602304549586N00615412EA0000001710
+B1602324549594N00615421EA0000001712
+B1602344549602N00615429EA0000001712
+B1602364549612N00615435EA0000001709
+B1602384549624N00615444EA0000001707
+B1602404549634N00615453EA0000001706
+B1602424549646N00615462EA0000001704
+B1602444549657N00615473EA0000001704
+B1602464549667N00615485EA0000001705
+B1602484549676N00615497EA0000001704
+B1602504549690N00615514EA0000001701
+B1602524549700N00615522EA0000001698
+B1602544549711N00615531EA0000001695
+B1602564549721N00615543EA0000001693
+B1602584549730N00615555EA0000001691
+B1603004549741N00615567EA0000001687
+B1603024549751N00615580EA0000001685
+B1603044549761N00615594EA0000001684
+B1603064549769N00615608EA0000001683
+B1603084549779N00615622EA0000001682
+B1603104549788N00615638EA0000001682
+B1603124549796N00615655EA0000001682
+B1603144549805N00615673EA0000001682
+B1603174549814N00615690EA0000001684
+B1603194549823N00615708EA0000001684
+B1603214549831N00615725EA0000001685
+B1603234549841N00615743EA0000001684
+B1603254549850N00615763EA0000001686
+B1603274549858N00615781EA0000001689
+B1603294549864N00615798EA0000001692
+B1603314549869N00615816EA0000001695
+B1603334549875N00615835EA0000001700
+B1603354549878N00615844EA0000001705
+B1603374549885N00615869EA0000001710
+B1603394549890N00615888EA0000001713
+B1603414549896N00615905EA0000001716
+B1603434549903N00615915EA0000001717
+B1603454549911N00615922EA0000001717
+B1603474549918N00615934EA0000001716
+B1603494549925N00615955EA0000001714
+B1603514549930N00615975EA0000001714
+B1603534549933N00615994EA0000001713
+B1603554549936N00616013EA0000001710
+B1603574549940N00616034EA0000001709
+B1603594549943N00616054EA0000001709
+B1604014549945N00616072EA0000001710
+B1604034549946N00616090EA0000001710
+B1604054549949N00616108EA0000001711
+B1604074549951N00616126EA0000001712
+B1604094549954N00616145EA0000001712
+B1604114549956N00616164EA0000001712
+B1604134549959N00616182EA0000001712
+B1604154549963N00616199EA0000001712
+B1604174549968N00616217EA0000001712
+B1604194549973N00616232EA0000001712
+B1604214549979N00616245EA0000001712
+B1604234549987N00616256EA0000001711
+B1604254549995N00616268EA0000001710
+B1604274550003N00616278EA0000001709
+B1604294550017N00616288EA0000001706
+B1604314550027N00616293EA0000001705
+B1604334550038N00616298EA0000001704
+B1604354550048N00616299EA0000001704
+B1604374550060N00616299EA0000001703
+B1604394550071N00616301EA0000001705
+B1604414550083N00616303EA0000001706
+B1604434550094N00616304EA0000001708
+B1604454550104N00616307EA0000001709
+B1604474550114N00616308EA0000001709
+B1604494550127N00616309EA0000001708
+B1604514550139N00616311EA0000001708
+B1604534550151N00616314EA0000001708
+B1604564550161N00616314EA0000001709
+B1604584550173N00616314EA0000001709
+B1605004550184N00616315EA0000001709
+B1605024550196N00616315EA0000001708
+B1605044550208N00616315EA0000001707
+B1605064550219N00616311EA0000001705
+B1605084550224N00616303EA0000001704
+B1605104550221N00616293EA0000001702
+B1605124550217N00616291EA0000001701
+B1605144550203N00616295EA0000001702
+B1605164550194N00616297EA0000001702
+B1605184550185N00616299EA0000001703
+B1605204550176N00616303EA0000001703
+B1605224550166N00616305EA0000001704
+B1605244550157N00616307EA0000001704
+B1605264550147N00616309EA0000001703
+B1605284550136N00616309EA0000001701
+B1605304550125N00616311EA0000001700
+B1605324550116N00616312EA0000001699
+B1605344550106N00616310EA0000001697
+B1605364550093N00616309EA0000001695
+B1605384550082N00616308EA0000001695
+B1605404550074N00616308EA0000001694
+B1605424550063N00616306EA0000001692
+B1605444550052N00616303EA0000001692
+B1605464550042N00616301EA0000001694
+B1605484550032N00616299EA0000001695
+B1605504550022N00616296EA0000001696
+B1605524550012N00616294EA0000001697
+B1605544550002N00616291EA0000001697
+B1605564549991N00616287EA0000001697
+B1605584549980N00616283EA0000001697
+B1606004549969N00616278EA0000001698
+B1606024549957N00616275EA0000001700
+B1606044549948N00616271EA0000001702
+B1606064549941N00616265EA0000001703
+B1606084549935N00616255EA0000001703
+B1606104549932N00616236EA0000001703
+B1606124549933N00616225EA0000001705
+B1606144549933N00616217EA0000001706
+B1606164549933N00616208EA0000001708
+B1606184549934N00616199EA0000001711
+B1606204549936N00616192EA0000001714
+B1606224549941N00616187EA0000001716
+B1606244549949N00616186EA0000001718
+B1606264549956N00616201EA0000001720
+B1606284549954N00616225EA0000001721
+B1606304549943N00616234EA0000001722
+B1606324549930N00616222EA0000001723
+B1606354549927N00616208EA0000001726
+B1606374549928N00616201EA0000001731
+B1606394549926N00616198EA0000001735
+B1606414549927N00616192EA0000001739
+B1606434549933N00616190EA0000001743
+B1606454549942N00616202EA0000001747
+B1606474549946N00616225EA0000001750
+B1606494549945N00616237EA0000001754
+B1606514549935N00616249EA0000001758
+B1606534549928N00616241EA0000001762
+B1606554549934N00616241EA0000001765
+B1606574549939N00616255EA0000001768
+B1606594549940N00616278EA0000001771
+B1607014549936N00616296EA0000001773
+B1607034549931N00616299EA0000001776
+B1607054549930N00616292EA0000001780
+B1607074549929N00616288EA0000001784
+B1607094549929N00616282EA0000001788
+B1607114549932N00616279EA0000001791
+B1607134549934N00616298EA0000001793
+B1607154549929N00616321EA0000001796
+B1607174549919N00616330EA0000001799
+B1607194549903N00616301EA0000001806
+B1607214549908N00616296EA0000001809
+B1607234549916N00616306EA0000001813
+B1607254549920N00616328EA0000001817
+B1607274549911N00616346EA0000001823
+B1607294549900N00616347EA0000001826
+B1607314549895N00616332EA0000001831
+B1607334549902N00616331EA0000001834
+B1607354549911N00616343EA0000001839
+B1607374549913N00616364EA0000001842
+B1607394549903N00616386EA0000001846
+B1607414549891N00616391EA0000001849
+B1607434549884N00616391EA0000001853
+B1607454549885N00616384EA0000001857
+B1607474549890N00616385EA0000001861
+B1607494549894N00616404EA0000001865
+B1607514549887N00616432EA0000001872
+B1607534549876N00616426EA0000001876
+B1607554549872N00616414EA0000001880
+B1607574549871N00616406EA0000001885
+B1607594549873N00616420EA0000001889
+B1608014549872N00616441EA0000001894
+B1608034549865N00616454EA0000001899
+B1608054549858N00616454EA0000001904
+B1608074549857N00616444EA0000001909
+B1608094549861N00616441EA0000001915
+B1608114549868N00616448EA0000001921
+B1608134549872N00616466EA0000001926
+B1608164549870N00616488EA0000001931
+B1608184549863N00616504EA0000001936
+B1608204549857N00616504EA0000001940
+B1608224549857N00616494EA0000001945
+B1608244549863N00616492EA0000001951
+B1608264549867N00616496EA0000001956
+B1608284549871N00616522EA0000001960
+B1608304549867N00616540EA0000001964
+B1608324549857N00616539EA0000001969
+B1608344549853N00616527EA0000001974
+B1608364549854N00616519EA0000001980
+B1608384549859N00616520EA0000001987
+B1608404549866N00616531EA0000001992
+B1608424549870N00616553EA0000001996
+B1608444549866N00616576EA0000002001
+B1608464549860N00616586EA0000002005
+B1608484549858N00616582EA0000002011
+B1608504549863N00616577EA0000002017
+B1608524549870N00616579EA0000002024
+B1608544549877N00616584EA0000002029
+B1608564549884N00616597EA0000002034
+B1608584549883N00616614EA0000002039
+B1609004549875N00616620EA0000002045
+B1609024549869N00616611EA0000002052
+B1609044549868N00616599EA0000002059
+B1609064549874N00616595EA0000002065
+B1609084549880N00616611EA0000002071
+B1609104549881N00616633EA0000002076
+B1609124549877N00616648EA0000002081
+B1609144549870N00616653EA0000002088
+B1609164549862N00616653EA0000002095
+B1609184549856N00616645EA0000002102
+B1609204549856N00616633EA0000002108
+B1609224549866N00616631EA0000002114
+B1609244549875N00616647EA0000002117
+B1609264549876N00616671EA0000002121
+B1609284549867N00616689EA0000002127
+B1609304549861N00616680EA0000002131
+B1609324549858N00616672EA0000002136
+B1609344549858N00616666EA0000002140
+B1609364549864N00616663EA0000002143
+B1609384549872N00616675EA0000002144
+B1609404549874N00616701EA0000002146
+B1609424549871N00616722EA0000002148
+B1609444549860N00616730EA0000002151
+B1609464549850N00616738EA0000002155
+B1609484549841N00616745EA0000002161
+B1609504549832N00616744EA0000002167
+B1609524549828N00616733EA0000002173
+B1609554549832N00616727EA0000002179
+B1609574549838N00616736EA0000002184
+B1609594549842N00616760EA0000002188
+B1610014549839N00616782EA0000002192
+B1610034549831N00616785EA0000002196
+B1610054549825N00616777EA0000002202
+B1610074549821N00616768EA0000002208
+B1610094549823N00616757EA0000002212
+B1610114549829N00616755EA0000002215
+B1610134549836N00616770EA0000002219
+B1610154549834N00616792EA0000002222
+B1610174549826N00616805EA0000002224
+B1610194549815N00616804EA0000002226
+B1610214549807N00616799EA0000002229
+B1610234549804N00616794EA0000002233
+B1610254549806N00616788EA0000002236
+B1610274549813N00616785EA0000002238
+B1610294549821N00616797EA0000002240
+B1610314549823N00616820EA0000002242
+B1610334549818N00616837EA0000002244
+B1610354549806N00616844EA0000002247
+B1610374549797N00616844EA0000002252
+B1610394549791N00616838EA0000002256
+B1610414549790N00616831EA0000002260
+B1610434549796N00616828EA0000002264
+B1610454549805N00616834EA0000002267
+B1610474549810N00616855EA0000002269
+B1610494549809N00616879EA0000002271
+B1610514549801N00616895EA0000002274
+B1610534549791N00616904EA0000002278
+B1610554549781N00616909EA0000002282
+B1610574549772N00616908EA0000002284
+B1610594549770N00616900EA0000002286
+B1611014549775N00616896EA0000002288
+B1611034549783N00616902EA0000002290
+B1611054549789N00616922EA0000002292
+B1611074549787N00616945EA0000002294
+B1611094549775N00616969EA0000002298
+B1611114549765N00616977EA0000002301
+B1611134549756N00616979EA0000002303
+B1611154549752N00616972EA0000002303
+B1611174549754N00616965EA0000002303
+B1611194549761N00616964EA0000002303
+B1611214549771N00616979EA0000002303
+B1611234549775N00617003EA0000002303
+B1611254549771N00617025EA0000002302
+B1611274549762N00617037EA0000002303
+B1611294549754N00617040EA0000002304
+B1611314549747N00617046EA0000002305
+B1611334549739N00617047EA0000002305
+B1611364549734N00617038EA0000002304
+B1611384549733N00617028EA0000002304
+B1611404549731N00617021EA0000002305
+B1611424549729N00617015EA0000002307
+B1611444549726N00617007EA0000002309
+B1611464549722N00617001EA0000002313
+B1611484549719N00616996EA0000002318
+B1611504549717N00616990EA0000002323
+B1611524549714N00616985EA0000002328
+B1611544549711N00616977EA0000002332
+B1611564549710N00616973EA0000002337
+B1611584549705N00616969EA0000002342
+B1612004549699N00616969EA0000002347
+B1612024549690N00616972EA0000002350
+B1612044549683N00616983EA0000002354
+B1612064549676N00616996EA0000002357
+B1612084549672N00617012EA0000002361
+B1612104549675N00617030EA0000002365
+B1612124549684N00617044EA0000002369
+B1612144549694N00617047EA0000002375
+B1612164549701N00617043EA0000002381
+B1612184549704N00617039EA0000002387
+B1612204549704N00617035EA0000002392
+B1612224549700N00617032EA0000002397
+B1612244549692N00617031EA0000002399
+B1612264549682N00617034EA0000002402
+B1612284549674N00617043EA0000002406
+B1612304549671N00617059EA0000002409
+B1612324549673N00617078EA0000002411
+B1612344549682N00617091EA0000002414
+B1612364549692N00617095EA0000002418
+B1612384549701N00617093EA0000002423
+B1612404549706N00617088EA0000002427
+B1612424549708N00617083EA0000002431
+B1612444549706N00617078EA0000002434
+B1612464549698N00617077EA0000002435
+B1612484549684N00617096EA0000002436
+B1612504549680N00617116EA0000002437
+B1612524549683N00617132EA0000002439
+B1612544549691N00617146EA0000002441
+B1612564549701N00617159EA0000002443
+B1612584549711N00617164EA0000002445
+B1613004549718N00617164EA0000002448
+B1613024549724N00617163EA0000002449
+B1613044549728N00617159EA0000002450
+B1613064549727N00617153EA0000002450
+B1613084549724N00617147EA0000002450
+B1613104549722N00617140EA0000002449
+B1613124549720N00617132EA0000002448
+B1613154549718N00617124EA0000002446
+B1613174549715N00617116EA0000002445
+B1613194549713N00617108EA0000002443
+B1613214549710N00617099EA0000002440
+B1613234549707N00617090EA0000002438
+B1613254549703N00617082EA0000002437
+B1613274549701N00617074EA0000002437
+B1613294549698N00617066EA0000002436
+B1613314549695N00617057EA0000002436
+B1613334549693N00617049EA0000002435
+B1613354549691N00617041EA0000002433
+B1613374549690N00617036EA0000002430
+B1613394549686N00617022EA0000002430
+B1613414549685N00617015EA0000002430
+B1613434549683N00617005EA0000002431
+B1613454549682N00616996EA0000002433
+B1613474549682N00616990EA0000002438
+B1613494549682N00616984EA0000002444
+B1613514549683N00616976EA0000002450
+B1613534549683N00616969EA0000002454
+B1613554549683N00616961EA0000002458
+B1613574549679N00616952EA0000002460
+B1613594549671N00616948EA0000002461
+B1614014549661N00616951EA0000002460
+B1614034549651N00616961EA0000002460
+B1614054549647N00616979EA0000002460
+B1614074549649N00616996EA0000002462
+B1614094549654N00617009EA0000002465
+B1614114549661N00617021EA0000002466
+B1614134549668N00617032EA0000002469
+B1614154549675N00617044EA0000002474
+B1614174549681N00617047EA0000002477
+B1614194549688N00617044EA0000002479
+B1614214549693N00617039EA0000002481
+B1614234549691N00617030EA0000002482
+B1614254549682N00617018EA0000002485
+B1614274549670N00617019EA0000002486
+B1614294549654N00617037EA0000002487
+B1614314549650N00617053EA0000002487
+B1614334549650N00617073EA0000002489
+B1614354549653N00617088EA0000002491
+B1614374549660N00617100EA0000002494
+B1614394549667N00617115EA0000002498
+B1614414549673N00617129EA0000002502
+B1614434549680N00617140EA0000002504
+B1614454549688N00617149EA0000002507
+B1614474549694N00617152EA0000002510
+B1614494549698N00617146EA0000002512
+B1614524549696N00617138EA0000002513
+B1614544549687N00617132EA0000002514
+B1614564549674N00617136EA0000002515
+B1614584549662N00617151EA0000002516
+B1615004549659N00617173EA0000002517
+B1615024549663N00617192EA0000002520
+B1615044549671N00617208EA0000002523
+B1615064549677N00617220EA0000002525
+B1615084549685N00617231EA0000002525
+B1615104549694N00617242EA0000002526
+B1615124549702N00617253EA0000002529
+B1615144549709N00617262EA0000002529
+B1615164549713N00617265EA0000002528
+B1615184549727N00617278EA0000002526
+B1615204549734N00617290EA0000002524
+B1615224549739N00617303EA0000002520
+B1615244549745N00617317EA0000002515
+B1615264549750N00617333EA0000002508
+B1615284549753N00617350EA0000002503
+B1615304549757N00617365EA0000002498
+B1615324549761N00617379EA0000002493
+B1615344549767N00617393EA0000002487
+B1615364549774N00617409EA0000002480
+B1615384549782N00617426EA0000002473
+B1615404549788N00617445EA0000002465
+B1615424549793N00617465EA0000002459
+B1615444549797N00617485EA0000002453
+B1615464549801N00617505EA0000002447
+B1615484549806N00617526EA0000002441
+B1615504549811N00617547EA0000002436
+B1615524549815N00617570EA0000002430
+B1615544549819N00617594EA0000002426
+B1615564549823N00617617EA0000002422
+B1615584549827N00617639EA0000002420
+B1616004549831N00617660EA0000002415
+B1616024549837N00617682EA0000002410
+B1616044549846N00617716EA0000002402
+B1616064549848N00617737EA0000002399
+B1616084549851N00617756EA0000002395
+B1616104549854N00617775EA0000002389
+B1616124549855N00617798EA0000002383
+B1616144549856N00617819EA0000002379
+B1616164549858N00617836EA0000002376
+B1616184549858N00617852EA0000002371
+B1616204549859N00617872EA0000002366
+B1616224549860N00617892EA0000002360
+B1616244549862N00617911EA0000002353
+B1616264549865N00617933EA0000002346
+B1616284549868N00617955EA0000002341
+B1616314549871N00617972EA0000002338
+B1616334549874N00617988EA0000002336
+B1616354549877N00618006EA0000002332
+B1616374549881N00618024EA0000002329
+B1616394549884N00618043EA0000002327
+B1616414549887N00618061EA0000002324
+B1616434549892N00618077EA0000002321
+B1616454549895N00618095EA0000002318
+B1616474549898N00618110EA0000002316
+B1616494549901N00618125EA0000002312
+B1616514549902N00618142EA0000002308
+B1616534549904N00618160EA0000002304
+B1616554549907N00618177EA0000002300
+B1616574549909N00618195EA0000002297
+B1616594549911N00618213EA0000002294
+B1617014549914N00618231EA0000002291
+B1617034549916N00618249EA0000002288
+B1617054549919N00618266EA0000002285
+B1617074549921N00618283EA0000002281
+B1617094549922N00618303EA0000002278
+B1617114549924N00618321EA0000002275
+B1617134549926N00618339EA0000002272
+B1617154549929N00618358EA0000002270
+B1617174549932N00618377EA0000002267
+B1617194549936N00618396EA0000002265
+B1617214549938N00618415EA0000002262
+B1617234549940N00618434EA0000002259
+B1617254549943N00618453EA0000002256
+B1617274549946N00618471EA0000002253
+B1617294549948N00618488EA0000002249
+B1617314549951N00618507EA0000002244
+B1617334549953N00618529EA0000002240
+B1617354549954N00618548EA0000002238
+B1617374549954N00618563EA0000002237
+B1617394549956N00618577EA0000002235
+B1617414549959N00618590EA0000002231
+B1617434549962N00618606EA0000002225
+B1617454549967N00618630EA0000002219
+B1617474549969N00618646EA0000002216
+B1617494549971N00618663EA0000002211
+B1617514549972N00618681EA0000002207
+B1617534549974N00618699EA0000002204
+B1617554549977N00618715EA0000002201
+B1617574549979N00618732EA0000002197
+B1617594549982N00618750EA0000002195
+B1618014549986N00618767EA0000002194
+B1618034549989N00618783EA0000002193
+B1618054549992N00618798EA0000002191
+B1618074549995N00618815EA0000002189
+B1618094549997N00618832EA0000002187
+B1618124549998N00618847EA0000002184
+B1618144549999N00618863EA0000002180
+B1618164550001N00618881EA0000002175
+B1618184550002N00618902EA0000002171
+B1618204550002N00618923EA0000002167
+B1618224550003N00618943EA0000002163
+B1618244550004N00618965EA0000002159
+B1618264550005N00618988EA0000002157
+B1618284550005N00619009EA0000002154
+B1618304550005N00619031EA0000002151
+B1618324550006N00619053EA0000002148
+B1618344550006N00619074EA0000002146
+B1618364550006N00619096EA0000002143
+B1618384550006N00619118EA0000002140
+B1618404550008N00619139EA0000002137
+B1618424550009N00619161EA0000002134
+B1618444550010N00619183EA0000002131
+B1618464550012N00619204EA0000002128
+B1618484550014N00619224EA0000002126
+B1618504550017N00619244EA0000002122
+B1618524550022N00619265EA0000002119
+B1618544550027N00619285EA0000002117
+B1618564550030N00619306EA0000002115
+B1618584550031N00619325EA0000002114
+B1619004550035N00619343EA0000002115
+B1619024550036N00619358EA0000002118
+B1619044550038N00619371EA0000002121
+B1619064550040N00619382EA0000002122
+B1619084550042N00619394EA0000002124
+B1619104550044N00619406EA0000002124
+B1619124550044N00619419EA0000002125
+B1619144550045N00619434EA0000002126
+B1619164550045N00619449EA0000002127
+B1619184550046N00619463EA0000002127
+B1619204550046N00619477EA0000002127
+B1619224550046N00619492EA0000002128
+B1619244550047N00619505EA0000002128
+B1619264550051N00619526EA0000002127
+B1619284550053N00619542EA0000002128
+B1619304550054N00619556EA0000002129
+B1619324550057N00619570EA0000002129
+B1619344550059N00619585EA0000002128
+B1619364550061N00619600EA0000002127
+B1619384550062N00619614EA0000002126
+B1619404550064N00619629EA0000002124
+B1619424550067N00619644EA0000002122
+B1619444550069N00619659EA0000002121
+B1619464550072N00619673EA0000002119
+B1619484550074N00619687EA0000002117
+B1619504550076N00619702EA0000002114
+B1619534550078N00619719EA0000002110
+B1619554550082N00619737EA0000002107
+B1619574550085N00619756EA0000002105
+B1619594550088N00619773EA0000002101
+B1620014550090N00619791EA0000002097
+B1620034550093N00619811EA0000002093
+B1620054550096N00619829EA0000002091
+B1620074550098N00619846EA0000002087
+B1620094550101N00619864EA0000002083
+B1620114550105N00619882EA0000002079
+B1620134550109N00619901EA0000002076
+B1620154550111N00619921EA0000002074
+B1620174550114N00619940EA0000002073
+B1620194550117N00619959EA0000002072
+B1620214550120N00619978EA0000002070
+B1620234550123N00619998EA0000002069
+B1620254550126N00620017EA0000002068
+B1620274550128N00620036EA0000002068
+B1620294550130N00620055EA0000002067
+B1620314550131N00620073EA0000002065
+B1620334550133N00620094EA0000002062
+B1620354550134N00620115EA0000002060
+B1620374550134N00620135EA0000002059
+B1620394550134N00620154EA0000002056
+B1620414550136N00620172EA0000002053
+B1620434550138N00620193EA0000002048
+B1620454550139N00620214EA0000002045
+B1620474550140N00620233EA0000002042
+B1620494550141N00620253EA0000002037
+B1620514550142N00620273EA0000002033
+B1620534550143N00620293EA0000002030
+B1620554550145N00620311EA0000002027
+B1620574550145N00620331EA0000002023
+B1620594550145N00620352EA0000002020
+B1621014550146N00620372EA0000002018
+B1621034550146N00620392EA0000002016
+B1621054550146N00620412EA0000002013
+B1621074550149N00620442EA0000002009
+B1621094550149N00620462EA0000002006
+B1621114550148N00620481EA0000002004
+B1621134550149N00620501EA0000002000
+B1621154550149N00620521EA0000001997
+B1621174550149N00620540EA0000001993
+B1621194550150N00620559EA0000001989
+B1621214550150N00620579EA0000001985
+B1621234550150N00620598EA0000001982
+B1621254550150N00620618EA0000001979
+B1621274550150N00620637EA0000001976
+B1621294550150N00620657EA0000001972
+B1621324550151N00620676EA0000001968
+B1621344550151N00620696EA0000001965
+B1621364550152N00620714EA0000001962
+B1621384550153N00620732EA0000001958
+B1621404550153N00620752EA0000001954
+B1621424550153N00620771EA0000001950
+B1621444550154N00620789EA0000001946
+B1621464550154N00620808EA0000001941
+B1621484550155N00620827EA0000001937
+B1621504550156N00620846EA0000001933
+B1621524550156N00620864EA0000001929
+B1621544550156N00620874EA0000001925
+B1621564550156N00620874EA0000001921
+B1621584550156N00620925EA0000001918
+B1622004550155N00620946EA0000001915
+B1622024550156N00620967EA0000001911
+B1622044550156N00620988EA0000001908
+B1622064550155N00621008EA0000001905
+B1622084550155N00621030EA0000001901
+B1622104550155N00621052EA0000001898
+B1622124550155N00621074EA0000001894
+B1622144550156N00621095EA0000001889
+B1622164550157N00621117EA0000001884
+B1622184550157N00621140EA0000001879
+B1622204550158N00621163EA0000001875
+B1622224550159N00621185EA0000001872
+B1622244550159N00621207EA0000001868
+B1622264550160N00621229EA0000001863
+B1622284550160N00621251EA0000001860
+B1622304550159N00621273EA0000001856
+B1622324550160N00621293EA0000001852
+B1622344550160N00621313EA0000001848
+B1622364550160N00621335EA0000001842
+B1622384550162N00621359EA0000001837
+B1622404550162N00621383EA0000001833
+B1622424550163N00621406EA0000001831
+B1622444550163N00621427EA0000001830
+B1622464550162N00621454EA0000001832
+B1622484550162N00621473EA0000001834
+B1622504550161N00621489EA0000001837
+B1622524550160N00621504EA0000001840
+B1622544550159N00621519EA0000001843
+B1622564550156N00621535EA0000001845
+B1622584550149N00621549EA0000001846
+B1623004550138N00621559EA0000001847
+B1623024550125N00621561EA0000001849
+B1623044550116N00621550EA0000001851
+B1623064550116N00621538EA0000001852
+B1623084550121N00621536EA0000001855
+B1623104550127N00621544EA0000001857
+B1623134550131N00621558EA0000001858
+B1623154550131N00621575EA0000001860
+B1623174550128N00621592EA0000001862
+B1623194550122N00621608EA0000001866
+B1623214550115N00621623EA0000001869
+B1623234550109N00621639EA0000001873
+B1623254550105N00621655EA0000001876
+B1623274550104N00621670EA0000001878
+B1623294550105N00621683EA0000001879
+B1623314550107N00621689EA0000001879
+B1623334550117N00621700EA0000001880
+B1623354550123N00621699EA0000001881
+B1623374550127N00621694EA0000001883
+B1623394550127N00621686EA0000001886
+B1623414550124N00621677EA0000001889
+B1623434550116N00621670EA0000001893
+B1623454550103N00621669EA0000001896
+B1623474550091N00621673EA0000001900
+B1623494550081N00621684EA0000001904
+B1623514550074N00621699EA0000001906
+B1623534550070N00621715EA0000001909
+B1623554550071N00621730EA0000001910
+B1623574550076N00621741EA0000001910
+B1623594550082N00621748EA0000001910
+B1624014550089N00621749EA0000001911
+B1624034550093N00621745EA0000001913
+B1624054550095N00621737EA0000001915
+B1624074550094N00621728EA0000001919
+B1624094550089N00621721EA0000001922
+B1624114550081N00621713EA0000001924
+B1624134550069N00621711EA0000001928
+B1624154550056N00621715EA0000001931
+B1624174550046N00621726EA0000001934
+B1624194550039N00621741EA0000001937
+B1624214550036N00621758EA0000001939
+B1624234550039N00621771EA0000001940
+B1624254550044N00621782EA0000001940
+B1624274550054N00621787EA0000001940
+B1624294550060N00621780EA0000001940
+B1624314550060N00621770EA0000001942
+B1624334550054N00621760EA0000001945
+B1624354550042N00621756EA0000001948
+B1624374550028N00621758EA0000001952
+B1624394550017N00621764EA0000001955
+B1624414550007N00621774EA0000001958
+B1624434549998N00621789EA0000001960
+B1624454549994N00621805EA0000001962
+B1624474549993N00621820EA0000001962
+B1624494549994N00621834EA0000001962
+B1624514550001N00621845EA0000001963
+B1624544550010N00621846EA0000001963
+B1624564550015N00621840EA0000001964
+B1624584550016N00621830EA0000001965
+B1625004550012N00621820EA0000001965
+B1625024550002N00621814EA0000001965
+B1625044549989N00621814EA0000001965
+B1625064549978N00621824EA0000001965
+B1625084549970N00621840EA0000001967
+B1625104549966N00621849EA0000001970
+B1625124549959N00621873EA0000001974
+B1625144549956N00621886EA0000001975
+B1625164549953N00621900EA0000001975
+B1625184549955N00621918EA0000001976
+B1625204549960N00621930EA0000001979
+B1625224549966N00621935EA0000001981
+B1625244549973N00621936EA0000001983
+B1625264549978N00621932EA0000001985
+B1625284549978N00621922EA0000001987
+B1625304549974N00621913EA0000001990
+B1625324549964N00621906EA0000001994
+B1625344549951N00621904EA0000001998
+B1625364549939N00621914EA0000002001
+B1625384549930N00621929EA0000002006
+B1625404549927N00621946EA0000002009
+B1625424549928N00621961EA0000002010
+B1625444549934N00621973EA0000002011
+B1625464549942N00621976EA0000002012
+B1625484549947N00621969EA0000002014
+B1625504549947N00621958EA0000002018
+B1625524549944N00621947EA0000002024
+B1625544549937N00621939EA0000002028
+B1625564549926N00621936EA0000002032
+B1625584549914N00621941EA0000002036
+B1626004549906N00621956EA0000002039
+B1626024549903N00621973EA0000002042
+B1626044549905N00621986EA0000002045
+B1626064549915N00621993EA0000002049
+B1626084549921N00621989EA0000002053
+B1626104549924N00621980EA0000002058
+B1626124549921N00621971EA0000002062
+B1626144549915N00621961EA0000002066
+B1626164549902N00621957EA0000002069
+B1626184549889N00621966EA0000002073
+B1626204549880N00621981EA0000002077
+B1626224549879N00621997EA0000002080
+B1626244549881N00622011EA0000002084
+B1626264549887N00622019EA0000002086
+B1626284549894N00622021EA0000002090
+B1626314549900N00622017EA0000002094
+B1626334549902N00622008EA0000002099
+B1626354549902N00621999EA0000002102
+B1626374549897N00621989EA0000002104
+B1626394549883N00621983EA0000002106
+B1626414549870N00621989EA0000002109
+B1626434549859N00622006EA0000002110
+B1626454549856N00622021EA0000002113
+B1626474549856N00622035EA0000002115
+B1626494549859N00622047EA0000002118
+B1626514549866N00622054EA0000002120
+B1626534549874N00622057EA0000002123
+B1626554549881N00622056EA0000002127
+B1626574549886N00622049EA0000002130
+B1626594549887N00622038EA0000002134
+B1627014549883N00622028EA0000002136
+B1627034549873N00622021EA0000002138
+B1627054549862N00622017EA0000002139
+B1627074549847N00622024EA0000002139
+B1627094549835N00622039EA0000002140
+B1627114549829N00622057EA0000002142
+B1627134549828N00622072EA0000002145
+B1627154549829N00622086EA0000002147
+B1627174549831N00622099EA0000002148
+B1627194549834N00622112EA0000002150
+B1627214549840N00622121EA0000002152
+B1627234549848N00622122EA0000002156
+B1627254549854N00622119EA0000002161
+B1627274549857N00622112EA0000002165
+B1627294549858N00622101EA0000002169
+B1627314549852N00622091EA0000002173
+B1627334549842N00622086EA0000002176
+B1627354549830N00622084EA0000002179
+B1627374549817N00622088EA0000002181
+B1627394549805N00622098EA0000002183
+B1627414549798N00622114EA0000002184
+B1627434549797N00622139EA0000002185
+B1627454549801N00622151EA0000002186
+B1627474549807N00622159EA0000002189
+B1627494549814N00622161EA0000002193
+B1627514549819N00622160EA0000002197
+B1627534549823N00622160EA0000002199
+B1627554549829N00622156EA0000002200
+B1627574549830N00622142EA0000002203
+B1627594549824N00622130EA0000002206
+B1628014549815N00622124EA0000002210
+B1628034549803N00622124EA0000002212
+B1628054549790N00622129EA0000002215
+B1628074549781N00622143EA0000002216
+B1628104549776N00622160EA0000002218
+B1628124549778N00622175EA0000002220
+B1628144549782N00622185EA0000002222
+B1628164549788N00622193EA0000002224
+B1628184549796N00622197EA0000002228
+B1628204549803N00622195EA0000002232
+B1628224549809N00622189EA0000002234
+B1628244549811N00622184EA0000002237
+B1628264549812N00622168EA0000002241
+B1628284549805N00622158EA0000002244
+B1628304549794N00622152EA0000002246
+B1628324549781N00622156EA0000002247
+B1628344549769N00622167EA0000002249
+B1628364549762N00622182EA0000002251
+B1628384549760N00622197EA0000002252
+B1628404549763N00622212EA0000002254
+B1628424549770N00622221EA0000002257
+B1628444549777N00622225EA0000002262
+B1628464549784N00622225EA0000002265
+B1628484549791N00622223EA0000002269
+B1628504549797N00622216EA0000002272
+B1628524549798N00622204EA0000002275
+B1628544549793N00622192EA0000002278
+B1628564549783N00622185EA0000002280
+B1628584549771N00622184EA0000002282
+B1629004549758N00622190EA0000002283
+B1629024549749N00622203EA0000002284
+B1629044549745N00622220EA0000002284
+B1629064549747N00622235EA0000002285
+B1629084549753N00622243EA0000002287
+B1629104549761N00622244EA0000002290
+B1629124549767N00622243EA0000002292
+B1629144549774N00622243EA0000002295
+B1629164549780N00622242EA0000002298
+B1629184549787N00622240EA0000002301
+B1629204549793N00622240EA0000002305
+B1629224549801N00622238EA0000002309
+B1629244549807N00622232EA0000002311
+B1629264549808N00622222EA0000002314
+B1629284549804N00622212EA0000002316
+B1629304549795N00622204EA0000002317
+B1629324549784N00622202EA0000002319
+B1629344549772N00622208EA0000002320
+B1629364549764N00622221EA0000002321
+B1629384549761N00622235EA0000002323
+B1629404549764N00622248EA0000002325
+B1629424549767N00622258EA0000002329
+B1629444549772N00622266EA0000002331
+B1629464549778N00622271EA0000002334
+B1629494549784N00622272EA0000002337
+B1629514549790N00622268EA0000002340
+B1629534549794N00622260EA0000002343
+B1629554549796N00622251EA0000002345
+B1629574549794N00622239EA0000002346
+B1629594549788N00622228EA0000002345
+B1630014549778N00622220EA0000002345
+B1630034549766N00622218EA0000002346
+B1630054549754N00622225EA0000002346
+B1630074549747N00622238EA0000002346
+B1630094549744N00622253EA0000002346
+B1630114549746N00622267EA0000002347
+B1630134549752N00622276EA0000002350
+B1630154549759N00622281EA0000002355
+B1630174549766N00622281EA0000002360
+B1630194549773N00622279EA0000002363
+B1630214549778N00622274EA0000002365
+B1630234549781N00622266EA0000002365
+B1630254549780N00622254EA0000002364
+B1630274549773N00622243EA0000002364
+B1630294549762N00622238EA0000002364
+B1630314549750N00622241EA0000002364
+B1630334549740N00622253EA0000002363
+B1630354549735N00622270EA0000002363
+B1630374549735N00622284EA0000002364
+B1630394549739N00622296EA0000002367
+B1630414549744N00622303EA0000002369
+B1630434549752N00622306EA0000002371
+B1630454549760N00622308EA0000002373
+B1630474549766N00622311EA0000002374
+B1630494549773N00622313EA0000002373
+B1630514549780N00622317EA0000002372
+B1630534549786N00622328EA0000002370
+B1630554549789N00622343EA0000002368
+B1630574549791N00622359EA0000002367
+B1630594549794N00622374EA0000002365
+B1631014549796N00622391EA0000002363
+B1631034549799N00622419EA0000002361
+B1631054549800N00622436EA0000002360
+B1631074549801N00622452EA0000002358
+B1631094549802N00622469EA0000002358
+B1631114549804N00622484EA0000002358
+B1631134549805N00622498EA0000002357
+B1631154549807N00622512EA0000002356
+B1631174549809N00622528EA0000002353
+B1631194549810N00622544EA0000002349
+B1631214549813N00622559EA0000002345
+B1631234549819N00622573EA0000002340
+B1631254549825N00622587EA0000002336
+B1631274549829N00622602EA0000002332
+B1631304549833N00622616EA0000002327
+B1631324549838N00622632EA0000002322
+B1631344549841N00622649EA0000002318
+B1631364549843N00622665EA0000002315
+B1631384549847N00622682EA0000002312
+B1631404549850N00622699EA0000002309
+B1631424549854N00622715EA0000002306
+B1631444549858N00622733EA0000002301
+B1631464549863N00622753EA0000002298
+B1631484549866N00622773EA0000002295
+B1631504549870N00622793EA0000002292
+B1631524549873N00622814EA0000002288
+B1631544549877N00622834EA0000002285
+B1631564549881N00622854EA0000002282
+B1631584549884N00622874EA0000002278
+B1632004549887N00622894EA0000002275
+B1632024549891N00622914EA0000002272
+B1632044549894N00622934EA0000002269
+B1632064549897N00622955EA0000002266
+B1632084549900N00622975EA0000002263
+B1632104549904N00622994EA0000002260
+B1632124549907N00623014EA0000002256
+B1632144549910N00623034EA0000002252
+B1632164549914N00623054EA0000002248
+B1632184549917N00623074EA0000002245
+B1632204549921N00623094EA0000002242
+B1632224549925N00623113EA0000002238
+B1632244549929N00623134EA0000002235
+B1632264549933N00623153EA0000002233
+B1632284549936N00623172EA0000002229
+B1632304549939N00623192EA0000002225
+B1632324549941N00623213EA0000002221
+B1632344549943N00623233EA0000002217
+B1632364549944N00623253EA0000002213
+B1632384549946N00623274EA0000002208
+B1632404549948N00623294EA0000002204
+B1632424549950N00623315EA0000002200
+B1632444549952N00623344EA0000002194
+B1632464549954N00623365EA0000002190
+B1632484549954N00623386EA0000002187
+B1632504549955N00623408EA0000002184
+B1632524549956N00623429EA0000002181
+B1632544549958N00623449EA0000002179
+B1632564549959N00623469EA0000002175
+B1632584549961N00623489EA0000002172
+B1633004549964N00623509EA0000002169
+B1633024549965N00623530EA0000002166
+B1633044549966N00623550EA0000002162
+B1633064549968N00623571EA0000002159
+B1633084549969N00623590EA0000002156
+B1633114549969N00623610EA0000002152
+B1633134549970N00623629EA0000002148
+B1633154549970N00623648EA0000002144
+B1633174549970N00623668EA0000002140
+B1633194549971N00623688EA0000002136
+B1633214549971N00623708EA0000002132
+B1633234549971N00623728EA0000002130
+B1633254549972N00623748EA0000002127
+B1633274549972N00623767EA0000002124
+B1633294549973N00623787EA0000002121
+B1633314549973N00623807EA0000002119
+B1633334549973N00623807EA0000002117
+B1633354549972N00623848EA0000002114
+B1633374549972N00623868EA0000002111
+B1633394549973N00623888EA0000002108
+B1633414549974N00623909EA0000002105
+B1633434549975N00623930EA0000002102
+B1633454549977N00623950EA0000002100
+B1633474549978N00623971EA0000002097
+B1633494549979N00623992EA0000002095
+B1633514549980N00624013EA0000002092
+B1633534549980N00624034EA0000002090
+B1633554549980N00624055EA0000002087
+B1633574549981N00624076EA0000002085
+B1633594549981N00624097EA0000002082
+B1634014549981N00624118EA0000002080
+B1634034549982N00624139EA0000002077
+B1634054549982N00624161EA0000002075
+B1634074549982N00624182EA0000002072
+B1634094549982N00624204EA0000002069
+B1634114549981N00624225EA0000002067
+B1634134549982N00624246EA0000002064
+B1634154549983N00624267EA0000002062
+B1634174549983N00624289EA0000002059
+B1634194549983N00624310EA0000002057
+B1634214549983N00624331EA0000002054
+B1634234549983N00624353EA0000002052
+B1634254549983N00624384EA0000002048
+B1634274549984N00624406EA0000002045
+B1634294549983N00624427EA0000002042
+B1634314549983N00624448EA0000002040
+B1634334549982N00624469EA0000002038
+B1634354549982N00624490EA0000002036
+B1634374549981N00624511EA0000002033
+B1634394549981N00624532EA0000002030
+B1634414549980N00624554EA0000002028
+B1634434549980N00624574EA0000002026
+B1634454549979N00624594EA0000002024
+B1634474549978N00624615EA0000002021
+B1634494549978N00624636EA0000002019
+B1634524549978N00624655EA0000002017
+B1634544549977N00624675EA0000002014
+B1634564549976N00624695EA0000002011
+B1634584549975N00624716EA0000002008
+B1635004549973N00624737EA0000002005
+B1635024549972N00624757EA0000002002
+B1635044549971N00624779EA0000001999
+B1635064549970N00624800EA0000001997
+B1635084549969N00624820EA0000001994
+B1635104549968N00624840EA0000001992
+B1635124549968N00624861EA0000001989
+B1635144549968N00624861EA0000001987
+B1635164549966N00624897EA0000001986
+B1635184549965N00624914EA0000001984
+B1635204549964N00624932EA0000001982
+B1635224549962N00624949EA0000001980
+B1635244549961N00624966EA0000001978
+B1635264549960N00624983EA0000001977
+B1635284549959N00625001EA0000001975
+B1635304549959N00625017EA0000001974
+B1635324549959N00625034EA0000001972
+B1635344549957N00625052EA0000001970
+B1635364549955N00625069EA0000001968
+B1635384549953N00625086EA0000001966
+B1635404549949N00625104EA0000001964
+B1635424549947N00625121EA0000001962
+B1635444549944N00625138EA0000001960
+B1635464549940N00625156EA0000001958
+B1635484549937N00625173EA0000001956
+B1635504549934N00625190EA0000001955
+B1635524549931N00625208EA0000001954
+B1635544549928N00625225EA0000001953
+B1635564549925N00625242EA0000001952
+B1635584549922N00625260EA0000001951
+B1636004549919N00625277EA0000001950
+B1636024549915N00625295EA0000001949
+B1636044549911N00625321EA0000001947
+B1636064549909N00625338EA0000001946
+B1636084549907N00625355EA0000001944
+B1636104549906N00625372EA0000001942
+B1636124549904N00625390EA0000001940
+B1636144549902N00625407EA0000001938
+B1636164549900N00625425EA0000001936
+B1636184549897N00625443EA0000001934
+B1636204549894N00625461EA0000001932
+B1636224549892N00625478EA0000001931
+B1636244549889N00625495EA0000001930
+B1636264549887N00625513EA0000001929
+B1636284549884N00625530EA0000001929
+B1636314549881N00625548EA0000001928
+B1636334549875N00625573EA0000001928
+B1636354549871N00625590EA0000001928
+B1636374549868N00625606EA0000001928
+B1636394549866N00625623EA0000001928
+B1636414549864N00625639EA0000001929
+B1636434549862N00625656EA0000001929
+B1636454549862N00625672EA0000001930
+B1636474549862N00625688EA0000001931
+B1636494549862N00625704EA0000001933
+B1636524549862N00625718EA0000001935
+B1636544549861N00625732EA0000001937
+B1636564549860N00625745EA0000001939
+B1636584549859N00625757EA0000001940
+B1637004549862N00625769EA0000001941
+B1637024549865N00625774EA0000001941
+B1637044549879N00625771EA0000001941
+B1637064549883N00625761EA0000001941
+B1637084549868N00625742EA0000001942
+B1637104549858N00625737EA0000001944
+B1637124549850N00625731EA0000001945
+B1637144549841N00625724EA0000001946
+B1637164549831N00625717EA0000001947
+B1637184549821N00625709EA0000001950
+B1637204549814N00625697EA0000001952
+B1637224549812N00625686EA0000001952
+B1637244549820N00625682EA0000001951
+B1637264549829N00625687EA0000001950
+B1637284549835N00625699EA0000001952
+B1637304549839N00625708EA0000001954
+B1637324549843N00625718EA0000001957
+B1637344549848N00625729EA0000001959
+B1637364549852N00625740EA0000001962
+B1637384549857N00625746EA0000001964
+B1637404549864N00625744EA0000001964
+B1637424549868N00625733EA0000001964
+B1637444549863N00625718EA0000001963
+B1637464549848N00625716EA0000001964
+B1637484549835N00625723EA0000001968
+B1637504549826N00625726EA0000001969
+B1637524549814N00625726EA0000001969
+B1637544549802N00625717EA0000001969
+B1637564549800N00625700EA0000001968
+B1637584549807N00625695EA0000001967
+B1638004549814N00625699EA0000001967
+B1638024549820N00625706EA0000001970
+B1638044549829N00625714EA0000001972
+B1638064549833N00625724EA0000001973
+B1638084549838N00625734EA0000001975
+B1638104549842N00625743EA0000001977
+B1638124549844N00625755EA0000001978
+B1638144549845N00625768EA0000001980
+B1638164549843N00625782EA0000001982
+B1638184549838N00625795EA0000001983
+B1638204549833N00625808EA0000001986
+B1638224549831N00625821EA0000001987
+B1638244549832N00625835EA0000001989
+B1638264549836N00625846EA0000001989
+B1638284549844N00625848EA0000001990
+B1638314549850N00625842EA0000001989
+B1638334549850N00625829EA0000001989
+B1638354549846N00625817EA0000001989
+B1638374549843N00625806EA0000001991
+B1638394549843N00625800EA0000001993
+B1638414549839N00625782EA0000001996
+B1638434549834N00625772EA0000001999
+B1638454549828N00625762EA0000002002
+B1638474549823N00625749EA0000002004
+B1638494549823N00625736EA0000002005
+B1638514549828N00625731EA0000002005
+B1638534549835N00625740EA0000002004
+B1638554549837N00625755EA0000002003
+B1638574549835N00625769EA0000002003
+B1638594549831N00625784EA0000002003
+B1639014549825N00625799EA0000002003
+B1639034549817N00625812EA0000002005
+B1639054549810N00625823EA0000002007
+B1639074549806N00625836EA0000002009
+B1639094549806N00625848EA0000002011
+B1639114549811N00625858EA0000002013
+B1639134549818N00625859EA0000002014
+B1639154549824N00625852EA0000002015
+B1639174549822N00625840EA0000002016
+B1639194549818N00625829EA0000002019
+B1639214549816N00625819EA0000002020
+B1639234549816N00625807EA0000002021
+B1639254549817N00625797EA0000002023
+B1639274549817N00625787EA0000002023
+B1639294549817N00625776EA0000002023
+B1639314549822N00625768EA0000002022
+B1639334549829N00625770EA0000002021
+B1639354549831N00625784EA0000002020
+B1639374549826N00625799EA0000002019
+B1639394549817N00625811EA0000002020
+B1639414549810N00625824EA0000002020
+B1639434549802N00625838EA0000002020
+B1639454549792N00625860EA0000002022
+B1639474549787N00625876EA0000002023
+B1639494549783N00625890EA0000002025
+B1639514549779N00625904EA0000002026
+B1639534549777N00625918EA0000002027
+B1639554549775N00625933EA0000002029
+B1639574549774N00625946EA0000002032
+B1639594549774N00625958EA0000002035
+B1640014549776N00625970EA0000002037
+B1640034549781N00625978EA0000002039
+B1640054549788N00625981EA0000002040
+B1640074549793N00625975EA0000002040
+B1640094549790N00625963EA0000002039
+B1640124549779N00625957EA0000002038
+B1640144549766N00625960EA0000002036
+B1640164549758N00625973EA0000002035
+B1640184549759N00625987EA0000002036
+B1640204549762N00626001EA0000002036
+B1640224549766N00626016EA0000002035
+B1640244549771N00626031EA0000002035
+B1640264549775N00626047EA0000002036
+B1640284549778N00626063EA0000002038
+B1640304549781N00626080EA0000002039
+B1640324549781N00626080EA0000002041
+B1640344549787N00626113EA0000002043
+B1640364549791N00626128EA0000002046
+B1640384549794N00626143EA0000002048
+B1640404549799N00626157EA0000002050
+B1640424549804N00626171EA0000002053
+B1640444549809N00626185EA0000002056
+B1640464549813N00626199EA0000002059
+B1640484549819N00626212EA0000002062
+B1640504549825N00626224EA0000002066
+B1640524549832N00626236EA0000002069
+B1640544549839N00626247EA0000002073
+B1640564549845N00626259EA0000002077
+B1640584549852N00626271EA0000002080
+B1641004549859N00626281EA0000002084
+B1641024549866N00626290EA0000002088
+B1641044549873N00626300EA0000002092
+B1641064549879N00626310EA0000002096
+B1641084549887N00626316EA0000002100
+B1641104549893N00626316EA0000002103
+B1641124549897N00626309EA0000002106
+B1641144549895N00626299EA0000002108
+B1641164549883N00626297EA0000002112
+B1641184549870N00626300EA0000002115
+B1641204549859N00626299EA0000002118
+B1641224549848N00626293EA0000002121
+B1641244549833N00626286EA0000002128
+B1641264549824N00626281EA0000002132
+B1641284549817N00626274EA0000002135
+B1641304549816N00626265EA0000002137
+B1641324549822N00626263EA0000002139
+B1641344549829N00626270EA0000002140
+B1641364549833N00626284EA0000002143
+B1641384549839N00626294EA0000002146
+B1641404549844N00626308EA0000002148
+B1641424549848N00626322EA0000002151
+B1641444549855N00626333EA0000002154
+B1641474549862N00626346EA0000002158
+B1641494549869N00626359EA0000002163
+B1641514549876N00626369EA0000002167
+B1641534549882N00626380EA0000002172
+B1641554549885N00626387EA0000002178
+B1641574549896N00626401EA0000002184
+B1641594549902N00626403EA0000002191
+B1642014549906N00626399EA0000002198
+B1642034549909N00626395EA0000002205
+B1642054549910N00626386EA0000002210
+B1642074549905N00626375EA0000002213
+B1642094549891N00626372EA0000002216
+B1642114549876N00626376EA0000002219
+B1642134549863N00626376EA0000002221
+B1642154549851N00626370EA0000002221
+B1642174549844N00626358EA0000002214
+B1642194549850N00626353EA0000002213
+B1642214549858N00626359EA0000002213
+B1642234549864N00626371EA0000002214
+B1642254549869N00626381EA0000002216
+B1642274549875N00626392EA0000002217
+B1642294549881N00626405EA0000002219
+B1642314549886N00626417EA0000002221
+B1642334549891N00626426EA0000002223
+B1642354549896N00626438EA0000002224
+B1642374549900N00626453EA0000002225
+B1642394549901N00626470EA0000002226
+B1642414549903N00626487EA0000002227
+B1642434549905N00626503EA0000002229
+B1642454549908N00626516EA0000002232
+B1642474549911N00626531EA0000002234
+B1642494549913N00626547EA0000002236
+B1642514549916N00626564EA0000002237
+B1642534549920N00626580EA0000002239
+B1642554549923N00626595EA0000002241
+B1642574549927N00626608EA0000002243
+B1642594549935N00626626EA0000002245
+B1643014549940N00626638EA0000002247
+B1643034549947N00626650EA0000002250
+B1643054549955N00626661EA0000002253
+B1643074549963N00626671EA0000002257
+B1643094549970N00626680EA0000002260
+B1643114549977N00626688EA0000002263
+B1643134549983N00626693EA0000002266
+B1643154549990N00626700EA0000002269
+B1643174549996N00626708EA0000002271
+B1643194550003N00626713EA0000002272
+B1643214550008N00626710EA0000002273
+B1643234550009N00626701EA0000002274
+B1643254549998N00626696EA0000002274
+B1643284549983N00626699EA0000002274
+B1643304549970N00626701EA0000002276
+B1643324549959N00626698EA0000002277
+B1643344549949N00626692EA0000002278
+B1643364549940N00626684EA0000002278
+B1643384549932N00626676EA0000002280
+B1643404549925N00626668EA0000002281
+B1643424549918N00626658EA0000002283
+B1643444549912N00626649EA0000002285
+B1643464549907N00626641EA0000002287
+B1643484549904N00626637EA0000002288
+B1643504549894N00626624EA0000002289
+B1643524549889N00626616EA0000002291
+B1643544549884N00626608EA0000002293
+B1643564549882N00626600EA0000002294
+B1643584549884N00626594EA0000002294
+B1644004549891N00626594EA0000002296
+B1644024549897N00626610EA0000002297
+B1644044549896N00626631EA0000002299
+B1644064549897N00626647EA0000002300
+B1644084549904N00626657EA0000002301
+B1644104549912N00626666EA0000002303
+B1644124549918N00626674EA0000002304
+B1644144549926N00626681EA0000002304
+B1644164549934N00626685EA0000002306
+B1644184549941N00626690EA0000002307
+B1644204549947N00626694EA0000002307
+B1644224549954N00626696EA0000002307
+B1644244549958N00626690EA0000002306
+B1644264549953N00626678EA0000002305
+B1644284549942N00626668EA0000002306
+B1644304549932N00626662EA0000002308
+B1644324549923N00626656EA0000002309
+B1644344549915N00626651EA0000002309
+B1644364549907N00626646EA0000002309
+B1644384549899N00626638EA0000002307
+B1644404549889N00626623EA0000002305
+B1644424549884N00626614EA0000002305
+B1644444549879N00626605EA0000002305
+B1644464549876N00626595EA0000002307
+B1644484549873N00626586EA0000002309
+B1644504549871N00626580EA0000002311
+B1644524549874N00626574EA0000002310
+B1644544549882N00626582EA0000002310
+B1644564549887N00626601EA0000002309
+B1644584549889N00626620EA0000002311
+B1645004549893N00626634EA0000002311
+B1645024549899N00626647EA0000002313
+B1645044549904N00626658EA0000002314
+B1645074549910N00626667EA0000002314
+B1645094549918N00626677EA0000002313
+B1645114549926N00626687EA0000002312
+B1645134549934N00626696EA0000002312
+B1645154549942N00626705EA0000002311
+B1645174549951N00626714EA0000002309
+B1645194549960N00626723EA0000002307
+B1645214549969N00626731EA0000002306
+B1645234549978N00626739EA0000002305
+B1645254549987N00626748EA0000002304
+B1645274549996N00626758EA0000002302
+B1645294550001N00626763EA0000002301
+B1645314550014N00626780EA0000002300
+B1645334550022N00626793EA0000002299
+B1645354550029N00626807EA0000002297
+B1645374550034N00626826EA0000002296
+B1645394550036N00626847EA0000002294
+B1645414550038N00626868EA0000002291
+B1645434550041N00626889EA0000002289
+B1645454550042N00626910EA0000002286
+B1645474550043N00626929EA0000002283
+B1645494550043N00626950EA0000002279
+B1645514550043N00626973EA0000002274
+B1645534550043N00626995EA0000002269
+B1645554550043N00627018EA0000002262
+B1645574550043N00627044EA0000002255
+B1645594550042N00627071EA0000002247
+B1646014550040N00627095EA0000002241
+B1646034550037N00627119EA0000002233
+B1646054550035N00627145EA0000002224
+B1646074550032N00627169EA0000002216
+B1646094550029N00627192EA0000002208
+B1646114550025N00627216EA0000002194
+B1646134550023N00627242EA0000002184
+B1646154550020N00627269EA0000002176
+B1646174550019N00627293EA0000002169
+B1646194550021N00627315EA0000002163
+B1646214550023N00627341EA0000002156
+B1646234550024N00627359EA0000002149
+B1646254550025N00627377EA0000002145
+B1646274550026N00627393EA0000002140
+B1646294550026N00627410EA0000002133
+B1646314550026N00627430EA0000002125
+B1646334550024N00627453EA0000002119
+B1646354550021N00627474EA0000002114
+B1646374550021N00627494EA0000002108
+B1646394550021N00627516EA0000002102
+B1646414550021N00627538EA0000002097
+B1646434550023N00627559EA0000002094
+B1646454550027N00627577EA0000002090
+B1646484550030N00627597EA0000002085
+B1646504550034N00627618EA0000002079
+B1646524550038N00627639EA0000002075
+B1646544550039N00627659EA0000002073
+B1646564550040N00627679EA0000002068
+B1646584550041N00627701EA0000002064
+B1647004550040N00627723EA0000002062
+B1647024550038N00627742EA0000002059
+B1647044550038N00627761EA0000002055
+B1647064550039N00627782EA0000002051
+B1647084550042N00627803EA0000002048
+B1647104550046N00627823EA0000002044
+B1647124550050N00627844EA0000002039
+B1647144550053N00627865EA0000002035
+B1647164550058N00627884EA0000002032
+B1647184550060N00627904EA0000002027
+B1647204550063N00627925EA0000002022
+B1647224550067N00627945EA0000002019
+B1647244550070N00627964EA0000002016
+B1647264550073N00627982EA0000002013
+B1647284550076N00628002EA0000002008
+B1647304550078N00628023EA0000002006
+B1647324550080N00628042EA0000002003
+B1647344550080N00628062EA0000001998
+B1647364550081N00628084EA0000001994
+B1647384550083N00628106EA0000001991
+B1647404550086N00628126EA0000001988
+B1647424550089N00628146EA0000001984
+B1647444550093N00628167EA0000001980
+B1647464550096N00628188EA0000001977
+B1647484550099N00628209EA0000001975
+B1647504550102N00628230EA0000001972
+B1647524550105N00628252EA0000001969
+B1647544550108N00628273EA0000001967
+B1647564550111N00628295EA0000001965
+B1647584550114N00628316EA0000001963
+B1648004550116N00628339EA0000001960
+B1648024550121N00628371EA0000001958
+B1648044550123N00628393EA0000001958
+B1648064550125N00628412EA0000001958
+B1648084550128N00628431EA0000001957
+B1648104550130N00628451EA0000001956
+B1648124550132N00628471EA0000001957
+B1648144550134N00628490EA0000001956
+B1648164550136N00628507EA0000001956
+B1648184550138N00628524EA0000001954
+B1648204550142N00628542EA0000001951
+B1648224550145N00628563EA0000001950
+B1648244550148N00628581EA0000001949
+B1648264550151N00628598EA0000001948
+B1648294550154N00628617EA0000001948
+B1648314550157N00628636EA0000001948
+B1648334550161N00628653EA0000001949
+B1648354550165N00628670EA0000001950
+B1648374550166N00628686EA0000001950
+B1648394550169N00628701EA0000001949
+B1648414550172N00628716EA0000001948
+B1648434550177N00628730EA0000001946
+B1648454550181N00628745EA0000001943
+B1648474550186N00628760EA0000001940
+B1648494550191N00628776EA0000001937
+B1648514550197N00628791EA0000001935
+B1648534550201N00628807EA0000001933
+B1648554550204N00628824EA0000001931
+B1648574550207N00628840EA0000001930
+B1648594550209N00628856EA0000001929
+B1649014550210N00628872EA0000001929
+B1649034550210N00628887EA0000001929
+B1649054550209N00628903EA0000001931
+B1649074550208N00628917EA0000001932
+B1649094550206N00628930EA0000001933
+B1649114550204N00628942EA0000001933
+B1649134550202N00628955EA0000001933
+B1649154550199N00628970EA0000001933
+B1649174550197N00628983EA0000001934
+B1649194550195N00628996EA0000001933
+B1649214550191N00629010EA0000001934
+B1649234550187N00629022EA0000001935
+B1649254550184N00629034EA0000001935
+B1649274550181N00629047EA0000001935
+B1649294550177N00629060EA0000001936
+B1649314550172N00629072EA0000001934
+B1649334550168N00629086EA0000001932
+B1649354550164N00629101EA0000001931
+B1649374550161N00629112EA0000001929
+B1649394550159N00629123EA0000001927
+B1649414550153N00629142EA0000001926
+B1649434550151N00629150EA0000001927
+B1649454550148N00629160EA0000001927
+B1649474550143N00629171EA0000001927
+B1649494550134N00629173EA0000001929
+B1649514550128N00629166EA0000001929
+B1649534550127N00629152EA0000001929
+B1649554550135N00629142EA0000001928
+B1649574550149N00629147EA0000001928
+B1649594550156N00629158EA0000001931
+B1650014550160N00629170EA0000001933
+B1650034550163N00629185EA0000001935
+B1650054550163N00629198EA0000001938
+B1650074550160N00629208EA0000001939
+B1650104550157N00629217EA0000001940
+B1650124550153N00629226EA0000001940
+B1650144550148N00629236EA0000001939
+B1650164550141N00629242EA0000001939
+B1650184550136N00629247EA0000001939
+B1650204550131N00629253EA0000001939
+B1650224550125N00629262EA0000001938
+B1650244550120N00629271EA0000001939
+B1650264550117N00629278EA0000001938
+B1650284550114N00629286EA0000001937
+B1650304550111N00629296EA0000001935
+B1650324550107N00629307EA0000001935
+B1650344550104N00629317EA0000001935
+B1650364550101N00629327EA0000001933
+B1650384550098N00629337EA0000001933
+B1650404550093N00629346EA0000001933
+B1650424550088N00629355EA0000001933
+B1650444550085N00629366EA0000001934
+B1650464550081N00629378EA0000001935
+B1650484550078N00629388EA0000001936
+B1650504550075N00629398EA0000001938
+B1650524550072N00629408EA0000001940
+B1650544550069N00629418EA0000001943
+B1650564550066N00629426EA0000001946
+B1650584550061N00629431EA0000001948
+B1651004550056N00629434EA0000001950
+B1651024550051N00629428EA0000001951
+B1651044550050N00629414EA0000001953
+B1651064550055N00629401EA0000001955
+B1651084550066N00629395EA0000001956
+B1651104550079N00629398EA0000001957
+B1651124550088N00629409EA0000001958
+B1651144550092N00629424EA0000001960
+B1651164550090N00629436EA0000001961
+B1651184550087N00629446EA0000001963
+B1651204550086N00629456EA0000001963
+B1651224550081N00629472EA0000001964
+B1651244550079N00629482EA0000001966
+B1651264550079N00629493EA0000001966
+B1651284550076N00629504EA0000001967
+B1651304550072N00629513EA0000001968
+B1651324550070N00629523EA0000001968
+B1651344550067N00629536EA0000001966
+B1651364550064N00629549EA0000001967
+B1651384550063N00629563EA0000001966
+B1651404550063N00629578EA0000001965
+B1651424550063N00629593EA0000001965
+B1651444550060N00629605EA0000001964
+B1651464550057N00629619EA0000001963
+B1651484550054N00629634EA0000001960
+B1651514550051N00629650EA0000001957
+B1651534550049N00629667EA0000001955
+B1651554550049N00629683EA0000001952
+B1651574550050N00629699EA0000001948
+B1651594550051N00629717EA0000001946
+B1652014550051N00629734EA0000001945
+B1652034550051N00629749EA0000001943
+B1652054550051N00629764EA0000001941
+B1652074550050N00629780EA0000001940
+B1652094550050N00629787EA0000001938
+B1652114550049N00629802EA0000001937
+B1652134550047N00629825EA0000001935
+B1652154550047N00629841EA0000001934
+B1652174550046N00629856EA0000001934
+B1652194550045N00629871EA0000001934
+B1652214550043N00629886EA0000001932
+B1652234550040N00629901EA0000001930
+B1652254550038N00629916EA0000001928
+B1652274550036N00629930EA0000001926
+B1652294550033N00629944EA0000001923
+B1652314550031N00629960EA0000001920
+B1652334550028N00629975EA0000001917
+B1652354550024N00629991EA0000001913
+B1652374550021N00630009EA0000001908
+B1652394550017N00630028EA0000001904
+B1652414550013N00630047EA0000001900
+B1652434550010N00630067EA0000001898
+B1652454550006N00630085EA0000001895
+B1652474550002N00630103EA0000001892
+B1652494550000N00630122EA0000001890
+B1652514549998N00630141EA0000001888
+B1652534549996N00630160EA0000001885
+B1652554549993N00630179EA0000001882
+B1652574549991N00630199EA0000001880
+B1652594549989N00630218EA0000001878
+B1653014549987N00630238EA0000001876
+B1653034549984N00630268EA0000001873
+B1653054549983N00630287EA0000001871
+B1653074549980N00630307EA0000001868
+B1653094549978N00630327EA0000001867
+B1653114549975N00630345EA0000001866
+B1653134549973N00630364EA0000001864
+B1653154549970N00630385EA0000001862
+B1653174549967N00630404EA0000001862
+B1653194549963N00630422EA0000001861
+B1653214549960N00630441EA0000001859
+B1653234549957N00630461EA0000001857
+B1653254549954N00630481EA0000001857
+B1653274549952N00630501EA0000001857
+B1653304549949N00630520EA0000001858
+B1653324549947N00630536EA0000001859
+B1653344549944N00630551EA0000001859
+B1653364549942N00630567EA0000001859
+B1653384549941N00630584EA0000001860
+B1653404549940N00630599EA0000001860
+B1653424549939N00630615EA0000001859
+B1653444549937N00630632EA0000001860
+B1653464549936N00630639EA0000001859
+B1653484549934N00630663EA0000001857
+B1653504549932N00630681EA0000001857
+B1653524549931N00630698EA0000001859
+B1653544549930N00630713EA0000001862
+B1653564549931N00630728EA0000001865
+B1653584549931N00630743EA0000001867
+B1654004549930N00630756EA0000001871
+B1654024549930N00630767EA0000001873
+B1654044549929N00630779EA0000001875
+B1654064549928N00630792EA0000001877
+B1654084549922N00630801EA0000001879
+B1654104549912N00630803EA0000001880
+B1654124549903N00630791EA0000001880
+B1654144549901N00630775EA0000001881
+B1654164549908N00630765EA0000001883
+B1654184549918N00630765EA0000001885
+B1654204549926N00630772EA0000001887
+B1654224549932N00630781EA0000001887
+B1654244549936N00630794EA0000001889
+B1654264549938N00630806EA0000001892
+B1654284549939N00630818EA0000001893
+B1654304549940N00630832EA0000001895
+B1654324549942N00630843EA0000001898
+B1654344549943N00630855EA0000001900
+B1654364549944N00630869EA0000001901
+B1654384549945N00630882EA0000001903
+B1654404549944N00630894EA0000001906
+B1654424549940N00630905EA0000001907
+B1654444549928N00630913EA0000001908
+B1654464549920N00630906EA0000001908
+B1654484549917N00630891EA0000001907
+B1654504549921N00630879EA0000001907
+B1654524549929N00630878EA0000001907
+B1654544549937N00630882EA0000001908
+B1654564549942N00630892EA0000001909
+B1654584549945N00630904EA0000001909
+B1655004549947N00630917EA0000001911
+B1655024549948N00630930EA0000001914
+B1655044549949N00630942EA0000001918
+B1655064549951N00630954EA0000001924
+B1655084549953N00630967EA0000001929
+B1655114549954N00630981EA0000001934
+B1655134549953N00630994EA0000001939
+B1655154549946N00631006EA0000001944
+B1655174549936N00631011EA0000001949
+B1655194549928N00631005EA0000001953
+B1655214549925N00630991EA0000001957
+B1655234549925N00630985EA0000001961
+B1655254549935N00630975EA0000001963
+B1655274549945N00630980EA0000001966
+B1655294549949N00630992EA0000001971
+B1655314549953N00631004EA0000001974
+B1655334549955N00631019EA0000001976
+B1655354549951N00631034EA0000001979
+B1655374549941N00631045EA0000001981
+B1655394549930N00631043EA0000001984
+B1655414549924N00631032EA0000001987
+B1655434549925N00631019EA0000001991
+B1655454549931N00631013EA0000001994
+B1655474549940N00631017EA0000001998
+B1655494549945N00631032EA0000002002
+B1655514549944N00631048EA0000002005
+B1655534549936N00631061EA0000002007
+B1655554549923N00631066EA0000002010
+B1655574549911N00631060EA0000002014
+B1655594549905N00631046EA0000002018
+B1656014549906N00631034EA0000002021
+B1656034549914N00631030EA0000002024
+B1656054549921N00631036EA0000002026
+B1656074549925N00631048EA0000002029
+B1656094549926N00631061EA0000002032
+B1656114549928N00631074EA0000002035
+B1656134549928N00631089EA0000002039
+B1656154549926N00631103EA0000002044
+B1656174549923N00631113EA0000002048
+B1656194549920N00631125EA0000002051
+B1656214549913N00631137EA0000002055
+B1656234549898N00631136EA0000002063
+B1656254549892N00631126EA0000002068
+B1656274549890N00631113EA0000002073
+B1656294549895N00631103EA0000002076
+B1656314549903N00631099EA0000002080
+B1656334549910N00631104EA0000002083
+B1656354549914N00631114EA0000002087
+B1656374549919N00631126EA0000002092
+B1656394549922N00631137EA0000002098
+B1656414549922N00631151EA0000002102
+B1656434549916N00631165EA0000002105
+B1656454549904N00631172EA0000002109
+B1656474549891N00631162EA0000002114
+B1656504549887N00631149EA0000002118
+B1656524549890N00631135EA0000002122
+B1656544549900N00631128EA0000002127
+B1656564549910N00631132EA0000002132
+B1656584549916N00631140EA0000002139
+B1657004549917N00631144EA0000002144
+B1657024549922N00631160EA0000002149
+B1657044549924N00631173EA0000002154
+B1657064549921N00631188EA0000002158
+B1657084549912N00631200EA0000002162
+B1657104549898N00631204EA0000002166
+B1657124549887N00631196EA0000002172
+B1657144549884N00631181EA0000002177
+B1657164549888N00631168EA0000002182
+B1657184549898N00631164EA0000002188
+B1657204549906N00631168EA0000002195
+B1657224549911N00631177EA0000002202
+B1657244549913N00631188EA0000002207
+B1657264549912N00631202EA0000002211
+B1657284549907N00631215EA0000002214
+B1657304549899N00631228EA0000002217
+B1657324549888N00631239EA0000002218
+B1657344549876N00631236EA0000002221
+B1657364549868N00631222EA0000002225
+B1657384549869N00631209EA0000002228
+B1657404549875N00631200EA0000002232
+B1657424549884N00631201EA0000002236
+B1657444549892N00631211EA0000002241
+B1657464549894N00631227EA0000002246
+B1657484549892N00631243EA0000002248
+B1657504549886N00631257EA0000002249
+B1657524549876N00631268EA0000002250
+B1657544549864N00631275EA0000002253
+B1657564549852N00631273EA0000002256
+B1657584549842N00631265EA0000002260
+B1658004549835N00631247EA0000002267
+B1658024549834N00631234EA0000002271
+B1658044549838N00631222EA0000002273
+B1658064549845N00631212EA0000002274
+B1658084549856N00631208EA0000002277
+B1658104549863N00631216EA0000002280
+B1658124549867N00631225EA0000002285
+B1658144549868N00631235EA0000002289
+B1658164549867N00631249EA0000002290
+B1658184549861N00631265EA0000002293
+B1658204549846N00631272EA0000002294
+B1658224549833N00631265EA0000002297
+B1658244549827N00631251EA0000002299
+B1658264549826N00631238EA0000002300
+B1658294549830N00631225EA0000002301
+B1658314549839N00631218EA0000002302
+B1658334549848N00631219EA0000002305
+B1658354549853N00631222EA0000002307
+B1658374549855N00631223EA0000002309
+B1658394549862N00631227EA0000002308
+B1658414549868N00631232EA0000002309
+B1658434549872N00631242EA0000002310
+B1658454549876N00631251EA0000002312
+B1658474549882N00631258EA0000002313
+B1658494549890N00631265EA0000002316
+B1658514549897N00631271EA0000002320
+B1658534549905N00631275EA0000002323
+B1658554549913N00631281EA0000002325
+B1658574549921N00631281EA0000002328
+B1658594549929N00631274EA0000002331
+B1659014549933N00631265EA0000002334
+B1659034549935N00631254EA0000002337
+B1659054549934N00631241EA0000002338
+B1659074549927N00631230EA0000002337
+B1659094549912N00631225EA0000002336
+B1659114549900N00631230EA0000002335
+B1659134549891N00631242EA0000002335
+B1659154549885N00631258EA0000002334
+B1659174549882N00631275EA0000002336
+B1659194549884N00631290EA0000002337
+B1659214549891N00631301EA0000002340
+B1659234549899N00631308EA0000002344
+B1659254549907N00631315EA0000002346
+B1659274549915N00631320EA0000002348
+B1659294549923N00631325EA0000002349
+B1659314549930N00631327EA0000002349
+B1659334549939N00631328EA0000002348
+B1659354549949N00631330EA0000002348
+B1659374549957N00631331EA0000002348
+B1659394549970N00631331EA0000002349
+B1659414549979N00631329EA0000002350
+B1659434549987N00631327EA0000002351
+B1659454549994N00631327EA0000002352
+B1659474550003N00631326EA0000002352
+B1659494550011N00631326EA0000002352
+B1659514550017N00631327EA0000002352
+B1659534550024N00631330EA0000002351
+B1659554550029N00631337EA0000002349
+B1659574550032N00631347EA0000002347
+B1659594550031N00631360EA0000002345
+B1700014550026N00631372EA0000002343
+B1700034550022N00631386EA0000002340
+B1700064550015N00631399EA0000002338
+B1700084550005N00631409EA0000002335
+B1700104549995N00631423EA0000002332
+B1700124549985N00631436EA0000002330
+B1700144549981N00631441EA0000002330
+B1700164549968N00631458EA0000002329
+B1700184549960N00631471EA0000002329
+B1700204549953N00631483EA0000002329
+B1700224549947N00631496EA0000002329
+B1700244549941N00631510EA0000002328
+B1700264549936N00631526EA0000002328
+B1700284549931N00631541EA0000002328
+B1700304549927N00631555EA0000002329
+B1700324549924N00631571EA0000002327
+B1700344549920N00631588EA0000002327
+B1700364549916N00631603EA0000002326
+B1700384549913N00631618EA0000002325
+B1700404549910N00631635EA0000002324
+B1700424549907N00631651EA0000002323
+B1700444549905N00631667EA0000002322
+B1700464549902N00631683EA0000002321
+B1700484549901N00631699EA0000002320
+B1700504549899N00631716EA0000002320
+B1700524549896N00631733EA0000002319
+B1700544549892N00631750EA0000002318
+B1700564549887N00631767EA0000002317
+B1700584549883N00631786EA0000002315
+B1701004549878N00631806EA0000002314
+B1701024549873N00631826EA0000002313
+B1701044549869N00631845EA0000002312
+B1701064549866N00631865EA0000002310
+B1701084549861N00631885EA0000002310
+B1701104549858N00631905EA0000002310
+B1701124549855N00631924EA0000002309
+B1701144549851N00631944EA0000002307
+B1701164549848N00631966EA0000002307
+B1701184549843N00631991EA0000002309
+B1701204549840N00632006EA0000002308
+B1701224549837N00632022EA0000002307
+B1701244549833N00632037EA0000002307
+B1701264549830N00632054EA0000002305
+B1701284549827N00632073EA0000002303
+B1701304549822N00632091EA0000002302
+B1701324549818N00632109EA0000002299
+B1701344549812N00632129EA0000002297
+B1701364549807N00632149EA0000002296
+B1701384549802N00632170EA0000002296
+B1701404549798N00632190EA0000002295
+B1701424549793N00632210EA0000002293
+B1701454549789N00632231EA0000002292
+B1701474549784N00632252EA0000002290
+B1701494549779N00632273EA0000002288
+B1701514549773N00632294EA0000002286
+B1701534549767N00632313EA0000002285
+B1701554549760N00632333EA0000002282
+B1701574549753N00632353EA0000002279
+B1701594549747N00632373EA0000002277
+B1702014549742N00632394EA0000002275
+B1702034549736N00632414EA0000002273
+B1702054549729N00632434EA0000002270
+B1702074549726N00632445EA0000002268
+B1702094549716N00632476EA0000002267
+B1702114549708N00632496EA0000002265
+B1702134549701N00632516EA0000002263
+B1702154549694N00632537EA0000002260
+B1702174549687N00632558EA0000002260
+B1702194549682N00632578EA0000002258
+B1702214549677N00632598EA0000002255
+B1702234549671N00632619EA0000002252
+B1702254549666N00632640EA0000002252
+B1702274549660N00632659EA0000002250
+B1702294549652N00632679EA0000002248
+B1702314549645N00632698EA0000002247
+B1702334549639N00632717EA0000002245
+B1702354549633N00632737EA0000002244
+B1702374549627N00632756EA0000002243
+B1702394549621N00632774EA0000002242
+B1702414549615N00632793EA0000002240
+B1702434549608N00632813EA0000002237
+B1702454549600N00632833EA0000002235
+B1702474549592N00632851EA0000002234
+B1702494549583N00632870EA0000002232
+B1702514549575N00632889EA0000002230
+B1702534549567N00632908EA0000002229
+B1702554549560N00632927EA0000002227
+B1702574549554N00632947EA0000002225
+B1702594549543N00632975EA0000002224
+B1703014549536N00632993EA0000002222
+B1703034549529N00633012EA0000002220
+B1703054549522N00633032EA0000002219
+B1703074549516N00633051EA0000002218
+B1703094549510N00633070EA0000002214
+B1703114549504N00633090EA0000002211
+B1703134549498N00633110EA0000002208
+B1703154549492N00633128EA0000002205
+B1703174549486N00633146EA0000002200
+B1703194549480N00633165EA0000002195
+B1703214549474N00633185EA0000002192
+B1703234549468N00633202EA0000002190
+B1703264549461N00633219EA0000002186
+B1703284549455N00633237EA0000002182
+B1703304549449N00633255EA0000002179
+B1703324549443N00633271EA0000002175
+B1703344549437N00633289EA0000002171
+B1703364549431N00633308EA0000002166
+B1703384549425N00633328EA0000002161
+B1703404549418N00633347EA0000002158
+B1703424549411N00633367EA0000002156
+B1703444549404N00633385EA0000002155
+B1703464549396N00633403EA0000002154
+B1703484549388N00633422EA0000002154
+B1703504549381N00633441EA0000002154
+B1703524549373N00633458EA0000002155
+B1703544549365N00633475EA0000002156
+B1703564549359N00633491EA0000002158
+B1703584549353N00633503EA0000002160
+B1704004549346N00633515EA0000002160
+B1704024549339N00633528EA0000002162
+B1704044549332N00633541EA0000002165
+B1704064549325N00633553EA0000002169
+B1704084549319N00633563EA0000002175
+B1704104549314N00633570EA0000002178
+B1704124549304N00633577EA0000002181
+B1704144549293N00633575EA0000002185
+B1704164549287N00633562EA0000002187
+B1704184549285N00633547EA0000002190
+B1704204549292N00633539EA0000002193
+B1704224549303N00633544EA0000002197
+B1704244549307N00633558EA0000002200
+B1704264549305N00633574EA0000002204
+B1704284549301N00633587EA0000002208
+B1704304549294N00633600EA0000002212
+B1704324549288N00633613EA0000002218
+B1704344549284N00633625EA0000002225
+B1704364549278N00633635EA0000002232
+B1704384549269N00633651EA0000002241
+B1704404549260N00633659EA0000002245
+B1704424549250N00633660EA0000002250
+B1704444549241N00633649EA0000002254
+B1704464549238N00633634EA0000002259
+B1704484549243N00633622EA0000002264
+B1704504549255N00633625EA0000002268
+B1704524549262N00633639EA0000002273
+B1704544549260N00633653EA0000002279
+B1704564549254N00633665EA0000002285
+B1704584549248N00633676EA0000002290
+B1705004549241N00633688EA0000002295
+B1705024549232N00633697EA0000002301
+B1705044549221N00633701EA0000002307
+B1705074549211N00633697EA0000002312
+B1705094549205N00633687EA0000002317
+B1705114549204N00633673EA0000002321
+B1705134549208N00633662EA0000002325
+B1705154549216N00633659EA0000002329
+B1705174549222N00633667EA0000002333
+B1705194549224N00633680EA0000002338
+B1705214549222N00633694EA0000002344
+B1705234549216N00633706EA0000002349
+B1705254549207N00633713EA0000002354
+B1705274549198N00633714EA0000002359
+B1705294549189N00633707EA0000002363
+B1705314549184N00633695EA0000002366
+B1705334549185N00633681EA0000002369
+B1705354549191N00633672EA0000002372
+B1705374549199N00633672EA0000002375
+B1705394549206N00633681EA0000002378
+B1705414549208N00633695EA0000002382
+B1705434549204N00633708EA0000002386
+B1705454549199N00633719EA0000002390
+B1705474549192N00633728EA0000002394
+B1705494549182N00633731EA0000002397
+B1705514549172N00633726EA0000002400
+B1705534549165N00633716EA0000002403
+B1705554549162N00633702EA0000002404
+B1705574549165N00633689EA0000002406
+B1705594549170N00633678EA0000002407
+B1706014549171N00633668EA0000002410
+B1706034549169N00633655EA0000002412
+B1706054549164N00633644EA0000002414
+B1706074549153N00633638EA0000002416
+B1706094549142N00633638EA0000002417
+B1706114549132N00633641EA0000002419
+B1706134549122N00633646EA0000002421
+B1706154549112N00633650EA0000002422
+B1706174549103N00633656EA0000002423
+B1706194549091N00633670EA0000002421
+B1706214549083N00633680EA0000002420
+B1706234549075N00633689EA0000002419
+B1706254549067N00633700EA0000002417
+B1706274549059N00633712EA0000002415
+B1706294549051N00633726EA0000002413
+B1706314549042N00633740EA0000002411
+B1706334549035N00633754EA0000002411
+B1706354549027N00633768EA0000002410
+B1706374549020N00633782EA0000002410
+B1706394549013N00633797EA0000002410
+B1706414549007N00633814EA0000002410
+B1706434549000N00633832EA0000002409
+B1706454548993N00633849EA0000002409
+B1706484548986N00633863EA0000002411
+B1706504548980N00633878EA0000002413
+B1706524548972N00633891EA0000002416
+B1706544548962N00633898EA0000002419
+B1706564548950N00633898EA0000002421
+B1706584548940N00633886EA0000002423
+B1707004548940N00633870EA0000002423
+B1707024548950N00633866EA0000002423
+B1707044548957N00633877EA0000002425
+B1707064548957N00633894EA0000002426
+B1707084548951N00633910EA0000002429
+B1707104548945N00633926EA0000002430
+B1707124548939N00633944EA0000002432
+B1707144548932N00633961EA0000002434
+B1707164548926N00633977EA0000002437
+B1707184548919N00633993EA0000002440
+B1707204548912N00634009EA0000002443
+B1707224548906N00634026EA0000002447
+B1707244548901N00634042EA0000002453
+B1707264548896N00634057EA0000002457
+B1707284548889N00634072EA0000002461
+B1707304548880N00634081EA0000002465
+B1707324548869N00634084EA0000002468
+B1707344548859N00634078EA0000002470
+B1707364548854N00634064EA0000002472
+B1707384548858N00634048EA0000002475
+B1707404548869N00634044EA0000002477
+B1707424548878N00634054EA0000002480
+B1707444548879N00634072EA0000002483
+B1707464548874N00634089EA0000002486
+B1707484548868N00634104EA0000002489
+B1707504548862N00634120EA0000002492
+B1707524548856N00634135EA0000002496
+B1707544548850N00634149EA0000002499
+B1707564548844N00634163EA0000002502
+B1707584548829N00634176EA0000002506
+B1708004548816N00634171EA0000002508
+B1708024548809N00634158EA0000002511
+B1708044548811N00634144EA0000002512
+B1708064548821N00634138EA0000002514
+B1708084548830N00634146EA0000002515
+B1708104548833N00634161EA0000002517
+B1708124548829N00634177EA0000002520
+B1708144548822N00634188EA0000002524
+B1708164548817N00634199EA0000002528
+B1708184548810N00634212EA0000002532
+B1708204548802N00634224EA0000002536
+B1708224548792N00634229EA0000002540
+B1708254548783N00634224EA0000002543
+B1708274548778N00634214EA0000002545
+B1708294548781N00634200EA0000002548
+B1708314548792N00634195EA0000002551
+B1708334548801N00634206EA0000002554
+B1708354548802N00634222EA0000002559
+B1708374548797N00634238EA0000002564
+B1708394548787N00634249EA0000002569
+B1708414548775N00634254EA0000002575
+B1708434548764N00634248EA0000002581
+B1708454548758N00634236EA0000002586
+B1708474548758N00634222EA0000002591
+B1708494548767N00634216EA0000002595
+B1708514548777N00634222EA0000002599
+B1708534548781N00634237EA0000002604
+B1708554548779N00634252EA0000002610
+B1708574548774N00634266EA0000002616
+B1708594548766N00634277EA0000002622
+B1709014548755N00634284EA0000002628
+B1709034548743N00634285EA0000002634
+B1709054548734N00634276EA0000002639
+B1709074548730N00634263EA0000002644
+B1709094548734N00634252EA0000002648
+B1709114548743N00634247EA0000002652
+B1709134548751N00634255EA0000002656
+B1709154548754N00634270EA0000002660
+B1709174548752N00634284EA0000002666
+B1709194548748N00634296EA0000002672
+B1709214548743N00634308EA0000002678
+B1709234548738N00634322EA0000002682
+B1709254548735N00634337EA0000002687
+B1709274548733N00634352EA0000002689
+B1709294548728N00634368EA0000002692
+B1709314548726N00634384EA0000002694
+B1709334548724N00634399EA0000002697
+B1709354548723N00634419EA0000002698
+B1709374548723N00634442EA0000002698
+B1709394548725N00634472EA0000002701
+B1709414548725N00634491EA0000002702
+B1709434548727N00634513EA0000002703
+B1709454548730N00634532EA0000002704
+B1709474548733N00634549EA0000002706
+B1709494548738N00634566EA0000002706
+B1709514548745N00634586EA0000002706
+B1709534548751N00634606EA0000002707
+B1709554548756N00634624EA0000002709
+B1709574548762N00634641EA0000002709
+B1709594548769N00634660EA0000002709
+B1710014548778N00634680EA0000002708
+B1710034548787N00634696EA0000002708
+B1710064548795N00634713EA0000002707
+B1710084548802N00634733EA0000002705
+B1710104548810N00634753EA0000002703
+B1710124548816N00634772EA0000002701
+B1710144548824N00634790EA0000002700
+B1710164548832N00634808EA0000002697
+B1710184548841N00634827EA0000002694
+B1710204548849N00634845EA0000002691
+B1710224548856N00634862EA0000002688
+B1710244548865N00634879EA0000002684
+B1710264548873N00634897EA0000002680
+B1710284548873N00634897EA0000002673
+B1710304548890N00634932EA0000002670
+B1710324548898N00634948EA0000002666
+B1710344548906N00634966EA0000002663
+B1710364548915N00634981EA0000002661
+B1710384548924N00634996EA0000002659
+B1710404548934N00635010EA0000002657
+B1710424548944N00635023EA0000002654
+B1710444548953N00635037EA0000002652
+B1710464548962N00635052EA0000002650
+B1710484548971N00635067EA0000002647
+B1710504548981N00635081EA0000002645
+B1710524548990N00635094EA0000002642
+B1710544549001N00635106EA0000002639
+B1710564549011N00635119EA0000002637
+B1710584549021N00635133EA0000002634
+B1711004549031N00635145EA0000002630
+B1711024549042N00635159EA0000002627
+B1711044549051N00635174EA0000002624
+B1711064549060N00635187EA0000002622
+B1711084549070N00635200EA0000002619
+B1711104549080N00635214EA0000002615
+B1711124549090N00635229EA0000002613
+B1711144549099N00635243EA0000002611
+B1711164549107N00635258EA0000002607
+B1711184549118N00635285EA0000002604
+B1711204549127N00635300EA0000002601
+B1711224549135N00635315EA0000002598
+B1711244549144N00635329EA0000002595
+B1711264549154N00635343EA0000002591
+B1711284549163N00635357EA0000002588
+B1711304549171N00635373EA0000002584
+B1711324549180N00635388EA0000002580
+B1711344549189N00635405EA0000002577
+B1711364549196N00635421EA0000002574
+B1711384549205N00635436EA0000002571
+B1711404549213N00635451EA0000002568
+B1711424549220N00635469EA0000002564
+B1711444549224N00635488EA0000002561
+B1711474549228N00635507EA0000002558
+B1711494549231N00635527EA0000002555
+B1711514549233N00635547EA0000002552
+B1711534549234N00635567EA0000002549
+B1711554549236N00635587EA0000002546
+B1711574549238N00635608EA0000002543
+B1711594549240N00635628EA0000002540
+B1712014549241N00635649EA0000002537
+B1712034549243N00635669EA0000002534
+B1712054549244N00635679EA0000002532
+B1712074549248N00635708EA0000002530
+B1712094549252N00635726EA0000002527
+B1712114549255N00635744EA0000002524
+B1712134549258N00635763EA0000002521
+B1712154549262N00635782EA0000002518
+B1712174549266N00635800EA0000002515
+B1712194549269N00635819EA0000002512
+B1712214549273N00635838EA0000002508
+B1712234549277N00635857EA0000002506
+B1712254549283N00635874EA0000002503
+B1712274549290N00635890EA0000002500
+B1712294549297N00635907EA0000002497
+B1712314549304N00635923EA0000002495
+B1712334549311N00635939EA0000002491
+B1712354549318N00635955EA0000002487
+B1712374549325N00635972EA0000002484
+B1712394549333N00635986EA0000002481
+B1712414549343N00635999EA0000002478
+B1712434549352N00636012EA0000002475
+B1712454549363N00636024EA0000002471
+B1712474549373N00636036EA0000002468
+B1712494549383N00636051EA0000002465
+B1712514549392N00636066EA0000002463
+B1712534549402N00636080EA0000002461
+B1712554549412N00636094EA0000002458
+B1712574549423N00636106EA0000002454
+B1712594549440N00636126EA0000002451
+B1713014549448N00636140EA0000002448
+B1713034549456N00636154EA0000002445
+B1713054549466N00636168EA0000002442
+B1713074549476N00636181EA0000002440
+B1713094549485N00636195EA0000002437
+B1713114549493N00636210EA0000002434
+B1713134549502N00636225EA0000002431
+B1713154549510N00636241EA0000002428
+B1713174549518N00636257EA0000002425
+B1713194549527N00636271EA0000002421
+B1713214549537N00636285EA0000002418
+B1713234549546N00636299EA0000002414
+B1713254549556N00636313EA0000002411
+B1713284549565N00636326EA0000002407
+B1713304549575N00636339EA0000002404
+B1713324549584N00636355EA0000002401
+B1713344549591N00636372EA0000002397
+B1713364549598N00636389EA0000002394
+B1713384549604N00636408EA0000002390
+B1713404549609N00636427EA0000002387
+B1713424549612N00636436EA0000002384
+B1713444549622N00636462EA0000002381
+B1713464549628N00636481EA0000002378
+B1713484549635N00636499EA0000002375
+B1713504549641N00636518EA0000002373
+B1713524549645N00636538EA0000002370
+B1713544549651N00636557EA0000002368
+B1713564549657N00636575EA0000002365
+B1713584549663N00636594EA0000002362
+B1714004549669N00636613EA0000002360
+B1714024549675N00636631EA0000002357
+B1714044549680N00636651EA0000002354
+B1714064549686N00636670EA0000002351
+B1714084549693N00636688EA0000002348
+B1714104549700N00636707EA0000002346
+B1714124549706N00636726EA0000002343
+B1714144549713N00636745EA0000002341
+B1714164549719N00636763EA0000002339
+B1714184549726N00636782EA0000002337
+B1714204549733N00636801EA0000002334
+B1714224549739N00636820EA0000002332
+B1714244549746N00636839EA0000002329
+B1714264549753N00636858EA0000002327
+B1714284549760N00636876EA0000002325
+B1714304549767N00636895EA0000002323
+B1714324549774N00636913EA0000002321
+B1714344549781N00636931EA0000002319
+B1714364549789N00636948EA0000002317
+B1714384549796N00636967EA0000002314
+B1714404549807N00636994EA0000002311
+B1714424549815N00637012EA0000002308
+B1714444549823N00637029EA0000002305
+B1714464549831N00637047EA0000002303
+B1714484549840N00637065EA0000002300
+B1714504549849N00637081EA0000002299
+B1714524549857N00637098EA0000002296
+B1714544549865N00637115EA0000002294
+B1714564549873N00637132EA0000002292
+B1714584549881N00637148EA0000002289
+B1715004549888N00637165EA0000002287
+B1715024549896N00637181EA0000002284
+B1715044549903N00637199EA0000002281
+B1715064549910N00637216EA0000002278
+B1715094549917N00637233EA0000002274
+B1715114549925N00637250EA0000002271
+B1715134549933N00637267EA0000002268
+B1715154549940N00637284EA0000002265
+B1715174549949N00637300EA0000002262
+B1715194549953N00637308EA0000002258
+B1715214549966N00637332EA0000002255
+B1715234549974N00637348EA0000002253
+B1715254549983N00637365EA0000002250
+B1715274549990N00637382EA0000002248
+B1715294549999N00637397EA0000002246
+B1715314550008N00637412EA0000002243
+B1715334550016N00637428EA0000002241
+B1715354550025N00637444EA0000002239
+B1715374550033N00637460EA0000002237
+B1715394550041N00637476EA0000002234
+B1715414550048N00637494EA0000002232
+B1715434550055N00637512EA0000002230
+B1715454550062N00637529EA0000002229
+B1715474550069N00637546EA0000002227
+B1715494550075N00637563EA0000002225
+B1715514550082N00637581EA0000002222
+B1715534550087N00637599EA0000002220
+B1715554550093N00637618EA0000002217
+B1715574550098N00637637EA0000002215
+B1715594550103N00637655EA0000002213
+B1716014550109N00637673EA0000002211
+B1716034550115N00637691EA0000002208
+B1716054550122N00637710EA0000002206
+B1716074550128N00637727EA0000002204
+B1716094550134N00637746EA0000002200
+B1716114550139N00637765EA0000002197
+B1716134550146N00637783EA0000002194
+B1716154550152N00637802EA0000002191
+B1716174550158N00637820EA0000002188
+B1716194550164N00637837EA0000002185
+B1716214550172N00637864EA0000002180
+B1716234550178N00637883EA0000002177
+B1716254550183N00637902EA0000002175
+B1716274550189N00637921EA0000002174
+B1716294550194N00637939EA0000002172
+B1716314550200N00637957EA0000002170
+B1716334550206N00637975EA0000002168
+B1716354550212N00637993EA0000002165
+B1716374550219N00638012EA0000002163
+B1716394550227N00638029EA0000002162
+B1716414550234N00638046EA0000002160
+B1716434550240N00638064EA0000002157
+B1716454550246N00638083EA0000002156
+B1716484550253N00638099EA0000002154
+B1716504550260N00638115EA0000002152
+B1716524550267N00638133EA0000002150
+B1716544550275N00638150EA0000002148
+B1716564550280N00638158EA0000002146
+B1716584550292N00638182EA0000002142
+B1717004550300N00638201EA0000002138
+B1717024550306N00638220EA0000002136
+B1717044550312N00638238EA0000002132
+B1717064550319N00638257EA0000002128
+B1717084550327N00638275EA0000002126
+B1717104550334N00638290EA0000002123
+B1717124550341N00638307EA0000002119
+B1717144550348N00638324EA0000002114
+B1717164550354N00638343EA0000002111
+B1717184550359N00638362EA0000002109
+B1717204550365N00638381EA0000002106
+B1717224550369N00638400EA0000002102
+B1717244550374N00638419EA0000002099
+B1717264550379N00638437EA0000002096
+B1717284550386N00638456EA0000002093
+B1717304550392N00638473EA0000002091
+B1717324550397N00638491EA0000002088
+B1717344550402N00638508EA0000002085
+B1717364550407N00638527EA0000002081
+B1717384550413N00638545EA0000002078
+B1717404550419N00638564EA0000002074
+B1717424550424N00638582EA0000002072
+B1717444550430N00638600EA0000002069
+B1717464550435N00638619EA0000002066
+B1717484550439N00638639EA0000002063
+B1717504550441N00638659EA0000002061
+B1717524550444N00638679EA0000002059
+B1717544550446N00638698EA0000002056
+B1717564550449N00638718EA0000002053
+B1717584550452N00638739EA0000002049
+B1718004550456N00638760EA0000002047
+B1718024550460N00638790EA0000002043
+B1718044550463N00638810EA0000002040
+B1718064550464N00638832EA0000002037
+B1718084550467N00638852EA0000002036
+B1718104550469N00638872EA0000002034
+B1718124550471N00638893EA0000002031
+B1718144550473N00638916EA0000002030
+B1718164550476N00638937EA0000002028
+B1718184550478N00638959EA0000002025
+B1718204550480N00638980EA0000002022
+B1718224550482N00639002EA0000002019
+B1718244550486N00639024EA0000002017
+B1718264550490N00639045EA0000002015
+B1718294550494N00639065EA0000002012
+B1718314550498N00639087EA0000002009
+B1718334550502N00639109EA0000002007
+B1718354550505N00639131EA0000002006
+B1718374550506N00639152EA0000002005
+B1718394550508N00639170EA0000002004
+B1718414550510N00639189EA0000002003
+B1718434550513N00639208EA0000002002
+B1718454550516N00639226EA0000002003
+B1718474550518N00639241EA0000002004
+B1718494550520N00639256EA0000002004
+B1718514550521N00639270EA0000002004
+B1718534550521N00639284EA0000002003
+B1718554550520N00639299EA0000002002
+B1718574550520N00639315EA0000002001
+B1718594550519N00639330EA0000002000
+B1719014550519N00639346EA0000001998
+B1719034550518N00639364EA0000001996
+B1719054550517N00639381EA0000001995
+B1719074550516N00639398EA0000001993
+B1719094550515N00639416EA0000001990
+B1719114550514N00639435EA0000001989
+B1719134550515N00639453EA0000001987
+B1719154550516N00639471EA0000001985
+B1719174550517N00639489EA0000001984
+B1719194550518N00639506EA0000001983
+B1719214550519N00639523EA0000001981
+B1719234550520N00639542EA0000001981
+B1719254550520N00639560EA0000001982
+B1719274550520N00639575EA0000001983
+B1719294550519N00639592EA0000001982
+B1719314550518N00639611EA0000001983
+B1719334550518N00639627EA0000001983
+B1719354550518N00639643EA0000001981
+B1719374550518N00639662EA0000001981
+B1719394550519N00639680EA0000001981
+B1719414550521N00639704EA0000001981
+B1719434550522N00639722EA0000001980
+B1719454550523N00639740EA0000001981
+B1719474550525N00639755EA0000001982
+B1719494550527N00639770EA0000001982
+B1719514550529N00639787EA0000001983
+B1719534550530N00639802EA0000001985
+B1719554550531N00639815EA0000001987
+B1719574550536N00639821EA0000001987
+B1719594550542N00639820EA0000001988
+B1720014550545N00639813EA0000001989
+B1720034550544N00639801EA0000001989
+B1720054550538N00639788EA0000001989
+B1720074550523N00639781EA0000001990
+B1720104550510N00639788EA0000001990
+B1720124550501N00639801EA0000001991
+B1720144550498N00639817EA0000001992
+B1720164550498N00639832EA0000001994
+B1720184550499N00639847EA0000001994
+B1720204550501N00639861EA0000001995
+B1720224550504N00639874EA0000001996
+B1720244550509N00639886EA0000001997
+B1720264550514N00639897EA0000001997
+B1720284550518N00639910EA0000001998
+B1720304550522N00639923EA0000001998
+B1720324550526N00639936EA0000001997
+B1720344550531N00639949EA0000001996
+B1720364550537N00639960EA0000001996
+B1720384550542N00639973EA0000001996
+B1720404550547N00639985EA0000001995
+B1720424550552N00639998EA0000001995
+B1720444550558N00640010EA0000001995
+B1720464550564N00640019EA0000001994
+B1720484550571N00640029EA0000001993
+B1720504550577N00640043EA0000001992
+B1720524550582N00640056EA0000001992
+B1720544550588N00640067EA0000001992
+B1720564550594N00640079EA0000001991
+B1720584550600N00640089EA0000001991
+B1721004550607N00640100EA0000001990
+B1721024550614N00640110EA0000001988
+B1721044550622N00640121EA0000001987
+B1721064550631N00640131EA0000001987
+B1721084550638N00640142EA0000001986
+B1721104550646N00640153EA0000001984
+B1721124550656N00640163EA0000001983
+B1721144550665N00640173EA0000001982
+B1721164550673N00640184EA0000001980
+B1721184550683N00640193EA0000001977
+B1721204550697N00640207EA0000001976
+B1721224550706N00640217EA0000001974
+B1721244550715N00640227EA0000001972
+B1721264550724N00640238EA0000001970
+B1721284550732N00640252EA0000001969
+B1721304550740N00640264EA0000001968
+B1721324550748N00640276EA0000001966
+B1721344550756N00640290EA0000001964
+B1721364550765N00640301EA0000001963
+B1721384550774N00640308EA0000001962
+B1721404550783N00640316EA0000001960
+B1721424550792N00640327EA0000001958
+B1721444550800N00640338EA0000001958
+B1721464550809N00640349EA0000001957
+B1721494550817N00640361EA0000001956
+B1721514550826N00640373EA0000001956
+B1721534550833N00640386EA0000001956
+B1721554550841N00640398EA0000001955
+B1721574550850N00640409EA0000001955
+B1721594550858N00640422EA0000001955
+B1722014550866N00640436EA0000001956
+B1722034550874N00640450EA0000001957
+B1722054550881N00640464EA0000001957
+B1722074550888N00640479EA0000001957
+B1722094550888N00640479EA0000001956
+B1722114550904N00640509EA0000001956
+B1722134550910N00640525EA0000001957
+B1722154550916N00640545EA0000001957
+B1722174550922N00640563EA0000001958
+B1722194550927N00640580EA0000001958
+B1722214550932N00640599EA0000001957
+B1722234550939N00640619EA0000001956
+B1722254550946N00640637EA0000001955
+B1722274550952N00640653EA0000001954
+B1722294550958N00640669EA0000001953
+B1722314550967N00640684EA0000001952
+B1722334550977N00640698EA0000001949
+B1722354550985N00640712EA0000001946
+B1722374550994N00640728EA0000001942
+B1722394551003N00640743EA0000001938
+B1722414551012N00640759EA0000001935
+B1722434551020N00640774EA0000001932
+B1722454551028N00640788EA0000001928
+B1722474551037N00640802EA0000001925
+B1722494551045N00640813EA0000001921
+B1722514551055N00640825EA0000001917
+B1722534551064N00640838EA0000001913
+B1722554551072N00640851EA0000001909
+B1722574551080N00640865EA0000001906
+B1722594551087N00640881EA0000001902
+B1723014551099N00640903EA0000001897
+B1723034551108N00640917EA0000001894
+B1723054551116N00640932EA0000001891
+B1723074551124N00640945EA0000001888
+B1723094551133N00640959EA0000001884
+B1723114551142N00640974EA0000001880
+B1723134551150N00640988EA0000001877
+B1723154551158N00641002EA0000001874
+B1723174551167N00641016EA0000001870
+B1723194551175N00641030EA0000001866
+B1723214551184N00641043EA0000001863
+B1723234551192N00641056EA0000001860
+B1723254551202N00641069EA0000001856
+B1723284551210N00641083EA0000001854
+B1723304551219N00641098EA0000001851
+B1723324551227N00641111EA0000001849
+B1723344551236N00641124EA0000001847
+B1723364551245N00641137EA0000001845
+B1723384551254N00641150EA0000001843
+B1723404551263N00641162EA0000001841
+B1723424551273N00641175EA0000001839
+B1723444551282N00641187EA0000001837
+B1723464551291N00641200EA0000001834
+B1723484551300N00641214EA0000001831
+B1723504551309N00641227EA0000001828
+B1723524551318N00641240EA0000001826
+B1723544551327N00641253EA0000001823
+B1723564551336N00641266EA0000001819
+B1723584551346N00641280EA0000001817
+B1724004551355N00641294EA0000001814
+B1724024551364N00641307EA0000001812
+B1724044551373N00641320EA0000001809
+B1724064551383N00641332EA0000001807
+B1724084551392N00641344EA0000001805
+B1724104551401N00641357EA0000001803
+B1724124551410N00641371EA0000001801
+B1724144551418N00641386EA0000001799
+B1724164551426N00641403EA0000001796
+B1724184551435N00641421EA0000001793
+B1724204551443N00641438EA0000001791
+B1724224551450N00641455EA0000001789
+B1724244551458N00641474EA0000001787
+B1724264551466N00641493EA0000001786
+B1724284551473N00641511EA0000001785
+B1724304551480N00641530EA0000001784
+B1724324551487N00641547EA0000001782
+B1724344551494N00641565EA0000001781
+B1724364551502N00641581EA0000001780
+B1724384551509N00641596EA0000001778
+B1724404551517N00641612EA0000001776
+B1724424551530N00641641EA0000001773
+B1724444551537N00641657EA0000001772
+B1724464551545N00641673EA0000001771
+B1724484551551N00641687EA0000001771
+B1724504551558N00641700EA0000001770
+B1724524551566N00641713EA0000001769
+B1724544551574N00641729EA0000001766
+B1724564551583N00641744EA0000001764
+B1724584551592N00641758EA0000001762
+B1725004551600N00641772EA0000001760
+B1725024551609N00641787EA0000001757
+B1725044551619N00641802EA0000001755
+B1725064551628N00641818EA0000001753
+B1725094551637N00641832EA0000001751
+B1725114551647N00641846EA0000001749
+B1725134551657N00641861EA0000001746
+B1725154551667N00641876EA0000001746
+B1725174551676N00641888EA0000001746
+B1725194551685N00641898EA0000001745
+B1725214551696N00641911EA0000001742
+B1725234551705N00641926EA0000001741
+B1725254551714N00641940EA0000001739
+B1725274551724N00641953EA0000001736
+B1725294551735N00641967EA0000001735
+B1725314551745N00641982EA0000001734
+B1725334551755N00641995EA0000001733
+B1725354551765N00642009EA0000001732
+B1725374551776N00642023EA0000001731
+B1725394551786N00642036EA0000001731
+B1725414551797N00642047EA0000001730
+B1725434551807N00642058EA0000001728
+B1725454551818N00642069EA0000001726
+B1725474551830N00642079EA0000001723
+B1725494551841N00642090EA0000001722
+B1725514551851N00642101EA0000001721
+B1725534551860N00642114EA0000001719
+B1725554551871N00642126EA0000001718
+B1725574551881N00642138EA0000001717
+B1725594551890N00642149EA0000001716
+B1726014551900N00642161EA0000001713
+B1726034551911N00642174EA0000001710
+B1726054551922N00642187EA0000001709
+B1726074551933N00642199EA0000001706
+B1726094551944N00642211EA0000001703
+B1726114551955N00642224EA0000001700
+B1726134551966N00642235EA0000001699
+B1726154551976N00642248EA0000001697
+B1726174551986N00642262EA0000001695
+B1726194551997N00642273EA0000001693
+B1726214552007N00642285EA0000001692
+B1726234552021N00642307EA0000001689
+B1726254552031N00642319EA0000001687
+B1726274552041N00642331EA0000001685
+B1726294552052N00642343EA0000001683
+B1726314552063N00642354EA0000001681
+B1726334552075N00642363EA0000001679
+B1726354552086N00642373EA0000001678
+B1726374552098N00642382EA0000001676
+B1726394552110N00642391EA0000001675
+B1726414552121N00642401EA0000001673
+B1726434552133N00642412EA0000001670
+B1726454552145N00642422EA0000001669
+B1726474552156N00642432EA0000001668
+B1726504552167N00642444EA0000001666
+B1726524552179N00642456EA0000001664
+B1726544552190N00642467EA0000001662
+B1726564552202N00642476EA0000001661
+B1726584552214N00642485EA0000001660
+B1727004552225N00642492EA0000001658
+B1727024552237N00642500EA0000001656
+B1727044552249N00642510EA0000001654
+B1727064552260N00642521EA0000001653
+B1727084552271N00642532EA0000001653
+B1727104552282N00642543EA0000001651
+B1727124552282N00642543EA0000001649
+B1727144552303N00642568EA0000001648
+B1727164552313N00642581EA0000001647
+B1727184552323N00642594EA0000001646
+B1727204552333N00642609EA0000001644
+B1727224552343N00642625EA0000001642
+B1727244552354N00642639EA0000001641
+B1727264552364N00642650EA0000001640
+B1727284552375N00642661EA0000001637
+B1727304552387N00642672EA0000001636
+B1727324552399N00642682EA0000001635
+B1727344552409N00642693EA0000001633
+B1727364552420N00642704EA0000001632
+B1727384552431N00642717EA0000001631
+B1727404552440N00642730EA0000001631
+B1727424552450N00642742EA0000001632
+B1727444552459N00642754EA0000001633
+B1727464552466N00642766EA0000001635
+B1727484552473N00642777EA0000001635
+B1727504552481N00642788EA0000001634
+B1727524552489N00642800EA0000001635
+B1727544552496N00642813EA0000001635
+B1727564552504N00642825EA0000001636
+B1727584552512N00642837EA0000001636
+B1728004552519N00642848EA0000001636
+B1728024552533N00642866EA0000001635
+B1728044552542N00642877EA0000001635
+B1728064552551N00642888EA0000001635
+B1728084552560N00642899EA0000001636
+B1728104552569N00642910EA0000001636
+B1728124552577N00642923EA0000001637
+B1728144552583N00642935EA0000001638
+B1728164552589N00642948EA0000001638
+B1728184552596N00642962EA0000001637
+B1728204552603N00642977EA0000001636
+B1728224552610N00642992EA0000001634
+B1728244552619N00643005EA0000001633
+B1728264552628N00643019EA0000001632
+B1728284552638N00643030EA0000001631
+B1728314552647N00643043EA0000001630
+B1728334552657N00643056EA0000001629
+B1728354552667N00643069EA0000001629
+B1728374552676N00643082EA0000001629
+B1728394552685N00643096EA0000001628
+B1728414552694N00643109EA0000001628
+B1728434552704N00643121EA0000001627
+B1728454552714N00643132EA0000001627
+B1728474552724N00643144EA0000001626
+B1728494552733N00643155EA0000001626
+B1728514552744N00643165EA0000001626
+B1728534552754N00643178EA0000001627
+B1728554552764N00643189EA0000001629
+B1728574552772N00643199EA0000001629
+B1728594552782N00643209EA0000001628
+B1729014552793N00643220EA0000001628
+B1729034552803N00643229EA0000001630
+B1729054552813N00643239EA0000001631
+B1729074552823N00643252EA0000001633
+B1729094552833N00643265EA0000001634
+B1729114552841N00643278EA0000001637
+B1729134552846N00643290EA0000001640
+B1729154552853N00643301EA0000001642
+B1729174552858N00643310EA0000001644
+B1729194552864N00643318EA0000001646
+B1729214552870N00643328EA0000001647
+B1729234552875N00643338EA0000001650
+B1729254552880N00643346EA0000001652
+B1729274552885N00643356EA0000001653
+B1729294552890N00643367EA0000001654
+B1729314552896N00643376EA0000001657
+B1729334552901N00643386EA0000001660
+B1729354552906N00643397EA0000001661
+B1729374552911N00643410EA0000001663
+B1729394552918N00643422EA0000001665
+B1729414552924N00643434EA0000001667
+B1729434552934N00643453EA0000001670
+B1729454552941N00643466EA0000001673
+B1729474552947N00643478EA0000001677
+B1729494552953N00643489EA0000001680
+B1729514552958N00643502EA0000001681
+B1729534552964N00643516EA0000001682
+B1729554552970N00643527EA0000001684
+B1729574552975N00643532EA0000001684
+B1729594552980N00643532EA0000001685
+B1730014552982N00643529EA0000001685
+B1730034552981N00643522EA0000001685
+B1730054552974N00643516EA0000001685
+B1730084552963N00643515EA0000001686
+B1730104552951N00643521EA0000001686
+B1730124552941N00643537EA0000001686
+B1730144552936N00643555EA0000001687
+B1730164552934N00643574EA0000001687
+B1730184552933N00643593EA0000001688
+B1730204552932N00643612EA0000001690
+B1730224552932N00643631EA0000001692
+B1730244552932N00643650EA0000001695
+B1730264552932N00643669EA0000001698
+B1730284552934N00643686EA0000001699
+B1730304552940N00643700EA0000001701
+B1730324552947N00643708EA0000001703
+B1730344552951N00643706EA0000001706
+B1730364552950N00643700EA0000001709
+B1730384552946N00643695EA0000001712
+B1730404552936N00643693EA0000001714
+B1730424552923N00643700EA0000001714
+B1730444552913N00643718EA0000001716
+B1730464552909N00643739EA0000001717
+B1730484552911N00643758EA0000001719
+B1730504552917N00643773EA0000001722
+B1730524552922N00643785EA0000001725
+B1730544552928N00643793EA0000001728
+B1730564552934N00643799EA0000001731
+B1730584552940N00643793EA0000001733
+B1731004552936N00643782EA0000001736
+B1731024552928N00643779EA0000001739
+B1731044552917N00643782EA0000001740
+B1731064552904N00643794EA0000001741
+B1731084552896N00643817EA0000001743
+B1731104552896N00643839EA0000001745
+B1731124552901N00643855EA0000001748
+B1731144552907N00643866EA0000001751
+B1731164552915N00643875EA0000001754
+B1731184552922N00643879EA0000001755
+B1731204552933N00643871EA0000001757
+B1731224552935N00643864EA0000001759
+B1731244552932N00643856EA0000001760
+B1731264552922N00643851EA0000001761
+B1731284552911N00643861EA0000001761
+B1731304552903N00643881EA0000001761
+B1731324552899N00643902EA0000001762
+B1731344552901N00643920EA0000001765
+B1731364552906N00643932EA0000001766
+B1731384552911N00643940EA0000001766
+B1731404552919N00643943EA0000001764
+B1731424552929N00643944EA0000001763
+B1731444552938N00643951EA0000001762
+B1731474552948N00643960EA0000001763
+B1731494552957N00643966EA0000001766
+B1731514552965N00643970EA0000001769
+B1731534552973N00643973EA0000001771
+B1731554552979N00643971EA0000001772
+B1731574552982N00643966EA0000001773
+B1731594552984N00643962EA0000001772
+B1732014552990N00643962EA0000001771
+B1732034553002N00643970EA0000001770
+B1732054553011N00643982EA0000001772
+B1732074553019N00643992EA0000001771
+B1732094553028N00644004EA0000001771
+B1732114553037N00644017EA0000001773
+B1732134553045N00644028EA0000001774
+B1732154553055N00644038EA0000001773
+B1732174553065N00644049EA0000001774
+B1732194553074N00644057EA0000001775
+B1732214553083N00644063EA0000001776
+B1732234553093N00644070EA0000001776
+B1732254553102N00644075EA0000001776
+B1732274553110N00644079EA0000001776
+B1732294553120N00644085EA0000001774
+B1732314553131N00644093EA0000001773
+B1732334553141N00644099EA0000001772
+B1732354553152N00644103EA0000001769
+B1732374553164N00644109EA0000001767
+B1732394553175N00644115EA0000001765
+B1732414553186N00644120EA0000001762
+B1732434553198N00644126EA0000001759
+B1732454553210N00644136EA0000001757
+B1732474553221N00644145EA0000001756
+B1732494553231N00644153EA0000001756
+B1732514553241N00644162EA0000001755
+B1732534553252N00644168EA0000001753
+B1732554553262N00644172EA0000001751
+B1732574553273N00644175EA0000001749
+B1732594553285N00644175EA0000001746
+B1733014553303N00644175EA0000001744
+B1733034553314N00644177EA0000001743
+B1733054553325N00644177EA0000001743
+B1733074553335N00644177EA0000001742
+B1733094553346N00644177EA0000001741
+B1733114553356N00644178EA0000001739
+B1733134553368N00644180EA0000001737
+B1733154553380N00644185EA0000001735
+B1733174553391N00644190EA0000001734
+B1733194553403N00644193EA0000001734
+B1733214553414N00644198EA0000001733
+B1733234553424N00644201EA0000001732
+B1733254553437N00644203EA0000001729
+B1733284553448N00644209EA0000001728
+B1733304553458N00644215EA0000001726
+B1733324553469N00644222EA0000001723
+B1733344553480N00644229EA0000001720
+B1733364553491N00644235EA0000001717
+B1733384553502N00644239EA0000001715
+B1733404553514N00644240EA0000001713
+B1733424553526N00644240EA0000001711
+B1733444553539N00644242EA0000001709
+B1733464553551N00644246EA0000001706
+B1733484553563N00644247EA0000001704
+B1733504553577N00644245EA0000001700
+B1733524553590N00644246EA0000001697
+B1733544553602N00644247EA0000001695
+B1733564553615N00644246EA0000001692
+B1733584553628N00644249EA0000001689
+B1734004553641N00644251EA0000001687
+B1734024553654N00644251EA0000001683
+B1734044553668N00644251EA0000001680
+B1734064553683N00644254EA0000001677
+B1734084553693N00644256EA0000001675
+B1734104553705N00644257EA0000001673
+B1734124553719N00644261EA0000001670
+B1734144553732N00644266EA0000001669
+B1734164553743N00644268EA0000001668
+B1734184553755N00644272EA0000001667
+B1734204553767N00644276EA0000001666
+B1734224553779N00644279EA0000001666
+B1734244553791N00644280EA0000001667
+B1734264553804N00644283EA0000001667
+B1734284553816N00644284EA0000001668
+B1734304553828N00644283EA0000001668
+B1734324553842N00644284EA0000001669
+B1734344553854N00644284EA0000001671
+B1734364553867N00644283EA0000001672
+B1734384553880N00644283EA0000001673
+B1734404553899N00644289EA0000001675
+B1734424553910N00644298EA0000001677
+B1734444553920N00644305EA0000001678
+B1734464553930N00644307EA0000001678
+B1734484553942N00644306EA0000001676
+B1734504553955N00644309EA0000001675
+B1734524553968N00644312EA0000001673
+B1734544553981N00644312EA0000001671
+B1734564553994N00644312EA0000001669
+B1734584554008N00644312EA0000001667
+B1735004554021N00644311EA0000001666
+B1735024554035N00644309EA0000001665
+B1735044554049N00644309EA0000001664
+B1735074554062N00644308EA0000001663
+B1735094554075N00644306EA0000001662
+B1735114554088N00644305EA0000001661
+B1735134554101N00644304EA0000001660
+B1735154554113N00644302EA0000001659
+B1735174554125N00644301EA0000001658
+B1735194554139N00644300EA0000001659
+B1735214554152N00644297EA0000001660
+B1735234554166N00644296EA0000001660
+B1735254554180N00644296EA0000001659
+B1735274554194N00644295EA0000001657
+B1735294554208N00644294EA0000001657
+B1735314554223N00644294EA0000001657
+B1735334554236N00644293EA0000001659
+B1735354554249N00644291EA0000001659
+B1735374554263N00644290EA0000001659
+B1735394554276N00644291EA0000001660
+B1735414554289N00644291EA0000001661
+B1735434554302N00644291EA0000001660
+B1735454554316N00644291EA0000001660
+B1735474554330N00644291EA0000001659
+B1735494554343N00644291EA0000001658
+B1735514554357N00644291EA0000001657
+B1735534554371N00644292EA0000001654
+B1735554554386N00644293EA0000001651
+B1735574554400N00644294EA0000001649
+B1735594554415N00644295EA0000001647
+B1736014554429N00644296EA0000001645
+B1736034554444N00644297EA0000001643
+B1736054554458N00644297EA0000001641
+B1736074554473N00644297EA0000001639
+B1736094554488N00644297EA0000001638
+B1736114554502N00644296EA0000001636
+B1736134554516N00644295EA0000001633
+B1736154554532N00644294EA0000001631
+B1736174554546N00644295EA0000001628
+B1736194554569N00644297EA0000001624
+B1736214554584N00644298EA0000001621
+B1736234554599N00644299EA0000001617
+B1736254554614N00644302EA0000001614
+B1736274554629N00644305EA0000001612
+B1736294554644N00644306EA0000001608
+B1736314554658N00644305EA0000001603
+B1736334554674N00644307EA0000001599
+B1736354554690N00644308EA0000001595
+B1736374554705N00644308EA0000001591
+B1736394554720N00644307EA0000001586
+B1736414554736N00644308EA0000001581
+B1736434554751N00644309EA0000001578
+B1736454554765N00644310EA0000001575
+B1736484554779N00644310EA0000001570
+B1736504554795N00644312EA0000001566
+B1736524554809N00644315EA0000001564
+B1736544554823N00644317EA0000001560
+B1736564554837N00644320EA0000001556
+B1736584554852N00644323EA0000001552
+B1737004554866N00644327EA0000001548
+B1737024554881N00644332EA0000001543
+B1737044554895N00644337EA0000001539
+B1737064554909N00644342EA0000001535
+B1737084554923N00644347EA0000001531
+B1737104554938N00644351EA0000001527
+B1737124554953N00644353EA0000001524
+B1737144554968N00644356EA0000001521
+B1737164554982N00644362EA0000001518
+B1737184554995N00644370EA0000001517
+B1737204555008N00644376EA0000001517
+B1737224555021N00644379EA0000001517
+B1737244555034N00644384EA0000001517
+B1737264555046N00644389EA0000001515
+B1737284555059N00644391EA0000001512
+B1737304555073N00644390EA0000001511
+B1737324555084N00644389EA0000001511
+B1737344555094N00644389EA0000001511
+B1737364555104N00644392EA0000001512
+B1737384555114N00644396EA0000001514
+B1737404555123N00644398EA0000001514
+B1737424555133N00644401EA0000001513
+B1737444555143N00644407EA0000001511
+B1737464555153N00644414EA0000001510
+B1737484555164N00644422EA0000001510
+B1737504555174N00644430EA0000001511
+B1737524555184N00644435EA0000001512
+B1737544555194N00644440EA0000001513
+B1737564555199N00644444EA0000001512
+B1737584555212N00644459EA0000001512
+B1738004555227N00644476EA0000001511
+B1738024555235N00644490EA0000001509
+B1738044555243N00644503EA0000001507
+B1738064555253N00644513EA0000001504
+B1738084555263N00644521EA0000001501
+B1738104555273N00644529EA0000001498
+B1738124555282N00644541EA0000001493
+B1738144555291N00644552EA0000001489
+B1738164555300N00644561EA0000001486
+B1738184555308N00644571EA0000001482
+B1738204555316N00644581EA0000001478
+B1738224555325N00644592EA0000001476
+B1738244555333N00644603EA0000001474
+B1738264555341N00644613EA0000001471
+B1738294555349N00644623EA0000001470
+B1738314555356N00644633EA0000001469
+B1738334555363N00644642EA0000001466
+B1738354555370N00644653EA0000001463
+B1738374555378N00644664EA0000001462
+B1738394555384N00644675EA0000001459
+B1738414555391N00644687EA0000001456
+B1738434555399N00644699EA0000001454
+B1738454555407N00644712EA0000001452
+B1738474555415N00644724EA0000001448
+B1738494555424N00644737EA0000001443
+B1738514555433N00644752EA0000001438
+B1738534555441N00644768EA0000001434
+B1738554555449N00644783EA0000001430
+B1738574555457N00644800EA0000001426
+B1738594555463N00644818EA0000001423
+B1739014555470N00644834EA0000001420
+B1739034555476N00644851EA0000001417
+B1739054555482N00644867EA0000001412
+B1739074555490N00644883EA0000001408
+B1739094555498N00644899EA0000001405
+B1739114555506N00644915EA0000001402
+B1739134555513N00644929EA0000001398
+B1739154555522N00644944EA0000001393
+B1739174555531N00644960EA0000001390
+B1739194555536N00644975EA0000001387
+B1739214555542N00644990EA0000001383
+B1739234555549N00645006EA0000001378
+B1739254555555N00645024EA0000001374
+B1739274555560N00645042EA0000001370
+B1739294555565N00645059EA0000001365
+B1739314555569N00645077EA0000001361
+B1739334555573N00645094EA0000001358
+B1739354555578N00645108EA0000001353
+B1739374555583N00645125EA0000001347
+B1739394555587N00645143EA0000001344
+B1739414555595N00645163EA0000001337
+B1739434555600N00645178EA0000001332
+B1739454555607N00645194EA0000001328
+B1739474555613N00645208EA0000001324
+B1739494555618N00645222EA0000001319
+B1739514555624N00645237EA0000001314
+B1739534555631N00645252EA0000001311
+B1739554555634N00645265EA0000001308
+B1739574555638N00645277EA0000001303
+B1739594555643N00645290EA0000001298
+B1740014555647N00645303EA0000001295
+B1740034555651N00645315EA0000001290
+B1740054555656N00645326EA0000001284
+B1740084555661N00645343EA0000001279
+B1740104555662N00645362EA0000001275
+B1740124555665N00645378EA0000001272
+B1740144555670N00645394EA0000001270
+B1740164555673N00645409EA0000001268
+B1740184555678N00645423EA0000001267
+B1740204555683N00645438EA0000001266
+B1740224555687N00645454EA0000001266
+B1740244555691N00645468EA0000001264
+B1740264555697N00645484EA0000001264
+B1740284555702N00645497EA0000001266
+B1740304555707N00645508EA0000001268
+B1740324555710N00645517EA0000001270
+B1740344555713N00645527EA0000001272
+B1740364555716N00645536EA0000001275
+B1740384555717N00645543EA0000001277
+B1740404555719N00645552EA0000001278
+B1740424555721N00645561EA0000001278
+B1740444555725N00645564EA0000001279
+B1740464555730N00645559EA0000001279
+B1740484555733N00645550EA0000001278
+B1740504555730N00645537EA0000001278
+B1740524555721N00645523EA0000001279
+B1740544555706N00645515EA0000001279
+B1740564555691N00645522EA0000001280
+B1740584555682N00645535EA0000001281
+B1741004555680N00645548EA0000001282
+B1741024555680N00645558EA0000001281
+B1741044555682N00645570EA0000001280
+B1741064555684N00645583EA0000001279
+B1741084555687N00645595EA0000001280
+B1741104555689N00645607EA0000001280
+B1741124555690N00645620EA0000001280
+B1741144555693N00645634EA0000001281
+B1741164555695N00645647EA0000001282
+B1741184555697N00645661EA0000001281
+B1741204555701N00645683EA0000001281
+B1741224555703N00645697EA0000001281
+B1741244555704N00645711EA0000001280
+B1741264555706N00645724EA0000001279
+B1741284555709N00645739EA0000001277
+B1741304555713N00645753EA0000001276
+B1741324555716N00645766EA0000001275
+B1741344555719N00645779EA0000001273
+B1741364555724N00645792EA0000001271
+B1741384555727N00645806EA0000001270
+B1741404555729N00645820EA0000001268
+B1741424555729N00645835EA0000001267
+B1741444555731N00645849EA0000001266
+B1741464555732N00645864EA0000001266
+B1741494555733N00645880EA0000001267
+B1741514555736N00645895EA0000001268
+B1741534555738N00645910EA0000001268
+B1741554555739N00645926EA0000001269
+B1741574555742N00645940EA0000001270
+B1741594555745N00645954EA0000001272
+B1742014555748N00645967EA0000001275
+B1742034555751N00645977EA0000001277
+B1742054555752N00645988EA0000001279
+B1742074555748N00646000EA0000001279
+B1742094555737N00646007EA0000001279
+B1742114555724N00645998EA0000001278
+B1742134555719N00645981EA0000001278
+B1742154555725N00645970EA0000001279
+B1742174555736N00645968EA0000001282
+B1742194555743N00645974EA0000001283
+B1742214555746N00645987EA0000001284
+B1742234555749N00646000EA0000001287
+B1742254555752N00646009EA0000001289
+B1742274555755N00646020EA0000001291
+B1742294555758N00646029EA0000001294
+B1742314555763N00646033EA0000001297
+B1742334555769N00646033EA0000001299
+B1742354555773N00646029EA0000001301
+B1742374555777N00646021EA0000001302
+B1742394555776N00646008EA0000001303
+B1742414555771N00645997EA0000001304
+B1742434555762N00645990EA0000001304
+B1742454555751N00645990EA0000001304
+B1742474555742N00645998EA0000001303
+B1742494555738N00646011EA0000001304
+B1742514555738N00646023EA0000001307
+B1742534555739N00646034EA0000001310
+B1742554555738N00646046EA0000001313
+B1742574555738N00646057EA0000001316
+B1742594555741N00646063EA0000001317
+B1743014555749N00646060EA0000001321
+B1743034555750N00646047EA0000001324
+B1743054555746N00646034EA0000001327
+B1743074555739N00646023EA0000001329
+B1743094555727N00646017EA0000001330
+B1743114555714N00646017EA0000001331
+B1743134555703N00646023EA0000001333
+B1743154555696N00646034EA0000001335
+B1743174555693N00646045EA0000001336
+B1743194555692N00646057EA0000001336
+B1743214555694N00646068EA0000001335
+B1743234555700N00646076EA0000001334
+B1743254555706N00646084EA0000001333
+B1743284555711N00646093EA0000001333
+B1743304555715N00646103EA0000001331
+B1743324555720N00646113EA0000001330
+B1743344555725N00646122EA0000001329
+B1743364555729N00646132EA0000001328
+B1743384555734N00646143EA0000001326
+B1743404555740N00646154EA0000001324
+B1743424555745N00646165EA0000001322
+B1743444555752N00646177EA0000001322
+B1743464555757N00646185EA0000001322
+B1743484555761N00646195EA0000001321
+B1743504555766N00646205EA0000001321
+B1743524555771N00646215EA0000001321
+B1743544555773N00646226EA0000001322
+B1743564555772N00646238EA0000001322
+B1743584555771N00646251EA0000001321
+B1744004555772N00646264EA0000001320
+B1744024555774N00646278EA0000001318
+B1744044555779N00646291EA0000001317
+B1744064555786N00646300EA0000001316
+B1744084555792N00646309EA0000001317
+B1744104555794N00646320EA0000001318
+B1744124555791N00646333EA0000001318
+B1744144555786N00646346EA0000001318
+B1744164555780N00646358EA0000001317
+B1744184555773N00646370EA0000001317
+B1744204555767N00646382EA0000001317
+B1744224555762N00646394EA0000001317
+B1744244555757N00646407EA0000001316
+B1744264555751N00646420EA0000001315
+B1744284555744N00646432EA0000001315
+B1744304555738N00646443EA0000001313
+B1744324555731N00646455EA0000001311
+B1744344555724N00646467EA0000001310
+B1744364555718N00646480EA0000001310
+B1744384555711N00646490EA0000001308
+B1744404555700N00646505EA0000001306
+B1744424555695N00646518EA0000001304
+B1744444555690N00646532EA0000001302
+B1744464555687N00646548EA0000001300
+B1744484555685N00646563EA0000001297
+B1744504555683N00646578EA0000001294
+B1744524555681N00646592EA0000001290
+B1744544555681N00646606EA0000001287
+B1744564555680N00646621EA0000001285
+B1744584555679N00646635EA0000001283
+B1745004555676N00646648EA0000001281
+B1745024555672N00646661EA0000001280
+B1745044555667N00646672EA0000001278
+B1745074555662N00646683EA0000001277
+B1745094555656N00646693EA0000001274
+B1745114555649N00646704EA0000001271
+B1745134555642N00646714EA0000001270
+B1745154555635N00646723EA0000001267
+B1745174555627N00646731EA0000001265
+B1745194555617N00646737EA0000001262
+B1745214555608N00646740EA0000001260
+B1745234555600N00646741EA0000001257
+B1745254555592N00646740EA0000001254
+B1745274555583N00646738EA0000001251
+B1745294555575N00646736EA0000001249
+B1745314555567N00646734EA0000001248
+B1745334555560N00646730EA0000001247
+B1745354555552N00646727EA0000001246
+B1745374555546N00646722EA0000001245
+B1745394555540N00646717EA0000001244
+B1745414555533N00646713EA0000001243
+B1745434555526N00646710EA0000001242
+B1745454555520N00646707EA0000001241
+B1745474555512N00646704EA0000001239
+B1745494555505N00646700EA0000001237
+B1745514555498N00646695EA0000001235
+B1745534555491N00646691EA0000001232
+B1745554555484N00646688EA0000001230
+B1745574555477N00646684EA0000001227
+B1745594555469N00646680EA0000001225
+B1746014555464N00646677EA0000001224
+B1746034555458N00646672EA0000001222
+B1746054555450N00646668EA0000001221
+B1746074555444N00646665EA0000001220
+B1746094555438N00646662EA0000001219
+B1746114555431N00646659EA0000001218
+B1746134555424N00646658EA0000001218
+B1746154555414N00646658EA0000001216
+B1746174555407N00646655EA0000001215
+B1746194555401N00646653EA0000001216
+B1746214555395N00646651EA0000001215
+B1746234555389N00646649EA0000001213
+B1746254555383N00646648EA0000001212
+B1746274555375N00646648EA0000001211
+B1746294555368N00646645EA0000001211
+B1746314555363N00646643EA0000001212
+B1746334555358N00646642EA0000001211
+B1746354555351N00646641EA0000001211
+B1746374555345N00646639EA0000001210
+B1746394555340N00646636EA0000001211
+B1746414555335N00646636EA0000001212
+B1746444555330N00646636EA0000001212
+B1746464555325N00646636EA0000001213
+B1746484555320N00646636EA0000001213
+B1746504555313N00646636EA0000001214
+B1746524555308N00646636EA0000001214
+B1746544555302N00646637EA0000001215
+B1746564555296N00646639EA0000001215
+B1746584555291N00646641EA0000001216
+B1747004555285N00646640EA0000001216
+B1747024555279N00646637EA0000001215
+B1747044555273N00646635EA0000001216
+B1747064555268N00646635EA0000001217
+B1747084555261N00646634EA0000001218
+B1747104555255N00646634EA0000001219
+B1747124555249N00646635EA0000001220
+B1747144555242N00646635EA0000001221
+B1747164555234N00646635EA0000001221
+B1747184555228N00646636EA0000001222
+B1747204555223N00646638EA0000001223
+B1747224555216N00646638EA0000001224
+B1747244555208N00646639EA0000001226
+B1747264555202N00646638EA0000001227
+B1747284555194N00646637EA0000001228
+B1747304555186N00646639EA0000001230
+B1747324555179N00646642EA0000001232
+B1747344555172N00646646EA0000001234
+B1747364555165N00646645EA0000001236
+B1747384555162N00646637EA0000001238
+B1747404555166N00646627EA0000001240
+B1747424555176N00646622EA0000001242
+B1747444555188N00646625EA0000001243
+B1747464555199N00646637EA0000001244
+B1747484555196N00646656EA0000001244
+B1747504555193N00646663EA0000001245
+B1747524555181N00646672EA0000001245
+B1747544555174N00646671EA0000001246
+B1747564555166N00646676EA0000001250
+B1747584555161N00646678EA0000001253
+B1748004555156N00646676EA0000001256
+B1748024555154N00646668EA0000001258
+B1748044555161N00646660EA0000001260
+B1748064555173N00646662EA0000001261
+B1748084555178N00646677EA0000001263
+B1748104555172N00646693EA0000001265
+B1748124555164N00646701EA0000001267
+B1748144555159N00646705EA0000001271
+B1748164555155N00646709EA0000001274
+B1748184555149N00646710EA0000001276
+B1748204555146N00646705EA0000001277
+B1748224555148N00646696EA0000001277
+B1748254555159N00646689EA0000001277
+B1748274555172N00646693EA0000001277
+B1748294555180N00646708EA0000001278
+B1748314555179N00646725EA0000001279
+B1748334555173N00646735EA0000001280
+B1748354555166N00646739EA0000001283
+B1748374555160N00646739EA0000001284
+B1748394555154N00646737EA0000001286
+B1748414555148N00646738EA0000001290
+B1748434555143N00646742EA0000001293
+B1748454555138N00646740EA0000001296
+B1748474555135N00646731EA0000001298
+B1748494555140N00646722EA0000001300
+B1748514555151N00646720EA0000001301
+B1748534555156N00646731EA0000001303
+B1748554555153N00646746EA0000001304
+B1748574555145N00646754EA0000001307
+B1748594555139N00646759EA0000001310
+B1749014555133N00646762EA0000001313
+B1749034555125N00646765EA0000001314
+B1749054555120N00646762EA0000001316
+B1749074555121N00646753EA0000001317
+B1749094555131N00646747EA0000001318
+B1749114555145N00646750EA0000001319
+B1749134555156N00646761EA0000001321
+B1749154555166N00646768EA0000001323
+B1749174555176N00646766EA0000001325
+B1749194555183N00646758EA0000001327
+B1749214555182N00646749EA0000001328
+B1749234555176N00646744EA0000001329
+B1749254555168N00646748EA0000001330
+B1749274555160N00646753EA0000001331
+B1749294555151N00646758EA0000001331
+B1749314555141N00646763EA0000001332
+B1749334555133N00646769EA0000001334
+B1749354555124N00646775EA0000001339
+B1749374555116N00646779EA0000001341
+B1749394555109N00646778EA0000001342
+B1749414555104N00646771EA0000001343
+B1749434555107N00646761EA0000001343
+B1749454555118N00646756EA0000001342
+B1749474555128N00646764EA0000001341
+B1749494555128N00646783EA0000001341
+B1749514555121N00646796EA0000001342
+B1749534555115N00646798EA0000001343
+B1749554555112N00646794EA0000001343
+B1749574555111N00646787EA0000001342
+B1749594555115N00646776EA0000001340
+B1750024555125N00646769EA0000001339
+B1750044555135N00646773EA0000001337
+B1750064555133N00646790EA0000001335
+B1750084555124N00646800EA0000001334
+B1750104555119N00646805EA0000001335
+B1750124555114N00646808EA0000001336
+B1750144555106N00646808EA0000001336
+B1750164555097N00646808EA0000001337
+B1750184555087N00646808EA0000001338
+B1750204555078N00646808EA0000001339
+B1750224555068N00646808EA0000001341
+B1750244555059N00646808EA0000001344
+B1750264555050N00646809EA0000001347
+B1750284555043N00646811EA0000001351
+B1750304555036N00646808EA0000001354
+B1750324555033N00646798EA0000001356
+B1750344555037N00646787EA0000001358
+B1750364555046N00646784EA0000001359
+B1750384555050N00646796EA0000001360
+B1750404555044N00646812EA0000001361
+B1750424555034N00646820EA0000001362
+B1750444555027N00646823EA0000001363
+B1750464555019N00646824EA0000001364
+B1750484555009N00646823EA0000001364
+B1750504554999N00646823EA0000001364
+B1750524554989N00646823EA0000001365
+B1750544554978N00646824EA0000001366
+B1750564554968N00646825EA0000001368
+B1750584554958N00646828EA0000001369
+B1751004554948N00646829EA0000001371
+B1751024554942N00646822EA0000001372
+B1751044554943N00646811EA0000001372
+B1751064554951N00646807EA0000001373
+B1751084554962N00646816EA0000001374
+B1751104554977N00646828EA0000001376
+B1751124554986N00646836EA0000001376
+B1751144554995N00646841EA0000001376
+B1751164555005N00646843EA0000001376
+B1751184555014N00646846EA0000001376
+B1751204555024N00646848EA0000001376
+B1751224555033N00646848EA0000001376
+B1751244555040N00646842EA0000001376
+B1751264555041N00646832EA0000001376
+B1751284555037N00646823EA0000001375
+B1751304555028N00646819EA0000001374
+B1751324555017N00646817EA0000001374
+B1751344555008N00646819EA0000001375
+B1751374554999N00646819EA0000001376
+B1751394554989N00646819EA0000001376
+B1751414554979N00646819EA0000001376
+B1751434554968N00646820EA0000001376
+B1751454554956N00646821EA0000001375
+B1751474554945N00646823EA0000001376
+B1751494554936N00646825EA0000001378
+B1751514554927N00646826EA0000001379
+B1751534554917N00646828EA0000001380
+B1751554554906N00646829EA0000001379
+B1751574554894N00646830EA0000001379
+B1751594554883N00646830EA0000001380
+B1752014554873N00646830EA0000001380
+B1752034554862N00646831EA0000001380
+B1752054554851N00646833EA0000001380
+B1752074554840N00646833EA0000001380
+B1752094554830N00646834EA0000001380
+B1752114554818N00646835EA0000001380
+B1752134554807N00646836EA0000001380
+B1752154554796N00646836EA0000001380
+B1752174554784N00646837EA0000001379
+B1752194554773N00646838EA0000001379
+B1752214554761N00646839EA0000001378
+B1752234554749N00646841EA0000001376
+B1752254554737N00646843EA0000001375
+B1752274554727N00646845EA0000001374
+B1752294554715N00646845EA0000001373
+B1752314554701N00646845EA0000001371
+B1752334554689N00646847EA0000001370
+B1752354554678N00646849EA0000001370
+B1752374554666N00646851EA0000001369
+B1752394554653N00646856EA0000001368
+B1752414554643N00646858EA0000001368
+B1752434554632N00646859EA0000001368
+B1752454554621N00646862EA0000001367
+B1752474554605N00646866EA0000001367
+B1752494554595N00646869EA0000001366
+B1752514554584N00646872EA0000001365
+B1752534554573N00646875EA0000001365
+B1752554554563N00646877EA0000001365
+B1752574554554N00646878EA0000001366
+B1752594554544N00646881EA0000001366
+B1753014554534N00646886EA0000001366
+B1753034554524N00646889EA0000001366
+B1753054554513N00646893EA0000001365
+B1753074554502N00646897EA0000001365
+B1753094554491N00646901EA0000001365
+B1753114554481N00646905EA0000001365
+B1753134554471N00646909EA0000001364
+B1753154554460N00646912EA0000001364
+B1753184554449N00646917EA0000001363
+B1753204554438N00646922EA0000001362
+B1753224554428N00646926EA0000001361
+B1753244554418N00646931EA0000001359
+B1753264554406N00646937EA0000001357
+B1753284554395N00646943EA0000001357
+B1753304554385N00646949EA0000001357
+B1753324554375N00646955EA0000001356
+B1753344554365N00646961EA0000001354
+B1753364554354N00646969EA0000001352
+B1753384554343N00646977EA0000001350
+B1753404554331N00646984EA0000001349
+B1753424554319N00646991EA0000001349
+B1753444554310N00646997EA0000001349
+B1753464554302N00647002EA0000001348
+B1753484554293N00647008EA0000001346
+B1753504554281N00647014EA0000001344
+B1753524554272N00647020EA0000001344
+B1753544554263N00647026EA0000001342
+B1753564554253N00647032EA0000001340
+B1753584554242N00647039EA0000001338
+B1754004554231N00647046EA0000001336
+B1754024554221N00647051EA0000001334
+B1754044554209N00647055EA0000001332
+B1754064554199N00647062EA0000001330
+B1754084554189N00647071EA0000001327
+B1754104554180N00647081EA0000001326
+B1754124554171N00647091EA0000001324
+B1754144554163N00647102EA0000001322
+B1754164554154N00647112EA0000001320
+B1754184554144N00647121EA0000001319
+B1754204554135N00647131EA0000001319
+B1754224554127N00647140EA0000001319
+B1754244554119N00647150EA0000001319
+B1754264554111N00647161EA0000001320
+B1754284554103N00647173EA0000001323
+B1754304554098N00647181EA0000001324
+B1754324554094N00647192EA0000001326
+B1754344554088N00647200EA0000001326
+B1754364554082N00647206EA0000001326
+B1754384554075N00647214EA0000001325
+B1754404554069N00647225EA0000001323
+B1754424554062N00647237EA0000001321
+B1754444554056N00647250EA0000001319
+B1754464554050N00647263EA0000001318
+B1754484554044N00647276EA0000001316
+B1754504554038N00647290EA0000001314
+B1754524554030N00647303EA0000001312
+B1754554554023N00647316EA0000001311
+B1754574554015N00647329EA0000001310
+B1754594554009N00647343EA0000001309
+B1755014554003N00647358EA0000001308
+B1755034553996N00647373EA0000001307
+B1755054553990N00647389EA0000001305
+B1755074553983N00647404EA0000001304
+B1755094553976N00647417EA0000001303
+B1755114553969N00647429EA0000001303
+B1755134553962N00647441EA0000001303
+B1755154553956N00647453EA0000001303
+B1755174553951N00647464EA0000001302
+B1755194553944N00647475EA0000001301
+B1755214553936N00647485EA0000001299
+B1755234553930N00647493EA0000001299
+B1755254553926N00647500EA0000001300
+B1755274553921N00647507EA0000001302
+B1755294553915N00647514EA0000001304
+B1755314553911N00647522EA0000001306
+B1755334553906N00647527EA0000001308
+B1755354553901N00647531EA0000001311
+B1755374553897N00647528EA0000001313
+B1755394553894N00647519EA0000001315
+B1755414553896N00647508EA0000001316
+B1755434553905N00647496EA0000001316
+B1755454553920N00647492EA0000001316
+B1755474553937N00647499EA0000001317
+B1755494553945N00647513EA0000001318
+B1755514553946N00647530EA0000001320
+B1755534553946N00647546EA0000001323
+B1755554553944N00647558EA0000001325
+B1755574553938N00647564EA0000001326
+B1755594553933N00647563EA0000001327
+B1756014553932N00647554EA0000001328
+B1756034553939N00647543EA0000001329
+B1756054553953N00647540EA0000001329
+B1756074553975N00647554EA0000001330
+B1756094553978N00647572EA0000001331
+B1756114553977N00647589EA0000001332
+B1756134553976N00647605EA0000001333
+B1756154553971N00647618EA0000001333
+B1756174553964N00647628EA0000001334
+B1756194553959N00647639EA0000001335
+B1756214553956N00647650EA0000001336
+B1756234553951N00647661EA0000001337
+B1756254553947N00647676EA0000001337
+B1756274553945N00647692EA0000001338
+B1756294553945N00647706EA0000001339
+B1756314553944N00647723EA0000001340
+B1756334553942N00647742EA0000001339
+B1756364553939N00647758EA0000001339
+B1756384553937N00647774EA0000001339
+B1756404553935N00647791EA0000001337
+B1756424553932N00647809EA0000001336
+B1756444553930N00647823EA0000001334
+B1756464553926N00647838EA0000001331
+B1756484553921N00647853EA0000001328
+B1756504553916N00647867EA0000001326
+B1756524553911N00647881EA0000001323
+B1756544553907N00647898EA0000001319
+B1756564553903N00647915EA0000001317
+B1756584553899N00647930EA0000001314
+B1757004553896N00647947EA0000001311
+B1757024553893N00647965EA0000001307
+B1757044553888N00647981EA0000001305
+B1757064553885N00647998EA0000001301
+B1757084553880N00648015EA0000001298
+B1757104553874N00648029EA0000001294
+B1757124553869N00648045EA0000001290
+B1757144553865N00648060EA0000001286
+B1757164553860N00648077EA0000001282
+B1757184553856N00648095EA0000001278
+B1757204553852N00648111EA0000001274
+B1757224553845N00648127EA0000001269
+B1757244553839N00648142EA0000001266
+B1757264553833N00648155EA0000001262
+B1757284553827N00648169EA0000001258
+B1757304553822N00648187EA0000001255
+B1757324553819N00648204EA0000001252
+B1757344553817N00648221EA0000001250
+B1757364553815N00648242EA0000001247
+B1757384553814N00648264EA0000001244
+B1757404553814N00648284EA0000001241
+B1757424553814N00648304EA0000001237
+B1757444553812N00648328EA0000001233
+B1757464553812N00648349EA0000001230
+B1757484553810N00648381EA0000001224
+B1757504553808N00648403EA0000001219
+B1757524553806N00648423EA0000001216
+B1757544553803N00648441EA0000001212
+B1757564553799N00648462EA0000001208
+B1757584553796N00648482EA0000001204
+B1758004553795N00648501EA0000001201
+B1758024553793N00648522EA0000001196
+B1758044553792N00648546EA0000001192
+B1758064553792N00648568EA0000001190
+B1758084553791N00648589EA0000001188
+B1758104553791N00648609EA0000001187
+B1758124553791N00648630EA0000001186
+B1758144553789N00648651EA0000001184
+B1758174553789N00648672EA0000001183
+B1758194553789N00648692EA0000001181
+B1758214553790N00648710EA0000001179
+B1758234553791N00648731EA0000001177
+B1758254553791N00648752EA0000001175
+B1758274553793N00648772EA0000001173
+B1758294553794N00648792EA0000001171
+B1758314553795N00648812EA0000001169
+B1758334553796N00648832EA0000001167
+B1758354553797N00648852EA0000001165
+B1758374553797N00648852EA0000001163
+B1758394553794N00648890EA0000001161
+B1758414553793N00648910EA0000001158
+B1758434553790N00648928EA0000001156
+B1758454553787N00648947EA0000001154
+B1758474553783N00648966EA0000001151
+B1758494553777N00648983EA0000001148
+B1758514553773N00649000EA0000001145
+B1758534553767N00649018EA0000001143
+B1758554553762N00649034EA0000001141
+B1758574553756N00649050EA0000001139
+B1758594553750N00649063EA0000001136
+B1759014553742N00649074EA0000001134
+B1759034553736N00649088EA0000001132
+B1759054553732N00649105EA0000001131
+B1759074553728N00649121EA0000001130
+B1759094553722N00649133EA0000001129
+B1759114553716N00649145EA0000001129
+B1759134553712N00649159EA0000001128
+B1759154553705N00649170EA0000001124
+B1759174553697N00649176EA0000001123
+B1759194553692N00649185EA0000001121
+B1759214553687N00649195EA0000001119
+B1759234553675N00649195EA0000001116
+B1759254553673N00649183EA0000001112
+B1759274553682N00649178EA0000001105
+B1759294553703N00649194EA0000001103
+B1759314553711N00649204EA0000001099
+B1759334553723N00649207EA0000001095
+B1759354553734N00649204EA0000001092
+B1759374553742N00649199EA0000001090
+B1759394553752N00649196EA0000001088
+B1759414553762N00649192EA0000001085
+B1759434553767N00649185EA0000001083
+B1759454553765N00649177EA0000001081
+B1759474553759N00649174EA0000001078
+B1759494553752N00649177EA0000001076
+B1759514553744N00649184EA0000001074
+B1759534553736N00649187EA0000001072
+B1759554553727N00649186EA0000001069
+B1759584553718N00649184EA0000001066
+B1800004553711N00649183EA0000001064
+B1800024553704N00649180EA0000001063
+B1800044553697N00649174EA0000001061
+B1800064553690N00649169EA0000001059
+B1800084553684N00649167EA0000001057
+B1800104553680N00649160EA0000001055
+B1800124553682N00649150EA0000001053
+B1800144553685N00649142EA0000001051
+B1800164553687N00649133EA0000001049
+B1800184553687N00649122EA0000001045
+B1800204553689N00649108EA0000001042
+B1800224553691N00649095EA0000001039
+B1800244553690N00649081EA0000001035
+B1800264553689N00649067EA0000001031
+B1800284553689N00649054EA0000001029
+B1800304553689N00649048EA0000001027
+B1800324553688N00649046EA0000001026
+B1800344553689N00649046EA0000001025
+B1800364553689N00649046EA0000001025
+B1800384553689N00649046EA0000001025
+B1800404553689N00649046EA0000001025
+B1800424553689N00649046EA0000001025
+B1800444553689N00649046EA0000001025
+B1800464553689N00649046EA0000001025
+B1800484553689N00649046EA0000001025
+B1800504553689N00649046EA0000001025
+B1800524553689N00649046EA0000001025
+B1800544553689N00649046EA0000001025
+B1800564553689N00649046EA0000001025
+B1800584553689N00649046EA0000001025
+B1801004553689N00649046EA0000001025
+B1801024553689N00649046EA0000001025
+B1801044553689N00649046EA0000001025
+B1801064553689N00649046EA0000001025
+B1801084553689N00649046EA0000001025
+B1801104553689N00649046EA0000001025
+B1801124553689N00649046EA0000001025
+B1801144553689N00649046EA0000001025
+B1801164553689N00649046EA0000001025
+B1801184553689N00649046EA0000001025
+B1801204553689N00649046EA0000001025
+B1801224553689N00649046EA0000001025
+B1801244553689N00649046EA0000001025
+B1801264553689N00649046EA0000001025
+B1801284553689N00649046EA0000001025
+B1801304553689N00649046EA0000001025
+B1801324553689N00649046EA0000001025
+B1801344553689N00649051EA0000001028
+B1801374553689N00649050EA0000001027
+B1801394553689N00649049EA0000001027
+B1801414553689N00649048EA0000001026
+B1801434553689N00649047EA0000001026
+B1801454553689N00649046EA0000001025
+B1801474553689N00649045EA0000001025
+B1801494553689N00649044EA0000001025
+B1801514553689N00649042EA0000001025
+B1801534553689N00649041EA0000001025
+B1801554553689N00649041EA0000001025
+B1801574553689N00649041EA0000001025
+B1801594553689N00649041EA0000001025
+B1802014553689N00649041EA0000001025
+B1802034553689N00649041EA0000001025
+B1802054553689N00649041EA0000001025
+B1802074553689N00649041EA0000001025
diff --git a/examples/data/igc/Tom-Payne.igc b/examples/data/igc/Tom-Payne.igc
new file mode 100644
index 0000000..44fc51c
--- /dev/null
+++ b/examples/data/igc/Tom-Payne.igc
@@ -0,0 +1,9879 @@
+AFLY05094
+HFDTE190411
+HFFXA100
+HFPLTPILOT:Tom Payne         
+HFGTYGLIDERTYPE:Axis Mercury      
+HFGIDGLIDERID:                  
+HFDTM100GPSDATUM:WGS84
+HFGPSGPS:FURUNO GH-80
+HFRFWFIRMWAREVERSION:1.22
+HFRHWHARDWAREVERSION:1.00
+HFFTYFRTYPE:FLYTEC,5020
+I013638TAS
+B0848484556256N00651095EA0205102039000
+B0848514556256N00651095EA0205102039000
+B0848544556255N00651096EA0205102039000
+B0848574556255N00651096EA0205002039000
+B0849004556255N00651096EA0205002039000
+B0849034556254N00651097EA0205102039000
+B0849064556254N00651097EA0205002040000
+B0849094556254N00651097EA0205002040000
+B0849124556253N00651096EA0205002040000
+B0849154556254N00651096EA0205002040000
+B0849184556254N00651096EA0205002041000
+B0849214556254N00651097EA0205002041000
+B0849244556254N00651097EA0205002041000
+B0849274556254N00651097EA0205002042000
+B0849304556254N00651098EA0205002042000
+B0849334556253N00651098EA0205002042000
+B0849364556253N00651097EA0205002043000
+B0849394556253N00651097EA0205002043000
+B0849424556254N00651098EA0204902043000
+B0849454556254N00651097EA0204702043000
+B0849484556257N00651102EA0204702043000
+B0849514556263N00651112EA0204602043000
+B0849544556269N00651124EA0204702043000
+B0849574556275N00651136EA0204402043000
+B0850004556285N00651145EA0204302042000
+B0850034556295N00651154EA0204002042000
+B0850064556305N00651165EA0203402042000
+B0850094556318N00651177EA0203202041000
+B0850124556327N00651189EA0203102040000
+B0850154556332N00651208EA0202702039000
+B0850194556336N00651233EA0202402037000
+B0850224556336N00651249EA0202302036000
+B0850254556334N00651265EA0201902035000
+B0850284556327N00651279EA0201602033000
+B0850314556318N00651293EA0200502031000
+B0850344556308N00651313EA0201002028000
+B0850374556302N00651328EA0201702026000
+B0850404556295N00651338EA0201802024000
+B0850434556287N00651353EA0203102023000
+B0850464556281N00651362EA0203502023000
+B0850494556275N00651368EA0202902023000
+B0850534556259N00651373EA0203102024000
+B0850564556243N00651365EA0202502024000
+B0850594556226N00651359EA0202502023000
+B0851024556211N00651354EA0202302023000
+B0851054556194N00651345EA0203302023000
+B0851084556179N00651335EA0203002023000
+B0851114556163N00651329EA0202602023000
+B0851144556146N00651327EA0202702023000
+B0851174556129N00651326EA0203302023000
+B0851204556114N00651326EA0203302024000
+B0851234556099N00651335EA0203502024000
+B0851264556092N00651350EA0203502025000
+B0851294556093N00651366EA0204602026000
+B0851324556094N00651378EA0205202027000
+B0851354556099N00651389EA0205702029000
+B0851384556112N00651389EA0206002031000
+B0851414556124N00651373EA0206602034000
+B0851444556122N00651347EA0207202037000
+B0851474556108N00651329EA0207702040000
+B0851504556091N00651329EA0208202043000
+B0851534556082N00651343EA0208902047000
+B0851564556085N00651357EA0209302050000
+B0851594556094N00651364EA0209502054000
+B0852024556106N00651357EA0210002058000
+B0852054556114N00651341EA0210302062000
+B0852084556115N00651317EA0210702066000
+B0852114556104N00651295EA0211102070000
+B0852144556087N00651292EA0211702074000
+B0852174556074N00651301EA0211902078000
+B0852214556070N00651323EA0212402083000
+B0852244556080N00651325EA0212502087000
+B0852274556093N00651314EA0212602091000
+B0852304556095N00651291EA0212502095000
+B0852334556085N00651269EA0212702098000
+B0852364556066N00651256EA0213302102000
+B0852394556049N00651261EA0213602105000
+B0852424556044N00651276EA0213902109000
+B0852454556050N00651289EA0214502112000
+B0852484556057N00651297EA0214502115000
+B0852514556070N00651294EA0214302119000
+B0852544556079N00651277EA0214302121000
+B0852574556081N00651252EA0213702124000
+B0853004556078N00651225EA0213502125000
+B0853034556062N00651201EA0213002126000
+B0853064556040N00651195EA0213802126000
+B0853094556028N00651202EA0213502127000
+B0853124556025N00651216EA0213402128000
+B0853154556031N00651226EA0213802128000
+B0853184556040N00651228EA0213402129000
+B0853214556052N00651227EA0213402129000
+B0853244556065N00651223EA0213402129000
+B0853274556079N00651215EA0213502129000
+B0853304556094N00651206EA0213802130000
+B0853334556108N00651196EA0214102130000
+B0853364556122N00651184EA0214702131000
+B0853394556132N00651165EA0215402132000
+B0853424556139N00651143EA0216002134000
+B0853464556147N00651114EA0217002138000
+B0853494556149N00651092EA0217602141000
+B0853524556146N00651068EA0218602144000
+B0853554556132N00651059EA0219602149000
+B0853584556123N00651069EA0220702153000
+B0854014556125N00651082EA0221902157000
+B0854044556133N00651087EA0222702162000
+B0854074556146N00651081EA0224102169000
+B0854104556151N00651063EA0225102177000
+B0854134556145N00651037EA0226402186000
+B0854164556133N00651019EA0227502194000
+B0854194556118N00651012EA0229002204000
+B0854224556106N00651018EA0229902213000
+B0854254556106N00651031EA0231302221000
+B0854284556118N00651027EA0232802231000
+B0854314556124N00651003EA0234502242000
+B0854344556124N00650980EA0235902253000
+B0854374556116N00650959EA0236802265000
+B0854404556098N00650953EA0237402275000
+B0854434556085N00650969EA0238602286000
+B0854464556088N00650984EA0240002297000
+B0854494556099N00650990EA0241302307000
+B0854524556112N00650982EA0242602318000
+B0854554556116N00650967EA0243302330000
+B0854584556104N00650951EA0243702341000
+B0855014556084N00650951EA0244802351000
+B0855044556075N00650967EA0245802361000
+B0855074556078N00650986EA0247102372000
+B0855104556086N00651001EA0248602382000
+B0855134556097N00651003EA0249602394000
+B0855164556105N00650993EA0250302403000
+B0855194556101N00650977EA0250202414000
+B0855224556085N00650965EA0250802424000
+B0855254556066N00650970EA0252302433000
+B0855284556055N00650988EA0253302443000
+B0855314556056N00651009EA0254302453000
+B0855354556069N00651006EA0254802465000
+B0855384556070N00650986EA0255602474000
+B0855414556055N00650973EA0256002482000
+B0855444556037N00650974EA0257302491000
+B0855474556026N00650991EA0258102499000
+B0855504556030N00651009EA0259002507000
+B0855534556037N00651011EA0259302513000
+B0855564556042N00650997EA0259202521000
+B0855594556037N00650977EA0259702529000
+B0856024556026N00650960EA0260402536000
+B0856054556012N00650942EA0261102544000
+B0856094555998N00650917EA0261802553000
+B0856124555986N00650899EA0262002560000
+B0856154555969N00650897EA0261702566000
+B0856184555952N00650910EA0261802572000
+B0856214555944N00650934EA0262302577000
+B0856244555950N00650949EA0262802582000
+B0856274555962N00650952EA0263102586000
+B0856304555972N00650939EA0263702591000
+B0856334555974N00650917EA0264502597000
+B0856364555970N00650896EA0264502602000
+B0856394555959N00650878EA0264402607000
+B0856424555944N00650862EA0264402611000
+B0856454555928N00650847EA0264102614000
+B0856484555917N00650829EA0264002617000
+B0856514555908N00650807EA0263702619000
+B0856544555897N00650784EA0263702621000
+B0856574555885N00650766EA0263502622000
+B0857004555872N00650750EA0263202623000
+B0857034555859N00650733EA0263102624000
+B0857064555842N00650721EA0263102625000
+B0857094555829N00650709EA0262302625000
+B0857124555816N00650690EA0261202624000
+B0857154555804N00650668EA0260502623000
+B0857184555791N00650647EA0259402621000
+B0857214555778N00650620EA0258402617000
+B0857244555766N00650594EA0258002614000
+B0857274555752N00650572EA0256902610000
+B0857304555736N00650548EA0256202605000
+B0857334555720N00650521EA0255502601000
+B0857374555701N00650486EA0255002595000
+B0857404555687N00650459EA0254202590000
+B0857434555673N00650431EA0253802585000
+B0857464555659N00650403EA0253202579000
+B0857494555646N00650373EA0252802574000
+B0857524555634N00650344EA0252302569000
+B0857554555622N00650314EA0251602564000
+B0857584555610N00650284EA0251502558000
+B0858014555599N00650255EA0251302553000
+B0858044555586N00650224EA0251302549000
+B0858074555573N00650192EA0252202545000
+B0858104555563N00650165EA0252302543000
+B0858134555548N00650140EA0252502541000
+B0858164555536N00650114EA0252702539000
+B0858194555532N00650087EA0252502537000
+B0858224555527N00650056EA0251902536000
+B0858254555521N00650019EA0251902534000
+B0858284555515N00649983EA0251602532000
+B0858314555509N00649947EA0251702530000
+B0858344555505N00649913EA0251802528000
+B0858374555502N00649876EA0252702526000
+B0858404555501N00649842EA0253602526000
+B0858434555499N00649809EA0254202526000
+B0858464555491N00649782EA0254802527000
+B0858494555479N00649765EA0255202529000
+B0858524555465N00649768EA0256002531000
+B0858554555463N00649780EA0256502533000
+B0858584555473N00649788EA0256902537000
+B0859024555492N00649777EA0257202540000
+B0859054555503N00649752EA0258102544000
+B0859084555509N00649728EA0258702548000
+B0859114555511N00649700EA0259402553000
+B0859144555508N00649673EA0260202557000
+B0859174555507N00649645EA0260402562000
+B0859204555496N00649622EA0260602567000
+B0859234555482N00649607EA0261602572000
+B0859264555467N00649597EA0262002577000
+B0859294555453N00649601EA0262002581000
+B0859324555450N00649615EA0262602585000
+B0859354555461N00649621EA0262602590000
+B0859384555477N00649605EA0262602593000
+B0859414555479N00649577EA0263402597000
+B0859444555474N00649554EA0263802601000
+B0859474555466N00649529EA0264202606000
+B0859504555456N00649504EA0264302610000
+B0859534555444N00649480EA0264602613000
+B0859564555431N00649459EA0264802617000
+B0859594555420N00649439EA0264202620000
+B0900024555408N00649417EA0263502622000
+B0900054555394N00649395EA0262802623000
+B0900084555379N00649368EA0262302623000
+B0900114555366N00649339EA0262202623000
+B0900144555356N00649312EA0261502622000
+B0900174555345N00649283EA0260502621000
+B0900204555330N00649251EA0260502618000
+B0900234555316N00649222EA0260602617000
+B0900264555305N00649192EA0260502615000
+B0900304555291N00649151EA0260402613000
+B0900334555279N00649121EA0260102611000
+B0900364555267N00649090EA0259802609000
+B0900394555256N00649059EA0259602608000
+B0900424555246N00649026EA0259102605000
+B0900454555234N00648994EA0259002603000
+B0900484555224N00648967EA0260402601000
+B0900514555220N00648953EA0261202602000
+B0900544555215N00648930EA0262202602000
+B0900574555212N00648909EA0263302605000
+B0901004555208N00648889EA0263602607000
+B0901034555203N00648864EA0264702611000
+B0901064555198N00648841EA0265302615000
+B0901094555190N00648820EA0265602619000
+B0901124555185N00648802EA0265502623000
+B0901154555185N00648779EA0266102626000
+B0901184555184N00648759EA0266402630000
+B0901214555182N00648737EA0266602634000
+B0901244555184N00648711EA0267502637000
+B0901274555189N00648686EA0268302641000
+B0901304555198N00648661EA0269002646000
+B0901334555198N00648633EA0269402650000
+B0901364555186N00648618EA0270002655000
+B0901394555172N00648624EA0270502660000
+B0901424555169N00648641EA0270902664000
+B0901454555177N00648656EA0271102668000
+B0901484555193N00648658EA0271402672000
+B0901514555204N00648642EA0272102677000
+B0901544555206N00648619EA0272902682000
+B0901574555204N00648598EA0273202686000
+B0902004555198N00648577EA0274002691000
+B0902034555189N00648565EA0274002697000
+B0902074555174N00648573EA0274402703000
+B0902104555175N00648593EA0275102707000
+B0902134555184N00648605EA0275402712000
+B0902164555200N00648604EA0275802716000
+B0902194555214N00648592EA0276302720000
+B0902224555224N00648571EA0276502725000
+B0902254555226N00648545EA0277002729000
+B0902284555224N00648522EA0277402733000
+B0902314555220N00648500EA0277802737000
+B0902344555213N00648476EA0278302742000
+B0902374555207N00648454EA0278802747000
+B0902404555199N00648435EA0279002751000
+B0902434555190N00648416EA0279402756000
+B0902464555182N00648395EA0279702760000
+B0902494555175N00648374EA0279702764000
+B0902524555167N00648354EA0280002768000
+B0902554555159N00648337EA0279702771000
+B0902584555148N00648321EA0279402774000
+B0903014555135N00648304EA0279402776000
+B0903044555123N00648289EA0278902778000
+B0903074555108N00648271EA0278102779000
+B0903104555091N00648249EA0278002779000
+B0903134555078N00648227EA0277602778000
+B0903164555066N00648205EA0277002778000
+B0903194555053N00648184EA0276302776000
+B0903224555036N00648164EA0275402774000
+B0903254555021N00648137EA0275102771000
+B0903284555007N00648110EA0274302768000
+B0903314554988N00648084EA0272902764000
+B0903354554964N00648049EA0272402758000
+B0903384554949N00648022EA0271302752000
+B0903414554933N00647995EA0270902747000
+B0903444554918N00647971EA0270302741000
+B0903474554900N00647941EA0269002735000
+B0903504554877N00647910EA0268302729000
+B0903534554855N00647880EA0267802723000
+B0903564554834N00647849EA0267202716000
+B0903594554812N00647817EA0266302710000
+B0904024554792N00647782EA0265402703000
+B0904054554770N00647745EA0265102697000
+B0904084554748N00647712EA0265002691000
+B0904114554726N00647682EA0264002685000
+B0904144554702N00647650EA0263402679000
+B0904174554681N00647619EA0263302673000
+B0904204554666N00647585EA0262502667000
+B0904234554651N00647547EA0261802661000
+B0904264554635N00647509EA0261602655000
+B0904294554620N00647475EA0260902649000
+B0904324554605N00647439EA0260202643000
+B0904354554589N00647402EA0259702637000
+B0904384554573N00647365EA0259002631000
+B0904414554558N00647326EA0258402624000
+B0904444554543N00647289EA0257802618000
+B0904474554527N00647253EA0257302612000
+B0904504554513N00647218EA0256702606000
+B0904534554499N00647185EA0255702600000
+B0904574554480N00647137EA0255102592000
+B0905004554466N00647104EA0254502586000
+B0905034554452N00647072EA0253802579000
+B0905064554438N00647039EA0253302573000
+B0905094554425N00647005EA0253102567000
+B0905124554412N00646971EA0253002562000
+B0905154554397N00646941EA0253002557000
+B0905184554383N00646915EA0252302553000
+B0905214554368N00646884EA0251202548000
+B0905244554355N00646851EA0251002543000
+B0905274554342N00646821EA0250302538000
+B0905304554328N00646789EA0249702533000
+B0905334554314N00646757EA0249102528000
+B0905364554301N00646724EA0248402523000
+B0905394554287N00646692EA0247702518000
+B0905424554273N00646658EA0247002512000
+B0905454554260N00646623EA0246602506000
+B0905484554246N00646589EA0246302501000
+B0905514554235N00646556EA0246002496000
+B0905544554223N00646524EA0245302490000
+B0905574554208N00646490EA0244702485000
+B0906004554192N00646458EA0244202480000
+B0906034554178N00646425EA0243802474000
+B0906064554164N00646393EA0243202469000
+B0906094554150N00646359EA0242902464000
+B0906124554136N00646326EA0242102459000
+B0906164554117N00646283EA0241402451000
+B0906194554103N00646250EA0241002446000
+B0906224554091N00646216EA0240402440000
+B0906254554076N00646184EA0239902435000
+B0906284554061N00646152EA0239202429000
+B0906314554045N00646121EA0238602424000
+B0906344554031N00646089EA0238402419000
+B0906374554015N00646059EA0237702413000
+B0906404554000N00646028EA0237102408000
+B0906434553985N00645996EA0236702403000
+B0906464553971N00645963EA0236102397000
+B0906494553958N00645930EA0235602392000
+B0906524553943N00645899EA0235002387000
+B0906554553928N00645867EA0234502382000
+B0906584553912N00645835EA0234002377000
+B0907014553897N00645803EA0233402372000
+B0907044553883N00645770EA0233002367000
+B0907074553870N00645737EA0232302362000
+B0907104553856N00645703EA0231702356000
+B0907134553843N00645668EA0231402351000
+B0907164553832N00645635EA0231002346000
+B0907194553823N00645602EA0230502341000
+B0907224553812N00645568EA0230002336000
+B0907254553801N00645535EA0229502331000
+B0907284553790N00645503EA0229202325000
+B0907314553779N00645473EA0228602320000
+B0907354553762N00645431EA0228102313000
+B0907384553748N00645402EA0227602308000
+B0907414553733N00645373EA0227002303000
+B0907444553718N00645345EA0226502298000
+B0907474553705N00645314EA0225802292000
+B0907504553691N00645284EA0225102287000
+B0907534553675N00645257EA0224302281000
+B0907564553655N00645234EA0223402275000
+B0907594553633N00645213EA0222702268000
+B0908024553611N00645197EA0222102262000
+B0908054553587N00645182EA0221502256000
+B0908084553566N00645165EA0220902250000
+B0908114553543N00645148EA0220302244000
+B0908144553519N00645135EA0219902239000
+B0908174553495N00645125EA0219502233000
+B0908204553469N00645117EA0218902227000
+B0908234553444N00645109EA0218602221000
+B0908264553421N00645103EA0218102215000
+B0908294553396N00645098EA0217502209000
+B0908324553371N00645093EA0216702204000
+B0908354553348N00645087EA0216602199000
+B0908384553326N00645081EA0215802194000
+B0908414553301N00645075EA0215002188000
+B0908444553275N00645065EA0214702183000
+B0908474553250N00645053EA0214902177000
+B0908514553227N00645039EA0215402172000
+B0908544553213N00645033EA0215802169000
+B0908574553196N00645032EA0216202167000
+B0909004553178N00645030EA0216202166000
+B0909034553158N00645025EA0216802165000
+B0909064553140N00645015EA0217002164000
+B0909094553121N00645002EA0217102165000
+B0909124553104N00644984EA0217402165000
+B0909154553089N00644965EA0217102165000
+B0909184553075N00644950EA0216502165000
+B0909214553060N00644938EA0215802164000
+B0909244553045N00644936EA0215302162000
+B0909274553042N00644952EA0215502161000
+B0909304553044N00644966EA0215202160000
+B0909334553048N00644984EA0215002158000
+B0909364553051N00645001EA0215502157000
+B0909394553055N00645017EA0215602156000
+B0909424553058N00645032EA0216202156000
+B0909454553060N00645048EA0216302157000
+B0909484553062N00645066EA0216002157000
+B0909514553072N00645084EA0215802157000
+B0909544553081N00645098EA0215202156000
+B0909574553092N00645114EA0215602156000
+B0910004553096N00645125EA0215102155000
+B0910034553104N00645134EA0214502154000
+B0910064553114N00645146EA0214902153000
+B0910094553120N00645154EA0214802152000
+B0910134553131N00645163EA0214302151000
+B0910164553142N00645167EA0214402150000
+B0910194553153N00645173EA0213902149000
+B0910224553167N00645178EA0214302148000
+B0910254553178N00645179EA0214502147000
+B0910284553189N00645181EA0215002147000
+B0910314553200N00645182EA0215402147000
+B0910344553211N00645183EA0215702148000
+B0910374553223N00645183EA0216502149000
+B0910404553232N00645185EA0216702151000
+B0910434553240N00645201EA0216802153000
+B0910464553237N00645222EA0216802155000
+B0910494553226N00645235EA0215802155000
+B0910524553208N00645234EA0214702155000
+B0910554553198N00645214EA0213802153000
+B0910584553203N00645190EA0213602151000
+B0911014553215N00645174EA0214402149000
+B0911044553227N00645165EA0215202147000
+B0911074553239N00645156EA0215802147000
+B0911104553248N00645136EA0216502147000
+B0911134553240N00645110EA0217202148000
+B0911164553221N00645104EA0218302149000
+B0911194553210N00645118EA0218802151000
+B0911224553218N00645130EA0219502154000
+B0911254553228N00645119EA0220802158000
+B0911284553230N00645096EA0221302162000
+B0911314553215N00645075EA0222302166000
+B0911344553197N00645073EA0223102172000
+B0911384553186N00645096EA0223202179000
+B0911414553194N00645117EA0223602184000
+B0911444553209N00645115EA0224402189000
+B0911474553214N00645095EA0224902195000
+B0911504553205N00645072EA0225202200000
+B0911534553186N00645071EA0226302205000
+B0911564553175N00645090EA0227002211000
+B0911594553179N00645111EA0227102216000
+B0912024553194N00645117EA0227202221000
+B0912054553204N00645104EA0227902227000
+B0912084553203N00645080EA0228102232000
+B0912114553192N00645059EA0228502237000
+B0912144553175N00645057EA0228802242000
+B0912174553164N00645074EA0229002247000
+B0912204553166N00645098EA0229102251000
+B0912234553179N00645114EA0229602255000
+B0912264553193N00645110EA0230302259000
+B0912294553203N00645099EA0231002264000
+B0912324553210N00645089EA0231302270000
+B0912354553213N00645067EA0231302274000
+B0912384553204N00645040EA0232402279000
+B0912414553189N00645026EA0232902285000
+B0912444553174N00645031EA0233102290000
+B0912474553165N00645050EA0233202294000
+B0912504553172N00645067EA0233102298000
+B0912534553188N00645075EA0234002301000
+B0912564553199N00645071EA0234202305000
+B0912594553210N00645055EA0234402309000
+B0913024553214N00645030EA0235102312000
+B0913054553205N00645005EA0235702316000
+B0913084553190N00644991EA0236202321000
+B0913114553177N00644998EA0236702325000
+B0913144553176N00645021EA0237202330000
+B0913184553191N00645035EA0237502336000
+B0913214553207N00645027EA0238202340000
+B0913244553219N00645017EA0238702345000
+B0913274553227N00644995EA0238902349000
+B0913304553224N00644965EA0239902353000
+B0913334553212N00644947EA0241002358000
+B0913364553197N00644949EA0241702363000
+B0913394553192N00644966EA0242202368000
+B0913424553201N00644972EA0242802373000
+B0913454553213N00644960EA0243102378000
+B0913484553215N00644933EA0243702383000
+B0913514553204N00644916EA0244902388000
+B0913544553192N00644920EA0245602394000
+B0913574553194N00644933EA0246002399000
+B0914004553207N00644929EA0246302405000
+B0914034553213N00644904EA0246802410000
+B0914064553206N00644880EA0247602416000
+B0914094553193N00644876EA0247802422000
+B0914124553188N00644892EA0248902427000
+B0914154553197N00644899EA0249202433000
+B0914184553208N00644881EA0249502439000
+B0914214553203N00644854EA0250002443000
+B0914244553191N00644848EA0250102448000
+B0914274553180N00644859EA0250602452000
+B0914304553179N00644875EA0251302457000
+B0914334553190N00644877EA0251402462000
+B0914364553201N00644857EA0252002467000
+B0914394553198N00644829EA0252502472000
+B0914424553185N00644818EA0252602477000
+B0914454553173N00644823EA0252502481000
+B0914494553174N00644845EA0253102486000
+B0914524553184N00644853EA0253502490000
+B0914554553198N00644862EA0253702494000
+B0914584553212N00644864EA0254202498000
+B0915014553224N00644847EA0254502503000
+B0915044553227N00644821EA0254602507000
+B0915074553219N00644794EA0254902511000
+B0915104553205N00644777EA0255802515000
+B0915134553190N00644766EA0255602520000
+B0915164553174N00644761EA0255402524000
+B0915194553157N00644758EA0255102527000
+B0915224553139N00644756EA0254402529000
+B0915254553118N00644754EA0253702530000
+B0915284553097N00644752EA0253102530000
+B0915314553075N00644750EA0252602529000
+B0915344553055N00644746EA0252302528000
+B0915374553034N00644742EA0251602526000
+B0915404553008N00644736EA0252002524000
+B0915434552987N00644727EA0252002523000
+B0915464552965N00644717EA0251602521000
+B0915494552943N00644703EA0252302520000
+B0915524552924N00644692EA0253402519000
+B0915554552907N00644684EA0254002520000
+B0915584552889N00644687EA0254702522000
+B0916014552886N00644702EA0255102524000
+B0916044552897N00644699EA0255602526000
+B0916074552900N00644675EA0256402529000
+B0916104552889N00644650EA0257102532000
+B0916134552871N00644643EA0257702535000
+B0916174552857N00644657EA0258102541000
+B0916204552863N00644665EA0258302544000
+B0916234552873N00644650EA0258702548000
+B0916264552871N00644623EA0259202553000
+B0916294552858N00644600EA0259702557000
+B0916324552838N00644591EA0259802561000
+B0916354552820N00644592EA0260302566000
+B0916384552805N00644598EA0260202570000
+B0916414552788N00644603EA0260002573000
+B0916444552766N00644596EA0259502576000
+B0916474552741N00644583EA0259502578000
+B0916504552718N00644572EA0259602580000
+B0916534552700N00644558EA0259002581000
+B0916564552682N00644539EA0257902582000
+B0916594552659N00644519EA0256402581000
+B0917024552633N00644498EA0256202579000
+B0917054552611N00644478EA0255702576000
+B0917084552590N00644456EA0254902573000
+B0917114552566N00644434EA0254202570000
+B0917144552541N00644416EA0254902567000
+B0917174552521N00644402EA0256102564000
+B0917204552503N00644391EA0256502564000
+B0917234552484N00644389EA0257102563000
+B0917264552469N00644397EA0257502564000
+B0917294552471N00644410EA0257702565000
+B0917324552482N00644404EA0258302566000
+B0917354552490N00644382EA0259202568000
+B0917384552489N00644356EA0259502570000
+B0917414552475N00644334EA0259802572000
+B0917454552453N00644336EA0260002576000
+B0917484552452N00644348EA0260502577000
+B0917514552464N00644345EA0260802580000
+B0917544552474N00644323EA0261102583000
+B0917574552471N00644294EA0261702586000
+B0918004552457N00644272EA0261702589000
+B0918034552436N00644255EA0261902592000
+B0918064552414N00644238EA0261602594000
+B0918094552386N00644217EA0260802595000
+B0918124552358N00644195EA0261002596000
+B0918154552334N00644174EA0260302596000
+B0918184552308N00644150EA0259102595000
+B0918214552282N00644128EA0258602594000
+B0918244552259N00644107EA0257202591000
+B0918274552233N00644085EA0255902588000
+B0918304552207N00644062EA0255502583000
+B0918334552183N00644043EA0255002579000
+B0918364552160N00644024EA0253902574000
+B0918394552135N00644006EA0252902569000
+B0918424552109N00643988EA0252202564000
+B0918454552086N00643968EA0251402558000
+B0918484552063N00643947EA0250602552000
+B0918514552039N00643924EA0249802545000
+B0918544552014N00643901EA0249402539000
+B0918574551992N00643879EA0248402533000
+B0919004551968N00643857EA0247602526000
+B0919034551944N00643837EA0246702519000
+B0919074551911N00643811EA0246002510000
+B0919104551886N00643789EA0245402503000
+B0919134551861N00643767EA0244802496000
+B0919164551836N00643744EA0244402489000
+B0919194551811N00643722EA0244102483000
+B0919224551786N00643701EA0244202477000
+B0919254551763N00643682EA0243902472000
+B0919284551739N00643662EA0243202467000
+B0919314551714N00643639EA0242502462000
+B0919344551689N00643616EA0242502457000
+B0919374551665N00643596EA0242302452000
+B0919404551640N00643578EA0241902448000
+B0919434551616N00643560EA0241902444000
+B0919464551593N00643541EA0241702440000
+B0919494551571N00643523EA0241302436000
+B0919524551547N00643504EA0241002433000
+B0919554551524N00643487EA0240702429000
+B0919584551502N00643470EA0240302425000
+B0920014551479N00643452EA0240102422000
+B0920044551456N00643434EA0239702418000
+B0920074551433N00643415EA0239302415000
+B0920104551409N00643397EA0239102411000
+B0920134551385N00643380EA0238802408000
+B0920164551362N00643365EA0238302404000
+B0920194551338N00643349EA0238002401000
+B0920224551315N00643333EA0237902397000
+B0920264551287N00643308EA0237502393000
+B0920294551265N00643290EA0237202389000
+B0920324551242N00643273EA0236502386000
+B0920354551218N00643255EA0235802383000
+B0920384551194N00643234EA0235502380000
+B0920414551171N00643213EA0235202376000
+B0920444551148N00643192EA0234802373000
+B0920474551125N00643173EA0234302369000
+B0920504551102N00643154EA0233802365000
+B0920534551079N00643137EA0233502362000
+B0920564551057N00643120EA0233202358000
+B0920594551034N00643104EA0232702354000
+B0921024551011N00643086EA0232202350000
+B0921054550987N00643069EA0231702346000
+B0921084550964N00643050EA0231102342000
+B0921114550940N00643032EA0230702338000
+B0921144550917N00643015EA0230102333000
+B0921174550893N00642997EA0229602329000
+B0921204550870N00642980EA0229102325000
+B0921234550848N00642962EA0228502320000
+B0921264550825N00642946EA0227802315000
+B0921294550803N00642930EA0226902310000
+B0921324550781N00642914EA0226502305000
+B0921354550760N00642901EA0226002299000
+B0921384550736N00642890EA0225402294000
+B0921414550714N00642880EA0225002289000
+B0921444550692N00642869EA0224502283000
+B0921484550666N00642856EA0224002277000
+B0921514550647N00642846EA0223402271000
+B0921544550629N00642837EA0223202266000
+B0921574550609N00642827EA0222602261000
+B0922004550587N00642815EA0221802256000
+B0922034550564N00642799EA0221102250000
+B0922064550541N00642783EA0220402245000
+B0922094550517N00642769EA0219902239000
+B0922124550495N00642754EA0219302234000
+B0922154550471N00642738EA0218402228000
+B0922184550448N00642720EA0217702222000
+B0922214550424N00642705EA0216702216000
+B0922244550398N00642693EA0215902210000
+B0922274550373N00642683EA0215202203000
+B0922304550349N00642674EA0214202196000
+B0922334550323N00642663EA0213402189000
+B0922364550298N00642652EA0212402182000
+B0922394550272N00642639EA0211502175000
+B0922424550247N00642626EA0210802167000
+B0922454550222N00642614EA0210202160000
+B0922484550197N00642602EA0209302152000
+B0922514550171N00642590EA0208602145000
+B0922544550146N00642576EA0208102137000
+B0922574550121N00642563EA0207602130000
+B0923004550096N00642552EA0207102123000
+B0923034550072N00642541EA0206902116000
+B0923074550042N00642525EA0206802108000
+B0923104550019N00642515EA0206302102000
+B0923134549996N00642502EA0205902096000
+B0923164549973N00642488EA0205602091000
+B0923194549951N00642474EA0205202086000
+B0923224549927N00642460EA0204502081000
+B0923254549901N00642449EA0204202075000
+B0923284549876N00642438EA0203602070000
+B0923314549850N00642426EA0203302065000
+B0923344549826N00642415EA0203002060000
+B0923374549803N00642404EA0202702056000
+B0923404549780N00642391EA0202702051000
+B0923434549757N00642379EA0202602047000
+B0923464549734N00642367EA0202602044000
+B0923494549713N00642353EA0202602040000
+B0923524549693N00642342EA0202402037000
+B0923554549672N00642332EA0201902035000
+B0923584549649N00642319EA0202002032000
+B0924014549628N00642306EA0201602029000
+B0924044549606N00642293EA0201102026000
+B0924074549584N00642280EA0201202024000
+B0924104549565N00642268EA0201602021000
+B0924134549549N00642259EA0201502020000
+B0924164549532N00642250EA0201202018000
+B0924194549514N00642241EA0201002017000
+B0924234549491N00642227EA0201102015000
+B0924264549474N00642220EA0201102013000
+B0924294549457N00642212EA0201802012000
+B0924324549443N00642201EA0202202012000
+B0924354549426N00642191EA0202402011000
+B0924384549409N00642185EA0202902011000
+B0924414549393N00642183EA0203002011000
+B0924444549375N00642178EA0203502012000
+B0924474549360N00642168EA0204002013000
+B0924504549343N00642160EA0203602014000
+B0924534549325N00642150EA0203502015000
+B0924564549307N00642141EA0203202016000
+B0924594549288N00642130EA0203802017000
+B0925024549272N00642121EA0204102018000
+B0925054549255N00642111EA0204502020000
+B0925084549239N00642099EA0205102021000
+B0925114549224N00642088EA0205402023000
+B0925144549208N00642084EA0205702025000
+B0925174549196N00642088EA0206102027000
+B0925204549188N00642098EA0206202030000
+B0925234549185N00642109EA0206402031000
+B0925264549192N00642117EA0206402034000
+B0925294549203N00642117EA0206602036000
+B0925324549214N00642118EA0206902040000
+B0925354549225N00642117EA0206602043000
+B0925384549237N00642118EA0206902045000
+B0925414549251N00642122EA0207402048000
+B0925444549262N00642125EA0207702050000
+B0925474549272N00642133EA0208402053000
+B0925514549285N00642144EA0209202056000
+B0925544549296N00642141EA0209602060000
+B0925574549302N00642118EA0210302063000
+B0926004549294N00642094EA0210802067000
+B0926034549278N00642090EA0211402070000
+B0926064549268N00642101EA0212202074000
+B0926094549268N00642113EA0212602077000
+B0926124549278N00642111EA0213002081000
+B0926154549282N00642088EA0213502086000
+B0926184549273N00642065EA0214102092000
+B0926214549258N00642054EA0214402097000
+B0926244549245N00642061EA0214602102000
+B0926274549243N00642075EA0215102105000
+B0926304549251N00642078EA0215402109000
+B0926334549260N00642064EA0215702113000
+B0926364549258N00642038EA0216002117000
+B0926394549245N00642016EA0216502122000
+B0926424549230N00642002EA0216702126000
+B0926454549212N00641997EA0216802129000
+B0926484549195N00642005EA0217002133000
+B0926514549193N00642019EA0217102136000
+B0926544549202N00642027EA0217402139000
+B0926574549211N00642034EA0217902142000
+B0927004549220N00642039EA0218402145000
+B0927034549229N00642034EA0218602148000
+B0927064549237N00642014EA0218902152000
+B0927094549234N00641987EA0219102155000
+B0927124549221N00641963EA0219502158000
+B0927154549202N00641950EA0219802162000
+B0927194549184N00641956EA0220202166000
+B0927224549182N00641968EA0221102169000
+B0927254549184N00641979EA0221502171000
+B0927284549192N00641979EA0221502174000
+B0927314549202N00641963EA0222602179000
+B0927344549204N00641937EA0223002184000
+B0927374549195N00641907EA0223102188000
+B0927404549178N00641886EA0224002193000
+B0927434549161N00641875EA0225202198000
+B0927464549146N00641879EA0225702203000
+B0927494549139N00641892EA0226502209000
+B0927524549140N00641902EA0227002211000
+B0927554549147N00641906EA0227202216000
+B0927584549157N00641893EA0227702222000
+B0928014549163N00641868EA0228202227000
+B0928044549157N00641840EA0228102233000
+B0928074549144N00641811EA0229202238000
+B0928104549129N00641811EA0229902243000
+B0928134549123N00641817EA0230902247000
+B0928164549120N00641823EA0231102251000
+B0928194549125N00641832EA0231802255000
+B0928224549133N00641827EA0231702262000
+B0928254549137N00641804EA0231002268000
+B0928284549125N00641775EA0231102273000
+B0928314549106N00641763EA0232002277000
+B0928344549097N00641769EA0232602281000
+B0928374549093N00641776EA0232602283000
+B0928404549093N00641787EA0232402286000
+B0928434549099N00641796EA0232302288000
+B0928464549107N00641801EA0231902291000
+B0928494549115N00641806EA0231502295000
+B0928534549128N00641815EA0231402298000
+B0928564549136N00641817EA0231102299000
+B0928594549147N00641822EA0231002301000
+B0929024549157N00641825EA0231002302000
+B0929054549166N00641827EA0230602302000
+B0929084549174N00641831EA0230302303000
+B0929114549185N00641837EA0229902303000
+B0929144549200N00641848EA0230202303000
+B0929174549215N00641856EA0230202302000
+B0929204549227N00641863EA0230902302000
+B0929234549236N00641870EA0230702303000
+B0929264549246N00641876EA0230702303000
+B0929294549258N00641876EA0230902303000
+B0929324549269N00641876EA0231202303000
+B0929354549283N00641876EA0232202304000
+B0929384549294N00641876EA0233302306000
+B0929414549302N00641880EA0233502308000
+B0929444549306N00641894EA0233802311000
+B0929474549296N00641908EA0233802314000
+B0929504549279N00641903EA0234202316000
+B0929534549268N00641881EA0234602319000
+B0929564549270N00641855EA0234902321000
+B0929594549282N00641840EA0235802324000
+B0930024549293N00641832EA0236102327000
+B0930054549303N00641827EA0235702331000
+B0930084549314N00641824EA0235602333000
+B0930114549325N00641824EA0234702336000
+B0930144549340N00641830EA0234502337000
+B0930184549360N00641840EA0235202338000
+B0930214549374N00641845EA0234902339000
+B0930244549391N00641851EA0235702340000
+B0930274549403N00641854EA0236502341000
+B0930304549413N00641862EA0236802343000
+B0930334549412N00641878EA0236902345000
+B0930364549396N00641887EA0236802347000
+B0930394549381N00641868EA0236802348000
+B0930424549379N00641842EA0237102350000
+B0930454549389N00641822EA0237302351000
+B0930484549403N00641816EA0238102353000
+B0930514549410N00641822EA0238402355000
+B0930544549411N00641835EA0238102356000
+B0930574549415N00641847EA0237402358000
+B0931004549425N00641855EA0237002359000
+B0931034549436N00641860EA0237402360000
+B0931064549447N00641866EA0238202362000
+B0931094549454N00641871EA0238302363000
+B0931124549467N00641870EA0238902365000
+B0931154549477N00641849EA0239102368000
+B0931184549471N00641822EA0239402370000
+B0931214549453N00641810EA0240302373000
+B0931244549440N00641818EA0240802377000
+B0931274549438N00641830EA0241102379000
+B0931304549451N00641833EA0241602382000
+B0931334549462N00641814EA0241702386000
+B0931364549457N00641786EA0242002389000
+B0931394549443N00641763EA0242902394000
+B0931434549421N00641764EA0243702397000
+B0931464549414N00641775EA0244602401000
+B0931494549416N00641788EA0245302405000
+B0931524549422N00641796EA0245602408000
+B0931554549433N00641789EA0245602413000
+B0931584549434N00641763EA0245202418000
+B0932014549421N00641737EA0245602421000
+B0932044549404N00641721EA0246502425000
+B0932074549387N00641715EA0247002429000
+B0932104549373N00641720EA0247402434000
+B0932134549366N00641731EA0248102438000
+B0932164549364N00641744EA0248702441000
+B0932194549367N00641755EA0248902444000
+B0932224549376N00641759EA0248702449000
+B0932254549385N00641749EA0248602454000
+B0932284549389N00641723EA0249002458000
+B0932314549378N00641693EA0249102461000
+B0932344549360N00641681EA0248902465000
+B0932374549345N00641687EA0248702467000
+B0932404549341N00641701EA0248702469000
+B0932434549347N00641707EA0248102470000
+B0932464549360N00641708EA0249002471000
+B0932494549368N00641707EA0249402473000
+B0932524549379N00641705EA0249702475000
+B0932554549389N00641707EA0250202478000
+B0932584549398N00641708EA0250402479000
+B0933014549406N00641713EA0250002481000
+B0933044549416N00641719EA0250402483000
+B0933074549429N00641718EA0251902486000
+B0933114549440N00641710EA0252402489000
+B0933144549450N00641707EA0253402494000
+B0933174549456N00641690EA0254302498000
+B0933204549451N00641658EA0254902503000
+B0933234549434N00641639EA0256102509000
+B0933264549417N00641639EA0257502515000
+B0933294549407N00641644EA0258302522000
+B0933324549407N00641652EA0259202525000
+B0933354549416N00641645EA0260402532000
+B0933384549414N00641618EA0260902540000
+B0933414549399N00641597EA0262002547000
+B0933444549383N00641588EA0263002555000
+B0933474549370N00641592EA0263402563000
+B0933504549368N00641609EA0264202571000
+B0933534549375N00641618EA0265402578000
+B0933564549382N00641602EA0266002586000
+B0933594549379N00641571EA0266602593000
+B0934024549368N00641546EA0267602601000
+B0934054549352N00641538EA0267902609000
+B0934084549334N00641543EA0268102616000
+B0934114549328N00641561EA0268402623000
+B0934144549338N00641569EA0269102630000
+B0934174549346N00641552EA0269502636000
+B0934204549341N00641527EA0269902642000
+B0934234549325N00641511EA0270602649000
+B0934264549308N00641496EA0271402655000
+B0934294549288N00641479EA0272002661000
+B0934324549265N00641464EA0272302667000
+B0934354549243N00641452EA0272702673000
+B0934384549222N00641438EA0272402679000
+B0934414549202N00641422EA0272502684000
+B0934444549179N00641414EA0272102688000
+B0934474549159N00641395EA0272402691000
+B0934504549142N00641376EA0272102694000
+B0934544549118N00641350EA0272302697000
+B0934574549097N00641332EA0272302700000
+B0935004549079N00641314EA0272802702000
+B0935034549065N00641291EA0272802705000
+B0935064549051N00641265EA0272902708000
+B0935094549034N00641242EA0273002710000
+B0935124549016N00641218EA0273102712000
+B0935154549005N00641193EA0273802714000
+B0935184548992N00641174EA0273002716000
+B0935214548975N00641153EA0273202718000
+B0935244548963N00641133EA0273802719000
+B0935274548948N00641111EA0274302721000
+B0935304548934N00641087EA0274902723000
+B0935334548917N00641066EA0274202725000
+B0935364548895N00641042EA0273402726000
+B0935394548872N00641015EA0272902727000
+B0935424548848N00640987EA0272202726000
+B0935454548827N00640958EA0271902724000
+B0935484548807N00640929EA0271802723000
+B0935514548788N00640896EA0272302721000
+B0935544548771N00640865EA0273102721000
+B0935574548754N00640833EA0273302721000
+B0936004548736N00640802EA0273202722000
+B0936034548718N00640771EA0273002722000
+B0936064548698N00640743EA0272502722000
+B0936094548679N00640714EA0272702722000
+B0936134548662N00640679EA0272702722000
+B0936164548650N00640654EA0272102721000
+B0936194548635N00640624EA0272202721000
+B0936224548619N00640594EA0272802720000
+B0936254548603N00640567EA0273402721000
+B0936284548588N00640541EA0274102722000
+B0936314548573N00640515EA0275302724000
+B0936344548558N00640492EA0275702727000
+B0936374548541N00640467EA0275302730000
+B0936404548526N00640440EA0275302731000
+B0936434548509N00640437EA0274502732000
+B0936464548490N00640430EA0274902733000
+B0936494548481N00640416EA0274202733000
+B0936524548467N00640396EA0273902733000
+B0936554548451N00640376EA0274502733000
+B0936584548438N00640357EA0275202734000
+B0937014548428N00640340EA0276202736000
+B0937044548418N00640326EA0275802738000
+B0937074548405N00640308EA0275402739000
+B0937104548391N00640290EA0275502740000
+B0937134548377N00640270EA0274802741000
+B0937164548361N00640246EA0274602741000
+B0937194548346N00640220EA0275002741000
+B0937224548333N00640197EA0275102742000
+B0937254548319N00640174EA0275202742000
+B0937284548304N00640152EA0275402743000
+B0937314548290N00640129EA0275502743000
+B0937344548277N00640106EA0275702744000
+B0937374548264N00640085EA0276602745000
+B0937414548248N00640058EA0276402747000
+B0937444548235N00640037EA0276902748000
+B0937474548223N00640017EA0276902749000
+B0937504548211N00639995EA0277002751000
+B0937534548198N00639972EA0277402752000
+B0937564548187N00639951EA0277602754000
+B0937594548173N00639923EA0276602755000
+B0938024548158N00639893EA0277002756000
+B0938054548144N00639869EA0276402756000
+B0938084548129N00639843EA0275502756000
+B0938114548115N00639814EA0275702755000
+B0938144548103N00639788EA0275102754000
+B0938174548091N00639758EA0274802753000
+B0938204548079N00639729EA0274402751000
+B0938234548069N00639698EA0273602749000
+B0938264548058N00639666EA0273302747000
+B0938294548052N00639634EA0273302744000
+B0938324548043N00639605EA0273202742000
+B0938354548032N00639574EA0273502740000
+B0938384548023N00639541EA0274302739000
+B0938414548014N00639515EA0274602739000
+B0938444548005N00639493EA0273202738000
+B0938474547991N00639459EA0272402737000
+B0938504547978N00639423EA0274102735000
+B0938534547972N00639405EA0275102734000
+B0938564547969N00639385EA0275202735000
+B0938594547962N00639358EA0275702736000
+B0939034547948N00639322EA0276202738000
+B0939064547933N00639296EA0276502740000
+B0939094547917N00639269EA0276702742000
+B0939124547899N00639244EA0276902744000
+B0939154547884N00639219EA0276502746000
+B0939184547866N00639191EA0275902747000
+B0939214547849N00639163EA0275602747000
+B0939244547832N00639136EA0275302747000
+B0939274547816N00639109EA0275002746000
+B0939304547799N00639081EA0274702745000
+B0939334547783N00639052EA0274502744000
+B0939364547767N00639022EA0274102743000
+B0939394547753N00638991EA0273502741000
+B0939424547742N00638960EA0273102739000
+B0939454547737N00638935EA0273002738000
+B0939484547727N00638912EA0271202735000
+B0939514547713N00638880EA0270802732000
+B0939544547699N00638850EA0270502728000
+B0939574547688N00638821EA0269402725000
+B0940004547677N00638789EA0269002721000
+B0940034547667N00638760EA0268202717000
+B0940064547656N00638728EA0267502712000
+B0940094547645N00638695EA0266902708000
+B0940124547633N00638664EA0266202703000
+B0940154547621N00638632EA0265702697000
+B0940184547610N00638600EA0264802692000
+B0940214547600N00638569EA0264302686000
+B0940254547585N00638527EA0263402679000
+B0940284547573N00638496EA0263002673000
+B0940314547562N00638467EA0262502667000
+B0940344547550N00638436EA0261702661000
+B0940374547537N00638405EA0260902655000
+B0940404547525N00638375EA0260002648000
+B0940434547514N00638342EA0259202642000
+B0940464547505N00638312EA0258302635000
+B0940494547495N00638280EA0257102628000
+B0940524547486N00638247EA0256202620000
+B0940554547475N00638215EA0255302613000
+B0940584547465N00638182EA0254102605000
+B0941014547454N00638149EA0253402596000
+B0941044547444N00638118EA0252402588000
+B0941074547433N00638085EA0251602580000
+B0941104547424N00638052EA0251602572000
+B0941134547416N00638022EA0250902564000
+B0941164547409N00637988EA0250302557000
+B0941194547405N00637954EA0249502550000
+B0941224547399N00637920EA0248802543000
+B0941254547394N00637886EA0248702536000
+B0941284547392N00637856EA0248702530000
+B0941314547389N00637829EA0247602524000
+B0941344547383N00637797EA0247102517000
+B0941374547375N00637768EA0246902512000
+B0941404547369N00637741EA0246802506000
+B0941444547362N00637707EA0247102499000
+B0941474547358N00637681EA0247302495000
+B0941504547353N00637655EA0247502492000
+B0941534547348N00637630EA0247702489000
+B0941564547341N00637603EA0247802486000
+B0941594547334N00637580EA0248202484000
+B0942024547327N00637558EA0248602483000
+B0942054547320N00637537EA0248902482000
+B0942084547312N00637511EA0249102482000
+B0942114547306N00637486EA0249302482000
+B0942144547300N00637461EA0249602482000
+B0942174547292N00637438EA0249802482000
+B0942204547281N00637416EA0249902483000
+B0942234547271N00637392EA0249802484000
+B0942264547260N00637369EA0250402484000
+B0942294547247N00637347EA0251102485000
+B0942324547235N00637323EA0251802487000
+B0942354547225N00637301EA0252202489000
+B0942384547214N00637278EA0252702492000
+B0942414547205N00637253EA0252802495000
+B0942444547194N00637227EA0253002497000
+B0942474547181N00637203EA0252802500000
+B0942504547166N00637180EA0253102502000
+B0942534547152N00637155EA0253502504000
+B0942564547140N00637133EA0253802506000
+B0942594547129N00637109EA0253702508000
+B0943034547116N00637075EA0253602511000
+B0943064547110N00637049EA0253702512000
+B0943094547102N00637022EA0253002513000
+B0943124547094N00636993EA0253302514000
+B0943154547083N00636968EA0252802515000
+B0943184547072N00636939EA0252702515000
+B0943214547064N00636912EA0252802515000
+B0943244547054N00636885EA0252702515000
+B0943274547041N00636860EA0252602515000
+B0943304547028N00636835EA0252202515000
+B0943334547015N00636809EA0252002514000
+B0943364547003N00636782EA0252002514000
+B0943394546992N00636756EA0251602513000
+B0943424546980N00636733EA0251002512000
+B0943454546967N00636708EA0250302511000
+B0943484546957N00636687EA0249702509000
+B0943514546946N00636667EA0248202507000
+B0943544546931N00636638EA0247102503000
+B0943574546915N00636607EA0246802499000
+B0944004546901N00636578EA0246002495000
+B0944034546886N00636548EA0245502490000
+B0944064546872N00636519EA0244802486000
+B0944094546858N00636489EA0243902481000
+B0944124546844N00636458EA0244002476000
+B0944154546829N00636433EA0244902472000
+B0944184546817N00636417EA0244502468000
+B0944214546800N00636396EA0244802465000
+B0944254546780N00636364EA0246002462000
+B0944284546768N00636342EA0245902461000
+B0944314546754N00636312EA0246002460000
+B0944344546742N00636282EA0246702460000
+B0944374546734N00636253EA0247202460000
+B0944404546727N00636226EA0247602461000
+B0944434546720N00636196EA0248302462000
+B0944464546716N00636168EA0249102464000
+B0944494546707N00636144EA0249502466000
+B0944524546693N00636121EA0249702469000
+B0944554546679N00636101EA0250702471000
+B0944584546665N00636083EA0250302474000
+B0945014546649N00636059EA0249702476000
+B0945044546638N00636031EA0250402478000
+B0945074546631N00636006EA0249802480000
+B0945104546619N00635978EA0248802481000
+B0945134546608N00635947EA0248402481000
+B0945164546597N00635918EA0247802480000
+B0945194546587N00635886EA0246902479000
+B0945224546580N00635851EA0247002477000
+B0945254546575N00635819EA0247702476000
+B0945284546573N00635796EA0248002475000
+B0945314546572N00635776EA0248402475000
+B0945344546569N00635755EA0248702475000
+B0945374546563N00635730EA0249702475000
+B0945404546563N00635712EA0250902477000
+B0945434546561N00635697EA0250902479000
+B0945464546555N00635676EA0252402481000
+B0945494546550N00635662EA0253102485000
+B0945524546542N00635644EA0253702488000
+B0945554546530N00635621EA0254502492000
+B0945584546520N00635594EA0255702496000
+B0946014546509N00635566EA0256502502000
+B0946054546494N00635535EA0257602510000
+B0946084546488N00635514EA0258002516000
+B0946114546477N00635487EA0257902522000
+B0946144546467N00635466EA0259302528000
+B0946174546459N00635454EA0258902534000
+B0946204546447N00635434EA0258902539000
+B0946234546438N00635418EA0258802543000
+B0946264546428N00635399EA0257702547000
+B0946294546415N00635373EA0256402549000
+B0946324546401N00635344EA0255902550000
+B0946354546389N00635315EA0255202550000
+B0946384546377N00635285EA0254602549000
+B0946414546367N00635254EA0254102547000
+B0946444546359N00635226EA0254302546000
+B0946474546353N00635202EA0254302544000
+B0946504546347N00635176EA0254902543000
+B0946534546339N00635153EA0255502542000
+B0946564546330N00635130EA0255802543000
+B0946594546322N00635101EA0255902543000
+B0947024546314N00635069EA0256302544000
+B0947054546306N00635039EA0256002544000
+B0947084546294N00635011EA0256802545000
+B0947114546286N00634992EA0256602547000
+B0947144546274N00634968EA0256402547000
+B0947174546260N00634940EA0257002548000
+B0947204546246N00634912EA0256302550000
+B0947234546232N00634884EA0255602550000
+B0947264546218N00634856EA0255102551000
+B0947294546205N00634828EA0254702550000
+B0947334546192N00634790EA0254502549000
+B0947364546182N00634762EA0254002548000
+B0947394546172N00634735EA0253502546000
+B0947424546161N00634706EA0252902544000
+B0947454546149N00634676EA0252602542000
+B0947484546138N00634646EA0252502539000
+B0947514546129N00634616EA0251802537000
+B0947544546117N00634581EA0251702534000
+B0947574546106N00634548EA0252002532000
+B0948004546094N00634514EA0251902529000
+B0948034546083N00634479EA0253102528000
+B0948064546073N00634453EA0254902528000
+B0948094546067N00634438EA0255402529000
+B0948124546058N00634417EA0254902530000
+B0948154546045N00634388EA0255702531000
+B0948184546037N00634364EA0256302533000
+B0948214546025N00634337EA0256202535000
+B0948244546012N00634311EA0257002538000
+B0948274546002N00634286EA0256802540000
+B0948304545991N00634261EA0255902542000
+B0948334545977N00634233EA0255402542000
+B0948364545964N00634206EA0255402543000
+B0948394545953N00634185EA0255402543000
+B0948424545944N00634165EA0254802543000
+B0948454545933N00634139EA0255102543000
+B0948484545924N00634114EA0254802543000
+B0948514545913N00634085EA0255402543000
+B0948544545905N00634056EA0256202543000
+B0948574545898N00634026EA0257402544000
+B0949004545892N00633998EA0258302546000
+B0949034545885N00633976EA0258102549000
+B0949074545876N00633947EA0257602552000
+B0949104545867N00633925EA0257902553000
+B0949134545858N00633907EA0258102555000
+B0949164545846N00633890EA0257602557000
+B0949194545836N00633870EA0258502558000
+B0949224545833N00633851EA0258902560000
+B0949254545826N00633833EA0259102562000
+B0949284545818N00633812EA0259102564000
+B0949314545810N00633788EA0258502565000
+B0949344545798N00633762EA0258402566000
+B0949374545787N00633734EA0258402567000
+B0949404545777N00633706EA0258102568000
+B0949434545766N00633676EA0257902568000
+B0949464545754N00633646EA0257702568000
+B0949494545743N00633616EA0257702567000
+B0949524545732N00633586EA0257902567000
+B0949554545720N00633557EA0257802567000
+B0949584545708N00633527EA0257802567000
+B0950014545693N00633498EA0258202567000
+B0950044545679N00633469EA0258702567000
+B0950074545666N00633440EA0258302568000
+B0950104545654N00633410EA0258302568000
+B0950134545642N00633381EA0258002568000
+B0950164545628N00633351EA0258302568000
+B0950194545617N00633326EA0258302568000
+B0950234545604N00633284EA0257702568000
+B0950264545594N00633253EA0258202568000
+B0950294545585N00633226EA0258302568000
+B0950324545574N00633199EA0257902568000
+B0950354545563N00633172EA0258002568000
+B0950384545553N00633148EA0257702568000
+B0950414545542N00633125EA0257202568000
+B0950444545529N00633101EA0257302568000
+B0950474545517N00633080EA0257102568000
+B0950504545504N00633058EA0256802567000
+B0950534545493N00633033EA0255902566000
+B0950564545481N00633007EA0255002564000
+B0950594545470N00632977EA0254202562000
+B0951024545458N00632948EA0254002559000
+B0951054545448N00632923EA0253802556000
+B0951084545441N00632900EA0253802553000
+B0951114545437N00632880EA0253402550000
+B0951144545431N00632860EA0253002547000
+B0951174545424N00632842EA0252402545000
+B0951204545415N00632821EA0251302541000
+B0951234545403N00632800EA0251002537000
+B0951264545393N00632780EA0250002533000
+B0951294545382N00632758EA0249702529000
+B0951324545372N00632739EA0248902524000
+B0951354545362N00632717EA0248202519000
+B0951384545354N00632697EA0247502514000
+B0951414545344N00632673EA0245902509000
+B0951454545331N00632630EA0246002501000
+B0951484545323N00632603EA0245502495000
+B0951514545314N00632574EA0244302489000
+B0951544545305N00632544EA0243902483000
+B0951574545297N00632515EA0243102477000
+B0952004545287N00632485EA0242202471000
+B0952034545277N00632455EA0241802464000
+B0952064545269N00632426EA0241302458000
+B0952094545258N00632397EA0240802452000
+B0952124545247N00632371EA0240202446000
+B0952154545236N00632344EA0239402439000
+B0952184545227N00632315EA0239002433000
+B0952214545218N00632292EA0238202427000
+B0952244545208N00632265EA0237902421000
+B0952274545200N00632240EA0238102416000
+B0952304545192N00632221EA0237402411000
+B0952334545183N00632198EA0236902405000
+B0952364545175N00632173EA0237002400000
+B0952394545167N00632150EA0236802396000
+B0952424545161N00632126EA0236802392000
+B0952454545154N00632103EA0236602388000
+B0952484545148N00632082EA0236602385000
+B0952514545142N00632061EA0236302381000
+B0952544545132N00632040EA0236002378000
+B0952574545122N00632021EA0236202375000
+B0953004545113N00632001EA0236502373000
+B0953034545104N00631980EA0237102371000
+B0953064545097N00631962EA0237702370000
+B0953094545091N00631943EA0237802370000
+B0953134545084N00631918EA0238102370000
+B0953164545077N00631901EA0238402371000
+B0953194545071N00631884EA0238602371000
+B0953224545067N00631866EA0239302372000
+B0953254545063N00631852EA0239602374000
+B0953284545054N00631836EA0240302375000
+B0953314545047N00631821EA0241402378000
+B0953344545039N00631807EA0241802380000
+B0953374545032N00631789EA0242502384000
+B0953404545026N00631769EA0243702388000
+B0953434545022N00631753EA0244702392000
+B0953464545016N00631736EA0245302397000
+B0953494545009N00631717EA0246402403000
+B0953524545002N00631699EA0247202409000
+B0953554544994N00631677EA0248102415000
+B0953584544988N00631658EA0249002422000
+B0954014544981N00631640EA0249402429000
+B0954044544976N00631619EA0250402436000
+B0954074544972N00631601EA0250902442000
+B0954104544967N00631579EA0251402449000
+B0954134544961N00631554EA0253002456000
+B0954164544957N00631532EA0253702463000
+B0954194544950N00631512EA0254102470000
+B0954224544945N00631494EA0253802477000
+B0954254544938N00631474EA0253502483000
+B0954284544932N00631451EA0253102488000
+B0954314544925N00631423EA0253002492000
+B0954344544919N00631395EA0253202495000
+B0954374544913N00631368EA0253102498000
+B0954404544908N00631341EA0253002501000
+B0954444544902N00631305EA0252802504000
+B0954474544895N00631280EA0252302506000
+B0954504544887N00631257EA0252102507000
+B0954534544879N00631235EA0251002508000
+B0954564544872N00631210EA0250702507000
+B0954594544867N00631187EA0250502506000
+B0955024544862N00631163EA0250302505000
+B0955054544856N00631139EA0250302504000
+B0955084544851N00631115EA0249902503000
+B0955114544846N00631087EA0249602502000
+B0955144544844N00631059EA0248902500000
+B0955174544842N00631032EA0248602498000
+B0955204544837N00631007EA0248102495000
+B0955234544833N00630983EA0248002493000
+B0955264544830N00630958EA0248302491000
+B0955294544827N00630934EA0248402489000
+B0955324544825N00630908EA0248202487000
+B0955354544822N00630881EA0247802486000
+B0955384544819N00630853EA0247602484000
+B0955414544814N00630827EA0246802482000
+B0955444544809N00630798EA0246502480000
+B0955474544803N00630771EA0245902478000
+B0955504544797N00630743EA0245202475000
+B0955534544790N00630713EA0244302473000
+B0955564544785N00630678EA0243902469000
+B0955594544784N00630648EA0244402466000
+B0956024544782N00630622EA0244002463000
+B0956064544776N00630582EA0244002459000
+B0956094544770N00630555EA0243802456000
+B0956124544765N00630525EA0242902452000
+B0956154544761N00630493EA0242402449000
+B0956184544758N00630462EA0241302445000
+B0956214544759N00630425EA0240602441000
+B0956244544766N00630388EA0240602436000
+B0956274544775N00630358EA0241002432000
+B0956304544784N00630332EA0240502429000
+B0956334544796N00630304EA0241102425000
+B0956364544808N00630287EA0242402423000
+B0956394544817N00630273EA0242502422000
+B0956424544828N00630254EA0243502422000
+B0956454544838N00630238EA0243902422000
+B0956484544851N00630221EA0244202423000
+B0956514544864N00630203EA0244802424000
+B0956544544872N00630184EA0245702426000
+B0956574544876N00630163EA0246402428000
+B0957004544879N00630146EA0246602431000
+B0957034544889N00630129EA0246602434000
+B0957064544898N00630110EA0246802437000
+B0957094544906N00630092EA0246602439000
+B0957124544921N00630085EA0246302442000
+B0957154544934N00630100EA0246602443000
+B0957184544933N00630120EA0246202445000
+B0957214544926N00630144EA0246402446000
+B0957244544918N00630166EA0246502447000
+B0957274544909N00630188EA0246902449000
+B0957304544898N00630207EA0247802450000
+B0957334544886N00630221EA0248402452000
+B0957374544867N00630226EA0249502456000
+B0957404544858N00630216EA0251202460000
+B0957434544857N00630204EA0252002463000
+B0957464544866N00630188EA0253102469000
+B0957494544879N00630183EA0254302475000
+B0957524544890N00630196EA0255302482000
+B0957554544890N00630217EA0256202489000
+B0957584544879N00630230EA0257002496000
+B0958014544866N00630227EA0258202503000
+B0958044544864N00630213EA0259402510000
+B0958074544872N00630199EA0260602518000
+B0958104544885N00630197EA0261502526000
+B0958134544893N00630212EA0262002534000
+B0958164544887N00630230EA0262702542000
+B0958194544873N00630233EA0263802550000
+B0958224544861N00630225EA0264502558000
+B0958254544852N00630210EA0264902566000
+B0958284544845N00630193EA0264902574000
+B0958314544837N00630173EA0264602581000
+B0958344544830N00630153EA0264202586000
+B0958374544824N00630133EA0264102591000
+B0958404544818N00630112EA0264002596000
+B0958434544811N00630091EA0264702600000
+B0958464544804N00630075EA0264902604000
+B0958494544798N00630055EA0264702608000
+B0958524544792N00630032EA0265202612000
+B0958554544786N00630014EA0264902616000
+B0958584544778N00629994EA0264002619000
+B0959014544768N00629973EA0263302621000
+B0959044544757N00629950EA0262402622000
+B0959074544748N00629923EA0261602621000
+B0959104544739N00629895EA0261102620000
+B0959144544728N00629858EA0260802618000
+B0959174544719N00629830EA0260302616000
+B0959204544710N00629801EA0259802614000
+B0959234544702N00629773EA0259502611000
+B0959264544694N00629746EA0259402609000
+B0959294544687N00629718EA0259202606000
+B0959324544678N00629687EA0261302604000
+B0959354544676N00629670EA0262402604000
+B0959384544671N00629648EA0263102605000
+B0959414544666N00629627EA0264302607000
+B0959444544663N00629607EA0263702610000
+B0959474544658N00629580EA0264002612000
+B0959504544656N00629559EA0264002614000
+B0959534544656N00629535EA0263902616000
+B0959564544653N00629508EA0264402618000
+B0959594544650N00629484EA0265102620000
+B1000024544645N00629456EA0265902623000
+B1000054544640N00629427EA0266602626000
+B1000084544633N00629400EA0267202629000
+B1000114544627N00629374EA0268002633000
+B1000144544618N00629352EA0268902637000
+B1000174544610N00629331EA0269402641000
+B1000204544603N00629308EA0269802645000
+B1000234544593N00629289EA0270302650000
+B1000264544581N00629271EA0270602654000
+B1000294544568N00629252EA0270902658000
+B1000324544556N00629233EA0270602662000
+B1000354544543N00629216EA0270702666000
+B1000384544534N00629200EA0271202669000
+B1000414544527N00629183EA0271302672000
+B1000444544517N00629164EA0272202675000
+B1000484544502N00629148EA0272502680000
+B1000514544491N00629138EA0272902684000
+B1000544544481N00629128EA0273302689000
+B1000574544472N00629114EA0273702693000
+B1001004544464N00629100EA0274102697000
+B1001034544455N00629086EA0274202701000
+B1001064544446N00629072EA0274102704000
+B1001094544439N00629056EA0273802707000
+B1001124544432N00629038EA0273502709000
+B1001154544425N00629020EA0273402711000
+B1001184544418N00629002EA0272902713000
+B1001214544412N00628981EA0272302714000
+B1001244544408N00628955EA0271602714000
+B1001274544405N00628925EA0271302713000
+B1001304544398N00628893EA0272002713000
+B1001334544391N00628870EA0272002713000
+B1001364544383N00628850EA0271502712000
+B1001394544371N00628829EA0271402712000
+B1001424544360N00628807EA0271102711000
+B1001454544351N00628782EA0270502710000
+B1001484544342N00628754EA0270302708000
+B1001514544335N00628726EA0269702707000
+B1001544544329N00628697EA0269402704000
+B1001574544320N00628671EA0269202702000
+B1002004544311N00628645EA0268402699000
+B1002034544301N00628615EA0267802696000
+B1002074544291N00628573EA0267202691000
+B1002104544286N00628541EA0266702688000
+B1002134544281N00628509EA0266302684000
+B1002164544277N00628478EA0265902681000
+B1002194544273N00628447EA0265702677000
+B1002224544268N00628416EA0265202673000
+B1002254544261N00628385EA0264502669000
+B1002284544255N00628356EA0264402665000
+B1002314544248N00628325EA0263102661000
+B1002344544241N00628288EA0262902656000
+B1002374544234N00628253EA0262202652000
+B1002404544226N00628216EA0261702647000
+B1002434544219N00628179EA0261402643000
+B1002464544213N00628144EA0260802638000
+B1002494544205N00628108EA0260502634000
+B1002524544197N00628072EA0260202629000
+B1002554544189N00628037EA0259502625000
+B1002584544181N00628000EA0259502620000
+B1003014544175N00627964EA0259402616000
+B1003044544168N00627930EA0258802613000
+B1003074544159N00627896EA0258402609000
+B1003104544149N00627862EA0257702605000
+B1003134544140N00627827EA0257302601000
+B1003164544132N00627793EA0256702597000
+B1003194544123N00627759EA0256102592000
+B1003234544111N00627712EA0255702586000
+B1003264544102N00627677EA0255302582000
+B1003294544092N00627643EA0254902578000
+B1003324544083N00627609EA0254502573000
+B1003354544072N00627577EA0254002569000
+B1003384544062N00627543EA0253602565000
+B1003414544054N00627508EA0253302560000
+B1003444544049N00627472EA0253002556000
+B1003474544045N00627435EA0252602552000
+B1003504544043N00627397EA0252302549000
+B1003534544039N00627360EA0252102545000
+B1003564544036N00627324EA0251702542000
+B1003594544031N00627286EA0251202538000
+B1004024544026N00627250EA0250702535000
+B1004054544020N00627215EA0250102531000
+B1004084544015N00627179EA0249702527000
+B1004114544009N00627142EA0249402523000
+B1004144544004N00627106EA0249102519000
+B1004174543999N00627070EA0248602515000
+B1004204543994N00627032EA0248402511000
+B1004234543989N00626996EA0248002507000
+B1004264543985N00626960EA0247502503000
+B1004294543980N00626923EA0247202499000
+B1004324543974N00626888EA0246602495000
+B1004354543968N00626851EA0246202491000
+B1004394543959N00626802EA0245902485000
+B1004424543953N00626766EA0245502481000
+B1004454543947N00626729EA0245102477000
+B1004484543942N00626694EA0244802473000
+B1004514543938N00626660EA0244202469000
+B1004544543934N00626622EA0243802464000
+B1004574543930N00626585EA0243402460000
+B1005004543927N00626547EA0243102456000
+B1005034543923N00626508EA0242702452000
+B1005064543920N00626471EA0242202448000
+B1005094543918N00626430EA0241802443000
+B1005124543917N00626391EA0241502439000
+B1005154543914N00626353EA0240802434000
+B1005184543908N00626314EA0240302430000
+B1005214543901N00626276EA0239602425000
+B1005244543895N00626237EA0239102420000
+B1005274543890N00626199EA0238802416000
+B1005304543886N00626160EA0238202411000
+B1005334543881N00626121EA0237802405000
+B1005364543877N00626083EA0237302400000
+B1005394543872N00626043EA0236802395000
+B1005424543868N00626003EA0236502390000
+B1005454543864N00625964EA0236002385000
+B1005484543860N00625924EA0235602381000
+B1005514543856N00625883EA0235302376000
+B1005554543851N00625830EA0234902370000
+B1005584543846N00625791EA0234402365000
+B1006014543841N00625751EA0234002361000
+B1006044543835N00625712EA0233402357000
+B1006074543829N00625673EA0232902352000
+B1006104543824N00625633EA0232502348000
+B1006134543819N00625594EA0232002343000
+B1006164543814N00625553EA0231502339000
+B1006194543809N00625514EA0231102334000
+B1006224543805N00625474EA0230602330000
+B1006254543800N00625434EA0230202326000
+B1006284543796N00625394EA0229702322000
+B1006314543791N00625354EA0229302317000
+B1006344543786N00625314EA0228802313000
+B1006374543780N00625275EA0228402309000
+B1006404543775N00625236EA0227902305000
+B1006434543768N00625197EA0227502300000
+B1006464543762N00625158EA0227102296000
+B1006494543756N00625119EA0226602292000
+B1006524543749N00625081EA0226202288000
+B1006554543742N00625044EA0225702284000
+B1006584543736N00625006EA0225302279000
+B1007014543730N00624968EA0224902275000
+B1007044543725N00624929EA0224402271000
+B1007074543719N00624891EA0224002267000
+B1007114543711N00624841EA0223502262000
+B1007144543706N00624803EA0223202258000
+B1007174543700N00624765EA0222702254000
+B1007204543694N00624727EA0222302249000
+B1007234543688N00624689EA0221802245000
+B1007264543683N00624651EA0221502241000
+B1007294543678N00624613EA0221002237000
+B1007324543673N00624575EA0220702233000
+B1007354543667N00624537EA0220202229000
+B1007384543661N00624499EA0219802224000
+B1007414543653N00624461EA0219302220000
+B1007444543645N00624424EA0218902216000
+B1007474543637N00624387EA0218402212000
+B1007504543629N00624349EA0217902208000
+B1007534543621N00624311EA0217702204000
+B1007564543614N00624275EA0217202200000
+B1007594543607N00624237EA0216802195000
+B1008024543600N00624200EA0216302191000
+B1008054543594N00624163EA0215902187000
+B1008084543587N00624126EA0215402183000
+B1008114543581N00624089EA0215002178000
+B1008144543573N00624052EA0214502174000
+B1008174543566N00624016EA0214202170000
+B1008204543558N00623981EA0213802166000
+B1008244543548N00623933EA0213302160000
+B1008274543541N00623897EA0212902156000
+B1008304543534N00623861EA0212502152000
+B1008334543526N00623826EA0212002148000
+B1008364543519N00623790EA0211502144000
+B1008394543511N00623754EA0211102140000
+B1008424543503N00623719EA0210602135000
+B1008454543495N00623683EA0210202131000
+B1008484543486N00623648EA0209702126000
+B1008514543477N00623612EA0209302122000
+B1008544543468N00623577EA0208902117000
+B1008574543460N00623542EA0208402113000
+B1009004543451N00623507EA0208002108000
+B1009034543440N00623473EA0207502104000
+B1009064543429N00623439EA0207202099000
+B1009094543418N00623407EA0206702095000
+B1009124543406N00623374EA0206302090000
+B1009154543395N00623341EA0205802086000
+B1009184543384N00623308EA0205302082000
+B1009214543373N00623274EA0204902078000
+B1009244543362N00623241EA0204502073000
+B1009274543351N00623208EA0204002069000
+B1009304543340N00623175EA0203602065000
+B1009334543329N00623142EA0203002060000
+B1009364543318N00623110EA0202702055000
+B1009404543303N00623066EA0202202049000
+B1009434543292N00623034EA0201702044000
+B1009464543281N00623001EA0201202039000
+B1009494543270N00622968EA0200802034000
+B1009524543260N00622935EA0200402029000
+B1009554543250N00622903EA0200102025000
+B1009584543240N00622870EA0199702020000
+B1010014543230N00622836EA0199202015000
+B1010044543219N00622802EA0198902010000
+B1010074543207N00622770EA0198502006000
+B1010104543196N00622737EA0198002002000
+B1010134543185N00622704EA0197601997000
+B1010164543175N00622671EA0197101993000
+B1010194543164N00622638EA0196701989000
+B1010224543155N00622606EA0196201985000
+B1010254543147N00622572EA0195701980000
+B1010284543138N00622539EA0195301976000
+B1010314543131N00622505EA0194701972000
+B1010344543125N00622471EA0194401968000
+B1010374543119N00622437EA0194001963000
+B1010404543115N00622403EA0193501959000
+B1010434543111N00622369EA0193001955000
+B1010464543108N00622335EA0192501950000
+B1010494543106N00622302EA0192001946000
+B1010524543104N00622268EA0191501942000
+B1010554543102N00622235EA0190901937000
+B1010594543100N00622190EA0190401931000
+B1011024543098N00622157EA0189801926000
+B1011054543096N00622123EA0189201921000
+B1011084543095N00622090EA0188701917000
+B1011114543095N00622058EA0188301912000
+B1011144543098N00622026EA0187701907000
+B1011174543101N00621995EA0187101902000
+B1011204543105N00621964EA0186501897000
+B1011234543110N00621934EA0186001892000
+B1011264543113N00621904EA0185501887000
+B1011294543114N00621873EA0184901882000
+B1011324543116N00621842EA0184501877000
+B1011354543117N00621813EA0184001872000
+B1011384543118N00621785EA0183301867000
+B1011414543121N00621756EA0183101862000
+B1011444543123N00621731EA0182101857000
+B1011474543126N00621703EA0181401851000
+B1011504543129N00621676EA0180801846000
+B1011534543133N00621649EA0180201840000
+B1011564543140N00621620EA0180801835000
+B1011594543147N00621603EA0181001831000
+B1012024543154N00621583EA0181301827000
+B1012054543163N00621565EA0182001824000
+B1012084543169N00621545EA0182201823000
+B1012114543171N00621526EA0182501822000
+B1012144543177N00621508EA0182801821000
+B1012174543186N00621491EA0183501821000
+B1012214543198N00621465EA0184101822000
+B1012244543203N00621443EA0185001824000
+B1012274543206N00621423EA0185201826000
+B1012304543200N00621406EA0185001828000
+B1012334543186N00621404EA0184501830000
+B1012364543180N00621425EA0184101830000
+B1012394543188N00621445EA0184501831000
+B1012424543199N00621452EA0185101832000
+B1012454543213N00621453EA0185701833000
+B1012484543227N00621455EA0186701835000
+B1012514543240N00621455EA0187101837000
+B1012544543254N00621452EA0187001840000
+B1012574543270N00621450EA0186901843000
+B1013004543286N00621447EA0186701845000
+B1013034543300N00621442EA0186201847000
+B1013064543315N00621437EA0185701848000
+B1013094543331N00621435EA0185701849000
+B1013124543343N00621430EA0185201849000
+B1013154543355N00621416EA0184801849000
+B1013184543366N00621397EA0184601849000
+B1013214543372N00621371EA0184701848000
+B1013244543377N00621346EA0184801848000
+B1013274543376N00621322EA0184401847000
+B1013304543371N00621300EA0184601846000
+B1013334543364N00621280EA0184401845000
+B1013364543356N00621260EA0184101844000
+B1013394543347N00621239EA0183801843000
+B1013434543334N00621207EA0183701841000
+B1013464543323N00621189EA0183301840000
+B1013494543311N00621171EA0182801838000
+B1013524543299N00621152EA0182301836000
+B1013554543287N00621134EA0181801834000
+B1013584543275N00621116EA0181701831000
+B1014014543264N00621099EA0181001829000
+B1014044543251N00621083EA0180701826000
+B1014074543237N00621069EA0180601824000
+B1014104543224N00621055EA0180501822000
+B1014134543211N00621042EA0179801819000
+B1014164543198N00621028EA0179401815000
+B1014194543184N00621014EA0179401812000
+B1014224543170N00620999EA0179401809000
+B1014254543157N00620984EA0179601806000
+B1014284543145N00620971EA0179801804000
+B1014314543135N00620956EA0179901802000
+B1014344543125N00620942EA0179701801000
+B1014374543115N00620929EA0179501800000
+B1014404543101N00620916EA0180001798000
+B1014434543088N00620904EA0180601798000
+B1014464543076N00620897EA0180501798000
+B1014494543062N00620905EA0180701798000
+B1014524543059N00620922EA0180701798000
+B1014554543067N00620937EA0180901798000
+B1014594543084N00620928EA0180601798000
+B1015024543088N00620906EA0180801797000
+B1015054543079N00620885EA0181501798000
+B1015084543070N00620872EA0181501798000
+B1015114543056N00620862EA0181201798000
+B1015144543044N00620850EA0181301799000
+B1015174543031N00620837EA0181001799000
+B1015204543017N00620828EA0180701798000
+B1015234543003N00620824EA0180301798000
+B1015264542988N00620820EA0179901797000
+B1015294542972N00620811EA0179901797000
+B1015324542959N00620802EA0180101796000
+B1015354542947N00620794EA0179701795000
+B1015384542933N00620785EA0179101794000
+B1015414542918N00620776EA0178301793000
+B1015444542901N00620769EA0177601791000
+B1015474542883N00620759EA0177701788000
+B1015504542869N00620746EA0177501786000
+B1015534542853N00620733EA0178201784000
+B1015564542841N00620723EA0178701783000
+B1015594542827N00620713EA0178801782000
+B1016024542813N00620699EA0179401782000
+B1016054542801N00620686EA0179401783000
+B1016084542790N00620672EA0179101783000
+B1016114542778N00620659EA0178601783000
+B1016144542765N00620645EA0178401783000
+B1016184542750N00620628EA0178201782000
+B1016214542738N00620615EA0178101781000
+B1016244542723N00620600EA0178401781000
+B1016274542710N00620589EA0178801781000
+B1016304542697N00620579EA0179301781000
+B1016334542686N00620564EA0180201782000
+B1016364542675N00620549EA0181001784000
+B1016394542662N00620544EA0181501786000
+B1016424542652N00620559EA0182701789000
+B1016454542649N00620572EA0183801792000
+B1016484542651N00620587EA0183601795000
+B1016514542660N00620605EA0183501799000
+B1016544542675N00620600EA0182901803000
+B1016574542680N00620578EA0183001805000
+B1017004542675N00620555EA0184201808000
+B1017034542668N00620534EA0185601812000
+B1017064542654N00620522EA0186901817000
+B1017094542645N00620535EA0188001822000
+B1017124542658N00620544EA0188801827000
+B1017154542668N00620524EA0189801832000
+B1017184542662N00620503EA0191601838000
+B1017214542650N00620501EA0192701845000
+B1017244542641N00620516EA0193701852000
+B1017274542648N00620535EA0194101859000
+B1017304542665N00620526EA0195201866000
+B1017334542669N00620500EA0197101875000
+B1017364542664N00620484EA0198101884000
+B1017394542652N00620474EA0199101894000
+B1017424542641N00620486EA0200101903000
+B1017454542646N00620505EA0201501913000
+B1017484542662N00620510EA0202501923000
+B1017514542674N00620494EA0204301933000
+B1017554542674N00620468EA0205201947000
+B1017584542663N00620452EA0206601957000
+B1018014542650N00620457EA0207401967000
+B1018044542646N00620474EA0208801977000
+B1018074542657N00620486EA0210201988000
+B1018104542671N00620484EA0211302000000
+B1018134542681N00620465EA0212502011000
+B1018164542681N00620442EA0214002023000
+B1018194542668N00620426EA0215402035000
+B1018224542652N00620415EA0216502047000
+B1018254542636N00620405EA0217202059000
+B1018284542621N00620393EA0217602070000
+B1018314542606N00620382EA0217602081000
+B1018344542591N00620369EA0218002091000
+B1018374542578N00620360EA0218702100000
+B1018404542567N00620351EA0219102109000
+B1018434542553N00620344EA0220202117000
+B1018464542543N00620337EA0220602126000
+B1018494542532N00620327EA0219802133000
+B1018524542517N00620314EA0219302140000
+B1018554542498N00620298EA0218802145000
+B1018584542479N00620282EA0218702149000
+B1019014542461N00620268EA0218002153000
+B1019044542440N00620254EA0217702155000
+B1019074542420N00620240EA0217402157000
+B1019104542399N00620227EA0217402158000
+B1019134542379N00620216EA0217002159000
+B1019164542359N00620202EA0217102160000
+B1019194542340N00620184EA0217702160000
+B1019224542321N00620171EA0218102161000
+B1019254542301N00620162EA0217702163000
+B1019294542273N00620146EA0217602163000
+B1019324542255N00620133EA0217202164000
+B1019354542235N00620122EA0216802164000
+B1019384542219N00620114EA0216702163000
+B1019414542202N00620103EA0215802162000
+B1019444542186N00620090EA0216002161000
+B1019474542172N00620078EA0216302160000
+B1019504542160N00620072EA0216902160000
+B1019534542150N00620065EA0217002160000
+B1019564542136N00620056EA0217702161000
+B1019594542125N00620048EA0218202163000
+B1020024542111N00620038EA0218302164000
+B1020054542095N00620030EA0218902166000
+B1020084542080N00620023EA0218702168000
+B1020114542063N00620014EA0218902170000
+B1020144542048N00620003EA0218902171000
+B1020174542032N00619994EA0218802173000
+B1020204542015N00619985EA0219102173000
+B1020234542000N00619980EA0219002174000
+B1020264541984N00619973EA0218302175000
+B1020294541966N00619964EA0217602175000
+B1020324541949N00619955EA0216602174000
+B1020354541930N00619943EA0215602172000
+B1020384541911N00619930EA0215602170000
+B1020414541896N00619922EA0215102167000
+B1020444541878N00619912EA0214502165000
+B1020474541861N00619903EA0214002162000
+B1020514541837N00619889EA0213202157000
+B1020544541819N00619876EA0213002154000
+B1020574541802N00619862EA0212602150000
+B1021004541784N00619847EA0212702146000
+B1021034541770N00619834EA0212902143000
+B1021064541755N00619821EA0212602141000
+B1021094541739N00619808EA0212802138000
+B1021124541722N00619791EA0212802136000
+B1021154541704N00619777EA0213502135000
+B1021184541690N00619765EA0215002135000
+B1021214541679N00619754EA0215402136000
+B1021244541664N00619744EA0216102137000
+B1021274541650N00619751EA0216602139000
+B1021304541648N00619772EA0217402142000
+B1021334541660N00619785EA0218002145000
+B1021364541675N00619776EA0218602148000
+B1021394541681N00619752EA0219802151000
+B1021424541680N00619727EA0220202155000
+B1021454541673N00619704EA0220902159000
+B1021484541665N00619688EA0221702164000
+B1021514541653N00619683EA0221902169000
+B1021544541643N00619695EA0222202174000
+B1021574541646N00619716EA0222802179000
+B1022004541662N00619722EA0223202183000
+B1022034541677N00619707EA0223602188000
+B1022064541679N00619683EA0224202193000
+B1022094541670N00619665EA0225002197000
+B1022124541660N00619652EA0225602202000
+B1022154541647N00619651EA0225502207000
+B1022184541640N00619666EA0225702212000
+B1022214541648N00619682EA0226002216000
+B1022244541663N00619677EA0225802220000
+B1022274541666N00619651EA0226602223000
+B1022314541654N00619633EA0227302228000
+B1022344541642N00619623EA0226802232000
+B1022374541626N00619612EA0226602235000
+B1022404541608N00619595EA0225802237000
+B1022434541590N00619573EA0225502238000
+B1022464541573N00619552EA0225202239000
+B1022494541555N00619529EA0224302239000
+B1022524541537N00619503EA0224202239000
+B1022554541521N00619479EA0223902239000
+B1022584541504N00619453EA0223702238000
+B1023014541486N00619428EA0223402237000
+B1023044541469N00619404EA0223002236000
+B1023074541452N00619379EA0222502234000
+B1023104541435N00619355EA0221902233000
+B1023134541418N00619329EA0221302231000
+B1023164541402N00619302EA0220702229000
+B1023194541386N00619277EA0220002226000
+B1023224541369N00619251EA0219502223000
+B1023254541352N00619225EA0218902220000
+B1023284541335N00619200EA0218002216000
+B1023314541318N00619173EA0217402212000
+B1023344541302N00619144EA0216602208000
+B1023374541285N00619115EA0216102204000
+B1023404541269N00619085EA0215402199000
+B1023434541252N00619056EA0214702194000
+B1023464541235N00619028EA0214302189000
+B1023504541217N00618991EA0213702181000
+B1023534541203N00618961EA0213202176000
+B1023564541191N00618929EA0213002171000
+B1023594541180N00618898EA0212802166000
+B1024024541169N00618867EA0212502160000
+B1024054541157N00618836EA0211802155000
+B1024084541144N00618804EA0211302150000
+B1024114541132N00618775EA0210702145000
+B1024144541117N00618745EA0209902139000
+B1024174541105N00618713EA0209702134000
+B1024204541093N00618684EA0209002129000
+B1024234541081N00618652EA0208402124000
+B1024264541069N00618620EA0208002118000
+B1024294541058N00618590EA0207302113000
+B1024324541046N00618559EA0207002108000
+B1024354541034N00618528EA0206602103000
+B1024384541024N00618497EA0206002098000
+B1024414541013N00618465EA0205502093000
+B1024444541002N00618434EA0205302088000
+B1024474540991N00618404EA0204902083000
+B1024504540980N00618373EA0204502079000
+B1024534540968N00618343EA0204002074000
+B1024564540955N00618312EA0203602070000
+B1024594540942N00618283EA0203102066000
+B1025024540929N00618255EA0202602061000
+B1025064540912N00618215EA0202302055000
+B1025094540899N00618185EA0201702051000
+B1025124540886N00618157EA0201102046000
+B1025154540873N00618127EA0200602041000
+B1025184540861N00618098EA0200202037000
+B1025214540849N00618068EA0199702032000
+B1025244540837N00618038EA0199302027000
+B1025274540825N00618007EA0199102023000
+B1025304540815N00617976EA0198502018000
+B1025334540804N00617945EA0198202013000
+B1025364540794N00617913EA0197802009000
+B1025394540785N00617881EA0197302005000
+B1025424540776N00617849EA0196902000000
+B1025454540767N00617816EA0196501996000
+B1025484540758N00617784EA0196101991000
+B1025514540748N00617752EA0195801987000
+B1025544540739N00617721EA0195301982000
+B1025574540729N00617690EA0194901978000
+B1026004540720N00617658EA0194501973000
+B1026034540711N00617627EA0193901969000
+B1026064540702N00617595EA0193501964000
+B1026094540693N00617562EA0193001959000
+B1026124540684N00617531EA0192501954000
+B1026154540675N00617499EA0191901950000
+B1026184540666N00617466EA0191201945000
+B1026224540653N00617421EA0190701938000
+B1026254540644N00617386EA0190501933000
+B1026284540638N00617353EA0190801929000
+B1026314540634N00617320EA0190701925000
+B1026344540629N00617290EA0191301922000
+B1026374540623N00617268EA0191601920000
+B1026404540616N00617245EA0191901918000
+B1026434540611N00617223EA0192201917000
+B1026464540609N00617202EA0191801916000
+B1026494540604N00617177EA0191601915000
+B1026524540600N00617152EA0191901914000
+B1026554540596N00617129EA0191901913000
+B1026584540594N00617104EA0192501912000
+B1027014540593N00617077EA0193601912000
+B1027044540592N00617051EA0194701914000
+B1027074540585N00617028EA0195801916000
+B1027104540570N00617021EA0196701920000
+B1027134540561N00617033EA0197401924000
+B1027164540568N00617045EA0197801928000
+B1027194540582N00617036EA0198601933000
+B1027224540596N00617015EA0200201938000
+B1027254540598N00616995EA0201101944000
+B1027284540591N00616979EA0201401950000
+B1027314540577N00616974EA0202101956000
+B1027344540567N00616984EA0203101963000
+B1027374540569N00616996EA0204001966000
+B1027404540582N00617002EA0204901975000
+B1027434540595N00616989EA0206001982000
+B1027464540599N00616965EA0206801991000
+B1027494540594N00616950EA0206901999000
+B1027534540577N00616938EA0207502009000
+B1027564540567N00616940EA0208402015000
+B1027594540564N00616950EA0208702020000
+B1028024540572N00616963EA0209702028000
+B1028054540584N00616961EA0210302036000
+B1028084540596N00616947EA0210902043000
+B1028114540600N00616929EA0211202050000
+B1028144540597N00616909EA0211002057000
+B1028174540589N00616888EA0211402063000
+B1028204540580N00616870EA0211802068000
+B1028234540571N00616853EA0211602073000
+B1028264540558N00616835EA0211102078000
+B1028294540543N00616819EA0210502081000
+B1028324540525N00616806EA0209802084000
+B1028354540506N00616790EA0209002085000
+B1028384540486N00616771EA0208502086000
+B1028414540465N00616752EA0207902085000
+B1028444540445N00616732EA0207302084000
+B1028474540424N00616713EA0206502081000
+B1028504540403N00616692EA0206102079000
+B1028534540382N00616673EA0205602076000
+B1028564540361N00616653EA0204902072000
+B1028594540340N00616632EA0204502069000
+B1029024540320N00616612EA0203802065000
+B1029054540300N00616592EA0203202060000
+B1029084540280N00616574EA0202702056000
+B1029114540260N00616556EA0202102051000
+B1029154540233N00616533EA0201502044000
+B1029184540213N00616515EA0201002039000
+B1029214540193N00616498EA0200402035000
+B1029244540173N00616480EA0199902030000
+B1029274540153N00616463EA0199402025000
+B1029304540132N00616448EA0198802019000
+B1029334540112N00616433EA0198202014000
+B1029364540091N00616419EA0197702009000
+B1029394540072N00616406EA0197302004000
+B1029424540053N00616392EA0196501999000
+B1029454540033N00616379EA0196001993000
+B1029484540013N00616366EA0195601988000
+B1029514539994N00616353EA0195101983000
+B1029544539974N00616339EA0194601978000
+B1029574539955N00616325EA0194101973000
+B1030004539936N00616311EA0193601967000
+B1030034539916N00616297EA0193101962000
+B1030064539896N00616283EA0192601957000
+B1030094539877N00616269EA0192201952000
+B1030124539857N00616257EA0191801947000
+B1030154539837N00616245EA0191301942000
+B1030184539817N00616234EA0191001937000
+B1030214539797N00616224EA0190601933000
+B1030244539776N00616215EA0190201928000
+B1030274539755N00616205EA0189801923000
+B1030314539728N00616191EA0189601918000
+B1030344539707N00616180EA0189201913000
+B1030374539686N00616169EA0188801909000
+B1030404539666N00616159EA0188501905000
+B1030434539646N00616148EA0188101901000
+B1030464539626N00616139EA0187701897000
+B1030494539605N00616129EA0187401893000
+B1030524539585N00616119EA0187101889000
+B1030554539565N00616109EA0186801885000
+B1030584539544N00616099EA0186401882000
+B1031014539524N00616090EA0186001878000
+B1031044539504N00616081EA0185601874000
+B1031074539483N00616073EA0185001870000
+B1031104539462N00616065EA0184901866000
+B1031134539443N00616058EA0184301862000
+B1031164539425N00616052EA0184401859000
+B1031194539409N00616045EA0183701855000
+B1031224539390N00616036EA0183801852000
+B1031254539374N00616025EA0184201849000
+B1031284539362N00616015EA0184401847000
+B1031314539350N00616004EA0184701845000
+B1031344539339N00615993EA0184701844000
+B1031374539327N00615981EA0184601843000
+B1031404539314N00615972EA0184201842000
+B1031434539300N00615964EA0183601840000
+B1031474539280N00615953EA0183001838000
+B1031504539263N00615947EA0182501835000
+B1031534539247N00615939EA0182201832000
+B1031564539232N00615931EA0181801830000
+B1031594539216N00615924EA0181501827000
+B1032024539198N00615918EA0181301824000
+B1032054539183N00615911EA0181201821000
+B1032084539167N00615905EA0180601818000
+B1032114539151N00615900EA0180201815000
+B1032144539135N00615897EA0179901812000
+B1032174539119N00615892EA0180201809000
+B1032204539106N00615886EA0180501807000
+B1032234539093N00615880EA0181401806000
+B1032264539082N00615877EA0182001806000
+B1032294539071N00615878EA0182501806000
+B1032324539059N00615882EA0183101807000
+B1032354539056N00615896EA0183301808000
+B1032384539070N00615909EA0184201810000
+B1032414539087N00615903EA0184601812000
+B1032444539099N00615880EA0185101815000
+B1032474539097N00615856EA0185701818000
+B1032504539088N00615837EA0186601821000
+B1032534539079N00615825EA0186701825000
+B1032564539065N00615820EA0186901829000
+B1032594539052N00615821EA0186601832000
+B1033024539040N00615836EA0186401836000
+B1033054539030N00615848EA0186101838000
+B1033084539016N00615852EA0185801841000
+B1033124538998N00615845EA0185601843000
+B1033154538986N00615832EA0185701845000
+B1033184538972N00615822EA0185301845000
+B1033214538959N00615812EA0184801846000
+B1033244538944N00615799EA0184801846000
+B1033274538932N00615783EA0185201845000
+B1033304538922N00615767EA0186201846000
+B1033334538914N00615753EA0187001848000
+B1033364538903N00615747EA0187501850000
+B1033394538895N00615761EA0188001852000
+B1033424538901N00615776EA0189001855000
+B1033454538914N00615775EA0189601858000
+B1033484538927N00615762EA0190701862000
+B1033514538933N00615740EA0191101866000
+B1033544538929N00615718EA0192101871000
+B1033574538918N00615709EA0192901875000
+B1034004538908N00615717EA0193601880000
+B1034034538909N00615734EA0194101885000
+B1034064538921N00615744EA0195401891000
+B1034094538935N00615733EA0196401897000
+B1034124538944N00615711EA0197601904000
+B1034154538942N00615687EA0198201911000
+B1034184538930N00615678EA0199001919000
+B1034214538925N00615688EA0199601924000
+B1034244538932N00615704EA0200301932000
+B1034274538948N00615703EA0201701940000
+B1034304538958N00615681EA0202901949000
+B1034334538961N00615654EA0203801958000
+B1034364538954N00615633EA0204501967000
+B1034394538941N00615628EA0204901976000
+B1034424538934N00615642EA0205301984000
+B1034454538939N00615657EA0205901991000
+B1034484538954N00615665EA0207101998000
+B1034524538974N00615656EA0207802009000
+B1034554538987N00615637EA0209102017000
+B1034584538990N00615613EA0209702025000
+B1035014538981N00615594EA0210302033000
+B1035044538966N00615593EA0210802041000
+B1035074538961N00615608EA0211202048000
+B1035104538972N00615622EA0212202055000
+B1035134538988N00615618EA0213302062000
+B1035164538998N00615599EA0214202070000
+B1035194538998N00615574EA0214802077000
+B1035224538987N00615556EA0215402085000
+B1035254538972N00615553EA0216002092000
+B1035284538966N00615567EA0216202098000
+B1035314538973N00615584EA0216502105000
+B1035344538989N00615586EA0217102111000
+B1035374539004N00615576EA0218102118000
+B1035404539015N00615559EA0219002125000
+B1035434539024N00615538EA0219502132000
+B1035464539020N00615514EA0220002139000
+B1035494539004N00615506EA0220902146000
+B1035524538994N00615516EA0221402152000
+B1035554538996N00615535EA0222102159000
+B1035584539009N00615539EA0222702166000
+B1036014539019N00615518EA0223802173000
+B1036044539018N00615494EA0224302179000
+B1036074539010N00615476EA0224802185000
+B1036104538996N00615469EA0225302191000
+B1036134538984N00615478EA0225602197000
+B1036164538982N00615495EA0225702203000
+B1036194538990N00615509EA0225902208000
+B1036224539007N00615511EA0226502213000
+B1036264539025N00615488EA0227402221000
+B1036294539035N00615466EA0228102226000
+B1036324539041N00615442EA0228202232000
+B1036354539035N00615417EA0228602237000
+B1036384539023N00615403EA0228902242000
+B1036414539010N00615395EA0229002247000
+B1036444538994N00615388EA0229202251000
+B1036474538977N00615383EA0229202256000
+B1036504538960N00615379EA0228902259000
+B1036534538942N00615376EA0228102262000
+B1036564538922N00615372EA0227702263000
+B1036594538903N00615368EA0227202264000
+B1037024538883N00615365EA0226702264000
+B1037054538864N00615364EA0226302264000
+B1037084538845N00615363EA0225802263000
+B1037114538825N00615362EA0225402261000
+B1037144538806N00615360EA0224902259000
+B1037174538787N00615358EA0224302257000
+B1037204538768N00615356EA0224102255000
+B1037234538750N00615353EA0223502252000
+B1037264538731N00615351EA0223302250000
+B1037294538712N00615347EA0222802247000
+B1037324538693N00615344EA0222602244000
+B1037354538674N00615341EA0222302241000
+B1037384538656N00615338EA0221902238000
+B1037414538637N00615336EA0221502235000
+B1037444538618N00615333EA0221202232000
+B1037484538594N00615329EA0220802228000
+B1037514538575N00615326EA0220602225000
+B1037544538557N00615323EA0220202222000
+B1037574538538N00615319EA0219802218000
+B1038004538520N00615316EA0219502215000
+B1038034538502N00615312EA0219102212000
+B1038064538484N00615308EA0218802209000
+B1038094538466N00615304EA0218402205000
+B1038124538448N00615300EA0218202202000
+B1038154538432N00615298EA0218002199000
+B1038184538418N00615296EA0217802196000
+B1038214538402N00615292EA0217502193000
+B1038244538386N00615290EA0217602190000
+B1038274538371N00615286EA0217802188000
+B1038304538357N00615287EA0217602186000
+B1038334538342N00615287EA0217402184000
+B1038364538325N00615284EA0217402182000
+B1038394538307N00615279EA0217402180000
+B1038424538289N00615271EA0217102179000
+B1038454538269N00615266EA0216902177000
+B1038484538250N00615261EA0216602175000
+B1038514538231N00615255EA0216402173000
+B1038544538209N00615248EA0216802171000
+B1038574538188N00615242EA0217002170000
+B1039004538167N00615234EA0217402169000
+B1039044538141N00615224EA0216802169000
+B1039074538122N00615221EA0216602168000
+B1039104538106N00615221EA0217002167000
+B1039134538094N00615218EA0216102166000
+B1039164538077N00615210EA0215602164000
+B1039194538058N00615201EA0215202162000
+B1039224538040N00615195EA0214302160000
+B1039254538021N00615187EA0213502157000
+B1039284538005N00615177EA0213702154000
+B1039314537991N00615166EA0213502151000
+B1039344537974N00615153EA0214202148000
+B1039374537959N00615143EA0214102147000
+B1039404537943N00615132EA0213402145000
+B1039434537925N00615120EA0212802143000
+B1039464537909N00615104EA0213102140000
+B1039494537895N00615089EA0213002138000
+B1039524537879N00615074EA0212802136000
+B1039554537865N00615058EA0212302134000
+B1039584537849N00615041EA0211702132000
+B1040014537832N00615025EA0211802129000
+B1040044537817N00615009EA0211202127000
+B1040074537802N00614989EA0210902124000
+B1040104537787N00614968EA0210402121000
+B1040134537772N00614947EA0210602118000
+B1040164537758N00614928EA0210202115000
+B1040194537743N00614905EA0210602113000
+B1040224537729N00614885EA0211802111000
+B1040264537715N00614866EA0212202111000
+B1040294537704N00614852EA0212202111000
+B1040324537696N00614832EA0212502111000
+B1040354537688N00614815EA0212602112000
+B1040384537679N00614796EA0212602113000
+B1040414537672N00614777EA0212502114000
+B1040444537663N00614759EA0212302114000
+B1040474537655N00614741EA0211802114000
+B1040504537646N00614720EA0211402113000
+B1040534537638N00614699EA0212002113000
+B1040564537630N00614681EA0212102113000
+B1040594537620N00614659EA0212602113000
+B1041024537610N00614639EA0213402114000
+B1041054537602N00614622EA0213502115000
+B1041084537593N00614605EA0213702117000
+B1041114537584N00614587EA0213802118000
+B1041144537575N00614567EA0213802120000
+B1041174537566N00614548EA0213402121000
+B1041204537556N00614528EA0213202122000
+B1041234537545N00614512EA0212602122000
+B1041264537533N00614496EA0212302121000
+B1041294537521N00614479EA0212102121000
+B1041324537508N00614461EA0211602120000
+B1041354537493N00614444EA0211102118000
+B1041384537479N00614426EA0210702116000
+B1041414537464N00614408EA0210602114000
+B1041444537450N00614391EA0210902113000
+B1041474537435N00614374EA0210902111000
+B1041514537415N00614355EA0210902110000
+B1041544537401N00614341EA0210702108000
+B1041574537388N00614326EA0210302107000
+B1042004537376N00614311EA0209702105000
+B1042034537361N00614294EA0208402103000
+B1042064537345N00614274EA0208202100000
+B1042094537330N00614256EA0207602096000
+B1042124537313N00614238EA0207102092000
+B1042154537296N00614220EA0206602089000
+B1042184537278N00614202EA0206102085000
+B1042214537261N00614183EA0205702081000
+B1042244537244N00614164EA0205102077000
+B1042274537227N00614145EA0204702072000
+B1042304537213N00614127EA0204202068000
+B1042334537199N00614110EA0203802064000
+B1042364537182N00614092EA0204102060000
+B1042394537167N00614076EA0204702056000
+B1042424537157N00614060EA0205402054000
+B1042454537146N00614043EA0205902053000
+B1042484537136N00614029EA0205802052000
+B1042514537124N00614015EA0206002052000
+B1042544537114N00614001EA0206102052000
+B1042574537105N00613987EA0206302051000
+B1043004537096N00613970EA0206502051000
+B1043034537088N00613956EA0206402052000
+B1043064537078N00613939EA0206502052000
+B1043094537068N00613922EA0206802052000
+B1043134537056N00613901EA0206202053000
+B1043164537045N00613884EA0205102053000
+B1043194537031N00613866EA0204902051000
+B1043224537019N00613852EA0204902050000
+B1043254537009N00613834EA0204202049000
+B1043284536998N00613813EA0204602047000
+B1043314536990N00613799EA0204302047000
+B1043344536979N00613784EA0203602045000
+B1043374536967N00613766EA0203702043000
+B1043404536957N00613751EA0203202042000
+B1043434536945N00613737EA0202802039000
+B1043464536932N00613727EA0202402037000
+B1043494536918N00613715EA0203002035000
+B1043524536906N00613704EA0203402033000
+B1043554536894N00613689EA0203102032000
+B1043584536879N00613672EA0203102031000
+B1044014536865N00613657EA0203602030000
+B1044044536855N00613643EA0204302030000
+B1044074536847N00613628EA0204302030000
+B1044104536839N00613609EA0204702031000
+B1044134536833N00613590EA0205102032000
+B1044164536826N00613569EA0205402034000
+B1044194536820N00613549EA0205302036000
+B1044224536812N00613525EA0205102038000
+B1044254536804N00613502EA0204802039000
+B1044284536796N00613481EA0204302039000
+B1044314536787N00613462EA0203702039000
+B1044354536774N00613434EA0203302038000
+B1044384536764N00613414EA0203002037000
+B1044414536754N00613395EA0202602035000
+B1044444536745N00613376EA0202102034000
+B1044474536735N00613356EA0201602031000
+B1044504536725N00613335EA0201302029000
+B1044534536716N00613314EA0201802026000
+B1044564536707N00613296EA0202502025000
+B1044594536697N00613282EA0203002024000
+B1045024536686N00613267EA0203602024000
+B1045054536673N00613253EA0204602025000
+B1045084536659N00613246EA0205302027000
+B1045114536649N00613254EA0205802029000
+B1045144536647N00613270EA0206102032000
+B1045174536658N00613282EA0206002035000
+B1045204536674N00613276EA0206302037000
+B1045234536684N00613253EA0207102039000
+B1045264536688N00613228EA0208002042000
+B1045294536690N00613200EA0209102046000
+B1045324536687N00613176EA0209702050000
+B1045354536675N00613163EA0210202055000
+B1045384536666N00613172EA0210602059000
+B1045414536671N00613189EA0211002064000
+B1045444536688N00613188EA0211802068000
+B1045474536705N00613173EA0213202073000
+B1045504536718N00613154EA0214402080000
+B1045534536726N00613129EA0215102086000
+B1045564536720N00613107EA0215902093000
+B1045594536708N00613097EA0217102100000
+B1046024536700N00613102EA0217902105000
+B1046064536708N00613119EA0218702116000
+B1046094536726N00613120EA0220002124000
+B1046124536740N00613101EA0221002133000
+B1046154536741N00613074EA0221602142000
+B1046184536734N00613056EA0222002150000
+B1046214536723N00613055EA0222702157000
+B1046244536722N00613071EA0223402165000
+B1046274536730N00613084EA0224102172000
+B1046304536746N00613090EA0224802180000
+B1046334536766N00613080EA0225302187000
+B1046364536778N00613056EA0226002194000
+B1046394536776N00613032EA0225902201000
+B1046424536766N00613024EA0226002207000
+B1046454536757N00613031EA0226402211000
+B1046484536757N00613045EA0226502216000
+B1046514536770N00613055EA0227002222000
+B1046544536785N00613043EA0227102227000
+B1046574536789N00613019EA0227102232000
+B1047004536781N00613002EA0227202236000
+B1047034536768N00612988EA0226702239000
+B1047064536754N00612971EA0226702242000
+B1047094536745N00612954EA0226702244000
+B1047124536736N00612939EA0226502246000
+B1047154536726N00612922EA0226702247000
+B1047184536716N00612904EA0226702249000
+B1047214536706N00612882EA0227902251000
+B1047244536697N00612865EA0228502253000
+B1047274536687N00612848EA0229102256000
+B1047304536679N00612829EA0230002259000
+B1047334536673N00612810EA0230402263000
+B1047364536667N00612789EA0229902267000
+B1047394536659N00612768EA0229002270000
+B1047434536644N00612742EA0227602270000
+B1047464536631N00612720EA0227302270000
+B1047494536620N00612700EA0226202269000
+B1047524536607N00612675EA0225502267000
+B1047554536596N00612651EA0224902264000
+B1047584536584N00612627EA0224302261000
+B1048014536573N00612603EA0224902259000
+B1048044536564N00612581EA0225402257000
+B1048074536556N00612561EA0225902257000
+B1048104536547N00612540EA0226502256000
+B1048134536541N00612521EA0226902257000
+B1048164536532N00612502EA0227502258000
+B1048194536527N00612485EA0227902259000
+B1048224536519N00612463EA0228202261000
+B1048254536512N00612444EA0228402263000
+B1048284536504N00612426EA0228602265000
+B1048314536493N00612409EA0229602267000
+B1048344536485N00612402EA0230302269000
+B1048374536477N00612395EA0230002272000
+B1048404536470N00612380EA0229602274000
+B1048434536460N00612363EA0229402276000
+B1048464536450N00612345EA0229202278000
+B1048494536441N00612330EA0228202278000
+B1048524536430N00612312EA0227602278000
+B1048554536417N00612290EA0227102277000
+B1048584536403N00612270EA0227702276000
+B1049014536392N00612252EA0227802275000
+B1049044536380N00612236EA0228202274000
+B1049074536369N00612222EA0228602275000
+B1049104536360N00612210EA0228602275000
+B1049134536352N00612193EA0228502276000
+B1049174536337N00612168EA0228602276000
+B1049204536321N00612147EA0230002277000
+B1049234536311N00612129EA0230802280000
+B1049264536301N00612109EA0231802282000
+B1049294536291N00612095EA0233202287000
+B1049324536286N00612086EA0233002290000
+B1049354536275N00612073EA0233602294000
+B1049384536267N00612063EA0234002299000
+B1049414536258N00612049EA0233902303000
+B1049444536249N00612035EA0234202306000
+B1049474536240N00612020EA0233802310000
+B1049504536229N00612002EA0233802313000
+B1049534536220N00611985EA0233402315000
+B1049564536209N00611966EA0233002317000
+B1049594536199N00611948EA0233102318000
+B1050024536190N00611932EA0233202319000
+B1050054536181N00611917EA0233402319000
+B1050084536172N00611901EA0233402320000
+B1050114536162N00611885EA0233302321000
+B1050144536152N00611871EA0233602322000
+B1050174536143N00611854EA0234302323000
+B1050204536137N00611837EA0234902324000
+B1050234536132N00611821EA0235202326000
+B1050264536124N00611804EA0235902328000
+B1050294536117N00611787EA0236102331000
+B1050324536110N00611767EA0235902334000
+B1050354536100N00611747EA0235902336000
+B1050384536089N00611727EA0235802338000
+B1050414536080N00611704EA0235402339000
+B1050444536072N00611681EA0234902340000
+B1050474536063N00611658EA0234602341000
+B1050514536050N00611630EA0234102340000
+B1050544536039N00611608EA0234102340000
+B1050574536029N00611585EA0234002339000
+B1051004536018N00611562EA0233902339000
+B1051034536007N00611538EA0234102338000
+B1051064535998N00611515EA0234102338000
+B1051094535989N00611491EA0234302338000
+B1051124535979N00611467EA0235602338000
+B1051154535971N00611452EA0236102339000
+B1051184535963N00611434EA0236202341000
+B1051214535953N00611414EA0236802343000
+B1051244535945N00611389EA0236802345000
+B1051274535940N00611362EA0236602347000
+B1051304535934N00611336EA0236202348000
+B1051334535926N00611310EA0236202349000
+B1051364535919N00611285EA0235902349000
+B1051394535910N00611259EA0235702349000
+B1051424535902N00611233EA0235602349000
+B1051454535894N00611206EA0235702349000
+B1051484535888N00611180EA0236402350000
+B1051514535884N00611154EA0236602351000
+B1051544535880N00611128EA0236402352000
+B1051574535877N00611102EA0235902353000
+B1052004535872N00611073EA0235702353000
+B1052034535867N00611045EA0235402353000
+B1052074535865N00611005EA0235602353000
+B1052104535860N00610977EA0235602353000
+B1052134535856N00610949EA0235802353000
+B1052164535851N00610921EA0235202353000
+B1052194535845N00610891EA0235502352000
+B1052224535840N00610865EA0235502352000
+B1052254535835N00610835EA0235402352000
+B1052284535830N00610808EA0235702352000
+B1052314535825N00610782EA0235702352000
+B1052344535820N00610757EA0236202352000
+B1052374535815N00610734EA0236002352000
+B1052404535809N00610710EA0236402353000
+B1052434535805N00610691EA0235902353000
+B1052464535798N00610665EA0236302353000
+B1052494535792N00610642EA0236902354000
+B1052524535786N00610619EA0236902355000
+B1052554535778N00610597EA0237102356000
+B1052584535774N00610576EA0237002357000
+B1053014535769N00610551EA0237302358000
+B1053044535763N00610528EA0238002360000
+B1053074535756N00610508EA0238402362000
+B1053104535747N00610487EA0239102364000
+B1053134535735N00610467EA0240102366000
+B1053164535723N00610447EA0240902370000
+B1053194535713N00610423EA0242102374000
+B1053224535703N00610402EA0243002379000
+B1053254535688N00610384EA0243802385000
+B1053284535670N00610384EA0244802391000
+B1053314535664N00610395EA0245502396000
+B1053344535677N00610396EA0246402401000
+B1053374535686N00610373EA0247002408000
+B1053414535675N00610339EA0247702416000
+B1053444535660N00610320EA0248002422000
+B1053474535648N00610294EA0248302428000
+B1053504535644N00610265EA0248402433000
+B1053534535644N00610235EA0248302438000
+B1053564535647N00610204EA0248002442000
+B1053594535652N00610172EA0247902445000
+B1054024535657N00610143EA0247602447000
+B1054054535654N00610116EA0247902450000
+B1054084535651N00610095EA0248002453000
+B1054114535644N00610075EA0247502455000
+B1054144535637N00610054EA0246902456000
+B1054174535634N00610027EA0246102457000
+B1054204535630N00609998EA0245702457000
+B1054234535626N00609970EA0244902456000
+B1054264535622N00609939EA0244902454000
+B1054294535618N00609911EA0244602453000
+B1054324535611N00609879EA0244002451000
+B1054354535602N00609842EA0244802450000
+B1054384535594N00609814EA0244902449000
+B1054414535586N00609787EA0244702448000
+B1054444535579N00609758EA0244902447000
+B1054474535572N00609728EA0244702447000
+B1054504535567N00609696EA0244402446000
+B1054534535563N00609665EA0244102445000
+B1054564535557N00609633EA0243702444000
+B1054594535550N00609601EA0243402443000
+B1055024535542N00609569EA0243102441000
+B1055064535531N00609530EA0242902439000
+B1055094535522N00609502EA0242802437000
+B1055124535513N00609473EA0242602435000
+B1055154535504N00609446EA0242202434000
+B1055184535493N00609420EA0241602432000
+B1055214535483N00609392EA0241202430000
+B1055244535474N00609365EA0240902428000
+B1055274535465N00609338EA0240302425000
+B1055304535456N00609309EA0240002423000
+B1055334535448N00609280EA0239602420000
+B1055364535440N00609251EA0239202417000
+B1055394535432N00609222EA0238802414000
+B1055424535424N00609192EA0238402411000
+B1055454535417N00609163EA0238002408000
+B1055484535409N00609133EA0237602404000
+B1055514535401N00609104EA0237202400000
+B1055544535393N00609074EA0236802396000
+B1055574535385N00609045EA0236602393000
+B1056004535376N00609015EA0236302389000
+B1056034535365N00608987EA0236102387000
+B1056064535355N00608960EA0236002383000
+B1056094535344N00608932EA0235702380000
+B1056124535333N00608904EA0235302377000
+B1056154535322N00608877EA0235202374000
+B1056184535311N00608851EA0234902370000
+B1056214535299N00608826EA0234602367000
+B1056254535283N00608791EA0234502362000
+B1056284535272N00608764EA0234302359000
+B1056314535263N00608735EA0233902356000
+B1056344535253N00608706EA0233602354000
+B1056374535243N00608679EA0233302351000
+B1056404535232N00608652EA0233102347000
+B1056434535221N00608624EA0232602344000
+B1056464535211N00608597EA0232402342000
+B1056494535200N00608570EA0232002339000
+B1056524535190N00608543EA0231702336000
+B1056554535180N00608516EA0231302333000
+B1056584535170N00608489EA0231002330000
+B1057014535160N00608463EA0230502327000
+B1057044535151N00608436EA0229902324000
+B1057074535139N00608404EA0228802320000
+B1057104535123N00608367EA0228502316000
+B1057134535109N00608334EA0228402312000
+B1057164535098N00608301EA0227702308000
+B1057194535085N00608265EA0227302304000
+B1057224535071N00608230EA0227102300000
+B1057254535058N00608197EA0226202295000
+B1057284535044N00608162EA0225702291000
+B1057314535030N00608128EA0225302286000
+B1057344535018N00608093EA0224602281000
+B1057374535004N00608057EA0224202276000
+B1057404534990N00608023EA0223702272000
+B1057444534971N00607977EA0223002265000
+B1057474534957N00607942EA0222502259000
+B1057504534943N00607907EA0222002254000
+B1057534534928N00607873EA0221402249000
+B1057564534912N00607839EA0220902243000
+B1057594534896N00607807EA0220302238000
+B1058024534880N00607775EA0219702232000
+B1058054534863N00607744EA0219202227000
+B1058084534846N00607711EA0218702221000
+B1058114534829N00607678EA0218102215000
+B1058144534813N00607645EA0217502210000
+B1058174534797N00607611EA0217102204000
+B1058204534781N00607577EA0216402198000
+B1058234534765N00607543EA0215902193000
+B1058264534749N00607510EA0215402187000
+B1058294534732N00607477EA0214902182000
+B1058324534715N00607445EA0214502177000
+B1058354534698N00607412EA0213902171000
+B1058384534680N00607381EA0213502166000
+B1058414534662N00607350EA0213002161000
+B1058444534643N00607319EA0212502156000
+B1058474534625N00607289EA0211902151000
+B1058504534608N00607256EA0211602145000
+B1058534534592N00607222EA0211202140000
+B1058564534576N00607188EA0210602135000
+B1059004534554N00607143EA0210102129000
+B1059034534538N00607110EA0209802124000
+B1059064534521N00607077EA0209102119000
+B1059094534505N00607043EA0208702113000
+B1059124534488N00607011EA0208402109000
+B1059154534472N00606979EA0207702104000
+B1059184534455N00606948EA0207402099000
+B1059214534438N00606918EA0206902094000
+B1059244534422N00606888EA0206502089000
+B1059274534406N00606857EA0206102085000
+B1059304534391N00606826EA0205802080000
+B1059334534376N00606795EA0205202076000
+B1059364534360N00606765EA0204802071000
+B1059394534344N00606734EA0204302067000
+B1059424534328N00606704EA0203902062000
+B1059454534312N00606674EA0203402058000
+B1059484534295N00606645EA0203002053000
+B1059514534279N00606615EA0202702049000
+B1059544534262N00606586EA0202102045000
+B1059574534246N00606557EA0201602040000
+B1100004534229N00606528EA0201102036000
+B1100034534213N00606499EA0200702031000
+B1100064534196N00606470EA0200202027000
+B1100094534180N00606441EA0199902022000
+B1100124534165N00606411EA0199302018000
+B1100164534145N00606371EA0198902012000
+B1100194534130N00606340EA0198402008000
+B1100224534115N00606310EA0197902004000
+B1100254534101N00606279EA0197501999000
+B1100284534087N00606249EA0197001995000
+B1100314534073N00606218EA0196501990000
+B1100344534059N00606188EA0196001986000
+B1100374534045N00606158EA0195501981000
+B1100404534031N00606128EA0195001977000
+B1100434534016N00606099EA0194501972000
+B1100464534001N00606069EA0194001967000
+B1100494533986N00606041EA0193501962000
+B1100524533970N00606013EA0192801957000
+B1100554533954N00605985EA0192501952000
+B1100584533939N00605958EA0191801947000
+B1101014533922N00605930EA0191301942000
+B1101044533905N00605903EA0191201937000
+B1101074533888N00605878EA0190601932000
+B1101104533871N00605852EA0190101927000
+B1101134533854N00605825EA0189601922000
+B1101164533837N00605800EA0189201918000
+B1101194533821N00605772EA0188801913000
+B1101224533807N00605744EA0189101908000
+B1101254533792N00605714EA0190001904000
+B1101284533781N00605690EA0190901902000
+B1101314533775N00605673EA0191101901000
+B1101344533776N00605653EA0191801901000
+B1101384533790N00605641EA0192801903000
+B1101414533804N00605643EA0193901905000
+B1101444533816N00605656EA0195001908000
+B1101474533818N00605677EA0196301912000
+B1101504533809N00605691EA0197201916000
+B1101534533793N00605691EA0197801921000
+B1101564533785N00605673EA0198001926000
+B1101594533793N00605657EA0199401931000
+B1102024533805N00605657EA0200401937000
+B1102054533814N00605671EA0200701944000
+B1102084533806N00605687EA0201201950000
+B1102114533791N00605686EA0201801956000
+B1102144533783N00605669EA0202501962000
+B1102174533781N00605645EA0203901968000
+B1102204533785N00605628EA0204701975000
+B1102234533796N00605623EA0205201982000
+B1102264533800N00605638EA0205801988000
+B1102294533792N00605651EA0206001995000
+B1102324533775N00605654EA0206802001000
+B1102354533760N00605642EA0207502007000
+B1102384533755N00605621EA0208402013000
+B1102414533760N00605610EA0209002019000
+B1102444533766N00605620EA0209302025000
+B1102474533758N00605637EA0209602032000
+B1102504533739N00605640EA0210002038000
+B1102534533722N00605633EA0210302045000
+B1102564533712N00605614EA0210002050000
+B1102594533711N00605594EA0210202056000
+B1103024533717N00605581EA0209602060000
+B1103054533727N00605570EA0210102064000
+B1103084533732N00605579EA0209802066000
+B1103114533728N00605596EA0209502069000
+B1103144533709N00605601EA0209102071000
+B1103174533692N00605576EA0209202073000
+B1103214533682N00605552EA0208502074000
+B1103244533680N00605520EA0207502073000
+B1103274533680N00605480EA0206602072000
+B1103304533681N00605438EA0206802070000
+B1103334533686N00605405EA0207302069000
+B1103364533688N00605377EA0207002068000
+B1103394533686N00605349EA0207002067000
+B1103424533682N00605324EA0207402066000
+B1103454533675N00605299EA0208102066000
+B1103484533665N00605276EA0208902066000
+B1103514533656N00605260EA0209502068000
+B1103544533643N00605254EA0209802070000
+B1103574533633N00605262EA0210302071000
+B1104004533640N00605275EA0210602073000
+B1104034533653N00605274EA0210902076000
+B1104064533663N00605256EA0211502078000
+B1104094533666N00605233EA0212002081000
+B1104124533660N00605210EA0212402084000
+B1104154533646N00605202EA0212702088000
+B1104184533633N00605206EA0213102091000
+B1104214533631N00605220EA0213202094000
+B1104244533640N00605230EA0213202097000
+B1104274533653N00605221EA0213402099000
+B1104304533659N00605198EA0214002102000
+B1104334533657N00605172EA0214702105000
+B1104364533651N00605148EA0215302107000
+B1104394533643N00605125EA0215902111000
+B1104424533637N00605105EA0215802115000
+B1104454533639N00605079EA0216002118000
+B1104494533657N00605063EA0215602122000
+B1104524533670N00605071EA0215402125000
+B1104554533671N00605087EA0216002127000
+B1104584533665N00605095EA0216502128000
+B1105014533654N00605100EA0217002131000
+B1105044533640N00605091EA0217402134000
+B1105074533628N00605074EA0217802138000
+B1105104533618N00605053EA0217702141000
+B1105134533607N00605029EA0217602143000
+B1105164533594N00605008EA0217802146000
+B1105194533582N00604987EA0218102149000
+B1105224533572N00604969EA0218202151000
+B1105254533562N00604949EA0217802154000
+B1105284533549N00604928EA0217602155000
+B1105314533537N00604905EA0217302157000
+B1105344533526N00604881EA0216302158000
+B1105374533514N00604851EA0216102158000
+B1105404533503N00604824EA0215402157000
+B1105434533493N00604793EA0214802156000
+B1105464533484N00604761EA0214802154000
+B1105494533475N00604734EA0214302153000
+B1105524533463N00604705EA0214202151000
+B1105554533450N00604678EA0214002149000
+B1105584533437N00604654EA0213502147000
+B1106014533423N00604628EA0213102145000
+B1106044533412N00604601EA0212802142000
+B1106074533399N00604574EA0212502140000
+B1106114533381N00604540EA0212402137000
+B1106144533367N00604515EA0211902135000
+B1106174533354N00604488EA0211602132000
+B1106204533341N00604460EA0211002130000
+B1106234533326N00604431EA0210602127000
+B1106264533314N00604402EA0210402123000
+B1106294533302N00604372EA0210002120000
+B1106324533292N00604342EA0209802117000
+B1106354533282N00604313EA0209202114000
+B1106384533270N00604284EA0209002110000
+B1106414533260N00604256EA0208802107000
+B1106444533251N00604226EA0208202104000
+B1106474533241N00604194EA0208002100000
+B1106504533233N00604165EA0208002097000
+B1106534533224N00604138EA0207302094000
+B1106564533214N00604106EA0207102091000
+B1106594533205N00604076EA0206702087000
+B1107024533196N00604046EA0206102084000
+B1107054533186N00604015EA0206002080000
+B1107084533178N00603985EA0205402077000
+B1107114533167N00603953EA0205302073000
+B1107144533157N00603925EA0205002069000
+B1107174533148N00603899EA0204502066000
+B1107204533137N00603870EA0204402062000
+B1107234533125N00603842EA0204302059000
+B1107264533115N00603815EA0204202056000
+B1107294533105N00603789EA0203802053000
+B1107334533093N00603756EA0203402049000
+B1107364533085N00603731EA0203202046000
+B1107394533081N00603706EA0202902043000
+B1107424533076N00603682EA0202602040000
+B1107454533072N00603658EA0202502038000
+B1107484533071N00603635EA0202202035000
+B1107514533065N00603615EA0202102033000
+B1107544533059N00603594EA0202002030000
+B1107574533064N00603576EA0202002028000
+B1108004533072N00603559EA0202202027000
+B1108034533078N00603541EA0202102025000
+B1108064533086N00603522EA0201702023000
+B1108094533096N00603504EA0201202022000
+B1108124533109N00603488EA0200902020000
+B1108154533124N00603493EA0200702017000
+B1108184533136N00603504EA0200402015000
+B1108214533151N00603514EA0200202013000
+B1108244533168N00603524EA0200602011000
+B1108274533184N00603529EA0200902010000
+B1108304533199N00603531EA0201302009000
+B1108334533213N00603540EA0201402008000
+B1108364533220N00603558EA0201802008000
+B1108394533220N00603578EA0201902008000
+B1108424533215N00603596EA0201902008000
+B1108454533204N00603610EA0202002008000
+B1108494533183N00603618EA0202202009000
+B1108524533168N00603610EA0202002009000
+B1108554533157N00603593EA0202302009000
+B1108584533156N00603576EA0202102009000
+B1109014533165N00603561EA0201702009000
+B1109044533181N00603560EA0201802009000
+B1109074533196N00603564EA0202402009000
+B1109104533208N00603567EA0202402010000
+B1109134533217N00603581EA0202202011000
+B1109164533212N00603598EA0202202011000
+B1109194533199N00603606EA0202402012000
+B1109224533185N00603606EA0202302012000
+B1109254533170N00603602EA0202302012000
+B1109284533157N00603591EA0202002012000
+B1109314533151N00603574EA0201702012000
+B1109344533159N00603557EA0201202011000
+B1109374533176N00603552EA0201402010000
+B1109404533190N00603562EA0201402009000
+B1109434533200N00603579EA0201602009000
+B1109464533211N00603592EA0201602009000
+B1109494533224N00603597EA0201502009000
+B1109524533237N00603602EA0201502009000
+B1109554533248N00603611EA0201302008000
+B1109584533259N00603625EA0200802008000
+B1110014533271N00603643EA0201002007000
+B1110044533281N00603661EA0201402006000
+B1110084533293N00603683EA0201802006000
+B1110114533297N00603700EA0201802006000
+B1110144533292N00603716EA0201202006000
+B1110174533279N00603719EA0200602005000
+B1110204533265N00603708EA0200902003000
+B1110234533254N00603696EA0201002003000
+B1110264533246N00603681EA0200502002000
+B1110294533237N00603656EA0199602000000
+B1110324533229N00603630EA0199801999000
+B1110354533221N00603608EA0199601997000
+B1110384533212N00603583EA0199501996000
+B1110414533202N00603561EA0200401995000
+B1110444533197N00603545EA0200601995000
+B1110474533204N00603524EA0201001995000
+B1110504533218N00603521EA0201701995000
+B1110534533228N00603531EA0201801997000
+B1110564533229N00603547EA0201501998000
+B1110594533221N00603560EA0201801999000
+B1111024533211N00603558EA0202102000000
+B1111054533202N00603547EA0202302001000
+B1111084533202N00603525EA0202302002000
+B1111114533213N00603506EA0202702003000
+B1111144533228N00603501EA0202702004000
+B1111174533244N00603505EA0203102006000
+B1111204533250N00603519EA0203202007000
+B1111234533246N00603535EA0203802009000
+B1111264533237N00603542EA0203902010000
+B1111304533222N00603533EA0204102013000
+B1111334533216N00603514EA0204602014000
+B1111364533215N00603491EA0205102017000
+B1111394533220N00603469EA0205102019000
+B1111424533234N00603454EA0205302021000
+B1111454533249N00603453EA0205702023000
+B1111484533259N00603465EA0206102026000
+B1111514533261N00603480EA0206402029000
+B1111544533253N00603487EA0206702030000
+B1111574533242N00603482EA0207202033000
+B1112004533234N00603464EA0207202036000
+B1112034533236N00603439EA0207402039000
+B1112064533247N00603420EA0207702041000
+B1112094533263N00603414EA0207502044000
+B1112124533274N00603424EA0207702046000
+B1112154533276N00603440EA0207902048000
+B1112184533276N00603459EA0207902050000
+B1112214533276N00603478EA0208602053000
+B1112244533276N00603492EA0208602055000
+B1112274533267N00603499EA0208502057000
+B1112304533256N00603488EA0208602059000
+B1112334533252N00603465EA0209002060000
+B1112364533257N00603438EA0209602062000
+B1112394533270N00603422EA0210002065000
+B1112424533287N00603418EA0210102067000
+B1112454533300N00603428EA0210302070000
+B1112484533304N00603444EA0210202073000
+B1112514533300N00603457EA0210202075000
+B1112554533285N00603458EA0210202078000
+B1112584533273N00603449EA0210202080000
+B1113014533262N00603435EA0210402082000
+B1113044533256N00603412EA0210002083000
+B1113074533259N00603384EA0209902084000
+B1113104533270N00603359EA0210102085000
+B1113134533284N00603344EA0210302086000
+B1113164533298N00603334EA0210302087000
+B1113194533314N00603330EA0210202088000
+B1113224533326N00603335EA0209602088000
+B1113254533329N00603352EA0209102088000
+B1113284533324N00603367EA0209202087000
+B1113314533315N00603377EA0209002087000
+B1113344533304N00603382EA0209302086000
+B1113374533292N00603379EA0208702086000
+B1113404533278N00603370EA0208902085000
+B1113434533266N00603359EA0208302085000
+B1113464533253N00603341EA0208202084000
+B1113494533242N00603324EA0207902082000
+B1113524533231N00603305EA0207302081000
+B1113554533217N00603281EA0207602079000
+B1113584533206N00603259EA0207402077000
+B1114014533194N00603237EA0207302076000
+B1114044533181N00603217EA0207202074000
+B1114074533169N00603197EA0206702073000
+B1114114533152N00603169EA0206402070000
+B1114144533139N00603150EA0206002068000
+B1114174533125N00603135EA0205702066000
+B1114204533112N00603118EA0204902064000
+B1114234533096N00603098EA0204802061000
+B1114264533084N00603078EA0204902059000
+B1114294533070N00603060EA0204002056000
+B1114324533057N00603038EA0204202054000
+B1114354533047N00603020EA0203302051000
+B1114384533032N00602999EA0202802047000
+B1114414533019N00602980EA0202002044000
+B1114444533005N00602959EA0201202040000
+B1114474532991N00602939EA0200702036000
+B1114504532976N00602917EA0199502031000
+B1114534532960N00602891EA0199102026000
+B1114564532946N00602866EA0198502021000
+B1114594532931N00602839EA0197702015000
+B1115024532915N00602814EA0197002010000
+B1115054532901N00602788EA0196502004000
+B1115084532886N00602761EA0194801998000
+B1115114532865N00602730EA0194401992000
+B1115144532847N00602703EA0193701985000
+B1115174532829N00602677EA0192301979000
+B1115204532810N00602649EA0191701971000
+B1115234532792N00602621EA0190601964000
+B1115264532773N00602594EA0189401957000
+B1115294532754N00602566EA0188701949000
+B1115334532730N00602531EA0187601938000
+B1115364532712N00602504EA0186801930000
+B1115394532694N00602476EA0186201922000
+B1115424532676N00602447EA0185401914000
+B1115454532658N00602418EA0184901906000
+B1115484532640N00602391EA0184401898000
+B1115514532622N00602360EA0183801891000
+B1115544532604N00602330EA0183501884000
+B1115574532586N00602301EA0183201877000
+B1116004532569N00602272EA0182801870000
+B1116034532552N00602244EA0182401864000
+B1116064532535N00602216EA0182001858000
+B1116094532518N00602189EA0181601852000
+B1116124532501N00602162EA0181301846000
+B1116154532485N00602138EA0181401841000
+B1116184532472N00602118EA0181001836000
+B1116214532458N00602095EA0180301831000
+B1116244532443N00602070EA0180001826000
+B1116274532429N00602047EA0179701821000
+B1116304532417N00602026EA0179501817000
+B1116334532405N00602006EA0179101813000
+B1116364532393N00601983EA0178801809000
+B1116394532382N00601962EA0178301805000
+B1116424532369N00601940EA0178201801000
+B1116454532357N00601919EA0177701797000
+B1116484532344N00601899EA0177401793000
+B1116514532332N00601879EA0177001790000
+B1116554532315N00601854EA0176501785000
+B1116584532302N00601834EA0176101781000
+B1117014532289N00601813EA0175701777000
+B1117044532275N00601793EA0175401773000
+B1117074532262N00601774EA0174901769000
+B1117104532248N00601756EA0174701766000
+B1117134532234N00601738EA0174101762000
+B1117164532219N00601720EA0173701758000
+B1117194532204N00601704EA0173201754000
+B1117224532189N00601688EA0172901750000
+B1117254532173N00601672EA0172501746000
+B1117284532158N00601655EA0172301742000
+B1117314532144N00601639EA0172101739000
+B1117344532130N00601621EA0171701735000
+B1117374532116N00601602EA0171401731000
+B1117404532103N00601583EA0171201728000
+B1117434532089N00601564EA0171001725000
+B1117464532075N00601546EA0170601721000
+B1117494532060N00601529EA0170301718000
+B1117524532046N00601513EA0170101715000
+B1117554532031N00601498EA0169701712000
+B1117584532017N00601483EA0169301708000
+B1118014532001N00601469EA0169001705000
+B1118044531985N00601454EA0168701702000
+B1118074531970N00601439EA0168101698000
+B1118104531955N00601423EA0167801695000
+B1118144531936N00601401EA0167301690000
+B1118174531922N00601383EA0166901686000
+B1118204531907N00601366EA0166301683000
+B1118234531893N00601349EA0166001679000
+B1118264531878N00601334EA0165601675000
+B1118294531863N00601318EA0165201671000
+B1118324531849N00601302EA0164801667000
+B1118354531834N00601286EA0164501663000
+B1118384531820N00601269EA0164301660000
+B1118414531805N00601254EA0163801656000
+B1118444531791N00601237EA0163801653000
+B1118474531778N00601222EA0163601650000
+B1118504531765N00601207EA0163601647000
+B1118534531752N00601192EA0163501644000
+B1118564531739N00601177EA0163501642000
+B1118594531727N00601160EA0163401639000
+B1119024531715N00601143EA0163501637000
+B1119054531705N00601125EA0163501636000
+B1119084531694N00601106EA0163501634000
+B1119114531683N00601088EA0163601633000
+B1119144531672N00601069EA0163601631000
+B1119174531660N00601051EA0163701630000
+B1119204531649N00601033EA0163201629000
+B1119234531637N00601013EA0163201628000
+B1119274531620N00600988EA0163101626000
+B1119304531606N00600969EA0163201625000
+B1119334531593N00600952EA0163101624000
+B1119364531577N00600936EA0163101623000
+B1119394531562N00600919EA0163201622000
+B1119424531545N00600904EA0163301621000
+B1119454531533N00600887EA0163201620000
+B1119484531520N00600869EA0163201620000
+B1119514531508N00600851EA0162901619000
+B1119544531496N00600831EA0162701618000
+B1119574531484N00600809EA0162901617000
+B1120004531473N00600791EA0162601617000
+B1120034531462N00600771EA0162101616000
+B1120064531450N00600755EA0162101615000
+B1120094531439N00600742EA0161901614000
+B1120124531428N00600728EA0161601613000
+B1120154531415N00600715EA0161301612000
+B1120184531402N00600701EA0161101611000
+B1120214531391N00600686EA0160901609000
+B1120244531380N00600671EA0160401608000
+B1120274531367N00600655EA0160401606000
+B1120304531354N00600639EA0160001605000
+B1120334531340N00600623EA0159801603000
+B1120364531326N00600610EA0159601601000
+B1120394531312N00600596EA0159101599000
+B1120424531297N00600582EA0158701596000
+B1120464531278N00600562EA0158101593000
+B1120494531263N00600548EA0157601590000
+B1120524531247N00600534EA0157301587000
+B1120554531233N00600521EA0157201584000
+B1120584531220N00600504EA0156601581000
+B1121014531207N00600485EA0156401577000
+B1121044531194N00600467EA0156201574000
+B1121074531179N00600448EA0155701571000
+B1121104531165N00600430EA0155601568000
+B1121134531151N00600412EA0155001565000
+B1121164531136N00600392EA0155001562000
+B1121194531121N00600375EA0154801558000
+B1121224531106N00600357EA0154301555000
+B1121254531090N00600339EA0154201552000
+B1121284531073N00600323EA0154001549000
+B1121314531058N00600304EA0153901546000
+B1121344531043N00600286EA0153601543000
+B1121374531028N00600268EA0153801541000
+B1121404531014N00600253EA0153501538000
+B1121434530998N00600237EA0153501536000
+B1121464530983N00600224EA0153001534000
+B1121494530967N00600212EA0152901531000
+B1121524530952N00600201EA0152501529000
+B1121554530937N00600189EA0152301526000
+B1121584530922N00600177EA0152101524000
+B1122014530908N00600165EA0151601522000
+B1122054530890N00600147EA0151301518000
+B1122084530877N00600132EA0150801515000
+B1122114530864N00600116EA0150601513000
+B1122144530851N00600102EA0150101510000
+B1122174530836N00600087EA0149801507000
+B1122204530821N00600075EA0149401504000
+B1122234530806N00600063EA0149201501000
+B1122264530791N00600052EA0148901498000
+B1122294530776N00600041EA0148501495000
+B1122324530760N00600029EA0148301492000
+B1122354530745N00600018EA0147901489000
+B1122384530730N00600005EA0147601486000
+B1122414530716N00559990EA0147301483000
+B1122444530701N00559976EA0147001480000
+B1122474530687N00559963EA0146701477000
+B1122504530672N00559952EA0146401473000
+B1122534530657N00559939EA0146101470000
+B1122564530643N00559927EA0145801467000
+B1122594530628N00559916EA0145401464000
+B1123024530613N00559905EA0145101461000
+B1123054530598N00559893EA0144801458000
+B1123084530583N00559882EA0144501455000
+B1123114530568N00559871EA0144201452000
+B1123144530553N00559860EA0143901449000
+B1123174530538N00559849EA0143601446000
+B1123204530524N00559838EA0143401443000
+B1123244530504N00559823EA0143001439000
+B1123274530490N00559813EA0142701435000
+B1123304530475N00559801EA0142301432000
+B1123334530461N00559790EA0142101429000
+B1123364530447N00559779EA0141701426000
+B1123394530432N00559768EA0141401423000
+B1123424530419N00559757EA0141001420000
+B1123454530405N00559745EA0140701417000
+B1123484530392N00559734EA0140301413000
+B1123514530378N00559722EA0140001410000
+B1123544530365N00559711EA0139701407000
+B1123574530351N00559700EA0139301404000
+B1124004530337N00559688EA0139001400000
+B1124034530324N00559677EA0138701397000
+B1124064530310N00559667EA0138401394000
+B1124094530296N00559657EA0138201391000
+B1124124530282N00559647EA0137701388000
+B1124154530268N00559637EA0137501384000
+B1124184530253N00559628EA0137101381000
+B1124214530238N00559618EA0136801378000
+B1124244530223N00559608EA0136601375000
+B1124274530208N00559599EA0136201372000
+B1124304530193N00559589EA0136001369000
+B1124334530179N00559579EA0135501366000
+B1124364530164N00559568EA0135301362000
+B1124394530150N00559558EA0135001359000
+B1124434530132N00559544EA0134601355000
+B1124464530118N00559533EA0134301352000
+B1124494530105N00559523EA0133901349000
+B1124524530090N00559512EA0133801345000
+B1124554530076N00559502EA0133401342000
+B1124584530062N00559493EA0133101339000
+B1125014530046N00559485EA0132701336000
+B1125044530031N00559476EA0132501333000
+B1125074530016N00559468EA0132201329000
+B1125104530000N00559461EA0131801326000
+B1125134529984N00559454EA0131501323000
+B1125164529968N00559447EA0131001320000
+B1125194529952N00559440EA0130701317000
+B1125224529937N00559432EA0130401314000
+B1125254529921N00559424EA0130101310000
+B1125284529906N00559416EA0129701307000
+B1125314529890N00559409EA0129401304000
+B1125344529875N00559401EA0129101301000
+B1125374529860N00559394EA0128701298000
+B1125404529844N00559386EA0128401294000
+B1125434529829N00559377EA0128201291000
+B1125464529815N00559368EA0127701288000
+B1125494529800N00559359EA0127501285000
+B1125524529785N00559350EA0127201282000
+B1125554529771N00559341EA0126801279000
+B1125584529757N00559331EA0126601275000
+B1126024529741N00559317EA0125901271000
+B1126054529728N00559304EA0125601268000
+B1126084529717N00559294EA0125201264000
+B1126114529703N00559281EA0124901261000
+B1126144529690N00559269EA0124901257000
+B1126174529677N00559259EA0124601255000
+B1126204529664N00559248EA0124301252000
+B1126234529650N00559238EA0124101249000
+B1126264529636N00559230EA0123701246000
+B1126294529621N00559221EA0123401243000
+B1126324529607N00559212EA0122801241000
+B1126364529587N00559197EA0122601237000
+B1126394529573N00559188EA0122101234000
+B1126424529558N00559177EA0121801231000
+B1126454529544N00559167EA0121401227000
+B1126484529529N00559156EA0121101224000
+B1126514529515N00559145EA0120801221000
+B1126544529500N00559136EA0120501218000
+B1126574529485N00559128EA0120101214000
+B1127004529469N00559120EA0119901211000
+B1127034529452N00559113EA0119601208000
+B1127064529436N00559105EA0119701205000
+B1127094529420N00559097EA0119301202000
+B1127124529404N00559088EA0119101199000
+B1127154529388N00559080EA0118901196000
+B1127184529372N00559070EA0118601194000
+B1127214529356N00559062EA0118601191000
+B1127244529341N00559053EA0118301189000
+B1127274529325N00559043EA0118201186000
+B1127304529310N00559035EA0117801184000
+B1127334529294N00559025EA0117801181000
+B1127364529279N00559016EA0117401179000
+B1127394529263N00559007EA0117301177000
+B1127424529248N00558997EA0117201175000
+B1127454529234N00558987EA0116901172000
+B1127484529219N00558976EA0116701170000
+B1127524529201N00558962EA0116401167000
+B1127554529187N00558950EA0116401165000
+B1127584529174N00558939EA0116301163000
+B1128014529161N00558928EA0116001161000
+B1128044529147N00558916EA0115801158000
+B1128074529135N00558906EA0115901156000
+B1128104529123N00558894EA0115501154000
+B1128134529111N00558882EA0115501152000
+B1128164529099N00558872EA0115101151000
+B1128194529086N00558861EA0115001149000
+B1128224529073N00558851EA0114801148000
+B1128254529061N00558840EA0114501146000
+B1128284529049N00558830EA0114101144000
+B1128314529036N00558820EA0113601142000
+B1128344529022N00558811EA0113201140000
+B1128374529008N00558803EA0112901137000
+B1128404528993N00558796EA0112501134000
+B1128434528978N00558790EA0112001131000
+B1128464528963N00558785EA0111701129000
+B1128494528947N00558780EA0111201126000
+B1128524528930N00558776EA0110901122000
+B1128554528914N00558771EA0110401119000
+B1128584528898N00558764EA0110201116000
+B1129014528882N00558758EA0109701112000
+B1129044528866N00558751EA0109401109000
+B1129084528844N00558744EA0109001104000
+B1129114528828N00558738EA0108601101000
+B1129144528811N00558733EA0108201097000
+B1129174528794N00558727EA0108001094000
+B1129204528777N00558721EA0107701090000
+B1129234528760N00558714EA0107301087000
+B1129264528743N00558708EA0107001083000
+B1129294528726N00558701EA0106601080000
+B1129324528709N00558694EA0106301076000
+B1129354528693N00558688EA0106001073000
+B1129384528676N00558682EA0105801069000
+B1129414528659N00558676EA0105601066000
+B1129444528642N00558669EA0105501063000
+B1129474528625N00558662EA0105101060000
+B1129504528607N00558655EA0104901057000
+B1129534528589N00558648EA0104701054000
+B1129564528573N00558641EA0104801052000
+B1129594528558N00558633EA0104401049000
+B1130024528546N00558620EA0104301047000
+B1130054528533N00558609EA0104001045000
+B1130084528520N00558598EA0104001042000
+B1130114528505N00558590EA0104101041000
+B1130144528491N00558583EA0104001039000
+B1130174528477N00558575EA0104101037000
+B1130204528464N00558567EA0103901036000
+B1130244528447N00558554EA0104001034000
+B1130274528434N00558545EA0103901033000
+B1130304528420N00558535EA0104001032000
+B1130334528407N00558525EA0104001031000
+B1130364528392N00558515EA0104001030000
+B1130394528379N00558505EA0103701029000
+B1130424528364N00558496EA0103201028000
+B1130454528350N00558486EA0102701027000
+B1130484528334N00558477EA0102401025000
+B1130514528318N00558468EA0101901023000
+B1130544528301N00558461EA0101501021000
+B1130574528284N00558453EA0101201018000
+B1131004528266N00558446EA0100901016000
+B1131034528249N00558440EA0100501013000
+B1131064528230N00558434EA0100101010000
+B1131094528212N00558427EA0099601007000
+B1131124528194N00558418EA0099301004000
+B1131154528176N00558408EA0099101001000
+B1131184528160N00558395EA0099000998000
+B1131214528145N00558382EA0098800995000
+B1131244528128N00558371EA0098200992000
+B1131274528111N00558358EA0097800989000
+B1131304528092N00558346EA0097600985000
+B1131334528073N00558333EA0097900983000
+B1131364528058N00558318EA0098400980000
+B1131394528048N00558300EA0099000979000
+B1131424528040N00558282EA0099200978000
+B1131464528042N00558260EA0099500977000
+B1131494528049N00558253EA0099500977000
+B1131524528060N00558257EA0099700978000
+B1131554528067N00558270EA0099800978000
+B1131584528069N00558291EA0099500978000
+B1132014528064N00558315EA0099600978000
+B1132044528052N00558336EA0099800978000
+B1132074528038N00558351EA0100700979000
+B1132104528025N00558362EA0101100980000
+B1132134528009N00558366EA0101400981000
+B1132164527995N00558356EA0102100983000
+B1132194527990N00558339EA0102700985000
+B1132224527995N00558329EA0103200986000
+B1132254528004N00558331EA0103500988000
+B1132284528013N00558347EA0103700991000
+B1132314528014N00558371EA0103800994000
+B1132344528000N00558386EA0103700997000
+B1132374527986N00558375EA0104200999000
+B1132404527979N00558356EA0104801002000
+B1132434527974N00558336EA0105401005000
+B1132464527978N00558318EA0106101008000
+B1132494527986N00558309EA0106501012000
+B1132524527998N00558315EA0106501016000
+B1132554528001N00558335EA0106501020000
+B1132584527992N00558353EA0106301023000
+B1133014527976N00558350EA0106501025000
+B1133044527965N00558338EA0106501028000
+B1133074527956N00558323EA0106201030000
+B1133104527946N00558302EA0107101032000
+B1133134527939N00558284EA0107901034000
+B1133164527938N00558265EA0108401037000
+B1133204527950N00558257EA0109001042000
+B1133234527954N00558272EA0109101045000
+B1133264527946N00558293EA0108701048000
+B1133294527929N00558303EA0109201051000
+B1133324527911N00558297EA0109501054000
+B1133354527897N00558287EA0110701057000
+B1133384527891N00558270EA0110701060000
+B1133414527893N00558250EA0111801064000
+B1133444527903N00558243EA0112201068000
+B1133474527915N00558252EA0112301072000
+B1133504527913N00558273EA0112101076000
+B1133534527898N00558281EA0112301079000
+B1133564527880N00558276EA0113501083000
+B1133594527867N00558266EA0114401087000
+B1134024527858N00558247EA0114801091000
+B1134054527860N00558227EA0115701096000
+B1134084527870N00558221EA0116401100000
+B1134114527877N00558234EA0116501105000
+B1134144527869N00558254EA0117201110000
+B1134174527853N00558258EA0118401115000
+B1134204527837N00558251EA0119101120000
+B1134234527825N00558234EA0119401125000
+B1134264527825N00558214EA0119801131000
+B1134294527836N00558209EA0120601136000
+B1134324527842N00558224EA0121801142000
+B1134354527835N00558240EA0122801149000
+B1134384527820N00558250EA0123601155000
+B1134414527803N00558244EA0123801162000
+B1134444527791N00558224EA0124401168000
+B1134474527787N00558205EA0124801175000
+B1134504527789N00558185EA0125501181000
+B1134534527796N00558173EA0126401187000
+B1134564527807N00558172EA0127301194000
+B1134594527813N00558187EA0128001201000
+B1135034527800N00558207EA0128801210000
+B1135064527786N00558205EA0129401217000
+B1135094527776N00558188EA0130101223000
+B1135124527776N00558168EA0131001230000
+B1135154527784N00558158EA0131801237000
+B1135184527795N00558164EA0132801244000
+B1135214527799N00558182EA0133401252000
+B1135244527790N00558197EA0133901259000
+B1135274527777N00558200EA0134101266000
+B1135304527763N00558190EA0134701272000
+B1135334527756N00558171EA0135501279000
+B1135364527756N00558152EA0136301285000
+B1135394527762N00558139EA0136701292000
+B1135424527772N00558136EA0137401298000
+B1135454527782N00558134EA0138101304000
+B1135484527793N00558143EA0138801311000
+B1135514527793N00558164EA0139201317000
+B1135544527781N00558180EA0139801324000
+B1135574527765N00558181EA0140501330000
+B1136004527755N00558169EA0141001336000
+B1136034527752N00558157EA0140901342000
+B1136064527760N00558139EA0141401348000
+B1136094527772N00558132EA0142201353000
+B1136124527783N00558138EA0142601359000
+B1136154527789N00558157EA0143001364000
+B1136184527784N00558177EA0143401369000
+B1136214527769N00558186EA0143701374000
+B1136244527755N00558180EA0144101379000
+B1136274527750N00558165EA0144301384000
+B1136314527753N00558142EA0145001391000
+B1136344527762N00558136EA0145201396000
+B1136374527773N00558145EA0145601401000
+B1136404527775N00558165EA0146101406000
+B1136434527770N00558185EA0146301411000
+B1136464527755N00558202EA0146801415000
+B1136494527738N00558208EA0147101420000
+B1136524527720N00558205EA0147201424000
+B1136554527702N00558200EA0147601429000
+B1136584527686N00558195EA0147701433000
+B1137014527671N00558187EA0147401436000
+B1137044527654N00558177EA0147301439000
+B1137074527635N00558166EA0147601441000
+B1137104527614N00558159EA0148001444000
+B1137134527594N00558153EA0148401446000
+B1137164527577N00558152EA0147501449000
+B1137194527556N00558148EA0146901450000
+B1137224527536N00558142EA0146901451000
+B1137254527519N00558138EA0146201451000
+B1137284527500N00558135EA0145701451000
+B1137314527481N00558132EA0145201450000
+B1137344527463N00558129EA0144601449000
+B1137374527444N00558127EA0144301447000
+B1137404527426N00558128EA0143601445000
+B1137434527407N00558126EA0143101442000
+B1137464527389N00558125EA0142401439000
+B1137494527370N00558121EA0142101436000
+B1137534527344N00558111EA0141801431000
+B1137564527323N00558102EA0141601428000
+B1137594527302N00558091EA0141401425000
+B1138024527281N00558077EA0140901422000
+B1138054527259N00558068EA0140901418000
+B1138084527237N00558059EA0140601415000
+B1138114527216N00558053EA0140401412000
+B1138144527195N00558051EA0140201409000
+B1138174527174N00558050EA0139401406000
+B1138204527152N00558048EA0138901402000
+B1138234527130N00558043EA0138701400000
+B1138264527110N00558037EA0137901396000
+B1138294527089N00558030EA0136701393000
+B1138324527066N00558023EA0136301388000
+B1138354527044N00558020EA0135701384000
+B1138384527022N00558018EA0135201379000
+B1138414527000N00558013EA0135001374000
+B1138444526979N00558010EA0134301369000
+B1138474526958N00558008EA0134101364000
+B1138504526939N00558004EA0133401360000
+B1138534526918N00558000EA0133401355000
+B1138564526899N00557997EA0133101351000
+B1138594526880N00557994EA0132201347000
+B1139024526861N00557992EA0131701342000
+B1139054526843N00557989EA0131401338000
+B1139084526825N00557981EA0131601334000
+B1139124526804N00557973EA0131401329000
+B1139154526785N00557966EA0131501326000
+B1139184526766N00557962EA0131501323000
+B1139214526749N00557958EA0131601321000
+B1139244526732N00557953EA0131301318000
+B1139274526715N00557947EA0131401316000
+B1139304526699N00557941EA0131101313000
+B1139334526681N00557937EA0131201312000
+B1139364526665N00557934EA0130901310000
+B1139394526646N00557932EA0130801308000
+B1139424526629N00557929EA0130501306000
+B1139454526608N00557924EA0130501304000
+B1139484526588N00557922EA0130301302000
+B1139514526568N00557919EA0129501300000
+B1139544526547N00557915EA0129101298000
+B1139574526526N00557909EA0128401296000
+B1140004526502N00557900EA0128601293000
+B1140034526483N00557888EA0129101291000
+B1140064526465N00557875EA0129101289000
+B1140094526449N00557862EA0129101288000
+B1140124526432N00557852EA0129201287000
+B1140154526415N00557844EA0128801286000
+B1140184526400N00557841EA0127801284000
+B1140214526382N00557837EA0127201282000
+B1140244526363N00557832EA0125901279000
+B1140274526340N00557824EA0125501275000
+B1140304526320N00557816EA0124301272000
+B1140334526300N00557810EA0124201267000
+B1140374526277N00557800EA0124701261000
+B1140404526264N00557796EA0124801258000
+B1140434526250N00557795EA0124901255000
+B1140464526233N00557788EA0125001252000
+B1140494526219N00557780EA0125101250000
+B1140524526204N00557774EA0125201248000
+B1140554526187N00557768EA0126001247000
+B1140584526172N00557763EA0126401247000
+B1141014526155N00557757EA0127201247000
+B1141044526141N00557749EA0127801248000
+B1141074526128N00557750EA0127901249000
+B1141104526119N00557766EA0128501251000
+B1141134526125N00557782EA0128901253000
+B1141164526140N00557785EA0129201255000
+B1141194526153N00557772EA0129501257000
+B1141224526155N00557751EA0130001260000
+B1141254526146N00557735EA0130401263000
+B1141284526133N00557727EA0130901266000
+B1141314526120N00557723EA0131501269000
+B1141344526105N00557718EA0131701273000
+B1141374526089N00557724EA0131701276000
+B1141404526082N00557741EA0131801279000
+B1141434526089N00557755EA0131801282000
+B1141464526102N00557756EA0131901285000
+B1141494526110N00557735EA0132501287000
+B1141524526107N00557713EA0133201290000
+B1141554526094N00557696EA0133401293000
+B1141584526077N00557696EA0133801296000
+B1142014526065N00557707EA0133501299000
+B1142054526067N00557731EA0133401302000
+B1142084526079N00557731EA0133101304000
+B1142114526088N00557713EA0132701305000
+B1142144526082N00557687EA0132501305000
+B1142174526070N00557669EA0132701306000
+B1142204526053N00557664EA0132201307000
+B1142234526036N00557665EA0132001306000
+B1142264526019N00557670EA0131701306000
+B1142294526004N00557677EA0131001305000
+B1142324525984N00557684EA0130501304000
+B1142354525965N00557689EA0130401302000
+B1142384525947N00557691EA0129901300000
+B1142414525929N00557687EA0129801299000
+B1142444525913N00557683EA0129301297000
+B1142474525896N00557677EA0129301294000
+B1142504525881N00557671EA0128801292000
+B1142534525863N00557666EA0128401290000
+B1142564525844N00557660EA0128601287000
+B1142594525826N00557657EA0128301285000
+B1143024525808N00557650EA0128501283000
+B1143054525790N00557644EA0127801281000
+B1143084525768N00557637EA0128101279000
+B1143114525748N00557630EA0128201278000
+B1143144525731N00557625EA0127701276000
+B1143174525710N00557617EA0127901275000
+B1143204525691N00557612EA0128001273000
+B1143234525670N00557607EA0127801272000
+B1143274525643N00557601EA0128301271000
+B1143304525626N00557594EA0128001270000
+B1143334525609N00557589EA0127801269000
+B1143364525592N00557585EA0127701268000
+B1143394525576N00557578EA0127601267000
+B1143424525559N00557573EA0127701266000
+B1143454525542N00557572EA0127301265000
+B1143484525523N00557574EA0126201263000
+B1143514525501N00557576EA0125801261000
+B1143544525483N00557576EA0125001258000
+B1143574525462N00557575EA0124801255000
+B1144004525444N00557572EA0124401252000
+B1144034525426N00557568EA0123601249000
+B1144064525405N00557562EA0123801246000
+B1144094525386N00557555EA0124001243000
+B1144124525366N00557551EA0124301240000
+B1144154525345N00557549EA0124501238000
+B1144184525324N00557547EA0124601237000
+B1144214525301N00557544EA0124701236000
+B1144244525280N00557540EA0124501235000
+B1144274525259N00557537EA0123801234000
+B1144304525238N00557529EA0123601233000
+B1144334525219N00557523EA0122701231000
+B1144364525199N00557514EA0122001229000
+B1144394525177N00557508EA0121401227000
+B1144424525156N00557506EA0120801222000
+B1144464525130N00557503EA0120001219000
+B1144494525111N00557498EA0119401215000
+B1144524525092N00557496EA0118701211000
+B1144554525071N00557495EA0118801207000
+B1144584525052N00557494EA0118601203000
+B1145014525035N00557487EA0118801200000
+B1145044525023N00557481EA0118701197000
+B1145074525006N00557472EA0118101194000
+B1145104524986N00557466EA0118601191000
+B1145134524971N00557458EA0118601189000
+B1145164524956N00557454EA0118401187000
+B1145194524941N00557452EA0117601185000
+B1145224524924N00557448EA0117601183000
+B1145254524908N00557442EA0117101180000
+B1145284524889N00557434EA0116801178000
+B1145314524869N00557426EA0116701176000
+B1145344524851N00557422EA0116401173000
+B1145374524832N00557412EA0116901171000
+B1145404524816N00557397EA0117201169000
+B1145434524803N00557383EA0117601168000
+B1145464524793N00557368EA0117801167000
+B1145494524782N00557353EA0117901166000
+B1145524524768N00557340EA0117901166000
+B1145554524752N00557333EA0117701166000
+B1145584524735N00557328EA0117401165000
+B1146014524720N00557320EA0117301165000
+B1146044524706N00557311EA0117201164000
+B1146074524693N00557305EA0116801163000
+B1146114524674N00557298EA0116801162000
+B1146144524660N00557295EA0116801161000
+B1146174524647N00557290EA0116701160000
+B1146204524635N00557285EA0116601159000
+B1146234524622N00557280EA0116601158000
+B1146264524610N00557274EA0116401157000
+B1146294524598N00557266EA0116201156000
+B1146324524587N00557261EA0116101155000
+B1146354524576N00557260EA0115801154000
+B1146384524564N00557259EA0115501153000
+B1146414524548N00557258EA0115301151000
+B1146444524531N00557255EA0115201149000
+B1146474524513N00557251EA0115401148000
+B1146504524495N00557246EA0115301147000
+B1146534524477N00557240EA0115301146000
+B1146564524458N00557235EA0114901145000
+B1146594524440N00557231EA0114301143000
+B1147024524422N00557230EA0113701141000
+B1147054524400N00557227EA0113201139000
+B1147084524378N00557222EA0112901136000
+B1147114524357N00557218EA0112401133000
+B1147144524335N00557212EA0112501130000
+B1147174524315N00557206EA0112001128000
+B1147204524293N00557203EA0111601125000
+B1147234524270N00557198EA0111101122000
+B1147264524248N00557190EA0111001119000
+B1147304524222N00557174EA0111501115000
+B1147334524207N00557162EA0112501114000
+B1147364524194N00557153EA0113101113000
+B1147394524182N00557158EA0113901113000
+B1147424524182N00557171EA0114501115000
+B1147454524195N00557171EA0115301116000
+B1147484524205N00557151EA0115701119000
+B1147514524198N00557127EA0116301122000
+B1147544524182N00557114EA0117501125000
+B1147574524169N00557112EA0117901129000
+B1148004524162N00557123EA0118801133000
+B1148034524168N00557130EA0119601136000
+B1148064524179N00557121EA0120801142000
+B1148094524183N00557097EA0121701148000
+B1148124524175N00557075EA0122401155000
+B1148154524162N00557068EA0123001161000
+B1148184524154N00557080EA0123301167000
+B1148214524162N00557091EA0124501173000
+B1148244524172N00557088EA0125601180000
+B1148274524180N00557071EA0126001187000
+B1148304524181N00557044EA0127301194000
+B1148334524175N00557023EA0127701201000
+B1148364524162N00557013EA0128401208000
+B1148394524152N00557016EA0128801214000
+B1148424524152N00557030EA0129501220000
+B1148454524163N00557039EA0130501227000
+B1148484524176N00557031EA0131401234000
+B1148514524185N00557012EA0132201241000
+B1148544524183N00556989EA0133001248000
+B1148574524175N00556972EA0133601255000
+B1149014524159N00556968EA0134201265000
+B1149044524156N00556979EA0134801270000
+B1149074524166N00556988EA0135201277000
+B1149104524181N00556981EA0135901284000
+B1149134524190N00556962EA0136601291000
+B1149164524191N00556940EA0137101297000
+B1149194524182N00556923EA0137301302000
+B1149224524168N00556923EA0138201308000
+B1149254524159N00556932EA0138801315000
+B1149284524160N00556946EA0139201321000
+B1149314524173N00556950EA0139901327000
+B1149344524185N00556937EA0140201333000
+B1149374524188N00556915EA0140501339000
+B1149404524178N00556899EA0140601345000
+B1149434524164N00556892EA0140901350000
+B1149464524149N00556890EA0140801355000
+B1149494524130N00556883EA0141201359000
+B1149524524114N00556873EA0141601364000
+B1149554524099N00556865EA0141301368000
+B1149584524083N00556854EA0141201371000
+B1150014524065N00556847EA0140901374000
+B1150044524045N00556841EA0140701376000
+B1150074524025N00556835EA0140801378000
+B1150104524007N00556831EA0140701380000
+B1150134523990N00556827EA0140501382000
+B1150164523972N00556823EA0140501383000
+B1150194523953N00556816EA0140101384000
+B1150234523926N00556800EA0139901385000
+B1150264523908N00556785EA0139801385000
+B1150294523889N00556773EA0139301385000
+B1150324523869N00556759EA0138801384000
+B1150354523850N00556746EA0138401383000
+B1150384523831N00556734EA0137701381000
+B1150414523810N00556722EA0137701379000
+B1150444523791N00556714EA0137401377000
+B1150474523771N00556707EA0136601375000
+B1150504523751N00556701EA0135801372000
+B1150534523731N00556695EA0135301369000
+B1150564523710N00556693EA0134701366000
+B1150594523689N00556693EA0134601364000
+B1151024523668N00556691EA0134301361000
+B1151054523646N00556686EA0134201358000
+B1151084523627N00556678EA0133501355000
+B1151114523607N00556666EA0133301351000
+B1151144523588N00556657EA0132801348000
+B1151174523567N00556646EA0132301344000
+B1151204523545N00556636EA0131701339000
+B1151234523524N00556628EA0131501335000
+B1151264523502N00556620EA0131201331000
+B1151294523481N00556611EA0130701327000
+B1151324523460N00556605EA0130201323000
+B1151354523438N00556600EA0129501318000
+B1151394523408N00556594EA0128801312000
+B1151424523386N00556590EA0128201307000
+B1151454523363N00556584EA0127701302000
+B1151484523341N00556577EA0127201297000
+B1151514523319N00556571EA0126801293000
+B1151544523297N00556564EA0126201288000
+B1151574523276N00556556EA0125801283000
+B1152004523256N00556547EA0125401278000
+B1152034523238N00556537EA0124801274000
+B1152064523220N00556525EA0124501270000
+B1152094523203N00556514EA0124301265000
+B1152124523187N00556505EA0123201261000
+B1152154523167N00556495EA0122401257000
+B1152184523148N00556485EA0122101252000
+B1152214523130N00556474EA0121701247000
+B1152244523113N00556466EA0121501242000
+B1152274523099N00556458EA0120401237000
+B1152304523079N00556447EA0120301232000
+B1152334523061N00556437EA0120701227000
+B1152364523047N00556427EA0120201223000
+B1152394523030N00556413EA0120501219000
+B1152424523015N00556398EA0120801215000
+B1152454523000N00556383EA0120901213000
+B1152484522985N00556367EA0121201211000
+B1152514522971N00556351EA0121501209000
+B1152544522956N00556335EA0122101208000
+B1152574522944N00556319EA0122101208000
+B1153014522926N00556295EA0122201208000
+B1153044522914N00556278EA0122601208000
+B1153074522904N00556262EA0122601208000
+B1153104522891N00556246EA0122601209000
+B1153134522878N00556233EA0122501209000
+B1153164522864N00556224EA0122201209000
+B1153194522847N00556215EA0122301209000
+B1153224522830N00556204EA0122701209000
+B1153254522813N00556194EA0123101210000
+B1153284522800N00556186EA0123201211000
+B1153314522787N00556175EA0122701212000
+B1153344522773N00556163EA0122601212000
+B1153374522757N00556154EA0121601212000
+B1153404522733N00556143EA0121201211000
+B1153434522707N00556133EA0121001209000
+B1153464522682N00556124EA0120801208000
+B1153494522658N00556113EA0121001206000
+B1153524522636N00556105EA0120701205000
+B1153554522614N00556096EA0120401203000
+B1153584522592N00556088EA0119701201000
+B1154014522571N00556080EA0119201199000
+B1154044522549N00556075EA0118501196000
+B1154074522527N00556068EA0117901193000
+B1154104522505N00556061EA0117501189000
+B1154134522484N00556055EA0116901185000
+B1154174522456N00556048EA0116301180000
+B1154204522436N00556040EA0115901176000
+B1154234522415N00556032EA0115501172000
+B1154264522394N00556025EA0115101168000
+B1154294522373N00556019EA0114601163000
+B1154324522352N00556012EA0114301159000
+B1154354522331N00556005EA0113801155000
+B1154384522309N00555995EA0113401151000
+B1154414522288N00555987EA0113101146000
+B1154444522267N00555979EA0112301142000
+B1154474522244N00555972EA0111901137000
+B1154504522223N00555966EA0111201133000
+B1154534522202N00555959EA0110801128000
+B1154564522181N00555951EA0110501123000
+B1154594522162N00555940EA0109901119000
+B1155024522143N00555930EA0109101114000
+B1155054522125N00555920EA0108801108000
+B1155084522106N00555912EA0108401103000
+B1155114522086N00555904EA0108101098000
+B1155144522065N00555897EA0107801094000
+B1155174522045N00555890EA0107801089000
+B1155204522026N00555884EA0107301085000
+B1155234522007N00555875EA0108201082000
+B1155264521992N00555866EA0109001079000
+B1155294521977N00555857EA0110301078000
+B1155324521966N00555845EA0111301079000
+B1155364521950N00555833EA0112001081000
+B1155394521936N00555824EA0112801083000
+B1155424521923N00555811EA0113101086000
+B1155454521910N00555796EA0113401089000
+B1155484521897N00555783EA0114001092000
+B1155514521885N00555767EA0114401095000
+B1155544521872N00555753EA0115301099000
+B1155574521860N00555740EA0115501103000
+B1156004521846N00555724EA0115901107000
+B1156034521833N00555710EA0116301111000
+B1156064521820N00555698EA0115901114000
+B1156094521803N00555684EA0115301117000
+B1156124521786N00555668EA0115101119000
+B1156154521770N00555651EA0115201120000
+B1156184521755N00555636EA0114901122000
+B1156214521740N00555620EA0115001122000
+B1156244521725N00555605EA0115201123000
+B1156274521710N00555588EA0115601124000
+B1156304521697N00555574EA0116101126000
+B1156334521683N00555562EA0116001127000
+B1156364521667N00555550EA0116301129000
+B1156394521651N00555537EA0116801131000
+B1156424521638N00555526EA0116701132000
+B1156454521622N00555515EA0116201134000
+B1156484521607N00555506EA0116801135000
+B1156514521596N00555501EA0116201137000
+B1156544521579N00555495EA0116001137000
+B1156574521561N00555489EA0115701138000
+B1157004521543N00555479EA0115101138000
+B1157044521518N00555463EA0115001138000
+B1157074521501N00555452EA0116101138000
+B1157104521486N00555439EA0116901139000
+B1157134521470N00555428EA0117601141000
+B1157164521454N00555419EA0118801143000
+B1157194521442N00555414EA0118701146000
+B1157224521426N00555408EA0118401148000
+B1157254521410N00555402EA0118901150000
+B1157284521395N00555396EA0118601153000
+B1157314521378N00555387EA0118801155000
+B1157344521364N00555377EA0118801157000
+B1157374521347N00555367EA0118901159000
+B1157404521332N00555356EA0119101161000
+B1157434521318N00555346EA0118501162000
+B1157464521303N00555333EA0118601164000
+B1157494521289N00555323EA0118301164000
+B1157524521273N00555318EA0117901165000
+B1157554521256N00555317EA0117501165000
+B1157584521238N00555317EA0116901164000
+B1158014521219N00555315EA0116101163000
+B1158044521201N00555311EA0115101161000
+B1158074521182N00555307EA0114901158000
+B1158104521167N00555305EA0114001155000
+B1158134521149N00555301EA0114101152000
+B1158164521136N00555299EA0113801149000
+B1158194521121N00555295EA0114001146000
+B1158224521108N00555289EA0114101144000
+B1158254521093N00555289EA0115001142000
+B1158284521079N00555286EA0115401141000
+B1158324521056N00555281EA0115801140000
+B1158354521041N00555278EA0116201140000
+B1158384521026N00555275EA0116301140000
+B1158414521014N00555269EA0116201141000
+B1158444520999N00555264EA0116201141000
+B1158474520984N00555261EA0116601142000
+B1158504520971N00555256EA0116701142000
+B1158534520956N00555251EA0117001143000
+B1158564520941N00555248EA0117101144000
+B1158594520928N00555243EA0117201145000
+B1159024520913N00555239EA0117801146000
+B1159054520900N00555236EA0118701147000
+B1159084520885N00555231EA0119301150000
+B1159114520871N00555229EA0119801152000
+B1159144520857N00555226EA0120101155000
+B1159174520843N00555223EA0120101158000
+B1159204520827N00555221EA0120201161000
+B1159234520813N00555218EA0119801164000
+B1159264520799N00555217EA0119601167000
+B1159294520786N00555217EA0119201168000
+B1159324520772N00555212EA0119601170000
+B1159354520760N00555208EA0119701172000
+B1159384520747N00555205EA0119701173000
+B1159414520734N00555204EA0119801175000
+B1159444520721N00555202EA0119601176000
+B1159474520708N00555202EA0119201177000
+B1159504520693N00555200EA0118401178000
+B1159544520668N00555188EA0118701177000
+B1159574520652N00555179EA0118301176000
+B1200004520634N00555170EA0117801175000
+B1200034520616N00555162EA0117001174000
+B1200064520596N00555157EA0116101171000
+B1200094520576N00555151EA0115301168000
+B1200124520555N00555143EA0114701164000
+B1200154520538N00555132EA0114701161000
+B1200184520522N00555121EA0115101157000
+B1200214520508N00555116EA0115501155000
+B1200244520492N00555109EA0115201153000
+B1200274520476N00555097EA0114901151000
+B1200304520460N00555087EA0115001149000
+B1200334520444N00555080EA0114801147000
+B1200364520427N00555075EA0114401146000
+B1200394520407N00555070EA0114901144000
+B1200424520391N00555063EA0115501143000
+B1200454520376N00555057EA0116101143000
+B1200484520363N00555046EA0116901143000
+B1200514520351N00555032EA0117201144000
+B1200544520338N00555016EA0117701145000
+B1200574520325N00555009EA0117501147000
+B1201004520312N00555007EA0117501148000
+B1201034520297N00554996EA0117601149000
+B1201064520283N00554978EA0118301151000
+B1201094520271N00554964EA0118201153000
+B1201124520258N00554948EA0118101155000
+B1201164520241N00554932EA0118001157000
+B1201194520228N00554922EA0118001159000
+B1201224520217N00554912EA0116801159000
+B1201254520204N00554905EA0116401159000
+B1201284520192N00554895EA0115101159000
+B1201314520176N00554889EA0114001157000
+B1201344520157N00554886EA0112701154000
+B1201374520138N00554884EA0112201150000
+B1201404520122N00554877EA0111101146000
+B1201434520100N00554874EA0110301141000
+B1201464520080N00554874EA0109701136000
+B1201494520058N00554877EA0108701130000
+B1201524520034N00554881EA0108201124000
+B1201554520012N00554884EA0107701119000
+B1201584519989N00554884EA0107501114000
+B1202014519968N00554882EA0107301108000
+B1202044519947N00554878EA0107001103000
+B1202074519925N00554874EA0106601098000
+B1202104519904N00554872EA0106001093000
+B1202134519884N00554867EA0105301089000
+B1202164519864N00554862EA0104401084000
+B1202194519842N00554857EA0103801078000
+B1202224519819N00554853EA0103301073000
+B1202254519796N00554847EA0102801067000
+B1202284519776N00554842EA0102101062000
+B1202324519752N00554834EA0102201054000
+B1202354519741N00554826EA0102201049000
+B1202384519728N00554817EA0102801045000
+B1202414519714N00554811EA0103501041000
+B1202444519701N00554806EA0104001039000
+B1202474519687N00554800EA0103901036000
+B1202504519671N00554795EA0104201035000
+B1202534519658N00554790EA0104201034000
+B1202564519644N00554783EA0104001033000
+B1202594519630N00554776EA0103401033000
+B1203024519614N00554764EA0102501031000
+B1203054519598N00554750EA0102501029000
+B1203084519581N00554739EA0102401027000
+B1203114519565N00554729EA0103301026000
+B1203144519554N00554718EA0103701025000
+B1203174519542N00554703EA0103601025000
+B1203204519531N00554688EA0104501025000
+B1203234519522N00554675EA0104801025000
+B1203264519510N00554660EA0105501026000
+B1203294519499N00554647EA0105901028000
+B1203324519488N00554638EA0106201030000
+B1203354519477N00554630EA0106901032000
+B1203384519466N00554619EA0107001034000
+B1203414519453N00554609EA0107301037000
+B1203444519439N00554601EA0107901039000
+B1203474519425N00554596EA0107901042000
+B1203504519412N00554589EA0107601044000
+B1203534519396N00554581EA0107601046000
+B1203564519381N00554575EA0106901048000
+B1203594519363N00554566EA0106801049000
+B1204034519339N00554556EA0106201050000
+B1204064519323N00554546EA0106001050000
+B1204094519307N00554537EA0105101049000
+B1204124519286N00554532EA0104601048000
+B1204154519268N00554527EA0103901047000
+B1204184519248N00554524EA0103101045000
+B1204214519229N00554522EA0102301042000
+B1204244519208N00554517EA0101401039000
+B1204274519185N00554512EA0101001035000
+B1204304519164N00554508EA0101301032000
+B1204334519146N00554503EA0101701029000
+B1204364519131N00554496EA0102101027000
+B1204394519118N00554485EA0101701025000
+B1204424519104N00554472EA0101101022000
+B1204454519091N00554459EA0101201020000
+B1204484519079N00554445EA0101101018000
+B1204514519066N00554432EA0100701015000
+B1204544519053N00554419EA0100301013000
+B1204574519040N00554404EA0100301010000
+B1205004519025N00554389EA0101501008000
+B1205034519017N00554374EA0102101007000
+B1205064519007N00554356EA0103501007000
+B1205094518998N00554339EA0104601008000
+B1205124518988N00554320EA0105301009000
+B1205154518987N00554292EA0105301011000
+B1205184519001N00554276EA0105801014000
+B1205214519016N00554280EA0106001017000
+B1205244519023N00554295EA0107201020000
+B1205274519023N00554311EA0108201023000
+B1205314519007N00554324EA0109501029000
+B1205344518993N00554319EA0111001034000
+B1205374518983N00554302EA0111501040000
+B1205404518983N00554276EA0111501046000
+B1205434518998N00554258EA0111501051000
+B1205464519011N00554254EA0112001056000
+B1205494519019N00554268EA0112701061000
+B1205524519018N00554284EA0113801067000
+B1205554519007N00554290EA0114701073000
+B1205584518999N00554274EA0115501079000
+B1206014519004N00554249EA0115801085000
+B1206044519019N00554235EA0116301091000
+B1206074519032N00554237EA0116801097000
+B1206104519039N00554255EA0117701103000
+B1206134519033N00554272EA0119201109000
+B1206164519023N00554274EA0120101117000
+B1206194519016N00554257EA0120701124000
+B1206224519023N00554234EA0121101131000
+B1206254519039N00554223EA0122001138000
+B1206284519051N00554227EA0122401145000
+B1206314519062N00554242EA0123201152000
+B1206344519063N00554261EA0123601159000
+B1206374519051N00554271EA0123901165000
+B1206404519035N00554274EA0125201172000
+B1206434519022N00554268EA0126201179000
+B1206464519018N00554248EA0127001186000
+B1206494519029N00554232EA0128001193000
+B1206524519043N00554230EA0129001201000
+B1206554519053N00554242EA0129701209000
+B1206584519050N00554260EA0130201216000
+B1207014519036N00554264EA0131001224000
+B1207044519023N00554257EA0131801231000
+B1207074519020N00554239EA0132001239000
+B1207104519030N00554218EA0132701246000
+B1207134519047N00554215EA0133901253000
+B1207164519057N00554225EA0134001261000
+B1207194519062N00554247EA0134101268000
+B1207234519047N00554264EA0134701276000
+B1207264519035N00554264EA0135401283000
+B1207294519022N00554256EA0136001289000
+B1207324519013N00554248EA0136301295000
+B1207354519003N00554234EA0135801301000
+B1207384518992N00554218EA0135601307000
+B1207414518980N00554193EA0135101311000
+B1207444518966N00554163EA0135401315000
+B1207474518955N00554139EA0135401318000
+B1207504518944N00554112EA0134301320000
+B1207534518931N00554083EA0134201322000
+B1207564518919N00554057EA0133801323000
+B1207594518907N00554029EA0133601323000
+B1208024518896N00554002EA0133701323000
+B1208054518884N00553975EA0133401323000
+B1208084518874N00553945EA0133501323000
+B1208114518864N00553914EA0133901323000
+B1208144518855N00553884EA0135601324000
+B1208174518849N00553864EA0136901327000
+B1208204518841N00553848EA0137901331000
+B1208234518829N00553850EA0138701335000
+B1208264518828N00553866EA0139301339000
+B1208294518839N00553875EA0140001344000
+B1208324518848N00553865EA0141101349000
+B1208354518853N00553848EA0141901354000
+B1208384518848N00553828EA0143001360000
+B1208414518836N00553821EA0143701367000
+B1208444518827N00553828EA0144101374000
+B1208474518824N00553845EA0144501380000
+B1208504518834N00553856EA0144901386000
+B1208544518848N00553845EA0145701394000
+B1208574518849N00553827EA0146301401000
+B1209004518844N00553806EA0146701407000
+B1209034518833N00553795EA0146901413000
+B1209064518818N00553788EA0146701419000
+B1209094518804N00553772EA0146701424000
+B1209124518791N00553754EA0146201428000
+B1209154518777N00553731EA0145501431000
+B1209184518761N00553707EA0145301433000
+B1209214518745N00553684EA0144701434000
+B1209244518729N00553660EA0144201435000
+B1209274518713N00553637EA0144001435000
+B1209304518701N00553615EA0143901435000
+B1209334518689N00553593EA0143401434000
+B1209364518674N00553569EA0143001434000
+B1209394518658N00553546EA0142201432000
+B1209424518641N00553523EA0141801430000
+B1209454518625N00553501EA0141101428000
+B1209484518607N00553481EA0140301425000
+B1209514518588N00553462EA0139701421000
+B1209544518570N00553445EA0139201418000
+B1209574518552N00553428EA0138701414000
+B1210004518534N00553411EA0138501410000
+B1210034518517N00553395EA0138201406000
+B1210064518499N00553380EA0137701402000
+B1210094518480N00553364EA0137301398000
+B1210134518455N00553344EA0136901393000
+B1210164518439N00553330EA0136601390000
+B1210194518424N00553314EA0135901386000
+B1210224518407N00553299EA0135301382000
+B1210254518390N00553285EA0134801377000
+B1210284518375N00553272EA0134101373000
+B1210314518359N00553257EA0133301368000
+B1210344518343N00553242EA0132501363000
+B1210374518326N00553228EA0131701357000
+B1210404518310N00553214EA0130701352000
+B1210434518295N00553198EA0129801345000
+B1210464518280N00553180EA0129601339000
+B1210494518266N00553160EA0129101333000
+B1210524518251N00553136EA0129301327000
+B1210554518241N00553113EA0131001322000
+B1210584518236N00553100EA0131801320000
+B1211014518230N00553089EA0132901318000
+B1211044518223N00553083EA0133901318000
+B1211074518215N00553088EA0135301320000
+B1211104518215N00553105EA0136301322000
+B1211134518230N00553117EA0136601324000
+B1211164518246N00553105EA0137301327000
+B1211194518256N00553089EA0138201331000
+B1211224518259N00553068EA0139201335000
+B1211254518259N00553050EA0140501340000
+B1211284518255N00553045EA0140801343000
+B1211314518252N00553060EA0141401349000
+B1211344518265N00553077EA0142601355000
+B1211374518280N00553078EA0143201362000
+B1211404518293N00553064EA0144101369000
+B1211434518298N00553042EA0145101376000
+B1211464518300N00553022EA0145501383000
+B1211504518290N00553008EA0145401392000
+B1211534518284N00553020EA0145201397000
+B1211564518291N00553043EA0145301402000
+B1211594518310N00553051EA0146101407000
+B1212024518326N00553043EA0146901412000
+B1212054518336N00553020EA0147101418000
+B1212084518338N00553004EA0147501422000
+B1212114518333N00552991EA0147201426000
+B1212144518324N00552977EA0147301431000
+B1212174518312N00552965EA0147001435000
+B1212204518300N00552949EA0147401438000
+B1212234518289N00552931EA0147601442000
+B1212264518278N00552913EA0147601444000
+B1212294518268N00552896EA0147601447000
+B1212324518259N00552876EA0147401449000
+B1212354518248N00552855EA0147301451000
+B1212384518238N00552833EA0146601452000
+B1212414518229N00552808EA0146301453000
+B1212444518224N00552785EA0146301453000
+B1212474518220N00552763EA0145901453000
+B1212504518218N00552738EA0146201453000
+B1212534518215N00552716EA0145701453000
+B1212564518209N00552692EA0145101452000
+B1212594518202N00552670EA0145401452000
+B1213024518193N00552652EA0145101451000
+B1213054518183N00552633EA0145101450000
+B1213084518173N00552615EA0144901449000
+B1213114518161N00552596EA0144101448000
+B1213144518147N00552578EA0143701446000
+B1213184518128N00552558EA0142901443000
+B1213214518113N00552542EA0142201441000
+B1213244518098N00552527EA0141701437000
+B1213274518082N00552513EA0141001434000
+B1213304518066N00552497EA0140801430000
+B1213334518052N00552484EA0140401427000
+B1213364518039N00552469EA0139801423000
+B1213394518028N00552449EA0139401419000
+B1213424518019N00552430EA0138801415000
+B1213454518009N00552409EA0138201410000
+B1213484517999N00552387EA0137801406000
+B1213514517990N00552361EA0137901402000
+B1213544517979N00552339EA0137701398000
+B1213574517965N00552320EA0137001394000
+B1214004517950N00552300EA0136801391000
+B1214034517936N00552283EA0135801386000
+B1214064517921N00552264EA0135401382000
+B1214094517906N00552249EA0134601377000
+B1214124517889N00552235EA0134101373000
+B1214154517874N00552222EA0133601368000
+B1214184517859N00552208EA0132601362000
+B1214214517843N00552192EA0132501357000
+B1214244517827N00552181EA0131701352000
+B1214274517811N00552170EA0131001347000
+B1214304517793N00552158EA0130501341000
+B1214334517777N00552148EA0129801336000
+B1214364517762N00552135EA0129101330000
+B1214404517740N00552117EA0128901323000
+B1214434517723N00552104EA0128601317000
+B1214464517706N00552090EA0128401313000
+B1214494517690N00552078EA0128001308000
+B1214524517675N00552067EA0127101304000
+B1214554517657N00552054EA0126401298000
+B1214584517643N00552041EA0126301293000
+B1215014517627N00552027EA0125501288000
+B1215044517612N00552013EA0125401283000
+B1215074517599N00551999EA0124301278000
+B1215104517584N00551982EA0124401273000
+B1215134517570N00551969EA0123901268000
+B1215164517555N00551953EA0123801263000
+B1215194517542N00551937EA0123701259000
+B1215224517528N00551920EA0123301255000
+B1215254517514N00551903EA0123501251000
+B1215284517502N00551888EA0123401248000
+B1215314517487N00551872EA0123601245000
+B1215344517475N00551856EA0124001243000
+B1215374517466N00551841EA0124001241000
+B1215404517454N00551825EA0124301240000
+B1215434517444N00551811EA0124501239000
+B1215464517433N00551795EA0125301239000
+B1215494517424N00551781EA0126301239000
+B1215524517418N00551765EA0126501240000
+B1215554517407N00551752EA0127001242000
+B1215584517397N00551751EA0126601244000
+B1216024517379N00551749EA0126201246000
+B1216054517368N00551743EA0126301247000
+B1216084517355N00551733EA0126201247000
+B1216114517347N00551722EA0126601248000
+B1216144517338N00551711EA0127001249000
+B1216174517332N00551697EA0128101251000
+B1216204517328N00551681EA0128501253000
+B1216234517319N00551669EA0129101256000
+B1216264517309N00551666EA0129201259000
+B1216294517301N00551656EA0128901262000
+B1216324517293N00551642EA0128801264000
+B1216354517284N00551627EA0129501266000
+B1216384517276N00551616EA0129701268000
+B1216414517268N00551602EA0129801270000
+B1216444517260N00551588EA0130301273000
+B1216474517254N00551574EA0129901275000
+B1216504517244N00551553EA0130901277000
+B1216534517239N00551532EA0132301280000
+B1216564517235N00551514EA0133201284000
+B1216594517227N00551518EA0133601288000
+B1217024517233N00551538EA0134901292000
+B1217054517247N00551550EA0136401297000
+B1217084517261N00551551EA0137101304000
+B1217114517274N00551535EA0138201310000
+B1217144517278N00551512EA0139601317000
+B1217174517272N00551500EA0140201324000
+B1217204517267N00551514EA0141201330000
+B1217234517276N00551533EA0142601339000
+B1217264517290N00551536EA0143601347000
+B1217304517310N00551521EA0144901359000
+B1217334517317N00551503EA0145601368000
+B1217364517318N00551480EA0146801378000
+B1217394517310N00551476EA0147501384000
+B1217424517304N00551492EA0148101393000
+B1217454517312N00551513EA0149001402000
+B1217484517329N00551521EA0150101411000
+B1217514517344N00551514EA0151001421000
+B1217544517351N00551496EA0151501430000
+B1217574517348N00551480EA0152401438000
+B1218004517340N00551485EA0153401444000
+B1218034517339N00551503EA0153901454000
+B1218064517350N00551520EA0154801464000
+B1218094517366N00551514EA0155501472000
+B1218124517377N00551497EA0156101481000
+B1218154517381N00551479EA0156601489000
+B1218184517376N00551465EA0156701497000
+B1218214517363N00551470EA0157301504000
+B1218244517362N00551490EA0158101511000
+B1218274517373N00551507EA0158601517000
+B1218304517392N00551509EA0158901524000
+B1218334517408N00551495EA0159501530000
+B1218364517414N00551477EA0159801536000
+B1218394517412N00551459EA0160001542000
+B1218424517405N00551447EA0159201546000
+B1218454517394N00551425EA0158601550000
+B1218484517382N00551398EA0158501553000
+B1218514517371N00551371EA0158301556000
+B1218544517357N00551346EA0157801558000
+B1218574517341N00551320EA0157401559000
+B1219014517319N00551291EA0157101560000
+B1219044517304N00551268EA0157101560000
+B1219074517290N00551245EA0156701560000
+B1219104517273N00551220EA0156501560000
+B1219134517256N00551197EA0156801559000
+B1219164517240N00551177EA0156901559000
+B1219194517224N00551155EA0156601559000
+B1219224517209N00551132EA0156401559000
+B1219254517197N00551109EA0155701558000
+B1219284517184N00551084EA0154701556000
+B1219314517169N00551061EA0153901554000
+B1219344517153N00551039EA0152901550000
+B1219374517139N00551017EA0152001546000
+B1219404517124N00550999EA0151101542000
+B1219434517112N00550979EA0150301537000
+B1219464517102N00550959EA0149401531000
+B1219494517089N00550940EA0148901526000
+B1219524517077N00550921EA0147801520000
+B1219554517063N00550902EA0146401513000
+B1219584517048N00550881EA0145701506000
+B1220014517034N00550863EA0144801498000
+B1220044517021N00550843EA0143601491000
+B1220074517009N00550823EA0143301483000
+B1220104516998N00550801EA0143101476000
+B1220134516990N00550778EA0142501469000
+B1220164516978N00550756EA0142301462000
+B1220194516967N00550733EA0142401456000
+B1220224516958N00550709EA0142301451000
+B1220264516949N00550673EA0142201444000
+B1220294516939N00550647EA0142201440000
+B1220324516929N00550620EA0142401437000
+B1220354516923N00550594EA0143601434000
+B1220384516921N00550578EA0144201433000
+B1220414516918N00550562EA0144201432000
+B1220444516914N00550548EA0144401431000
+B1220474516906N00550535EA0144201431000
+B1220504516898N00550518EA0144301431000
+B1220534516890N00550503EA0143901431000
+B1220564516880N00550485EA0143601430000
+B1220594516871N00550462EA0143701429000
+B1221024516869N00550435EA0144401429000
+B1221054516871N00550412EA0144801429000
+B1221084516866N00550389EA0145901430000
+B1221114516861N00550368EA0147001433000
+B1221144516858N00550349EA0148001435000
+B1221174516856N00550331EA0148701439000
+B1221204516853N00550314EA0148501443000
+B1221234516850N00550291EA0148801446000
+B1221264516846N00550269EA0148801450000
+B1221294516840N00550248EA0149001453000
+B1221324516833N00550227EA0149301456000
+B1221354516827N00550208EA0149301459000
+B1221384516819N00550190EA0149801462000
+B1221414516812N00550175EA0149901465000
+B1221444516805N00550160EA0149901468000
+B1221484516795N00550137EA0149501471000
+B1221514516787N00550116EA0148601472000
+B1221544516777N00550090EA0147901472000
+B1221574516773N00550068EA0148201472000
+B1222004516771N00550050EA0147401472000
+B1222034516764N00550029EA0146801470000
+B1222064516756N00550004EA0146301469000
+B1222094516745N00549979EA0146201467000
+B1222124516733N00549956EA0145601465000
+B1222154516722N00549930EA0145301463000
+B1222184516711N00549908EA0145501460000
+B1222214516702N00549890EA0144901458000
+B1222244516694N00549867EA0143801455000
+B1222274516686N00549844EA0143501452000
+B1222304516679N00549825EA0142301448000
+B1222334516670N00549803EA0141401444000
+B1222364516660N00549779EA0140801439000
+B1222394516650N00549755EA0140201434000
+B1222424516639N00549730EA0139401429000
+B1222454516628N00549705EA0138901423000
+B1222484516618N00549680EA0138201417000
+B1222514516608N00549652EA0137801412000
+B1222544516598N00549624EA0137601406000
+B1222574516589N00549597EA0137901401000
+B1223004516579N00549575EA0137701397000
+B1223034516569N00549550EA0137101393000
+B1223064516558N00549523EA0136801389000
+B1223104516545N00549488EA0136601384000
+B1223134516536N00549460EA0136401380000
+B1223164516527N00549431EA0136501377000
+B1223194516519N00549405EA0136701374000
+B1223224516509N00549381EA0136201372000
+B1223254516496N00549353EA0135601369000
+B1223284516484N00549328EA0136001366000
+B1223314516474N00549306EA0135801364000
+B1223344516460N00549283EA0135701361000
+B1223374516450N00549261EA0135601359000
+B1223404516439N00549238EA0135401357000
+B1223434516430N00549215EA0136001355000
+B1223464516425N00549200EA0136301354000
+B1223494516418N00549189EA0135901353000
+B1223524516408N00549176EA0135401352000
+B1223554516393N00549162EA0136001351000
+B1223584516379N00549154EA0137301351000
+B1224014516368N00549145EA0138001352000
+B1224044516362N00549129EA0139101354000
+B1224074516358N00549112EA0140001357000
+B1224104516351N00549095EA0140201361000
+B1224134516341N00549077EA0140001364000
+B1224164516330N00549059EA0140201367000
+B1224194516320N00549044EA0139901370000
+B1224224516308N00549027EA0140301372000
+B1224254516298N00549014EA0140001375000
+B1224294516282N00548994EA0139801377000
+B1224324516271N00548979EA0139701378000
+B1224354516258N00548965EA0139401379000
+B1224384516245N00548951EA0138801379000
+B1224414516231N00548938EA0138501379000
+B1224444516220N00548926EA0138801378000
+B1224474516213N00548912EA0138901378000
+B1224504516208N00548896EA0139601379000
+B1224534516202N00548883EA0139801379000
+B1224564516193N00548866EA0140601380000
+B1224594516188N00548852EA0141801382000
+B1225024516181N00548837EA0142401385000
+B1225054516173N00548820EA0143301389000
+B1225084516165N00548803EA0143901393000
+B1225114516155N00548785EA0144501397000
+B1225144516145N00548770EA0144601402000
+B1225174516135N00548754EA0144101405000
+B1225204516125N00548734EA0144001408000
+B1225234516117N00548717EA0143201411000
+B1225264516104N00548696EA0142601412000
+B1225294516095N00548677EA0142101412000
+B1225324516084N00548660EA0141601412000
+B1225354516071N00548644EA0141201411000
+B1225384516059N00548626EA0141001410000
+B1225414516047N00548611EA0140501409000
+B1225444516035N00548595EA0139901407000
+B1225474516021N00548578EA0139401405000
+B1225504516007N00548557EA0139901402000
+B1225534516001N00548539EA0140801401000
+B1225564515997N00548530EA0140001400000
+B1226004515982N00548511EA0139601398000
+B1226034515969N00548496EA0139001396000
+B1226064515955N00548479EA0138501393000
+B1226094515942N00548461EA0138301391000
+B1226124515930N00548443EA0138101388000
+B1226154515918N00548426EA0138001386000
+B1226184515906N00548409EA0138001384000
+B1226214515895N00548395EA0138001383000
+B1226244515883N00548381EA0137801381000
+B1226274515870N00548367EA0137601379000
+B1226304515859N00548350EA0138101378000
+B1226334515849N00548334EA0138501377000
+B1226364515840N00548320EA0138901377000
+B1226394515829N00548304EA0139101377000
+B1226424515817N00548289EA0139801378000
+B1226454515804N00548274EA0140001379000
+B1226484515791N00548259EA0139901380000
+B1226514515776N00548242EA0139701381000
+B1226544515759N00548224EA0139801381000
+B1226574515744N00548208EA0139701382000
+B1227004515728N00548190EA0139401383000
+B1227034515712N00548174EA0139701383000
+B1227064515699N00548159EA0139701383000
+B1227094515685N00548146EA0139501383000
+B1227124515668N00548134EA0139001383000
+B1227154515653N00548121EA0139401383000
+B1227184515640N00548106EA0140101383000
+B1227224515627N00548091EA0139801384000
+B1227254515615N00548076EA0139001384000
+B1227284515605N00548059EA0138201383000
+B1227314515592N00548048EA0138601382000
+B1227344515584N00548041EA0138101381000
+B1227374515572N00548027EA0137201379000
+B1227404515560N00548012EA0137001377000
+B1227434515547N00547997EA0136501375000
+B1227464515534N00547979EA0136301373000
+B1227494515521N00547962EA0135901370000
+B1227524515507N00547943EA0135701368000
+B1227554515493N00547924EA0135201365000
+B1227584515478N00547905EA0135101362000
+B1228014515463N00547886EA0134901360000
+B1228044515448N00547866EA0135001357000
+B1228074515433N00547850EA0134701355000
+B1228104515417N00547831EA0135001353000
+B1228134515407N00547812EA0135901352000
+B1228164515400N00547799EA0136201351000
+B1228194515390N00547786EA0136001351000
+B1228224515379N00547771EA0135801350000
+B1228254515367N00547758EA0136101350000
+B1228284515358N00547746EA0135701350000
+B1228314515346N00547730EA0135101349000
+B1228344515335N00547716EA0134701348000
+B1228374515322N00547699EA0134701347000
+B1228414515306N00547681EA0134901346000
+B1228444515295N00547669EA0134501345000
+B1228474515283N00547656EA0134701343000
+B1228504515272N00547644EA0135001343000
+B1228534515261N00547633EA0135201342000
+B1228564515251N00547622EA0135101342000
+B1228594515240N00547610EA0136001342000
+B1229024515230N00547598EA0136201343000
+B1229054515218N00547586EA0137301344000
+B1229084515209N00547576EA0138201346000
+B1229114515198N00547569EA0138601349000
+B1229144515184N00547559EA0139701352000
+B1229174515172N00547551EA0140501356000
+B1229204515162N00547540EA0141501361000
+B1229234515151N00547528EA0141701365000
+B1229264515138N00547511EA0141901370000
+B1229294515127N00547494EA0142301374000
+B1229324515116N00547477EA0142401379000
+B1229354515107N00547460EA0142701383000
+B1229384515098N00547445EA0142801386000
+B1229414515087N00547426EA0143501390000
+B1229444515078N00547413EA0143701394000
+B1229474515068N00547401EA0143201397000
+B1229504515057N00547384EA0143301400000
+B1229534515048N00547368EA0144601403000
+B1229564515044N00547356EA0145301407000
+B1229594515036N00547342EA0146201411000
+B1230024515027N00547328EA0147001415000
+B1230054515018N00547315EA0148101421000
+B1230084515012N00547306EA0149101425000
+B1230114515004N00547298EA0149501429000
+B1230144514995N00547290EA0149501437000
+B1230184514978N00547274EA0149001444000
+B1230214514965N00547260EA0149201449000
+B1230244514957N00547249EA0148701453000
+B1230274514944N00547233EA0148201455000
+B1230304514933N00547219EA0147801458000
+B1230334514919N00547203EA0146801459000
+B1230364514904N00547185EA0146601459000
+B1230394514891N00547167EA0146601459000
+B1230424514880N00547150EA0146401458000
+B1230454514869N00547134EA0146901458000
+B1230484514861N00547122EA0146901459000
+B1230514514850N00547107EA0146701459000
+B1230544514838N00547093EA0146801459000
+B1230574514827N00547077EA0146701459000
+B1231004514814N00547058EA0147201459000
+B1231034514802N00547042EA0147201459000
+B1231064514789N00547023EA0147501460000
+B1231094514773N00547005EA0148201460000
+B1231124514759N00546990EA0149401462000
+B1231154514747N00546973EA0150401465000
+B1231184514738N00546957EA0151301468000
+B1231214514730N00546940EA0152401472000
+B1231244514724N00546927EA0153001477000
+B1231274514716N00546913EA0153501482000
+B1231304514709N00546900EA0154101487000
+B1231334514701N00546884EA0154501492000
+B1231364514689N00546871EA0154401497000
+B1231394514676N00546854EA0154601501000
+B1231424514663N00546842EA0153701505000
+B1231454514646N00546827EA0153001508000
+B1231484514632N00546807EA0152901509000
+B1231514514623N00546783EA0153501510000
+B1231554514610N00546756EA0154301513000
+B1231584514601N00546742EA0154201515000
+B1232014514588N00546724EA0153801517000
+B1232044514576N00546703EA0153901518000
+B1232074514567N00546687EA0154301519000
+B1232104514557N00546673EA0155401521000
+B1232134514548N00546657EA0156001524000
+B1232164514537N00546637EA0156501527000
+B1232194514524N00546619EA0156801530000
+B1232224514514N00546604EA0158001534000
+B1232254514506N00546595EA0157701537000
+B1232284514494N00546580EA0157601540000
+B1232314514481N00546563EA0158401544000
+B1232344514471N00546547EA0158801547000
+B1232374514461N00546529EA0159001551000
+B1232404514450N00546510EA0159501554000
+B1232434514440N00546495EA0159501558000
+B1232464514428N00546478EA0159001560000
+B1232494514414N00546460EA0159101562000
+B1232524514405N00546439EA0159501564000
+B1232554514396N00546420EA0159101566000
+B1232584514387N00546398EA0159001568000
+B1233014514380N00546382EA0159501569000
+B1233044514375N00546369EA0159001570000
+B1233074514366N00546351EA0158501571000
+B1233104514355N00546333EA0158601571000
+B1233134514346N00546315EA0158901572000
+B1233164514339N00546295EA0158801572000
+B1233194514330N00546272EA0159101573000
+B1233224514323N00546250EA0159701574000
+B1233264514315N00546221EA0160701576000
+B1233294514309N00546203EA0161801579000
+B1233324514300N00546182EA0162501582000
+B1233354514288N00546161EA0163201586000
+B1233384514275N00546135EA0164001590000
+B1233414514267N00546112EA0165101595000
+B1233444514256N00546087EA0165701601000
+B1233474514246N00546063EA0166801606000
+B1233504514238N00546040EA0167501612000
+B1233534514229N00546016EA0168701619000
+B1233564514222N00545995EA0169901626000
+B1233594514217N00545976EA0170501633000
+B1234024514211N00545955EA0170801640000
+B1234054514202N00545931EA0171801647000
+B1234084514195N00545908EA0172301654000
+B1234114514188N00545883EA0172801661000
+B1234144514181N00545858EA0173301668000
+B1234174514174N00545830EA0173901675000
+B1234204514166N00545802EA0174601681000
+B1234234514158N00545777EA0175601688000
+B1234264514148N00545762EA0175701694000
+B1234294514137N00545768EA0175201700000
+B1234324514137N00545790EA0175301705000
+B1234354514145N00545810EA0175701710000
+B1234384514151N00545825EA0175801715000
+B1234414514160N00545843EA0175801719000
+B1234444514171N00545860EA0176101723000
+B1234474514182N00545882EA0176701727000
+B1234504514192N00545902EA0177101731000
+B1234534514198N00545924EA0177701735000
+B1234564514206N00545946EA0178801739000
+B1234594514215N00545962EA0179301744000
+B1235024514225N00545983EA0180001748000
+B1235054514237N00546004EA0181301753000
+B1235084514245N00546015EA0181201759000
+B1235124514257N00546038EA0181701766000
+B1235154514267N00546052EA0182501772000
+B1235184514279N00546068EA0183201777000
+B1235214514290N00546087EA0184501784000
+B1235244514298N00546103EA0185301790000
+B1235274514303N00546120EA0186001797000
+B1235304514309N00546135EA0186501804000
+B1235334514317N00546149EA0186401810000
+B1235364514327N00546164EA0186301816000
+B1235394514338N00546180EA0186001821000
+B1235424514350N00546199EA0185601825000
+B1235454514364N00546220EA0185601828000
+B1235484514376N00546241EA0185801831000
+B1235514514388N00546263EA0185701833000
+B1235544514400N00546286EA0185401835000
+B1235574514413N00546312EA0185601837000
+B1236004514426N00546335EA0185201838000
+B1236034514438N00546357EA0184701839000
+B1236064514451N00546382EA0185201840000
+B1236094514462N00546405EA0185701841000
+B1236124514474N00546432EA0186001842000
+B1236154514488N00546457EA0187101844000
+B1236184514500N00546473EA0187001846000
+B1236214514510N00546491EA0186801848000
+B1236244514516N00546510EA0186501850000
+B1236274514525N00546531EA0186601852000
+B1236304514533N00546547EA0186101853000
+B1236334514543N00546567EA0185601854000
+B1236364514556N00546588EA0185801854000
+B1236404514571N00546609EA0184501853000
+B1236434514588N00546629EA0185001852000
+B1236464514598N00546649EA0185101852000
+B1236494514612N00546671EA0186001851000
+B1236524514624N00546691EA0187001852000
+B1236554514634N00546713EA0187801853000
+B1236584514646N00546736EA0188301856000
+B1237014514659N00546757EA0188501858000
+B1237044514668N00546778EA0188901860000
+B1237074514675N00546795EA0188301863000
+B1237104514684N00546812EA0187401864000
+B1237134514696N00546833EA0186201864000
+B1237164514712N00546856EA0185801863000
+B1237194514727N00546879EA0185001861000
+B1237224514743N00546904EA0184501859000
+B1237254514758N00546929EA0184101857000
+B1237284514774N00546954EA0183801854000
+B1237314514792N00546977EA0183701851000
+B1237344514809N00547002EA0185001849000
+B1237374514820N00547018EA0185301848000
+B1237404514831N00547033EA0184701847000
+B1237434514845N00547057EA0185201846000
+B1237464514857N00547080EA0185101846000
+B1237494514870N00547103EA0184301845000
+B1237524514885N00547129EA0184001844000
+B1237554514901N00547155EA0183601843000
+B1237584514919N00547182EA0183501841000
+B1238014514931N00547207EA0183301840000
+B1238054514946N00547238EA0182901838000
+B1238084514959N00547264EA0182801837000
+B1238114514972N00547281EA0183301835000
+B1238144514987N00547295EA0182901834000
+B1238174515002N00547307EA0183301833000
+B1238204515014N00547318EA0182701832000
+B1238234515028N00547329EA0182201831000
+B1238264515041N00547340EA0180801829000
+B1238294515059N00547354EA0180201826000
+B1238324515072N00547369EA0180001823000
+B1238354515090N00547388EA0180501820000
+B1238384515104N00547406EA0181501818000
+B1238414515115N00547423EA0181601816000
+B1238444515128N00547443EA0182201815000
+B1238474515142N00547459EA0182801815000
+B1238504515157N00547476EA0183301816000
+B1238534515175N00547492EA0184001817000
+B1238564515194N00547510EA0184301819000
+B1238594515211N00547528EA0184401820000
+B1239024515230N00547544EA0184401822000
+B1239054515248N00547560EA0184801824000
+B1239084515266N00547575EA0184801826000
+B1239114515283N00547592EA0185101828000
+B1239144515300N00547610EA0185301830000
+B1239174515317N00547628EA0185201832000
+B1239204515334N00547646EA0184801834000
+B1239234515353N00547663EA0184401835000
+B1239264515371N00547680EA0183601836000
+B1239304515395N00547702EA0183301837000
+B1239334515413N00547719EA0182601836000
+B1239364515431N00547738EA0182701835000
+B1239394515448N00547756EA0182301834000
+B1239424515464N00547776EA0182101832000
+B1239454515481N00547794EA0182001831000
+B1239484515498N00547814EA0182401829000
+B1239514515511N00547831EA0182301828000
+B1239544515526N00547852EA0181601827000
+B1239574515543N00547869EA0181301825000
+B1240004515559N00547886EA0180501823000
+B1240034515578N00547902EA0180501821000
+B1240064515594N00547919EA0179901818000
+B1240094515612N00547938EA0179701816000
+B1240124515628N00547955EA0179201813000
+B1240154515645N00547974EA0178901811000
+B1240184515662N00547993EA0179301808000
+B1240214515677N00548008EA0179301806000
+B1240244515693N00548024EA0179601805000
+B1240274515710N00548040EA0179501803000
+B1240304515727N00548057EA0180401802000
+B1240334515742N00548068EA0180401802000
+B1240364515760N00548078EA0180501802000
+B1240394515778N00548089EA0180601802000
+B1240424515794N00548102EA0180001801000
+B1240454515809N00548118EA0179201801000
+B1240484515826N00548136EA0178901799000
+B1240524515849N00548157EA0178901797000
+B1240554515865N00548168EA0179301796000
+B1240584515879N00548182EA0179001795000
+B1241014515895N00548199EA0178501794000
+B1241044515910N00548219EA0177601792000
+B1241074515928N00548239EA0177001790000
+B1241104515944N00548259EA0176301787000
+B1241134515960N00548280EA0175701783000
+B1241164515978N00548300EA0175401780000
+B1241194515995N00548320EA0174901776000
+B1241224516012N00548342EA0174701773000
+B1241254516027N00548362EA0174301769000
+B1241284516044N00548383EA0173701765000
+B1241314516060N00548404EA0173401762000
+B1241344516077N00548423EA0172701758000
+B1241374516095N00548441EA0172201754000
+B1241404516112N00548459EA0171901750000
+B1241434516127N00548474EA0172401746000
+B1241464516140N00548490EA0173101743000
+B1241494516151N00548506EA0173501742000
+B1241524516161N00548524EA0173601741000
+B1241554516172N00548541EA0173101739000
+B1241584516188N00548562EA0172801738000
+B1242014516203N00548581EA0172301736000
+B1242044516219N00548599EA0171801734000
+B1242074516235N00548616EA0171301732000
+B1242114516256N00548638EA0170701728000
+B1242144516272N00548653EA0170301725000
+B1242174516289N00548668EA0170401722000
+B1242204516307N00548681EA0171301720000
+B1242234516324N00548691EA0172701719000
+B1242264516339N00548701EA0173701719000
+B1242294516354N00548717EA0174801721000
+B1242324516367N00548736EA0175601724000
+B1242354516384N00548749EA0176301727000
+B1242384516397N00548749EA0175801730000
+B1242414516413N00548752EA0175801733000
+B1242444516428N00548759EA0175401735000
+B1242474516442N00548769EA0175001737000
+B1242504516457N00548781EA0175601738000
+B1242534516469N00548795EA0175701740000
+B1242564516481N00548810EA0176701742000
+B1242594516495N00548822EA0177601744000
+B1243024516508N00548836EA0178501748000
+B1243054516526N00548840EA0179401751000
+B1243084516534N00548827EA0180301756000
+B1243114516528N00548811EA0181401761000
+B1243144516519N00548812EA0181801765000
+B1243174516510N00548823EA0182501771000
+B1243204516506N00548842EA0183501777000
+B1243234516513N00548859EA0184201783000
+B1243264516529N00548865EA0185601789000
+B1243294516545N00548864EA0186901797000
+B1243324516556N00548857EA0187601804000
+B1243354516556N00548841EA0188901812000
+B1243384516548N00548839EA0189701816000
+B1243424516540N00548858EA0190701827000
+B1243454516542N00548883EA0191801837000
+B1243484516554N00548904EA0192701846000
+B1243514516573N00548909EA0193901856000
+B1243544516584N00548896EA0195401866000
+B1243574516579N00548888EA0196101871000
+B1244004516568N00548885EA0197301882000
+B1244034516559N00548903EA0198101894000
+B1244064516563N00548928EA0198801904000
+B1244094516578N00548947EA0199501914000
+B1244124516596N00548946EA0200501924000
+B1244154516605N00548931EA0201201933000
+B1244184516598N00548919EA0202201942000
+B1244214516586N00548926EA0203501952000
+B1244244516585N00548949EA0204001961000
+B1244274516599N00548972EA0204801970000
+B1244304516618N00548980EA0205201978000
+B1244334516631N00548968EA0205901987000
+B1244364516631N00548955EA0206101992000
+B1244394516618N00548951EA0206802000000
+B1244424516609N00548969EA0207602008000
+B1244454516615N00548995EA0208202015000
+B1244484516630N00549012EA0208402022000
+B1244514516648N00549019EA0208302029000
+B1244544516666N00549026EA0208302034000
+B1244574516683N00549034EA0208302040000
+B1245004516702N00549044EA0208102044000
+B1245034516721N00549050EA0208402048000
+B1245064516736N00549057EA0208202052000
+B1245094516754N00549062EA0207802055000
+B1245134516784N00549070EA0207302058000
+B1245164516807N00549079EA0207302060000
+B1245194516827N00549090EA0206902061000
+B1245224516848N00549101EA0205802061000
+B1245254516871N00549113EA0205602061000
+B1245284516891N00549127EA0205102060000
+B1245314516912N00549137EA0204602058000
+B1245344516935N00549146EA0203902056000
+B1245374516959N00549163EA0203002054000
+B1245404516983N00549184EA0201802050000
+B1245434517003N00549205EA0201602047000
+B1245464517022N00549218EA0200802043000
+B1245494517041N00549229EA0200502038000
+B1245524517054N00549243EA0199502034000
+B1245554517073N00549253EA0198202029000
+B1245584517093N00549262EA0198302024000
+B1246014517110N00549270EA0197502019000
+B1246044517131N00549279EA0197102014000
+B1246074517150N00549290EA0196802009000
+B1246104517169N00549301EA0196102004000
+B1246134517188N00549312EA0195701999000
+B1246164517207N00549322EA0195201994000
+B1246194517227N00549334EA0194901989000
+B1246224517246N00549344EA0194601984000
+B1246254517265N00549354EA0194301979000
+B1246284517284N00549366EA0194001975000
+B1246324517309N00549382EA0193801969000
+B1246354517329N00549392EA0193601965000
+B1246384517347N00549403EA0193201962000
+B1246414517366N00549414EA0192901958000
+B1246444517384N00549425EA0192601954000
+B1246474517403N00549435EA0192201951000
+B1246504517421N00549446EA0191801947000
+B1246534517440N00549458EA0191401943000
+B1246564517460N00549469EA0191001939000
+B1246594517480N00549482EA0190701936000
+B1247024517500N00549493EA0190601932000
+B1247054517519N00549504EA0190301929000
+B1247084517539N00549516EA0189901925000
+B1247114517559N00549527EA0189801922000
+B1247144517579N00549538EA0189501919000
+B1247174517599N00549552EA0189401916000
+B1247204517618N00549568EA0189001913000
+B1247234517637N00549586EA0188901910000
+B1247264517656N00549599EA0188301907000
+B1247294517674N00549605EA0188001903000
+B1247324517688N00549613EA0187301900000
+B1247354517705N00549623EA0187001896000
+B1247384517722N00549633EA0187001892000
+B1247414517738N00549643EA0186801889000
+B1247444517754N00549655EA0186701886000
+B1247474517770N00549667EA0186701883000
+B1247504517787N00549667EA0186501880000
+B1247544517809N00549677EA0186101877000
+B1247574517821N00549697EA0186001874000
+B1248004517832N00549718EA0185501871000
+B1248034517845N00549740EA0185101868000
+B1248064517857N00549762EA0184701866000
+B1248094517870N00549788EA0184301862000
+B1248124517883N00549814EA0184601860000
+B1248154517896N00549837EA0184501857000
+B1248184517909N00549865EA0184601855000
+B1248214517918N00549892EA0184801854000
+B1248244517926N00549918EA0184401852000
+B1248274517934N00549940EA0183901850000
+B1248304517944N00549963EA0183101848000
+B1248334517955N00549985EA0182301845000
+B1248364517966N00550009EA0181101842000
+B1248394517979N00550037EA0181101838000
+B1248424517992N00550059EA0181201834000
+B1248454518005N00550081EA0181301831000
+B1248484518019N00550104EA0182301828000
+B1248514518032N00550121EA0182601827000
+B1248544518043N00550140EA0183001827000
+B1248574518056N00550157EA0183801827000
+B1249004518070N00550169EA0184101828000
+B1249034518086N00550176EA0184401829000
+B1249064518102N00550172EA0184301831000
+B1249094518115N00550152EA0184401832000
+B1249124518114N00550131EA0184701833000
+B1249164518104N00550122EA0184401835000
+B1249194518096N00550129EA0184601835000
+B1249224518097N00550149EA0185001836000
+B1249254518103N00550168EA0185501838000
+B1249284518111N00550191EA0185901839000
+B1249314518118N00550209EA0186201841000
+B1249344518125N00550226EA0185701843000
+B1249374518133N00550248EA0185901845000
+B1249404518139N00550268EA0186401846000
+B1249434518145N00550287EA0186301848000
+B1249464518154N00550308EA0186601850000
+B1249494518163N00550324EA0186701852000
+B1249524518172N00550343EA0186601853000
+B1249554518182N00550361EA0186301854000
+B1249584518191N00550382EA0186301855000
+B1250014518199N00550406EA0186001855000
+B1250044518205N00550433EA0186001856000
+B1250074518212N00550456EA0185401856000
+B1250104518220N00550483EA0184301855000
+B1250134518225N00550512EA0183901853000
+B1250164518226N00550540EA0182901851000
+B1250194518225N00550567EA0182001848000
+B1250224518223N00550597EA0181701844000
+B1250254518220N00550622EA0180901841000
+B1250284518220N00550654EA0180401837000
+B1250324518223N00550699EA0180301832000
+B1250354518227N00550731EA0179601828000
+B1250384518230N00550765EA0179001824000
+B1250414518234N00550797EA0178801820000
+B1250444518238N00550829EA0178201816000
+B1250474518241N00550861EA0178201812000
+B1250504518244N00550885EA0178801809000
+B1250534518248N00550903EA0178701806000
+B1250564518250N00550924EA0178701803000
+B1250594518251N00550943EA0179001800000
+B1251024518252N00550961EA0179201799000
+B1251054518253N00550979EA0179501797000
+B1251084518254N00550996EA0179001797000
+B1251114518255N00551015EA0178701795000
+B1251144518259N00551035EA0179201794000
+B1251174518263N00551054EA0179301794000
+B1251204518263N00551073EA0179401793000
+B1251234518262N00551093EA0179501793000
+B1251264518264N00551113EA0180001793000
+B1251294518269N00551131EA0180301793000
+B1251324518272N00551151EA0180601794000
+B1251354518279N00551173EA0181201795000
+B1251384518286N00551193EA0181601796000
+B1251414518295N00551214EA0182401798000
+B1251444518304N00551233EA0183301800000
+B1251474518311N00551255EA0184201803000
+B1251504518315N00551275EA0184701807000
+B1251534518310N00551292EA0184801810000
+B1251564518296N00551297EA0185901814000
+B1252004518282N00551293EA0186401819000
+B1252034518270N00551292EA0187001823000
+B1252064518259N00551285EA0188301829000
+B1252094518248N00551277EA0189501834000
+B1252124518235N00551285EA0190201841000
+B1252154518235N00551303EA0190601847000
+B1252184518251N00551314EA0191701853000
+B1252214518265N00551308EA0193201860000
+B1252244518275N00551293EA0194501868000
+B1252274518279N00551273EA0196001876000
+B1252304518270N00551260EA0197201885000
+B1252334518258N00551272EA0198001894000
+B1252364518258N00551292EA0198801903000
+B1252394518269N00551306EA0199401911000
+B1252424518285N00551305EA0200701920000
+B1252454518297N00551294EA0202001929000
+B1252484518302N00551278EA0203101939000
+B1252514518294N00551262EA0204401949000
+B1252544518279N00551266EA0205801959000
+B1252574518272N00551287EA0207201969000
+B1253004518276N00551309EA0207701980000
+B1253034518290N00551314EA0208601990000
+B1253064518301N00551300EA0209902000000
+B1253094518303N00551282EA0210802011000
+B1253124518291N00551268EA0212102021000
+B1253154518274N00551273EA0213002032000
+B1253194518270N00551300EA0213602045000
+B1253224518283N00551310EA0214902055000
+B1253254518294N00551307EA0215702066000
+B1253284518300N00551291EA0216502075000
+B1253314518293N00551273EA0217502085000
+B1253344518277N00551269EA0218502095000
+B1253374518265N00551282EA0218902104000
+B1253404518268N00551299EA0219502114000
+B1253434518279N00551306EA0220202122000
+B1253464518291N00551308EA0220802131000
+B1253494518306N00551309EA0221702140000
+B1253524518319N00551315EA0222702148000
+B1253554518333N00551322EA0223702157000
+B1253584518345N00551326EA0224302166000
+B1254014518360N00551322EA0225102174000
+B1254044518371N00551313EA0225702183000
+B1254074518382N00551298EA0226502191000
+B1254104518391N00551281EA0227802199000
+B1254134518400N00551265EA0229102208000
+B1254164518401N00551245EA0229902217000
+B1254194518397N00551224EA0230902226000
+B1254224518387N00551205EA0232402235000
+B1254254518371N00551201EA0233702244000
+B1254284518362N00551218EA0234702254000
+B1254314518368N00551236EA0236002264000
+B1254344518382N00551247EA0237402275000
+B1254374518394N00551253EA0238502285000
+B1254414518407N00551255EA0239002299000
+B1254444518419N00551257EA0239302309000
+B1254474518431N00551265EA0239302319000
+B1254504518446N00551274EA0239302327000
+B1254534518461N00551284EA0239602334000
+B1254564518476N00551294EA0239302341000
+B1254594518492N00551302EA0239402347000
+B1255024518507N00551309EA0239002353000
+B1255054518526N00551316EA0238802357000
+B1255084518546N00551318EA0239702361000
+B1255114518563N00551326EA0240302365000
+B1255144518582N00551337EA0241002370000
+B1255174518602N00551346EA0241702375000
+B1255204518620N00551358EA0242802380000
+B1255234518636N00551371EA0242902385000
+B1255264518654N00551386EA0242702390000
+B1255294518673N00551401EA0243802394000
+B1255324518689N00551414EA0244202399000
+B1255354518706N00551432EA0244602404000
+B1255384518720N00551449EA0243702408000
+B1255414518739N00551472EA0243902412000
+B1255444518756N00551495EA0244202415000
+B1255474518772N00551517EA0244002418000
+B1255504518788N00551542EA0244002420000
+B1255534518803N00551564EA0244202422000
+B1255564518816N00551582EA0243402424000
+B1255594518832N00551603EA0243302425000
+B1256024518850N00551621EA0243102426000
+B1256054518870N00551638EA0243802427000
+B1256094518898N00551655EA0245102428000
+B1256124518916N00551666EA0245802430000
+B1256154518935N00551684EA0246702433000
+B1256184518951N00551700EA0247402436000
+B1256214518967N00551718EA0247902439000
+B1256244518981N00551736EA0248402443000
+B1256274518992N00551757EA0248402447000
+B1256304519004N00551782EA0248502450000
+B1256334519014N00551808EA0248902454000
+B1256364519022N00551828EA0248902457000
+B1256394519034N00551847EA0248102460000
+B1256424519048N00551870EA0247502461000
+B1256454519066N00551890EA0247402462000
+B1256484519084N00551910EA0247002463000
+B1256514519106N00551927EA0246802462000
+B1256544519128N00551941EA0246702462000
+B1256574519149N00551954EA0246102462000
+B1257004519168N00551970EA0245402461000
+B1257034519189N00551986EA0245102460000
+B1257064519209N00552001EA0244902459000
+B1257094519228N00552018EA0244502457000
+B1257124519248N00552035EA0244302455000
+B1257154519268N00552052EA0244002454000
+B1257184519286N00552069EA0243402452000
+B1257214519306N00552086EA0242802449000
+B1257244519328N00552101EA0242602447000
+B1257274519347N00552114EA0242202444000
+B1257304519367N00552129EA0241802441000
+B1257344519394N00552151EA0241802437000
+B1257374519413N00552167EA0241002434000
+B1257404519434N00552184EA0240102431000
+B1257434519457N00552201EA0239302427000
+B1257464519479N00552218EA0238402423000
+B1257494519500N00552233EA0237002418000
+B1257524519522N00552248EA0235702412000
+B1257554519545N00552265EA0234702405000
+B1257584519568N00552283EA0234202398000
+B1258014519590N00552301EA0233802391000
+B1258044519612N00552317EA0234002385000
+B1258074519630N00552333EA0233702380000
+B1258104519649N00552349EA0233002374000
+B1258134519670N00552367EA0232802369000
+B1258164519690N00552383EA0231902364000
+B1258194519713N00552400EA0231702358000
+B1258224519736N00552413EA0232002353000
+B1258254519761N00552424EA0232402349000
+B1258284519784N00552436EA0233202345000
+B1258314519802N00552449EA0233302343000
+B1258344519823N00552462EA0233502341000
+B1258374519844N00552476EA0233602340000
+B1258404519861N00552489EA0233602339000
+B1258434519878N00552500EA0233302338000
+B1258464519899N00552513EA0234402338000
+B1258494519912N00552526EA0235002338000
+B1258524519923N00552538EA0235302338000
+B1258564519942N00552553EA0236502340000
+B1258594519955N00552565EA0237302342000
+B1259024519968N00552581EA0237802345000
+B1259054519982N00552595EA0238602348000
+B1259084519994N00552607EA0239402352000
+B1259114520007N00552618EA0239602356000
+B1259144520023N00552627EA0240202361000
+B1259174520038N00552637EA0240702365000
+B1259204520055N00552648EA0242202370000
+B1259234520068N00552657EA0241902376000
+B1259264520084N00552668EA0242302380000
+B1259294520097N00552682EA0242102385000
+B1259324520112N00552694EA0241602389000
+B1259354520128N00552704EA0241402392000
+B1259384520143N00552716EA0240502394000
+B1259414520159N00552729EA0240402395000
+B1259444520173N00552744EA0240002396000
+B1259474520188N00552761EA0240402397000
+B1259504520202N00552779EA0240902398000
+B1259534520218N00552796EA0241202399000
+B1259564520235N00552809EA0242202400000
+B1259594520250N00552821EA0242702402000
+B1300024520267N00552829EA0242702405000
+B1300054520283N00552839EA0242602407000
+B1300084520302N00552848EA0242702410000
+B1300114520320N00552857EA0242402412000
+B1300144520339N00552870EA0242302413000
+B1300174520356N00552883EA0241902415000
+B1300204520371N00552895EA0240402415000
+B1300234520392N00552903EA0239802415000
+B1300274520419N00552916EA0239302413000
+B1300304520438N00552931EA0239302411000
+B1300334520454N00552944EA0238902409000
+B1300364520472N00552961EA0238702407000
+B1300394520489N00552976EA0238302405000
+B1300424520507N00552992EA0237802402000
+B1300454520526N00553007EA0237602400000
+B1300484520545N00553022EA0237202397000
+B1300514520565N00553037EA0237202395000
+B1300544520583N00553049EA0236702392000
+B1300574520603N00553061EA0236602389000
+B1301004520623N00553074EA0236602387000
+B1301034520641N00553087EA0236502384000
+B1301064520657N00553101EA0236602382000
+B1301094520674N00553121EA0235102380000
+B1301124520696N00553143EA0235002377000
+B1301154520715N00553162EA0234202374000
+B1301184520736N00553181EA0233402370000
+B1301214520759N00553197EA0233202367000
+B1301244520780N00553211EA0232702363000
+B1301274520801N00553228EA0232102359000
+B1301304520825N00553242EA0231802355000
+B1301334520846N00553257EA0231202351000
+B1301364520869N00553273EA0230902347000
+B1301394520889N00553291EA0230702343000
+B1301424520907N00553307EA0230202338000
+B1301464520934N00553326EA0229702333000
+B1301494520953N00553340EA0229202329000
+B1301524520972N00553355EA0228602324000
+B1301554520992N00553373EA0228102320000
+B1301584521011N00553386EA0228102315000
+B1302014521028N00553397EA0227802311000
+B1302044521044N00553409EA0226902307000
+B1302074521063N00553425EA0226102302000
+B1302104521083N00553440EA0225602297000
+B1302134521103N00553456EA0225002292000
+B1302164521123N00553472EA0224602287000
+B1302194521143N00553486EA0224402282000
+B1302224521161N00553502EA0223702278000
+B1302254521177N00553520EA0223502273000
+B1302284521193N00553537EA0223002269000
+B1302314521213N00553551EA0223202265000
+B1302344521230N00553562EA0222902262000
+B1302374521248N00553574EA0222902259000
+B1302404521265N00553585EA0223202256000
+B1302434521282N00553594EA0223102253000
+B1302464521301N00553600EA0223102251000
+B1302494521321N00553605EA0223002249000
+B1302524521342N00553608EA0223402247000
+B1302554521362N00553611EA0223202245000
+B1302584521383N00553622EA0224602244000
+B1303014521402N00553627EA0226002245000
+B1303044521419N00553631EA0227002246000
+B1303084521443N00553647EA0229202250000
+B1303114521460N00553645EA0230602254000
+B1303144521476N00553648EA0231402259000
+B1303174521488N00553654EA0231902265000
+B1303204521501N00553662EA0232502270000
+B1303234521516N00553668EA0233902277000
+B1303264521528N00553673EA0234802284000
+B1303294521541N00553678EA0235002290000
+B1303324521559N00553685EA0235302297000
+B1303354521578N00553689EA0236102303000
+B1303384521597N00553694EA0236602309000
+B1303414521615N00553700EA0237402316000
+B1303444521633N00553707EA0237802322000
+B1303474521653N00553713EA0238602328000
+B1303504521671N00553719EA0239702335000
+B1303534521689N00553723EA0240302342000
+B1303564521706N00553729EA0240702348000
+B1303594521725N00553737EA0241102355000
+B1304024521745N00553746EA0242302361000
+B1304054521762N00553755EA0242702368000
+B1304084521779N00553763EA0242702374000
+B1304114521798N00553768EA0243302380000
+B1304144521819N00553773EA0243302385000
+B1304174521842N00553779EA0243602390000
+B1304204521863N00553785EA0243802395000
+B1304234521881N00553792EA0243302400000
+B1304264521901N00553798EA0243002403000
+B1304294521920N00553802EA0243302406000
+B1304324521939N00553804EA0243102409000
+B1304354521958N00553811EA0243202411000
+B1304384521977N00553818EA0243102413000
+B1304414521998N00553828EA0243202414000
+B1304444522018N00553838EA0243002416000
+B1304484522045N00553852EA0242902417000
+B1304514522066N00553864EA0242902418000
+B1304544522087N00553876EA0242702419000
+B1304574522108N00553888EA0242402420000
+B1305004522129N00553900EA0242002420000
+B1305034522151N00553911EA0241602419000
+B1305064522172N00553924EA0241802419000
+B1305094522191N00553935EA0241102418000
+B1305124522212N00553945EA0240602417000
+B1305154522232N00553951EA0239702415000
+B1305184522252N00553959EA0239202412000
+B1305214522270N00553969EA0237702409000
+B1305244522296N00553984EA0236602405000
+B1305274522324N00553997EA0236402400000
+B1305304522349N00554011EA0235702396000
+B1305334522374N00554026EA0235202391000
+B1305364522399N00554040EA0234602386000
+B1305394522425N00554053EA0234202381000
+B1305424522450N00554066EA0233602376000
+B1305454522475N00554078EA0232802370000
+B1305484522499N00554090EA0232402365000
+B1305514522524N00554101EA0231802360000
+B1305544522547N00554110EA0231002354000
+B1305574522572N00554118EA0230602348000
+B1306004522597N00554126EA0230202343000
+B1306034522621N00554135EA0229702337000
+B1306064522646N00554145EA0229202332000
+B1306104522679N00554160EA0228502324000
+B1306134522705N00554170EA0228002319000
+B1306164522730N00554180EA0227602313000
+B1306194522755N00554190EA0227002308000
+B1306224522780N00554201EA0226702303000
+B1306254522804N00554213EA0226202298000
+B1306284522828N00554225EA0225702292000
+B1306314522851N00554234EA0225202287000
+B1306344522874N00554243EA0224302282000
+B1306374522898N00554252EA0224002277000
+B1306404522920N00554263EA0223502271000
+B1306434522942N00554276EA0222802266000
+B1306464522963N00554288EA0222502261000
+B1306494522981N00554298EA0221702256000
+B1306524523000N00554306EA0220802250000
+B1306554523020N00554312EA0220902245000
+B1306584523038N00554320EA0220402240000
+B1307014523058N00554332EA0220302235000
+B1307044523077N00554341EA0220102231000
+B1307074523095N00554349EA0219302226000
+B1307104523114N00554356EA0219202222000
+B1307134523130N00554362EA0218402218000
+B1307164523147N00554369EA0217402213000
+B1307194523168N00554376EA0217402208000
+B1307224523187N00554383EA0217002203000
+B1307254523209N00554391EA0217002198000
+B1307294523234N00554401EA0217002193000
+B1307324523250N00554409EA0217202190000
+B1307354523265N00554414EA0217202187000
+B1307384523280N00554422EA0217002184000
+B1307414523295N00554427EA0217202182000
+B1307444523310N00554431EA0217302180000
+B1307474523324N00554436EA0216802179000
+B1307504523340N00554439EA0216302177000
+B1307534523357N00554443EA0216302174000
+B1307564523374N00554447EA0216602172000
+B1307594523389N00554450EA0216702171000
+B1308024523406N00554454EA0217102169000
+B1308054523421N00554457EA0217402168000
+B1308084523436N00554462EA0217702168000
+B1308114523448N00554468EA0218102168000
+B1308144523459N00554471EA0217902169000
+B1308174523470N00554476EA0217502169000
+B1308204523483N00554481EA0217602169000
+B1308234523496N00554486EA0217102169000
+B1308264523514N00554498EA0216902168000
+B1308294523531N00554510EA0217702168000
+B1308324523545N00554516EA0217702168000
+B1308354523562N00554524EA0217602168000
+B1308384523583N00554533EA0218102168000
+B1308414523599N00554542EA0218502169000
+B1308444523614N00554548EA0218002170000
+B1308484523640N00554565EA0217702171000
+B1308514523659N00554579EA0217702171000
+B1308544523678N00554593EA0217602171000
+B1308574523697N00554606EA0217902171000
+B1309004523716N00554619EA0217802172000
+B1309034523734N00554634EA0217602172000
+B1309064523753N00554650EA0217502172000
+B1309094523771N00554664EA0217902172000
+B1309124523785N00554676EA0217802172000
+B1309154523801N00554686EA0217902173000
+B1309184523817N00554694EA0217902173000
+B1309214523832N00554704EA0217402173000
+B1309244523848N00554716EA0217302173000
+B1309274523866N00554731EA0217102173000
+B1309304523884N00554747EA0217302173000
+B1309334523903N00554763EA0217402172000
+B1309364523922N00554779EA0217402172000
+B1309394523940N00554797EA0217202171000
+B1309424523957N00554816EA0217302171000
+B1309454523971N00554830EA0217302171000
+B1309484523985N00554842EA0216802170000
+B1309514524000N00554854EA0216902170000
+B1309544524015N00554864EA0217102169000
+B1309574524028N00554875EA0217302169000
+B1310004524043N00554888EA0217202169000
+B1310034524059N00554904EA0217502169000
+B1310064524076N00554919EA0217602169000
+B1310104524099N00554941EA0218502170000
+B1310134524109N00554954EA0218802171000
+B1310164524121N00554965EA0218502172000
+B1310194524135N00554972EA0218502173000
+B1310224524147N00554979EA0217902174000
+B1310254524163N00554992EA0217902174000
+B1310284524179N00555005EA0218002174000
+B1310314524196N00555020EA0218002174000
+B1310344524214N00555036EA0219102175000
+B1310374524229N00555050EA0219302176000
+B1310404524246N00555065EA0219802177000
+B1310434524262N00555077EA0220502179000
+B1310464524277N00555086EA0220702181000
+B1310494524292N00555096EA0221302184000
+B1310524524307N00555103EA0221802187000
+B1310554524324N00555104EA0222702190000
+B1310584524337N00555091EA0223402194000
+B1311014524341N00555068EA0223702198000
+B1311044524331N00555053EA0223702202000
+B1311074524321N00555064EA0223702205000
+B1311104524329N00555082EA0225002209000
+B1311134524339N00555089EA0225502213000
+B1311164524352N00555095EA0225902217000
+B1311194524369N00555099EA0226402221000
+B1311224524388N00555102EA0227102226000
+B1311254524405N00555103EA0227402230000
+B1311284524425N00555106EA0228102235000
+B1311314524445N00555108EA0229502239000
+B1311344524461N00555107EA0229802245000
+B1311374524475N00555106EA0230602250000
+B1311404524490N00555110EA0231502256000
+B1311434524504N00555113EA0232202262000
+B1311464524519N00555111EA0232402268000
+B1311504524537N00555112EA0232802275000
+B1311534524550N00555118EA0232702280000
+B1311564524565N00555123EA0232502285000
+B1311594524582N00555130EA0232502289000
+B1312024524597N00555135EA0232302292000
+B1312054524612N00555139EA0232402295000
+B1312084524626N00555145EA0232702298000
+B1312114524639N00555150EA0232702300000
+B1312144524651N00555159EA0233102303000
+B1312174524663N00555166EA0233102305000
+B1312204524674N00555175EA0233002308000
+B1312234524687N00555185EA0233102310000
+B1312264524700N00555193EA0233002312000
+B1312294524713N00555204EA0232102313000
+B1312324524730N00555223EA0231402314000
+B1312354524747N00555243EA0231302314000
+B1312384524763N00555259EA0230702313000
+B1312414524780N00555272EA0230302312000
+B1312444524798N00555287EA0230302311000
+B1312474524816N00555302EA0230002309000
+B1312504524834N00555321EA0230102307000
+B1312534524853N00555338EA0230102306000
+B1312564524874N00555353EA0230802304000
+B1312594524893N00555362EA0231802304000
+B1313024524905N00555368EA0231702305000
+B1313054524918N00555375EA0231302305000
+B1313084524932N00555380EA0231002306000
+B1313114524947N00555389EA0230602305000
+B1313144524963N00555397EA0230602304000
+B1313184524983N00555409EA0230002303000
+B1313214525000N00555416EA0229802302000
+B1313244525016N00555422EA0229302300000
+B1313274525033N00555428EA0229302299000
+B1313304525047N00555436EA0228602297000
+B1313334525064N00555448EA0228302295000
+B1313364525080N00555457EA0227902292000
+B1313394525096N00555467EA0227602290000
+B1313424525111N00555477EA0227302287000
+B1313454525126N00555488EA0226502285000
+B1313484525144N00555505EA0225602281000
+B1313514525161N00555525EA0225302277000
+B1313544525177N00555542EA0224702273000
+B1313574525193N00555562EA0224602270000
+B1314004525207N00555582EA0224102266000
+B1314034525223N00555603EA0224002263000
+B1314064525238N00555622EA0223402259000
+B1314094525254N00555642EA0222902255000
+B1314124525273N00555661EA0222702252000
+B1314154525290N00555677EA0221802248000
+B1314184525309N00555696EA0221102244000
+B1314214525328N00555720EA0221102240000
+B1314244525344N00555742EA0220602236000
+B1314274525362N00555764EA0220102231000
+B1314304525381N00555784EA0219702227000
+B1314344525409N00555806EA0219102221000
+B1314374525431N00555821EA0219002216000
+B1314404525448N00555835EA0219202213000
+B1314434525463N00555847EA0219102209000
+B1314464525479N00555859EA0218702206000
+B1314494525496N00555869EA0218302203000
+B1314524525513N00555877EA0218402200000
+B1314554525530N00555886EA0218102197000
+B1314584525547N00555893EA0218102194000
+B1315014525563N00555900EA0217902192000
+B1315044525582N00555907EA0217702189000
+B1315074525599N00555912EA0217402187000
+B1315104525617N00555917EA0217102184000
+B1315134525634N00555921EA0217302181000
+B1315164525650N00555928EA0216902179000
+B1315194525667N00555935EA0217002177000
+B1315224525682N00555942EA0216702175000
+B1315254525698N00555949EA0216602172000
+B1315284525714N00555956EA0216302172000
+B1315314525730N00555962EA0215902169000
+B1315344525746N00555968EA0215702167000
+B1315374525762N00555976EA0215302164000
+B1315404525779N00555983EA0215002162000
+B1315434525796N00555990EA0214702160000
+B1315464525813N00555997EA0214402158000
+B1315494525829N00556004EA0214002155000
+B1315524525845N00556011EA0213802152000
+B1315564525864N00556013EA0213402148000
+B1315594525879N00556010EA0213102145000
+B1316024525892N00556003EA0212802142000
+B1316054525906N00555992EA0212402139000
+B1316084525919N00555981EA0212202136000
+B1316114525931N00555969EA0212002133000
+B1316144525943N00555956EA0211702130000
+B1316174525954N00555941EA0211602128000
+B1316204525961N00555926EA0211502125000
+B1316234525969N00555909EA0211002123000
+B1316264525980N00555894EA0211102120000
+B1316294525991N00555882EA0210602118000
+B1316324526005N00555869EA0210102115000
+B1316354526019N00555856EA0209802113000
+B1316384526034N00555843EA0209002110000
+B1316414526050N00555832EA0208602107000
+B1316444526065N00555821EA0208002103000
+B1316474526081N00555809EA0207402100000
+B1316504526096N00555796EA0206702096000
+B1316534526112N00555782EA0206302092000
+B1316564526127N00555770EA0205702087000
+B1316594526144N00555758EA0205402083000
+B1317024526158N00555746EA0204902079000
+B1317054526171N00555732EA0204702074000
+B1317084526184N00555718EA0204602070000
+B1317124526198N00555702EA0204502066000
+B1317154526210N00555691EA0204102064000
+B1317184526221N00555680EA0203702061000
+B1317214526232N00555668EA0203202057000
+B1317244526243N00555656EA0202702053000
+B1317274526255N00555642EA0202002049000
+B1317304526268N00555628EA0201702044000
+B1317334526280N00555617EA0201402040000
+B1317364526292N00555606EA0201302035000
+B1317394526303N00555594EA0201002031000
+B1317424526315N00555583EA0200602027000
+B1317454526325N00555571EA0199902023000
+B1317484526337N00555557EA0199302019000
+B1317514526347N00555542EA0198902014000
+B1317544526358N00555528EA0197602009000
+B1317574526373N00555511EA0198102004000
+B1318004526380N00555503EA0197802001000
+B1318034526389N00555493EA0197001997000
+B1318064526399N00555480EA0197001992000
+B1318094526407N00555469EA0195701988000
+B1318124526420N00555456EA0195701982000
+B1318154526431N00555443EA0195001978000
+B1318184526447N00555428EA0194501973000
+B1318214526465N00555415EA0195001968000
+B1318244526480N00555407EA0195401965000
+B1318274526493N00555398EA0195801962000
+B1318304526506N00555388EA0196101960000
+B1318334526519N00555381EA0196801959000
+B1318374526535N00555378EA0197201959000
+B1318404526544N00555372EA0197401959000
+B1318434526549N00555358EA0197701960000
+B1318464526546N00555342EA0198301961000
+B1318494526533N00555332EA0198301962000
+B1318524526516N00555339EA0198401963000
+B1318554526507N00555361EA0198401964000
+B1318584526513N00555382EA0198501965000
+B1319014526526N00555387EA0199201966000
+B1319044526538N00555387EA0199701968000
+B1319074526547N00555379EA0199901970000
+B1319104526551N00555364EA0200401972000
+B1319134526548N00555345EA0200501975000
+B1319164526537N00555334EA0200501977000
+B1319194526521N00555337EA0200501978000
+B1319224526510N00555358EA0200501980000
+B1319254526511N00555384EA0200801981000
+B1319284526521N00555401EA0201101983000
+B1319314526536N00555405EA0201801985000
+B1319344526547N00555399EA0202101987000
+B1319374526558N00555388EA0202101989000
+B1319404526572N00555374EA0202201991000
+B1319434526587N00555364EA0202401993000
+B1319464526605N00555355EA0202901996000
+B1319494526623N00555348EA0203601998000
+B1319524526639N00555344EA0204202001000
+B1319554526654N00555339EA0204002005000
+B1319594526675N00555319EA0203102008000
+B1320024526693N00555300EA0203502009000
+B1320054526708N00555283EA0203302011000
+B1320084526725N00555266EA0203702013000
+B1320114526741N00555254EA0204802015000
+B1320144526750N00555246EA0205102018000
+B1320174526758N00555235EA0205502020000
+B1320204526768N00555227EA0205902023000
+B1320234526778N00555219EA0206302026000
+B1320264526783N00555207EA0206702030000
+B1320294526775N00555195EA0207202033000
+B1320324526760N00555196EA0207702036000
+B1320354526751N00555216EA0208102040000
+B1320384526754N00555240EA0208402043000
+B1320414526767N00555251EA0208902046000
+B1320444526778N00555245EA0209102050000
+B1320474526782N00555230EA0209802053000
+B1320504526776N00555217EA0210202056000
+B1320534526764N00555212EA0210502059000
+B1320564526749N00555217EA0211002062000
+B1320594526738N00555235EA0211402066000
+B1321024526735N00555260EA0211802070000
+B1321054526744N00555281EA0212002073000
+B1321084526759N00555287EA0212502078000
+B1321114526773N00555277EA0212202081000
+B1321144526793N00555264EA0212702085000
+B1321174526814N00555255EA0213902089000
+B1321204526828N00555247EA0214802094000
+B1321234526837N00555236EA0215402099000
+B1321264526838N00555218EA0216402105000
+B1321294526826N00555207EA0217102111000
+B1321334526807N00555219EA0218202119000
+B1321364526804N00555243EA0218902125000
+B1321394526812N00555266EA0219702131000
+B1321424526826N00555271EA0220602137000
+B1321454526834N00555262EA0221502144000
+B1321484526834N00555247EA0222402150000
+B1321514526823N00555234EA0223302157000
+B1321544526807N00555236EA0223802163000
+B1321574526796N00555253EA0224602170000
+B1322004526799N00555276EA0225202177000
+B1322034526809N00555294EA0226102183000
+B1322064526821N00555298EA0226902191000
+B1322094526831N00555289EA0227602198000
+B1322124526829N00555272EA0228202205000
+B1322154526817N00555260EA0229202212000
+B1322184526801N00555261EA0229702219000
+B1322214526789N00555277EA0230102226000
+B1322244526795N00555301EA0230902233000
+B1322274526809N00555313EA0231902240000
+B1322304526821N00555308EA0232202247000
+B1322334526828N00555292EA0233102255000
+B1322364526828N00555275EA0233702262000
+B1322394526818N00555261EA0234302270000
+B1322424526802N00555259EA0234902277000
+B1322454526785N00555270EA0235402283000
+B1322484526774N00555292EA0236202290000
+B1322514526771N00555314EA0236802297000
+B1322544526771N00555339EA0238002304000
+B1322574526774N00555360EA0238702311000
+B1323004526785N00555377EA0239502318000
+B1323034526799N00555379EA0240302325000
+B1323064526809N00555370EA0241002333000
+B1323104526823N00555356EA0241702343000
+B1323134526835N00555349EA0241802350000
+B1323164526852N00555345EA0242602357000
+B1323194526867N00555344EA0243802364000
+B1323224526882N00555343EA0244502371000
+B1323254526897N00555340EA0245002378000
+B1323284526912N00555338EA0245702385000
+B1323314526928N00555336EA0246502392000
+B1323344526943N00555335EA0246902399000
+B1323374526960N00555331EA0247102406000
+B1323404526976N00555331EA0247202412000
+B1323434526993N00555333EA0247502418000
+B1323464527010N00555335EA0247402423000
+B1323494527028N00555335EA0247302428000
+B1323524527044N00555332EA0246802432000
+B1323554527066N00555330EA0245702435000
+B1323584527092N00555329EA0245502437000
+B1324014527115N00555330EA0245402438000
+B1324044527137N00555335EA0245102440000
+B1324074527159N00555340EA0244802440000
+B1324104527181N00555347EA0244802441000
+B1324134527202N00555354EA0245102441000
+B1324164527219N00555360EA0244902441000
+B1324194527238N00555362EA0244902441000
+B1324224527257N00555365EA0245102441000
+B1324254527274N00555367EA0245002441000
+B1324284527292N00555370EA0245002441000
+B1324324527317N00555376EA0244902441000
+B1324354527335N00555378EA0245302441000
+B1324384527353N00555380EA0245202441000
+B1324414527372N00555384EA0245602441000
+B1324444527389N00555386EA0245802442000
+B1324474527407N00555386EA0246202443000
+B1324504527425N00555388EA0246502444000
+B1324534527443N00555391EA0246802446000
+B1324564527461N00555393EA0246702447000
+B1324594527481N00555395EA0246702449000
+B1325024527501N00555394EA0246702450000
+B1325054527521N00555393EA0246702451000
+B1325084527541N00555392EA0246702452000
+B1325114527560N00555391EA0246702453000
+B1325144527579N00555389EA0246702454000
+B1325174527598N00555389EA0246502454000
+B1325204527617N00555392EA0246502455000
+B1325234527636N00555394EA0246702456000
+B1325264527654N00555399EA0246602456000
+B1325294527673N00555406EA0246602457000
+B1325324527692N00555414EA0246502457000
+B1325354527711N00555418EA0246402458000
+B1325384527730N00555420EA0246302458000
+B1325414527750N00555422EA0245702458000
+B1325444527770N00555424EA0245602457000
+B1325474527789N00555427EA0245102456000
+B1325504527809N00555431EA0245002455000
+B1325534527828N00555436EA0244502454000
+B1325564527847N00555442EA0244002453000
+B1325594527867N00555448EA0243602452000
+B1326024527887N00555454EA0243102450000
+B1326064527913N00555466EA0242802446000
+B1326094527932N00555475EA0242402444000
+B1326124527951N00555485EA0241902441000
+B1326154527970N00555495EA0241502437000
+B1326184527988N00555508EA0241102433000
+B1326214528006N00555523EA0240602430000
+B1326244528024N00555539EA0240102426000
+B1326274528043N00555554EA0239702421000
+B1326304528061N00555570EA0239102417000
+B1326334528081N00555585EA0238602413000
+B1326364528100N00555600EA0238202408000
+B1326394528119N00555616EA0237702404000
+B1326424528139N00555634EA0237502400000
+B1326454528157N00555652EA0236902395000
+B1326484528176N00555672EA0236502391000
+B1326514528195N00555690EA0236102387000
+B1326544528213N00555710EA0235502383000
+B1326574528233N00555728EA0234702379000
+B1327004528252N00555746EA0234002374000
+B1327034528271N00555765EA0234002370000
+B1327064528290N00555782EA0233502365000
+B1327094528309N00555800EA0233102360000
+B1327124528329N00555821EA0232502356000
+B1327154528350N00555842EA0232202351000
+B1327184528373N00555860EA0231602346000
+B1327224528403N00555887EA0230902340000
+B1327254528424N00555907EA0230502335000
+B1327284528445N00555925EA0230002330000
+B1327314528465N00555941EA0229402325000
+B1327344528486N00555957EA0228802320000
+B1327374528507N00555972EA0228202314000
+B1327404528527N00555988EA0227802309000
+B1327434528546N00556005EA0227302304000
+B1327464528565N00556021EA0226902298000
+B1327494528584N00556034EA0226302293000
+B1327524528603N00556048EA0225402288000
+B1327554528623N00556062EA0224902286000
+B1327584528642N00556078EA0224702282000
+B1328014528661N00556097EA0224302278000
+B1328044528679N00556117EA0224102273000
+B1328074528697N00556137EA0223702269000
+B1328104528714N00556158EA0223402264000
+B1328134528732N00556179EA0223102260000
+B1328164528749N00556200EA0222802255000
+B1328194528767N00556219EA0222502251000
+B1328224528784N00556239EA0222202247000
+B1328254528801N00556260EA0221802243000
+B1328284528818N00556281EA0221702239000
+B1328314528835N00556303EA0221702236000
+B1328344528852N00556323EA0221702232000
+B1328374528870N00556339EA0221402229000
+B1328404528888N00556356EA0220902226000
+B1328444528912N00556382EA0220702222000
+B1328474528928N00556404EA0220302220000
+B1328504528944N00556425EA0219902217000
+B1328534528961N00556446EA0219402214000
+B1328564528979N00556465EA0219302211000
+B1328594528996N00556483EA0218802208000
+B1329024529013N00556502EA0218402204000
+B1329054529028N00556522EA0218102201000
+B1329084529044N00556542EA0217902198000
+B1329114529060N00556560EA0217802195000
+B1329144529076N00556577EA0217602192000
+B1329174529093N00556593EA0217202188000
+B1329204529110N00556607EA0216702185000
+B1329234529129N00556621EA0216302182000
+B1329264529146N00556635EA0215802178000
+B1329294529163N00556651EA0215202174000
+B1329324529179N00556668EA0214802171000
+B1329354529194N00556687EA0214302167000
+B1329384529209N00556706EA0213702165000
+B1329414529223N00556727EA0213102161000
+B1329444529237N00556746EA0212702157000
+B1329474529251N00556764EA0212002155000
+B1329504529265N00556784EA0211602151000
+B1329534529282N00556802EA0210702147000
+B1329564529301N00556824EA0210602146000
+B1329594529315N00556845EA0210102142000
+B1330034529334N00556877EA0209302138000
+B1330064529349N00556900EA0209002134000
+B1330094529366N00556919EA0208402129000
+B1330124529383N00556938EA0208302124000
+B1330154529400N00556953EA0207602119000
+B1330184529419N00556971EA0207402114000
+B1330214529436N00556989EA0207002109000
+B1330244529453N00557007EA0206602104000
+B1330274529470N00557026EA0206402099000
+B1330304529486N00557046EA0205902094000
+B1330334529503N00557067EA0205502089000
+B1330364529520N00557088EA0205102084000
+B1330394529537N00557108EA0204702080000
+B1330424529554N00557130EA0204502075000
+B1330454529571N00557153EA0204102070000
+B1330484529587N00557176EA0204002066000
+B1330514529604N00557198EA0203902062000
+B1330544529620N00557220EA0203402058000
+B1330574529637N00557243EA0203302054000
+B1331004529654N00557264EA0203002051000
+B1331034529670N00557285EA0202802047000
+B1331064529686N00557306EA0202502044000
+B1331094529702N00557328EA0202102041000
+B1331124529718N00557350EA0201902038000
+B1331154529734N00557371EA0201602034000
+B1331194529755N00557400EA0201202030000
+B1331224529771N00557421EA0200902027000
+B1331254529787N00557442EA0200702024000
+B1331284529802N00557463EA0200502021000
+B1331314529817N00557484EA0200202018000
+B1331344529832N00557504EA0199902015000
+B1331374529847N00557523EA0199402012000
+B1331404529863N00557543EA0199202009000
+B1331434529877N00557563EA0198802006000
+B1331464529892N00557583EA0198302003000
+B1331494529908N00557603EA0197902000000
+B1331524529924N00557621EA0197401996000
+B1331554529940N00557641EA0197201993000
+B1331584529956N00557659EA0196701989000
+B1332014529973N00557679EA0196501986000
+B1332044529989N00557698EA0196201982000
+B1332074530004N00557718EA0195801979000
+B1332104530019N00557738EA0195501975000
+B1332134530034N00557757EA0195101972000
+B1332164530051N00557777EA0194801968000
+B1332194530067N00557795EA0194501965000
+B1332224530084N00557813EA0193901962000
+B1332254530100N00557833EA0193601958000
+B1332284530116N00557852EA0193001954000
+B1332314530131N00557873EA0192801950000
+B1332344530145N00557894EA0192501947000
+B1332384530166N00557923EA0192301942000
+B1332414530180N00557944EA0192001938000
+B1332444530194N00557964EA0191801935000
+B1332474530209N00557983EA0191501932000
+B1332504530224N00558002EA0191201928000
+B1332534530240N00558021EA0190901925000
+B1332564530255N00558040EA0190401922000
+B1332594530270N00558060EA0190001919000
+B1333024530285N00558080EA0189701915000
+B1333054530300N00558100EA0189101911000
+B1333084530315N00558121EA0188901908000
+B1333114530331N00558141EA0188701904000
+B1333144530345N00558161EA0188601901000
+B1333174530360N00558181EA0188301898000
+B1333204530374N00558201EA0188001895000
+B1333234530389N00558221EA0187701891000
+B1333264530404N00558240EA0187401888000
+B1333294530419N00558260EA0187101885000
+B1333324530434N00558280EA0186901883000
+B1333354530448N00558300EA0186501880000
+B1333384530463N00558320EA0186101877000
+B1333414530478N00558340EA0185801874000
+B1333444530492N00558361EA0185401871000
+B1333474530506N00558381EA0185001867000
+B1333504530520N00558402EA0184601864000
+B1333534530534N00558422EA0184301861000
+B1333574530553N00558450EA0183901856000
+B1334004530567N00558470EA0183601852000
+B1334034530582N00558490EA0183001848000
+B1334064530596N00558509EA0182601844000
+B1334094530611N00558529EA0182401840000
+B1334124530625N00558549EA0182001836000
+B1334154530639N00558569EA0181701833000
+B1334184530654N00558590EA0181301829000
+B1334214530668N00558610EA0181001825000
+B1334244530682N00558630EA0180501822000
+B1334274530697N00558650EA0180401818000
+B1334304530712N00558670EA0179901814000
+B1334334530726N00558690EA0179701811000
+B1334364530741N00558710EA0179301807000
+B1334394530755N00558730EA0179001804000
+B1334424530770N00558750EA0178701800000
+B1334454530785N00558768EA0178501797000
+B1334484530800N00558787EA0178201794000
+B1334514530815N00558805EA0177801791000
+B1334544530830N00558823EA0177501787000
+B1334574530845N00558841EA0177301784000
+B1335004530859N00558858EA0177001781000
+B1335034530874N00558876EA0176701778000
+B1335064530888N00558893EA0176401775000
+B1335094530902N00558911EA0176101771000
+B1335124530917N00558928EA0175601768000
+B1335164530936N00558951EA0175201763000
+B1335194530951N00558968EA0175001760000
+B1335224530965N00558985EA0174501757000
+B1335254530979N00559002EA0174001753000
+B1335284530993N00559019EA0173501749000
+B1335314531007N00559038EA0173301746000
+B1335344531021N00559057EA0173001742000
+B1335374531034N00559076EA0172701739000
+B1335404531048N00559096EA0172501735000
+B1335434531061N00559115EA0172301732000
+B1335464531074N00559135EA0171801728000
+B1335494531087N00559156EA0171601725000
+B1335524531100N00559176EA0171201722000
+B1335554531113N00559196EA0171101719000
+B1335584531127N00559216EA0170701716000
+B1336014531141N00559236EA0170501713000
+B1336044531155N00559255EA0170101710000
+B1336074531169N00559274EA0169701707000
+B1336104531183N00559293EA0169501704000
+B1336134531198N00559312EA0169101701000
+B1336164531212N00559330EA0168801698000
+B1336194531227N00559348EA0168401695000
+B1336224531242N00559366EA0167901692000
+B1336254531257N00559384EA0167601689000
+B1336284531272N00559402EA0167201685000
+B1336324531292N00559425EA0166801681000
+B1336354531306N00559443EA0166301677000
+B1336384531321N00559462EA0165801673000
+B1336414531335N00559479EA0165301669000
+B1336444531349N00559497EA0164801666000
+B1336474531364N00559515EA0164401662000
+B1336504531378N00559533EA0163801658000
+B1336534531393N00559551EA0163301653000
+B1336564531407N00559569EA0162801649000
+B1336594531421N00559587EA0162401645000
+B1337024531434N00559605EA0161901641000
+B1337054531448N00559624EA0161501637000
+B1337084531461N00559643EA0161101632000
+B1337114531474N00559662EA0160701628000
+B1337144531487N00559681EA0160301624000
+B1337174531500N00559700EA0159801620000
+B1337204531512N00559718EA0159201616000
+B1337234531526N00559737EA0158801612000
+B1337264531539N00559755EA0158401607000
+B1337294531552N00559774EA0158001603000
+B1337324531564N00559793EA0157601599000
+B1337354531576N00559811EA0157301595000
+B1337384531588N00559830EA0156901590000
+B1337414531600N00559849EA0156601586000
+B1337444531611N00559867EA0156301582000
+B1337484531627N00559893EA0156001577000
+B1337514531639N00559913EA0155801573000
+B1337544531651N00559933EA0155501569000
+B1337574531662N00559953EA0155301566000
+B1338004531674N00559973EA0155001562000
+B1338034531685N00559993EA0154701559000
+B1338064531696N00600014EA0154401555000
+B1338094531708N00600036EA0154101552000
+B1338124531719N00600058EA0153901549000
+B1338154531729N00600080EA0153601546000
+B1338184531739N00600104EA0153301543000
+B1338214531748N00600128EA0153001540000
+B1338244531757N00600152EA0152801537000
+B1338274531765N00600174EA0152701534000
+B1338304531774N00600197EA0152501531000
+B1338334531782N00600220EA0152401529000
+B1338364531790N00600243EA0152201526000
+B1338394531799N00600266EA0152101524000
+B1338424531807N00600290EA0151901521000
+B1338454531815N00600314EA0151701519000
+B1338484531823N00600339EA0151501517000
+B1338514531832N00600364EA0151301514000
+B1338544531841N00600389EA0150901512000
+B1338574531849N00600414EA0150501510000
+B1339004531858N00600439EA0150001507000
+B1339044531869N00600473EA0149601503000
+B1339074531876N00600496EA0149301500000
+B1339104531885N00600519EA0148801497000
+B1339134531893N00600542EA0148601494000
+B1339164531901N00600564EA0148201491000
+B1339194531909N00600588EA0148001488000
+B1339224531918N00600611EA0147601484000
+B1339254531927N00600634EA0147401481000
+B1339284531935N00600655EA0147201478000
+B1339314531941N00600677EA0146701475000
+B1339344531948N00600696EA0146101472000
+B1339374531955N00600718EA0145501468000
+B1339404531964N00600738EA0145101465000
+B1339434531975N00600756EA0144501461000
+B1339464531986N00600776EA0144101457000
+B1339494531995N00600797EA0143801453000
+B1339524532005N00600819EA0143401449000
+B1339554532015N00600839EA0143301446000
+B1339584532025N00600856EA0142701442000
+B1340014532035N00600873EA0142001438000
+B1340044532046N00600892EA0141401434000
+B1340074532055N00600912EA0141101430000
+B1340104532066N00600931EA0140701426000
+B1340134532076N00600951EA0140301422000
+B1340164532085N00600970EA0139701418000
+B1340194532096N00600991EA0139401413000
+B1340234532109N00601019EA0138901408000
+B1340264532120N00601041EA0139001404000
+B1340294532128N00601061EA0138801400000
+B1340324532138N00601081EA0138501396000
+B1340354532146N00601101EA0138401393000
+B1340384532153N00601127EA0138101390000
+B1340414532159N00601152EA0138301387000
+B1340444532162N00601175EA0137801385000
+B1340474532168N00601201EA0137401382000
+B1340504532175N00601223EA0137101380000
+B1340534532183N00601243EA0136601377000
+B1340564532190N00601265EA0136101374000
+B1340594532198N00601291EA0135801370000
+B1341024532206N00601314EA0135601367000
+B1341054532217N00601335EA0135801364000
+B1341084532229N00601353EA0136101362000
+B1341114532240N00601369EA0136601360000
+B1341144532251N00601385EA0137201359000
+B1341174532263N00601398EA0137401359000
+B1341204532274N00601405EA0136801359000
+B1341234532288N00601413EA0135801358000
+B1341264532302N00601428EA0135501356000
+B1341294532314N00601447EA0135401354000
+B1341324532325N00601465EA0135201353000
+B1341354532339N00601485EA0135401351000
+B1341384532352N00601504EA0135901350000
+B1341414532366N00601518EA0136401349000
+B1341444532379N00601525EA0136901349000
+B1341484532394N00601521EA0137401350000
+B1341514532398N00601511EA0137901350000
+B1341544532396N00601502EA0138401351000
+B1341574532387N00601497EA0139001352000
+B1342004532374N00601507EA0139501354000
+B1342034532367N00601534EA0139601356000
+B1342064532373N00601564EA0139901359000
+B1342094532387N00601578EA0140301361000
+B1342124532398N00601580EA0140601364000
+B1342154532409N00601575EA0140701367000
+B1342184532414N00601565EA0141101368000
+B1342214532415N00601555EA0141601370000
+B1342244532416N00601545EA0141601372000
+B1342274532409N00601536EA0142201375000
+B1342304532396N00601538EA0142501378000
+B1342334532384N00601553EA0142701382000
+B1342364532377N00601583EA0142701385000
+B1342394532383N00601613EA0142901387000
+B1342424532396N00601628EA0143101390000
+B1342454532407N00601628EA0143401393000
+B1342484532414N00601619EA0143601394000
+B1342514532419N00601607EA0144001396000
+B1342544532424N00601597EA0144101398000
+B1342574532426N00601586EA0144501399000
+B1343004532422N00601577EA0144901401000
+B1343034532409N00601578EA0145401405000
+B1343064532397N00601594EA0145801408000
+B1343104532395N00601635EA0145701413000
+B1343134532407N00601659EA0145901416000
+B1343164532421N00601663EA0146401420000
+B1343194532429N00601656EA0146501423000
+B1343224532435N00601646EA0146801425000
+B1343254532439N00601634EA0146601427000
+B1343284532440N00601621EA0147101430000
+B1343314532444N00601611EA0147401432000
+B1343344532445N00601597EA0147201435000
+B1343374532441N00601586EA0147201437000
+B1343404532432N00601583EA0146801438000
+B1343434532418N00601597EA0147001441000
+B1343464532413N00601626EA0147001443000
+B1343494532421N00601657EA0147201445000
+B1343524532436N00601671EA0147601447000
+B1343554532445N00601666EA0147601449000
+B1343584532442N00601655EA0147701451000
+B1344014532434N00601650EA0147901452000
+B1344044532428N00601644EA0147901453000
+B1344074532424N00601635EA0148601454000
+B1344104532427N00601626EA0148801456000
+B1344134532441N00601619EA0149201458000
+B1344164532456N00601629EA0149001460000
+B1344194532467N00601652EA0148501462000
+B1344224532464N00601680EA0147801463000
+B1344254532449N00601694EA0148101463000
+B1344284532436N00601704EA0148501464000
+B1344314532422N00601708EA0149201465000
+B1344344532413N00601707EA0149501465000
+B1344384532407N00601698EA0150001466000
+B1344414532409N00601687EA0150601467000
+B1344444532419N00601678EA0150301470000
+B1344474532435N00601678EA0150401472000
+B1344504532452N00601686EA0150401474000
+B1344534532467N00601703EA0150201476000
+B1344564532481N00601723EA0149601478000
+B1344594532494N00601750EA0149201478000
+B1345024532507N00601781EA0148801479000
+B1345054532520N00601812EA0149601479000
+B1345084532528N00601832EA0149501479000
+B1345114532538N00601852EA0148601479000
+B1345144532553N00601871EA0148801479000
+B1345174532565N00601884EA0148101478000
+B1345204532579N00601900EA0147401477000
+B1345234532596N00601924EA0147801475000
+B1345264532606N00601948EA0148701475000
+B1345294532610N00601965EA0147901474000
+B1345324532618N00601989EA0147601473000
+B1345354532627N00602020EA0147601472000
+B1345384532633N00602051EA0147801471000
+B1345414532646N00602076EA0146601469000
+B1345444532662N00602104EA0146801467000
+B1345474532673N00602128EA0146301466000
+B1345504532684N00602149EA0145301464000
+B1345534532695N00602172EA0144401461000
+B1345574532705N00602204EA0143401456000
+B1346004532717N00602232EA0141901451000
+B1346034532732N00602257EA0141501446000
+B1346064532744N00602280EA0140401440000
+B1346094532758N00602307EA0139501434000
+B1346124532770N00602333EA0138801428000
+B1346154532781N00602361EA0137701422000
+B1346184532792N00602392EA0136901416000
+B1346214532802N00602422EA0136301409000
+B1346244532810N00602452EA0135501402000
+B1346274532819N00602483EA0134901395000
+B1346304532827N00602512EA0135601389000
+B1346334532833N00602535EA0135401384000
+B1346364532843N00602560EA0134801379000
+B1346394532853N00602588EA0135101374000
+B1346424532860N00602615EA0135001369000
+B1346454532867N00602643EA0134401365000
+B1346484532873N00602670EA0134301360000
+B1346514532877N00602694EA0133301356000
+B1346544532884N00602723EA0132701351000
+B1346574532890N00602753EA0132501347000
+B1347004532894N00602782EA0132201342000
+B1347034532897N00602812EA0131601338000
+B1347064532902N00602842EA0131501333000
+B1347094532905N00602870EA0131401329000
+B1347124532905N00602897EA0131201325000
+B1347164532903N00602929EA0131101320000
+B1347194532901N00602953EA0130601316000
+B1347224532901N00602976EA0130501313000
+B1347254532903N00602998EA0130001310000
+B1347284532906N00603019EA0130101306000
+B1347314532911N00603038EA0129501303000
+B1347344532918N00603057EA0129601300000
+B1347374532927N00603071EA0129201297000
+B1347404532937N00603085EA0128901295000
+B1347434532949N00603095EA0128801292000
+B1347464532963N00603105EA0128701289000
+B1347494532976N00603114EA0129601287000
+B1347524532985N00603124EA0129301286000
+B1347554532995N00603134EA0129501284000
+B1347584533005N00603140EA0130301283000
+B1348014533015N00603141EA0130501283000
+B1348044533026N00603139EA0131101284000
+B1348074533035N00603135EA0131301284000
+B1348104533045N00603129EA0131701286000
+B1348134533054N00603129EA0131801287000
+B1348164533065N00603126EA0131401288000
+B1348194533077N00603124EA0131201289000
+B1348224533087N00603122EA0130601289000
+B1348254533100N00603122EA0131001289000
+B1348284533113N00603123EA0131501290000
+B1348314533124N00603120EA0131501291000
+B1348354533135N00603110EA0132001292000
+B1348384533140N00603106EA0132301293000
+B1348414533147N00603102EA0132401294000
+B1348444533155N00603100EA0133301295000
+B1348474533162N00603101EA0133401297000
+B1348504533172N00603097EA0134501299000
+B1348534533178N00603092EA0135201301000
+B1348564533184N00603083EA0135301303000
+B1348594533192N00603077EA0135901307000
+B1349024533201N00603079EA0136401311000
+B1349054533212N00603080EA0136901316000
+B1349084533220N00603072EA0137101320000
+B1349114533218N00603060EA0136901324000
+B1349144533203N00603060EA0137001328000
+B1349174533192N00603080EA0137001331000
+B1349204533196N00603105EA0137401333000
+B1349234533204N00603119EA0137601336000
+B1349264533214N00603126EA0137801339000
+B1349294533225N00603126EA0137701341000
+B1349324533237N00603124EA0137501343000
+B1349354533251N00603124EA0137401345000
+B1349384533265N00603120EA0137901347000
+B1349414533278N00603116EA0138501349000
+B1349444533288N00603106EA0139201352000
+B1349474533289N00603091EA0139701355000
+B1349504533277N00603080EA0140301358000
+B1349534533261N00603086EA0140901361000
+B1349564533254N00603109EA0141501365000
+B1349594533263N00603123EA0141901368000
+B1350024533274N00603114EA0142501372000
+B1350064533266N00603092EA0143501377000
+B1350094533250N00603090EA0144201382000
+B1350124533239N00603107EA0145201387000
+B1350154533239N00603129EA0145801392000
+B1350184533247N00603145EA0146201398000
+B1350214533260N00603144EA0146701403000
+B1350244533265N00603127EA0147401409000
+B1350274533253N00603112EA0148401415000
+B1350304533237N00603113EA0149101420000
+B1350334533222N00603130EA0150101426000
+B1350364533219N00603152EA0150501432000
+B1350394533231N00603167EA0151101438000
+B1350424533242N00603162EA0152101445000
+B1350454533245N00603148EA0152701451000
+B1350484533236N00603132EA0153801458000
+B1350514533221N00603125EA0154601465000
+B1350544533202N00603126EA0155501472000
+B1350574533188N00603142EA0156001480000
+B1351004533189N00603161EA0155901487000
+B1351034533200N00603174EA0157201494000
+B1351064533209N00603176EA0158201500000
+B1351094533214N00603164EA0159101508000
+B1351124533207N00603151EA0159501516000
+B1351154533189N00603149EA0160701525000
+B1351184533175N00603164EA0161401533000
+B1351214533170N00603185EA0161601541000
+B1351244533176N00603205EA0161701548000
+B1351274533189N00603212EA0162701555000
+B1351304533198N00603208EA0163801561000
+B1351334533205N00603200EA0164501566000
+B1351364533199N00603185EA0165101574000
+B1351404533177N00603195EA0165801584000
+B1351434533167N00603215EA0167101591000
+B1351464533167N00603230EA0167601599000
+B1351494533175N00603242EA0168401606000
+B1351524533184N00603243EA0169001612000
+B1351554533189N00603230EA0169901620000
+B1351584533183N00603216EA0170701628000
+B1352014533168N00603214EA0171001636000
+B1352044533152N00603229EA0171901643000
+B1352074533144N00603249EA0172901650000
+B1352104533145N00603267EA0173401658000
+B1352134533153N00603279EA0174201666000
+B1352164533165N00603281EA0175101674000
+B1352194533174N00603271EA0175701682000
+B1352224533170N00603254EA0176301689000
+B1352254533155N00603251EA0176701697000
+B1352284533142N00603269EA0177401703000
+B1352314533142N00603293EA0178501710000
+B1352344533149N00603313EA0180001717000
+B1352374533160N00603321EA0180801725000
+B1352404533168N00603309EA0181701733000
+B1352434533161N00603295EA0182201741000
+B1352464533146N00603292EA0182701749000
+B1352494533132N00603307EA0183401757000
+B1352524533126N00603330EA0184601764000
+B1352554533131N00603350EA0185201772000
+B1352584533144N00603350EA0186101780000
+B1353014533151N00603337EA0187101788000
+B1353044533147N00603321EA0187501796000
+B1353074533133N00603314EA0188001803000
+B1353104533119N00603326EA0188701810000
+B1353134533112N00603347EA0189401817000
+B1353164533112N00603369EA0190001824000
+B1353204533123N00603388EA0190201834000
+B1353234533134N00603388EA0190501840000
+B1353264533141N00603372EA0190901846000
+B1353294533140N00603353EA0191601853000
+B1353324533134N00603335EA0192101859000
+B1353354533119N00603326EA0192301865000
+B1353384533106N00603336EA0192501870000
+B1353414533098N00603358EA0193201875000
+B1353444533095N00603378EA0194001881000
+B1353474533101N00603390EA0193701886000
+B1353504533112N00603395EA0193701891000
+B1353534533122N00603383EA0193801895000
+B1353564533124N00603363EA0193601899000
+B1353594533120N00603342EA0193701902000
+B1354024533106N00603327EA0193901905000
+B1354054533090N00603323EA0193701908000
+B1354084533071N00603335EA0193701910000
+B1354114533065N00603359EA0193801911000
+B1354144533073N00603376EA0194201913000
+B1354174533082N00603387EA0193801915000
+B1354204533095N00603402EA0193701916000
+B1354234533105N00603418EA0194001918000
+B1354264533114N00603430EA0193601919000
+B1354294533127N00603439EA0193501920000
+B1354324533142N00603448EA0193001920000
+B1354354533158N00603459EA0192801920000
+B1354384533175N00603470EA0192301919000
+B1354414533191N00603483EA0192301918000
+B1354454533211N00603501EA0192201917000
+B1354484533228N00603516EA0192001916000
+B1354514533245N00603530EA0191801915000
+B1354544533262N00603542EA0191601914000
+B1354574533280N00603553EA0191201913000
+B1355004533298N00603564EA0191001912000
+B1355034533316N00603576EA0190501910000
+B1355064533336N00603588EA0190101908000
+B1355094533355N00603600EA0189901906000
+B1355124533372N00603612EA0189401904000
+B1355154533392N00603623EA0189101901000
+B1355184533412N00603635EA0188901899000
+B1355214533431N00603649EA0188901896000
+B1355244533447N00603663EA0189101894000
+B1355274533462N00603674EA0188601892000
+B1355304533480N00603682EA0187901890000
+B1355334533499N00603691EA0187301887000
+B1355364533517N00603701EA0186501884000
+B1355394533533N00603714EA0186501880000
+B1355424533548N00603729EA0186201877000
+B1355454533566N00603746EA0186401874000
+B1355484533585N00603759EA0186701871000
+B1355514533599N00603771EA0186301869000
+B1355544533617N00603780EA0185801866000
+B1355574533635N00603791EA0185801864000
+B1356004533654N00603801EA0185901862000
+B1356044533674N00603807EA0186401859000
+B1356074533680N00603806EA0186201859000
+B1356104533689N00603806EA0185501857000
+B1356134533701N00603813EA0185501856000
+B1356164533712N00603820EA0184101854000
+B1356194533731N00603833EA0183701851000
+B1356224533749N00603845EA0183601849000
+B1356254533768N00603858EA0182601846000
+B1356284533791N00603874EA0183001843000
+B1356314533807N00603888EA0183101840000
+B1356344533825N00603903EA0182201837000
+B1356374533842N00603920EA0182401835000
+B1356404533856N00603933EA0181601832000
+B1356434533874N00603949EA0181501829000
+B1356464533887N00603963EA0181001826000
+B1356494533903N00603976EA0180301823000
+B1356524533921N00603985EA0180501819000
+B1356554533936N00603993EA0180301816000
+B1356584533954N00604000EA0181301814000
+B1357014533968N00604001EA0182501813000
+B1357044533980N00603999EA0183001812000
+B1357074533993N00604012EA0183501813000
+B1357104533991N00604043EA0184401815000
+B1357144533977N00604058EA0184701817000
+B1357174533960N00604057EA0185201819000
+B1357204533955N00604041EA0186501822000
+B1357234533959N00604030EA0187201824000
+B1357264533972N00604026EA0188001829000
+B1357294533981N00604042EA0188801833000
+B1357324533971N00604059EA0189601838000
+B1357354533956N00604063EA0190701843000
+B1357384533944N00604057EA0191501849000
+B1357414533939N00604043EA0191901855000
+B1357444533944N00604030EA0191801861000
+B1357474533958N00604027EA0191901866000
+B1357504533975N00604034EA0192601871000
+B1357534533990N00604047EA0193701876000
+B1357564534003N00604064EA0194301882000
+B1357594534011N00604087EA0194501888000
+B1358024534005N00604110EA0194201893000
+B1358054533988N00604115EA0193901897000
+B1358084533978N00604102EA0194101900000
+B1358114533980N00604086EA0194701904000
+B1358154533987N00604063EA0195401908000
+B1358184533993N00604048EA0195801912000
+B1358214533999N00604037EA0195401916000
+B1358244534013N00604031EA0194901918000
+B1358274534028N00604037EA0195401921000
+B1358304534040N00604045EA0195101923000
+B1358334534055N00604056EA0195101925000
+B1358364534067N00604067EA0195801927000
+B1358394534078N00604075EA0195901930000
+B1358424534090N00604084EA0197101933000
+B1358454534100N00604089EA0197401936000
+B1358484534112N00604094EA0197501940000
+B1358514534124N00604098EA0197001943000
+B1358544534138N00604099EA0195901944000
+B1358574534154N00604102EA0194901945000
+B1359004534173N00604106EA0194401944000
+B1359034534190N00604115EA0193701943000
+B1359064534209N00604125EA0192101941000
+B1359094534233N00604140EA0191901937000
+B1359124534254N00604154EA0191201934000
+B1359154534278N00604169EA0190701930000
+B1359184534299N00604182EA0190501926000
+B1359214534319N00604196EA0189101922000
+B1359244534342N00604212EA0188101917000
+B1359274534363N00604228EA0187601912000
+B1359304534383N00604240EA0186701906000
+B1359344534414N00604254EA0185901898000
+B1359374534438N00604264EA0185101892000
+B1359404534461N00604277EA0184701885000
+B1359434534483N00604287EA0183801879000
+B1359464534505N00604297EA0183001873000
+B1359494534529N00604306EA0182501866000
+B1359524534551N00604315EA0182001860000
+B1359554534573N00604325EA0181401854000
+B1359584534595N00604335EA0180701848000
+B1400014534616N00604346EA0179801841000
+B1400044534638N00604357EA0179001834000
+B1400074534661N00604369EA0178201828000
+B1400104534684N00604381EA0177301821000
+B1400134534707N00604392EA0176701814000
+B1400164534730N00604403EA0175901807000
+B1400194534753N00604415EA0175301800000
+B1400224534777N00604426EA0174701793000
+B1400254534800N00604436EA0174201786000
+B1400284534824N00604446EA0173901780000
+B1400314534846N00604453EA0173101773000
+B1400344534869N00604461EA0172501767000
+B1400374534891N00604470EA0171801760000
+B1400404534913N00604479EA0171501754000
+B1400434534935N00604488EA0171101748000
+B1400464534957N00604492EA0170601742000
+B1400504534988N00604498EA0170101734000
+B1400534535011N00604504EA0170601729000
+B1400564535029N00604511EA0171301725000
+B1400594535044N00604519EA0171801723000
+B1401024535058N00604526EA0171801721000
+B1401054535073N00604527EA0171601719000
+B1401084535090N00604528EA0171601717000
+B1401114535105N00604529EA0171601716000
+B1401144535121N00604531EA0171701715000
+B1401174535139N00604532EA0171401714000
+B1401204535162N00604534EA0172001713000
+B1401234535181N00604543EA0172901713000
+B1401264535197N00604548EA0173301713000
+B1401294535214N00604551EA0173801714000
+B1401324535229N00604554EA0173801715000
+B1401354535244N00604551EA0173301716000
+B1401384535262N00604549EA0173101717000
+B1401414535282N00604556EA0173801717000
+B1401444535298N00604565EA0173801718000
+B1401474535316N00604576EA0173601718000
+B1401504535333N00604584EA0173701719000
+B1401534535350N00604591EA0173301719000
+B1401564535369N00604598EA0173401719000
+B1401594535387N00604603EA0173301720000
+B1402024535406N00604611EA0173601720000
+B1402054535422N00604618EA0173601721000
+B1402084535439N00604627EA0173701721000
+B1402124535462N00604634EA0173801722000
+B1402154535482N00604639EA0175001723000
+B1402184535498N00604642EA0176001725000
+B1402214535516N00604644EA0176701728000
+B1402244535535N00604650EA0178101732000
+B1402274535548N00604667EA0178901736000
+B1402304535549N00604693EA0179901741000
+B1402334535539N00604703EA0181201746000
+B1402364535532N00604700EA0182301749000
+B1402394535533N00604684EA0183401756000
+B1402424535547N00604676EA0184501764000
+B1402454535563N00604688EA0185301772000
+B1402484535567N00604713EA0186601780000
+B1402514535559N00604726EA0187501789000
+B1402544535552N00604719EA0188801795000
+B1402574535556N00604705EA0189601804000
+B1403004535572N00604701EA0190701814000
+B1403034535587N00604717EA0192201824000
+B1403064535595N00604737EA0193101834000
+B1403094535587N00604760EA0194101844000
+B1403124535576N00604760EA0195901853000
+B1403154535577N00604747EA0197101860000
+B1403184535588N00604738EA0198201872000
+B1403214535601N00604747EA0199401883000
+B1403244535602N00604772EA0200301894000
+B1403274535594N00604797EA0201401906000
+B1403304535579N00604803EA0202901917000
+B1403334535576N00604792EA0204201925000
+B1403364535584N00604779EA0205201938000
+B1403394535602N00604777EA0206501951000
+B1403424535614N00604796EA0207701964000
+B1403454535611N00604819EA0208401976000
+B1403484535597N00604835EA0209401991000
+B1403524535580N00604824EA0210902003000
+B1403554535585N00604808EA0212402015000
+B1403584535598N00604807EA0214002027000
+B1404014535611N00604821EA0215202039000
+B1404044535612N00604846EA0216102051000
+B1404074535599N00604862EA0217102062000
+B1404104535582N00604863EA0218402074000
+B1404134535575N00604850EA0219402086000
+B1404164535581N00604833EA0220402097000
+B1404194535595N00604824EA0221802109000
+B1404224535610N00604833EA0223102121000
+B1404254535617N00604853EA0223602132000
+B1404284535608N00604874EA0225002143000
+B1404314535595N00604873EA0226102154000
+B1404344535592N00604857EA0227402165000
+B1404374535603N00604842EA0228702177000
+B1404404535618N00604847EA0228902188000
+B1404434535626N00604872EA0229602198000
+B1404464535619N00604893EA0230802208000
+B1404494535607N00604901EA0231802219000
+B1404524535595N00604894EA0233002229000
+B1404554535595N00604875EA0234302240000
+B1404584535605N00604861EA0235002251000
+B1405014535619N00604860EA0235202261000
+B1405044535633N00604878EA0235902271000
+B1405074535632N00604902EA0236502280000
+B1405104535620N00604914EA0237202289000
+B1405134535604N00604914EA0238202298000
+B1405164535590N00604908EA0239202307000
+B1405194535578N00604897EA0240302316000
+B1405224535573N00604878EA0241302325000
+B1405264535583N00604855EA0241902337000
+B1405294535599N00604852EA0243202346000
+B1405324535611N00604866EA0243702354000
+B1405354535614N00604891EA0244402363000
+B1405384535606N00604905EA0244902371000
+B1405414535591N00604908EA0245102378000
+B1405444535578N00604898EA0245702386000
+B1405474535577N00604876EA0246402393000
+B1405504535587N00604860EA0247302400000
+B1405534535602N00604857EA0248102408000
+B1405564535618N00604858EA0248802415000
+B1405594535633N00604860EA0249102423000
+B1406024535647N00604861EA0249102430000
+B1406054535662N00604864EA0249302436000
+B1406084535678N00604871EA0249702442000
+B1406114535692N00604879EA0249802447000
+B1406144535707N00604890EA0250002452000
+B1406174535724N00604901EA0250302457000
+B1406204535742N00604909EA0250802461000
+B1406234535757N00604917EA0250902466000
+B1406264535777N00604922EA0251502470000
+B1406294535793N00604928EA0252102474000
+B1406324535810N00604937EA0252402479000
+B1406354535829N00604948EA0253502483000
+B1406384535848N00604958EA0254202488000
+B1406414535866N00604970EA0255102494000
+B1406444535882N00604979EA0255502499000
+B1406474535895N00604985EA0254902504000
+B1406504535912N00604995EA0254902509000
+B1406544535933N00605004EA0254602513000
+B1406574535951N00605013EA0254402516000
+B1407004535968N00605022EA0253202517000
+B1407034535992N00605036EA0252302517000
+B1407064536012N00605050EA0252302517000
+B1407094536031N00605061EA0251302516000
+B1407124536051N00605073EA0250502515000
+B1407154536070N00605086EA0249702512000
+B1407184536088N00605099EA0249102509000
+B1407214536106N00605114EA0248702506000
+B1407244536121N00605132EA0248302502000
+B1407274536138N00605148EA0247502499000
+B1407304536154N00605167EA0247302495000
+B1407334536168N00605185EA0246602491000
+B1407364536185N00605202EA0245402486000
+B1407394536204N00605215EA0244802481000
+B1407424536222N00605220EA0244502476000
+B1407454536239N00605225EA0244702472000
+B1407484536253N00605231EA0244902468000
+B1407514536265N00605240EA0245402465000
+B1407544536276N00605249EA0245602462000
+B1407574536288N00605259EA0245802460000
+B1408004536301N00605271EA0246102459000
+B1408034536314N00605284EA0246202458000
+B1408064536327N00605298EA0246502457000
+B1408094536342N00605306EA0246602456000
+B1408124536356N00605308EA0246202456000
+B1408154536368N00605312EA0245202456000
+B1408184536384N00605316EA0244002454000
+B1408224536411N00605320EA0243702450000
+B1408254536431N00605323EA0243302447000
+B1408284536451N00605329EA0243102444000
+B1408314536472N00605337EA0243002442000
+B1408344536491N00605348EA0242702439000
+B1408374536512N00605358EA0242302436000
+B1408404536537N00605368EA0241902433000
+B1408434536561N00605375EA0242002430000
+B1408464536584N00605380EA0241502428000
+B1408494536607N00605383EA0241202425000
+B1408524536630N00605386EA0240902422000
+B1408554536652N00605388EA0240202419000
+B1408584536675N00605392EA0239902416000
+B1409014536697N00605397EA0239202412000
+B1409044536721N00605401EA0238402408000
+B1409074536746N00605407EA0238102404000
+B1409104536770N00605415EA0237602400000
+B1409134536793N00605424EA0237002396000
+B1409164536817N00605433EA0236702392000
+B1409194536840N00605445EA0236402387000
+B1409224536862N00605457EA0235802383000
+B1409254536884N00605470EA0235002378000
+B1409284536907N00605485EA0234902374000
+B1409314536930N00605497EA0234202369000
+B1409344536955N00605509EA0233902365000
+B1409384536987N00605526EA0233702359000
+B1409414537009N00605541EA0233102355000
+B1409444537032N00605555EA0232802350000
+B1409474537055N00605569EA0232302346000
+B1409504537078N00605582EA0232002342000
+B1409534537100N00605595EA0231702338000
+B1409564537121N00605608EA0231002334000
+B1409594537145N00605621EA0230602329000
+B1410024537163N00605632EA0230302325000
+B1410054537179N00605642EA0229702320000
+B1410084537199N00605655EA0229302316000
+B1410114537221N00605671EA0229102312000
+B1410144537242N00605691EA0229202308000
+B1410174537262N00605713EA0229502304000
+B1410204537280N00605733EA0229702301000
+B1410234537299N00605752EA0230002299000
+B1410264537318N00605768EA0229902298000
+B1410294537337N00605785EA0229702296000
+B1410324537356N00605801EA0229502294000
+B1410354537374N00605820EA0229502293000
+B1410384537392N00605842EA0229802291000
+B1410414537409N00605865EA0229802290000
+B1410444537426N00605888EA0229902289000
+B1410474537442N00605911EA0230902289000
+B1410504537451N00605928EA0230802290000
+B1410534537463N00605944EA0231102290000
+B1410564537476N00605959EA0231702291000
+B1411004537489N00605980EA0231602292000
+B1411034537502N00605997EA0231702294000
+B1411064537515N00606014EA0231702295000
+B1411094537526N00606033EA0231802296000
+B1411124537532N00606051EA0231702297000
+B1411154537542N00606071EA0231402298000
+B1411184537553N00606087EA0231702298000
+B1411214537565N00606102EA0232402299000
+B1411244537574N00606116EA0232702301000
+B1411274537586N00606134EA0232702302000
+B1411304537599N00606148EA0233002304000
+B1411334537614N00606161EA0233102305000
+B1411364537630N00606174EA0233102307000
+B1411394537646N00606187EA0233002308000
+B1411424537663N00606200EA0233202309000
+B1411454537678N00606213EA0233002310000
+B1411484537693N00606221EA0233502311000
+B1411514537707N00606224EA0233402312000
+B1411544537723N00606223EA0233502313000
+B1411574537736N00606224EA0233202314000
+B1412004537749N00606226EA0232902314000
+B1412034537762N00606232EA0233002315000
+B1412064537775N00606238EA0233502315000
+B1412094537788N00606242EA0233802316000
+B1412124537799N00606245EA0233802318000
+B1412154537811N00606249EA0233402319000
+B1412184537826N00606253EA0233602320000
+B1412214537842N00606258EA0233702320000
+B1412254537861N00606263EA0233802322000
+B1412284537879N00606263EA0233602322000
+B1412314537897N00606264EA0233902323000
+B1412344537916N00606266EA0233902324000
+B1412374537937N00606269EA0234602325000
+B1412404537954N00606271EA0235602327000
+B1412434537969N00606269EA0236202329000
+B1412464537983N00606255EA0236902332000
+B1412494537986N00606230EA0237202335000
+B1412524537973N00606215EA0237402338000
+B1412554537958N00606226EA0238202341000
+B1412584537959N00606247EA0239102344000
+B1413014537970N00606261EA0240102348000
+B1413044537984N00606256EA0240502352000
+B1413074537996N00606237EA0241402357000
+B1413104538001N00606213EA0241502362000
+B1413134537991N00606192EA0241802367000
+B1413164537975N00606194EA0241902372000
+B1413194537967N00606212EA0242602376000
+B1413224537972N00606233EA0244002381000
+B1413254537979N00606245EA0244702387000
+B1413284537990N00606252EA0245002392000
+B1413314538003N00606247EA0245602398000
+B1413344538013N00606231EA0246202404000
+B1413374538012N00606210EA0246602409000
+B1413404538000N00606197EA0247502414000
+B1413434537987N00606201EA0248402420000
+B1413464537982N00606214EA0249102426000
+B1413494537985N00606227EA0249602432000
+B1413524537993N00606239EA0250102438000
+B1413564538009N00606238EA0250602446000
+B1413594538018N00606220EA0251402452000
+B1414024538013N00606201EA0251702458000
+B1414054537998N00606195EA0252802463000
+B1414084537990N00606206EA0253502469000
+B1414114537986N00606223EA0253902474000
+B1414144537991N00606238EA0254402480000
+B1414174538004N00606247EA0255102486000
+B1414204538018N00606248EA0255802492000
+B1414234538032N00606242EA0256402498000
+B1414264538042N00606225EA0256802504000
+B1414294538042N00606204EA0257002510000
+B1414324538029N00606192EA0256902515000
+B1414354538015N00606201EA0257002520000
+B1414384538015N00606222EA0257402524000
+B1414414538026N00606234EA0258302529000
+B1414444538041N00606239EA0258802534000
+B1414474538056N00606242EA0259102539000
+B1414504538071N00606242EA0259202544000
+B1414534538088N00606243EA0259202549000
+B1414564538105N00606243EA0259102553000
+B1414594538123N00606243EA0259102556000
+B1415024538141N00606240EA0258702559000
+B1415054538160N00606238EA0258502561000
+B1415084538177N00606234EA0258402563000
+B1415114538195N00606232EA0257702564000
+B1415144538214N00606234EA0257902565000
+B1415174538231N00606239EA0257602565000
+B1415214538255N00606247EA0257502565000
+B1415244538273N00606255EA0257102565000
+B1415274538292N00606261EA0257002564000
+B1415304538311N00606265EA0256702564000
+B1415334538331N00606271EA0256202563000
+B1415364538350N00606282EA0256502561000
+B1415394538366N00606290EA0256402561000
+B1415424538383N00606300EA0255802559000
+B1415454538399N00606309EA0255602558000
+B1415484538416N00606312EA0254402556000
+B1415514538437N00606313EA0253602553000
+B1415544538460N00606312EA0253202550000
+B1415574538483N00606313EA0252802547000
+B1416004538505N00606316EA0252202544000
+B1416034538525N00606324EA0251402540000
+B1416064538548N00606333EA0251002536000
+B1416094538572N00606340EA0250602533000
+B1416124538595N00606345EA0249902529000
+B1416154538617N00606353EA0249402524000
+B1416184538640N00606360EA0248602520000
+B1416214538665N00606372EA0248402515000
+B1416244538688N00606383EA0248002511000
+B1416274538711N00606394EA0247502506000
+B1416304538736N00606403EA0246802501000
+B1416334538761N00606413EA0246502497000
+B1416364538786N00606423EA0246302492000
+B1416394538810N00606436EA0246202488000
+B1416434538840N00606452EA0246002482000
+B1416464538862N00606464EA0245902479000
+B1416494538885N00606478EA0245602475000
+B1416524538907N00606491EA0245402471000
+B1416554538930N00606504EA0245002468000
+B1416584538953N00606517EA0244702465000
+B1417014538975N00606528EA0244602461000
+B1417044538996N00606539EA0243602458000
+B1417074539020N00606553EA0243102454000
+B1417104539043N00606567EA0242902450000
+B1417134539065N00606580EA0242002446000
+B1417164539089N00606595EA0241702442000
+B1417194539113N00606608EA0241302437000
+B1417224539137N00606620EA0240902433000
+B1417254539160N00606632EA0240202429000
+B1417284539184N00606648EA0240102424000
+B1417314539208N00606663EA0239802420000
+B1417344539232N00606679EA0239402416000
+B1417374539255N00606695EA0239202411000
+B1417404539278N00606712EA0238902408000
+B1417434539301N00606730EA0238802404000
+B1417464539324N00606746EA0238702401000
+B1417494539348N00606761EA0238502397000
+B1417524539371N00606775EA0238302394000
+B1417554539394N00606788EA0237602391000
+B1417584539417N00606801EA0236802388000
+B1418014539440N00606815EA0236402384000
+B1418054539471N00606833EA0235802379000
+B1418084539494N00606849EA0235102375000
+B1418114539515N00606865EA0234502370000
+B1418144539537N00606881EA0233702366000
+B1418174539560N00606897EA0233102361000
+B1418204539582N00606913EA0232502356000
+B1418234539605N00606930EA0231802351000
+B1418264539628N00606945EA0231102346000
+B1418294539652N00606960EA0230502340000
+B1418324539675N00606976EA0229802335000
+B1418354539698N00606991EA0229402329000
+B1418384539721N00607006EA0228802324000
+B1418414539743N00607021EA0228402318000
+B1418444539765N00607036EA0227802313000
+B1418474539788N00607052EA0227202308000
+B1418504539810N00607068EA0226702302000
+B1418534539831N00607083EA0226002297000
+B1418564539854N00607099EA0225402291000
+B1418594539877N00607115EA0224802285000
+B1419024539899N00607131EA0224202280000
+B1419054539921N00607148EA0223702274000
+B1419084539943N00607165EA0223302268000
+B1419114539964N00607181EA0222902263000
+B1419144539986N00607197EA0222502258000
+B1419174540008N00607212EA0222102252000
+B1419204540029N00607228EA0221802247000
+B1419244540060N00607250EA0221902241000
+B1419274540081N00607265EA0221602236000
+B1419304540102N00607280EA0221202232000
+B1419334540125N00607293EA0221002228000
+B1419364540147N00607306EA0220502224000
+B1419394540168N00607320EA0219902220000
+B1419424540190N00607336EA0219502216000
+B1419454540210N00607353EA0219002211000
+B1419484540231N00607371EA0218802207000
+B1419514540252N00607390EA0218402203000
+B1419544540274N00607407EA0218002199000
+B1419574540296N00607426EA0217902195000
+B1420004540317N00607444EA0217802192000
+B1420034540337N00607462EA0217502188000
+B1420064540357N00607481EA0217302185000
+B1420094540377N00607497EA0217002182000
+B1420124540396N00607515EA0216702179000
+B1420154540414N00607533EA0216502175000
+B1420184540430N00607552EA0216002172000
+B1420214540447N00607573EA0215602169000
+B1420244540464N00607593EA0215302165000
+B1420274540480N00607614EA0214702162000
+B1420304540498N00607633EA0213902158000
+B1420334540515N00607655EA0213302154000
+B1420364540532N00607676EA0212602149000
+B1420394540549N00607702EA0212202144000
+B1420434540571N00607733EA0212002138000
+B1420464540587N00607757EA0211602134000
+B1420494540603N00607778EA0211102130000
+B1420524540618N00607801EA0210702125000
+B1420554540633N00607822EA0210202121000
+B1420584540647N00607844EA0209502116000
+B1421014540661N00607865EA0208602111000
+B1421044540676N00607888EA0207802106000
+B1421074540692N00607911EA0207102100000
+B1421104540707N00607934EA0206102094000
+B1421134540723N00607959EA0205402088000
+B1421164540740N00607983EA0204802081000
+B1421194540756N00608005EA0203902075000
+B1421224540774N00608028EA0203302068000
+B1421254540790N00608051EA0202802062000
+B1421284540805N00608071EA0201802055000
+B1421314540822N00608093EA0201202048000
+B1421344540836N00608115EA0200502042000
+B1421374540851N00608137EA0199802035000
+B1421404540866N00608158EA0199502028000
+B1421434540881N00608177EA0198602022000
+B1421464540897N00608198EA0198102015000
+B1421494540910N00608220EA0197402009000
+B1421524540922N00608242EA0196302002000
+B1421554540936N00608268EA0195901996000
+B1421584540950N00608291EA0195201987000
+B1422024540970N00608321EA0194401980000
+B1422054540985N00608342EA0193701974000
+B1422084541001N00608365EA0193001967000
+B1422114541017N00608385EA0192801960000
+B1422144541031N00608408EA0192801955000
+B1422174541045N00608428EA0192701949000
+B1422204541061N00608448EA0192301944000
+B1422234541077N00608467EA0192101940000
+B1422264541092N00608485EA0191601935000
+B1422294541107N00608505EA0191101931000
+B1422324541122N00608526EA0190701927000
+B1422354541136N00608547EA0190101922000
+B1422384541149N00608567EA0189301918000
+B1422414541159N00608588EA0188801913000
+B1422444541168N00608608EA0188501908000
+B1422474541176N00608628EA0187701904000
+B1422504541188N00608654EA0187401899000
+B1422534541198N00608681EA0187601894000
+B1422564541208N00608704EA0187301890000
+B1422594541218N00608728EA0187201886000
+B1423024541229N00608752EA0186801883000
+B1423054541241N00608777EA0186601879000
+B1423084541254N00608803EA0186201876000
+B1423114541268N00608826EA0185801872000
+B1423144541281N00608851EA0185301868000
+B1423184541297N00608884EA0184601863000
+B1423214541309N00608909EA0184101859000
+B1423244541323N00608934EA0183501854000
+B1423274541336N00608960EA0182901850000
+B1423304541350N00608987EA0182201845000
+B1423334541364N00609015EA0181501840000
+B1423364541377N00609044EA0180601834000
+B1423394541391N00609071EA0180101829000
+B1423424541402N00609094EA0179201823000
+B1423454541414N00609117EA0178001817000
+B1423484541426N00609140EA0177501810000
+B1423514541434N00609160EA0177501803000
+B1423544541438N00609181EA0177301798000
+B1423574541446N00609198EA0177201792000
+B1424004541452N00609216EA0177301788000
+B1424034541458N00609235EA0176601784000
+B1424064541466N00609258EA0176301779000
+B1424094541474N00609284EA0176001775000
+B1424124541484N00609312EA0176301771000
+B1424154541497N00609335EA0177101768000
+B1424184541505N00609354EA0177901766000
+B1424214541512N00609374EA0179001766000
+B1424244541511N00609399EA0180301767000
+B1424274541502N00609424EA0181301769000
+B1424304541489N00609445EA0182201772000
+B1424334541469N00609455EA0183201776000
+B1424364541450N00609450EA0184401781000
+B1424394541441N00609436EA0185601786000
+B1424424541442N00609425EA0186801790000
+B1424464541450N00609434EA0188001797000
+B1424494541449N00609457EA0189401806000
+B1424524541437N00609477EA0190101815000
+B1424554541416N00609491EA0191301824000
+B1424584541396N00609495EA0192401834000
+B1425014541380N00609482EA0193801843000
+B1425044541373N00609467EA0194801853000
+B1425074541376N00609452EA0195901861000
+B1425104541382N00609450EA0196901867000
+B1425134541387N00609458EA0197901875000
+B1425164541387N00609479EA0199301887000
+B1425194541377N00609499EA0200301899000
+B1425224541358N00609511EA0201601910000
+B1425254541342N00609506EA0203201921000
+B1425284541333N00609493EA0204101933000
+B1425314541334N00609478EA0204901942000
+B1425344541340N00609473EA0206101948000
+B1425374541348N00609475EA0207401955000
+B1425404541351N00609488EA0208201967000
+B1425434541350N00609511EA0209401981000
+B1425464541335N00609532EA0210701994000
+B1425494541315N00609543EA0212102007000
+B1425524541295N00609537EA0213302020000
+B1425554541288N00609520EA0214502032000
+B1425584541291N00609507EA0216102043000
+B1426014541295N00609506EA0216802050000
+B1426044541300N00609519EA0218302062000
+B1426084541293N00609547EA0219402081000
+B1426114541276N00609566EA0220402094000
+B1426144541254N00609574EA0221802107000
+B1426174541234N00609566EA0223102120000
+B1426204541222N00609548EA0224602133000
+B1426234541218N00609532EA0225502146000
+B1426264541223N00609525EA0226402152000
+B1426294541227N00609530EA0227602159000
+B1426324541234N00609534EA0228602166000
+B1426354541240N00609536EA0230002174000
+B1426384541245N00609533EA0231202183000
+B1426414541250N00609529EA0232702192000
+B1426444541253N00609524EA0233602202000
+B1426474541250N00609508EA0234302218000
+B1426504541233N00609490EA0235202234000
+B1426534541211N00609482EA0236402249000
+B1426564541191N00609492EA0237702263000
+B1426594541180N00609511EA0238802275000
+B1427024541184N00609523EA0239902286000
+B1427054541188N00609524EA0241202292000
+B1427084541193N00609522EA0242002299000
+B1427114541198N00609523EA0243402307000
+B1427144541202N00609523EA0243602316000
+B1427174541209N00609521EA0244002324000
+B1427204541216N00609517EA0244502332000
+B1427234541222N00609513EA0244702340000
+B1427264541229N00609511EA0245102348000
+B1427294541235N00609514EA0244702355000
+B1427324541242N00609516EA0245102362000
+B1427354541250N00609516EA0244302371000
+B1427384541265N00609513EA0245302382000
+B1427424541281N00609516EA0246202394000
+B1427454541292N00609518EA0246502402000
+B1427484541307N00609523EA0246602410000
+B1427514541323N00609528EA0247302416000
+B1427544541335N00609534EA0248202423000
+B1427574541346N00609536EA0248102429000
+B1428004541360N00609537EA0248602434000
+B1428034541372N00609537EA0248902439000
+B1428064541385N00609539EA0249002444000
+B1428094541398N00609541EA0249602448000
+B1428124541409N00609547EA0249902453000
+B1428154541422N00609550EA0250602457000
+B1428184541433N00609547EA0251202462000
+B1428214541445N00609548EA0252202467000
+B1428244541455N00609547EA0253202473000
+B1428274541465N00609551EA0253802479000
+B1428304541478N00609556EA0254202484000
+B1428334541492N00609561EA0255502490000
+B1428364541502N00609566EA0256502497000
+B1428394541514N00609571EA0257802503000
+B1428424541526N00609572EA0258302510000
+B1428454541542N00609571EA0259802518000
+B1428484541555N00609569EA0260902526000
+B1428514541570N00609567EA0261502534000
+B1428544541586N00609572EA0262602542000
+B1428574541598N00609576EA0262502550000
+B1429004541614N00609580EA0263002557000
+B1429034541627N00609585EA0264302564000
+B1429064541639N00609588EA0264802572000
+B1429094541653N00609590EA0265402579000
+B1429124541667N00609589EA0265202586000
+B1429154541683N00609583EA0264402592000
+B1429184541704N00609578EA0264102596000
+B1429214541726N00609574EA0263602600000
+B1429254541757N00609565EA0263102604000
+B1429284541780N00609557EA0262902606000
+B1429314541803N00609552EA0262202607000
+B1429344541827N00609547EA0261602607000
+B1429374541850N00609541EA0261402607000
+B1429404541873N00609537EA0260902606000
+B1429434541894N00609536EA0260302605000
+B1429464541916N00609535EA0259202603000
+B1429494541940N00609534EA0258502600000
+B1429524541960N00609534EA0258002597000
+B1429554541979N00609535EA0256802594000
+B1429584541999N00609540EA0255802589000
+B1430014542020N00609540EA0255002584000
+B1430044542040N00609539EA0254602579000
+B1430074542058N00609536EA0254502574000
+B1430104542075N00609534EA0253902569000
+B1430134542094N00609534EA0253502564000
+B1430164542114N00609533EA0253002559000
+B1430194542134N00609532EA0252602555000
+B1430224542153N00609534EA0252302550000
+B1430254542173N00609536EA0252202546000
+B1430284542192N00609536EA0252002541000
+B1430314542212N00609538EA0251702537000
+B1430344542233N00609540EA0251202534000
+B1430374542255N00609543EA0250702530000
+B1430414542286N00609546EA0250302524000
+B1430444542309N00609549EA0249202520000
+B1430474542333N00609550EA0248502514000
+B1430504542355N00609552EA0247402509000
+B1430534542381N00609554EA0245702503000
+B1430564542406N00609554EA0244602497000
+B1430594542427N00609552EA0243102489000
+B1431024542450N00609547EA0241202480000
+B1431054542476N00609538EA0240902471000
+B1431084542494N00609527EA0240002462000
+B1431114542515N00609513EA0238402453000
+B1431144542537N00609495EA0237702443000
+B1431174542557N00609479EA0236802434000
+B1431204542578N00609463EA0235902425000
+B1431234542597N00609450EA0235902416000
+B1431264542613N00609438EA0235102408000
+B1431294542632N00609424EA0234602400000
+B1431324542650N00609410EA0234202392000
+B1431354542668N00609396EA0233502384000
+B1431384542687N00609384EA0232902377000
+B1431414542701N00609377EA0232802370000
+B1431444542712N00609369EA0231602364000
+B1431474542726N00609366EA0231402357000
+B1431504542738N00609363EA0230602350000
+B1431534542752N00609361EA0230002344000
+B1431564542765N00609361EA0229502337000
+B1431594542776N00609360EA0229002331000
+B1432034542795N00609353EA0227402322000
+B1432064542816N00609344EA0226602315000
+B1432094542834N00609337EA0226002307000
+B1432124542851N00609329EA0224702300000
+B1432154542871N00609320EA0223902292000
+B1432184542888N00609309EA0223002284000
+B1432214542905N00609295EA0221602275000
+B1432244542922N00609280EA0220802267000
+B1432274542939N00609267EA0219902258000
+B1432304542956N00609255EA0218902249000
+B1432334542974N00609242EA0218002240000
+B1432364542990N00609230EA0217702232000
+B1432394543005N00609220EA0216802223000
+B1432424543022N00609212EA0216102215000
+B1432454543037N00609203EA0215502207000
+B1432484543052N00609193EA0214402199000
+B1432514543068N00609184EA0213802191000
+B1432544543083N00609177EA0213002183000
+B1432574543099N00609171EA0212402175000
+B1433004543117N00609166EA0212002168000
+B1433034543135N00609161EA0211302160000
+B1433064543154N00609157EA0210702153000
+B1433094543171N00609152EA0210002146000
+B1433124543189N00609148EA0209302139000
+B1433154543208N00609142EA0208802132000
+B1433184543226N00609139EA0208202125000
+B1433214543245N00609136EA0207602119000
+B1433254543271N00609133EA0206902110000
+B1433284543289N00609130EA0206302103000
+B1433314543307N00609126EA0205602096000
+B1433344543325N00609123EA0204902089000
+B1433374543343N00609122EA0204302083000
+B1433404543362N00609122EA0203502076000
+B1433434543382N00609123EA0202902069000
+B1433464543402N00609126EA0202702063000
+B1433494543423N00609130EA0202702057000
+B1433524543443N00609136EA0203102052000
+B1433554543462N00609142EA0203302048000
+B1433584543479N00609145EA0203702045000
+B1434014543493N00609149EA0203602042000
+B1434044543512N00609150EA0203002039000
+B1434074543533N00609152EA0203502037000
+B1434104543550N00609152EA0203602035000
+B1434134543564N00609153EA0203302034000
+B1434164543579N00609155EA0202802032000
+B1434194543592N00609156EA0202302030000
+B1434224543611N00609153EA0201502027000
+B1434254543633N00609151EA0201902024000
+B1434284543649N00609153EA0201802022000
+B1434314543667N00609156EA0201502020000
+B1434344543688N00609157EA0201802018000
+B1434374543709N00609159EA0202002016000
+B1434404543731N00609164EA0202102015000
+B1434434543753N00609167EA0202202014000
+B1434474543782N00609169EA0201402013000
+B1434504543806N00609167EA0201302011000
+B1434534543826N00609165EA0201102009000
+B1434564543847N00609164EA0200202007000
+B1434594543868N00609166EA0200302005000
+B1435024543888N00609170EA0199702003000
+B1435054543912N00609174EA0199002000000
+B1435084543935N00609178EA0199201998000
+B1435114543955N00609181EA0198701995000
+B1435144543977N00609183EA0198501993000
+B1435174543995N00609185EA0197901990000
+B1435204544015N00609186EA0197401987000
+B1435234544035N00609187EA0197301984000
+B1435264544053N00609189EA0196801981000
+B1435294544074N00609194EA0196401978000
+B1435324544094N00609199EA0196501975000
+B1435354544113N00609204EA0195901972000
+B1435384544134N00609206EA0195601969000
+B1435414544154N00609209EA0195401965000
+B1435444544172N00609211EA0194901962000
+B1435474544191N00609215EA0194601959000
+B1435504544210N00609217EA0194201956000
+B1435534544229N00609221EA0193701952000
+B1435564544247N00609225EA0193401949000
+B1435594544265N00609229EA0192901945000
+B1436024544285N00609234EA0192501941000
+B1436054544303N00609239EA0192001937000
+B1436094544328N00609244EA0191801932000
+B1436124544345N00609248EA0191301928000
+B1436154544363N00609252EA0190801924000
+B1436184544382N00609256EA0190201920000
+B1436214544401N00609259EA0189701915000
+B1436244544419N00609260EA0189101911000
+B1436274544438N00609260EA0188601907000
+B1436304544457N00609262EA0188101902000
+B1436334544475N00609264EA0187501897000
+B1436364544494N00609266EA0186901893000
+B1436394544514N00609268EA0186501888000
+B1436424544532N00609272EA0186001883000
+B1436454544551N00609274EA0185401878000
+B1436484544570N00609276EA0185001873000
+B1436514544590N00609278EA0184601869000
+B1436544544609N00609282EA0184101864000
+B1436574544628N00609285EA0183401860000
+B1437004544647N00609289EA0182801856000
+B1437034544665N00609293EA0182101851000
+B1437064544684N00609298EA0181601847000
+B1437094544702N00609303EA0181201842000
+B1437124544720N00609309EA0180501837000
+B1437154544740N00609315EA0180101832000
+B1437184544760N00609322EA0179301827000
+B1437214544781N00609327EA0178401821000
+B1437244544802N00609333EA0177601815000
+B1437284544831N00609340EA0176601807000
+B1437314544853N00609344EA0175601800000
+B1437344544873N00609349EA0174901794000
+B1437374544891N00609356EA0174201787000
+B1437404544908N00609363EA0173801781000
+B1437434544923N00609370EA0173001775000
+B1437464544940N00609380EA0172701768000
+B1437494544956N00609392EA0172901763000
+B1437524544969N00609403EA0174001758000
+B1437554544976N00609414EA0174501754000
+B1437584544984N00609423EA0174701751000
+B1438014544994N00609434EA0175901750000
+B1438044544999N00609443EA0176301749000
+B1438074545006N00609450EA0176601750000
+B1438104545012N00609447EA0177101750000
+B1438134545013N00609436EA0177101750000
+B1438164545004N00609419EA0177501752000
+B1438194544986N00609410EA0178101753000
+B1438224544963N00609416EA0178901755000
+B1438254544947N00609437EA0179301758000
+B1438284544943N00609462EA0180101761000
+B1438314544948N00609474EA0180501763000
+B1438344544953N00609473EA0180501765000
+B1438374544952N00609458EA0180701768000
+B1438404544936N00609442EA0181301771000
+B1438434544914N00609443EA0182001774000
+B1438464544897N00609461EA0182501778000
+B1438494544893N00609485EA0182901781000
+B1438524544898N00609499EA0183201783000
+B1438564544907N00609505EA0183201785000
+B1438594544916N00609508EA0183301788000
+B1439024544929N00609512EA0182901791000
+B1439054544946N00609514EA0182901794000
+B1439084544962N00609520EA0183001796000
+B1439114544980N00609530EA0182801798000
+B1439144544998N00609541EA0182901799000
+B1439174545013N00609552EA0183501801000
+B1439204545025N00609563EA0183101803000
+B1439234545043N00609574EA0182801804000
+B1439264545060N00609587EA0183501806000
+B1439294545074N00609599EA0184401809000
+B1439324545085N00609607EA0185701812000
+B1439354545094N00609612EA0186701815000
+B1439384545100N00609603EA0187301818000
+B1439414545094N00609586EA0187701823000
+B1439444545075N00609577EA0188401828000
+B1439474545055N00609588EA0189301833000
+B1439504545046N00609611EA0190501839000
+B1439534545046N00609631EA0191601845000
+B1439564545053N00609645EA0192601851000
+B1439594545061N00609647EA0193301856000
+B1440024545068N00609637EA0194701860000
+B1440054545062N00609621EA0195201869000
+B1440084545045N00609612EA0195701877000
+B1440114545027N00609624EA0196401885000
+B1440144545019N00609647EA0197301893000
+B1440174545020N00609667EA0198301900000
+B1440204545028N00609679EA0199301908000
+B1440234545037N00609681EA0200501913000
+B1440264545044N00609677EA0201101918000
+B1440294545049N00609662EA0202101928000
+B1440334545041N00609634EA0203201941000
+B1440364545025N00609625EA0204001951000
+B1440394545008N00609636EA0204901961000
+B1440424545001N00609657EA0205801970000
+B1440454545006N00609673EA0207001979000
+B1440484545013N00609674EA0208101984000
+B1440514545021N00609665EA0208901994000
+B1440544545024N00609647EA0209902004000
+B1440574545017N00609627EA0210902015000
+B1441004545001N00609623EA0211502025000
+B1441034544992N00609640EA0212402034000
+B1441064544994N00609660EA0213902044000
+B1441094545001N00609671EA0214502054000
+B1441124545013N00609674EA0215102063000
+B1441154545023N00609663EA0215102072000
+B1441184545023N00609642EA0214902080000
+B1441214545015N00609624EA0214802087000
+B1441244544999N00609616EA0214502092000
+B1441274544979N00609615EA0215002098000
+B1441304544959N00609617EA0215702103000
+B1441334544939N00609623EA0217002108000
+B1441364544930N00609639EA0218102114000
+B1441394544930N00609658EA0219202120000
+B1441424544942N00609659EA0219802127000
+B1441454544945N00609638EA0220702134000
+B1441484544932N00609626EA0221502141000
+B1441514544917N00609632EA0222202148000
+B1441544544914N00609648EA0223202155000
+B1441574544923N00609655EA0224102162000
+B1442004544932N00609643EA0224602169000
+B1442044544929N00609616EA0224502179000
+B1442074544913N00609603EA0225002185000
+B1442104544897N00609607EA0225502191000
+B1442134544883N00609624EA0225802197000
+B1442164544870N00609643EA0226902203000
+B1442194544857N00609661EA0228102209000
+B1442224544854N00609681EA0229202216000
+B1442254544862N00609691EA0229902223000
+B1442284544872N00609682EA0230602230000
+B1442314544871N00609660EA0231402237000
+B1442344544863N00609645EA0232102244000
+B1442374544847N00609640EA0232502251000
+B1442404544834N00609654EA0233602258000
+B1442434544833N00609671EA0234402265000
+B1442464544838N00609685EA0235102273000
+B1442494544848N00609689EA0235202280000
+B1442524544858N00609677EA0234902287000
+B1442554544856N00609651EA0235102292000
+B1442584544847N00609628EA0235502298000
+B1443014544831N00609614EA0235902303000
+B1443044544814N00609613EA0236502308000
+B1443074544797N00609621EA0236802313000
+B1443104544783N00609637EA0237702319000
+B1443134544771N00609652EA0238302324000
+B1443164544764N00609672EA0239102330000
+B1443194544769N00609687EA0240002336000
+B1443224544779N00609686EA0240502342000
+B1443254544783N00609666EA0241102349000
+B1443284544776N00609642EA0241502355000
+B1443314544758N00609628EA0242102361000
+B1443344544740N00609630EA0242502367000
+B1443374544729N00609646EA0243102373000
+B1443404544728N00609662EA0243802378000
+B1443444544735N00609680EA0244602386000
+B1443474544744N00609688EA0245402392000
+B1443504544756N00609685EA0245802398000
+B1443534544765N00609668EA0246002404000
+B1443564544761N00609644EA0246402409000
+B1443594544745N00609629EA0246702415000
+B1444024544726N00609625EA0247202419000
+B1444054544710N00609633EA0247802424000
+B1444084544705N00609654EA0248602429000
+B1444114544710N00609670EA0249602434000
+B1444144544721N00609675EA0249902440000
+B1444174544734N00609672EA0249802446000
+B1444204544749N00609669EA0249002451000
+B1444234544770N00609663EA0248102454000
+B1444264544791N00609659EA0247902456000
+B1444294544810N00609657EA0247202458000
+B1444324544833N00609654EA0246202458000
+B1444354544855N00609651EA0245602458000
+B1444384544877N00609649EA0244502456000
+B1444414544899N00609649EA0244502454000
+B1444444544919N00609653EA0244202452000
+B1444474544939N00609658EA0243102449000
+B1444504544963N00609663EA0242902446000
+B1444534544985N00609668EA0242702443000
+B1444564545006N00609673EA0243502440000
+B1444594545021N00609681EA0244602439000
+B1445024545032N00609687EA0245002439000
+B1445054545046N00609694EA0245402439000
+B1445084545064N00609702EA0244902439000
+B1445124545095N00609713EA0245402439000
+B1445154545117N00609716EA0245202439000
+B1445184545139N00609718EA0245402439000
+B1445214545158N00609720EA0245602440000
+B1445244545178N00609725EA0244602440000
+B1445274545198N00609732EA0245002441000
+B1445304545214N00609734EA0244802441000
+B1445334545232N00609736EA0244102440000
+B1445364545252N00609736EA0243902440000
+B1445394545270N00609735EA0243202438000
+B1445424545290N00609733EA0242802437000
+B1445454545308N00609732EA0242402435000
+B1445484545328N00609732EA0241902432000
+B1445514545348N00609730EA0241402430000
+B1445544545366N00609729EA0240702427000
+B1445574545386N00609727EA0240002423000
+B1446004545406N00609723EA0239502419000
+B1446034545424N00609721EA0238802416000
+B1446064545444N00609720EA0237902411000
+B1446094545465N00609719EA0237402406000
+B1446124545486N00609718EA0236502401000
+B1446154545506N00609718EA0236102396000
+B1446184545525N00609717EA0235302391000
+B1446214545545N00609714EA0234402386000
+B1446244545566N00609712EA0234102380000
+B1446274545585N00609711EA0233902375000
+B1446314545609N00609711EA0233102367000
+B1446344545630N00609712EA0232702362000
+B1446374545649N00609713EA0232502356000
+B1446404545668N00609714EA0231902351000
+B1446434545688N00609717EA0231702346000
+B1446464545706N00609721EA0231702342000
+B1446494545725N00609725EA0231102337000
+B1446524545744N00609728EA0231102333000
+B1446554545762N00609728EA0231002329000
+B1446584545780N00609725EA0231302325000
+B1447014545795N00609723EA0232602323000
+B1447044545802N00609715EA0233502322000
+B1447074545811N00609714EA0234102323000
+B1447104545820N00609725EA0234802323000
+B1447134545818N00609749EA0235602325000
+B1447164545802N00609765EA0236302327000
+B1447194545784N00609760EA0236802329000
+B1447224545773N00609741EA0237302332000
+B1447254545777N00609724EA0238002335000
+B1447284545788N00609720EA0238902339000
+B1447314545799N00609729EA0239802344000
+B1447344545804N00609748EA0240702349000
+B1447374545796N00609766EA0241702354000
+B1447404545782N00609778EA0242102360000
+B1447434545765N00609772EA0242602365000
+B1447464545760N00609754EA0243502370000
+B1447494545767N00609745EA0244402375000
+B1447524545778N00609750EA0244902381000
+B1447554545784N00609766EA0245902388000
+B1447584545784N00609785EA0246402394000
+B1448014545772N00609801EA0247002401000
+B1448044545756N00609797EA0247502408000
+B1448084545750N00609770EA0248302416000
+B1448114545759N00609759EA0249002422000
+B1448144545771N00609760EA0249602428000
+B1448174545786N00609768EA0250102435000
+B1448204545804N00609778EA0250002441000
+B1448234545827N00609791EA0250602447000
+B1448264545846N00609806EA0251402452000
+B1448294545861N00609820EA0251002458000
+B1448324545880N00609838EA0250302463000
+B1448354545900N00609855EA0249802466000
+B1448384545919N00609873EA0249902469000
+B1448414545934N00609892EA0249202472000
+B1448444545951N00609913EA0247702473000
+B1448474545973N00609936EA0247702474000
+B1448504545993N00609957EA0247502474000
+B1448534546014N00609976EA0247802474000
+B1448564546034N00609989EA0247902473000
+B1448594546051N00609999EA0247102473000
+B1449024546070N00610014EA0247402472000
+B1449054546082N00610023EA0247602471000
+B1449084546095N00610030EA0246602471000
+B1449114546114N00610045EA0246402469000
+B1449144546133N00610058EA0245602467000
+B1449174546155N00610073EA0244702465000
+B1449204546178N00610091EA0245202462000
+B1449234546197N00610108EA0245602460000
+B1449264546214N00610126EA0245902458000
+B1449294546233N00610145EA0245702457000
+B1449324546252N00610167EA0245702456000
+B1449364546277N00610193EA0245202454000
+B1449394546296N00610213EA0244502453000
+B1449424546315N00610231EA0243302450000
+B1449454546335N00610252EA0242202447000
+B1449484546355N00610272EA0241602443000
+B1449514546376N00610293EA0240602439000
+B1449544546396N00610316EA0240202434000
+B1449574546415N00610339EA0239502430000
+B1450004546434N00610362EA0238902425000
+B1450034546453N00610385EA0238902420000
+B1450064546470N00610406EA0238402415000
+B1450094546488N00610429EA0238002410000
+B1450124546506N00610450EA0238002406000
+B1450154546523N00610472EA0237702401000
+B1450184546540N00610498EA0237602397000
+B1450214546553N00610526EA0237502393000
+B1450244546563N00610555EA0236802389000
+B1450274546575N00610588EA0236702385000
+B1450304546587N00610618EA0236602381000
+B1450334546599N00610647EA0236202378000
+B1450364546612N00610675EA0235802374000
+B1450394546624N00610704EA0235302370000
+B1450424546636N00610735EA0235002367000
+B1450454546649N00610762EA0235102363000
+B1450484546660N00610788EA0234602360000
+B1450514546672N00610812EA0233902357000
+B1450544546686N00610835EA0233502354000
+B1450574546697N00610857EA0232802351000
+B1451004546709N00610880EA0232102347000
+B1451044546724N00610911EA0230902342000
+B1451074546736N00610932EA0230202337000
+B1451104546746N00610958EA0229602332000
+B1451134546757N00610987EA0229102327000
+B1451164546771N00611014EA0229702322000
+B1451194546778N00611037EA0230302319000
+B1451224546783N00611057EA0230102316000
+B1451254546795N00611080EA0229702312000
+B1451284546806N00611105EA0230502310000
+B1451314546816N00611122EA0230202308000
+B1451344546828N00611139EA0229802306000
+B1451374546845N00611157EA0229502303000
+B1451404546861N00611177EA0229402301000
+B1451434546877N00611198EA0229102299000
+B1451464546892N00611219EA0228702297000
+B1451494546908N00611241EA0228402294000
+B1451524546924N00611262EA0227902292000
+B1451554546940N00611283EA0227402289000
+B1451584546957N00611307EA0227002287000
+B1452014546974N00611330EA0226702284000
+B1452044546993N00611352EA0226402281000
+B1452074547011N00611373EA0226302278000
+B1452104547027N00611395EA0226202275000
+B1452134547043N00611417EA0224902273000
+B1452164547063N00611440EA0224402269000
+B1452194547082N00611465EA0223902266000
+B1452234547109N00611496EA0223102261000
+B1452264547130N00611518EA0222702257000
+B1452294547150N00611536EA0222102253000
+B1452324547170N00611555EA0221402248000
+B1452354547191N00611575EA0220602244000
+B1452384547211N00611595EA0219702238000
+B1452414547231N00611615EA0219302233000
+B1452444547250N00611638EA0218602227000
+B1452474547269N00611660EA0218102222000
+B1452504547286N00611682EA0217102216000
+B1452534547305N00611704EA0216402210000
+B1452564547324N00611726EA0215702204000
+B1452594547343N00611748EA0215302198000
+B1453024547360N00611770EA0214902192000
+B1453054547379N00611787EA0214602186000
+B1453084547396N00611799EA0214302180000
+B1453114547415N00611813EA0213702175000
+B1453144547435N00611832EA0213702169000
+B1453174547452N00611849EA0213302164000
+B1453204547469N00611867EA0213002160000
+B1453234547485N00611886EA0212702155000
+B1453264547499N00611904EA0212102151000
+B1453294547515N00611925EA0211702146000
+B1453324547530N00611947EA0211302141000
+B1453354547544N00611967EA0210902137000
+B1453384547560N00611987EA0210402132000
+B1453414547575N00612007EA0209902128000
+B1453454547595N00612035EA0209602121000
+B1453484547609N00612056EA0209002117000
+B1453514547624N00612077EA0208402112000
+B1453544547639N00612099EA0207902107000
+B1453574547653N00612120EA0207402102000
+B1454004547668N00612141EA0206702097000
+B1454034547684N00612163EA0206302091000
+B1454064547700N00612184EA0205902086000
+B1454094547715N00612205EA0205402081000
+B1454124547730N00612229EA0205102076000
+B1454154547744N00612253EA0205002072000
+B1454184547758N00612276EA0204602067000
+B1454214547772N00612299EA0204202063000
+B1454244547786N00612322EA0204002058000
+B1454274547801N00612345EA0203702054000
+B1454304547814N00612367EA0203402050000
+B1454334547828N00612389EA0203102046000
+B1454364547841N00612410EA0202702042000
+B1454394547854N00612433EA0202302038000
+B1454424547867N00612455EA0201802035000
+B1454454547879N00612478EA0201202030000
+B1454484547892N00612503EA0200902026000
+B1454514547904N00612527EA0200402022000
+B1454544547916N00612552EA0200002017000
+B1454574547928N00612576EA0199602013000
+B1455004547940N00612599EA0198902008000
+B1455044547957N00612629EA0198602002000
+B1455074547969N00612650EA0197901997000
+B1455104547982N00612671EA0197401992000
+B1455134547995N00612692EA0196801987000
+B1455164548007N00612713EA0196201982000
+B1455194548019N00612736EA0195801977000
+B1455224548031N00612759EA0195401971000
+B1455254548041N00612783EA0194801966000
+B1455284548052N00612808EA0194101961000
+B1455314548063N00612833EA0193601956000
+B1455344548075N00612858EA0193101950000
+B1455374548087N00612882EA0192601945000
+B1455404548099N00612905EA0192101940000
+B1455434548113N00612928EA0191801934000
+B1455464548126N00612950EA0191401929000
+B1455494548138N00612972EA0190901924000
+B1455524548151N00612995EA0190401920000
+B1455554548163N00613020EA0190201915000
+B1455584548174N00613045EA0189701910000
+B1456014548185N00613069EA0189201906000
+B1456044548196N00613095EA0188901901000
+B1456074548207N00613120EA0188301897000
+B1456104548219N00613145EA0187901893000
+B1456134548231N00613169EA0187601888000
+B1456164548243N00613195EA0187001884000
+B1456204548258N00613229EA0186801878000
+B1456234548269N00613255EA0186301874000
+B1456264548280N00613281EA0185901870000
+B1456294548292N00613307EA0185401866000
+B1456324548304N00613333EA0185201862000
+B1456354548315N00613358EA0184801858000
+B1456384548326N00613384EA0184601854000
+B1456414548337N00613409EA0184001850000
+B1456444548348N00613434EA0183701846000
+B1456474548360N00613458EA0183201842000
+B1456504548372N00613480EA0182601838000
+B1456534548385N00613503EA0182201834000
+B1456564548398N00613525EA0181801830000
+B1456594548410N00613547EA0181301825000
+B1457024548421N00613572EA0180801821000
+B1457054548431N00613597EA0180301817000
+B1457084548441N00613623EA0179801812000
+B1457114548450N00613649EA0179101808000
+B1457144548460N00613674EA0178301803000
+B1457174548471N00613700EA0177801798000
+B1457204548483N00613724EA0177401793000
+B1457234548494N00613747EA0176901788000
+B1457264548505N00613770EA0176301783000
+B1457294548516N00613794EA0175801778000
+B1457324548526N00613817EA0175301773000
+B1457364548539N00613851EA0174801766000
+B1457394548548N00613877EA0174401761000
+B1457424548556N00613903EA0174001756000
+B1457454548564N00613930EA0173601751000
+B1457484548573N00613957EA0173301747000
+B1457514548582N00613982EA0172901742000
+B1457544548592N00614008EA0172501737000
+B1457574548603N00614031EA0172001733000
+B1458004548614N00614055EA0171701729000
+B1458034548624N00614078EA0171301724000
+B1458064548635N00614102EA0170901720000
+B1458094548648N00614124EA0170501716000
+B1458124548658N00614147EA0170101712000
+B1458154548670N00614170EA0170001707000
+B1458184548681N00614192EA0169601703000
+B1458214548692N00614216EA0169001699000
+B1458244548705N00614239EA0168801695000
+B1458274548717N00614262EA0168301691000
+B1458304548728N00614285EA0167701687000
+B1458334548739N00614310EA0167201682000
+B1458364548751N00614333EA0166801678000
+B1458394548762N00614356EA0166401674000
+B1458424548773N00614380EA0166101669000
+B1458454548785N00614403EA0165601665000
+B1458484548796N00614426EA0165301661000
+B1458514548808N00614450EA0164801657000
+B1458554548823N00614482EA0164301652000
+B1458584548836N00614507EA0164101647000
+B1459014548848N00614530EA0163601643000
+B1459044548860N00614555EA0163201639000
+B1459074548873N00614581EA0162801635000
+B1459104548885N00614606EA0162701631000
+B1459134548895N00614631EA0162201628000
+B1459164548907N00614656EA0161701624000
+B1459194548920N00614680EA0161401620000
+B1459224548932N00614703EA0160601616000
+B1459254548945N00614727EA0160501612000
+B1459284548955N00614750EA0160601609000
+B1459314548963N00614774EA0160601605000
+B1459344548974N00614797EA0161101603000
+B1459374548982N00614824EA0162601602000
+B1459404548987N00614847EA0163601602000
+B1459434548993N00614866EA0164501604000
+B1459464549000N00614876EA0165401606000
+B1459494549001N00614867EA0166201609000
+B1459524548984N00614862EA0167601613000
+B1459554548968N00614883EA0168601618000
+B1459584548963N00614910EA0169301622000
+B1500014548969N00614927EA0170301627000
+B1500044548973N00614925EA0171101630000
+B1500074548964N00614915EA0172001636000
+B1500104548942N00614924EA0172901643000
+B1500134548927N00614952EA0173901651000
+B1500174548929N00614988EA0175001661000
+B1500204548935N00614992EA0176101667000
+B1500234548930N00614983EA0177101674000
+B1500264548911N00614985EA0178201684000
+B1500294548893N00615010EA0179201694000
+B1500324548890N00615041EA0180201703000
+B1500354548894N00615058EA0181501713000
+B1500384548901N00615060EA0182701718000
+B1500414548901N00615050EA0183701724000
+B1500444548891N00615038EA0185301737000
+B1500474548873N00615039EA0186401749000
+B1500504548851N00615058EA0187301761000
+B1500534548839N00615091EA0188401772000
+B1500564548840N00615117EA0189401783000
+B1500594548844N00615128EA0190001792000
+B1501024548852N00615124EA0190401800000
+B1501054548861N00615112EA0191501811000
+B1501084548869N00615103EA0192901820000
+B1501114548869N00615086EA0194601831000
+B1501144548856N00615071EA0196101842000
+B1501174548833N00615072EA0197601853000
+B1501204548818N00615094EA0199101864000
+B1501234548813N00615117EA0200301876000
+B1501264548819N00615117EA0201101882000
+B1501294548814N00615098EA0202901895000
+B1501324548795N00615088EA0204201908000
+B1501354548776N00615104EA0205201921000
+B1501384548774N00615126EA0206501933000
+B1501414548777N00615126EA0207201940000
+B1501444548777N00615109EA0208801952000
+B1501474548767N00615088EA0209801966000
+B1501504548748N00615071EA0210501980000
+B1501534548726N00615076EA0210701993000
+B1501564548708N00615097EA0210902004000
+B1501594548706N00615120EA0211802014000
+B1502024548712N00615126EA0213102021000
+B1502064548715N00615125EA0213002029000
+B1502094548723N00615120EA0212802037000
+B1502124548734N00615122EA0214402048000
+B1502154548739N00615125EA0215102053000
+B1502184548750N00615125EA0215902063000
+B1502214548757N00615118EA0216702072000
+B1502244548755N00615101EA0216802082000
+B1502274548737N00615086EA0217002091000
+B1502304548713N00615088EA0216902100000
+B1502334548696N00615108EA0217402107000
+B1502364548693N00615125EA0217802113000
+B1502394548700N00615132EA0218402117000
+B1502424548707N00615133EA0219002120000
+B1502454548715N00615134EA0219002124000
+B1502484548727N00615135EA0219502131000
+B1502514548737N00615139EA0219902137000
+B1502544548744N00615142EA0220302140000
+B1502574548750N00615141EA0220402144000
+B1503004548756N00615137EA0219702147000
+B1503034548768N00615132EA0219002153000
+B1503064548783N00615131EA0218902158000
+B1503094548799N00615129EA0218302161000
+B1503124548816N00615134EA0218102163000
+B1503154548831N00615137EA0217602165000
+B1503184548846N00615143EA0216702166000
+B1503214548864N00615154EA0216502165000
+B1503244548881N00615168EA0216502165000
+B1503274548897N00615181EA0216102164000
+B1503304548914N00615195EA0215802163000
+B1503334548931N00615210EA0215302161000
+B1503374548955N00615227EA0215202159000
+B1503404548970N00615233EA0214802158000
+B1503434548985N00615238EA0214102155000
+B1503464549002N00615247EA0213702152000
+B1503494549019N00615256EA0213202149000
+B1503524549037N00615267EA0212902146000
+B1503554549055N00615277EA0212402142000
+B1503584549074N00615288EA0211902138000
+B1504014549094N00615297EA0211502134000
+B1504044549113N00615306EA0211102130000
+B1504074549132N00615315EA0210502127000
+B1504104549152N00615324EA0210202123000
+B1504134549171N00615333EA0209902119000
+B1504164549191N00615342EA0209602116000
+B1504194549211N00615348EA0209402112000
+B1504224549230N00615356EA0209202109000
+B1504254549248N00615363EA0208802106000
+B1504284549267N00615368EA0208602102000
+B1504314549286N00615374EA0208302099000
+B1504344549304N00615381EA0208102096000
+B1504374549321N00615388EA0207502093000
+B1504404549339N00615396EA0207002089000
+B1504434549357N00615405EA0206702086000
+B1504464549374N00615414EA0206002082000
+B1504494549391N00615424EA0205502078000
+B1504534549415N00615441EA0205102073000
+B1504564549432N00615455EA0204802069000
+B1504594549450N00615465EA0204302065000
+B1505024549467N00615473EA0203702060000
+B1505054549485N00615481EA0203302056000
+B1505084549503N00615487EA0202502052000
+B1505114549520N00615494EA0201902047000
+B1505144549538N00615498EA0201002042000
+B1505174549557N00615503EA0200102037000
+B1505204549575N00615507EA0199302031000
+B1505234549596N00615511EA0198802025000
+B1505264549618N00615517EA0199002020000
+B1505294549638N00615523EA0198902015000
+B1505324549659N00615529EA0198902011000
+B1505354549680N00615535EA0199102007000
+B1505384549700N00615543EA0199302004000
+B1505414549720N00615551EA0199202001000
+B1505444549741N00615559EA0199501998000
+B1505474549760N00615569EA0199701996000
+B1505504549777N00615580EA0199001995000
+B1505534549797N00615589EA0198801993000
+B1505564549814N00615596EA0198501991000
+B1505594549832N00615601EA0197301988000
+B1506024549851N00615602EA0196801985000
+B1506054549869N00615602EA0196101981000
+B1506084549891N00615603EA0196201978000
+B1506114549910N00615603EA0195901974000
+B1506154549935N00615604EA0195301969000
+B1506184549955N00615603EA0195601966000
+B1506214549975N00615607EA0196101963000
+B1506244549996N00615610EA0196401961000
+B1506274550015N00615615EA0196801959000
+B1506304550035N00615621EA0196701958000
+B1506334550056N00615628EA0196801957000
+B1506364550076N00615633EA0197101956000
+B1506394550095N00615645EA0197101956000
+B1506424550114N00615652EA0197201956000
+B1506454550132N00615653EA0197201956000
+B1506484550152N00615652EA0197001956000
+B1506514550171N00615653EA0196901956000
+B1506544550192N00615651EA0196301955000
+B1506574550212N00615646EA0196301955000
+B1507004550231N00615639EA0195601954000
+B1507034550250N00615629EA0195301952000
+B1507064550268N00615620EA0195001951000
+B1507094550287N00615616EA0194901949000
+B1507124550305N00615610EA0194801947000
+B1507154550324N00615606EA0195301946000
+B1507184550341N00615602EA0195901945000
+B1507214550354N00615604EA0196201945000
+B1507244550365N00615600EA0195901945000
+B1507274550375N00615590EA0196501946000
+B1507304550383N00615585EA0196801946000
+B1507344550396N00615580EA0196901947000
+B1507374550406N00615574EA0197201948000
+B1507404550417N00615566EA0197101949000
+B1507434550429N00615561EA0197801950000
+B1507464550435N00615557EA0198201951000
+B1507494550440N00615554EA0198301952000
+B1507524550448N00615545EA0198101954000
+B1507554550458N00615537EA0198501955000
+B1507584550467N00615533EA0199201957000
+B1508014550472N00615526EA0200201958000
+B1508044550475N00615521EA0200701960000
+B1508074550477N00615512EA0201001962000
+B1508104550479N00615505EA0201501965000
+B1508134550484N00615503EA0201201967000
+B1508164550492N00615497EA0201101970000
+B1508194550501N00615491EA0201801974000
+B1508224550510N00615486EA0202301978000
+B1508254550519N00615478EA0202901982000
+B1508284550529N00615472EA0203001986000
+B1508314550542N00615464EA0203601990000
+B1508344550554N00615456EA0204401994000
+B1508374550566N00615450EA0204901999000
+B1508404550577N00615446EA0205602003000
+B1508434550586N00615441EA0206502008000
+B1508464550596N00615439EA0207002013000
+B1508494550605N00615436EA0207302018000
+B1508524550615N00615430EA0207302023000
+B1508554550631N00615423EA0207402027000
+B1508584550647N00615415EA0207902031000
+B1509024550669N00615406EA0207902036000
+B1509054550686N00615396EA0208002040000
+B1509084550704N00615388EA0208402043000
+B1509114550722N00615385EA0209402046000
+B1509144550738N00615385EA0210102050000
+B1509174550754N00615384EA0210102054000
+B1509204550772N00615383EA0209702058000
+B1509234550793N00615382EA0210202061000
+B1509264550813N00615385EA0211102064000
+B1509294550830N00615390EA0211802068000
+B1509324550843N00615393EA0212502072000
+B1509354550856N00615393EA0213302076000
+B1509384550868N00615394EA0213802081000
+B1509414550882N00615399EA0214402085000
+B1509444550894N00615420EA0215002090000
+B1509474550904N00615446EA0215702095000
+B1509504550911N00615476EA0216202100000
+B1509534550906N00615504EA0216502105000
+B1509564550894N00615523EA0216702110000
+B1509594550881N00615525EA0216802114000
+B1510024550870N00615520EA0216802119000
+B1510054550857N00615508EA0217202123000
+B1510084550846N00615498EA0217902127000
+B1510114550839N00615493EA0218102130000
+B1510144550840N00615484EA0218802132000
+B1510174550848N00615479EA0219602135000
+B1510204550858N00615485EA0219902141000
+B1510234550869N00615504EA0220502147000
+B1510264550870N00615533EA0221102152000
+B1510294550863N00615558EA0221402157000
+B1510324550849N00615572EA0221302162000
+B1510354550832N00615575EA0220602167000
+B1510384550808N00615573EA0221902170000
+B1510414550792N00615574EA0221702175000
+B1510444550773N00615572EA0222102178000
+B1510484550751N00615572EA0222702183000
+B1510514550737N00615572EA0223102187000
+B1510544550726N00615573EA0224002191000
+B1510574550715N00615574EA0224302195000
+B1511004550703N00615573EA0225102199000
+B1511034550691N00615574EA0225902204000
+B1511064550680N00615572EA0226602209000
+B1511094550675N00615564EA0227602211000
+B1511124550679N00615554EA0229002215000
+B1511154550690N00615550EA0229902222000
+B1511184550703N00615563EA0230702230000
+B1511214550710N00615589EA0231902237000
+B1511244550707N00615618EA0232702245000
+B1511274550695N00615641EA0233002253000
+B1511304550680N00615649EA0233202260000
+B1511334550670N00615642EA0233602266000
+B1511364550668N00615629EA0234202272000
+B1511394550674N00615618EA0234802278000
+B1511424550686N00615614EA0235402285000
+B1511454550700N00615621EA0236102291000
+B1511484550711N00615634EA0236102297000
+B1511514550719N00615664EA0236702303000
+B1511544550714N00615693EA0237802309000
+B1511574550702N00615715EA0238202315000
+B1512004550691N00615737EA0238202320000
+B1512034550676N00615745EA0237902326000
+B1512064550667N00615739EA0238102329000
+B1512094550667N00615727EA0237502332000
+B1512124550671N00615710EA0237802336000
+B1512154550678N00615695EA0238302340000
+B1512194550691N00615672EA0238902344000
+B1512224550700N00615658EA0239502348000
+B1512254550711N00615644EA0239902352000
+B1512284550722N00615630EA0240702356000
+B1512314550734N00615617EA0241602360000
+B1512344550749N00615610EA0243202365000
+B1512374550764N00615614EA0244402371000
+B1512404550779N00615637EA0246202378000
+B1512434550785N00615665EA0247502385000
+B1512464550777N00615693EA0248402394000
+B1512494550763N00615704EA0249502402000
+B1512524550756N00615695EA0250702408000
+B1512554550756N00615683EA0251402415000
+B1512584550767N00615672EA0252902425000
+B1513014550784N00615675EA0254502436000
+B1513044550800N00615687EA0256302448000
+B1513074550816N00615702EA0257902460000
+B1513104550829N00615721EA0259402472000
+B1513134550833N00615745EA0260002485000
+B1513164550823N00615767EA0261002497000
+B1513194550809N00615772EA0262502509000
+B1513224550802N00615770EA0263202515000
+B1513254550800N00615757EA0263702524000
+B1513284550802N00615739EA0264802537000
+B1513314550811N00615720EA0266502550000
+B1513344550818N00615704EA0267302561000
+B1513374550829N00615699EA0267402573000
+B1513404550842N00615717EA0268102583000
+B1513434550853N00615736EA0268602593000
+B1513464550862N00615758EA0268502603000
+B1513494550869N00615788EA0268902611000
+B1513524550879N00615813EA0269202619000
+B1513554550888N00615832EA0268302626000
+B1513584550901N00615855EA0267902631000
+B1514014550914N00615875EA0267502636000
+B1514044550933N00615902EA0267002640000
+B1514084550947N00615922EA0266802642000
+B1514114550960N00615942EA0266202644000
+B1514144550974N00615965EA0265902645000
+B1514174550987N00615986EA0265302645000
+B1514204551004N00616008EA0264902645000
+B1514234551018N00616034EA0264902645000
+B1514264551029N00616059EA0264502644000
+B1514294551042N00616086EA0263602643000
+B1514324551056N00616121EA0262902641000
+B1514354551071N00616156EA0262602638000
+B1514384551084N00616192EA0262302636000
+B1514414551098N00616226EA0261602633000
+B1514444551112N00616261EA0260802629000
+B1514474551128N00616296EA0260102625000
+B1514504551144N00616330EA0259502621000
+B1514534551161N00616363EA0259102616000
+B1514564551176N00616395EA0258402612000
+B1514594551193N00616431EA0257602607000
+B1515024551209N00616467EA0257302601000
+B1515054551226N00616498EA0256702597000
+B1515084551241N00616530EA0256002591000
+B1515114551256N00616565EA0256002586000
+B1515144551270N00616594EA0255702581000
+B1515174551279N00616622EA0255002577000
+B1515204551292N00616655EA0254902572000
+B1515244551309N00616696EA0254802567000
+B1515274551324N00616726EA0254302562000
+B1515304551339N00616758EA0254302558000
+B1515334551352N00616792EA0254102555000
+B1515364551366N00616826EA0253902551000
+B1515394551379N00616858EA0253402548000
+B1515424551394N00616890EA0252902544000
+B1515454551409N00616920EA0252502541000
+B1515484551426N00616949EA0252002537000
+B1515514551443N00616978EA0251702533000
+B1515544551460N00617005EA0251202529000
+B1515574551478N00617031EA0250702525000
+B1516004551499N00617056EA0250402521000
+B1516034551520N00617079EA0250002517000
+B1516064551542N00617102EA0249702513000
+B1516094551565N00617124EA0249402509000
+B1516124551586N00617145EA0249302506000
+B1516154551607N00617165EA0249602502000
+B1516184551625N00617180EA0249802500000
+B1516214551641N00617196EA0249402497000
+B1516244551657N00617216EA0249502495000
+B1516274551674N00617235EA0249102493000
+B1516304551691N00617252EA0249002491000
+B1516334551707N00617268EA0248802489000
+B1516364551723N00617285EA0248502488000
+B1516404551743N00617309EA0248502485000
+B1516434551758N00617324EA0248402483000
+B1516464551772N00617340EA0248102482000
+B1516494551785N00617360EA0247902480000
+B1516524551795N00617384EA0247802478000
+B1516554551803N00617410EA0247802476000
+B1516584551811N00617436EA0248102475000
+B1517014551820N00617461EA0247202473000
+B1517044551832N00617495EA0247102471000
+B1517074551842N00617528EA0247102469000
+B1517104551851N00617562EA0246602467000
+B1517134551862N00617596EA0246502465000
+B1517164551871N00617629EA0246302463000
+B1517194551878N00617662EA0246002461000
+B1517224551882N00617697EA0245402459000
+B1517254551886N00617734EA0245402456000
+B1517284551890N00617769EA0245302454000
+B1517314551895N00617804EA0244602452000
+B1517344551902N00617840EA0244202449000
+B1517374551911N00617875EA0244102447000
+B1517404551921N00617910EA0243702444000
+B1517434551932N00617945EA0243502441000
+B1517464551941N00617977EA0243202439000
+B1517494551951N00618011EA0242502436000
+B1517524551960N00618047EA0242002434000
+B1517554551969N00618083EA0241602431000
+B1517584551977N00618120EA0241102427000
+B1518024551988N00618168EA0240602423000
+B1518054551997N00618205EA0239802419000
+B1518084552007N00618241EA0239402415000
+B1518114552016N00618278EA0238902410000
+B1518144552025N00618313EA0238302406000
+B1518174552034N00618349EA0238002402000
+B1518204552042N00618385EA0237502397000
+B1518234552051N00618419EA0236802392000
+B1518264552061N00618455EA0236202387000
+B1518294552071N00618492EA0235702382000
+B1518324552081N00618528EA0235002377000
+B1518354552091N00618563EA0234402372000
+B1518384552101N00618596EA0233502367000
+B1518414552111N00618631EA0233102361000
+B1518444552121N00618665EA0232702356000
+B1518474552129N00618697EA0232402351000
+B1518504552135N00618729EA0231302346000
+B1518534552144N00618764EA0231002340000
+B1518564552154N00618797EA0230702335000
+B1518594552164N00618831EA0230002330000
+B1519024552175N00618864EA0229602326000
+B1519054552184N00618899EA0228902321000
+B1519084552192N00618935EA0228402316000
+B1519114552203N00618971EA0228202311000
+B1519144552212N00619006EA0228002306000
+B1519174552222N00619038EA0227502302000
+B1519204552230N00619072EA0227102297000
+B1519244552241N00619117EA0226802291000
+B1519274552249N00619148EA0226002287000
+B1519304552258N00619181EA0225202282000
+B1519334552266N00619215EA0224902277000
+B1519364552274N00619248EA0224602272000
+B1519394552282N00619280EA0224102267000
+B1519424552290N00619313EA0223702263000
+B1519454552298N00619346EA0223202258000
+B1519484552307N00619378EA0222702253000
+B1519514552315N00619411EA0222302248000
+B1519544552324N00619445EA0222002243000
+B1519574552332N00619479EA0221702239000
+B1520004552341N00619512EA0221302234000
+B1520034552349N00619546EA0220902230000
+B1520064552358N00619578EA0220502225000
+B1520094552367N00619611EA0220002221000
+B1520124552375N00619644EA0219602216000
+B1520154552384N00619678EA0219302212000
+B1520184552392N00619711EA0219102208000
+B1520214552399N00619744EA0218702204000
+B1520244552406N00619778EA0218502200000
+B1520274552414N00619812EA0218202196000
+B1520304552423N00619846EA0217802192000
+B1520334552431N00619879EA0217502189000
+B1520364552439N00619912EA0217102185000
+B1520404552450N00619954EA0216702180000
+B1520434552458N00619987EA0216302177000
+B1520464552466N00620021EA0216102173000
+B1520494552474N00620056EA0215802170000
+B1520524552482N00620091EA0215302167000
+B1520554552488N00620127EA0215102163000
+B1520584552495N00620161EA0214702159000
+B1521014552503N00620195EA0214202156000
+B1521044552511N00620230EA0213802152000
+B1521074552519N00620264EA0213702149000
+B1521104552527N00620298EA0212902145000
+B1521134552536N00620333EA0212402142000
+B1521164552544N00620367EA0212102138000
+B1521194552553N00620402EA0211602134000
+B1521224552563N00620436EA0211302130000
+B1521254552573N00620468EA0210802127000
+B1521284552583N00620502EA0210202123000
+B1521314552594N00620535EA0209702119000
+B1521344552604N00620568EA0209102115000
+B1521374552614N00620602EA0208502110000
+B1521404552624N00620637EA0208402106000
+B1521434552633N00620671EA0208102102000
+B1521464552641N00620706EA0207602097000
+B1521494552648N00620741EA0207102093000
+B1521524552656N00620777EA0206602089000
+B1521564552667N00620823EA0206302083000
+B1521594552675N00620858EA0205802079000
+B1522024552682N00620893EA0205502074000
+B1522054552689N00620928EA0205002070000
+B1522084552696N00620964EA0204602066000
+B1522114552703N00621000EA0204202061000
+B1522144552711N00621034EA0203602057000
+B1522174552720N00621070EA0203102053000
+B1522204552728N00621106EA0202602049000
+B1522234552736N00621142EA0202102045000
+B1522264552745N00621178EA0201702041000
+B1522294552754N00621213EA0201202037000
+B1522324552762N00621247EA0200802033000
+B1522354552768N00621280EA0200502028000
+B1522384552774N00621312EA0199902024000
+B1522414552781N00621345EA0199502020000
+B1522444552788N00621378EA0199102015000
+B1522474552796N00621410EA0198202010000
+B1522504552804N00621445EA0197902006000
+B1522534552812N00621479EA0197402001000
+B1522564552820N00621512EA0197001996000
+B1522594552827N00621545EA0196401991000
+B1523024552834N00621579EA0195801986000
+B1523054552841N00621613EA0195301981000
+B1523084552847N00621647EA0194801976000
+B1523124552854N00621694EA0194301970000
+B1523154552860N00621729EA0193801965000
+B1523184552866N00621764EA0193401960000
+B1523214552872N00621800EA0192901955000
+B1523244552880N00621836EA0192501950000
+B1523274552887N00621871EA0192101945000
+B1523304552894N00621906EA0191801940000
+B1523334552902N00621940EA0191401936000
+B1523364552910N00621973EA0191301931000
+B1523394552917N00622004EA0190801927000
+B1523424552923N00622037EA0190401922000
+B1523454552931N00622069EA0189901918000
+B1523484552942N00622101EA0190101913000
+B1523514552950N00622129EA0189601909000
+B1523544552959N00622160EA0189001905000
+B1523574552967N00622191EA0188701901000
+B1524004552974N00622225EA0187901897000
+B1524034552981N00622258EA0187901893000
+B1524064552987N00622288EA0186801889000
+B1524094552994N00622323EA0186501884000
+B1524124553002N00622354EA0186101879000
+B1524154553009N00622384EA0185701875000
+B1524184553016N00622412EA0186101871000
+B1524214553023N00622438EA0186101867000
+B1524244553027N00622465EA0186401865000
+B1524274553031N00622491EA0186601862000
+B1524314553034N00622524EA0187301860000
+B1524344553032N00622549EA0187901860000
+B1524374553030N00622577EA0189201860000
+B1524404553026N00622602EA0190201862000
+B1524434553030N00622624EA0190601864000
+B1524464553042N00622635EA0191701867000
+B1524494553050N00622631EA0193101869000
+B1524524553054N00622620EA0194401872000
+B1524554553050N00622605EA0195501877000
+B1524584553035N00622600EA0196601884000
+B1525014553018N00622610EA0197801892000
+B1525044553007N00622626EA0198301900000
+B1525074553003N00622648EA0199201907000
+B1525104553007N00622664EA0200101916000
+B1525134553014N00622665EA0201101921000
+B1525164553016N00622652EA0202301929000
+B1525194553006N00622637EA0203301939000
+B1525224552991N00622630EA0204001948000
+B1525254552976N00622641EA0204501957000
+B1525284552967N00622660EA0205301965000
+B1525314552965N00622680EA0205901974000
+B1525344552972N00622694EA0206501982000
+B1525374552981N00622690EA0207901990000
+B1525404552984N00622681EA0208601995000
+B1525434552988N00622667EA0209502003000
+B1525464552989N00622653EA0210002012000
+B1525494552985N00622633EA0211002021000
+B1525524552972N00622622EA0211602029000
+B1525554552955N00622625EA0211702038000
+B1525584552943N00622643EA0211602045000
+B1526014552942N00622665EA0212102052000
+B1526044552951N00622677EA0212702058000
+B1526074552961N00622678EA0212902064000
+B1526114552971N00622661EA0213502072000
+B1526144552974N00622646EA0214102077000
+B1526174552974N00622628EA0214502082000
+B1526204552968N00622611EA0214702087000
+B1526234552954N00622602EA0214302091000
+B1526264552941N00622614EA0213702095000
+B1526294552939N00622637EA0214002098000
+B1526324552945N00622656EA0214202101000
+B1526354552954N00622670EA0214802105000
+B1526384552962N00622679EA0215302108000
+B1526414552967N00622692EA0215102111000
+B1526444552969N00622715EA0216102115000
+B1526474552966N00622734EA0217102119000
+B1526504552959N00622753EA0217902124000
+B1526534552945N00622771EA0218802129000
+B1526564552926N00622773EA0219702135000
+B1526594552910N00622767EA0220302141000
+B1527024552896N00622749EA0221002146000
+B1527054552887N00622732EA0221302152000
+B1527084552887N00622715EA0221202157000
+B1527114552894N00622712EA0221202160000
+B1527144552901N00622726EA0221602165000
+B1527174552905N00622743EA0222002169000
+B1527204552910N00622759EA0222602173000
+B1527234552918N00622762EA0223102176000
+B1527264552926N00622759EA0224002180000
+B1527294552934N00622759EA0224702183000
+B1527324552941N00622763EA0225202186000
+B1527354552943N00622776EA0225402191000
+B1527384552938N00622792EA0225602197000
+B1527414552926N00622807EA0226302203000
+B1527444552910N00622819EA0227302209000
+B1527484552892N00622810EA0227202216000
+B1527514552885N00622787EA0227302221000
+B1527544552888N00622765EA0227402226000
+B1527574552899N00622762EA0227902230000
+B1528004552907N00622768EA0227602234000
+B1528034552912N00622782EA0227902238000
+B1528064552913N00622800EA0228502241000
+B1528094552913N00622810EA0228802243000
+B1528124552911N00622825EA0229002247000
+B1528154552905N00622845EA0228802250000
+B1528184552897N00622869EA0229002253000
+B1528214552893N00622902EA0229702256000
+B1528244552893N00622931EA0230902260000
+B1528274552891N00622961EA0231902264000
+B1528304552879N00622993EA0234002269000
+B1528334552862N00623012EA0235702276000
+B1528364552844N00623018EA0236902284000
+B1528394552831N00623005EA0237602291000
+B1528424552830N00622985EA0238202299000
+B1528454552839N00622971EA0239102307000
+B1528484552853N00622974EA0240302315000
+B1528514552861N00622990EA0241602324000
+B1528544552865N00623013EA0242902333000
+B1528574552856N00623041EA0244902343000
+B1529004552839N00623061EA0246502354000
+B1529034552819N00623079EA0247802365000
+B1529064552803N00623080EA0248802377000
+B1529094552790N00623072EA0249302389000
+B1529124552783N00623051EA0250402400000
+B1529154552792N00623036EA0252002411000
+B1529184552802N00623041EA0253502422000
+B1529214552805N00623058EA0254402433000
+B1529254552810N00623087EA0256002448000
+B1529284552812N00623110EA0257002460000
+B1529314552820N00623129EA0257702471000
+B1529344552828N00623149EA0258302481000
+B1529374552833N00623172EA0258802491000
+B1529404552837N00623197EA0259602501000
+B1529434552844N00623221EA0260102510000
+B1529464552849N00623249EA0260802519000
+B1529494552853N00623276EA0261902528000
+B1529524552857N00623300EA0263102537000
+B1529554552860N00623322EA0263402546000
+B1529584552865N00623347EA0265002555000
+B1530014552869N00623367EA0265802565000
+B1530044552875N00623394EA0266702574000
+B1530074552889N00623419EA0267802583000
+B1530104552901N00623445EA0267902592000
+B1530134552909N00623479EA0268902601000
+B1530164552914N00623512EA0269302609000
+B1530194552919N00623545EA0269602618000
+B1530224552925N00623577EA0269702626000
+B1530254552929N00623607EA0268902633000
+B1530284552933N00623639EA0268102638000
+B1530314552940N00623673EA0267502642000
+B1530344552946N00623705EA0267202645000
+B1530374552954N00623736EA0266902647000
+B1530404552962N00623767EA0266202649000
+B1530434552969N00623800EA0265402649000
+B1530464552975N00623836EA0265402649000
+B1530494552981N00623869EA0264602648000
+B1530524552988N00623904EA0264202647000
+B1530554552997N00623939EA0264002645000
+B1530584553007N00623972EA0263602643000
+B1531024553020N00624017EA0263402640000
+B1531054553030N00624050EA0262902638000
+B1531084553041N00624082EA0262602635000
+B1531114553054N00624111EA0262002633000
+B1531144553065N00624141EA0261302630000
+B1531174553078N00624171EA0260902626000
+B1531204553089N00624201EA0260402623000
+B1531234553101N00624231EA0259802619000
+B1531264553113N00624265EA0259402615000
+B1531294553125N00624299EA0259402612000
+B1531324553134N00624331EA0259102608000
+B1531354553143N00624364EA0258902605000
+B1531384553151N00624398EA0258902602000
+B1531414553159N00624429EA0258502599000
+B1531444553168N00624462EA0257802596000
+B1531474553176N00624494EA0257502593000
+B1531504553185N00624523EA0256902589000
+B1531534553194N00624554EA0256502586000
+B1531564553205N00624582EA0256202582000
+B1531594553214N00624609EA0255602579000
+B1532024553223N00624638EA0255002575000
+B1532054553232N00624667EA0254502571000
+B1532084553241N00624697EA0254102566000
+B1532114553250N00624727EA0253702562000
+B1532144553258N00624757EA0253402558000
+B1532184553269N00624796EA0253102553000
+B1532214553276N00624826EA0252402549000
+B1532244553285N00624857EA0252002544000
+B1532274553294N00624888EA0251902540000
+B1532304553303N00624919EA0251302536000
+B1532334553312N00624953EA0250802531000
+B1532364553319N00624986EA0250302526000
+B1532394553327N00625019EA0249802522000
+B1532424553335N00625051EA0249502518000
+B1532454553344N00625082EA0249002513000
+B1532484553352N00625114EA0248602509000
+B1532514553361N00625147EA0248302504000
+B1532544553368N00625179EA0247902500000
+B1532574553375N00625212EA0247302496000
+B1533004553380N00625245EA0246902492000
+B1533034553386N00625278EA0246402488000
+B1533064553391N00625310EA0245902484000
+B1533094553395N00625342EA0245302480000
+B1533124553401N00625375EA0245002476000
+B1533154553408N00625406EA0244402471000
+B1533184553416N00625437EA0244002467000
+B1533214553426N00625468EA0243602462000
+B1533244553435N00625498EA0243002457000
+B1533274553444N00625529EA0242602453000
+B1533304553453N00625560EA0242202448000
+B1533344553464N00625602EA0241902442000
+B1533374553472N00625632EA0241602437000
+B1533404553480N00625661EA0241002433000
+B1533434553487N00625693EA0240702428000
+B1533464553492N00625725EA0240502424000
+B1533494553496N00625756EA0240002419000
+B1533524553500N00625788EA0239602415000
+B1533554553504N00625820EA0239202411000
+B1533584553508N00625853EA0238802406000
+B1534014553511N00625885EA0238202402000
+B1534044553514N00625917EA0237702397000
+B1534074553517N00625950EA0237202393000
+B1534104553518N00625983EA0236702388000
+B1534134553519N00626016EA0236202384000
+B1534164553521N00626050EA0235702379000
+B1534194553523N00626084EA0235202375000
+B1534224553525N00626117EA0234802371000
+B1534254553528N00626151EA0234402366000
+B1534284553531N00626184EA0233902362000
+B1534314553533N00626217EA0233302358000
+B1534344553537N00626249EA0232802353000
+B1534374553541N00626283EA0232302349000
+B1534404553545N00626316EA0232002344000
+B1534434553550N00626349EA0231602340000
+B1534464553556N00626381EA0231302335000
+B1534504553562N00626424EA0231002329000
+B1534534553566N00626455EA0230702325000
+B1534564553570N00626487EA0230302321000
+B1534594553575N00626516EA0230002316000
+B1535024553579N00626545EA0229302312000
+B1535054553583N00626576EA0228702307000
+B1535084553587N00626608EA0228202303000
+B1535114553591N00626639EA0227902298000
+B1535144553595N00626670EA0227402294000
+B1535174553598N00626702EA0227002289000
+B1535204553601N00626733EA0226702285000
+B1535234553603N00626764EA0225902280000
+B1535264553604N00626795EA0225302276000
+B1535294553605N00626828EA0224702272000
+B1535324553606N00626861EA0224402267000
+B1535354553608N00626894EA0224102263000
+B1535384553609N00626927EA0223802258000
+B1535414553609N00626960EA0223502254000
+B1535444553610N00626993EA0223202250000
+B1535474553611N00627025EA0222802246000
+B1535504553612N00627058EA0222502242000
+B1535534553614N00627091EA0222102238000
+B1535564553617N00627123EA0221502234000
+B1535594553619N00627156EA0221302230000
+B1536024553622N00627188EA0221002226000
+B1536064553625N00627229EA0220602221000
+B1536094553628N00627259EA0220202218000
+B1536124553630N00627290EA0219902214000
+B1536154553632N00627321EA0219602210000
+B1536184553635N00627352EA0219302206000
+B1536214553638N00627383EA0219002203000
+B1536244553641N00627414EA0218802199000
+B1536274553645N00627444EA0218502196000
+B1536304553648N00627475EA0218402193000
+B1536334553652N00627505EA0218102190000
+B1536364553656N00627535EA0217802187000
+B1536394553661N00627564EA0217502184000
+B1536424553666N00627594EA0217402181000
+B1536454553672N00627623EA0217102178000
+B1536484553678N00627652EA0216802175000
+B1536514553685N00627682EA0216502172000
+B1536544553692N00627711EA0216002169000
+B1536574553700N00627740EA0215702166000
+B1537004553708N00627769EA0215402163000
+B1537034553716N00627798EA0215002160000
+B1537064553724N00627827EA0214902157000
+B1537094553731N00627856EA0214202154000
+B1537124553738N00627885EA0214002151000
+B1537154553745N00627915EA0213702148000
+B1537184553752N00627945EA0213202145000
+B1537224553760N00627986EA0213102140000
+B1537254553766N00628016EA0212602137000
+B1537284553773N00628047EA0212002134000
+B1537314553779N00628079EA0211602130000
+B1537344553785N00628111EA0211102126000
+B1537374553791N00628143EA0210502122000
+B1537404553797N00628177EA0210102118000
+B1537434553802N00628210EA0209702114000
+B1537464553807N00628244EA0209302110000
+B1537494553813N00628278EA0209002106000
+B1537524553820N00628312EA0208702102000
+B1537554553827N00628346EA0208302098000
+B1537584553835N00628380EA0208002094000
+B1538014553842N00628415EA0207802090000
+B1538044553850N00628450EA0207402086000
+B1538074553858N00628484EA0207502083000
+B1538104553864N00628513EA0208102080000
+B1538134553869N00628536EA0208002078000
+B1538164553873N00628562EA0208102076000
+B1538194553879N00628585EA0207902074000
+B1538224553886N00628609EA0207602072000
+B1538254553894N00628631EA0207202070000
+B1538284553902N00628654EA0207102069000
+B1538314553907N00628676EA0206502067000
+B1538344553910N00628701EA0206302064000
+B1538384553916N00628732EA0206102062000
+B1538414553921N00628754EA0206002060000
+B1538444553927N00628775EA0206102058000
+B1538474553935N00628793EA0205802056000
+B1538504553945N00628810EA0205702054000
+B1538534553954N00628826EA0205602052000
+B1538564553964N00628843EA0205402051000
+B1538594553973N00628859EA0205202049000
+B1539024553983N00628878EA0205202048000
+B1539054553992N00628897EA0205002046000
+B1539084554002N00628916EA0205002045000
+B1539114554012N00628934EA0204702044000
+B1539144554024N00628952EA0204502042000
+B1539174554035N00628968EA0204302041000
+B1539204554048N00628984EA0203902039000
+B1539234554060N00629002EA0203702037000
+B1539264554073N00629020EA0203402035000
+B1539294554085N00629039EA0203402033000
+B1539324554096N00629059EA0203302031000
+B1539354554107N00629079EA0203202030000
+B1539384554120N00629098EA0203302028000
+B1539414554133N00629115EA0203802027000
+B1539444554144N00629131EA0203602026000
+B1539474554155N00629150EA0203502025000
+B1539504554167N00629165EA0203402025000
+B1539544554184N00629179EA0203302024000
+B1539574554197N00629187EA0203202023000
+B1540004554211N00629195EA0203102023000
+B1540034554226N00629198EA0202902022000
+B1540064554241N00629199EA0202902022000
+B1540094554255N00629200EA0202902021000
+B1540124554268N00629202EA0202902020000
+B1540154554281N00629203EA0202902020000
+B1540184554295N00629200EA0203202019000
+B1540214554307N00629199EA0203502019000
+B1540244554320N00629196EA0203702019000
+B1540274554332N00629198EA0204002020000
+B1540304554344N00629204EA0204302021000
+B1540334554357N00629214EA0204402022000
+B1540364554370N00629225EA0204802023000
+B1540394554382N00629234EA0205102024000
+B1540424554395N00629243EA0205302026000
+B1540454554408N00629250EA0205602028000
+B1540484554421N00629253EA0206002029000
+B1540514554433N00629255EA0206302031000
+B1540544554441N00629248EA0206702033000
+B1540574554442N00629234EA0207502035000
+B1541004554439N00629224EA0207302036000
+B1541034554429N00629210EA0207502039000
+B1541064554413N00629212EA0207602041000
+B1541094554404N00629232EA0208102044000
+B1541124554407N00629255EA0208302046000
+B1541154554417N00629274EA0208502049000
+B1541194554437N00629283EA0209402053000
+B1541224554447N00629281EA0210402056000
+B1541254554453N00629272EA0211102060000
+B1541284554445N00629261EA0211802064000
+B1541314554430N00629271EA0212402069000
+B1541344554427N00629296EA0212802074000
+B1541374554435N00629317EA0213902078000
+B1541404554447N00629330EA0214502083000
+B1541434554459N00629329EA0214802089000
+B1541464554462N00629311EA0215202094000
+B1541494554454N00629298EA0216102099000
+B1541524554439N00629307EA0216702104000
+B1541554554432N00629332EA0217102109000
+B1541584554441N00629356EA0218102115000
+B1542014554455N00629361EA0218602121000
+B1542044554461N00629347EA0218802127000
+B1542074554460N00629328EA0219502132000
+B1542104554447N00629321EA0219702138000
+B1542134554433N00629338EA0220202143000
+B1542164554435N00629365EA0220602148000
+B1542194554448N00629375EA0221202153000
+B1542224554454N00629363EA0221302158000
+B1542254554448N00629346EA0222102163000
+B1542284554434N00629350EA0222602168000
+B1542314554423N00629370EA0222802174000
+B1542344554423N00629397EA0223002179000
+B1542374554433N00629418EA0223602184000
+B1542404554445N00629422EA0223802189000
+B1542434554453N00629408EA0223702193000
+B1542464554455N00629389EA0224402198000
+B1542504554442N00629377EA0225002204000
+B1542534554427N00629387EA0226002208000
+B1542564554423N00629411EA0226602213000
+B1542594554434N00629425EA0226802217000
+B1543024554444N00629419EA0227302222000
+B1543054554447N00629406EA0228102225000
+B1543084554441N00629394EA0229102230000
+B1543114554429N00629389EA0229802235000
+B1543144554414N00629401EA0230502241000
+B1543174554408N00629424EA0231402247000
+B1543204554417N00629442EA0231602253000
+B1543234554431N00629443EA0232502259000
+B1543264554438N00629431EA0233202265000
+B1543294554436N00629416EA0234002271000
+B1543324554422N00629407EA0234602277000
+B1543354554407N00629407EA0235202283000
+B1543384554394N00629418EA0235702289000
+B1543414554387N00629438EA0235902295000
+B1543444554392N00629460EA0236302301000
+B1543474554405N00629469EA0237002307000
+B1543504554415N00629460EA0237502313000
+B1543534554411N00629444EA0238302319000
+B1543564554399N00629441EA0238602325000
+B1543594554388N00629455EA0238802330000
+B1544024554383N00629477EA0239202336000
+B1544054554387N00629498EA0239502341000
+B1544084554399N00629510EA0239902346000
+B1544114554409N00629504EA0240402351000
+B1544144554411N00629490EA0241002355000
+B1544184554397N00629476EA0241502362000
+B1544214554383N00629482EA0241602366000
+B1544244554371N00629498EA0241702371000
+B1544274554373N00629521EA0241702374000
+B1544304554384N00629530EA0242302378000
+B1544334554393N00629522EA0242302382000
+B1544364554400N00629506EA0242802385000
+B1544394554401N00629492EA0242702388000
+B1544424554395N00629474EA0243002391000
+B1544454554381N00629470EA0243002394000
+B1544484554366N00629480EA0242902396000
+B1544514554359N00629503EA0242802398000
+B1544544554364N00629526EA0242702400000
+B1544574554376N00629540EA0243102402000
+B1545004554388N00629547EA0243102404000
+B1545034554403N00629548EA0243202406000
+B1545064554415N00629539EA0243302408000
+B1545094554419N00629523EA0243502410000
+B1545124554418N00629506EA0243902412000
+B1545154554409N00629492EA0244402414000
+B1545184554395N00629488EA0244402416000
+B1545214554380N00629491EA0244102418000
+B1545244554367N00629506EA0244102420000
+B1545274554364N00629530EA0243902421000
+B1545304554373N00629550EA0243602422000
+B1545334554388N00629552EA0243602422000
+B1545364554398N00629538EA0243702423000
+B1545404554398N00629513EA0243902424000
+B1545434554393N00629497EA0244002424000
+B1545464554386N00629484EA0243902425000
+B1545494554375N00629473EA0243702426000
+B1545524554359N00629473EA0243402426000
+B1545554554344N00629485EA0243402426000
+B1545584554335N00629506EA0243102426000
+B1546014554335N00629532EA0242802425000
+B1546044554344N00629554EA0243002424000
+B1546074554358N00629571EA0243802424000
+B1546104554370N00629584EA0244402424000
+B1546134554382N00629596EA0244702425000
+B1546164554396N00629598EA0244902426000
+B1546194554406N00629587EA0245702428000
+B1546224554410N00629572EA0246002430000
+B1546254554406N00629558EA0245902432000
+B1546284554392N00629556EA0245902433000
+B1546314554379N00629571EA0246102435000
+B1546344554374N00629596EA0246902437000
+B1546374554378N00629618EA0247402439000
+B1546404554390N00629632EA0247802442000
+B1546434554404N00629631EA0248402445000
+B1546464554410N00629619EA0248802447000
+B1546494554405N00629607EA0248702449000
+B1546524554393N00629600EA0248702452000
+B1546554554378N00629607EA0248902455000
+B1546584554366N00629626EA0249502458000
+B1547024554366N00629662EA0250102462000
+B1547054554376N00629684EA0250602465000
+B1547084554388N00629694EA0250702469000
+B1547114554401N00629695EA0250702472000
+B1547144554409N00629683EA0250702474000
+B1547174554407N00629667EA0250902477000
+B1547204554397N00629659EA0250902479000
+B1547234554382N00629659EA0250802481000
+B1547264554366N00629668EA0251402483000
+B1547294554354N00629683EA0252202485000
+B1547324554343N00629695EA0252402488000
+B1547354554330N00629698EA0252702491000
+B1547384554319N00629689EA0253202493000
+B1547414554318N00629672EA0254302497000
+B1547444554322N00629658EA0255102501000
+B1547474554331N00629648EA0255302505000
+B1547504554348N00629651EA0255402509000
+B1547534554359N00629666EA0255202513000
+B1547564554364N00629693EA0255002516000
+B1547594554355N00629716EA0255202518000
+B1548024554340N00629721EA0255702521000
+B1548054554330N00629710EA0256602524000
+B1548084554324N00629699EA0257202527000
+B1548114554322N00629686EA0257302530000
+B1548144554322N00629670EA0257802534000
+B1548174554331N00629658EA0257302537000
+B1548204554346N00629655EA0257002540000
+B1548234554359N00629671EA0256702542000
+B1548274554357N00629705EA0256502544000
+B1548304554343N00629717EA0256702546000
+B1548334554328N00629715EA0257302547000
+B1548364554315N00629708EA0257602549000
+B1548394554305N00629696EA0257902551000
+B1548424554298N00629683EA0258502553000
+B1548454554295N00629670EA0259402555000
+B1548484554293N00629657EA0260302559000
+B1548514554293N00629643EA0260602562000
+B1548544554301N00629632EA0260802566000
+B1548574554314N00629637EA0260802570000
+B1549004554325N00629655EA0260902573000
+B1549034554327N00629679EA0260702576000
+B1549064554320N00629705EA0261302579000
+B1549094554308N00629720EA0262102582000
+B1549124554293N00629725EA0262502586000
+B1549154554278N00629718EA0263202590000
+B1549184554270N00629705EA0264102594000
+B1549214554266N00629687EA0264902599000
+B1549244554269N00629673EA0265702604000
+B1549274554279N00629667EA0265802609000
+B1549304554293N00629672EA0265902613000
+B1549334554300N00629691EA0266002618000
+B1549364554302N00629719EA0266802622000
+B1549394554295N00629741EA0267502626000
+B1549424554284N00629760EA0268002631000
+B1549454554269N00629771EA0268902636000
+B1549484554253N00629779EA0269602641000
+B1549514554238N00629777EA0270202646000
+B1549544554228N00629766EA0270502651000
+B1549574554226N00629750EA0271102656000
+B1550004554226N00629737EA0271502660000
+B1550034554232N00629727EA0272102665000
+B1550074554247N00629736EA0272802673000
+B1550104554256N00629757EA0273502678000
+B1550134554251N00629787EA0274102684000
+B1550164554241N00629809EA0274902689000
+B1550194554230N00629831EA0275002695000
+B1550224554218N00629855EA0275502700000
+B1550254554209N00629876EA0275702705000
+B1550284554201N00629898EA0276202710000
+B1550314554193N00629918EA0275802715000
+B1550344554183N00629941EA0275902719000
+B1550374554174N00629963EA0276202723000
+B1550404554165N00629985EA0276102726000
+B1550434554154N00630006EA0276502729000
+B1550464554144N00630025EA0276702732000
+B1550494554134N00630049EA0276902735000
+B1550524554126N00630073EA0276902738000
+B1550554554117N00630095EA0276802741000
+B1550584554108N00630117EA0276302743000
+B1551014554099N00630139EA0276302744000
+B1551044554090N00630159EA0276002745000
+B1551074554078N00630181EA0275602745000
+B1551104554067N00630202EA0276102746000
+B1551134554059N00630220EA0275402746000
+B1551164554052N00630244EA0274802745000
+B1551194554046N00630270EA0274202744000
+B1551224554039N00630295EA0273402743000
+B1551264554031N00630328EA0272902740000
+B1551294554024N00630352EA0271802737000
+B1551324554016N00630377EA0271202733000
+B1551354554006N00630404EA0270102729000
+B1551384553997N00630434EA0269602724000
+B1551414553989N00630462EA0269002720000
+B1551444553981N00630489EA0268502715000
+B1551474553975N00630517EA0268002710000
+B1551504553971N00630544EA0267502706000
+B1551534553965N00630572EA0267102701000
+B1551564553959N00630599EA0267202696000
+B1551594553953N00630621EA0267002692000
+B1552024553949N00630644EA0266502688000
+B1552054553943N00630668EA0266002684000
+B1552084553938N00630693EA0265502680000
+B1552114553934N00630718EA0265502676000
+B1552144553929N00630740EA0265002672000
+B1552174553923N00630765EA0265102668000
+B1552204553917N00630785EA0265402665000
+B1552234553912N00630805EA0265302662000
+B1552264553907N00630828EA0265402660000
+B1552294553901N00630850EA0265602658000
+B1552324553896N00630872EA0265802656000
+B1552354553892N00630895EA0265802655000
+B1552384553888N00630919EA0266202654000
+B1552414553883N00630941EA0266402654000
+B1552454553875N00630971EA0266502654000
+B1552484553870N00630995EA0266702654000
+B1552514553866N00631019EA0267002655000
+B1552544553861N00631042EA0267202656000
+B1552574553856N00631066EA0267602657000
+B1553004553848N00631089EA0268502658000
+B1553034553841N00631103EA0269102661000
+B1553064553835N00631118EA0269502663000
+B1553094553826N00631128EA0269802666000
+B1553124553815N00631128EA0270102668000
+B1553154553806N00631116EA0270502671000
+B1553184553805N00631098EA0270602674000
+B1553214553812N00631080EA0271102676000
+B1553244553824N00631068EA0271602679000
+B1553274553838N00631064EA0271902682000
+B1553304553851N00631072EA0272402685000
+B1553334553858N00631089EA0272902689000
+B1553364553859N00631106EA0273402692000
+B1553394553856N00631123EA0273702696000
+B1553424553848N00631134EA0273702699000
+B1553454553835N00631132EA0273902703000
+B1553484553825N00631122EA0274302706000
+B1553514553821N00631105EA0274902710000
+B1553544553822N00631087EA0275202714000
+B1553574553831N00631069EA0275602717000
+B1554004553845N00631063EA0276502721000
+B1554034553856N00631071EA0276802725000
+B1554064553864N00631089EA0277502729000
+B1554094553863N00631108EA0278002734000
+B1554134553852N00631122EA0278002740000
+B1554164553840N00631118EA0278302744000
+B1554194553834N00631103EA0278502747000
+B1554224553834N00631083EA0278702751000
+B1554254553842N00631066EA0278802754000
+B1554284553855N00631054EA0279302758000
+B1554314553869N00631057EA0279502761000
+B1554344553878N00631076EA0279902764000
+B1554374553879N00631095EA0280502768000
+B1554404553875N00631110EA0280202771000
+B1554434553869N00631130EA0280202773000
+B1554464553865N00631151EA0280402776000
+B1554494553861N00631173EA0280302778000
+B1554524553857N00631196EA0280502780000
+B1554554553853N00631216EA0280302781000
+B1554584553848N00631239EA0280302783000
+B1555014553844N00631261EA0280102784000
+B1555044553841N00631286EA0280302785000
+B1555074553839N00631312EA0280402786000
+B1555104553837N00631340EA0280502787000
+B1555134553837N00631366EA0280702789000
+B1555164553837N00631391EA0280902790000
+B1555194553836N00631414EA0281302791000
+B1555224553833N00631438EA0281602793000
+B1555254553833N00631460EA0281802795000
+B1555284553830N00631483EA0281902796000
+B1555314553827N00631507EA0282102798000
+B1555354553820N00631539EA0282202800000
+B1555384553817N00631564EA0282702802000
+B1555414553814N00631585EA0282502803000
+B1555444553811N00631609EA0282202805000
+B1555474553808N00631632EA0281702806000
+B1555504553805N00631657EA0281202806000
+B1555534553803N00631681EA0280702805000
+B1555564553801N00631705EA0280302804000
+B1555594553796N00631727EA0279502803000
+B1556024553792N00631751EA0279002801000
+B1556054553787N00631776EA0278602799000
+B1556084553781N00631798EA0278202796000
+B1556114553777N00631822EA0277702794000
+B1556144553773N00631845EA0277502791000
+B1556174553768N00631868EA0276902789000
+B1556204553764N00631892EA0276602786000
+B1556234553760N00631915EA0276102783000
+B1556264553756N00631938EA0275802780000
+B1556294553752N00631962EA0275802776000
+B1556324553747N00631985EA0275402773000
+B1556354553743N00632008EA0275402770000
+B1556384553739N00632031EA0275202767000
+B1556414553735N00632055EA0275002765000
+B1556444553731N00632076EA0274602762000
+B1556474553726N00632101EA0274502759000
+B1556504553722N00632126EA0274902757000
+B1556534553720N00632150EA0275102755000
+B1556574553717N00632186EA0275702753000
+B1557004553716N00632212EA0276402752000
+B1557034553713N00632235EA0277002753000
+B1557064553706N00632255EA0277502754000
+B1557094553696N00632272EA0277902755000
+B1557124553682N00632276EA0277902757000
+B1557154553669N00632266EA0278002758000
+B1557184553666N00632247EA0278102759000
+B1557214553673N00632228EA0278502761000
+B1557244553687N00632218EA0278502763000
+B1557274553703N00632217EA0278802765000
+B1557304553717N00632229EA0279202767000
+B1557334553725N00632249EA0279502769000
+B1557364553725N00632272EA0279902771000
+B1557394553717N00632288EA0280202774000
+B1557424553704N00632296EA0280702776000
+B1557454553691N00632296EA0280602779000
+B1557484553680N00632284EA0280602781000
+B1557514553678N00632263EA0280502782000
+B1557544553686N00632245EA0280402783000
+B1557574553702N00632245EA0280202784000
+B1558004553716N00632265EA0280702785000
+B1558034553720N00632287EA0281002786000
+B1558064553717N00632309EA0281302788000
+B1558094553711N00632326EA0281502789000
+B1558124553705N00632345EA0281802791000
+B1558154553699N00632366EA0282302792000
+B1558184553694N00632387EA0283102795000
+B1558224553690N00632416EA0283902799000
+B1558254553691N00632439EA0284702803000
+B1558284553701N00632459EA0285402807000
+B1558314553719N00632464EA0286302811000
+B1558344553734N00632454EA0287002816000
+B1558374553739N00632438EA0287702822000
+B1558404553731N00632427EA0288402827000
+B1558434553719N00632433EA0288902833000
+B1558464553710N00632448EA0289702839000
+B1558494553707N00632469EA0290502845000
+B1558524553706N00632492EA0291002851000
+B1558554553706N00632514EA0290902857000
+B1558584553706N00632537EA0290802862000
+B1559014553706N00632560EA0291002867000
+B1559044553705N00632583EA0290802871000
+B1559074553707N00632606EA0291002874000
+B1559104553710N00632627EA0291002877000
+B1559134553712N00632652EA0291202880000
+B1559164553717N00632678EA0291502883000
+B1559194553722N00632703EA0291002886000
+B1559224553726N00632733EA0290502888000
+B1559254553727N00632760EA0289902889000
+B1559284553725N00632786EA0288902889000
+B1559314553724N00632816EA0288402888000
+B1559344553721N00632844EA0287702886000
+B1559374553717N00632873EA0287102884000
+B1559404553712N00632902EA0286502881000
+B1559434553708N00632932EA0285902878000
+B1559464553704N00632964EA0285902875000
+B1559494553700N00632992EA0285602872000
+B1559534553692N00633029EA0284702868000
+B1559564553686N00633057EA0284202864000
+B1559594553679N00633085EA0283902861000
+B1600024553673N00633113EA0283602858000
+B1600054553668N00633141EA0283202854000
+B1600084553664N00633170EA0283002851000
+B1600114553660N00633201EA0282602847000
+B1600144553656N00633231EA0282502844000
+B1600174553652N00633260EA0282402841000
+B1600204553647N00633290EA0282202838000
+B1600234553643N00633319EA0282102836000
+B1600264553637N00633347EA0281502833000
+B1600294553631N00633376EA0281302830000
+B1600324553624N00633404EA0280702827000
+B1600354553618N00633433EA0280502824000
+B1600384553614N00633459EA0280302821000
+B1600414553612N00633484EA0279702818000
+B1600444553610N00633511EA0279502815000
+B1600474553609N00633539EA0279502812000
+B1600504553609N00633567EA0279902809000
+B1600534553608N00633591EA0279702807000
+B1600564553606N00633618EA0279202804000
+B1600594553605N00633646EA0278902802000
+B1601024553605N00633673EA0278402799000
+B1601054553604N00633700EA0278002796000
+B1601094553603N00633737EA0277602792000
+B1601124553602N00633765EA0277302789000
+B1601154553601N00633792EA0277102786000
+B1601184553601N00633821EA0276802783000
+B1601214553600N00633850EA0276802781000
+B1601244553599N00633880EA0276602778000
+B1601274553599N00633911EA0276502775000
+B1601304553599N00633940EA0276402773000
+B1601334553598N00633968EA0275802771000
+B1601364553598N00634000EA0275302768000
+B1601394553598N00634032EA0275302765000
+B1601424553599N00634061EA0274802762000
+B1601454553600N00634093EA0274502759000
+B1601484553602N00634122EA0274202756000
+B1601514553604N00634151EA0274002753000
+B1601544553607N00634180EA0273802750000
+B1601574553609N00634209EA0273502748000
+B1602004553611N00634238EA0273302745000
+B1602034553614N00634266EA0273202742000
+B1602064553617N00634294EA0273002739000
+B1602094553620N00634321EA0272802737000
+B1602124553624N00634348EA0272502734000
+B1602154553626N00634376EA0272302732000
+B1602184553628N00634403EA0272002729000
+B1602214553628N00634431EA0271802727000
+B1602244553629N00634457EA0271402723000
+B1602284553627N00634495EA0271402721000
+B1602314553625N00634521EA0271302719000
+B1602344553622N00634548EA0270802716000
+B1602374553618N00634575EA0270702714000
+B1602404553616N00634601EA0270402711000
+B1602434553614N00634629EA0270102709000
+B1602464553612N00634657EA0269802706000
+B1602494553611N00634685EA0269502704000
+B1602524553609N00634713EA0269202701000
+B1602554553608N00634742EA0269002698000
+B1602584553608N00634771EA0268802696000
+B1603014553608N00634800EA0268402693000
+B1603044553609N00634829EA0268002691000
+B1603074553609N00634858EA0267802688000
+B1603104553610N00634888EA0267402686000
+B1603134553610N00634915EA0267102683000
+B1603164553610N00634943EA0266602680000
+B1603194553610N00634972EA0266302677000
+B1603224553611N00635001EA0265902674000
+B1603254553611N00635030EA0265502671000
+B1603284553611N00635059EA0265102667000
+B1603314553610N00635088EA0264702664000
+B1603344553610N00635117EA0264202660000
+B1603374553610N00635146EA0263702657000
+B1603404553610N00635175EA0263302653000
+B1603444553607N00635213EA0263002648000
+B1603474553605N00635243EA0262602644000
+B1603504553602N00635270EA0262202640000
+B1603534553599N00635299EA0261802637000
+B1603564553597N00635327EA0261602633000
+B1603594553595N00635354EA0261202629000
+B1604024553593N00635382EA0260802625000
+B1604054553590N00635409EA0260302621000
+B1604084553588N00635437EA0260002618000
+B1604114553586N00635465EA0259702614000
+B1604144553584N00635494EA0259402610000
+B1604174553583N00635522EA0259102607000
+B1604204553583N00635550EA0258702603000
+B1604234553581N00635578EA0258402599000
+B1604264553579N00635607EA0258102596000
+B1604294553577N00635636EA0257702592000
+B1604324553576N00635665EA0257402589000
+B1604354553575N00635693EA0257202585000
+B1604384553574N00635722EA0257002582000
+B1604414553574N00635751EA0256702579000
+B1604444553573N00635779EA0256402576000
+B1604474553573N00635808EA0256102573000
+B1604504553573N00635837EA0256002570000
+B1604534553572N00635866EA0255702567000
+B1604564553570N00635894EA0255602564000
+B1605004553567N00635933EA0255502561000
+B1605034553565N00635962EA0255102558000
+B1605064553562N00635991EA0254902556000
+B1605094553560N00636019EA0254802553000
+B1605124553557N00636049EA0254502551000
+B1605154553554N00636078EA0254502549000
+B1605184553551N00636107EA0254402547000
+B1605214553548N00636136EA0254202545000
+B1605244553546N00636164EA0253802543000
+B1605274553545N00636194EA0253702541000
+B1605304553544N00636223EA0253502538000
+B1605334553545N00636251EA0253202536000
+B1605364553545N00636280EA0252802534000
+B1605394553546N00636309EA0252502532000
+B1605424553546N00636337EA0252302530000
+B1605454553545N00636365EA0252002528000
+B1605484553545N00636393EA0251702525000
+B1605514553545N00636422EA0251502523000
+B1605544553546N00636450EA0251302520000
+B1605574553546N00636479EA0251102518000
+B1606004553545N00636508EA0251002516000
+B1606034553543N00636537EA0250802513000
+B1606064553542N00636565EA0250702511000
+B1606094553541N00636593EA0250502509000
+B1606124553539N00636619EA0250202507000
+B1606154553538N00636647EA0250102505000
+B1606184553537N00636673EA0249802502000
+B1606214553536N00636701EA0249602500000
+B1606244553535N00636727EA0249302498000
+B1606284553533N00636763EA0249002495000
+B1606314553531N00636790EA0248802493000
+B1606344553528N00636817EA0248602491000
+B1606374553525N00636844EA0248502489000
+B1606404553522N00636870EA0248302486000
+B1606434553520N00636897EA0248202484000
+B1606464553518N00636923EA0248002483000
+B1606494553515N00636950EA0247802481000
+B1606524553513N00636977EA0247702479000
+B1606554553511N00637003EA0247502477000
+B1606584553510N00637030EA0247402475000
+B1607014553508N00637057EA0247202474000
+B1607044553507N00637084EA0247002472000
+B1607074553507N00637110EA0246802470000
+B1607104553507N00637137EA0246602469000
+B1607134553507N00637164EA0246402467000
+B1607164553507N00637191EA0246202465000
+B1607194553507N00637217EA0246002463000
+B1607224553507N00637244EA0245802462000
+B1607254553507N00637270EA0245602460000
+B1607284553507N00637297EA0245402459000
+B1607314553506N00637324EA0245302457000
+B1607344553505N00637351EA0245002455000
+B1607374553505N00637378EA0244902453000
+B1607404553505N00637404EA0244702452000
+B1607434553505N00637431EA0244402450000
+B1607474553505N00637467EA0244202447000
+B1607504553506N00637494EA0243902445000
+B1607534553507N00637521EA0243602443000
+B1607564553508N00637547EA0243302441000
+B1607594553508N00637574EA0242902439000
+B1608024553508N00637601EA0242602436000
+B1608054553507N00637628EA0242202433000
+B1608084553504N00637656EA0241902431000
+B1608114553500N00637682EA0241702428000
+B1608144553496N00637709EA0241302425000
+B1608174553492N00637735EA0241102422000
+B1608204553487N00637762EA0240702419000
+B1608234553483N00637788EA0240402417000
+B1608264553478N00637815EA0240002414000
+B1608294553473N00637842EA0239802411000
+B1608324553469N00637869EA0239502408000
+B1608354553464N00637896EA0239202405000
+B1608384553460N00637923EA0238902402000
+B1608414553456N00637950EA0238602399000
+B1608444553453N00637977EA0238202396000
+B1608474553450N00638004EA0237902393000
+B1608504553448N00638031EA0237602390000
+B1608534553445N00638058EA0237302387000
+B1608564553443N00638085EA0236802384000
+B1608594553441N00638112EA0236502381000
+B1609024553439N00638140EA0236102377000
+B1609064553436N00638176EA0235702373000
+B1609094553435N00638203EA0235202369000
+B1609124553433N00638231EA0234802366000
+B1609154553432N00638258EA0234402362000
+B1609184553431N00638286EA0234002358000
+B1609214553430N00638313EA0233702355000
+B1609244553429N00638341EA0233202351000
+B1609274553428N00638369EA0232902347000
+B1609304553427N00638396EA0232502344000
+B1609334553425N00638424EA0232202340000
+B1609364553424N00638451EA0231902336000
+B1609394553424N00638479EA0231502333000
+B1609424553424N00638507EA0231202330000
+B1609454553425N00638535EA0230902326000
+B1609484553426N00638563EA0230502323000
+B1609514553426N00638591EA0230302321000
+B1609544553427N00638619EA0230002318000
+B1609574553427N00638648EA0229802315000
+B1610004553427N00638676EA0229502313000
+B1610034553427N00638704EA0229202310000
+B1610064553427N00638732EA0229102307000
+B1610094553427N00638759EA0228902305000
+B1610124553427N00638787EA0228802303000
+B1610154553428N00638815EA0228502300000
+B1610184553428N00638843EA0228302298000
+B1610214553428N00638871EA0228202296000
+B1610244553428N00638899EA0228002293000
+B1610284553428N00638936EA0227802290000
+B1610314553428N00638964EA0227502288000
+B1610344553429N00638993EA0227302286000
+B1610374553428N00639021EA0227102284000
+B1610404553428N00639049EA0226902282000
+B1610434553427N00639077EA0226702280000
+B1610464553427N00639105EA0226302278000
+B1610494553427N00639133EA0226102275000
+B1610524553427N00639160EA0225702273000
+B1610554553427N00639189EA0225502271000
+B1610584553426N00639216EA0225202268000
+B1611014553425N00639243EA0225002266000
+B1611044553424N00639271EA0224702263000
+B1611074553424N00639298EA0224402261000
+B1611104553423N00639326EA0224202258000
+B1611134553422N00639353EA0223802256000
+B1611164553422N00639381EA0223602253000
+B1611194553421N00639409EA0223302251000
+B1611224553421N00639436EA0223102248000
+B1611254553420N00639464EA0222802245000
+B1611284553420N00639492EA0222602243000
+B1611314553420N00639519EA0222302240000
+B1611344553422N00639546EA0222002238000
+B1611374553423N00639573EA0221602235000
+B1611404553425N00639600EA0221202232000
+B1611434553426N00639627EA0220902229000
+B1611464553427N00639654EA0220602227000
+B1611504553426N00639690EA0220402223000
+B1611534553425N00639718EA0220102220000
+B1611564553424N00639745EA0219902217000
+B1611594553423N00639773EA0219902214000
+B1612024553423N00639800EA0219802211000
+B1612054553421N00639827EA0219702209000
+B1612084553419N00639854EA0219702206000
+B1612114553417N00639882EA0219702204000
+B1612144553415N00639910EA0219502202000
+B1612174553413N00639938EA0219502200000
+B1612204553412N00639964EA0219502198000
+B1612234553411N00639991EA0219102196000
+B1612264553409N00640019EA0218902194000
+B1612294553407N00640047EA0218702192000
+B1612324553405N00640075EA0218502190000
+B1612354553404N00640103EA0218402188000
+B1612384553403N00640132EA0218302186000
+B1612414553403N00640161EA0218102184000
+B1612444553404N00640190EA0218002182000
+B1612474553405N00640218EA0218102181000
+B1612504553405N00640246EA0218002179000
+B1612534553404N00640275EA0218102178000
+B1612564553403N00640303EA0217902177000
+B1612594553400N00640333EA0217802175000
+B1613024553398N00640362EA0217902174000
+B1613054553397N00640390EA0217602173000
+B1613084553397N00640420EA0217702172000
+B1613114553398N00640450EA0217602171000
+B1613144553398N00640480EA0217702169000
+B1613184553397N00640519EA0217702168000
+B1613214553397N00640548EA0217502167000
+B1613244553395N00640578EA0217202166000
+B1613274553393N00640607EA0217102164000
+B1613304553389N00640637EA0217002163000
+B1613334553385N00640669EA0217102162000
+B1613364553381N00640699EA0216902161000
+B1613394553380N00640730EA0216402159000
+B1613424553378N00640762EA0216102158000
+B1613454553379N00640794EA0215602156000
+B1613484553379N00640825EA0215002154000
+B1613514553378N00640856EA0214502151000
+B1613544553377N00640887EA0214502148000
+B1613574553377N00640914EA0214202146000
+B1614004553377N00640943EA0213802143000
+B1614034553377N00640975EA0213702140000
+B1614064553377N00641006EA0213702138000
+B1614094553376N00641036EA0213302136000
+B1614124553374N00641067EA0213102133000
+B1614154553373N00641098EA0212702130000
+B1614184553371N00641129EA0212402128000
+B1614214553371N00641158EA0212102125000
+B1614244553370N00641186EA0211702122000
+B1614274553371N00641215EA0211202119000
+B1614304553372N00641243EA0210502116000
+B1614334553375N00641272EA0209902113000
+B1614364553378N00641300EA0209602109000
+B1614394553381N00641327EA0209002105000
+B1614424553384N00641355EA0208802101000
+B1614454553387N00641382EA0208302097000
+B1614494553392N00641420EA0207902092000
+B1614524553397N00641446EA0207502088000
+B1614554553400N00641472EA0207002084000
+B1614584553402N00641499EA0206802080000
+B1615014553404N00641523EA0206202077000
+B1615044553405N00641550EA0205802073000
+B1615074553407N00641576EA0205302069000
+B1615104553408N00641602EA0205002065000
+B1615134553409N00641629EA0204702061000
+B1615164553409N00641657EA0204802057000
+B1615194553412N00641684EA0204802054000
+B1615224553416N00641711EA0204502051000
+B1615254553419N00641738EA0204202048000
+B1615284553422N00641766EA0204102045000
+B1615314553425N00641792EA0203902043000
+B1615344553429N00641821EA0204002040000
+B1615374553433N00641846EA0204002038000
+B1615404553437N00641872EA0204002036000
+B1615434553440N00641898EA0204102034000
+B1615464553444N00641924EA0204002033000
+B1615494553448N00641949EA0203802032000
+B1615524553453N00641975EA0203602031000
+B1615554553458N00642000EA0203502029000
+B1615584553462N00642025EA0203302028000
+B1616014553465N00642052EA0203302028000
+B1616044553469N00642077EA0203302027000
+B1616074553471N00642104EA0203202026000
+B1616104553473N00642131EA0203102025000
+B1616134553476N00642157EA0202802024000
+B1616164553481N00642185EA0202602024000
+B1616194553484N00642212EA0202402023000
+B1616234553488N00642247EA0202002021000
+B1616264553492N00642274EA0201802020000
+B1616294553497N00642300EA0201502018000
+B1616324553500N00642327EA0201402016000
+B1616354553503N00642355EA0201302015000
+B1616384553505N00642383EA0201402013000
+B1616414553505N00642411EA0201402011000
+B1616444553506N00642438EA0201702010000
+B1616474553507N00642465EA0202102009000
+B1616504553507N00642489EA0202102008000
+B1616534553507N00642514EA0202002008000
+B1616564553507N00642539EA0201902008000
+B1616594553506N00642564EA0201602007000
+B1617024553506N00642588EA0201602006000
+B1617054553505N00642614EA0201402006000
+B1617084553504N00642638EA0201202005000
+B1617114553503N00642664EA0201102004000
+B1617144553503N00642689EA0201102003000
+B1617174553502N00642713EA0200602002000
+B1617204553502N00642739EA0200602000000
+B1617234553502N00642764EA0200301999000
+B1617264553501N00642788EA0200301998000
+B1617294553500N00642813EA0200101996000
+B1617324553500N00642837EA0200001995000
+B1617364553499N00642868EA0199701993000
+B1617394553499N00642891EA0199501992000
+B1617424553498N00642914EA0199301990000
+B1617454553497N00642937EA0199001988000
+B1617484553495N00642960EA0198601986000
+B1617514553493N00642984EA0198301984000
+B1617544553490N00643008EA0198101982000
+B1617574553488N00643032EA0197701979000
+B1618004553484N00643057EA0197201977000
+B1618034553481N00643084EA0197301974000
+B1618064553476N00643109EA0197501972000
+B1618094553472N00643133EA0197401970000
+B1618124553469N00643158EA0197501968000
+B1618154553467N00643183EA0197201966000
+B1618184553464N00643209EA0197301964000
+B1618214553462N00643234EA0197301963000
+B1618244553459N00643260EA0197401961000
+B1618274553456N00643285EA0197501960000
+B1618304553452N00643311EA0197501959000
+B1618334553449N00643338EA0197801958000
+B1618364553445N00643363EA0197601958000
+B1618394553442N00643390EA0197901957000
+B1618424553437N00643414EA0197801957000
+B1618454553433N00643440EA0197901957000
+B1618484553428N00643465EA0197901958000
+B1618514553423N00643490EA0197801958000
+B1618554553416N00643522EA0197701959000
+B1618584553410N00643547EA0197801959000
+B1619014553403N00643571EA0197801960000
+B1619044553396N00643595EA0197901960000
+B1619074553388N00643619EA0198001961000
+B1619104553380N00643642EA0197501961000
+B1619134553373N00643666EA0197201961000
+B1619164553365N00643690EA0196701960000
+B1619194553358N00643715EA0196301959000
+B1619224553352N00643741EA0195801958000
+B1619254553344N00643768EA0195501956000
+B1619284553335N00643793EA0195001954000
+B1619314553326N00643818EA0194601951000
+B1619344553316N00643843EA0194201949000
+B1619374553305N00643868EA0193901947000
+B1619404553294N00643892EA0193601944000
+B1619434553284N00643917EA0193101942000
+B1619464553273N00643942EA0192801939000
+B1619494553262N00643968EA0192301936000
+B1619524553252N00643997EA0192301933000
+B1619554553243N00644028EA0192201930000
+B1619584553236N00644060EA0192201927000
+B1620014553232N00644092EA0192101924000
+B1620044553229N00644125EA0191801922000
+B1620074553229N00644157EA0191501919000
+B1620104553231N00644190EA0191501916000
+B1620144553238N00644230EA0191601913000
+B1620174553243N00644258EA0191601911000
+B1620204553250N00644285EA0191701909000
+B1620234553259N00644311EA0191901908000
+B1620264553269N00644336EA0192101907000
+B1620294553280N00644361EA0192401906000
+B1620324553291N00644383EA0192501906000
+B1620354553302N00644404EA0192401905000
+B1620384553314N00644422EA0192301905000
+B1620414553326N00644433EA0192001905000
+B1620444553339N00644437EA0191901905000
+B1620474553349N00644434EA0191701904000
+B1620504553353N00644422EA0191401904000
+B1620534553347N00644412EA0191301903000
+B1620564553333N00644408EA0191301902000
+B1620594553317N00644412EA0191401901000
+B1621024553300N00644417EA0191001901000
+B1621054553282N00644421EA0191201901000
+B1621084553263N00644425EA0191501901000
+B1621114553245N00644429EA0191701901000
+B1621144553228N00644436EA0191701901000
+B1621174553211N00644442EA0191701901000
+B1621204553196N00644444EA0191701901000
+B1621234553183N00644446EA0191401901000
+B1621264553167N00644446EA0191401901000
+B1621294553152N00644449EA0191401900000
+B1621334553131N00644450EA0191501900000
+B1621364553116N00644450EA0191801900000
+B1621394553103N00644449EA0191901900000
+B1621424553090N00644448EA0192001900000
+B1621454553077N00644448EA0192101900000
+B1621484553064N00644449EA0192101901000
+B1621514553051N00644451EA0191901901000
+B1621544553036N00644455EA0191601901000
+B1621574553021N00644458EA0191601901000
+B1622004553008N00644460EA0191201901000
+B1622034552994N00644461EA0191101900000
+B1622064552978N00644462EA0191101900000
+B1622094552964N00644464EA0191201899000
+B1622124552949N00644465EA0191001898000
+B1622154552936N00644462EA0190601898000
+B1622184552921N00644459EA0190201897000
+B1622214552904N00644459EA0190501895000
+B1622244552888N00644460EA0190801895000
+B1622274552873N00644459EA0191301894000
+B1622304552855N00644460EA0192101894000
+B1622334552839N00644464EA0192601895000
+B1622364552823N00644466EA0192701896000
+B1622394552813N00644460EA0192701897000
+B1622424552812N00644451EA0192601898000
+B1622454552817N00644447EA0192501898000
+B1622484552827N00644450EA0192301899000
+B1622514552841N00644460EA0192601900000
+B1622554552859N00644479EA0193501902000
+B1622584552870N00644492EA0193901904000
+B1623014552879N00644492EA0194501905000
+B1623044552874N00644483EA0195301907000
+B1623074552858N00644487EA0195701910000
+B1623104552841N00644509EA0195901913000
+B1623134552834N00644543EA0196401916000
+B1623164552843N00644571EA0196801920000
+B1623194552855N00644582EA0197501923000
+B1623224552862N00644579EA0198001925000
+B1623254552857N00644571EA0198901928000
+B1623284552844N00644575EA0199101933000
+B1623314552827N00644591EA0199401938000
+B1623344552809N00644607EA0199201942000
+B1623374552793N00644609EA0199401946000
+B1623404552781N00644606EA0199101950000
+B1623434552770N00644598EA0198901954000
+B1623464552760N00644590EA0197901956000
+B1623494552748N00644577EA0197901957000
+B1623524552736N00644568EA0197301958000
+B1623554552722N00644557EA0197101959000
+B1623584552708N00644549EA0197101959000
+B1624014552693N00644542EA0196601959000
+B1624044552679N00644530EA0197301958000
+B1624074552662N00644528EA0197801958000
+B1624104552644N00644528EA0198901959000
+B1624134552633N00644525EA0198701959000
+B1624164552630N00644519EA0199001960000
+B1624194552635N00644520EA0198701960000
+B1624234552644N00644541EA0198501961000
+B1624264552639N00644572EA0198101962000
+B1624294552622N00644598EA0198001962000
+B1624324552600N00644615EA0198001962000
+B1624354552581N00644621EA0198001962000
+B1624384552568N00644617EA0198101963000
+B1624414552566N00644610EA0198401963000
+B1624444552572N00644610EA0197901963000
+B1624474552580N00644609EA0197601963000
+B1624504552589N00644608EA0197501964000
+B1624534552597N00644605EA0197001964000
+B1624564552606N00644602EA0196401963000
+B1624594552617N00644596EA0196001962000
+B1625024552626N00644593EA0196701962000
+B1625054552626N00644586EA0196901961000
+B1625084552624N00644577EA0197301961000
+B1625114552624N00644570EA0196601961000
+B1625144552628N00644562EA0196301960000
+B1625174552634N00644556EA0196001960000
+B1625204552643N00644551EA0195501958000
+B1625234552652N00644551EA0195101956000
+B1625264552662N00644551EA0195001954000
+B1625294552672N00644550EA0195201952000
+B1625324552680N00644547EA0196001951000
+B1625354552685N00644545EA0196001951000
+B1625384552686N00644538EA0196001950000
+B1625424552687N00644529EA0196001950000
+B1625454552685N00644520EA0195701949000
+B1625484552681N00644511EA0195401949000
+B1625514552677N00644501EA0195001948000
+B1625544552676N00644492EA0195101947000
+B1625574552678N00644484EA0195301946000
+B1626004552682N00644478EA0195701946000
+B1626034552685N00644473EA0195601945000
+B1626064552691N00644472EA0195201944000
+B1626094552699N00644470EA0194701944000
+B1626124552709N00644469EA0194401942000
+B1626154552719N00644470EA0194401940000
+B1626184552730N00644470EA0194601939000
+B1626214552738N00644473EA0194301938000
+B1626244552749N00644475EA0194101936000
+B1626274552758N00644475EA0194101935000
+B1626304552767N00644474EA0193601934000
+B1626334552779N00644473EA0193901932000
+B1626364552788N00644477EA0194001931000
+B1626394552799N00644477EA0194301930000
+B1626424552808N00644473EA0194701929000
+B1626454552809N00644461EA0195201929000
+B1626484552795N00644458EA0195701929000
+B1626514552778N00644475EA0196201930000
+B1626544552773N00644507EA0196401931000
+B1626574552781N00644534EA0196801933000
+B1627014552796N00644544EA0197001935000
+B1627044552801N00644538EA0197501937000
+B1627074552800N00644532EA0197201938000
+B1627104552796N00644523EA0197001939000
+B1627134552797N00644516EA0196701940000
+B1627164552804N00644511EA0196401941000
+B1627194552812N00644510EA0196101942000
+B1627224552824N00644507EA0195401943000
+B1627254552837N00644503EA0195401943000
+B1627284552849N00644499EA0195301943000
+B1627314552861N00644494EA0195101943000
+B1627344552874N00644491EA0195301943000
+B1627374552887N00644489EA0195101942000
+B1627404552900N00644487EA0195301942000
+B1627434552912N00644485EA0195701942000
+B1627464552921N00644485EA0196501942000
+B1627494552928N00644485EA0196401942000
+B1627524552936N00644481EA0196701943000
+B1627564552947N00644478EA0196501943000
+B1627594552958N00644475EA0196601944000
+B1628024552969N00644474EA0196801945000
+B1628054552982N00644475EA0197101946000
+B1628084552994N00644477EA0197301947000
+B1628114553005N00644478EA0197401948000
+B1628144553014N00644479EA0197001949000
+B1628174553025N00644479EA0196701950000
+B1628204553036N00644479EA0196001950000
+B1628234553051N00644478EA0195801950000
+B1628264553064N00644475EA0195901950000
+B1628294553078N00644474EA0195501949000
+B1628324553094N00644474EA0195801949000
+B1628354553108N00644475EA0196001948000
+B1628384553123N00644474EA0196001948000
+B1628414553135N00644475EA0195601947000
+B1628444553151N00644475EA0195501947000
+B1628474553167N00644476EA0195001946000
+B1628514553188N00644477EA0194801944000
+B1628544553203N00644478EA0194701943000
+B1628574553220N00644480EA0194201942000
+B1629004553237N00644485EA0194201940000
+B1629034553253N00644492EA0194001938000
+B1629064553271N00644500EA0193801937000
+B1629094553289N00644509EA0193301935000
+B1629124553308N00644517EA0192901933000
+B1629154553326N00644528EA0192701930000
+B1629184553343N00644539EA0192001928000
+B1629214553362N00644553EA0192101925000
+B1629244553377N00644566EA0191601923000
+B1629274553395N00644579EA0191301920000
+B1629304553414N00644591EA0191701917000
+B1629334553430N00644603EA0191001915000
+B1629364553449N00644616EA0191001913000
+B1629394553464N00644632EA0190901910000
+B1629424553480N00644646EA0190601908000
+B1629454553496N00644658EA0190101906000
+B1629484553514N00644669EA0189901903000
+B1629514553532N00644681EA0189701901000
+B1629544553550N00644693EA0189601899000
+B1629574553570N00644707EA0190301896000
+B1630004553586N00644721EA0190901895000
+B1630034553601N00644731EA0191001894000
+B1630064553614N00644738EA0191401894000
+B1630104553628N00644743EA0191601894000
+B1630134553640N00644750EA0192001894000
+B1630164553651N00644757EA0192501895000
+B1630194553663N00644753EA0193001896000
+B1630224553665N00644742EA0193301897000
+B1630254553655N00644735EA0193601899000
+B1630284553639N00644748EA0193301901000
+B1630314553630N00644777EA0193701902000
+B1630344553634N00644804EA0194201904000
+B1630374553645N00644821EA0194801906000
+B1630404553658N00644829EA0195201909000
+B1630434553671N00644827EA0195501912000
+B1630464553681N00644822EA0195901915000
+B1630494553685N00644813EA0195801916000
+B1630524553679N00644802EA0195801918000
+B1630554553664N00644806EA0196001921000
+B1630584553654N00644831EA0195901923000
+B1631014553656N00644862EA0196501926000
+B1631044553667N00644879EA0196501928000
+B1631074553682N00644888EA0196901930000
+B1631104553697N00644895EA0197101932000
+B1631134553711N00644902EA0197101934000
+B1631164553724N00644909EA0197501936000
+B1631194553738N00644916EA0197801938000
+B1631224553749N00644913EA0198101940000
+B1631254553751N00644903EA0198301942000
+B1631284553742N00644900EA0198101944000
+B1631314553728N00644907EA0198201947000
+B1631354553709N00644913EA0198101950000
+B1631384553701N00644906EA0198201951000
+B1631414553708N00644899EA0197801953000
+B1631444553722N00644898EA0197701954000
+B1631474553738N00644903EA0197401955000
+B1631504553755N00644911EA0197401956000
+B1631534553771N00644924EA0197401957000
+B1631564553788N00644941EA0197501957000
+B1631594553805N00644957EA0197301958000
+B1632024553822N00644976EA0197301958000
+B1632054553836N00644998EA0197701959000
+B1632084553850N00645019EA0197801959000
+B1632114553865N00645035EA0197701960000
+B1632144553878N00645058EA0197701960000
+B1632174553884N00645090EA0197301960000
+B1632204553883N00645125EA0196901960000
+B1632234553880N00645162EA0196501960000
+B1632264553873N00645196EA0196101959000
+B1632294553864N00645230EA0196101958000
+B1632324553857N00645263EA0196201956000
+B1632354553853N00645294EA0195901955000
+B1632384553847N00645325EA0195801954000
+B1632414553841N00645354EA0195101952000
+B1632444553833N00645385EA0195001950000
+B1632474553825N00645411EA0195001948000
+B1632514553817N00645441EA0193801945000
+B1632544553811N00645469EA0193401943000
+B1632574553806N00645495EA0192301939000
+B1633004553798N00645525EA0191901935000
+B1633034553788N00645550EA0192401932000
+B1633064553778N00645575EA0193001929000
+B1633094553776N00645603EA0193301927000
+B1633124553787N00645622EA0193701925000
+B1633154553797N00645621EA0194201924000
+B1633184553799N00645607EA0194601924000
+B1633214553790N00645595EA0195001924000
+B1633244553775N00645602EA0195601925000
+B1633274553762N00645623EA0195701926000
+B1633304553761N00645653EA0195701928000
+B1633334553770N00645673EA0195901929000
+B1633364553782N00645675EA0196101931000
+B1633394553783N00645664EA0196301932000
+B1633424553771N00645660EA0196501934000
+B1633454553756N00645675EA0196401935000
+B1633484553747N00645702EA0196001937000
+B1633514553737N00645731EA0195601937000
+B1633544553724N00645759EA0195201938000
+B1633574553710N00645786EA0195001938000
+B1634004553697N00645811EA0193701937000
+B1634034553682N00645837EA0192501935000
+B1634064553665N00645863EA0191701933000
+B1634094553651N00645885EA0190201929000
+B1634134553629N00645916EA0189401923000
+B1634164553614N00645936EA0188401917000
+B1634194553595N00645959EA0186801911000
+B1634224553575N00645978EA0186201904000
+B1634254553556N00645999EA0184401897000
+B1634284553534N00646025EA0183601888000
+B1634314553514N00646047EA0182901880000
+B1634344553495N00646068EA0182401872000
+B1634374553478N00646090EA0182801865000
+B1634404553467N00646104EA0182501858000
+B1634434553451N00646117EA0182001852000
+B1634464553435N00646129EA0181801846000
+B1634494553420N00646142EA0181601841000
+B1634524553403N00646156EA0182201836000
+B1634554553389N00646168EA0182401832000
+B1634584553374N00646177EA0182701829000
+B1635014553359N00646182EA0183201827000
+B1635044553345N00646175EA0183701826000
+B1635074553338N00646158EA0183801825000
+B1635104553338N00646139EA0183401824000
+B1635134553348N00646129EA0182701823000
+B1635164553358N00646139EA0182301821000
+B1635194553359N00646163EA0182401819000
+B1635224553352N00646183EA0183001818000
+B1635254553340N00646199EA0183201817000
+B1635284553325N00646214EA0184101817000
+B1635314553311N00646232EA0184601818000
+B1635344553301N00646256EA0185501819000
+B1635374553301N00646277EA0185601821000
+B1635404553311N00646292EA0185901823000
+B1635444553326N00646292EA0185901826000
+B1635474553335N00646280EA0185801828000
+B1635504553334N00646262EA0185701830000
+B1635534553320N00646245EA0185601831000
+B1635564553301N00646238EA0186501832000
+B1635594553286N00646240EA0186801834000
+B1636024553273N00646249EA0187101835000
+B1636054553267N00646266EA0187101837000
+B1636084553268N00646288EA0187701839000
+B1636114553278N00646298EA0188101841000
+B1636144553287N00646288EA0188501843000
+B1636174553285N00646270EA0188801846000
+B1636204553271N00646264EA0189301849000
+B1636234553258N00646272EA0189401852000
+B1636264553252N00646293EA0190101854000
+B1636294553258N00646309EA0190401858000
+B1636324553270N00646313EA0190701861000
+B1636354553279N00646303EA0190901864000
+B1636384553277N00646285EA0191001867000
+B1636414553262N00646274EA0191201870000
+B1636444553246N00646283EA0191701873000
+B1636474553239N00646303EA0192201876000
+B1636504553242N00646323EA0192801880000
+B1636534553253N00646330EA0193001883000
+B1636564553262N00646321EA0193401887000
+B1636594553260N00646304EA0193301890000
+B1637024553248N00646291EA0193501893000
+B1637054553230N00646291EA0193701896000
+B1637084553215N00646301EA0193801899000
+B1637124553200N00646321EA0193401902000
+B1637154553201N00646343EA0192801904000
+B1637184553211N00646360EA0192601905000
+B1637214553227N00646359EA0192801905000
+B1637244553234N00646345EA0193201906000
+B1637274553231N00646328EA0193401907000
+B1637304553220N00646313EA0193401909000
+B1637334553202N00646313EA0193201909000
+B1637364553189N00646327EA0193101910000
+B1637394553179N00646342EA0192401910000
+B1637424553165N00646359EA0192101910000
+B1637454553152N00646377EA0191701909000
+B1637484553140N00646395EA0191001908000
+B1637514553128N00646416EA0190401906000
+B1637544553118N00646439EA0189801904000
+B1637574553107N00646463EA0189401901000
+B1638004553098N00646486EA0188601898000
+B1638034553088N00646513EA0187901894000
+B1638064553079N00646541EA0187301891000
+B1638094553071N00646571EA0187001886000
+B1638124553064N00646595EA0186101882000
+B1638154553053N00646624EA0184801877000
+B1638184553038N00646656EA0184301872000
+B1638214553023N00646685EA0183501866000
+B1638244553006N00646716EA0183101861000
+B1638274552991N00646746EA0182701855000
+B1638314552970N00646785EA0182001848000
+B1638344552953N00646816EA0181301842000
+B1638374552938N00646845EA0180901836000
+B1638404552922N00646874EA0180001830000
+B1638434552906N00646903EA0179001824000
+B1638464552890N00646934EA0178101818000
+B1638494552877N00646967EA0177901811000
+B1638524552866N00646997EA0177501805000
+B1638554552852N00647027EA0177001799000
+B1638584552839N00647057EA0176801793000
+B1639014552827N00647086EA0176301788000
+B1639044552814N00647115EA0176101782000
+B1639074552802N00647146EA0175501777000
+B1639104552788N00647179EA0175301772000
+B1639134552774N00647210EA0175701768000
+B1639164552762N00647236EA0176001764000
+B1639194552750N00647260EA0175801761000
+B1639224552738N00647282EA0175701758000
+B1639254552727N00647304EA0175301755000
+B1639284552713N00647327EA0175201752000
+B1639314552701N00647349EA0174701750000
+B1639344552688N00647373EA0174601747000
+B1639374552676N00647397EA0174301744000
+B1639404552664N00647422EA0174401742000
+B1639434552654N00647447EA0174401739000
+B1639464552645N00647474EA0174401737000
+B1639494552637N00647500EA0174101735000
+B1639534552626N00647537EA0174001733000
+B1639564552619N00647564EA0173701731000
+B1639594552612N00647593EA0173701729000
+B1640024552606N00647620EA0173501727000
+B1640054552603N00647649EA0173401726000
+B1640084552602N00647676EA0173401724000
+B1640114552603N00647702EA0173001723000
+B1640144552606N00647728EA0172801721000
+B1640174552613N00647752EA0172701720000
+B1640204552620N00647777EA0172301718000
+B1640234552625N00647803EA0172401716000
+B1640264552632N00647827EA0172501715000
+B1640294552640N00647847EA0172501714000
+B1640324552644N00647870EA0172701713000
+B1640354552645N00647895EA0172501712000
+B1640384552645N00647922EA0172601712000
+B1640414552645N00647948EA0172801711000
+B1640444552646N00647973EA0172601711000
+B1640474552647N00648001EA0172401711000
+B1640504552650N00648029EA0172201710000
+B1640534552655N00648057EA0172001709000
+B1640564552659N00648083EA0171601708000
+B1640594552667N00648109EA0171301707000
+B1641024552675N00648136EA0171301705000
+B1641054552682N00648161EA0171001704000
+B1641094552692N00648196EA0170901702000
+B1641124552698N00648221EA0170901701000
+B1641154552702N00648248EA0170701699000
+B1641184552703N00648276EA0170601698000
+B1641214552704N00648306EA0170601697000
+B1641244552705N00648336EA0170401695000
+B1641274552709N00648367EA0169901694000
+B1641304552713N00648398EA0169601692000
+B1641334552717N00648429EA0169501690000
+B1641364552722N00648459EA0169301688000
+B1641394552726N00648490EA0169201686000
+B1641424552729N00648520EA0169101684000
+B1641454552731N00648549EA0168901683000
+B1641484552734N00648577EA0169001681000
+B1641514552737N00648601EA0169401680000
+B1641544552743N00648622EA0169301679000
+B1641574552753N00648637EA0169401678000
+B1642004552765N00648639EA0169501678000
+B1642034552774N00648631EA0169901678000
+B1642064552776N00648616EA0170301678000
+B1642094552768N00648605EA0170401678000
+B1642124552755N00648604EA0170201678000
+B1642154552740N00648617EA0169901679000
+B1642184552728N00648639EA0169901679000
+B1642214552721N00648666EA0170401679000
+B1642244552721N00648687EA0170401679000
+B1642284552725N00648717EA0170301680000
+B1642314552725N00648740EA0170601681000
+B1642344552728N00648764EA0170801681000
+B1642374552733N00648784EA0171001682000
+B1642404552743N00648795EA0170801683000
+B1642434552755N00648791EA0170901683000
+B1642464552761N00648777EA0171001684000
+B1642494552756N00648760EA0171001684000
+B1642524552741N00648751EA0171101685000
+B1642554552726N00648759EA0171201686000
+B1642584552719N00648782EA0171201686000
+B1643014552721N00648804EA0171301687000
+B1643044552728N00648824EA0171001688000
+B1643074552735N00648846EA0170901689000
+B1643104552743N00648870EA0170901689000
+B1643134552749N00648894EA0171001690000
+B1643164552756N00648918EA0171001690000
+B1643194552764N00648940EA0171201691000
+B1643224552771N00648958EA0171101692000
+B1643254552778N00648979EA0171001692000
+B1643284552784N00649001EA0171201693000
+B1643314552790N00649025EA0171001693000
+B1643344552797N00649050EA0170901693000
+B1643374552803N00649074EA0170801694000
+B1643404552810N00649099EA0170601694000
+B1643434552815N00649126EA0170201693000
+B1643464552818N00649153EA0170301693000
+B1643504552819N00649189EA0169801692000
+B1643534552819N00649218EA0169701690000
+B1643564552822N00649247EA0169601689000
+B1643594552829N00649275EA0169601688000
+B1644024552835N00649302EA0169401687000
+B1644054552841N00649333EA0169201686000
+B1644084552848N00649359EA0169001684000
+B1644114552856N00649385EA0168401683000
+B1644144552864N00649411EA0168301681000
+B1644174552871N00649434EA0167901679000
+B1644204552881N00649458EA0167501677000
+B1644234552892N00649480EA0167201675000
+B1644264552903N00649503EA0167001672000
+B1644294552913N00649525EA0166901670000
+B1644324552924N00649545EA0166801667000
+B1644354552937N00649563EA0166801665000
+B1644384552950N00649581EA0166901664000
+B1644414552964N00649599EA0166801662000
+B1644444552977N00649617EA0166801660000
+B1644474552991N00649635EA0167001659000
+B1644504553005N00649655EA0167301658000
+B1644534553018N00649675EA0167301658000
+B1644564553029N00649694EA0167301657000
+B1644594553042N00649715EA0167101657000
+B1645024553054N00649738EA0167001656000
+B1645064553070N00649770EA0166801655000
+B1645094553081N00649798EA0166701654000
+B1645124553091N00649825EA0167101653000
+B1645154553101N00649848EA0167501653000
+B1645184553112N00649865EA0167601653000
+B1645214553125N00649863EA0167501653000
+B1645244553132N00649851EA0167701653000
+B1645274553131N00649840EA0167501653000
+B1645304553123N00649830EA0167301653000
+B1645334553114N00649825EA0167101653000
+B1645364553109N00649814EA0166801653000
+B1645394553114N00649802EA0166801652000
+B1645424553129N00649801EA0166601652000
+B1645454553145N00649819EA0166501651000
+B1645484553155N00649847EA0166201650000
+B1645514553161N00649878EA0165801649000
+B1645544553167N00649910EA0165601648000
+B1645574553173N00649940EA0165101646000
+B1646004553179N00649972EA0164601644000
+B1646034553187N00650003EA0164201642000
+B1646064553197N00650032EA0163801639000
+B1646094553207N00650061EA0163701636000
+B1646124553217N00650089EA0163201634000
+B1646154553227N00650119EA0162901631000
+B1646184553238N00650147EA0162501628000
+B1646214553247N00650176EA0162201625000
+B1646254553260N00650214EA0161701621000
+B1646284553268N00650242EA0161001618000
+B1646314553279N00650270EA0160501614000
+B1646344553289N00650296EA0160101610000
+B1646374553301N00650321EA0159801606000
+B1646404553314N00650345EA0159701603000
+B1646434553327N00650370EA0159501599000
+B1646464553340N00650394EA0159601596000
+B1646494553353N00650419EA0159601594000
+B1646524553367N00650441EA0159701591000
+B1646554553381N00650462EA0159501589000
+B1646584553394N00650485EA0159401587000
+B1647014553406N00650507EA0159501586000
+B1647044553418N00650531EA0159701584000
+B1647074553429N00650553EA0159601583000
+B1647104553439N00650577EA0159201582000
+B1647134553450N00650600EA0158901580000
+B1647164553463N00650622EA0158801578000
+B1647194553474N00650646EA0158701577000
+B1647224553487N00650668EA0158601575000
+B1647254553499N00650689EA0158601574000
+B1647284553511N00650711EA0158601573000
+B1647314553524N00650735EA0158401572000
+B1647344553535N00650763EA0158201570000
+B1647374553546N00650792EA0158001569000
+B1647414553563N00650831EA0157701567000
+B1647444553577N00650859EA0157301565000
+B1647474553589N00650888EA0157401564000
+B1647504553597N00650917EA0157101562000
+B1647534553605N00650949EA0156801560000
+B1647564553613N00650981EA0156601558000
+B1647594553625N00651010EA0156501556000
+B1648024553637N00651037EA0156501555000
+B1648054553651N00651060EA0156701553000
+B1648084553664N00651084EA0156301552000
+B1648114553677N00651111EA0156501550000
+B1648144553690N00651134EA0156301549000
+B1648174553703N00651160EA0155701548000
+B1648204553718N00651186EA0155801546000
+B1648234553731N00651210EA0155501545000
+B1648264553747N00651234EA0155101543000
+B1648294553761N00651257EA0155201541000
+B1648324553777N00651278EA0154601540000
+B1648354553792N00651301EA0154301538000
+B1648384553807N00651325EA0153701535000
+B1648414553822N00651351EA0153601533000
+B1648444553837N00651376EA0153201530000
+B1648474553852N00651402EA0152801528000
+B1648504553869N00651424EA0152401525000
+B1648534553886N00651447EA0152201522000
+B1648574553907N00651477EA0152001518000
+B1649004553923N00651498EA0151501516000
+B1649034553940N00651519EA0151201513000
+B1649064553958N00651540EA0150901510000
+B1649094553976N00651561EA0150401507000
+B1649124553994N00651583EA0150001504000
+B1649154554012N00651606EA0149701500000
+B1649184554030N00651629EA0149601497000
+B1649214554045N00651653EA0149501494000
+B1649244554058N00651676EA0149201491000
+B1649274554073N00651699EA0149001488000
+B1649304554090N00651716EA0148601486000
+B1649334554110N00651731EA0148301483000
+B1649364554130N00651746EA0148001480000
+B1649394554150N00651760EA0148101477000
+B1649424554169N00651771EA0147801474000
+B1649454554189N00651784EA0147701472000
+B1649484554206N00651800EA0147801470000
+B1649514554220N00651820EA0147601468000
+B1649544554234N00651841EA0147101466000
+B1649574554252N00651859EA0146801463000
+B1650004554272N00651871EA0147401461000
+B1650034554289N00651882EA0147501460000
+B1650064554304N00651896EA0147401458000
+B1650094554318N00651912EA0147101457000
+B1650124554334N00651930EA0147001456000
+B1650164554357N00651950EA0146501455000
+B1650194554374N00651960EA0146301453000
+B1650224554394N00651968EA0146301452000
+B1650254554414N00651977EA0146401451000
+B1650284554434N00651987EA0146601450000
+B1650314554453N00651998EA0146601449000
+B1650344554474N00652009EA0146901449000
+B1650374554495N00652019EA0147401449000
+B1650404554513N00652022EA0147201449000
+B1650434554533N00652025EA0146801449000
+B1650464554555N00652034EA0146501449000
+B1650494554578N00652044EA0146101448000
+B1650524554600N00652051EA0146201447000
+B1650554554621N00652058EA0145701446000
+B1650584554642N00652068EA0145701445000
+B1651014554663N00652079EA0145601444000
+B1651044554685N00652087EA0145701443000
+B1651074554706N00652094EA0145501442000
+B1651104554729N00652103EA0145301441000
+B1651134554751N00652115EA0145501440000
+B1651164554769N00652129EA0145401439000
+B1651194554786N00652141EA0144801438000
+B1651224554807N00652149EA0144701436000
+B1651254554825N00652154EA0144601435000
+B1651284554844N00652161EA0144201434000
+B1651324554869N00652166EA0144001432000
+B1651354554887N00652168EA0143601430000
+B1651384554906N00652167EA0143401429000
+B1651414554925N00652166EA0143201427000
+B1651444554945N00652164EA0143001425000
+B1651474554964N00652164EA0142401423000
+B1651504554985N00652164EA0142201420000
+B1651534555004N00652162EA0141901418000
+B1651564555021N00652158EA0141401415000
+B1651594555039N00652153EA0141001413000
+B1652024555058N00652149EA0140801410000
+B1652054555077N00652150EA0140601407000
+B1652084555098N00652157EA0140401404000
+B1652114555117N00652167EA0140301402000
+B1652144555136N00652178EA0140001399000
+B1652174555156N00652185EA0139801396000
+B1652204555175N00652194EA0139501394000
+B1652234555193N00652209EA0139101391000
+B1652264555212N00652222EA0138701388000
+B1652294555231N00652231EA0138201386000
+B1652324555253N00652239EA0138101383000
+B1652354555274N00652245EA0138101380000
+B1652384555294N00652251EA0137601377000
+B1652414555314N00652253EA0137101374000
+B1652444555334N00652254EA0136701371000
+B1652474555354N00652252EA0136201368000
+B1652514555379N00652245EA0135701363000
+B1652544555397N00652239EA0135301360000
+B1652574555415N00652230EA0134901356000
+B1653004555432N00652221EA0134501352000
+B1653034555449N00652215EA0133901348000
+B1653064555468N00652210EA0133401344000
+B1653094555487N00652205EA0133101340000
+B1653124555505N00652199EA0132701336000
+B1653154555524N00652192EA0132001332000
+B1653184555541N00652184EA0131501327000
+B1653214555559N00652173EA0130901323000
+B1653244555575N00652161EA0130801318000
+B1653274555591N00652149EA0130301314000
+B1653304555607N00652136EA0130301310000
+B1653334555621N00652122EA0130201306000
+B1653364555635N00652107EA0130101302000
+B1653394555646N00652092EA0130201298000
+B1653424555656N00652076EA0130101296000
+B1653454555664N00652059EA0130101293000
+B1653484555671N00652043EA0130101291000
+B1653514555680N00652026EA0130001289000
+B1653544555689N00652011EA0130201287000
+B1653574555697N00651999EA0130301286000
+B1654004555706N00651986EA0130301284000
+B1654034555713N00651972EA0130201283000
+B1654064555720N00651958EA0130301282000
+B1654104555725N00651935EA0130201281000
+B1654134555721N00651916EA0130201280000
+B1654164555710N00651905EA0129801279000
+B1654194555695N00651902EA0129601277000
+B1654224555680N00651908EA0129101276000
+B1654254555667N00651920EA0128901274000
+B1654284555656N00651939EA0128201272000
+B1654314555647N00651961EA0127901270000
+B1654344555638N00651981EA0127501268000
+B1654374555630N00652003EA0127501266000
+B1654404555626N00652025EA0127501263000
+B1654434555625N00652050EA0127501261000
+B1654464555627N00652074EA0127501259000
+B1654494555634N00652098EA0127401258000
+B1654524555646N00652121EA0127301256000
+B1654554555660N00652143EA0127201254000
+B1654584555674N00652165EA0127401253000
+B1655014555688N00652185EA0127201252000
+B1655044555703N00652207EA0127301251000
+B1655074555718N00652225EA0127201250000
+B1655104555733N00652244EA0127101249000
+B1655134555747N00652263EA0127001248000
+B1655164555762N00652281EA0126901247000
+B1655194555777N00652300EA0127001246000
+B1655224555792N00652318EA0126901245000
+B1655254555808N00652333EA0126901244000
+B1655284555827N00652340EA0126901244000
+B1655324555851N00652340EA0127101244000
+B1655354555866N00652330EA0127101244000
+B1655384555871N00652311EA0127401244000
+B1655414555871N00652294EA0127401244000
+B1655444555865N00652278EA0127501245000
+B1655474555856N00652270EA0127401245000
+B1655504555844N00652272EA0127601245000
+B1655534555836N00652284EA0127601246000
+B1655564555833N00652303EA0127601246000
+B1655594555837N00652324EA0127601247000
+B1656024555848N00652343EA0127901247000
+B1656054555864N00652352EA0127901248000
+B1656084555879N00652352EA0128001249000
+B1656114555893N00652344EA0127901250000
+B1656144555905N00652331EA0127901250000
+B1656174555916N00652316EA0128001250000
+B1656204555923N00652300EA0128201251000
+B1656234555926N00652283EA0128201251000
+B1656264555926N00652265EA0128001251000
+B1656294555922N00652249EA0127801251000
+B1656324555913N00652240EA0127401251000
+B1656354555902N00652234EA0127501250000
+B1656384555890N00652234EA0127001249000
+B1656414555876N00652237EA0126801248000
+B1656444555862N00652240EA0126601247000
+B1656484555843N00652235EA0126701245000
+B1656514555828N00652237EA0126701244000
+B1656544555815N00652243EA0126901244000
+B1656574555805N00652255EA0127001243000
+B1657004555802N00652275EA0127001243000
+B1657034555807N00652298EA0127001243000
+B1657064555819N00652318EA0127001243000
+B1657094555835N00652329EA0127001243000
+B1657124555853N00652326EA0127101244000
+B1657154555867N00652311EA0127301244000
+B1657184555875N00652292EA0127301244000
+B1657214555879N00652271EA0127301244000
+B1657244555876N00652252EA0127201244000
+B1657274555869N00652237EA0126901244000
+B1657304555857N00652225EA0126801244000
+B1657334555846N00652218EA0126901244000
+B1657364555833N00652217EA0126801243000
+B1657394555820N00652224EA0126901243000
+B1657424555808N00652232EA0126701242000
+B1657454555795N00652242EA0126801242000
+B1657484555783N00652254EA0127101242000
+B1657514555774N00652266EA0127001242000
+B1657544555765N00652279EA0127101242000
+B1657574555754N00652289EA0127201242000
+B1658004555742N00652296EA0127501242000
+B1658034555730N00652301EA0127901243000
+B1658074555716N00652305EA0127601243000
+B1658104555705N00652301EA0127701244000
+B1658134555696N00652295EA0127501244000
+B1658164555690N00652283EA0127601245000
+B1658194555689N00652268EA0127401245000
+B1658224555697N00652252EA0127401245000
+B1658254555711N00652242EA0127701246000
+B1658284555727N00652240EA0127901246000
+B1658314555742N00652249EA0128101247000
+B1658344555751N00652265EA0128101248000
+B1658374555752N00652283EA0128501249000
+B1658404555749N00652300EA0128501250000
+B1658434555742N00652318EA0128701251000
+B1658464555737N00652335EA0128701252000
+B1658494555733N00652356EA0128801252000
+B1658524555730N00652378EA0128901253000
+B1658554555739N00652400EA0129101254000
+B1658584555754N00652415EA0129301255000
+B1659014555771N00652414EA0129501256000
+B1659044555776N00652400EA0129801257000
+B1659074555771N00652383EA0130501259000
+B1659104555763N00652373EA0130501261000
+B1659134555751N00652372EA0130901262000
+B1659164555742N00652385EA0130801264000
+B1659194555741N00652408EA0130801266000
+B1659224555750N00652432EA0131101268000
+B1659264555771N00652449EA0131001270000
+B1659294555787N00652445EA0131401272000
+B1659324555797N00652432EA0132001274000
+B1659354555801N00652414EA0132401276000
+B1659384555793N00652397EA0132801278000
+B1659414555782N00652401EA0133201280000
+B1659444555776N00652416EA0133601283000
+B1659474555783N00652437EA0133801285000
+B1659504555796N00652451EA0134201288000
+B1659534555810N00652451EA0134901291000
+B1659564555819N00652438EA0135301295000
+B1659594555821N00652417EA0135601298000
+B1700024555813N00652403EA0136001302000
+B1700054555803N00652404EA0136301305000
+B1700084555798N00652418EA0136401309000
+B1700114555806N00652438EA0136901312000
+B1700144555822N00652449EA0137301315000
+B1700174555837N00652448EA0138001319000
+B1700204555848N00652436EA0138101322000
+B1700234555854N00652418EA0138501326000
+B1700264555851N00652400EA0138501329000
+B1700294555841N00652389EA0138601332000
+B1700324555830N00652388EA0138901335000
+B1700354555822N00652399EA0138501337000
+B1700384555819N00652418EA0138101339000
+B1700414555828N00652440EA0138101341000
+B1700444555844N00652451EA0138401343000
+B1700474555859N00652446EA0138501344000
+B1700514555874N00652427EA0138601347000
+B1700544555875N00652408EA0138501348000
+B1700574555873N00652393EA0138601349000
+B1701004555866N00652380EA0138401350000
+B1701034555855N00652377EA0138201351000
+B1701064555846N00652388EA0137901352000
+B1701094555847N00652408EA0137401352000
+B1701124555859N00652426EA0137001351000
+B1701154555878N00652427EA0136401351000
+B1701184555894N00652411EA0136201350000
+B1701214555902N00652390EA0136001348000
+B1701244555904N00652367EA0136301347000
+B1701274555903N00652348EA0136201346000
+B1701304555899N00652327EA0136301345000
+B1701334555892N00652309EA0136201344000
+B1701364555883N00652288EA0136201343000
+B1701394555874N00652271EA0136301342000
+B1701424555867N00652256EA0135901341000
+B1701454555858N00652239EA0135801341000
+B1701484555854N00652220EA0135601340000
+B1701514555850N00652200EA0135301339000
+B1701544555849N00652177EA0135101338000
+B1701574555847N00652155EA0134901337000
+B1702004555841N00652135EA0134401336000
+B1702034555840N00652114EA0134001334000
+B1702064555838N00652093EA0133701332000
+B1702104555835N00652065EA0133401330000
+B1702134555837N00652046EA0133001328000
+B1702164555836N00652026EA0132501325000
+B1702194555834N00652008EA0132101322000
+B1702224555832N00651989EA0131601320000
+B1702254555828N00651974EA0131101316000
+B1702284555818N00651960EA0130401313000
+B1702314555804N00651950EA0130001309000
+B1702344555790N00651942EA0129401306000
+B1702374555773N00651937EA0129001302000
+B1702404555757N00651936EA0128801298000
+B1702434555740N00651935EA0128401294000
+B1702464555724N00651934EA0128401290000
+B1702494555708N00651928EA0128101286000
+B1702524555693N00651923EA0128101283000
+B1702554555678N00651919EA0128001280000
+B1702584555662N00651917EA0127601276000
+B1703014555646N00651915EA0127501273000
+B1703044555630N00651912EA0127301271000
+B1703074555614N00651911EA0127201268000
+B1703104555600N00651911EA0127001265000
+B1703134555585N00651913EA0126801262000
+B1703164555569N00651915EA0126601260000
+B1703194555553N00651921EA0126301257000
+B1703224555537N00651927EA0126101256000
+B1703254555521N00651937EA0125701256000
+B1703294555504N00651960EA0125401253000
+B1703324555494N00651981EA0125301250000
+B1703354555487N00652002EA0125001248000
+B1703384555482N00652024EA0124701246000
+B1703414555481N00652049EA0124401243000
+B1703444555484N00652074EA0124201240000
+B1703474555488N00652097EA0124101238000
+B1703504555495N00652120EA0123801236000
+B1703534555505N00652140EA0123401233000
+B1703564555516N00652160EA0123101230000
+B1703594555528N00652176EA0123101228000
+B1704024555541N00652190EA0122801226000
+B1704054555555N00652203EA0122701223000
+B1704084555571N00652215EA0122601221000
+B1704114555587N00652225EA0122801219000
+B1704144555602N00652233EA0122801217000
+B1704174555617N00652237EA0123301215000
+B1704204555629N00652236EA0123201214000
+B1704234555644N00652230EA0123501213000
+B1704264555657N00652225EA0123001212000
+B1704294555673N00652220EA0123001211000
+B1704324555687N00652217EA0122501210000
+B1704354555702N00652218EA0122501209000
+B1704384555716N00652219EA0122401208000
+B1704414555728N00652219EA0122201207000
+B1704454555742N00652214EA0122201205000
+B1704484555752N00652208EA0121701204000
+B1704514555761N00652203EA0121601203000
+B1704544555769N00652195EA0121201202000
+B1704574555777N00652186EA0120901200000
+B1705004555782N00652172EA0120501198000
+B1705034555782N00652156EA0120101196000
+B1705064555777N00652140EA0119701194000
+B1705094555764N00652130EA0119201191000
+B1705124555747N00652133EA0118601188000
+B1705154555730N00652144EA0118401185000
+B1705184555719N00652161EA0117901182000
+B1705214555718N00652184EA0117601178000
+B1705244555728N00652196EA0117101175000
+B1705274555737N00652189EA0117001171000
+B1705304555742N00652178EA0116501169000
+B1705334555739N00652162EA0116001165000
+B1705364555726N00652152EA0115701161000
+B1705394555711N00652144EA0115301157000
+B1705424555695N00652139EA0115001154000
+B1705454555679N00652137EA0114601150000
+B1705484555663N00652143EA0114101146000
+B1705514555653N00652164EA0114001142000
+B1705544555657N00652184EA0113801139000
+B1705574555669N00652193EA0114001135000
+B1706014555682N00652194EA0113601132000
+B1706044555693N00652189EA0113401129000
+B1706074555702N00652182EA0113001126000
+B1706104555710N00652172EA0112801124000
+B1706134555715N00652159EA0112501121000
+B1706164555709N00652142EA0112001118000
+B1706194555693N00652141EA0111401116000
+B1706224555677N00652153EA0111401113000
+B1706254555662N00652151EA0110801110000
+B1706284555653N00652133EA0110701106000
+B1706314555649N00652115EA0110201103000
+B1706344555643N00652093EA0109901100000
+B1706374555638N00652074EA0109501097000
+B1706404555629N00652057EA0109401094000
+B1706434555619N00652044EA0108801091000
+B1706464555606N00652034EA0108601087000
+B1706494555596N00652023EA0108301084000
+B1706524555590N00652013EA0108401081000
+B1706554555587N00652011EA0108601080000
+B1706584555586N00652010EA0108601078000
+B1707014555587N00652011EA0108401077000
+B1707044555587N00652011EA0108401076000
+B1707074555587N00652010EA0108501076000
+B1707104555588N00652008EA0108501076000
+B1707144555588N00652006EA0108501075000
+B1707174555588N00652006EA0108401074000
+B1707204555588N00652006EA0108401072000
+B1707234555589N00652005EA0108401072000
+B1707264555589N00652004EA0108401072000
+B1707294555589N00652004EA0108401071000
+B1707324555589N00652005EA0108501069000
+B1707354555588N00652005EA0108401067000
+B1707384555588N00652005EA0108401065000
+B1707414555588N00652006EA0108401063000
+B1707444555588N00652006EA0108501062000
+B1707474555588N00652007EA0108401060000
+B1707504555588N00652007EA0108401059000
+B1707534555588N00652007EA0108401058000
+GAB890A77AFE5CE63979AF6B1BED7F07D
+G62BB282E44D63A1149EF2F5E8AF6F2F1
+GEC14381987B15F81003EDE1E01A47843
+G60189641B00B00800019000000000000
diff --git a/examples/data/igc/Ulrich-Prinz.igc b/examples/data/igc/Ulrich-Prinz.igc
new file mode 100644
index 0000000..6162364
--- /dev/null
+++ b/examples/data/igc/Ulrich-Prinz.igc
@@ -0,0 +1,4611 @@
+ABRA02676
+HFDTE190411
+HFFXA100
+HFPLTPILOT:Ulrich Prinz      
+HFGTYGLIDERTYPE:Boomerang 8       
+HFGIDGLIDERID:www.up0.de        
+HFDTM100GPSDATUM:WGS84
+HFGPSGPS:FURUNO GH-80
+HFRFWFIRMWAREVERSION:2.26
+HFRHWHARDWAREVERSION:1.00
+HFFTYFRTYPE:BRAUNIGER,COMPEO
+HOCIDCOMPETITIONID: DHV-XC-2011
+HOCCLCOMPETITION CLASS: Paraglider open
+HOSITSite: Planpraz (Chamonix)
+I013638TAS
+B0851384556194N00651066EA0206702042000
+B0851454556194N00651066EA0206702043000
+B0851524556194N00651065EA0206702044000
+B0851594556194N00651065EA0206702044000
+B0852064556194N00651065EA0206702045000
+B0852134556195N00651065EA0206702045000
+B0852204556195N00651065EA0206702046000
+B0852274556195N00651065EA0206702046000
+B0852344556195N00651065EA0206702046000
+B0852414556194N00651064EA0206702046000
+B0852484556194N00651064EA0206802045000
+B0852554556194N00651063EA0206802045000
+B0853024556194N00651063EA0206802044000
+B0853094556194N00651063EA0206802044000
+B0853164556195N00651063EA0206702043000
+B0853234556195N00651064EA0206802043000
+B0853304556195N00651065EA0206802043000
+B0853374556195N00651064EA0206802043000
+B0853444556195N00651064EA0206702043000
+B0853514556195N00651064EA0206802043000
+B0853584556195N00651064EA0206802043000
+B0854054556195N00651064EA0206802042000
+B0854124556195N00651064EA0206702042000
+B0854194556195N00651065EA0206802042000
+B0854264556196N00651065EA0206802041000
+B0854334556192N00651063EA0206502040000
+B0854404556177N00651065EA0205802040000
+B0854474556147N00651059EA0206202038000
+B0854544556137N00651026EA0207902037000
+B0855014556141N00650975EA0210202040000
+B0855094556148N00650921EA0212502047000
+B0855164556167N00650965EA0214502059000
+B0855234556155N00650950EA0216302074000
+B0855304556187N00650964EA0217702091000
+B0855374556159N00650953EA0219702099000
+B0855444556194N00650925EA0221302115000
+B0855514556189N00650967EA0222302132000
+B0855584556178N00650918EA0224302148000
+B0856054556207N00650939EA0225202165000
+B0856124556171N00650924EA0227102179000
+B0856194556196N00650883EA0228402192000
+B0856264556187N00650918EA0229902207000
+B0856334556169N00650867EA0231402223000
+B0856404556200N00650870EA0232702239000
+B0856474556176N00650877EA0234302255000
+B0856544556189N00650826EA0235602271000
+B0857014556205N00650854EA0237202286000
+B0857084556187N00650820EA0238802301000
+B0857154556220N00650799EA0239702317000
+B0857234556212N00650841EA0241802334000
+B0857304556193N00650803EA0242902348000
+B0857374556226N00650802EA0244602363000
+B0857444556201N00650822EA0245802379000
+B0857514556205N00650771EA0246302393000
+B0857584556231N00650801EA0247702407000
+B0858054556204N00650821EA0249102420000
+B0858124556210N00650786EA0249502429000
+B0858194556209N00650819EA0250402440000
+B0858264556177N00650791EA0251202447000
+B0858334556140N00650759EA0251802456000
+B0858404556101N00650730EA0252702462000
+B0858474556060N00650708EA0253102470000
+B0858544556026N00650675EA0251002477000
+B0859014555989N00650630EA0249602480000
+B0859084555948N00650579EA0249602480000
+B0859154555913N00650531EA0249002479000
+B0859224555879N00650478EA0249202478000
+B0859294555841N00650422EA0248902476000
+B0859364555800N00650371EA0249202474000
+B0859434555761N00650325EA0248202473000
+B0859504555723N00650273EA0247302469000
+B0859574555683N00650221EA0246002465000
+B0900044555642N00650168EA0245302459000
+B0900114555598N00650116EA0245702451000
+B0900184555571N00650057EA0247902449000
+B0900254555558N00650063EA0249102449000
+B0900324555570N00650009EA0251002452000
+B0900394555546N00649966EV0252202456000
+B0900464555549N00649970EA0255402461000
+B0900534555558N00649905EA0257602469000
+B0901004555525N00649880EA0259502482000
+B0901074555544N00649876EA0262002498000
+B0901144555518N00649858EA0264002503000
+B0901214555527N00649829EA0266602507000
+B0901284555512N00649846EA0268802525000
+B0901354555530N00649806EA0271002547000
+B0901424555512N00649818EA0272902571000
+B0901494555536N00649782EA0275102599000
+B0901564555502N00649758EA0277102624000
+B0902034555520N00649767EA0279002635000
+B0902104555494N00649736EA0280702649000
+B0902174555511N00649735EA0282202662000
+B0902244555495N00649662EA0283802689000
+B0902314555467N00649588EA0285902717000
+B0902384555448N00649519EA0285302743000
+B0902454555419N00649449EA0285402763000
+B0902524555393N00649396EA0284002779000
+B0902594555374N00649335EA0282102787000
+B0903064555350N00649281EA0279902787000
+B0903144555314N00649214EA0278202784000
+B0903214555289N00649151EA0276302778000
+B0903284555265N00649074EA0273402768000
+B0903354555256N00648995EA0272302755000
+B0903424555242N00648924EA0271902743000
+B0903494555237N00648855EA0275202735000
+B0903564555269N00648839EA0278002735000
+B0904034555246N00648878EA0281102739000
+B0904104555229N00648824EA0284402748000
+B0904174555235N00648758EA0285702763000
+B0904244555220N00648697EA0287302780000
+B0904314555205N00648643EA0288202796000
+B0904384555183N00648584EA0289302811000
+B0904454555160N00648521EA0289902825000
+B0904524555140N00648462EA0289202836000
+B0904594555115N00648405EA0288702844000
+B0905064555089N00648347EA0288102849000
+B0905134555064N00648289EA0287502851000
+B0905204555028N00648242EA0285502850000
+B0905274554993N00648179EA0283002844000
+B0905344554956N00648123EA0281002837000
+B0905414554915N00648067EA0278602825000
+B0905484554879N00648006EA0276802809000
+B0905554554835N00647959EA0275202793000
+B0906024554788N00647911EA0273702776000
+B0906094554747N00647852EA0272402760000
+B0906164554706N00647789EA0271202745000
+B0906234554671N00647736EA0270102731000
+B0906304554631N00647692EA0269002716000
+B0906374554593N00647649EA0267902708000
+B0906444554556N00647591EA0266602694000
+B0906514554523N00647528EA0266102681000
+B0906584554491N00647463EA0265502669000
+B0907054554470N00647397EA0264302661000
+B0907124554450N00647331EA0263402652000
+B0907194554431N00647268EA0262802643000
+B0907264554404N00647208EA0262402637000
+B0907334554371N00647163EA0261702628000
+B0907404554336N00647118EA0260102618000
+B0907474554308N00647057EA0259202608000
+B0907544554285N00646996EA0258702599000
+B0908014554256N00646942EA0257302589000
+B0908084554225N00646890EA0256402579000
+B0908154554195N00646832EA0256102569000
+B0908224554159N00646779EA0255902562000
+B0908294554127N00646719EA0255602555000
+B0908364554102N00646652EA0254902549000
+B0908434554071N00646587EA0254002543000
+B0908504554039N00646524EA0253202537000
+B0908574554006N00646462EA0252202530000
+B0909044553970N00646408EA0251302522000
+B0909124553930N00646348EA0250102513000
+B0909194553897N00646291EA0249202504000
+B0909264553867N00646230EA0248302495000
+B0909334553835N00646172EA0247202486000
+B0909404553802N00646115EA0245902475000
+B0909474553772N00646055EA0245002465000
+B0909544553739N00646000EA0244202455000
+B0910014553707N00645947EA0243202446000
+B0910084553680N00645888EA0242202437000
+B0910154553660N00645821EA0241502429000
+B0910224553640N00645754EA0240502421000
+B0910294553625N00645687EA0239802413000
+B0910364553607N00645622EA0239002404000
+B0910434553591N00645556EA0238302396000
+B0910504553573N00645496EA0237702387000
+B0910574553541N00645447EA0237102378000
+B0911044553513N00645393EA0236402370000
+B0911114553503N00645333EA0235702363000
+B0911184553486N00645282EA0235102357000
+B0911254553446N00645254EA0234502350000
+B0911324553407N00645221EA0234102345000
+B0911394553361N00645196EA0233402340000
+B0911464553313N00645166EA0234002337000
+B0911534553278N00645129EA0235002334000
+B0912004553246N00645101EA0236102334000
+B0912074553212N00645061EA0236702335000
+B0912144553180N00645081EA0236802337000
+B0912214553189N00645056EA0237202337000
+B0912284553150N00645045EA0237402339000
+B0912354553154N00645096EA0238102341000
+B0912424553186N00645075EA0239002345000
+B0912494553176N00645032EA0239102349000
+B0912564553185N00645042EA0240002352000
+B0913034553210N00645034EA0239702356000
+B0913104553191N00644995EA0240602359000
+B0913174553211N00645013EA0241602361000
+B0913244553202N00644962EA0242702363000
+B0913314553199N00644954EA0244002367000
+B0913384553203N00644908EA0245202373000
+B0913454553195N00644920EA0246302376000
+B0913524553198N00644874EA0248502382000
+B0913594553180N00644891EA0248802394000
+B0914064553208N00644864EA0250402401000
+B0914134553181N00644860EA0251202413000
+B0914204553197N00644880EA0251802424000
+B0914274553195N00644824EA0251902435000
+B0914344553171N00644855EA0253002449000
+B0914414553191N00644880EA0253302461000
+B0914484553227N00644849EA0254402473000
+B0914554553207N00644827EA0255702477000
+B0915024553221N00644849EA0255702488000
+B0915094553212N00644800EA0256502496000
+B0915164553203N00644829EA0256802504000
+B0915244553224N00644774EA0257502510000
+B0915314553190N00644770EA0258302518000
+B0915384553214N00644773EA0258302526000
+B0915454553201N00644715EA0258902534000
+B0915524553182N00644753EA0258502540000
+B0915594553190N00644792EA0259402545000
+B0916064553191N00644836EA0260802551000
+B0916134553203N00644799EA0262002555000
+B0916204553203N00644815EA0263202560000
+B0916274553182N00644758EA0264502566000
+B0916344553135N00644731EA0264802573000
+B0916414553087N00644714EA0265002584000
+B0916484553039N00644696EA0264002592000
+B0916554552992N00644676EA0263702596000
+B0917024552944N00644652EA0264802600000
+B0917094552901N00644622EA0264202604000
+B0917164552862N00644569EA0264602607000
+B0917234552806N00644531EA0263202610000
+B0917304552749N00644504EA0262702610000
+B0917374552692N00644464EA0260502607000
+B0917444552629N00644424EA0260002601000
+B0917514552587N00644401EA0258302593000
+B0917584552549N00644376EA0260102588000
+B0918054552552N00644332EA0259302586000
+B0918124552553N00644373EA0260102585000
+B0918194552520N00644372EA0261102585000
+B0918264552534N00644364EA0262002586000
+B0918334552516N00644371EA0262802588000
+B0918404552483N00644319EA0263802595000
+B0918474552444N00644267EA0264602601000
+B0918544552405N00644219EA0265102607000
+B0919014552360N00644177EA0265202611000
+B0919084552301N00644133EA0262702615000
+B0919154552235N00644082EA0260402613000
+B0919224552170N00644030EA0258202607000
+B0919294552109N00643982EA0255602597000
+B0919364552051N00643931EA0253702584000
+B0919434551992N00643881EA0251302568000
+B0919504551933N00643832EA0249002551000
+B0919574551882N00643781EA0247702533000
+B0920044551829N00643720EA0247002515000
+B0920114551773N00643664EA0246202499000
+B0920184551717N00643607EA0245702485000
+B0920254551656N00643563EA0244702473000
+B0920324551593N00643526EA0243702461000
+B0920394551531N00643486EA0242702450000
+B0920464551471N00643444EA0241502439000
+B0920534551414N00643401EA0240802428000
+B0921004551357N00643364EA0239802417000
+B0921074551298N00643325EA0238802406000
+B0921154551233N00643277EA0237602394000
+B0921224551177N00643235EA0236702384000
+B0921294551121N00643190EA0235602374000
+B0921364551068N00643149EA0234802364000
+B0921434551012N00643109EA0233602353000
+B0921504550957N00643067EA0232402343000
+B0921574550898N00643031EA0230802332000
+B0922044550840N00643005EA0229402321000
+B0922114550786N00642967EA0227702309000
+B0922184550731N00642931EA0225902296000
+B0922254550677N00642905EA0224602282000
+B0922324550627N00642887EA0223102267000
+B0922394550576N00642860EA0221302252000
+B0922464550522N00642816EA0219602236000
+B0922534550467N00642769EA0217902221000
+B0923004550411N00642725EA0216002205000
+B0923074550352N00642682EA0213602188000
+B0923144550293N00642636EA0211402169000
+B0923214550238N00642595EA0209702150000
+B0923284550182N00642550EA0208102133000
+B0923354550124N00642506EA0206802116000
+B0923424550064N00642466EA0205902100000
+B0923494550009N00642416EA0205002085000
+B0923564549951N00642374EA0204302072000
+B0924034549888N00642349EA0203802060000
+B0924104549826N00642319EA0202602048000
+B0924174549776N00642290EA0202602037000
+B0924244549727N00642248EA0204302030000
+B0924314549739N00642203EA0205702028000
+B0924384549729N00642228EA0207102029000
+B0924454549716N00642165EA0208802032000
+B0924524549739N00642176EA0210502039000
+B0924594549704N00642173EA0211702046000
+B0925064549721N00642118EA0213902056000
+B0925134549735N00642152EA0215502069000
+B0925204549699N00642149EA0216902085000
+B0925274549704N00642094EA0218702100000
+B0925344549692N00642122EA0220402115000
+B0925414549675N00642064EA0222002122000
+B0925484549693N00642070EA0223002133000
+B0925554549652N00642086EA0224702150000
+B0926024549647N00642030EA0226102158000
+B0926094549659N00642052EA0227002176000
+B0926164549614N00642057EA0228602193000
+B0926234549614N00642006EA0229202205000
+B0926304549595N00642039EA0229902221000
+B0926374549543N00642016EA0231602236000
+B0926444549545N00641956EA0232102250000
+B0926514549549N00641981EA0232802263000
+B0926584549501N00641965EA0234502275000
+B0927054549498N00641903EA0235202287000
+B0927124549524N00641908EA0236102299000
+B0927194549549N00641921EA0235902310000
+B0927264549569N00641949EA0235702318000
+B0927344549598N00641970EA0236602325000
+B0927414549627N00641975EA0238502334000
+B0927484549611N00642008EA0240602344000
+B0927554549591N00641955EA0242502347000
+B0928024549621N00641923EA0244602362000
+B0928094549619N00641962EA0246102376000
+B0928164549587N00641917EA0248702393000
+B0928234549613N00641920EA0249702410000
+B0928304549586N00641965EA0250802421000
+B0928374549565N00641915EA0253302438000
+B0928444549594N00641900EA0253802456000
+B0928514549586N00641953EA0253702470000
+B0928584549545N00641942EA0255102482000
+B0929054549528N00641904EA0256402492000
+B0929124549531N00641928EA0257002494000
+B0929194549531N00641904EA0257502501000
+B0929264549517N00641866EA0259002514000
+B0929334549524N00641827EA0259002528000
+B0929404549534N00641778EA0258402539000
+B0929474549549N00641792EA0258102544000
+B0929544549517N00641834EA0257302547000
+B0930014549516N00641887EA0256202548000
+B0930084549537N00641877EA0255002547000
+B0930154549528N00641822EA0254202544000
+B0930224549472N00641796EA0253402538000
+B0930294549425N00641774EA0253702533000
+B0930364549383N00641734EA0254802530000
+B0930434549384N00641684EA0254502529000
+B0930504549400N00641695EA0255902529000
+B0930574549405N00641721EA0256502530000
+B0931044549399N00641749EA0256802532000
+B0931114549416N00641755EA0254202533000
+B0931184549442N00641760EA0253302530000
+B0931254549468N00641769EA0252902526000
+B0931324549498N00641767EA0253302522000
+B0931394549524N00641774EA0254602522000
+B0931464549550N00641777EA0255602523000
+B0931534549578N00641772EA0255802526000
+B0932004549608N00641754EA0255602529000
+B0932074549641N00641736EA0255302530000
+B0932144549670N00641702EA0255302531000
+B0932214549697N00641667EA0255002532000
+B0932284549729N00641642EA0255302532000
+B0932354549765N00641640EA0255502533000
+B0932424549804N00641653EA0256002534000
+B0932494549835N00641681EA0255302535000
+B0932564549832N00641733EA0255402536000
+B0933034549798N00641766EA0254902535000
+B0933104549753N00641751EA0253702533000
+B0933174549706N00641735EA0252902529000
+B0933244549660N00641717EA0251902522000
+B0933324549604N00641709EA0251002515000
+B0933394549552N00641713EA0250102508000
+B0933464549499N00641708EA0249902501000
+B0933534549443N00641676EA0250602497000
+B0934004549396N00641666EA0251302494000
+B0934074549401N00641649EA0251402493000
+B0934144549410N00641595EA0251302492000
+B0934214549409N00641624EA0253002493000
+B0934284549357N00641626EA0252202493000
+B0934354549303N00641586EA0253502494000
+B0934424549258N00641546EA0252502495000
+B0934494549227N00641486EA0252802497000
+B0934564549198N00641444EA0252402501000
+B0935034549164N00641406EA0253202503000
+B0935104549136N00641365EA0251902504000
+B0935174549101N00641317EA0252102502000
+B0935244549067N00641274EA0253402503000
+B0935314549032N00641239EA0254202507000
+B0935384548995N00641211EA0255502511000
+B0935454548974N00641155EA0256902517000
+B0935524548994N00641156EA0258202524000
+B0935594548982N00641195EA0259402534000
+B0936064548951N00641135EA0259602544000
+B0936134548920N00641067EA0261702553000
+B0936204548905N00641078EA0261002562000
+B0936274548901N00641005EA0262102570000
+B0936344548870N00640944EA0263102578000
+B0936414548848N00640877EA0264602587000
+B0936484548826N00640814EA0265302597000
+B0936554548798N00640770EA0265102605000
+B0937024548761N00640741EA0265702610000
+B0937094548727N00640714EA0266302615000
+B0937164548694N00640678EA0266502619000
+B0937234548660N00640642EA0266202624000
+B0937304548623N00640601EA0267002629000
+B0937374548592N00640571EA0268502635000
+B0937444548603N00640513EA0268602642000
+B0937514548618N00640545EA0271002650000
+B0937584548598N00640562EA0272002661000
+B0938054548611N00640510EA0273602671000
+B0938124548605N00640526EA0274802682000
+B0938194548579N00640473EA0275402694000
+B0938264548603N00640465EA0276802703000
+B0938334548572N00640485EA0277702713000
+B0938404548532N00640452EA0277302721000
+B0938474548495N00640391EA0276402728000
+B0938544548461N00640341EA0276002732000
+B0939014548428N00640290EA0275802735000
+B0939084548403N00640237EA0276102737000
+B0939154548378N00640185EA0275602738000
+B0939224548350N00640140EA0275402738000
+B0939294548325N00640084EA0275502738000
+B0939374548289N00640017EA0275902738000
+B0939444548271N00639973EA0277102740000
+B0939514548248N00639915EA0279102744000
+B0939584548227N00639861EA0280402752000
+B0940054548209N00639800EA0281202762000
+B0940124548191N00639739EA0280402768000
+B0940194548167N00639661EA0279202771000
+B0940264548138N00639587EA0277602770000
+B0940334548112N00639512EA0277102767000
+B0940404548091N00639434EA0278502764000
+B0940474548086N00639389EA0278902765000
+B0940544548071N00639329EA0279202767000
+B0941014548057N00639267EA0280002769000
+B0941084548038N00639208EA0280002773000
+B0941154548018N00639133EA0278702774000
+B0941224547991N00639057EA0277702772000
+B0941294547968N00638979EA0276902769000
+B0941364547945N00638903EA0275502763000
+B0941434547925N00638822EA0273902756000
+B0941504547904N00638740EA0272502747000
+B0941574547885N00638664EA0272502738000
+B0942044547860N00638600EA0271702729000
+B0942114547841N00638538EA0270702722000
+B0942184547827N00638453EA0269702714000
+B0942254547813N00638378EA0268102705000
+B0942324547792N00638308EA0267202695000
+B0942394547766N00638239EA0266202685000
+B0942464547741N00638166EA0265302675000
+B0942534547708N00638098EA0265002665000
+B0943004547676N00638035EA0264702656000
+B0943074547649N00637981EA0265102650000
+B0943144547628N00637918EA0264302644000
+B0943214547612N00637866EA0265102640000
+B0943284547591N00637811EA0264802637000
+B0943354547569N00637750EA0264102633000
+B0943424547549N00637690EA0265302631000
+B0943494547527N00637652EA0264602631000
+B0943564547496N00637603EA0264202629000
+B0944034547467N00637563EA0264002628000
+B0944104547444N00637514EA0264302628000
+B0944174547419N00637465EA0263302627000
+B0944244547398N00637421EA0262802624000
+B0944314547374N00637369EA0263302621000
+B0944384547350N00637314EA0263202619000
+B0944454547324N00637247EA0263702618000
+B0944524547295N00637187EA0264602618000
+B0944594547268N00637133EA0263602619000
+B0945064547238N00637064EA0264802618000
+B0945134547216N00637013EA0264602620000
+B0945204547193N00636954EA0264702621000
+B0945284547172N00636877EA0267302626000
+B0945354547146N00636828EA0270302636000
+B0945424547101N00636785EA0272702649000
+B0945494547060N00636749EA0274502665000
+B0945564547022N00636705EA0274902679000
+B0946034546987N00636652EA0272202689000
+B0946104546950N00636581EA0270002691000
+B0946174546907N00636515EA0268502688000
+B0946244546870N00636447EA0267802682000
+B0946314546840N00636377EA0267802677000
+B0946384546811N00636311EA0268102673000
+B0946454546788N00636258EA0269202672000
+B0946524546760N00636206EA0270702673000
+B0946594546733N00636167EA0271002676000
+B0947064546700N00636102EA0271302680000
+B0947134546672N00636037EA0272602684000
+B0947204546645N00635981EA0272202688000
+B0947274546617N00635902EA0271302691000
+B0947344546586N00635823EA0270002691000
+B0947414546555N00635755EA0269402689000
+B0947484546533N00635692EA0272102688000
+B0947554546517N00635641EA0273802692000
+B0948024546498N00635589EA0275702700000
+B0948094546485N00635545EA0276802711000
+B0948164546477N00635491EA0277002722000
+B0948234546460N00635429EA0277002729000
+B0948304546433N00635381EA0275502733000
+B0948374546393N00635320EA0273602733000
+B0948444546353N00635261EA0272302730000
+B0948514546313N00635200EA0270902724000
+B0948584546276N00635136EA0270402716000
+B0949054546250N00635080EA0268902709000
+B0949124546216N00635008EA0267302700000
+B0949194546188N00634945EA0266702690000
+B0949264546157N00634873EA0265102679000
+B0949334546130N00634802EA0263602667000
+B0949404546095N00634727EA0261902654000
+B0949474546062N00634645EA0260102641000
+B0949544546032N00634567EA0260002627000
+B0950014546004N00634485EA0259502615000
+B0950084545988N00634423EA0259702606000
+B0950154545965N00634351EA0259402598000
+B0950224545944N00634306EA0260502594000
+B0950294545925N00634247EA0261202592000
+B0950364545903N00634189EA0260302591000
+B0950434545880N00634120EA0259602589000
+B0950504545867N00634064EA0262002588000
+B0950574545849N00634018EA0263202592000
+B0951044545826N00633961EA0262902597000
+B0951114545804N00633892EA0262902601000
+B0951194545776N00633807EA0261702603000
+B0951264545749N00633741EA0260902601000
+B0951334545727N00633677EA0261502599000
+B0951404545706N00633619EA0260702598000
+B0951474545688N00633549EA0261702597000
+B0951544545669N00633480EA0260702597000
+B0952014545643N00633407EA0260502594000
+B0952084545612N00633339EA0260802592000
+B0952154545581N00633270EA0261302592000
+B0952224545564N00633216EA0261202593000
+B0952294545539N00633166EA0261502594000
+B0952364545517N00633116EA0259002593000
+B0952434545492N00633044EA0257602587000
+B0952504545464N00632972EA0256602579000
+B0952574545437N00632910EA0255102570000
+B0953044545407N00632849EA0253602559000
+B0953114545374N00632790EA0252302548000
+B0953184545341N00632728EA0251002536000
+B0953254545315N00632658EA0249402523000
+B0953324545286N00632589EA0247002510000
+B0953394545261N00632504EA0245002495000
+B0953464545241N00632427EA0243602479000
+B0953534545210N00632360EA0241802463000
+B0954004545179N00632299EA0240102446000
+B0954074545155N00632239EA0239302430000
+B0954144545133N00632180EA0238602416000
+B0954214545110N00632114EA0238602403000
+B0954284545089N00632065EA0239402395000
+B0954354545066N00632020EA0239802389000
+B0954424545048N00631983EA0239702386000
+B0954494545035N00631939EA0240202384000
+B0954564545018N00631893EA0241702386000
+B0955034545000N00631851EA0243302390000
+B0955104544987N00631816EA0244702397000
+B0955174544973N00631776EA0247002406000
+B0955244544966N00631723EA0250202418000
+B0955314544990N00631697EA0251902433000
+B0955384544972N00631726EA0254202442000
+B0955454544959N00631682EA0255202458000
+B0955524544958N00631620EA0255302474000
+B0955594544953N00631555EA0256402488000
+B0956064544961N00631502EA0256602502000
+B0956134544973N00631451EA0256402513000
+B0956204544987N00631401EA0256102521000
+B0956274544998N00631345EA0256002526000
+B0956344545002N00631277EA0256302530000
+B0956414545003N00631205EA0256202532000
+B0956484544995N00631136EA0256602534000
+B0956554544994N00631080EA0258002538000
+B0957024544997N00631026EA0258802544000
+B0957104544994N00630962EA0261002553000
+B0957174544991N00630911EA0263002565000
+B0957244544980N00630854EA0263702577000
+B0957314544965N00630789EA0263802588000
+B0957384544954N00630730EA0263902597000
+B0957454544943N00630668EA0262302601000
+B0957524544936N00630585EA0260502601000
+B0957594544920N00630501EA0258802596000
+B0958064544905N00630423EA0257102589000
+B0958134544892N00630357EA0259402584000
+B0958204544877N00630313EA0260902583000
+B0958274544864N00630270EA0262602585000
+B0958344544842N00630277EA0263402591000
+B0958414544866N00630252EA0264702594000
+B0958484544865N00630196EA0265602601000
+B0958554544856N00630140EA0266402610000
+B0959024544842N00630091EA0267202619000
+B0959094544827N00630045EA0268402629000
+B0959164544808N00629996EA0268202637000
+B0959234544786N00629943EA0266702642000
+B0959304544757N00629892EA0264302643000
+B0959374544726N00629819EA0262902638000
+B0959444544702N00629744EA0263202632000
+B0959514544690N00629687EA0265402630000
+B0959584544684N00629625EA0268202634000
+B1000054544689N00629569EA0267802640000
+B1000124544699N00629504EA0267702644000
+B1000194544702N00629443EA0267802648000
+B1000264544707N00629369EA0268502650000
+B1000334544711N00629290EA0269102654000
+B1000404544709N00629220EA0270302658000
+B1000474544696N00629153EA0270702664000
+B1000544544693N00629089EA0270702669000
+B1001014544688N00629025EA0269402673000
+B1001084544683N00628971EA0268302674000
+B1001154544664N00628922EA0266202671000
+B1001224544635N00628875EA0264602664000
+B1001294544606N00628830EA0263302656000
+B1001364544577N00628780EA0262202647000
+B1001434544553N00628726EA0262102639000
+B1001504544531N00628673EA0261702630000
+B1001574544506N00628623EA0261202623000
+B1002044544484N00628570EA0260602616000
+B1002114544463N00628514EA0260302609000
+B1002184544444N00628454EA0259702603000
+B1002254544426N00628393EA0258902596000
+B1002324544403N00628332EA0258202591000
+B1002394544380N00628270EA0257302584000
+B1002464544364N00628207EA0256302575000
+B1002534544348N00628141EA0255202566000
+B1003014544328N00628065EA0254302556000
+B1003084544313N00627998EA0253402550000
+B1003154544306N00627926EA0252602547000
+B1003224544301N00627856EA0251602545000
+B1003294544293N00627787EA0250402536000
+B1003364544283N00627716EA0249902526000
+B1003434544274N00627644EA0249102516000
+B1003504544261N00627574EA0248202506000
+B1003574544252N00627501EA0247302495000
+B1004044544240N00627428EA0246702484000
+B1004114544231N00627356EA0246102474000
+B1004184544221N00627286EA0245302465000
+B1004254544208N00627217EA0244602457000
+B1004324544195N00627148EA0244102450000
+B1004394544185N00627079EA0243402443000
+B1004464544170N00627013EA0242602436000
+B1004534544163N00626941EA0241602428000
+B1005004544156N00626868EA0240702419000
+B1005074544150N00626797EA0240002410000
+B1005144544140N00626729EA0239002402000
+B1005214544125N00626659EA0237702392000
+B1005284544111N00626588EA0236302382000
+B1005354544099N00626513EA0235402372000
+B1005424544095N00626434EA0234502362000
+B1005494544094N00626354EA0233202352000
+B1005564544088N00626273EA0231802344000
+B1006034544078N00626184EA0230602334000
+B1006104544066N00626091EA0229602323000
+B1006174544050N00626003EA0228502316000
+B1006244544034N00625913EA0227502305000
+B1006314544019N00625823EA0226302294000
+B1006384544000N00625734EA0225002282000
+B1006454543983N00625646EA0224002271000
+B1006524543970N00625557EA0222602258000
+B1006594543954N00625471EA0221702245000
+B1007064543940N00625384EA0220502237000
+B1007134543929N00625299EA0219202226000
+B1007204543917N00625213EA0218102214000
+B1007274543904N00625123EA0217002201000
+B1007344543888N00625035EA0215702187000
+B1007414543873N00624946EA0214702174000
+B1007484543858N00624858EA0213702161000
+B1007554543841N00624770EA0212702149000
+B1008024543824N00624682EA0211702137000
+B1008094543806N00624596EA0210602125000
+B1008164543787N00624511EA0209302113000
+B1008234543767N00624428EA0208302102000
+B1008304543750N00624344EA0207302092000
+B1008384543731N00624248EA0206302081000
+B1008454543716N00624166EA0205302072000
+B1008524543701N00624084EA0204302062000
+B1008594543688N00624001EA0203302051000
+B1009064543676N00623917EA0202202041000
+B1009134543661N00623834EA0201302031000
+B1009204543646N00623750EA0200402020000
+B1009274543630N00623668EA0199402010000
+B1009344543617N00623584EA0198402000000
+B1009414543605N00623502EA0197501991000
+B1009484543591N00623420EA0196601981000
+B1009554543578N00623338EA0195701973000
+B1010024543565N00623257EA0194701963000
+B1010094543552N00623176EA0193601953000
+B1010164543539N00623097EA0192501943000
+B1010234543518N00623020EA0191501933000
+B1010304543492N00622945EA0190501922000
+B1010374543465N00622871EA0189601913000
+B1010444543441N00622795EA0188501904000
+B1010514543418N00622720EA0187401894000
+B1010584543396N00622644EA0186301884000
+B1011054543377N00622567EA0185101873000
+B1011124543362N00622487EA0184201862000
+B1011194543346N00622409EA0182701852000
+B1011264543329N00622330EA0181401841000
+B1011334543312N00622251EA0180301830000
+B1011404543293N00622172EA0179201818000
+B1011474543275N00622092EA0178001806000
+B1011544543261N00622012EA0176901794000
+B1012014543246N00621933EA0175701782000
+B1012084543225N00621858EA0174201770000
+B1012154543202N00621784EA0172701757000
+B1012224543181N00621711EA0171501743000
+B1012294543166N00621647EA0170701730000
+B1012364543164N00621580EA0170301719000
+B1012434543159N00621524EA0171301712000
+B1012504543165N00621464EA0171301709000
+B1012574543191N00621416EA0170301705000
+B1013044543226N00621380EA0169301700000
+B1013114543265N00621345EA0168301693000
+B1013184543289N00621292EA0167601686000
+B1013254543295N00621230EA0166701678000
+B1013324543278N00621177EA0165701670000
+B1013394543244N00621146EA0164901662000
+B1013464543209N00621119EA0165401655000
+B1013534543175N00621095EA0165801651000
+B1014004543146N00621066EA0165401649000
+B1014074543108N00621038EA0165501646000
+B1014144543085N00620998EA0166501644000
+B1014214543066N00620954EA0167401644000
+B1014284543054N00620905EA0168901647000
+B1014354543042N00620863EA0168301650000
+B1014424543011N00620839EA0167801653000
+B1014504542970N00620813EA0166801656000
+B1014574542934N00620794EA0167501657000
+B1015044542902N00620772EA0167201658000
+B1015114542865N00620760EA0166801658000
+B1015184542837N00620747EA0167801658000
+B1015254542812N00620731EA0168401660000
+B1015324542789N00620707EA0168501662000
+B1015394542763N00620677EA0169301664000
+B1015464542743N00620642EA0169701666000
+B1015534542714N00620608EA0170901669000
+B1016004542689N00620571EA0172301675000
+B1016074542679N00620586EA0173601683000
+B1016144542714N00620588EA0174201691000
+B1016214542699N00620578EA0175001697000
+B1016284542682N00620532EA0176401705000
+B1016354542655N00620508EA0177101714000
+B1016424542624N00620486EA0177101721000
+B1016494542584N00620475EA0176001725000
+B1016564542545N00620473EA0175701728000
+B1017034542563N00620500EA0175601729000
+B1017104542603N00620498EA0176001731000
+B1017174542646N00620500EA0177801734000
+B1017244542664N00620532EA0177301738000
+B1017314542642N00620499EA0178201743000
+B1017384542618N00620497EA0178701748000
+B1017454542647N00620522EA0179001753000
+B1017524542683N00620520EA0180401759000
+B1017594542712N00620538EA0182401767000
+B1018064542695N00620563EA0184701777000
+B1018134542687N00620519EA0186401789000
+B1018204542711N00620534EA0188701802000
+B1018274542683N00620522EA0191001813000
+B1018344542705N00620497EA0193601830000
+B1018414542688N00620511EA0195901845000
+B1018484542705N00620468EA0198601864000
+B1018554542700N00620501EA0201401884000
+B1019024542711N00620462EA0203701902000
+B1019094542695N00620478EA0206501919000
+B1019164542707N00620432EA0208501935000
+B1019234542700N00620469EA0211701955000
+B1019304542658N00620460EA0214701982000
+B1019374542622N00620447EA0215602011000
+B1019444542581N00620419EA0216102038000
+B1019514542533N00620378EA0216102058000
+B1019584542499N00620348EA0218002076000
+B1020054542463N00620323EA0217102094000
+B1020124542418N00620293EA0217602108000
+B1020194542376N00620261EA0218502119000
+B1020264542333N00620235EA0218202128000
+B1020344542286N00620199EA0217702136000
+B1020414542242N00620168EA0216702140000
+B1020484542189N00620128EA0214902139000
+B1020554542148N00620094EA0215102136000
+B1021024542109N00620080EA0216302135000
+B1021094542072N00620072EA0215902136000
+B1021164542030N00620055EA0214902136000
+B1021234541989N00620034EA0213502133000
+B1021304541941N00619998EA0211602128000
+B1021374541890N00619963EA0210302119000
+B1021444541843N00619928EA0209302110000
+B1021514541796N00619891EA0207902100000
+B1021584541752N00619854EA0207602089000
+B1022054541710N00619832EA0208102080000
+B1022124541671N00619816EA0209402076000
+B1022194541671N00619770EA0210102075000
+B1022264541700N00619792EA0211402077000
+B1022334541690N00619838EA0212602082000
+B1022404541651N00619825EA0214802089000
+B1022474541671N00619796EA0215602098000
+B1022544541674N00619838EA0216802107000
+B1023014541639N00619821EA0218202116000
+B1023084541656N00619781EA0218802125000
+B1023154541677N00619814EA0220202130000
+B1023224541656N00619846EA0220702139000
+B1023294541615N00619832EA0222002150000
+B1023364541583N00619806EA0222302161000
+B1023434541562N00619754EA0223502171000
+B1023504541536N00619705EA0225002181000
+B1023574541535N00619662EA0225202193000
+B1024044541558N00619698EA0226902203000
+B1024114541551N00619736EA0228302211000
+B1024184541543N00619694EA0230002217000
+B1024254541545N00619718EA0231502226000
+B1024324541523N00619666EA0232702237000
+B1024394541502N00619606EA0233402250000
+B1024464541483N00619547EA0232502262000
+B1024534541459N00619491EA0230802270000
+B1025004541432N00619412EA0228302272000
+B1025074541405N00619330EA0227002269000
+B1025144541385N00619246EA0225602263000
+B1025214541360N00619164EA0224402255000
+B1025284541329N00619087EA0222902247000
+B1025354541295N00619005EA0220802236000
+B1025424541262N00618921EA0219502224000
+B1025494541231N00618845EA0218102210000
+B1025564541199N00618765EA0216902198000
+B1026034541164N00618688EA0215702186000
+B1026104541132N00618609EA0214502174000
+B1026184541097N00618518EA0212902159000
+B1026254541067N00618435EA0211502145000
+B1026324541040N00618357EA0210502131000
+B1026394541020N00618275EA0209402118000
+B1026464541004N00618192EA0208102105000
+B1026534540983N00618112EA0206702092000
+B1027004540950N00618041EA0205802079000
+B1027074540921N00617967EA0204702067000
+B1027144540895N00617892EA0203502055000
+B1027214540871N00617816EA0202502044000
+B1027284540846N00617741EA0201402034000
+B1027354540821N00617665EA0200402023000
+B1027424540797N00617589EA0199502013000
+B1027494540773N00617512EA0198602003000
+B1027564540754N00617432EA0197501992000
+B1028034540736N00617367EA0196301982000
+B1028104540716N00617291EA0194401971000
+B1028174540702N00617206EA0194501960000
+B1028244540689N00617142EA0194501951000
+B1028314540673N00617082EA0195401944000
+B1028384540658N00617024EA0196401941000
+B1028454540647N00616976EA0197901942000
+B1028524540682N00616967EA0199101946000
+B1028594540667N00616983EA0200301950000
+B1029064540635N00616964EA0202101957000
+B1029134540604N00616945EA0202201965000
+B1029204540597N00616897EA0202401972000
+B1029274540631N00616903EA0203501978000
+B1029344540616N00616923EA0203301984000
+B1029414540595N00616876EA0203801990000
+B1029484540579N00616828EA0203001996000
+B1029554540546N00616785EA0201601998000
+B1030024540504N00616738EA0199901997000
+B1030094540470N00616693EA0201201993000
+B1030164540469N00616651EA0201601991000
+B1030234540504N00616653EA0202501993000
+B1030304540488N00616679EA0203201996000
+B1030374540453N00616659EA0204302000000
+B1030444540419N00616622EA0204602005000
+B1030514540380N00616586EA0204202011000
+B1030584540340N00616550EA0202602014000
+B1031054540292N00616507EA0200602011000
+B1031124540243N00616463EA0198902006000
+B1031194540194N00616418EA0197301998000
+B1031264540144N00616375EA0195901988000
+B1031334540094N00616335EA0194301976000
+B1031404540043N00616293EA0193001963000
+B1031474539992N00616251EA0191501949000
+B1031544539941N00616213EA0190001935000
+B1032014539892N00616177EA0188701921000
+B1032094539837N00616129EA0187601906000
+B1032164539790N00616096EA0186701892000
+B1032234539751N00616064EA0187201880000
+B1032304539715N00616036EA0185901870000
+B1032374539667N00616008EA0184201860000
+B1032444539612N00615985EA0182901849000
+B1032514539555N00615970EA0181701837000
+B1032584539497N00615954EA0181901826000
+B1033054539457N00615936EA0182101818000
+B1033124539414N00615927EA0181001812000
+B1033194539378N00615918EA0182401807000
+B1033264539385N00615936EA0183201806000
+B1033334539380N00615887EA0184201805000
+B1033404539349N00615890EA0184601806000
+B1033474539313N00615895EA0183801808000
+B1033544539271N00615891EA0182501808000
+B1034014539228N00615889EA0181601805000
+B1034084539180N00615883EA0181001802000
+B1034154539134N00615881EA0180801797000
+B1034224539098N00615871EA0181801794000
+B1034294539071N00615862EA0182101793000
+B1034364539039N00615847EA0182101794000
+B1034434539003N00615853EA0181801795000
+B1034504538969N00615851EA0180901795000
+B1034574538930N00615850EA0180401793000
+B1035044538899N00615822EA0181201791000
+B1035114538899N00615770EA0181901791000
+B1035184538904N00615711EA0183301793000
+B1035254538888N00615695EA0182801796000
+B1035324538914N00615731EA0184101798000
+B1035394538904N00615754EA0184701802000
+B1035464538937N00615731EA0185901808000
+B1035534538950N00615768EA0187301815000
+B1036004538942N00615730EA0188801823000
+B1036074538972N00615738EA0190501833000
+B1036144538953N00615764EA0190901843000
+B1036214538931N00615719EA0192201854000
+B1036284538956N00615689EA0192901865000
+B1036354538947N00615723EA0195001874000
+B1036424538931N00615681EA0195501884000
+B1036494538956N00615692EA0197001894000
+B1036564538936N00615699EA0198301905000
+B1037034538954N00615650EA0198701915000
+B1037104538940N00615684EA0200001923000
+B1037174538900N00615661EA0199201933000
+B1037244538860N00615619EA0198801942000
+B1037314538821N00615580EA0198001948000
+B1037384538781N00615546EA0196401950000
+B1037454538733N00615513EA0194501947000
+B1037524538679N00615478EA0193101941000
+B1038004538618N00615442EA0191601932000
+B1038074538564N00615414EA0190101922000
+B1038144538508N00615388EA0188901909000
+B1038214538453N00615363EA0187401896000
+B1038284538398N00615339EA0186601882000
+B1038354538352N00615320EA0186601872000
+B1038424538314N00615300EA0187801865000
+B1038494538273N00615278EA0189601863000
+B1038564538279N00615221EA0190801866000
+B1039034538287N00615251EA0191501869000
+B1039104538248N00615247EA0193401874000
+B1039174538263N00615208EA0194801882000
+B1039244538249N00615233EA0196401889000
+B1039314538249N00615199EA0196701897000
+B1039384538243N00615226EA0197901908000
+B1039454538207N00615234EA0198701919000
+B1039524538166N00615229EA0198901930000
+B1039594538127N00615214EA0200401940000
+B1040064538116N00615167EA0200901950000
+B1040134538138N00615176EA0202301959000
+B1040204538110N00615191EA0202901968000
+B1040274538070N00615179EA0203901978000
+B1040344538030N00615177EA0202001986000
+B1040414537984N00615165EA0201701989000
+B1040484537945N00615146EA0201501990000
+B1040554537909N00615127EA0201401989000
+B1041024537876N00615103EA0203401991000
+B1041094537880N00615060EA0204701997000
+B1041164537886N00615092EA0206702004000
+B1041234537862N00615069EA0208402013000
+B1041304537886N00615070EA0209702018000
+B1041374537855N00615061EA0211602027000
+B1041444537824N00615020EA0211202040000
+B1041514537789N00614989EA0211402051000
+B1041584537756N00614946EA0211502061000
+B1042054537728N00614900EA0213402070000
+B1042124537705N00614848EA0214402080000
+B1042194537695N00614790EA0216602092000
+B1042264537725N00614766EA0218502105000
+B1042334537706N00614771EA0220902115000
+B1042404537722N00614732EA0222502129000
+B1042474537720N00614767EA0225002145000
+B1042544537689N00614756EA0225802161000
+B1043014537663N00614700EA0226902177000
+B1043084537638N00614649EA0226802192000
+B1043154537608N00614599EA0226302203000
+B1043224537581N00614555EA0226002211000
+B1043294537547N00614510EA0224302216000
+B1043364537514N00614458EA0225102219000
+B1043434537483N00614412EA0225502220000
+B1043514537453N00614368EA0223602221000
+B1043584537409N00614311EA0221402217000
+B1044054537360N00614246EA0219802211000
+B1044124537310N00614186EA0218102202000
+B1044194537262N00614120EA0216502191000
+B1044264537215N00614054EA0214402178000
+B1044334537169N00613983EA0214102164000
+B1044404537146N00613918EA0215402154000
+B1044474537123N00613877EA0214902147000
+B1044544537093N00613841EA0213402140000
+B1045014537063N00613797EA0215102134000
+B1045084537041N00613759EA0215102132000
+B1045154537011N00613728EA0214202131000
+B1045224536981N00613681EA0212502128000
+B1045294536947N00613626EA0212802123000
+B1045364536919N00613586EA0213802120000
+B1045434536903N00613568EA0214902120000
+B1045504536880N00613539EA0215402121000
+B1045574536859N00613488EA0215402124000
+B1046044536841N00613438EA0215502126000
+B1046114536820N00613387EA0214602127000
+B1046184536786N00613337EA0213102126000
+B1046254536757N00613288EA0213002122000
+B1046324536738N00613242EA0214302120000
+B1046394536716N00613204EA0215502121000
+B1046464536717N00613146EA0218102126000
+B1046534536744N00613163EA0219002134000
+B1047004536727N00613172EA0220602141000
+B1047074536733N00613120EA0222902152000
+B1047144536734N00613134EA0225002160000
+B1047214536734N00613087EA0227002173000
+B1047284536749N00613113EA0228502186000
+B1047354536726N00613080EA0230802201000
+B1047424536713N00613034EA0232802220000
+B1047494536692N00612996EA0235302240000
+B1047564536679N00613013EA0236402261000
+B1048034536689N00612978EA0239102278000
+B1048104536663N00612943EA0240302296000
+B1048174536637N00612891EA0241602313000
+B1048244536612N00612836EA0240702329000
+B1048314536591N00612772EA0237802339000
+B1048384536565N00612691EA0235902342000
+B1048454536538N00612612EA0234702341000
+B1048524536512N00612553EA0236802340000
+B1048594536489N00612514EA0238302341000
+B1049064536466N00612467EA0238402345000
+B1049134536442N00612415EA0237302348000
+B1049204536409N00612353EA0235202347000
+B1049284536370N00612272EA0234902341000
+B1049354536352N00612221EA0234702337000
+B1049424536326N00612172EA0235002332000
+B1049494536305N00612129EA0236702331000
+B1049564536306N00612085EA0238902336000
+B1050034536322N00612111EA0241302343000
+B1050104536313N00612083EA0243102352000
+B1050174536351N00612090EA0245002364000
+B1050244536333N00612102EA0247002377000
+B1050314536311N00612062EA0249402394000
+B1050384536286N00612008EA0248502410000
+B1050454536261N00611952EA0247002421000
+B1050524536229N00611902EA0246702427000
+B1050594536208N00611853EA0247102432000
+B1051064536187N00611804EA0248302437000
+B1051134536172N00611757EA0248502443000
+B1051204536146N00611701EA0248202447000
+B1051274536116N00611644EA0247902451000
+B1051344536089N00611588EA0246402452000
+B1051414536061N00611519EA0245102449000
+B1051484536031N00611441EA0245802443000
+B1051554536013N00611380EA0245702439000
+B1052024535996N00611319EA0246202438000
+B1052094535978N00611258EA0245902438000
+B1052164535960N00611191EA0245102439000
+B1052234535940N00611118EA0243902436000
+B1052304535917N00611026EA0243102431000
+B1052374535893N00610938EA0242202425000
+B1052444535868N00610850EA0241602420000
+B1052514535847N00610762EA0241202413000
+B1052584535829N00610683EA0241402407000
+B1053054535810N00610605EA0241002402000
+B1053124535791N00610535EA0242302398000
+B1053194535765N00610480EA0243602398000
+B1053264535741N00610437EA0247002405000
+B1053334535715N00610414EA0249002416000
+B1053404535736N00610431EA0251802430000
+B1053474535727N00610386EA0253602446000
+B1053544535684N00610371EA0255202463000
+B1054014535641N00610355EA0255102479000
+B1054084535599N00610306EA0255502492000
+B1054154535577N00610234EA0255202502000
+B1054224535560N00610149EA0253602508000
+B1054294535540N00610052EA0251702508000
+B1054364535520N00609951EA0250502505000
+B1054434535496N00609852EA0249202499000
+B1054504535470N00609753EA0248202491000
+B1054584535441N00609638EA0247402481000
+B1055054535420N00609542EA0246202475000
+B1055124535394N00609460EA0245002475000
+B1055194535367N00609371EA0243502471000
+B1055264535345N00609270EA0242202457000
+B1055334535326N00609166EA0240802445000
+B1055404535304N00609065EA0239902429000
+B1055474535273N00608971EA0238702414000
+B1055544535241N00608878EA0237602398000
+B1056014535208N00608788EA0236202385000
+B1056084535178N00608697EA0234802371000
+B1056154535149N00608607EA0233702357000
+B1056224535119N00608521EA0232502343000
+B1056294535092N00608431EA0231402330000
+B1056364535062N00608343EA0230202318000
+B1056434535026N00608264EA0229102305000
+B1056504534989N00608185EA0227902293000
+B1056574534954N00608103EA0226702280000
+B1057044534918N00608022EA0225302268000
+B1057114534882N00607941EA0224102254000
+B1057184534848N00607858EA0222702245000
+B1057254534817N00607772EA0221302235000
+B1057324534789N00607684EA0220102223000
+B1057394534759N00607596EA0218902210000
+B1057464534727N00607510EA0217702197000
+B1057534534693N00607427EA0216302184000
+B1058004534656N00607347EA0215002171000
+B1058074534618N00607266EA0213902159000
+B1058144534582N00607183EA0212802147000
+B1058214534545N00607102EA0211602134000
+B1058284534508N00607023EA0210602121000
+B1058354534473N00606946EA0209602109000
+B1058424534437N00606870EA0208602098000
+B1058494534401N00606796EA0207702087000
+B1058564534364N00606723EA0206602076000
+B1059034534328N00606649EA0205702066000
+B1059104534302N00606588EA0205002056000
+B1059174534275N00606525EA0204102055000
+B1059244534248N00606466EA0203202046000
+B1059314534220N00606409EA0202502036000
+B1059384534187N00606361EA0201802026000
+B1059454534153N00606313EA0201002016000
+B1059524534125N00606257EA0200202007000
+B1059594534098N00606201EA0199301999000
+B1100064534071N00606147EA0198301991000
+B1100134534044N00606093EA0197301981000
+B1100204534013N00606040EA0196501972000
+B1100274533985N00605988EA0195401961000
+B1100354533948N00605931EA0194601950000
+B1100424533917N00605883EA0193901940000
+B1100494533883N00605838EA0193201931000
+B1100564533849N00605793EA0192501924000
+B1101034533815N00605745EA0191901917000
+B1101104533792N00605706EA0192801913000
+B1101174533808N00605655EA0194301911000
+B1101244533843N00605666EA0195901913000
+B1101314533821N00605694EA0197101918000
+B1101384533808N00605665EA0198001924000
+B1101454533841N00605673EA0199701932000
+B1101524533821N00605709EA0200001939000
+B1101594533786N00605690EA0201001948000
+B1102064533798N00605642EA0203301958000
+B1102134533807N00605669EA0204201970000
+B1102204533776N00605653EA0206301982000
+B1102274533779N00605607EA0208801996000
+B1102344533782N00605641EA0209902009000
+B1102414533745N00605619EA0210502023000
+B1102484533758N00605591EA0211702034000
+B1102554533739N00605632EA0211802047000
+B1103024533699N00605612EA0211902056000
+B1103094533706N00605560EA0211102064000
+B1103164533713N00605507EA0209802067000
+B1103234533698N00605444EA0210202069000
+B1103304533683N00605385EA0210002069000
+B1103374533671N00605334EA0210702070000
+B1103444533648N00605322EA0210402071000
+B1103514533674N00605307EA0210202070000
+B1103584533671N00605241EA0211502069000
+B1104054533661N00605182EA0211402070000
+B1104124533645N00605124EA0210702072000
+B1104194533625N00605066EA0209102070000
+B1104264533607N00605001EA0208102066000
+B1104334533588N00604938EA0207502062000
+B1104404533566N00604872EA0207002058000
+B1104474533546N00604808EA0205802052000
+B1104544533527N00604743EA0204602045000
+B1105014533505N00604679EA0204202037000
+B1105084533483N00604617EA0203302030000
+B1105154533463N00604556EA0202502022000
+B1105224533444N00604496EA0201602015000
+B1105294533421N00604439EA0200902007000
+B1105364533400N00604376EA0200201999000
+B1105434533378N00604312EA0199601992000
+B1105504533356N00604252EA0199001986000
+B1105574533336N00604188EA0198501979000
+B1106044533316N00604125EA0198201974000
+B1106114533295N00604063EA0197801968000
+B1106184533271N00604003EA0197101963000
+B1106254533247N00603940EA0196401958000
+B1106334533216N00603871EA0196301952000
+B1106404533188N00603820EA0195501948000
+B1106474533171N00603768EA0195101944000
+B1106544533160N00603712EA0194001937000
+B1107014533145N00603661EA0194201932000
+B1107084533134N00603617EA0193601926000
+B1107154533116N00603581EA0193401921000
+B1107224533117N00603533EA0193701916000
+B1107294533139N00603487EA0194201914000
+B1107364533178N00603471EA0194401912000
+B1107434533195N00603508EA0194801912000
+B1107504533165N00603511EA0195501912000
+B1107574533170N00603468EA0195901914000
+B1108044533197N00603496EA0196001916000
+B1108114533187N00603550EA0197301918000
+B1108184533169N00603544EA0197701922000
+B1108254533205N00603542EA0198601927000
+B1108324533220N00603591EA0199301934000
+B1108394533190N00603584EA0199901940000
+B1108464533213N00603579EA0200301946000
+B1108534533192N00603616EA0200501951000
+B1109004533172N00603583EA0201201955000
+B1109074533199N00603562EA0201101960000
+B1109144533183N00603592EA0200901964000
+B1109214533150N00603588EA0201201967000
+B1109284533168N00603547EA0200601969000
+B1109354533180N00603587EA0200701969000
+B1109424533152N00603624EA0200401969000
+B1109494533126N00603594EA0199101969000
+B1109564533155N00603554EA0198201967000
+B1110034533199N00603556EA0199701964000
+B1110104533208N00603589EA0200301964000
+B1110174533191N00603553EA0201901967000
+B1110244533222N00603534EA0202401972000
+B1110314533209N00603570EA0202801976000
+B1110384533208N00603533EA0203701979000
+B1110454533219N00603562EA0203701982000
+B1110524533202N00603531EA0203901986000
+B1110594533234N00603524EA0204501990000
+B1111064533221N00603554EA0204701993000
+B1111134533211N00603512EA0204501996000
+B1111204533248N00603493EA0205001999000
+B1111274533264N00603529EA0205202004000
+B1111344533241N00603559EA0205802009000
+B1111414533218N00603526EA0206002013000
+B1111484533221N00603467EA0206602017000
+B1111554533258N00603473EA0207102021000
+B1112024533235N00603484EA0208702027000
+B1112094533253N00603447EA0208902034000
+B1112164533270N00603489EA0210002040000
+B1112244533255N00603465EA0210602048000
+B1112314533288N00603470EA0211002055000
+B1112384533267N00603474EA0210602061000
+B1112454533264N00603413EA0211502066000
+B1112524533299N00603405EA0211902071000
+B1112594533277N00603399EA0212202075000
+B1113064533303N00603362EA0212202080000
+B1113134533304N00603394EA0212502083000
+B1113204533293N00603351EA0212402086000
+B1113274533326N00603345EA0211802088000
+B1113344533316N00603381EA0211802090000
+B1113414533283N00603379EA0211402090000
+B1113484533247N00603344EA0210802089000
+B1113554533212N00603305EA0210302086000
+B1114024533184N00603267EA0210002083000
+B1114094533144N00603223EA0209602079000
+B1114164533116N00603189EA0208502075000
+B1114234533080N00603140EA0207102069000
+B1114304533046N00603101EA0206402063000
+B1114374533014N00603056EA0205102056000
+B1114444532976N00603016EA0203602047000
+B1114514532938N00602968EA0202102037000
+B1114584532894N00602928EA0200702026000
+B1115054532851N00602883EA0199202013000
+B1115124532817N00602821EA0197401999000
+B1115194532785N00602754EA0195101984000
+B1115264532749N00602675EA0192901968000
+B1115334532713N00602595EA0190801950000
+B1115404532673N00602526EA0188701932000
+B1115474532631N00602460EA0187201916000
+B1115544532589N00602388EA0185901899000
+B1116014532550N00602321EA0184801882000
+B1116084532512N00602257EA0184001865000
+B1116154532474N00602195EA0183101851000
+B1116224532437N00602134EA0182001837000
+B1116294532400N00602072EA0180901824000
+B1116364532363N00602013EA0179901811000
+B1116434532325N00601960EA0178901799000
+B1116504532287N00601914EA0177801788000
+B1116574532250N00601868EA0176801776000
+B1117044532207N00601835EA0175801767000
+B1117114532164N00601811EA0174801758000
+B1117184532123N00601777EA0173801748000
+B1117254532082N00601739EA0172801738000
+B1117324532041N00601695EA0171701727000
+B1117394532002N00601657EA0170901716000
+B1117464531963N00601621EA0169901705000
+B1117534531929N00601577EA0167801694000
+B1118014531883N00601536EA0167201679000
+B1118084531842N00601500EA0165601668000
+B1118154531805N00601460EA0164301656000
+B1118224531770N00601419EA0163201644000
+B1118294531733N00601379EA0161601632000
+B1118364531697N00601332EA0160001619000
+B1118434531666N00601285EA0158701606000
+B1118504531636N00601242EA0157301593000
+B1118574531603N00601198EA0155701579000
+B1119044531565N00601153EA0154901565000
+B1119114531527N00601121EA0154101553000
+B1119184531488N00601081EA0154101542000
+B1119254531461N00601045EA0153801534000
+B1119324531428N00601009EA0153901526000
+B1119394531393N00600974EA0153601520000
+B1119464531357N00600927EA0153201515000
+B1119534531320N00600883EA0153101511000
+B1120004531287N00600842EA0152901507000
+B1120074531254N00600805EA0152301502000
+B1120144531221N00600766EA0151401498000
+B1120214531188N00600726EA0150401494000
+B1120284531156N00600681EA0149801488000
+B1120354531125N00600635EA0149101482000
+B1120424531096N00600587EA0148401476000
+B1120494531063N00600535EA0147001469000
+B1120564531030N00600486EA0146201462000
+B1121034530997N00600444EA0145501454000
+B1121104530964N00600405EA0144701448000
+B1121174530927N00600372EA0144001441000
+B1121244530889N00600340EA0143301434000
+B1121314530852N00600308EA0142601427000
+B1121384530816N00600275EA0142001420000
+B1121454530783N00600241EA0141401414000
+B1121524530749N00600207EA0140601407000
+B1121594530715N00600172EA0139801399000
+B1122064530686N00600131EA0138901393000
+B1122134530653N00600094EA0137901386000
+B1122204530616N00600061EA0136901378000
+B1122274530577N00600029EA0135901371000
+B1122344530541N00559996EA0135201363000
+B1122414530505N00559965EA0134401357000
+B1122484530469N00559932EA0133501351000
+B1122554530434N00559899EA0132601339000
+B1123024530399N00559866EA0131701326000
+B1123094530365N00559831EA0130701313000
+B1123164530329N00559799EA0129801303000
+B1123234530290N00559772EA0128801294000
+B1123304530251N00559745EA0127801289000
+B1123374530212N00559717EA0126801277000
+B1123444530174N00559685EA0125901265000
+B1123514530139N00559650EA0125001255000
+B1123584530103N00559618EA0124001244000
+B1124054530067N00559582EA0122901235000
+B1124134530024N00559541EA0122101223000
+B1124204529987N00559507EA0121001211000
+B1124274529949N00559475EA0120201201000
+B1124344529916N00559439EA0119401191000
+B1124414529885N00559400EA0118501181000
+B1124484529853N00559364EA0117101172000
+B1124554529824N00559324EA0116001162000
+B1125024529795N00559291EA0114701150000
+B1125094529765N00559256EA0113501138000
+B1125164529738N00559219EA0112801126000
+B1125234529709N00559183EA0112001115000
+B1125304529679N00559148EA0111201106000
+B1125374529649N00559111EA0110301097000
+B1125444529623N00559072EA0109501088000
+B1125514529592N00559036EA0108701078000
+B1125584529564N00558998EA0108201070000
+B1126054529543N00558956EA0107601063000
+B1126124529523N00558911EA0106801056000
+B1126194529499N00558870EA0106101049000
+B1126264529468N00558831EA0105201043000
+B1126334529433N00558799EA0104401036000
+B1126404529407N00558759EA0103601027000
+B1126474529384N00558719EA0102301019000
+B1126544529360N00558684EA0101901009000
+B1127014529332N00558657EA0100701001000
+B1127084529302N00558626EA0099700991000
+B1127154529276N00558589EA0098600985000
+B1127224529250N00558554EA0097900975000
+B1127294529214N00558527EA0096900962000
+B1127364529183N00558493EA0095900950000
+B1127434529154N00558459EA0095100938000
+B1127504529115N00558435EA0094300927000
+B1127574529073N00558420EA0093800918000
+B1128044529034N00558393EA0092800911000
+B1128114528991N00558378EA0091700903000
+B1128184528949N00558359EA0090900895000
+B1128254528902N00558347EA0089900888000
+B1128324528862N00558319EA0088500880000
+B1128394528820N00558281EA0087500870000
+B1128464528771N00558268EA0086800859000
+B1128534528720N00558271EA0085800849000
+B1129004528669N00558279EA0084700839000
+B1129074528616N00558294EA0083500829000
+B1129144528562N00558306EA0082400819000
+B1129214528512N00558320EA0082800810000
+B1129284528494N00558354EA0082500802000
+B1129354528497N00558316EA0082500795000
+B1129424528468N00558280EA0082400789000
+B1129494528425N00558289EA0082000784000
+B1129564528384N00558311EA0081100779000
+B1130034528339N00558335EA0080000773000
+B1130104528288N00558354EA0079300767000
+B1130184528230N00558374EA0078500759000
+B1130254528177N00558369EA0077300753000
+B1130324528126N00558354EA0077600746000
+B1130394528114N00558303EA0079000742000
+B1130464528132N00558322EA0078500741000
+B1130534528090N00558348EA0079800740000
+B1131004528057N00558318EA0080600742000
+B1131074528076N00558317EA0082200746000
+B1131144528045N00558321EA0083600752000
+B1131214528066N00558305EA0085200761000
+B1131284528046N00558334EA0087100772000
+B1131354528048N00558294EA0088800784000
+B1131424528058N00558330EA0089300797000
+B1131494528015N00558328EA0091700806000
+B1131564528002N00558289EA0092900818000
+B1132034528018N00558319EA0095400829000
+B1132104527992N00558342EA0097100847000
+B1132174527997N00558296EA0098900862000
+B1132244527989N00558330EA0100900879000
+B1132314527978N00558295EA0102500891000
+B1132384528001N00558304EA0103200906000
+B1132454527981N00558344EA0103900921000
+B1132524527955N00558318EA0106100931000
+B1132594527976N00558306EA0107000950000
+B1133064527959N00558354EA0107700966000
+B1133134527916N00558353EA0109100981000
+B1133204527908N00558303EA0109600994000
+B1133274527933N00558266EA0110701008000
+B1133344527919N00558309EA0110601019000
+B1133414527876N00558319EA0111601029000
+B1133484527856N00558270EA0112201035000
+B1133554527869N00558216EA0114101044000
+B1134024527870N00558242EA0116001053000
+B1134094527859N00558210EA0117501065000
+B1134164527862N00558236EA0119001076000
+B1134234527837N00558200EA0120801091000
+B1134304527858N00558199EA0122601109000
+B1134374527826N00558215EA0124501127000
+B1134444527823N00558177EA0126501144000
+B1134514527827N00558218EA0127801160000
+B1134584527799N00558196EA0129201175000
+B1135054527812N00558156EA0131601192000
+B1135124527810N00558190EA0133201209000
+B1135194527787N00558157EA0134901228000
+B1135264527801N00558175EA0136501245000
+B1135334527773N00558173EA0137701260000
+B1135404527786N00558144EA0139301276000
+B1135474527790N00558181EA0140601295000
+B1135544527763N00558163EA0141801313000
+B1136024527794N00558167EA0143301331000
+B1136094527779N00558213EA0143601345000
+B1136164527763N00558175EA0144101357000
+B1136234527773N00558131EA0145101368000
+B1136304527799N00558121EA0145701377000
+B1136374527780N00558160EA0146001386000
+B1136444527755N00558125EA0147101394000
+B1136514527744N00558074EA0147101403000
+B1136584527735N00558014EA0145701408000
+B1137054527725N00557938EA0143601408000
+B1137124527725N00557865EA0142401404000
+B1137194527714N00557812EA0142501400000
+B1137264527710N00557753EA0142401396000
+B1137334527702N00557697EA0141501391000
+B1137404527699N00557641EA0140701386000
+B1137474527695N00557589EA0139801380000
+B1137544527684N00557535EA0137901373000
+B1138014527677N00557477EA0135801364000
+B1138084527667N00557423EA0136601353000
+B1138154527654N00557372EA0136801347000
+B1138224527653N00557312EA0135801340000
+B1138294527650N00557248EA0135701334000
+B1138364527649N00557189EA0134501328000
+B1138434527650N00557132EA0134801322000
+B1138504527642N00557075EA0135201319000
+B1138574527640N00557020EA0134801317000
+B1139044527637N00556962EA0133701312000
+B1139114527635N00556903EA0134501308000
+B1139184527632N00556848EA0134901305000
+B1139254527629N00556792EA0136301305000
+B1139324527614N00556735EA0137501306000
+B1139394527594N00556684EA0138901308000
+B1139464527573N00556647EV0139601310000
+B1139534527546N00556608EA0140701317000
+B1140004527530N00556569EA0140901320000
+B1140074527509N00556529EA0140701320000
+B1140144527486N00556492EA0140701324000
+B1140214527466N00556510EA0139301327000
+B1140284527503N00556537EA0139601331000
+B1140354527521N00556558EV0139401333000
+B1140424527547N00556603EA0140201334000
+B1140494527583N00556640EA0140401338000
+B1140564527617N00556671EA0141901342000
+B1141034527652N00556692EA0144101347000
+B1141104527636N00556727EA0146101350000
+B1141174527615N00556706EA0147701356000
+B1141244527618N00556713EA0150301360000
+B1141314527650N00556706EA0152201371000
+B1141384527652N00556750EA0155001386000
+B1141464527623N00556715EA0157301414000
+B1141534527657N00556709EA0158701439000
+B1142004527657N00556763EA0159501461000
+B1142074527620N00556742EA0160301479000
+B1142144527607N00556678EA0162201500000
+B1142214527636N00556659EA0164301521000
+B1142284527617N00556673EA0165601539000
+B1142354527617N00556627EA0167301559000
+B1142424527650N00556604EA0168801574000
+B1142494527637N00556640EA0171201584000
+B1142564527635N00556593EA0172901600000
+B1143034527666N00556599EA0173901619000
+B1143104527644N00556635EA0176301639000
+B1143174527632N00556598EA0178701660000
+B1143244527660N00556618EA0180401682000
+B1143314527632N00556645EA0182401704000
+B1143384527615N00556593EA0184501725000
+B1143454527609N00556560EV0186801740000
+B1143524527612N00556552EA0187901751000
+B1143594527630N00556519EA0190201770000
+B1144064527619N00556470EA0191201784000
+B1144134527580N00556453EA0190401801000
+B1144204527533N00556444EA0190801807000
+B1144274527491N00556440EA0190601821000
+B1144344527453N00556436EA0189701830000
+B1144414527412N00556435EA0188901839000
+B1144484527369N00556433EA0188101843000
+B1144554527329N00556433EA0187001844000
+B1145024527288N00556439EA0186101842000
+B1145094527247N00556440EA0185301838000
+B1145164527207N00556435EA0184301833000
+B1145234527166N00556435EA0183301827000
+B1145304527126N00556442EA0182001819000
+B1145374527084N00556448EA0180901810000
+B1145444527042N00556455EA0179501801000
+B1145514527001N00556457EA0178501790000
+B1145584526961N00556466EA0177801779000
+B1146054526925N00556470EA0176701770000
+B1146124526886N00556470EA0175001760000
+B1146194526845N00556474EA0173601749000
+B1146264526801N00556492EA0172401736000
+B1146334526752N00556511EA0171801724000
+B1146404526703N00556522EA0170701713000
+B1146474526652N00556528EA0169701703000
+B1146544526600N00556526EA0168401692000
+B1147014526545N00556518EA0167901681000
+B1147084526492N00556513EA0168501676000
+B1147154526447N00556510EA0169501671000
+B1147224526404N00556494EA0171501668000
+B1147294526364N00556473EA0172801670000
+B1147374526313N00556462EA0173701675000
+B1147444526270N00556459EA0174801682000
+B1147514526229N00556453EA0175501688000
+B1147584526190N00556447EA0176201696000
+B1148054526151N00556436EA0177001704000
+B1148124526111N00556418EA0177401714000
+B1148194526064N00556408EA0177401722000
+B1148264526017N00556391EA0176801727000
+B1148334525979N00556380EA0177101728000
+B1148404525942N00556370EA0177401730000
+B1148474525898N00556350EA0177301731000
+B1148544525851N00556329EA0177301730000
+B1149014525806N00556302EA0177501730000
+B1149084525773N00556274EA0178001732000
+B1149154525743N00556241EA0179001735000
+B1149224525705N00556211EA0180501737000
+B1149294525671N00556178EA0180601744000
+B1149364525631N00556162EA0181201749000
+B1149434525607N00556138EA0183501757000
+B1149504525612N00556156EA0184501767000
+B1149574525605N00556123EA0186901778000
+B1150044525611N00556146EA0188201791000
+B1150114525615N00556091EA0190901803000
+B1150184525593N00556095EA0192901815000
+B1150254525611N00556069EA0195501831000
+B1150324525591N00556037EA0197401851000
+B1150394525605N00556065EA0199701866000
+B1150464525609N00556026EA0201901884000
+B1150534525592N00556046EA0203801905000
+B1151004525622N00556039EA0206801925000
+B1151074525602N00556001EA0208201947000
+B1151144525567N00555978EA0210101970000
+B1151214525536N00555953EA0213001993000
+B1151284525554N00555922EA0214502017000
+B1151354525542N00555965EA0215902035000
+B1151424525505N00555960EA0218002056000
+B1151494525465N00555934EA0219202078000
+B1151564525422N00555911EA0220402097000
+B1152034525383N00555886EA0221502115000
+B1152104525346N00555860EA0221102129000
+B1152174525301N00555847EA0220302139000
+B1152244525262N00555834EA0219502146000
+B1152314525221N00555818EA0218802149000
+B1152384525182N00555802EA0219302151000
+B1152454525145N00555788EA0219902154000
+B1152524525105N00555783EA0220602157000
+B1152594525069N00555774EA0221402162000
+B1153064525035N00555768EA0221202167000
+B1153134524998N00555759EA0221502170000
+B1153214524952N00555744EA0220802173000
+B1153284524914N00555724EA0220302174000
+B1153354524875N00555697EA0219302172000
+B1153424524841N00555665EA0219102169000
+B1153494524803N00555632EA0219202167000
+B1153564524764N00555604EA0219602165000
+B1154034524736N00555585EA0221002166000
+B1154104524713N00555574EA0222802170000
+B1154174524684N00555565EA0224302177000
+B1154244524649N00555553EA0226402187000
+B1154314524619N00555526EA0228402199000
+B1154384524594N00555509EA0229302212000
+B1154454524563N00555499EA0229502224000
+B1154524524532N00555484EA0230402235000
+B1154594524501N00555471EA0231002244000
+B1155064524463N00555449EA0230202251000
+B1155134524428N00555422EA0228802254000
+B1155204524390N00555390EA0227302253000
+B1155274524354N00555374EA0226002250000
+B1155344524318N00555347EA0224102244000
+B1155414524281N00555310EA0221502234000
+B1155484524246N00555264EA0221002221000
+B1155554524215N00555222EA0220102210000
+B1156024524182N00555185EA0220202199000
+B1156094524150N00555156EA0219402191000
+B1156164524114N00555124EA0220302183000
+B1156234524084N00555103EA0220302180000
+B1156304524051N00555090EA0219602178000
+B1156374524015N00555081EA0218402174000
+B1156444523980N00555065EA0218602169000
+B1156514523954N00555046EA0219002165000
+B1156584523929N00555022EA0219702164000
+B1157054523897N00554991EA0219902164000
+B1157124523864N00554952EA0218702164000
+B1157194523830N00554917EA0218902163000
+B1157264523792N00554910EA0218902162000
+B1157334523757N00554891EA0219902162000
+B1157404523720N00554872EA0221302163000
+B1157474523688N00554849EA0221802164000
+B1157544523647N00554837EA0221802168000
+B1158014523611N00554828EV0222802171000
+B1158084523568N00554798EA0224102172000
+B1158154523530N00554786EA0224302176000
+B1158224523489N00554771EA0224202178000
+B1158304523455N00554750EV0225002180000
+B1158364523411N00554732EA0225402181000
+B1158434523368N00554733EA0225902182000
+B1158504523327N00554722EA0226902189000
+B1158574523284N00554707EA0225902197000
+B1159044523241N00554696EA0226202204000
+B1159124523203N00554698EV0226102208000
+B1159194523145N00554687EA0226502211000
+B1159264523104N00554678EA0226302215000
+B1159334523076N00554667EV0226802217000
+B1159404523028N00554639EA0226302219000
+B1159474522987N00554607EA0224902223000
+B1159544522943N00554581EA0223502223000
+B1200014522889N00554553EA0221302218000
+B1200084522822N00554530EA0219902211000
+B1200154522799N00554518EV0220302210000
+B1200224522726N00554479EA0221102201000
+B1200294522700N00554465EA0222402193000
+B1200364522668N00554446EA0223402191000
+B1200434522634N00554430EA0223902191000
+B1200504522591N00554411EA0223902193000
+B1200574522553N00554383EA0225402195000
+B1201044522520N00554362EA0226802200000
+B1201114522487N00554336EA0227902207000
+B1201184522445N00554318EA0228302209000
+B1201254522407N00554301EA0227702216000
+B1201324522367N00554278EA0227102222000
+B1201394522325N00554248EA0226702225000
+B1201464522282N00554227EA0226002225000
+B1201534522244N00554208EA0226402226000
+B1202004522216N00554193EV0228002227000
+B1202074522185N00554163EA0229602230000
+B1202144522158N00554135EA0231402237000
+B1202214522128N00554113EA0233002242000
+B1202284522095N00554088EA0234602251000
+B1202354522069N00554061EA0234502264000
+B1202424522034N00554039EA0235502274000
+B1202494521998N00554013EA0235402283000
+B1202564521965N00553993EA0235402291000
+B1203034521928N00553972EA0235502297000
+B1203104521898N00553945EA0236102303000
+B1203174521867N00553930EA0236202308000
+B1203244521829N00553917EA0236402312000
+B1203314521787N00553907EA0237402315000
+B1203384521746N00553898EA0239502320000
+B1203454521712N00553889EA0240602328000
+B1203524521683N00553893EA0239802331000
+B1203594521647N00553884EA0240002338000
+B1204064521609N00553880EA0240902344000
+B1204134521577N00553866EA0241502350000
+B1204214521545N00553851EV0243502350000
+B1204274521511N00553829EA0244902356000
+B1204344521483N00553803EA0245902367000
+B1204424521455N00553796EV0246902376000
+B1204484521409N00553783EA0245602381000
+B1204554521382N00553761EA0244902391000
+B1205034521358N00553740EA0244502399000
+B1205104521331N00553710EA0244602403000
+B1205174521303N00553670EA0243302404000
+B1205244521273N00553626EA0241302402000
+B1205314521244N00553579EA0239702397000
+B1205384521217N00553531EA0239002391000
+B1205454521194N00553494EA0238102386000
+B1205524521169N00553458EA0236702379000
+B1205594521139N00553432EA0235302372000
+B1206064521108N00553406EA0233102362000
+B1206134521070N00553367EA0231202348000
+B1206204521031N00553325EA0229702333000
+B1206274520991N00553281EA0227802321000
+B1206344520944N00553245EA0227102309000
+B1206414520913N00553216EA0226502300000
+B1206484520885N00553189EA0226702289000
+B1206554520863N00553165EA0225902278000
+B1207024520833N00553150EA0224802267000
+B1207094520800N00553125EA0223202256000
+B1207164520766N00553098EA0223402244000
+B1207234520730N00553075EA0223102234000
+B1207304520694N00553053EA0224102227000
+B1207374520667N00553022EA0224802223000
+B1207444520634N00552999EA0225302221000
+B1207514520604N00552976EA0224502220000
+B1207584520570N00552953EA0225302219000
+B1208054520536N00552930EA0225502219000
+B1208124520507N00552913EA0224202219000
+B1208194520476N00552890EA0223802219000
+B1208264520440N00552865EA0224002217000
+B1208334520407N00552834EA0225702214000
+B1208404520392N00552796EA0227002215000
+B1208474520414N00552779EA0228802217000
+B1208544520408N00552810EA0230302221000
+B1209014520380N00552792EA0231902230000
+B1209084520355N00552769EA0233002241000
+B1209154520329N00552739EA0233502254000
+B1209224520294N00552714EA0234602265000
+B1209294520259N00552697EA0236102277000
+B1209364520226N00552677EA0238202290000
+B1209434520200N00552649EA0239502305000
+B1209504520173N00552620EA0239602318000
+B1209574520141N00552598EA0239702328000
+B1210044520111N00552575EA0240702336000
+B1210114520079N00552565EA0240302342000
+B1210184520043N00552545EA0240602348000
+B1210254520018N00552526EA0240002354000
+B1210324519993N00552501EA0240402357000
+B1210394519968N00552469EA0241102360000
+B1210464519941N00552436EA0242102363000
+B1210534519910N00552411EA0243802368000
+B1211014519875N00552380EA0245302374000
+B1211084519850N00552355EA0246202383000
+B1211154519818N00552332EA0244702391000
+B1211224519774N00552304EA0243402395000
+B1211294519738N00552277EA0243002398000
+B1211364519702N00552259EA0243002399000
+B1211434519671N00552248EA0244402400000
+B1211504519639N00552225EA0244002402000
+B1211574519606N00552200EA0243802403000
+B1212044519578N00552174EA0242002403000
+B1212114519539N00552156EA0240702399000
+B1212184519500N00552138EA0241102394000
+B1212254519464N00552127EA0241202392000
+B1212324519430N00552112EA0239702390000
+B1212394519395N00552086EA0238202384000
+B1212464519360N00552057EA0236402376000
+B1212534519316N00552027EA0235802367000
+B1213004519278N00552001EA0234902358000
+B1213074519247N00551971EA0233002349000
+B1213144519211N00551952EA0231602340000
+B1213214519173N00551942EA0231702329000
+B1213284519135N00551933EA0232302319000
+B1213354519100N00551917EA0234102313000
+B1213424519071N00551895EA0235502311000
+B1213494519037N00551876EA0238002313000
+B1213564519046N00551890EA0239902316000
+B1214034519048N00551845EA0241902322000
+B1214104519021N00551832EA0243802333000
+B1214174519049N00551853EA0245802343000
+B1214244519071N00551796EA0247702360000
+B1214314519077N00551727EA0249102377000
+B1214384519081N00551665EA0250702396000
+B1214454519085N00551616EA0252102415000
+B1214524519081N00551569EA0252002432000
+B1214594519070N00551521EA0250802444000
+B1215064519052N00551467EA0249702451000
+B1215134519027N00551413EA0249602454000
+B1215204519001N00551375EA0249302456000
+B1215274518971N00551327EA0248802458000
+B1215344518945N00551276EA0248702459000
+B1215414518921N00551227EA0249002459000
+B1215484518892N00551190EA0248402458000
+B1215554518862N00551154EA0250002457000
+B1216024518838N00551119EA0250102459000
+B1216094518818N00551073EA0251202462000
+B1216164518795N00551024EA0253302468000
+B1216234518802N00550967EA0254702477000
+B1216304518832N00550993EA0256002486000
+B1216374518811N00551006EA0258102498000
+B1216444518798N00550963EA0259502512000
+B1216514518782N00550916EA0258802526000
+B1216584518756N00550866EA0258002535000
+B1217064518721N00550819EA0257202542000
+B1217134518684N00550778EA0255702543000
+B1217204518639N00550725EA0254202540000
+B1217274518596N00550671EA0253302535000
+B1217344518562N00550622EA0252802529000
+B1217414518532N00550570EA0251402522000
+B1217484518503N00550526EA0250202514000
+B1217554518477N00550488EA0249502506000
+B1218024518446N00550445EA0247302497000
+B1218094518409N00550401EA0245902485000
+B1218164518373N00550362EA0245002474000
+B1218234518337N00550329EA0244102464000
+B1218304518307N00550291EA0243402454000
+B1218374518274N00550254EA0243002444000
+B1218444518239N00550219EA0242202434000
+B1218514518200N00550190EA0241602425000
+B1218584518158N00550167EA0240802416000
+B1219054518113N00550148EA0240102414000
+B1219124518072N00550117EA0239502406000
+B1219194518035N00550082EA0238902397000
+B1219264517997N00550046EA0238302389000
+B1219334517963N00550009EA0237302380000
+B1219404517932N00549962EA0236902375000
+B1219474517898N00549928EA0237102367000
+B1219544517876N00549901EA0237102361000
+B1220024517864N00549877EV0236202358000
+B1220084517842N00549847EA0236202353000
+B1220154517823N00549819EA0234702348000
+B1220224517805N00549791EA0234102341000
+B1220304517775N00549773EA0233402332000
+B1220374517746N00549749EA0232402323000
+B1220444517720N00549722EA0230802317000
+B1220514517685N00549694EA0228402307000
+B1220584517648N00549669EA0226602295000
+B1221054517606N00549643EA0225902282000
+B1221124517563N00549615EA0225102269000
+B1221194517521N00549594EA0224402256000
+B1221264517484N00549585EA0223402245000
+B1221334517444N00549564EA0222202234000
+B1221404517406N00549537EA0221102222000
+B1221474517369N00549509EA0220202211000
+B1221544517333N00549484EA0219502201000
+B1222014517296N00549465EA0218302192000
+B1222084517264N00549430EA0217502182000
+B1222154517230N00549400EA0216202173000
+B1222224517200N00549370EA0214902164000
+B1222294517164N00549346EA0213502154000
+B1222364517132N00549325EA0211502142000
+B1222434517099N00549303EA0209202127000
+B1222504517066N00549276EA0207302110000
+B1222574517032N00549245EA0205802093000
+B1223044516999N00549224EA0203502077000
+B1223114516969N00549201EA0202102060000
+B1223184516949N00549180EA0200002042000
+B1223254516921N00549162EA0198602027000
+B1223324516895N00549135EA0196002009000
+B1223394516869N00549096EA0194101989000
+B1223464516846N00549054EA0193201970000
+B1223534516821N00549012EA0192701953000
+B1224004516795N00548973EA0193201939000
+B1224074516772N00548941EA0193501930000
+B1224144516743N00548917EA0195401926000
+B1224214516730N00548887EA0197501926000
+B1224284516743N00548914EA0199401929000
+B1224354516714N00548938EA0201401933000
+B1224424516688N00548919EA0202601941000
+B1224494516666N00548888EA0204201952000
+B1224564516647N00548841EA0205301961000
+B1225034516618N00548817EA0207101976000
+B1225104516587N00548798EA0208301990000
+B1225174516578N00548765EA0209602005000
+B1225244516609N00548792EA0210502013000
+B1225314516592N00548834EA0212002025000
+B1225384516564N00548822EA0215002040000
+B1225454516565N00548774EA0217802060000
+B1225524516579N00548806EA0220702081000
+B1225594516555N00548814EA0221602104000
+B1226064516531N00548783EA0220802124000
+B1226134516502N00548744EA0220202138000
+B1226204516471N00548694EA0219102147000
+B1226284516430N00548632EA0217902150000
+B1226354516398N00548595EV0216702150000
+B1226424516355N00548550EA0215202149000
+B1226494516328N00548509EA0213802143000
+B1226564516297N00548469EA0212302136000
+B1227034516266N00548432EA0210002123000
+B1227104516240N00548405EA0209302112000
+B1227174516221N00548386EV0208702103000
+B1227244516182N00548360EA0207102095000
+B1227314516152N00548333EA0205702081000
+B1227384516123N00548304EA0205102071000
+B1227454516088N00548279EA0204502059000
+B1227524516058N00548243EA0203002047000
+B1227594516026N00548206EA0201602034000
+B1228064515993N00548172EA0200002021000
+B1228134515957N00548135EA0198802006000
+B1228204515925N00548102EA0197801992000
+B1228274515900N00548076EA0197601983000
+B1228344515877N00548045EA0197001972000
+B1228414515853N00548006EA0196901963000
+B1228484515831N00547975EA0197301956000
+B1228554515803N00547942EA0196701951000
+B1229024515773N00547908EA0195801946000
+B1229094515743N00547874EA0196301941000
+B1229164515717N00547843EA0196101937000
+B1229234515687N00547818EA0195101933000
+B1229304515657N00547791EA0193901929000
+B1229374515630N00547754EA0192701923000
+B1229444515606N00547715EA0192701916000
+B1229514515590N00547683EA0194701912000
+B1229584515593N00547633EA0196701912000
+B1230054515624N00547648EA0198001917000
+B1230124515601N00547686EA0199601924000
+B1230194515572N00547668EA0200201934000
+B1230264515539N00547629EA0198901942000
+B1230334515499N00547579EA0199101947000
+B1230404515472N00547543EA0198401951000
+B1230474515438N00547517EA0196801953000
+B1230544515399N00547481EA0196101951000
+B1231014515371N00547443EA0196501948000
+B1231084515344N00547414EA0196701946000
+B1231154515321N00547382EA0198601946000
+B1231224515304N00547355EA0200001949000
+B1231294515280N00547322EA0201601955000
+B1231364515254N00547286EA0202401962000
+B1231434515227N00547245EA0204801971000
+B1231504515215N00547208EA0207501984000
+B1231574515205N00547168EA0206901997000
+B1232044515187N00547137EA0207502007000
+B1232114515163N00547109EA0206502016000
+B1232194515128N00547069EA0204702020000
+B1232264515096N00547029EA0203402018000
+B1232334515060N00546986EA0201302013000
+B1232404515031N00546942EA0200002005000
+B1232474514999N00546900EA0197801994000
+B1232544514965N00546852EA0196401981000
+B1233014514933N00546804EA0195901968000
+B1233084514907N00546766EA0194701957000
+B1233154514876N00546723EA0193601946000
+B1233224514849N00546676EA0192701936000
+B1233294514820N00546635EA0192101926000
+B1233364514789N00546591EA0190501916000
+B1233434514753N00546553EA0189301904000
+B1233504514712N00546505EA0188401892000
+B1233574514685N00546467EA0188701882000
+B1234044514652N00546433EA0189901876000
+B1234114514625N00546391EA0188801872000
+B1234184514594N00546352EA0187201866000
+B1234254514554N00546303EA0184901857000
+B1234324514513N00546242EA0182901845000
+B1234394514476N00546183EA0182501832000
+B1234464514447N00546134EA0182101821000
+B1234534514414N00546094EA0181601812000
+B1235004514375N00546066EA0181201804000
+B1235074514341N00546036EA0182001797000
+B1235144514310N00546011EA0182001794000
+B1235214514272N00545981EA0182801793000
+B1235284514241N00545939EA0183601793000
+B1235354514217N00545902EA0184701796000
+B1235424514197N00545869EA0186001802000
+B1235494514171N00545832EA0185301808000
+B1235564514146N00545798EA0184301811000
+B1236034514117N00545762EA0183301810000
+B1236104514090N00545723EA0180901805000
+B1236174514079N00545769EA0179001797000
+B1236244514091N00545824EA0177601786000
+B1236314514117N00545873EA0176601774000
+B1236384514151N00545910EA0177101767000
+B1236454514188N00545939EA0178901764000
+B1236524514214N00545973EA0179401760000
+B1236594514236N00546022EA0180401759000
+B1237064514259N00546074EA0181301760000
+B1237134514284N00546122EA0182401762000
+B1237204514313N00546161EA0183001766000
+B1237274514351N00546192EA0184201773000
+B1237344514384N00546234EA0185401783000
+B1237414514414N00546273EA0185401793000
+B1237484514442N00546307EA0184001796000
+B1237554514465N00546351EA0184401802000
+B1238024514492N00546399EA0186101806000
+B1238094514511N00546437EA0185101809000
+B1238174514541N00546495EA0186601811000
+B1238244514569N00546536EA0185401814000
+B1238314514604N00546589EA0185001815000
+B1238384514634N00546631EA0184501815000
+B1238454514670N00546691EA0185501815000
+B1238524514703N00546743EA0186601815000
+B1238594514728N00546784EA0187801819000
+B1239064514751N00546812EA0189201826000
+B1239134514773N00546836EA0189301834000
+B1239204514801N00546870EA0190001839000
+B1239274514827N00546912EA0189301846000
+B1239344514855N00546952EA0189201850000
+B1239414514890N00546986EA0188501852000
+B1239484514933N00547027EA0188801853000
+B1239554514968N00547067EA0191101854000
+B1240024514992N00547101EA0192801860000
+B1240094515021N00547134EA0193201867000
+B1240164515046N00547163EA0193801871000
+B1240234515071N00547187EA0193901878000
+B1240304515097N00547215EA0192801880000
+B1240374515124N00547237EA0191101880000
+B1240444515150N00547275EA0191301881000
+B1240514515190N00547321EA0192801881000
+B1240584515219N00547357EA0194301885000
+B1241054515254N00547394EA0195601892000
+B1241124515281N00547428EA0197301901000
+B1241194515307N00547462EA0198301911000
+B1241264515335N00547500EA0200501923000
+B1241334515360N00547534EA0200001934000
+B1241404515393N00547581EA0199101942000
+B1241474515421N00547641EA0198701947000
+B1241544515455N00547700EA0197401949000
+B1242014515496N00547756EA0194801945000
+B1242084515539N00547800EA0193001939000
+B1242154515575N00547837EA0193701931000
+B1242224515600N00547877EA0193201924000
+B1242294515632N00547919EA0191801917000
+B1242364515668N00547965EA0191601910000
+B1242434515700N00547997EA0191401904000
+B1242504515733N00548029EA0192201900000
+B1242574515768N00548071EA0194101900000
+B1243044515800N00548113EA0194001900000
+B1243114515839N00548158EA0193701900000
+B1243184515880N00548203EA0192801900000
+B1243254515919N00548252EA0191701900000
+B1243324515954N00548302EA0189501900000
+B1243394515994N00548350EA0186901900000
+B1243464516033N00548401EA0186001900000
+B1243534516072N00548452EA0183801894000
+B1244004516117N00548515EA0182001883000
+B1244084516173N00548589EA0180501861000
+B1244154516223N00548647EA0179101840000
+B1244224516270N00548698EA0177601820000
+B1244294516322N00548750EA0175801801000
+B1244364516366N00548783EA0176301783000
+B1244434516407N00548808EA0178701773000
+B1244504516444N00548835EA0180701769000
+B1244574516473N00548862EA0182601772000
+B1245044516508N00548887EA0184401778000
+B1245114516547N00548912EA0184901786000
+B1245184516588N00548931EA0186501794000
+B1245254516618N00548948EA0187301805000
+B1245324516648N00548967EA0187501815000
+B1245394516679N00548990EA0188501823000
+B1245464516718N00549005EA0188701830000
+B1245534516760N00549024EA0188601836000
+B1246004516802N00549045EA0187601839000
+B1246074516848N00549070EA0186001838000
+B1246144516899N00549093EA0184401834000
+B1246214516946N00549119EA0182701826000
+B1246284516992N00549139EA0181401817000
+B1246354517037N00549169EA0180401807000
+B1246424517080N00549195EA0180301798000
+B1246494517127N00549218EA0179801790000
+B1246564517172N00549248EA0178501782000
+B1247034517215N00549280EA0176301772000
+B1247104517265N00549314EA0175201761000
+B1247174517308N00549341EA0174501751000
+B1247244517353N00549374EA0173701741000
+B1247314517399N00549404EA0173001733000
+B1247384517445N00549438EA0172101724000
+B1247454517494N00549459EA0171401716000
+B1247524517541N00549458EA0170801709000
+B1247594517584N00549475EA0171401704000
+B1248064517626N00549492EA0172401700000
+B1248134517659N00549512EA0174101700000
+B1248204517687N00549541EA0174701703000
+B1248274517713N00549577EA0176201707000
+B1248344517732N00549613EA0177701714000
+B1248414517753N00549655EA0177701723000
+B1248484517771N00549707EA0176401728000
+B1248554517794N00549765EA0175401730000
+B1249024517817N00549826EA0174601731000
+B1249094517850N00549874EA0175901731000
+B1249164517888N00549919EA0175901732000
+B1249234517924N00549975EA0175001731000
+B1249304517952N00550032EA0174301727000
+B1249374517973N00550088EA0174301723000
+B1249444517991N00550142EA0173801721000
+B1249514518004N00550192EA0173701719000
+B1249594518026N00550256EA0172701716000
+B1250064518041N00550309EA0171701711000
+B1250134518064N00550357EA0172301705000
+B1250204518081N00550405EA0173201702000
+B1250274518087N00550444EA0172601701000
+B1250344518102N00550494EA0171901698000
+B1250414518114N00550548EA0171201694000
+B1250484518123N00550602EA0170201689000
+B1250554518139N00550652EA0168901684000
+B1251024518164N00550709EA0167301678000
+B1251094518181N00550779EA0166401670000
+B1251164518198N00550852EA0166201661000
+B1251234518214N00550903EA0167401655000
+B1251304518229N00550955EA0168301651000
+B1251374518236N00551013EA0167801649000
+B1251444518231N00551070EA0168001646000
+B1251514518228N00551119EA0169501646000
+B1251584518232N00551164EA0170701649000
+B1252054518242N00551210EA0172401654000
+B1252124518247N00551258EA0172901662000
+B1252194518272N00551308EA0175301670000
+B1252264518255N00551320EA0176701677000
+B1252334518284N00551284EA0178801685000
+B1252404518297N00551311EA0180401697000
+B1252474518290N00551274EA0181701713000
+B1252544518322N00551292EA0183101729000
+B1253014518306N00551306EA0184701742000
+B1253084518331N00551280EA0186101758000
+B1253154518350N00551318EA0187201772000
+B1253224518339N00551289EA0189701783000
+B1253294518365N00551302EA0191401785000
+B1253364518350N00551293EA0193501788000
+B1253434518380N00551303EA0196201804000
+B1253504518360N00551304EA0198101817000
+B1253574518394N00551291EA0200801843000
+B1254044518385N00551328EA0203501871000
+B1254114518389N00551287EA0206101900000
+B1254184518422N00551297EA0209001933000
+B1254254518396N00551321EA0211801956000
+B1254324518421N00551300EA0215701981000
+B1254394518430N00551336EA0217602013000
+B1254464518420N00551300EA0221502041000
+B1254534518444N00551309EA0224402073000
+B1255004518421N00551325EA0227502104000
+B1255074518442N00551293EA0231002137000
+B1255144518459N00551325EA0233202169000
+B1255214518428N00551331EA0236402201000
+B1255284518453N00551315EA0239302205000
+B1255354518494N00551347EA0241202218000
+B1255434518534N00551351EA0242702255000
+B1255504518578N00551359EA0244702288000
+B1255574518623N00551382EA0245502318000
+B1256044518664N00551409EA0247602346000
+B1256114518697N00551435EA0249502372000
+B1256184518737N00551463EA0250002396000
+B1256254518773N00551496EA0249702416000
+B1256324518814N00551527EA0250402430000
+B1256394518848N00551560EA0250502443000
+B1256464518883N00551596EA0249802451000
+B1256534518926N00551625EA0250102457000
+B1257004518972N00551644EA0252202463000
+B1257074519011N00551662EA0252602471000
+B1257144519050N00551678EA0253802480000
+B1257214519092N00551699EA0254502488000
+B1257284519137N00551724EA0253902495000
+B1257354519187N00551761EA0253602500000
+B1257424519233N00551793EA0252802503000
+B1257494519283N00551827EA0252002504000
+B1257564519330N00551866EA0250302503000
+B1258034519383N00551903EA0249002499000
+B1258104519433N00551941EA0247602494000
+B1258174519478N00551990EA0246602486000
+B1258244519521N00552038EA0245602477000
+B1258314519570N00552085EA0244302467000
+B1258384519618N00552133EA0241602454000
+B1258454519663N00552183EA0240002440000
+B1258524519703N00552215EA0239902427000
+B1258594519744N00552255EA0239102415000
+B1259064519781N00552299EA0238302403000
+B1259134519822N00552345EA0238302391000
+B1259204519863N00552393EA0238902382000
+B1259274519905N00552433EA0240102378000
+B1259344519950N00552464EA0241502376000
+B1259414519990N00552499EA0242902379000
+B1259484520023N00552532EA0243402385000
+B1259554520058N00552578EA0245002390000
+B1300024520096N00552610EA0246702397000
+B1300094520137N00552644EA0247702408000
+B1300164520173N00552681EA0247502420000
+B1300234520209N00552712EA0247902428000
+B1300304520246N00552736EA0249002436000
+B1300374520288N00552755EA0250302443000
+B1300444520331N00552770EA0251102451000
+B1300514520373N00552784EA0252302460000
+B1300584520412N00552802EA0253302469000
+B1301054520455N00552831EA0254202478000
+B1301124520491N00552866EA0253202486000
+B1301194520535N00552917EA0251202490000
+B1301274520592N00552976EA0249802491000
+B1301344520645N00553027EA0249102489000
+B1301414520694N00553070EA0249002488000
+B1301484520741N00553123EA0247702486000
+B1301554520795N00553181EA0246402481000
+B1302024520850N00553231EA0244902473000
+B1302094520904N00553277EA0243102462000
+B1302164520958N00553327EA0241802451000
+B1302234521013N00553375EA0240402438000
+B1302304521060N00553424EA0239302425000
+B1302374521104N00553471EA0237002411000
+B1302444521153N00553510EA0236302397000
+B1302514521198N00553548EA0234902383000
+B1302584521245N00553573EA0233902368000
+B1303054521294N00553588EA0233502355000
+B1303124521338N00553599EA0233302345000
+B1303194521380N00553612EA0235602338000
+B1303264521430N00553624EA0238102335000
+B1303334521473N00553626EA0240502339000
+B1303404521508N00553635EA0241002346000
+B1303474521544N00553628EA0243702356000
+B1303544521587N00553633EA0246002368000
+B1304014521629N00553647EA0247602382000
+B1304084521670N00553663EA0249202397000
+B1304154521711N00553682EA0250602413000
+B1304224521752N00553701EA0252502430000
+B1304294521793N00553714EA0253202445000
+B1304364521834N00553735EA0254702461000
+B1304434521881N00553761EA0255002474000
+B1304504521927N00553770EA0254802486000
+B1304574521976N00553788EA0254602495000
+B1305044522033N00553806EA0254302501000
+B1305114522081N00553847EA0253602504000
+B1305184522134N00553884EA0252502506000
+B1305254522192N00553922EA0250802504000
+B1305324522251N00553956EA0248802498000
+B1305394522308N00553990EA0246502488000
+B1305464522368N00554021EA0244902476000
+B1305534522434N00554057EA0243402462000
+B1306004522498N00554087EA0241802447000
+B1306074522562N00554113EA0240102432000
+B1306144522627N00554136EA0238402417000
+B1306214522692N00554162EA0236702402000
+B1306284522756N00554188EA0235202386000
+B1306354522821N00554211EA0233802370000
+B1306424522883N00554238EA0232602355000
+B1306494522939N00554263EA0232502341000
+B1306564522981N00554287EA0230202329000
+B1307034523035N00554314EA0229202316000
+B1307114523092N00554337EA0228202302000
+B1307184523140N00554360EA0226902290000
+B1307254523181N00554373EA0225602279000
+B1307324523221N00554374EA0225002269000
+B1307394523264N00554385EA0224802258000
+B1307464523305N00554395EA0225102248000
+B1307534523349N00554397EA0225002239000
+B1308004523393N00554406EA0224602233000
+B1308074523436N00554416EA0225302229000
+B1308144523475N00554424EA0225202228000
+B1308214523515N00554442EA0224402227000
+B1308284523557N00554461EA0223502224000
+B1308354523602N00554487EA0222702219000
+B1308424523647N00554512EA0221002213000
+B1308494523694N00554547EA0219402205000
+B1308564523739N00554575EA0217602196000
+B1309034523780N00554608EA0216702185000
+B1309104523818N00554646EA0215102173000
+B1309174523858N00554675EA0214502161000
+B1309244523897N00554703EA0214202150000
+B1309314523933N00554732EA0213802140000
+B1309384523969N00554765EA0213302131000
+B1309454524012N00554803EA0211902122000
+B1309524524048N00554839EA0212902116000
+B1309594524087N00554871EA0213302112000
+B1310064524123N00554905EA0214002111000
+B1310134524159N00554934EA0213702111000
+B1310204524195N00554975EA0213502110000
+B1310274524235N00555024EA0214102110000
+B1310344524272N00555065EA0215502110000
+B1310414524303N00555093EA0216802114000
+B1310484524337N00555108EA0218302120000
+B1310554524356N00555074EA0219202128000
+B1311024524343N00555103EA0220502134000
+B1311094524383N00555114EA0221502143000
+B1311164524431N00555113EA0223402154000
+B1311234524473N00555113EA0224202165000
+B1311304524511N00555110EA0225402177000
+B1311374524544N00555113EA0225302189000
+B1311444524582N00555125EA0225402198000
+B1311514524619N00555132EA0225002205000
+B1311584524659N00555135EA0225302210000
+B1312054524699N00555129EA0224402214000
+B1312124524737N00555129EA0223302215000
+B1312194524775N00555146EA0222402214000
+B1312264524816N00555171EA0220802211000
+B1312334524864N00555206EA0219102205000
+B1312404524908N00555238EA0219502199000
+B1312474524951N00555271EA0218402192000
+B1312544524985N00555315EA0218202183000
+B1313014525012N00555362EA0217102176000
+B1313094525038N00555420EA0217002167000
+B1313164525068N00555461EA0216502160000
+B1313234525110N00555504EA0215102155000
+B1313304525153N00555551EA0214102149000
+B1313374525193N00555598EA0214102141000
+B1313444525231N00555628EA0214102135000
+B1313514525267N00555651EA0213502130000
+B1313584525301N00555677EA0212602125000
+B1314054525341N00555707EA0211702118000
+B1314124525381N00555739EA0210102110000
+B1314194525424N00555764EA0208702102000
+B1314264525467N00555786EA0207802092000
+B1314334525504N00555823EA0206602084000
+B1314404525552N00555873EA0205302074000
+B1314474525603N00555920EA0204502063000
+B1314544525654N00555963EA0203602052000
+B1315014525705N00556003EA0202602040000
+B1315084525751N00556043EA0201702030000
+B1315154525786N00556067EA0201702021000
+B1315224525827N00556089EA0201302014000
+B1315294525867N00556114EA0200402007000
+B1315364525906N00556144EA0199702000000
+B1315434525946N00556173EA0198701992000
+B1315504525982N00556177EA0197901983000
+B1315574526018N00556157EA0197101975000
+B1316044526058N00556149EA0197001968000
+B1316114526087N00556129EA0195901962000
+B1316184526115N00556072EA0194201954000
+B1316254526150N00556010EA0192501945000
+B1316324526182N00555945EA0190701933000
+B1316394526212N00555876EA0189401921000
+B1316464526241N00555810EA0187801908000
+B1316534526268N00555747EA0185901894000
+B1317004526297N00555682EA0184001879000
+B1317074526324N00555620EA0182901864000
+B1317144526355N00555561EA0181701849000
+B1317214526384N00555500EA0181001835000
+B1317284526413N00555443EA0179901824000
+B1317354526450N00555387EA0179201813000
+B1317424526489N00555331EA0178701801000
+B1317494526515N00555285EA0179201791000
+B1317564526535N00555254EA0180201783000
+B1318034526555N00555228EA0180801780000
+B1318104526583N00555210EA0182001781000
+B1318174526617N00555207EA0183201785000
+B1318244526647N00555223EA0184001791000
+B1318314526619N00555245EA0184801795000
+B1318384526640N00555213EA0185701802000
+B1318454526677N00555213EA0186101809000
+B1318534526716N00555195EA0186801815000
+B1319004526742N00555171EA0187401821000
+B1319074526769N00555152EA0188801828000
+B1319144526797N00555135EA0190001836000
+B1319214526822N00555120EA0191401846000
+B1319284526848N00555107EA0193801857000
+B1319354526839N00555086EA0195101867000
+B1319424526847N00555126EA0197201875000
+B1319494526853N00555100EA0198501885000
+B1319564526848N00555139EA0199701892000
+B1320034526871N00555132EA0201301906000
+B1320104526849N00555140EA0202301922000
+B1320174526877N00555154EA0204401937000
+B1320244526855N00555142EA0205601955000
+B1320314526871N00555176EA0207401972000
+B1320384526877N00555159EA0208801990000
+B1320454526869N00555199EA0210302006000
+B1320524526878N00555177EA0212002022000
+B1320594526844N00555153EA0213902039000
+B1321064526847N00555192EA0216102057000
+B1321134526834N00555172EA0217702074000
+B1321204526847N00555209EA0220002091000
+B1321274526837N00555185EA0221502110000
+B1321344526818N00555237EA0223702128000
+B1321414526824N00555227EA0225102141000
+B1321484526802N00555268EA0227202156000
+B1321554526820N00555255EA0229202176000
+B1322024526792N00555273EA0230402196000
+B1322094526820N00555307EA0232602215000
+B1322164526803N00555276EA0234402230000
+B1322234526776N00555311EA0236002243000
+B1322304526800N00555312EA0237502262000
+B1322374526775N00555298EA0238402280000
+B1322444526781N00555354EA0240802297000
+B1322514526788N00555330EA0241602314000
+B1322584526762N00555366EA0243902332000
+B1323054526782N00555408EA0245402350000
+B1323124526814N00555387EA0246902367000
+B1323194526848N00555388EA0247902384000
+B1323264526886N00555384EA0250002402000
+B1323334526921N00555381EA0250502418000
+B1323404526958N00555377EA0251002432000
+B1323474526997N00555371EA0251502444000
+B1323544527036N00555375EA0251602455000
+B1324014527077N00555372EA0250902463000
+B1324084527120N00555368EA0249502466000
+B1324154527173N00555374EA0249102467000
+B1324234527226N00555379EA0248302464000
+B1324304527271N00555376EA0248502462000
+B1324374527315N00555381EA0248402460000
+B1324444527359N00555387EA0248702458000
+B1324514527399N00555387EA0249402458000
+B1324584527440N00555390EA0250102460000
+B1325054527483N00555385EA0249702462000
+B1325124527530N00555382EA0249602463000
+B1325194527579N00555375EA0249402464000
+B1325264527627N00555377EA0249302465000
+B1325334527674N00555397EA0249002465000
+B1325404527722N00555409EA0248502465000
+B1325474527773N00555413EA0247602463000
+B1325544527824N00555423EA0246802460000
+B1326014527875N00555435EA0245402455000
+B1326084527927N00555455EA0244502448000
+B1326154527976N00555480EA0243402440000
+B1326224528019N00555517EA0242602433000
+B1326294528062N00555554EA0241102427000
+B1326364528112N00555595EA0240102419000
+B1326434528159N00555643EA0238902410000
+B1326504528206N00555692EA0237502407000
+B1326574528254N00555744EA0236602395000
+B1327044528303N00555798EA0235602381000
+B1327114528354N00555854EA0234402372000
+B1327184528410N00555910EA0233102363000
+B1327254528463N00555960EA0231602350000
+B1327324528508N00556013EA0230502335000
+B1327394528552N00556052EA0229102322000
+B1327464528602N00556095EA0227902307000
+B1327534528652N00556140EA0227202293000
+B1328004528700N00556185EA0226502279000
+B1328074528748N00556229EA0225702267000
+B1328144528794N00556273EA0225002257000
+B1328214528837N00556327EA0224202246000
+B1328284528880N00556382EA0223602237000
+B1328354528925N00556432EA0222602229000
+B1328424528973N00556485EA0221702225000
+B1328494529015N00556531EA0221102218000
+B1328564529058N00556576EA0220402210000
+B1329034529099N00556624EA0219202201000
+B1329104529137N00556675EA0218202192000
+B1329174529171N00556732EA0216902182000
+B1329244529205N00556791EA0215602171000
+B1329314529239N00556844EA0214202160000
+B1329384529273N00556898EA0212902148000
+B1329454529307N00556951EA0211902136000
+B1329524529344N00556991EA0210702124000
+B1329594529384N00557030EA0209602114000
+B1330064529423N00557076EA0208802104000
+B1330134529463N00557126EA0207602093000
+B1330204529504N00557175EA0207002081000
+B1330284529550N00557226EA0206302070000
+B1330354529588N00557276EA0205602060000
+B1330424529626N00557327EA0204902052000
+B1330494529664N00557378EA0204102045000
+B1330564529701N00557425EA0203702036000
+B1331034529735N00557473EA0203002028000
+B1331104529771N00557521EA0202302020000
+B1331174529807N00557570EA0201502012000
+B1331244529839N00557622EA0200502003000
+B1331314529869N00557676EA0199601995000
+B1331384529899N00557726EA0198701986000
+B1331454529932N00557774EA0197801977000
+B1331524529966N00557822EA0196801968000
+B1331594530000N00557872EA0195901958000
+B1332064530032N00557924EA0195101948000
+B1332134530063N00557979EA0194101939000
+B1332204530095N00558033EA0193301930000
+B1332274530124N00558084EA0192601922000
+B1332344530156N00558129EA0191901915000
+B1332414530191N00558168EA0191001907000
+B1332484530226N00558213EA0190101900000
+B1332554530262N00558257EA0189601895000
+B1333024530296N00558302EA0189101887000
+B1333094530329N00558348EA0188501882000
+B1333164530361N00558393EA0187601875000
+B1333234530393N00558439EA0186801867000
+B1333304530425N00558486EA0185901859000
+B1333374530459N00558529EA0184901851000
+B1333444530493N00558571EA0183801843000
+B1333514530529N00558614EA0183001837000
+B1333584530565N00558657EA0182101828000
+B1334054530602N00558702EA0181201819000
+B1334124530637N00558744EA0180401809000
+B1334194530672N00558787EA0179701800000
+B1334264530705N00558832EA0179001790000
+B1334334530739N00558875EA0178101783000
+B1334404530773N00558918EA0177501776000
+B1334474530806N00558959EA0176701769000
+B1334544530839N00559000EA0175901763000
+B1335014530871N00559039EA0175101758000
+B1335084530902N00559082EA0174201750000
+B1335154530933N00559123EA0173101742000
+B1335224530963N00559169EA0172501733000
+B1335294530992N00559215EA0171901727000
+B1335364531017N00559261EA0171201724000
+B1335434531042N00559316EA0170501715000
+B1335504531066N00559371EA0170001706000
+B1335574531092N00559426EA0169201696000
+B1336044531118N00559478EA0168501688000
+B1336124531145N00559533EA0167801684000
+B1336194531174N00559583EA0167001677000
+B1336264531205N00559628EA0166001671000
+B1336334531239N00559671EA0164901666000
+B1336404531271N00559716EA0163601659000
+B1336474531304N00559762EA0162401655000
+B1336544531337N00559805EA0161101646000
+B1337014531369N00559844EA0160101633000
+B1337084531403N00559885EA0159001631000
+B1337154531435N00559920EA0157801616000
+B1337224531465N00559964EA0156601611000
+B1337294531492N00600011EA0155501600000
+B1337364531519N00600058EA0154601586000
+B1337434531547N00600106EA0153801570000
+B1337504531573N00600156EA0153201558000
+B1337574531600N00600207EA0152101549000
+B1338044531629N00600266EA0151201539000
+B1338114531656N00600324EA0150401526000
+B1338184531682N00600379EA0149601513000
+B1338254531702N00600432EA0148401500000
+B1338324531722N00600489EA0147101487000
+B1338394531744N00600547EA0145801473000
+B1338464531760N00600595EA0144301460000
+B1338534531779N00600645EA0143001447000
+B1339004531808N00600697EA0141901433000
+B1339074531833N00600746EA0140501419000
+B1339144531855N00600786EA0138801406000
+B1339214531871N00600837EA0138101393000
+B1339284531887N00600886EA0136301381000
+B1339354531912N00600927EA0134901368000
+B1339424531939N00600971EA0133401354000
+B1339494531961N00601019EA0132201340000
+B1339564531983N00601065EA0130601327000
+B1340034532006N00601116EA0129001313000
+B1340104532026N00601173EA0127901299000
+B1340174532040N00601239EA0128201287000
+B1340244532057N00601301EA0128701277000
+B1340314532067N00601374EA0129701271000
+B1340384532043N00601456EA0130701269000
+B1340454532007N00601499EA0130701268000
+B1340524531974N00601529EA0131201267000
+B1340594531965N00601506EA0130601268000
+B1341064531997N00601497EA0132301268000
+B1341134532014N00601488EA0132901270000
+B1341204531990N00601507EA0132801273000
+B1341274531987N00601528EA0134701273000
+B1341344531987N00601522EA0135501276000
+B1341414531997N00601577EA0135601283000
+B1341484532022N00601576EA0137701287000
+B1341554532041N00601569EA0139401291000
+B1342024532051N00601568EA0141001299000
+B1342104532064N00601571EA0142201310000
+B1342174532075N00601559EA0143401321000
+B1342244532093N00601555EA0143901337000
+B1342314532112N00601555EA0144601352000
+B1342384532133N00601555EA0143901364000
+B1342454532161N00601559EA0143501375000
+B1342524532189N00601556EA0143101379000
+B1342594532218N00601551EA0142701381000
+B1343064532248N00601547EA0142801383000
+B1343134532281N00601551EA0142201383000
+B1343204532315N00601556EA0142001383000
+B1343274532344N00601558EA0141601382000
+B1343344532377N00601562EA0141901380000
+B1343414532411N00601566EA0142401379000
+B1343484532443N00601584EA0143301380000
+B1343554532431N00601639EA0144301384000
+B1344024532422N00601618EA0145401390000
+B1344094532447N00601646EA0146301396000
+B1344164532425N00601698EA0146901404000
+B1344234532414N00601679EA0148501410000
+B1344304532445N00601710EA0148901422000
+B1344374532421N00601768EA0150401432000
+B1344444532404N00601755EA0151401439000
+B1344514532412N00601735EA0152401448000
+B1344584532443N00601765EA0152901459000
+B1345054532418N00601801EA0153201467000
+B1345124532441N00601805EA0154301474000
+B1345194532478N00601843EA0153301481000
+B1345264532519N00601887EA0153801486000
+B1345334532557N00601921EA0152201488000
+B1345404532590N00601969EA0152501489000
+B1345474532613N00602015EA0150901488000
+B1345544532639N00602061EA0149801484000
+B1346014532667N00602115EA0148501478000
+B1346084532697N00602166EA0146801469000
+B1346154532722N00602213EA0144601457000
+B1346224532749N00602274EA0142401443000
+B1346294532774N00602344EA0140101429000
+B1346364532799N00602417EA0138401413000
+B1346434532825N00602489EA0136801396000
+B1346504532842N00602556EA0137201382000
+B1346574532860N00602608EA0137001370000
+B1347044532872N00602659EA0136201359000
+B1347114532881N00602716EA0135201348000
+B1347184532885N00602780EA0134401338000
+B1347254532885N00602845EA0134101330000
+B1347324532890N00602906EA0133701323000
+B1347394532903N00602965EA0133401317000
+B1347474532930N00603017EA0133101310000
+B1347544532955N00603053EA0133301304000
+B1348014532978N00603085EA0132401300000
+B1348084533008N00603116EA0131801294000
+B1348154533034N00603133EA0133401290000
+B1348224533055N00603133EA0133401289000
+B1348294533084N00603124EA0132201287000
+B1348364533112N00603119EA0133801287000
+B1348434533133N00603110EA0134101288000
+B1348504533157N00603102EA0135201291000
+B1348574533176N00603101EA0136101295000
+B1349044533192N00603092EA0136801300000
+B1349114533212N00603087EA0137301307000
+B1349184533227N00603074EA0137201311000
+B1349254533201N00603089EA0137101314000
+B1349324533170N00603137EA0137601316000
+B1349394533143N00603131EA0137901320000
+B1349464533167N00603130EA0138201327000
+B1349534533191N00603125EA0138501333000
+B1350004533214N00603110EA0138101336000
+B1350074533242N00603098EA0138601338000
+B1350144533273N00603109EA0139701340000
+B1350214533290N00603092EA0140401342000
+B1350284533269N00603101EA0141301342000
+B1350354533280N00603123EA0141601346000
+B1350424533250N00603111EA0142301350000
+B1350494533263N00603144EA0142801354000
+B1350564533266N00603116EA0143201360000
+B1351034533239N00603134EA0143401365000
+B1351104533259N00603174EA0143801371000
+B1351174533269N00603152EA0144101376000
+B1351244533243N00603143EA0143801380000
+B1351314533243N00603197EA0144001382000
+B1351384533264N00603239EA0144001383000
+B1351454533287N00603284EA0145301385000
+B1351524533272N00603325EA0145901389000
+B1351594533265N00603313EA0146601392000
+B1352064533269N00603352EA0147301398000
+B1352134533244N00603332EA0148501405000
+B1352204533263N00603346EA0149801413000
+B1352274533247N00603391EA0150401423000
+B1352344533231N00603349EA0152201433000
+B1352414533237N00603326EA0152401443000
+B1352484533254N00603376EA0152101451000
+B1352554533283N00603428EA0153201458000
+B1353024533302N00603480EA0153401466000
+B1353094533320N00603534EA0153601472000
+B1353164533339N00603588EA0154301477000
+B1353234533359N00603645EA0155001483000
+B1353314533384N00603696EV0154701486000
+B1353384533405N00603735EV0155501486000
+B1353454533437N00603789EA0155101486000
+B1353524533481N00603813EA0155201489000
+B1353594533511N00603831EV0155701489000
+B1354064533554N00603846EA0155001490000
+B1354134533597N00603857EA0154401493000
+B1354204533644N00603862EA0154001495000
+B1354274533689N00603862EA0153501496000
+B1354344533735N00603860EA0153501496000
+B1354414533777N00603855EA0153801496000
+B1354484533819N00603848EA0155101497000
+B1354554533857N00603846EA0156301500000
+B1355024533892N00603837EA0157801505000
+B1355094533916N00603824EA0158801512000
+B1355164533897N00603822EA0161201515000
+B1355234533878N00603849EA0163301516000
+B1355304533869N00603843EA0165801521000
+B1355374533892N00603894EA0168001530000
+B1355444533866N00603912EA0170201551000
+B1355514533873N00603888EA0171901554000
+B1355584533887N00603939EA0173601557000
+B1356054533861N00603951EA0175401570000
+B1356124533895N00603963EA0175901579000
+B1356194533893N00603998EA0177101591000
+B1356264533877N00603974EA0177901613000
+B1356334533893N00603947EA0176601620000
+B1356404533926N00603941EA0175701641000
+B1356474533965N00603958EA0177201659000
+B1356544534006N00603966EA0178801666000
+B1357014534026N00603979EV0179301666000
+B1357084534048N00603978EA0180401679000
+B1357154534072N00603994EA0181301695000
+B1357224534108N00604019EA0181801712000
+B1357294534137N00604045EA0182401728000
+B1357364534162N00604063EA0183501738000
+B1357434534176N00604063EV0182801738000
+B1357504534228N00604082EA0181701747000
+B1357574534265N00604104EA0181401755000
+B1358044534301N00604125EA0180301760000
+B1358114534344N00604150EA0179601760000
+B1358184534385N00604170EA0178401759000
+B1358254534428N00604186EA0177001754000
+B1358324534472N00604207EA0175901752000
+B1358394534515N00604220EA0175701750000
+B1358464534559N00604238EA0175601744000
+B1358534534600N00604260EA0174301741000
+B1359004534637N00604291EA0173101737000
+B1359074534680N00604318EA0171901730000
+B1359144534724N00604349EA0170701719000
+B1359214534770N00604376EA0170101707000
+B1359284534815N00604397EA0168801695000
+B1359364534866N00604418EA0167901681000
+B1359434534909N00604437EA0167301669000
+B1359504534954N00604459EA0167401660000
+B1359574534998N00604477EA0167501653000
+B1400044535042N00604488EA0167201648000
+B1400114535082N00604501EA0166801643000
+B1400184535123N00604509EA0166401639000
+B1400254535160N00604506EA0166801635000
+B1400324535205N00604524EA0168101634000
+B1400394535246N00604555EA0170601637000
+B1400464535264N00604551EA0171701645000
+B1400534535241N00604548EA0173101651000
+B1401004535259N00604536EA0173001659000
+B1401074535292N00604564EA0174001666000
+B1401144535330N00604584EA0174901673000
+B1401214535364N00604596EA0175801682000
+B1401284535404N00604605EA0176301690000
+B1401354535445N00604620EA0176501697000
+B1401424535487N00604656EA0177101703000
+B1401494535481N00604711EA0177401710000
+B1401564535475N00604684EA0177401714000
+B1402034535506N00604658EA0178001720000
+B1402104535537N00604636EA0180001727000
+B1402174535559N00604665EA0181501736000
+B1402244535534N00604683EA0183201746000
+B1402314535540N00604654EA0185201757000
+B1402384535557N00604692EA0187201770000
+B1402454535547N00604684EA0189301784000
+B1402524535585N00604705EA0191801799000
+B1402594535565N00604742EA0194301818000
+B1403064535583N00604714EA0197001836000
+B1403134535607N00604749EA0198601855000
+B1403204535578N00604766EA0201401877000
+B1403274535594N00604733EA0203701893000
+B1403344535608N00604779EA0206601917000
+B1403414535591N00604770EA0209401943000
+B1403484535624N00604784EA0212501968000
+B1403554535595N00604827EA0214601995000
+B1404024535578N00604794EA0217302021000
+B1404094535610N00604800EA0220202047000
+B1404164535591N00604845EA0223202073000
+B1404234535595N00604806EA0225802101000
+B1404304535627N00604833EA0226702126000
+B1404374535614N00604894EA0229002152000
+B1404444535588N00604891EA0231502177000
+B1404514535618N00604884EA0233102200000
+B1404584535593N00604911EA0235502222000
+B1405054535583N00604872EA0237902245000
+B1405124535612N00604877EA0238702262000
+B1405194535596N00604932EA0240602282000
+B1405264535564N00604911EA0242302302000
+B1405344535552N00604852EA0243402325000
+B1405414535586N00604818EA0244102344000
+B1405484535624N00604804EA0246002362000
+B1405554535662N00604796EA0246002379000
+B1406024535704N00604815EA0244402389000
+B1406094535744N00604829EA0243602395000
+B1406164535787N00604850EA0241602394000
+B1406234535831N00604865EA0241302391000
+B1406304535869N00604886EA0241002388000
+B1406374535907N00604910EA0239602384000
+B1406444535943N00604938EA0238002378000
+B1406514535984N00604969EA0236102369000
+B1406584536027N00604995EA0233602357000
+B1407054536076N00605025EA0230702343000
+B1407124536127N00605060EA0228402326000
+B1407194536180N00605099EA0227202308000
+B1407264536217N00605127EA0227902294000
+B1407334536259N00605155EA0227902283000
+B1407404536311N00605183EA0227902274000
+B1407474536359N00605207EA0228502268000
+B1407544536400N00605231EA0229202264000
+B1408014536439N00605258EA0230302262000
+B1408084536471N00605280EA0231802264000
+B1408154536508N00605311EA0232402269000
+B1408224536552N00605338EA0232002274000
+B1408294536607N00605365EA0230602277000
+B1408364536661N00605395EA0228702277000
+B1408434536711N00605422EA0227502273000
+B1408504536766N00605452EA0225802265000
+B1408574536816N00605495EA0224102255000
+B1409044536861N00605540EA0223402244000
+B1409114536905N00605583EA0221702233000
+B1409184536959N00605634EA0220202219000
+B1409254537018N00605675EA0219102205000
+B1409324537067N00605708EA0217802193000
+B1409394537125N00605752EA0217202182000
+B1409464537177N00605801EA0216102170000
+B1409534537224N00605844EA0216102160000
+B1410004537262N00605874EA0215702152000
+B1410074537300N00605899EA0215602146000
+B1410144537339N00605920EA0215902141000
+B1410214537374N00605935EA0217202138000
+B1410284537402N00605946EA0217902138000
+B1410354537436N00605967EA0218902140000
+B1410424537475N00605979EA0218402142000
+B1410494537514N00605983EA0218202145000
+B1410564537551N00606010EA0217802146000
+B1411034537581N00606040EA0218102145000
+B1411104537610N00606064EA0218602146000
+B1411174537636N00606090EA0219302148000
+B1411254537666N00606118EA0219402152000
+B1411324537699N00606150EA0219302154000
+B1411394537735N00606176EA0219002154000
+B1411464537768N00606194EA0218402154000
+B1411534537807N00606215EA0217702152000
+B1412004537844N00606244EA0216602148000
+B1412074537879N00606278EA0215902142000
+B1412144537915N00606284EA0216602138000
+B1412214537947N00606269EA0216502136000
+B1412284537988N00606261EA0215402132000
+B1412354538029N00606263EA0213802127000
+B1412424538069N00606272EA0212502120000
+B1412494538107N00606282EA0211102112000
+B1412564538149N00606297EA0209602102000
+B1413034538192N00606306EA0208202092000
+B1413104538237N00606321EA0206702080000
+B1413174538279N00606338EA0205702072000
+B1413244538322N00606356EA0204802062000
+B1413314538363N00606384EA0204202052000
+B1413384538406N00606406EA0203102042000
+B1413454538446N00606431EA0202502032000
+B1413524538485N00606450EA0201302022000
+B1413594538526N00606465EA0200202011000
+B1414064538563N00606489EA0198902000000
+B1414134538601N00606517EA0197501988000
+B1414204538638N00606543EA0196301975000
+B1414274538673N00606571EA0194701962000
+B1414344538712N00606596EA0193401949000
+B1414414538748N00606621EA0192401936000
+B1414484538778N00606657EA0191601924000
+B1414554538808N00606687EA0192101913000
+B1415024538834N00606720EA0192301906000
+B1415094538857N00606755EA0191601901000
+B1415164538894N00606754EA0191401897000
+B1415234538929N00606758EA0191301893000
+B1415304538963N00606764EA0190701889000
+B1415374538999N00606779EA0190201886000
+B1415444539040N00606787EA0189701882000
+B1415514539080N00606791EA0188901877000
+B1415584539114N00606795EV0188101872000
+B1416054539150N00606796EV0187001866000
+B1416124539186N00606785EA0185801855000
+B1416194539219N00606784EA0184501845000
+B1416264539249N00606777EA0183201836000
+B1416334539280N00606762EA0181501825000
+B1416404539314N00606750EA0180101814000
+B1416474539344N00606744EA0178801802000
+B1416544539375N00606758EA0177701790000
+B1417014539408N00606781EA0177101778000
+B1417084539438N00606809EA0177101768000
+B1417154539467N00606829EA0176301759000
+B1417234539503N00606826EA0176001750000
+B1417304539529N00606845EA0174901743000
+B1417374539547N00606893EA0174701736000
+B1417444539561N00606939EA0174901730000
+B1417514539574N00606991EA0173801724000
+B1417584539587N00607049EA0173701718000
+B1418054539601N00607096EA0173401712000
+B1418124539624N00607138EA0173401708000
+B1418194539642N00607188EA0173001705000
+B1418264539664N00607237EA0172901704000
+B1418334539685N00607285EA0173101702000
+B1418404539706N00607332EA0173201701000
+B1418474539734N00607374EA0173601700000
+B1418544539763N00607419EA0173201700000
+B1419014539791N00607462EA0171201699000
+B1419084539828N00607530EA0169001692000
+B1419154539868N00607599EA0167101681000
+B1419224539904N00607668EA0165601669000
+B1419294539942N00607732EA0164101656000
+B1419364539980N00607792EA0162601643000
+B1419434540018N00607849EA0160801629000
+B1419504540053N00607903EA0159401613000
+B1419574540084N00607964EA0157801598000
+B1420044540118N00608026EA0156001582000
+B1420114540152N00608096EA0155201567000
+B1420184540185N00608154EA0153801553000
+B1420254540219N00608214EA0152701539000
+B1420324540255N00608279EA0152401526000
+B1420394540290N00608338EA0151701515000
+B1420464540321N00608396EA0152801507000
+B1420534540338N00608442EA0153601503000
+B1421004540306N00608489EA0153501501000
+B1421074540316N00608468EA0154201500000
+B1421144540341N00608499EA0154601500000
+B1421214540361N00608522EA0155001502000
+B1421284540387N00608551EA0155201503000
+B1421354540414N00608584EA0155801506000
+B1421424540442N00608613EA0155001508000
+B1421494540469N00608653EA0153901508000
+B1421564540494N00608694EA0152901505000
+B1422034540521N00608729EA0152101500000
+B1422104540550N00608770EA0150301494000
+B1422174540583N00608817EA0148401484000
+B1422244540613N00608861EA0147001475000
+B1422314540644N00608910EA0146101464000
+B1422384540673N00608959EA0145301453000
+B1422454540702N00609006EA0144501441000
+B1422524540726N00609046EA0144501431000
+B1422594540751N00609072EA0143401422000
+B1423064540783N00609106EA0142901413000
+B1423134540812N00609137EA0141801405000
+B1423214540845N00609170EA0141501397000
+B1423284540877N00609196EA0141601391000
+B1423354540905N00609214EA0141201386000
+B1423424540934N00609232EA0142901383000
+B1423494540957N00609241EA0143901382000
+B1423564540975N00609265EA0145501385000
+B1424034540997N00609276EA0144901389000
+B1424104541027N00609285EA0143801391000
+B1424174541057N00609291EA0143301391000
+B1424244541087N00609303EA0142601390000
+B1424314541110N00609309EA0143801390000
+B1424384541132N00609320EA0143801391000
+B1424454541154N00609322EA0143201392000
+B1424524541179N00609327EA0143001392000
+B1424594541210N00609334EA0142901389000
+B1425064541232N00609337EA0144501389000
+B1425134541249N00609353EA0145101391000
+B1425204541274N00609363EA0145101394000
+B1425274541302N00609380EA0145201398000
+B1425344541332N00609399EA0146401402000
+B1425414541364N00609412EA0146701406000
+B1425484541395N00609413EA0147901411000
+B1425554541410N00609455EA0148801419000
+B1426024541380N00609511EA0149001423000
+B1426094541392N00609482EA0150501430000
+B1426164541402N00609465EA0151001435000
+B1426234541385N00609469EA0152301437000
+B1426304541404N00609473EA0151701442000
+B1426374541438N00609467EA0152001449000
+B1426444541472N00609466EA0152601456000
+B1426514541512N00609473EA0153201461000
+B1426584541548N00609478EA0154101468000
+B1427054541583N00609487EA0156101473000
+B1427124541588N00609533EA0157701483000
+B1427194541578N00609523EA0160001486000
+B1427264541599N00609564EA0162101491000
+B1427334541590N00609549EA0164701502000
+B1427404541623N00609549EA0167401523000
+B1427474541602N00609585EA0169901547000
+B1427544541591N00609560EA0173501567000
+B1428014541611N00609589EA0176101597000
+B1428084541583N00609597EA0179001622000
+B1428154541572N00609580EA0182401644000
+B1428224541572N00609625EA0185801666000
+B1428294541558N00609602EA0189101693000
+B1428364541573N00609628EA0191901725000
+B1428434541540N00609673EA0194801749000
+B1428504541518N00609640EA0198101779000
+B1428584541529N00609654EV0201001808000
+B1429054541496N00609675EA0204101835000
+B1429124541499N00609648EA0207201862000
+B1429194541505N00609684EA0210501896000
+B1429264541466N00609675EA0214001919000
+B1429334541468N00609653EA0216801936000
+B1429404541454N00609706EA0220301975000
+B1429474541414N00609688EA0223402018000
+B1429544541425N00609658EA0225802052000
+B1430014541431N00609696EA0229102095000
+B1430084541393N00609725EA0232502136000
+B1430154541368N00609689EA0234702169000
+B1430224541386N00609690EA0236502191000
+B1430294541395N00609723EA0239802219000
+B1430364541363N00609760EA0242802256000
+B1430434541340N00609725EA0244902289000
+B1430504541353N00609740EA0247802317000
+B1430574541321N00609768EA0250702352000
+B1431044541315N00609720EA0253402373000
+B1431114541333N00609694EA0256202404000
+B1431184541351N00609670EA0259502434000
+B1431254541372N00609662EA0262702462000
+B1431324541390N00609655EA0265902481000
+B1431394541409N00609638EA0268102516000
+B1431464541431N00609617EA0269702553000
+B1431534541459N00609606EA0271102582000
+B1432004541484N00609591EA0272302607000
+B1432074541513N00609570EA0272502628000
+B1432144541540N00609538EA0272002644000
+B1432214541564N00609500EA0270902655000
+B1432284541591N00609482EA0269602661000
+B1432354541628N00609476EA0268402662000
+B1432424541673N00609467EA0266202660000
+B1432494541725N00609457EA0264802653000
+B1432564541781N00609445EA0262802644000
+B1433034541833N00609430EA0261702633000
+B1433104541885N00609423EA0260602622000
+B1433174541930N00609420EA0260202612000
+B1433244541979N00609414EA0259502602000
+B1433314542030N00609409EA0259102593000
+B1433384542065N00609409EA0258002586000
+B1433454542115N00609409EA0256702577000
+B1433524542164N00609396EA0257302569000
+B1433594542205N00609388EA0257702563000
+B1434064542247N00609386EA0257202559000
+B1434134542287N00609390EA0257602556000
+B1434204542318N00609389EA0256302554000
+B1434274542361N00609389EA0255302550000
+B1434344542411N00609396EA0253702546000
+B1434414542465N00609406EA0252902543000
+B1434484542514N00609405EA0251002533000
+B1434564542576N00609400EA0250102520000
+B1435034542631N00609391EA0249502508000
+B1435104542678N00609384EA0248302497000
+B1435174542730N00609388EA0247102485000
+B1435244542774N00609387EA0246002473000
+B1435314542819N00609383EA0244402460000
+B1435384542863N00609390EA0242702446000
+B1435454542913N00609392EA0240802431000
+B1435524542966N00609402EA0239202416000
+B1435594543018N00609412EA0237702402000
+B1436064543066N00609421EA0236602389000
+B1436134543115N00609422EA0235202377000
+B1436204543157N00609424EA0234102365000
+B1436274543201N00609423EA0232002352000
+B1436344543248N00609424EA0230502338000
+B1436414543296N00609427EA0229302324000
+B1436484543340N00609435EA0227302309000
+B1436554543390N00609445EA0227402294000
+B1437024543440N00609451EA0227602282000
+B1437094543491N00609458EA0227002272000
+B1437164543534N00609464EA0226302264000
+B1437234543579N00609475EA0227502257000
+B1437304543616N00609488EA0226502254000
+B1437374543656N00609494EA0226802251000
+B1437444543696N00609500EA0225802247000
+B1437514543745N00609511EA0224802242000
+B1437584543796N00609523EA0223402235000
+B1438054543848N00609534EA0222202226000
+B1438124543903N00609547EA0220402216000
+B1438194543953N00609557EA0220002207000
+B1438264544001N00609565EA0219802198000
+B1438334544048N00609581EA0219802191000
+B1438404544086N00609589EA0221702188000
+B1438474544114N00609583EA0221802188000
+B1438544544146N00609579EA0222102189000
+B1439014544176N00609579EA0222002191000
+B1439084544210N00609580EA0221302192000
+B1439154544252N00609574EA0221902190000
+B1439224544282N00609572EA0221502189000
+B1439294544316N00609568EA0221702190000
+B1439364544353N00609565EA0221102190000
+B1439434544390N00609564EA0220602190000
+B1439504544428N00609570EA0219902187000
+B1439574544473N00609584EA0218502183000
+B1440044544528N00609597EA0217802176000
+B1440114544579N00609614EA0217502170000
+B1440184544633N00609628EA0217702164000
+B1440254544660N00609639EA0218602161000
+B1440324544692N00609650EA0218902161000
+B1440394544726N00609660EA0220102163000
+B1440464544756N00609662EA0221402167000
+B1440544544785N00609657EA0220702172000
+B1441014544820N00609643EA0219902174000
+B1441084544863N00609638EA0219002173000
+B1441154544893N00609638EA0221702174000
+B1441224544907N00609632EA0221702176000
+B1441294544929N00609628EA0223102181000
+B1441364544951N00609603EA0224702188000
+B1441434544925N00609560EA0224102196000
+B1441504544903N00609607EA0225102200000
+B1441574544903N00609656EA0227402207000
+B1442044544923N00609640EA0228002216000
+B1442114544880N00609654EA0230202223000
+B1442184544868N00609689EA0231902232000
+B1442254544865N00609655EA0233702245000
+B1442324544835N00609677EA0235602258000
+B1442394544847N00609676EA0237402263000
+B1442464544847N00609676EV0239202263000
+B1442534544865N00609614EA0240402279000
+B1443004544822N00609612EA0242102301000
+B1443074544808N00609648EV0243402316000
+B1443144544812N00609658EV0244702324000
+B1443214544773N00609640EA0246002339000
+B1443284544773N00609679EA0247702358000
+B1443354544778N00609668EV0248602364000
+B1443424544778N00609649EA0250402371000
+B1443494544789N00609660EA0251802388000
+B1443564544755N00609664EA0253002405000
+B1444034544767N00609691EA0253502426000
+B1444104544797N00609695EA0252302444000
+B1444174544836N00609688EA0250302454000
+B1444244544889N00609682EA0248402456000
+B1444314544932N00609680EA0247202455000
+B1444384544982N00609690EA0246202450000
+B1444454545028N00609702EA0247102446000
+B1444524545061N00609708EA0247502444000
+B1444594545101N00609719EA0247502444000
+B1445064545137N00609729EA0248502445000
+B1445134545176N00609733EA0248402449000
+B1445204545212N00609737EA0248402451000
+B1445274545243N00609734EA0247702452000
+B1445344545288N00609726EA0246402450000
+B1445414545332N00609719EA0245402446000
+B1445484545380N00609718EA0243902439000
+B1445554545421N00609711EA0242702432000
+B1446024545467N00609706EA0241402422000
+B1446094545507N00609706EA0240402412000
+B1446164545546N00609704EA0238202401000
+B1446234545596N00609702EA0237102388000
+B1446304545642N00609699EA0235702375000
+B1446374545692N00609707EA0235102363000
+B1446444545739N00609717EA0234602353000
+B1446524545790N00609724EA0235102342000
+B1446594545814N00609718EA0236602339000
+B1447064545824N00609743EA0237802340000
+B1447134545787N00609738EA0239102344000
+B1447204545799N00609729EA0240102348000
+B1447274545767N00609755EA0241302355000
+B1447344545775N00609721EA0242602362000
+B1447414545794N00609751EA0244202372000
+B1447484545761N00609772EA0245202382000
+B1447554545755N00609734EA0247002391000
+B1448024545777N00609766EA0248802403000
+B1448094545752N00609798EA0249802418000
+B1448164545751N00609756EA0251202431000
+B1448234545790N00609771EA0252502445000
+B1448304545831N00609792EA0253202460000
+B1448374545868N00609820EA0253402472000
+B1448444545904N00609855EA0252902481000
+B1448514545944N00609900EA0251002486000
+B1448584545997N00609953EA0250702484000
+B1449054546037N00609980EA0250502484000
+B1449124546078N00609999EA0249702482000
+B1449194546117N00610027EA0248502479000
+B1449264546168N00610060EA0247802473000
+B1449334546204N00610096EA0248402468000
+B1449404546240N00610139EA0249102466000
+B1449474546275N00610182EA0248302466000
+B1449544546321N00610229EA0246202461000
+B1450014546366N00610272EA0243302453000
+B1450084546415N00610325EA0242302440000
+B1450154546451N00610376EA0241502429000
+B1450224546486N00610440EA0240302418000
+B1450294546516N00610517EA0239602408000
+B1450364546545N00610594EA0238502397000
+B1450434546581N00610663EA0237702387000
+B1450504546617N00610725EA0236502379000
+B1450574546651N00610789EA0236002370000
+B1451044546679N00610843EA0234202361000
+B1451114546706N00610899EA0231902351000
+B1451184546728N00610954EA0231002339000
+B1451254546750N00611009EA0231002327000
+B1451324546770N00611054EA0231102317000
+B1451394546793N00611097EA0231502311000
+B1451464546821N00611137EA0231802306000
+B1451534546852N00611180EA0231102303000
+B1452004546889N00611230EA0230402299000
+B1452074546928N00611279EA0229002294000
+B1452144546973N00611323EA0227502288000
+B1452214547021N00611372EA0227902280000
+B1452284547057N00611405EA0226502272000
+B1452354547097N00611444EA0225302265000
+B1452424547140N00611487EA0223402257000
+B1452504547195N00611543EA0221302244000
+B1452574547243N00611600EA0219502231000
+B1453044547287N00611652EA0218302218000
+B1453114547330N00611694EA0216702203000
+B1453184547377N00611733EA0215602186000
+B1453254547416N00611773EA0215802172000
+B1453324547449N00611806EA0215002160000
+B1453394547476N00611848EA0214002150000
+B1453464547501N00611880EV0213402143000
+B1453534547531N00611923EA0212902143000
+B1454004547550N00611975EA0211802136000
+B1454074547575N00612022EA0211102128000
+B1454144547597N00612050EV0209702125000
+B1454214547631N00612094EA0208702114000
+B1454284547662N00612133EA0207702106000
+B1454354547694N00612174EA0206902094000
+B1454424547725N00612219EA0206302083000
+B1454494547754N00612266EA0206002072000
+B1454564547783N00612308EA0205502063000
+B1455034547809N00612350EA0204902055000
+B1455104547836N00612388EA0204102049000
+B1455174547865N00612415EA0203402046000
+B1455244547893N00612457EA0202502041000
+B1455314547916N00612513EA0200802033000
+B1455384547946N00612569EA0199402024000
+B1455454547976N00612617EA0198202021000
+B1455524548005N00612673EA0196802010000
+B1455594548028N00612723EA0195402010000
+B1456064548055N00612778EA0193602010000
+B1456134548087N00612834EA0192402001000
+B1456204548096N00612849EV0191402001000
+B1456274548141N00612931EA0190401995000
+B1456344548163N00612981EA0189501982000
+B1456414548180N00613042EA0188801967000
+B1456484548199N00613102EA0187401945000
+B1456554548226N00613174EA0186301922000
+B1457024548256N00613241EA0185401900000
+B1457094548284N00613308EA0184201880000
+B1457164548313N00613378EA0182901862000
+B1457234548343N00613451EA0181601845000
+B1457304548375N00613517EA0179901828000
+B1457374548406N00613584EA0178101811000
+B1457444548437N00613650EA0177001795000
+B1457514548464N00613716EA0174801778000
+B1457584548491N00613783EA0173501762000
+B1458054548514N00613845EA0172201747000
+B1458124548534N00613915EA0171001731000
+B1458194548560N00613977EA0169901717000
+B1458264548589N00614037EA0168801702000
+B1458334548616N00614097EA0167701689000
+B1458414548651N00614168EA0166301674000
+B1458484548681N00614232EA0165101661000
+B1458554548713N00614296EA0163301648000
+B1459024548746N00614362EA0162301634000
+B1459094548775N00614430EA0161101621000
+B1459164548801N00614499EA0160201609000
+B1459234548831N00614561EA0159201598000
+B1459304548863N00614623EA0158401587000
+B1459374548897N00614688EA0157301577000
+B1459444548928N00614757EA0155901565000
+B1459514548948N00614817EA0157401556000
+B1459584548963N00614877EA0159601552000
+B1500054548978N00614932EA0162601555000
+B1500124548974N00614923EA0165601564000
+B1500194548953N00614985EA0169101577000
+B1500264548941N00614973EA0172301595000
+B1500334548919N00615034EA0175701616000
+B1500404548931N00615039EA0178901635000
+B1500474548905N00615077EA0182701663000
+B1500544548915N00615069EA0186001686000
+B1501014548875N00615091EA0189701719000
+B1501084548886N00615089EA0192701745000
+B1501154548858N00615129EA0195901778000
+B1501224548849N00615098EA0199501808000
+B1501294548819N00615136EA0202001840000
+B1501364548814N00615097EA0204701869000
+B1501434548771N00615104EA0205801902000
+B1501504548772N00615142EA0208001926000
+B1501574548787N00615153EA0209901946000
+B1502044548804N00615154EA0212001969000
+B1502114548823N00615160EA0213601997000
+B1502184548838N00615168EA0213902018000
+B1502254548862N00615163EA0214602046000
+B1502324548893N00615153EA0214402065000
+B1502394548919N00615159EA0213202077000
+B1502464548951N00615169EA0213002084000
+B1502534548982N00615180EA0212002088000
+B1503004549019N00615197EA0210902088000
+B1503074549060N00615219EA0210102085000
+B1503144549095N00615239EA0209102082000
+B1503214549143N00615263EA0207902076000
+B1503284549191N00615287EA0207302070000
+B1503354549243N00615307EA0206702064000
+B1503424549292N00615319EA0205902057000
+B1503494549338N00615337EA0205102049000
+B1503564549380N00615353EA0204502042000
+B1504034549429N00615362EA0203702034000
+B1504104549472N00615372EA0202902026000
+B1504174549514N00615384EA0201402018000
+B1504244549558N00615398EA0200402010000
+B1504314549602N00615408EA0198902000000
+B1504384549648N00615418EA0197001989000
+B1504464549702N00615438EA0197201976000
+B1504534549746N00615453EA0197401967000
+B1505004549783N00615466EA0198101962000
+B1505074549819N00615475EA0199201960000
+B1505144549851N00615485EA0198701959000
+B1505214549890N00615492EA0197301956000
+B1505284549932N00615497EA0196501951000
+B1505354549974N00615498EA0196301947000
+B1505424550020N00615500EA0196501944000
+B1505494550069N00615497EA0196601941000
+B1505564550113N00615495EA0197501940000
+B1506034550151N00615492EA0197001941000
+B1506104550189N00615491EA0196801941000
+B1506174550230N00615483EA0196001940000
+B1506244550268N00615480EA0194401937000
+B1506314550304N00615476EA0194201933000
+B1506384550337N00615475EA0195001929000
+B1506454550359N00615478EA0195601928000
+B1506524550380N00615480EA0196901927000
+B1506594550404N00615475EA0197401929000
+B1507064550428N00615468EA0198601933000
+B1507134550450N00615465EA0199501939000
+B1507204550472N00615457EA0200601945000
+B1507274550491N00615447EA0201201950000
+B1507344550512N00615447EA0202301956000
+B1507414550532N00615443EA0203201963000
+B1507484550548N00615437EV0204501969000
+B1507554550564N00615427EA0204701973000
+B1508024550586N00615424EA0205401981000
+B1508094550605N00615412EA0206701988000
+B1508164550627N00615408EA0207801997000
+B1508234550649N00615401EA0208602006000
+B1508304550672N00615389EA0209202015000
+B1508374550697N00615384EA0209902025000
+B1508444550724N00615376EA0210302035000
+B1508514550744N00615361EA0211802044000
+B1508584550768N00615366EA0212002053000
+B1509054550802N00615378EA0212002062000
+B1509124550833N00615372EA0213202069000
+B1509194550863N00615364EA0214402078000
+B1509264550877N00615420EA0215102086000
+B1509334550847N00615443EA0215602094000
+B1509404550843N00615412EA0217002102000
+B1509474550834N00615380EA0218002112000
+B1509544550867N00615410EA0219202121000
+B1510014550844N00615465EA0220502131000
+B1510084550836N00615445EA0221402140000
+B1510154550868N00615475EA0222202151000
+B1510224550849N00615536EA0223102161000
+B1510294550812N00615538EA0224102172000
+B1510374550765N00615551EA0224802182000
+B1510444550725N00615557EA0225802191000
+B1510514550691N00615557EA0227002201000
+B1510584550673N00615536EA0229302213000
+B1511054550702N00615536EA0231602225000
+B1511124550687N00615591EA0233302240000
+B1511194550664N00615577EA0235402253000
+B1511264550696N00615586EA0237302269000
+B1511334550686N00615647EA0239002287000
+B1511404550660N00615637EA0240302302000
+B1511474550692N00615637EA0241902319000
+B1511544550697N00615705EA0242602335000
+B1512014550672N00615706EA0243102349000
+B1512084550677N00615680EA0243702357000
+B1512154550694N00615651EA0244302370000
+B1512224550718N00615619EA0246002383000
+B1512294550755N00615652EA0248502394000
+B1512364550729N00615666EA0250602407000
+B1512434550759N00615642EA0253802425000
+B1512504550792N00615680EA0257102447000
+B1512574550769N00615693EA0259602470000
+B1513044550793N00615660EA0262702495000
+B1513114550829N00615679EA0265702522000
+B1513184550819N00615728EA0268402549000
+B1513254550821N00615700EA0270902576000
+B1513324550859N00615704EA0272602603000
+B1513394550893N00615719EA0273402627000
+B1513464550932N00615736EA0273102646000
+B1513534550973N00615754EA0272502660000
+B1514004551006N00615798EA0270702669000
+B1514074551026N00615846EA0269202672000
+B1514144551047N00615904EA0268302671000
+B1514214551063N00615964EA0267802668000
+B1514284551080N00616027EA0267002665000
+B1514354551101N00616099EA0265302659000
+B1514424551130N00616173EA0264002651000
+B1514494551158N00616246EA0262402641000
+B1514564551184N00616332EA0260702628000
+B1515034551214N00616419EA0259302614000
+B1515104551245N00616500EA0258102601000
+B1515174551276N00616575EA0257502588000
+B1515244551300N00616635EA0256902577000
+B1515314551330N00616695EA0257102568000
+B1515384551359N00616763EA0256602561000
+B1515454551389N00616830EA0256202556000
+B1515524551420N00616888EA0254702549000
+B1515594551457N00616959EA0254002541000
+B1516064551496N00617023EA0253202533000
+B1516134551545N00617076EA0252602526000
+B1516214551604N00617139EA0252002517000
+B1516284551656N00617195EA0251602510000
+B1516354551705N00617247EA0250702503000
+B1516424551751N00617299EA0250502497000
+B1516494551790N00617349EA0249902492000
+B1516564551819N00617413EA0249702487000
+B1517034551841N00617478EA0249602484000
+B1517104551859N00617545EA0249302481000
+B1517174551880N00617626EA0248202476000
+B1517244551897N00617708EA0247502471000
+B1517314551915N00617787EA0247202466000
+B1517384551927N00617872EA0246302460000
+B1517454551941N00617946EA0245602453000
+B1517524551959N00618026EA0244402445000
+B1517594551981N00618112EA0243102436000
+B1518064552000N00618201EA0241602426000
+B1518134552022N00618285EA0240302415000
+B1518204552041N00618370EA0239302404000
+B1518274552062N00618448EA0238402393000
+B1518344552084N00618520EA0237302383000
+B1518414552113N00618576EA0235702372000
+B1518484552136N00618636EA0235002361000
+B1518554552147N00618705EA0234602350000
+B1519024552160N00618772EA0233802341000
+B1519094552176N00618840EA0232702332000
+B1519164552193N00618913EA0230802322000
+B1519234552214N00619002EA0230002311000
+B1519304552234N00619086EA0228602299000
+B1519374552251N00619168EA0226902288000
+B1519444552271N00619254EA0225802274000
+B1519514552289N00619334EA0224402261000
+B1519584552309N00619417EA0223102247000
+B1520054552330N00619500EA0222302234000
+B1520124552348N00619584EA0221002221000
+B1520194552361N00619669EA0220102212000
+B1520264552375N00619756EA0219502200000
+B1520334552392N00619839EA0218602190000
+B1520404552411N00619919EA0217702180000
+B1520474552426N00620000EA0216602170000
+B1520544552441N00620085EA0215802159000
+B1521014552459N00620171EA0214802149000
+B1521084552481N00620253EA0213602139000
+B1521154552503N00620336EA0212702129000
+B1521224552525N00620418EA0211502118000
+B1521294552545N00620503EA0210302108000
+B1521364552570N00620583EA0208902096000
+B1521434552597N00620667EA0208002085000
+B1521504552620N00620749EA0207202078000
+B1521574552639N00620835EA0206102068000
+B1522054552663N00620929EA0205002059000
+B1522124552678N00621014EA0203802050000
+B1522194552685N00621106EA0202402040000
+B1522264552699N00621197EA0201202028000
+B1522334552715N00621285EA0199802017000
+B1522404552731N00621369EA0199002005000
+B1522474552748N00621451EA0197901993000
+B1522544552765N00621524EA0196901980000
+B1523014552782N00621594EA0195801967000
+B1523084552798N00621659EA0194601955000
+B1523154552814N00621722EA0193701943000
+B1523224552833N00621788EA0192601932000
+B1523294552853N00621859EA0191901921000
+B1523364552871N00621933EA0191001911000
+B1523434552891N00622004EA0190501902000
+B1523504552910N00622068EA0189801893000
+B1523574552930N00622126EA0189701886000
+B1524044552949N00622188EA0188801879000
+B1524114552966N00622252EA0187901872000
+B1524184552983N00622314EA0187001864000
+B1524254553005N00622377EA0186201856000
+B1524324553025N00622445EA0186301848000
+B1524394553035N00622508EA0186301842000
+B1524464553041N00622580EA0188101839000
+B1524534553028N00622634EA0189601841000
+B1525004552988N00622602EA0191501842000
+B1525074552985N00622589EV0193401843000
+B1525144552988N00622610EA0194501843000
+B1525214552977N00622603EA0196701846000
+B1525284553002N00622595EA0198401848000
+B1525354553014N00622642EA0199601856000
+B1525424552975N00622615EA0202301861000
+B1525494552999N00622621EA0201401875000
+B1525564552995N00622686EA0203601896000
+B1526034552947N00622702EA0206001910000
+B1526104552948N00622663EA0207801924000
+B1526174552953N00622689EA0209001943000
+B1526244552919N00622680EA0210401968000
+B1526314552932N00622645EA0211001993000
+B1526384552947N00622683EA0211402013000
+B1526454552945N00622746EA0212202031000
+B1526524552955N00622789EA0214902046000
+B1526594552932N00622820EA0217102062000
+B1527064552912N00622810EV0218702063000
+B1527134552934N00622816EV0220602066000
+B1527204552939N00622839EV0222302066000
+B1527274552942N00622837EA0223602067000
+B1527344552950N00622855EA0224502078000
+B1527414552919N00622860EA0225802083000
+B1527494552939N00622819EA0226402089000
+B1527564552946N00622834EA0228002090000
+B1528034552907N00622845EA0227902096000
+B1528104552914N00622805EA0227602098000
+B1528174552907N00622879EA0228502116000
+B1528244552894N00622947EA0231502144000
+B1528314552862N00622970EV0233602144000
+B1528384552848N00622974EA0235502155000
+B1528454552842N00623042EA0239202186000
+B1528524552807N00623049EA0241702218000
+B1528594552824N00623030EA0245102255000
+B1529064552824N00623088EV0248502277000
+B1529134552784N00623096EA0250202315000
+B1529204552771N00623052EA0252002350000
+B1529274552793N00623050EA0254502384000
+B1529344552802N00623099EA0257402416000
+B1529414552814N00623135EA0259102448000
+B1529484552829N00623186EA0259902475000
+B1529554552840N00623242EA0261602500000
+B1530024552860N00623301EA0263302518000
+B1530094552870N00623358EA0265402539000
+B1530164552888N00623412EA0267902561000
+B1530234552907N00623472EA0269602582000
+B1530304552917N00623536EA0270902599000
+B1530374552920N00623596EA0270602617000
+B1530444552927N00623657EA0268902629000
+B1530514552942N00623731EA0267402635000
+B1530584552957N00623793EA0266602638000
+B1531054552977N00623866EA0265302637000
+B1531124553002N00623945EA0264202633000
+B1531194553029N00624019EA0262902627000
+B1531264553051N00624093EA0261902621000
+B1531334553078N00624171EA0260402612000
+B1531404553104N00624257EA0259202602000
+B1531474553129N00624340EA0258702594000
+B1531544553150N00624421EA0258102587000
+B1532014553174N00624494EA0256602578000
+B1532084553199N00624567EA0255502568000
+B1532154553221N00624640EA0254202558000
+B1532224553242N00624715EA0252802547000
+B1532294553263N00624791EA0251802535000
+B1532364553282N00624867EA0250702524000
+B1532434553300N00624946EA0249502512000
+B1532504553319N00625026EA0248302500000
+B1532574553338N00625104EA0247302488000
+B1533044553358N00625182EA0246202476000
+B1533114553375N00625262EA0245302465000
+B1533184553392N00625337EA0243902454000
+B1533254553412N00625412EA0242802442000
+B1533324553435N00625484EA0241402430000
+B1533404553457N00625568EA0240302418000
+B1533474553475N00625644EA0239402407000
+B1533544553484N00625720EA0238302396000
+B1534014553492N00625797EA0237302385000
+B1534084553502N00625873EA0236502375000
+B1534154553508N00625953EA0235502364000
+B1534224553511N00626033EA0234502354000
+B1534294553521N00626112EA0233302343000
+B1534364553528N00626191EA0232202333000
+B1534434553536N00626271EA0231002322000
+B1534504553547N00626350EA0230102312000
+B1534574553559N00626427EA0229302301000
+B1535044553567N00626503EA0228202291000
+B1535114553575N00626576EA0227102280000
+B1535184553584N00626649EA0225902269000
+B1535254553590N00626724EA0224802258000
+B1535324553597N00626799EA0223602248000
+B1535394553602N00626874EA0222702238000
+B1535464553602N00626951EA0221802228000
+B1535534553606N00627023EA0221002219000
+B1536004553612N00627099EA0220302209000
+B1536074553618N00627175EA0219302199000
+B1536144553622N00627248EA0218402189000
+B1536214553627N00627319EA0217802181000
+B1536284553633N00627391EA0217302174000
+B1536354553643N00627461EA0216602167000
+B1536424553656N00627532EA0216002162000
+B1536494553670N00627599EA0215402158000
+B1536564553680N00627666EA0214802154000
+B1537034553694N00627734EA0214302151000
+B1537104553709N00627802EA0213702146000
+B1537174553724N00627869EA0212902139000
+B1537244553741N00627938EA0212002133000
+B1537314553752N00628009EA0211302128000
+B1537384553766N00628081EA0210402121000
+B1537454553782N00628153EA0209402115000
+B1537524553795N00628231EA0208502106000
+B1537594553809N00628310EA0207702096000
+B1538064553826N00628391EA0207202087000
+B1538134553844N00628466EA0207102079000
+B1538204553855N00628530EA0207402074000
+B1538274553870N00628592EA0206902068000
+B1538344553889N00628653EA0206102062000
+B1538414553908N00628711EA0205102054000
+B1538484553927N00628766EA0204702047000
+B1538554553951N00628813EA0204302041000
+B1539024553980N00628862EA0204202037000
+B1539094554008N00628912EA0204002031000
+B1539164554038N00628960EA0203402025000
+B1539234554068N00629012EA0202602019000
+B1539304554101N00629062EA0202202013000
+B1539374554138N00629109EA0203202008000
+B1539454554174N00629145EA0202402006000
+B1539524554209N00629163EA0202302005000
+B1539594554241N00629177EV0202102005000
+B1540064554283N00629187EA0202602004000
+B1540134554317N00629193EA0203002004000
+B1540204554346N00629194EA0203802004000
+B1540274554374N00629198EA0204302006000
+B1540344554380N00629186EV0204302008000
+B1540414554363N00629170EA0204802009000
+B1540484554344N00629165EA0204702010000
+B1540554554368N00629178EA0205102011000
+B1541024554400N00629210EA0206002013000
+B1541094554431N00629236EA0207002016000
+B1541164554440N00629214EA0207502018000
+B1541234554422N00629255EA0207702021000
+B1541304554451N00629285EA0209302025000
+B1541374554463N00629269EA0209802032000
+B1541444554431N00629293EA0210502039000
+B1541514554404N00629284EA0211202046000
+B1541584554410N00629278EA0212302048000
+B1542054554434N00629297EA0212502049000
+B1542124554420N00629280EA0213502055000
+B1542194554391N00629316EA0213802059000
+B1542264554382N00629322EV0213602059000
+B1542334554373N00629360EA0214802062000
+B1542404554396N00629330EA0215002067000
+B1542474554396N00629368EV0215502076000
+B1542544554415N00629364EV0216402080000
+B1543014554428N00629323EA0214702082000
+B1543084554457N00629304EA0216502091000
+B1543154554460N00629311EA0217002095000
+B1543224554488N00629318EA0216802105000
+B1543294554455N00629310EA0218202112000
+B1543364554435N00629351EA0218102117000
+B1543434554455N00629346EA0219202124000
+B1543504554439N00629333EA0219602130000
+B1543574554443N00629382EA0220402137000
+B1544044554427N00629363EA0221702143000
+B1544114554441N00629332EA0221802148000
+B1544184554469N00629357EA0223202150000
+B1544254554447N00629391EA0224402150000
+B1544324554450N00629383EA0224802157000
+B1544394554459N00629424EA0225602165000
+B1544464554427N00629412EA0227002178000
+B1544534554450N00629407EA0227902192000
+B1545004554455N00629459EA0228702194000
+B1545074554419N00629450EA0229002205000
+B1545144554427N00629421EA0229602218000
+B1545214554422N00629477EA0230602228000
+B1545284554385N00629481EA0231402240000
+B1545354554396N00629453EA0231602250000
+B1545434554394N00629512EA0232102260000
+B1545504554361N00629513EA0233102269000
+B1545574554371N00629478EA0232702275000
+B1546044554393N00629489EV0232702278000
+B1546114554405N00629522EA0232402279000
+B1546184554390N00629486EA0232102281000
+B1546254554410N00629468EA0232302284000
+B1546324554437N00629463EA0234202288000
+B1546394554416N00629436EA0234802289000
+B1546464554426N00629443EA0236702293000
+B1546534554416N00629414EA0237702297000
+B1547004554384N00629439EA0238002304000
+B1547074554406N00629425EA0238402311000
+B1547144554434N00629451EV0239302311000
+B1547214554408N00629480EA0240002312000
+B1547284554390N00629453EA0240002314000
+B1547354554397N00629446EV0241302315000
+B1547424554441N00629428EA0241502318000
+B1547494554416N00629415EA0242302330000
+B1547564554433N00629444EA0243402343000
+B1548034554400N00629499EA0244002347000
+B1548104554395N00629478EA0244902354000
+B1548174554419N00629512EA0245902366000
+B1548244554383N00629549EA0246602381000
+B1548314554376N00629520EA0247602390000
+B1548384554404N00629538EA0248802397000
+B1548454554373N00629555EA0249502407000
+B1548524554351N00629511EA0249702420000
+B1548594554380N00629533EA0250802432000
+B1549064554357N00629563EA0251302442000
+B1549134554368N00629558EA0251902449000
+B1549204554357N00629605EA0252502457000
+B1549274554322N00629590EA0254302467000
+B1549344554346N00629602EA0255402477000
+B1549414554316N00629641EA0256202487000
+B1549484554291N00629611EA0258102499000
+B1549554554313N00629634EA0260002512000
+B1550024554281N00629652EA0261102527000
+B1550094554281N00629616EA0261802541000
+B1550164554304N00629646EA0264002555000
+B1550234554274N00629652EA0265202567000
+B1550304554304N00629647EA0267202581000
+B1550374554297N00629694EA0268302595000
+B1550444554272N00629667EA0268902610000
+B1550514554297N00629671EA0270602624000
+B1550584554289N00629724EA0271802639000
+B1551054554255N00629741EA0271902652000
+B1551124554228N00629710EA0272502659000
+B1551194554255N00629700EA0272902669000
+B1551264554251N00629754EA0273502678000
+B1551334554232N00629814EA0274602685000
+B1551414554214N00629876EA0275402694000
+B1551484554205N00629903EV0276202695000
+B1551554554179N00629995EA0277202697000
+B1552024554177N00630061EA0277402706000
+B1552094554175N00630120EA0276702715000
+B1552164554169N00630183EA0275802719000
+B1552234554165N00630210EV0274902721000
+B1552304554150N00630301EV0273702722000
+B1552374554141N00630368EA0272202722000
+B1552444554130N00630430EA0271102721000
+B1552514554117N00630492EA0270202718000
+B1552584554097N00630558EA0269602712000
+B1553054554074N00630616EA0269002704000
+B1553124554047N00630671EA0268302696000
+B1553194554018N00630727EA0267902689000
+B1553264553991N00630782EA0267102681000
+B1553334553964N00630837EA0266702673000
+B1553404553940N00630892EA0266702665000
+B1553474553923N00630951EA0266702660000
+B1553544553909N00631015EA0266802655000
+B1554014553889N00631066EA0267802653000
+B1554084553853N00631072EA0268302653000
+B1554154553864N00631023EA0269302655000
+B1554224553899N00631032EA0269602658000
+B1554294553897N00631087EA0270302662000
+B1554364553863N00631107EA0270302667000
+B1554434553852N00631055EA0270802670000
+B1554504553886N00631049EA0271502675000
+B1554574553887N00631107EA0272602679000
+B1555044553884N00631157EA0272302685000
+B1555114553877N00631223EA0272502688000
+B1555184553873N00631286EA0272402691000
+B1555254553872N00631349EA0272202694000
+B1555324553874N00631413EA0272502695000
+B1555394553872N00631474EA0273102698000
+B1555464553875N00631527EA0272602701000
+B1555534553874N00631584EA0272002702000
+B1556004553872N00631641EA0271402703000
+B1556074553866N00631699EA0270402703000
+B1556144553857N00631758EA0269002700000
+B1556214553850N00631819EA0267902697000
+B1556284553849N00631877EA0267202696000
+B1556354553840N00631940EA0266002689000
+B1556424553824N00632003EA0265202684000
+B1556494553812N00632063EA0264302682000
+B1556564553802N00632119EA0263302678000
+B1557034553790N00632183EA0263402670000
+B1557104553778N00632248EA0264002660000
+B1557174553774N00632304EA0264702654000
+B1557254553748N00632315EA0265302647000
+B1557324553761N00632274EA0265402643000
+B1557394553784N00632323EA0265002640000
+B1557464553773N00632387EA0265702638000
+B1557534553755N00632443EA0266702637000
+B1558004553737N00632483EA0267102639000
+B1558074553719N00632441EA0267202642000
+B1558144553749N00632402EA0268102645000
+B1558214553774N00632431EA0268602649000
+B1558284553747N00632435EA0268902654000
+B1558354553766N00632406EA0269002657000
+B1558424553776N00632458EA0269502660000
+B1558494553770N00632508EA0269702663000
+B1558564553765N00632563EA0268402665000
+B1559034553762N00632625EA0267602664000
+B1559104553759N00632686EA0266702660000
+B1559174553758N00632745EA0266202656000
+B1559244553755N00632806EA0264802650000
+B1559314553752N00632867EA0263402641000
+B1559384553750N00632931EA0262502632000
+B1559454553749N00632990EA0261102624000
+B1559524553759N00633052EA0260102615000
+B1559594553761N00633115EA0259802606000
+B1600064553759N00633180EA0259302598000
+B1600134553757N00633249EA0259202592000
+B1600204553750N00633315EA0258502585000
+B1600274553746N00633387EA0257902578000
+B1600344553749N00633452EA0258302572000
+B1600414553754N00633514EA0257702569000
+B1600484553744N00633581EA0257102565000
+B1600554553736N00633648EA0257002560000
+B1601024553735N00633707EA0256302557000
+B1601094553732N00633779EA0256202552000
+B1601164553734N00633850EA0255702549000
+B1601234553736N00633918EA0255402545000
+B1601304553728N00633982EA0254802540000
+B1601374553715N00634044EA0254602536000
+B1601444553701N00634105EA0254202533000
+B1601514553691N00634169EA0254102531000
+B1601584553685N00634235EA0253802529000
+B1602054553681N00634300EA0253202526000
+B1602124553676N00634364EA0252802523000
+B1602194553676N00634432EA0252202519000
+B1602264553680N00634501EA0251502514000
+B1602334553687N00634570EA0250802509000
+B1602404553693N00634641EA0250002502000
+B1602474553694N00634711EA0249502496000
+B1602544553682N00634779EA0248902490000
+B1603024553672N00634856EA0248102483000
+B1603094553668N00634923EA0247302478000
+B1603164553661N00634992EA0246602471000
+B1603234553652N00635061EA0246002465000
+B1603304553645N00635133EA0245302458000
+B1603374553644N00635207EA0244702452000
+B1603444553643N00635277EA0243902445000
+B1603514553642N00635350EA0242902438000
+B1603584553643N00635423EA0242102430000
+B1604054553647N00635495EA0241102421000
+B1604124553648N00635567EA0240302413000
+B1604194553646N00635640EA0239502404000
+B1604264553641N00635712EA0238702396000
+B1604334553637N00635784EA0237902387000
+B1604404553630N00635853EA0237202378000
+B1604474553620N00635923EA0236502370000
+B1604544553609N00635992EA0235702361000
+B1605014553602N00636063EA0235002353000
+B1605084553597N00636131EA0234402345000
+B1605154553593N00636197EA0233702338000
+B1605224553590N00636263EA0232902331000
+B1605294553585N00636329EA0232102323000
+B1605364553577N00636395EA0231402316000
+B1605434553568N00636461EA0230602308000
+B1605504553560N00636526EA0229902300000
+B1605574553551N00636591EA0229102293000
+B1606044553543N00636657EA0228402285000
+B1606114553537N00636724EA0227602279000
+B1606184553534N00636790EA0226802272000
+B1606254553526N00636856EA0226102265000
+B1606324553518N00636922EA0225602259000
+B1606394553511N00636990EA0225002253000
+B1606464553505N00637056EA0224302250000
+B1606534553499N00637122EA0223502242000
+B1607004553496N00637190EA0222802233000
+B1607074553495N00637257EA0222102225000
+B1607144553494N00637325EA0221402216000
+B1607214553492N00637392EA0220602207000
+B1607284553487N00637459EA0219802200000
+B1607354553484N00637528EA0218802192000
+B1607424553479N00637596EA0218002184000
+B1607494553472N00637664EA0217102174000
+B1607564553468N00637733EA0216102165000
+B1608034553463N00637801EA0215302156000
+B1608104553459N00637871EA0214302147000
+B1608174553459N00637941EA0213202137000
+B1608244553459N00638012EA0212202127000
+B1608314553455N00638082EA0211302117000
+B1608384553446N00638147EA0210202108000
+B1608454553444N00638216EA0209502100000
+B1608524553444N00638287EA0208602091000
+B1609004553447N00638367EA0207602080000
+B1609074553449N00638436EA0206802072000
+B1609144553451N00638507EA0206102064000
+B1609214553449N00638579EA0205402056000
+B1609284553446N00638649EA0204802050000
+B1609354553443N00638720EA0204202042000
+B1609424553440N00638790EA0203502034000
+B1609494553436N00638861EA0202602028000
+B1609564553434N00638931EA0201702022000
+B1610034553431N00639003EA0200702014000
+B1610104553427N00639070EA0199502005000
+B1610174553423N00639142EA0198401995000
+B1610244553417N00639212EA0197701984000
+B1610314553410N00639281EA0196901974000
+B1610384553406N00639355EA0196301965000
+B1610454553407N00639423EA0195001956000
+B1610524553408N00639488EA0193501946000
+B1610594553409N00639554EA0192501935000
+B1611064553403N00639621EA0191301925000
+B1611134553396N00639692EA0190201914000
+B1611204553385N00639766EA0190401904000
+B1611274553376N00639836EA0189801895000
+B1611344553362N00639907EA0189401888000
+B1611414553353N00639978EA0188901882000
+B1611484553348N00640049EA0188101876000
+B1611554553348N00640119EA0187701870000
+B1612024553349N00640191EA0187301864000
+B1612094553351N00640264EA0186801858000
+B1612164553351N00640339EA0186401852000
+B1612234553349N00640415EA0185701846000
+B1612304553344N00640492EA0185001840000
+B1612374553340N00640569EA0184501833000
+B1612444553338N00640647EA0184201827000
+B1612514553340N00640725EA0183801822000
+B1612584553339N00640800EA0184201818000
+B1613054553339N00640864EA0182901814000
+B1613124553337N00640939EA0182401810000
+B1613194553335N00641016EA0181701806000
+B1613264553335N00641093EA0181101801000
+B1613334553336N00641171EA0180301795000
+B1613404553339N00641248EA0179701789000
+B1613474553341N00641327EA0179101782000
+B1613544553341N00641408EA0178701776000
+B1614014553343N00641484EA0177901769000
+B1614084553352N00641558EA0177001763000
+B1614154553360N00641634EA0176101756000
+B1614224553373N00641706EA0175301749000
+B1614294553384N00641780EA0174301742000
+B1614364553390N00641857EA0173101732000
+B1614444553397N00641948EA0172201721000
+B1614514553400N00642027EA0171601712000
+B1614584553404N00642103EA0170901703000
+B1615054553411N00642181EA0170401695000
+B1615124553416N00642258EA0169901688000
+B1615194553422N00642335EA0169101681000
+B1615264553429N00642412EA0168101672000
+B1615334553435N00642489EA0167001664000
+B1615404553441N00642568EA0166301655000
+B1615474553445N00642642EA0165401646000
+B1615544553448N00642709EA0164401637000
+B1616014553452N00642775EA0163401628000
+B1616084553463N00642846EA0162801620000
+B1616154553467N00642920EA0162101613000
+B1616224553470N00642995EA0160901605000
+B1616294553472N00643076EA0161101598000
+B1616364553477N00643152EA0160601591000
+B1616434553481N00643230EA0160901586000
+B1616504553483N00643308EA0161401583000
+B1616574553479N00643385EA0161901582000
+B1617044553475N00643461EA0162001582000
+B1617114553442N00643506EA0161601582000
+B1617184553432N00643476EA0161801581000
+B1617254553454N00643460EA0162201582000
+B1617324553483N00643472EA0162701582000
+B1617394553476N00643539EA0162701583000
+B1617464553438N00643542EA0163201584000
+B1617534553444N00643517EA0163501585000
+B1618004553465N00643573EA0164201586000
+B1618074553435N00643620EA0164401586000
+B1618144553436N00643596EA0164701587000
+B1618214553463N00643645EA0165001589000
+B1618284553455N00643724EA0165501594000
+B1618354553418N00643756EA0165901599000
+B1618424553418N00643734EA0166101601000
+B1618494553443N00643777EA0166001606000
+B1618564553419N00643840EA0166301608000
+B1619034553376N00643854EA0166601611000
+B1619104553348N00643912EA0166801614000
+B1619174553365N00643970EA0167001618000
+B1619244553391N00643977EA0167101621000
+B1619314553379N00643960EA0167301624000
+B1619384553338N00643964EA0167501626000
+B1619454553292N00643983EA0167501628000
+B1619524553248N00644003EA0167401629000
+B1619594553204N00644021EA0167501630000
+B1620064553163N00644040EA0167501631000
+B1620134553117N00644050EA0167501632000
+B1620204553073N00644065EA0168301634000
+B1620274553063N00644044EA0169001636000
+B1620344553084N00644073EA0168501639000
+B1620424553054N00644114EA0169201642000
+B1620494553013N00644141EA0169701646000
+B1620564552973N00644169EA0170401650000
+B1621034552955N00644149EA0171501654000
+B1621104552983N00644168EA0173101660000
+B1621174553010N00644198EA0174001668000
+B1621244553037N00644214EA0174801677000
+B1621314553038N00644199EV0175001682000
+B1621384553004N00644154EA0175901682000
+B1621454553004N00644140EA0176501684000
+B1621524553009N00644184EV0176701687000
+B1621594552974N00644200EA0178101691000
+B1622064552989N00644207EA0178501692000
+B1622134552962N00644251EA0179601700000
+B1622204552940N00644268EV0180301707000
+B1622274552892N00644291EA0181201711000
+B1622344552892N00644291EV0181701711000
+B1622414552892N00644291EV0182301711000
+B1622484552779N00644345EA0182801711000
+B1622554552734N00644366EA0183301724000
+B1623024552695N00644378EA0184601741000
+B1623094552698N00644353EA0186201753000
+B1623164552721N00644394EA0187701770000
+B1623234552679N00644424EA0189001785000
+B1623304552657N00644398EA0191401801000
+B1623374552667N00644449EA0192701811000
+B1623444552647N00644453EA0194701821000
+B1623514552646N00644510EA0196001837000
+B1623584552627N00644500EA0197701853000
+B1624054552638N00644490EA0198601866000
+B1624124552651N00644508EA0197601884000
+B1624194552619N00644576EA0198501903000
+B1624264552587N00644581EA0198501917000
+B1624334552598N00644573EA0198201923000
+B1624404552608N00644559EA0197601928000
+B1624474552615N00644539EA0197101931000
+B1624544552623N00644522EA0197301933000
+B1625014552641N00644530EA0196601935000
+B1625084552664N00644544EA0195901934000
+B1625154552665N00644519EA0194301932000
+B1625224552653N00644490EA0195101928000
+B1625294552629N00644468EA0195101925000
+B1625364552601N00644448EA0195001923000
+B1625434552600N00644427EA0194801921000
+B1625504552616N00644412EA0194901920000
+B1625574552634N00644402EA0195001920000
+B1626044552659N00644411EA0194901919000
+B1626114552684N00644428EA0194801918000
+B1626184552677N00644418EA0194101917000
+B1626254552632N00644424EA0193701917000
+B1626334552600N00644406EA0193901915000
+B1626404552609N00644385EA0193901913000
+B1626474552630N00644435EA0194201912000
+B1626544552595N00644484EA0194401911000
+B1627014552553N00644490EA0195501911000
+B1627084552539N00644483EA0195701912000
+B1627154552567N00644513EA0196801914000
+B1627224552557N00644575EA0196501914000
+B1627294552537N00644554EA0197301919000
+B1627364552552N00644541EA0196501923000
+B1627434552569N00644529EA0196301925000
+B1627504552594N00644529EA0195601925000
+B1627574552620N00644528EA0195501923000
+B1628044552646N00644529EA0195401923000
+B1628114552670N00644525EA0194901921000
+B1628184552695N00644523EA0194601919000
+B1628254552719N00644519EA0194001916000
+B1628324552745N00644513EA0194101912000
+B1628394552767N00644512EA0194401910000
+B1628464552786N00644503EA0195601910000
+B1628534552798N00644563EA0195701911000
+B1629004552761N00644607EA0196701911000
+B1629074552751N00644587EA0197401912000
+B1629144552771N00644604EA0197301916000
+B1629214552744N00644652EA0197601921000
+B1629284552715N00644639EA0197401925000
+B1629354552722N00644613EA0197201927000
+B1629424552747N00644601EA0197501930000
+B1629494552775N00644601EA0197101932000
+B1629564552804N00644601EA0197301933000
+B1630034552832N00644598EA0196601934000
+B1630104552857N00644598EA0196101934000
+B1630174552881N00644596EA0196101934000
+B1630244552904N00644594EA0195601934000
+B1630314552929N00644585EA0196201931000
+B1630384552957N00644583EA0197201930000
+B1630454552987N00644582EA0197901932000
+B1630524553014N00644583EA0198301936000
+B1630594553048N00644595EA0198801939000
+B1631064553079N00644602EA0197601943000
+B1631134553112N00644607EA0196601942000
+B1631204553148N00644625EA0195601940000
+B1631274553183N00644638EA0195101935000
+B1631344553217N00644651EA0194201931000
+B1631414553254N00644667EA0194101926000
+B1631484553294N00644684EA0193601921000
+B1631554553335N00644702EA0193101918000
+B1632024553375N00644715EA0192201913000
+B1632094553416N00644726EA0191301907000
+B1632164553460N00644736EA0190901900000
+B1632234553495N00644733EA0192601895000
+B1632314553525N00644740EA0193701895000
+B1632384553535N00644785EA0195301896000
+B1632454553517N00644786EA0196501901000
+B1632524553549N00644804EA0197801909000
+B1632594553539N00644874EA0199301916000
+B1633064553528N00644857EA0200801926000
+B1633134553555N00644912EA0202101937000
+B1633204553527N00644938EA0203601949000
+B1633274553547N00644931EA0205201959000
+B1633344553547N00645001EA0206101973000
+B1633414553532N00644987EA0208501983000
+B1633484553556N00644997EA0209001996000
+B1633554553561N00645079EA0210302012000
+B1634024553543N00645080EA0212402024000
+B1634094553554N00645144EA0213702035000
+B1634164553531N00645148EA0215202052000
+B1634234553553N00645180EA0216502069000
+B1634304553540N00645229EA0217802078000
+B1634374553546N00645221EA0219202087000
+B1634444553548N00645291EA0220002101000
+B1634514553517N00645294EA0220902114000
+B1634584553537N00645280EA0221902128000
+B1635054553545N00645338EV0222002138000
+B1635124553510N00645377EA0223302144000
+B1635194553501N00645351EV0224402151000
+B1635264553521N00645391EA0224602158000
+B1635334553495N00645442EA0225602161000
+B1635404553476N00645422EA0226302170000
+B1635474553499N00645432EA0226002179000
+B1635544553482N00645499EA0226902186000
+B1636014553452N00645489EA0227202195000
+B1636084553478N00645496EA0226902196000
+B1636154553481N00645577EA0227402203000
+B1636224553453N00645636EA0227302211000
+B1636294553419N00645694EA0226402217000
+B1636364553391N00645766EA0224702219000
+B1636434553364N00645838EA0223302219000
+B1636504553337N00645908EA0222402214000
+B1636574553309N00645969EA0221202208000
+B1637044553282N00646032EA0220302200000
+B1637114553256N00646093EA0219502192000
+B1637184553233N00646154EA0218602184000
+B1637254553209N00646215EA0217702176000
+B1637324553176N00646266EA0218102169000
+B1637394553155N00646315EA0218002165000
+B1637464553134N00646373EA0217202161000
+B1637534553105N00646429EA0216502157000
+B1638004553077N00646481EA0216002152000
+B1638074553057N00646538EA0214602147000
+B1638144553036N00646600EA0213602140000
+B1638224553005N00646667EA0213002131000
+B1638294552978N00646721EA0212502123000
+B1638364552953N00646781EA0211602115000
+B1638434552929N00646847EA0210802107000
+B1638504552902N00646909EA0210102098000
+B1638574552876N00646969EA0209102090000
+B1639044552851N00647025EA0208302081000
+B1639114552823N00647080EA0207602073000
+B1639184552793N00647137EA0206302065000
+B1639254552762N00647195EA0205102056000
+B1639324552731N00647248EA0205102049000
+B1639394552699N00647306EA0204602042000
+B1639464552665N00647358EA0203802035000
+B1639534552635N00647420EA0203602028000
+B1640004552607N00647487EA0203702022000
+B1640074552578N00647553EA0203402018000
+B1640144552549N00647619EA0202602013000
+B1640214552527N00647691EA0202102008000
+B1640284552505N00647764EA0202002004000
+B1640354552483N00647838EA0201902000000
+B1640424552464N00647914EA0202001997000
+B1640494552441N00647991EA0201601994000
+B1640564552420N00648058EA0202301992000
+B1641034552394N00648116EA0202201991000
+B1641104552366N00648171EA0202901991000
+B1641174552338N00648219EA0203501993000
+B1641244552318N00648272EA0203301995000
+B1641314552310N00648332EA0202801996000
+B1641384552308N00648398EA0202601995000
+B1641454552306N00648463EA0202901995000
+B1641524552304N00648525EA0202901996000
+B1641594552304N00648585EA0203701997000
+B1642064552311N00648640EA0203401998000
+B1642134552318N00648697EA0203401999000
+B1642204552323N00648749EA0203602000000
+B1642274552324N00648799EA0203802002000
+B1642344552332N00648850EA0203302003000
+B1642414552334N00648903EA0203102003000
+B1642484552346N00648955EA0203102001000
+B1642554552362N00648999EA0202902001000
+B1643024552390N00649033EA0203402000000
+B1643094552414N00649062EA0204402001000
+B1643164552440N00649086EA0205702004000
+B1643234552455N00649077EA0205002009000
+B1643304552412N00649061EA0205902012000
+B1643374552368N00649050EA0206902013000
+B1643444552340N00649027EA0206302014000
+B1643514552365N00649018EA0207702015000
+B1643584552380N00649060EA0208102021000
+B1644054552402N00649096EA0209102027000
+B1644124552409N00649072EA0209202035000
+B1644194552365N00649056EA0210502041000
+B1644274552325N00649041EA0210702047000
+B1644344552345N00649017EA0210502051000
+B1644414552366N00649056EA0211402057000
+B1644484552384N00649093EA0212002064000
+B1644554552407N00649121EA0212402070000
+B1645024552400N00649093EA0211902074000
+B1645094552359N00649071EA0212102077000
+B1645164552327N00649040EA0212702081000
+B1645234552339N00649005EA0212302083000
+B1645304552351N00649058EA0213102087000
+B1645374552373N00649095EA0213502091000
+B1645444552370N00649068EA0212902094000
+B1645514552326N00649058EA0213202095000
+B1645584552289N00649034EA0213602095000
+B1646054552269N00648998EA0213202096000
+B1646124552292N00649023EA0214202098000
+B1646194552313N00649060EA0214602100000
+B1646264552338N00649093EA0214402103000
+B1646334552371N00649108EA0214202105000
+B1646404552400N00649106EA0214002106000
+B1646474552367N00649089EA0213402107000
+B1646544552331N00649065EA0213002106000
+B1647014552350N00649042EA0212502104000
+B1647084552375N00649082EA0211902102000
+B1647154552406N00649122EA0211602098000
+B1647224552435N00649160EA0211502094000
+B1647294552461N00649202EA0211802091000
+B1647364552475N00649256EA0212202090000
+B1647434552453N00649258EA0210802088000
+B1647504552485N00649284EA0211202087000
+B1647574552504N00649339EA0211202086000
+B1648044552522N00649389EA0210502085000
+B1648114552547N00649442EA0209302082000
+B1648184552576N00649497EA0209102077000
+B1648254552603N00649557EA0208502072000
+B1648324552629N00649612EA0208402067000
+B1648394552663N00649655EA0208302064000
+B1648464552697N00649701EA0207102060000
+B1648534552730N00649756EA0205902054000
+B1649004552764N00649811EA0205202047000
+B1649074552800N00649862EA0205102041000
+B1649144552828N00649911EA0205802037000
+B1649214552827N00649938EV0206102036000
+B1649284552786N00650011EA0206802035000
+B1649354552743N00650025EA0207602035000
+B1649424552701N00650022EA0208002036000
+B1649494552695N00649989EA0207902036000
+B1649564552729N00650006EA0208202038000
+B1650034552767N00650013EA0209002041000
+B1650104552803N00650015EA0209302045000
+B1650174552819N00649986EA0209902048000
+B1650244552786N00650002EA0210902050000
+B1650314552759N00650048EA0211202056000
+B1650394552719N00650064EA0211802062000
+B1650464552711N00650033EA0211402066000
+B1650534552747N00650027EA0211402069000
+B1651004552785N00650029EA0212002072000
+B1651074552824N00650034EA0212302076000
+B1651144552862N00650084EA0212402079000
+B1651214552895N00650139EA0212802082000
+B1651284552919N00650193EA0212802085000
+B1651354552942N00650251EA0212602087000
+B1651424552968N00650305EA0212402088000
+B1651494552990N00650362EA0212102088000
+B1651564553012N00650426EA0211602088000
+B1652034553040N00650490EA0211302086000
+B1652104553071N00650556EA0210802084000
+B1652174553102N00650626EA0209702081000
+B1652244553129N00650699EA0208502076000
+B1652314553155N00650769EA0207802071000
+B1652384553180N00650837EA0207302065000
+B1652454553208N00650903EA0207202060000
+B1652524553233N00650967EA0207102056000
+B1652594553259N00651041EA0207102052000
+B1653064553285N00651116EA0207102049000
+B1653134553309N00651194EA0208102048000
+B1653204553317N00651248EA0208202049000
+B1653274553301N00651268EV0208102049000
+B1653344553327N00651265EA0208102050000
+B1653414553360N00651314EA0208202050000
+B1653484553381N00651364EA0207902050000
+B1653554553403N00651415EA0207102050000
+B1654024553433N00651473EA0206002047000
+B1654094553468N00651533EA0205002041000
+B1654164553502N00651599EA0203502034000
+B1654234553540N00651652EA0202302025000
+B1654304553576N00651714EA0201202016000
+B1654374553611N00651777EA0200202005000
+B1654444553655N00651831EA0200101997000
+B1654514553696N00651886EA0199901989000
+B1654584553734N00651942EA0199501983000
+B1655054553769N00652002EA0199601978000
+B1655124553804N00652060EA0199201975000
+B1655194553844N00652114EA0198901972000
+B1655264553882N00652166EA0199001968000
+B1655334553924N00652214EA0198801965000
+B1655404553964N00652253EA0199801963000
+B1655474553969N00652307EV0199901963000
+B1655544553952N00652321EA0200201963000
+B1656014553981N00652296EA0201301963000
+B1656084554018N00652319EA0202101966000
+B1656154554008N00652378EA0202601970000
+B1656224553986N00652359EA0203601974000
+B1656294554018N00652347EA0204101982000
+B1656364554035N00652406EA0205201991000
+B1656434554010N00652420EA0206102000000
+B1656504554028N00652401EA0207302009000
+B1656584554031N00652465EA0208402019000
+B1657054554009N00652453EA0209302027000
+B1657124554037N00652442EA0210202035000
+B1657194554038N00652497EA0211602044000
+B1657264554017N00652488EA0212602054000
+B1657334554047N00652479EA0213202063000
+B1657404554054N00652544EA0214502073000
+B1657474554027N00652563EA0215502084000
+B1657544554051N00652545EA0216402095000
+B1658014554065N00652600EA0217502107000
+B1658084554035N00652616EA0218302118000
+B1658154554041N00652586EA0218702128000
+B1658224554082N00652601EA0219602139000
+B1658294554074N00652652EA0220702149000
+B1658364554087N00652634EA0221702158000
+B1658434554093N00652689EA0222802167000
+B1658504554085N00652674EA0223502176000
+B1658574554121N00652689EA0224802186000
+B1659044554118N00652748EA0226202196000
+B1659114554100N00652754EV0226702202000
+B1659184554120N00652737EA0227502208000
+B1659254554161N00652759EA0228602217000
+B1659324554156N00652803EA0229302226000
+B1659394554141N00652769EA0230002234000
+B1659464554175N00652751EA0230702242000
+B1659534554180N00652806EA0232302249000
+B1700004554173N00652778EA0232902257000
+B1700074554214N00652804EA0233802265000
+B1700144554230N00652861EA0234802275000
+B1700214554207N00652872EA0235702286000
+B1700284554220N00652840EA0236202298000
+B1700354554255N00652882EA0237302309000
+B1700424554241N00652937EA0238102319000
+B1700494554222N00652927EA0238502327000
+B1700564554260N00652920EA0238602335000
+B1701034554299N00652968EA0239002343000
+B1701104554344N00653003EA0239802348000
+B1701174554387N00653047EA0239102353000
+B1701244554433N00653089EA0238702355000
+B1701314554476N00653139EA0238402356000
+B1701384554523N00653185EA0236502355000
+B1701454554571N00653234EA0235402351000
+B1701524554619N00653286EA0234502345000
+B1701594554665N00653341EA0234002338000
+B1702064554708N00653399EA0233402331000
+B1702134554754N00653461EA0232802325000
+B1702204554796N00653527EA0233302319000
+B1702274554837N00653589EA0233502315000
+B1702344554878N00653636EA0232402312000
+B1702424554922N00653698EA0230902307000
+B1702494554963N00653752EA0229502300000
+B1702564555006N00653812EA0228002291000
+B1703034555046N00653862EA0227802283000
+B1703104555085N00653911EA0227502275000
+B1703174555125N00653955EA0226702268000
+B1703244555162N00654002EA0225302260000
+B1703314555207N00654047EA0224402251000
+B1703384555252N00654092EA0224702244000
+B1703454555298N00654138EA0224502238000
+B1703524555345N00654170EA0223602232000
+B1703594555396N00654190EA0222802226000
+B1704064555446N00654222EA0223002220000
+B1704134555491N00654263EA0223202216000
+B1704204555528N00654300EA0223602214000
+B1704274555571N00654344EA0224002213000
+B1704344555616N00654388EA0224102212000
+B1704414555660N00654417EA0225602214000
+B1704484555662N00654405EA0227002217000
+B1704554555675N00654456EA0227702223000
+B1705024555712N00654451EA0228602229000
+B1705094555707N00654434EA0228702234000
+B1705164555726N00654495EA0229602240000
+B1705234555765N00654529EA0230102248000
+B1705304555813N00654561EA0229102254000
+B1705374555859N00654612EA0228302256000
+B1705444555905N00654661EA0227502255000
+B1705514555941N00654719EA0226602252000
+B1705584555974N00654774EA0225702248000
+B1706054556008N00654828EA0224802243000
+B1706124556039N00654886EA0224202236000
+B1706194556067N00654948EA0223902230000
+B1706264556096N00655006EA0223502224000
+B1706334556125N00655065EA0223002219000
+B1706404556158N00655115EA0222202213000
+B1706474556198N00655152EA0221502207000
+B1706544556239N00655189EA0220402201000
+B1707014556280N00655222EA0219602195000
+B1707084556321N00655258EA0218702188000
+B1707154556361N00655298EA0218202180000
+B1707224556396N00655345EA0217702173000
+B1707294556428N00655400EA0217402166000
+B1707364556460N00655455EA0217102160000
+B1707434556492N00655511EA0217202155000
+B1707504556525N00655561EA0216902151000
+B1707574556560N00655596EA0218102149000
+B1708044556592N00655621EA0218402149000
+B1708114556625N00655645EA0218402149000
+B1708184556663N00655646EA0218502150000
+B1708254556700N00655635EA0219902151000
+B1708324556740N00655636EA0221302155000
+B1708394556776N00655629EA0223202162000
+B1708474556788N00655603EA0224702171000
+B1708544556766N00655635EA0225702179000
+B1709014556797N00655658EA0227502188000
+B1709084556832N00655649EA0228902200000
+B1709154556824N00655644EA0230302213000
+B1709224556801N00655701EA0232102223000
+B1709294556775N00655759EA0234102231000
+B1709364556765N00655753EA0235202240000
+B1709434556802N00655743EA0236802256000
+B1709504556839N00655738EA0238902275000
+B1709574556860N00655713EA0240302293000
+B1710044556834N00655740EA0241902310000
+B1710114556805N00655783EA0243502329000
+B1710184556775N00655829EA0245502347000
+B1710254556749N00655845EA0248102363000
+B1710324556762N00655871EA0250502375000
+B1710394556757N00655860EA0252502389000
+B1710464556786N00655851EA0254402414000
+B1710534556802N00655819EA0255302437000
+B1711004556775N00655842EA0256402458000
+B1711074556760N00655908EA0257602476000
+B1711144556740N00655980EA0259502493000
+B1711214556727N00655976EA0260702507000
+B1711284556754N00656023EA0261202525000
+B1711354556748N00656065EA0262102535000
+B1711424556761N00656031EA0263502545000
+B1711494556771N00656002EA0264902556000
+B1711564556774N00655969EA0265902568000
+B1712034556796N00655941EA0267102588000
+B1712104556800N00655907EA0268102603000
+B1712174556781N00655947EA0269002615000
+B1712244556787N00656018EA0270602628000
+B1712314556764N00656070EA0270702640000
+B1712384556758N00656042EA0271002649000
+B1712454556767N00656006EA0271302657000
+B1712524556794N00655983EA0271902665000
+B1712594556821N00655954EA0273202674000
+B1713064556845N00655923EA0274602682000
+B1713134556872N00655902EA0275802692000
+B1713204556881N00655958EA0277402703000
+B1713274556850N00655961EA0278902715000
+B1713344556865N00655925EA0280202727000
+B1713414556899N00655948EA0281702740000
+B1713484556876N00655976EA0283302753000
+B1713554556881N00655940EA0284702768000
+B1714024556912N00655972EA0286102782000
+B1714094556894N00656026EA0288002797000
+B1714174556872N00656000EA0289102814000
+B1714244556903N00655989EA0290802829000
+B1714314556912N00656050EA0292402844000
+B1714384556880N00656073EA0293702858000
+B1714454556878N00656042EA0295102873000
+B1714524556912N00656052EA0296002889000
+B1714594556918N00656109EA0297102902000
+B1715064556887N00656129EA0298502915000
+B1715134556867N00656107EA0299202928000
+B1715204556882N00656075EA0300902941000
+B1715274556903N00656056EA0302102952000
+B1715344556933N00656072EA0304202966000
+B1715414556947N00656116EA0306502983000
+B1715484556916N00656129EA0308002999000
+B1715554556934N00656094EA0310303015000
+B1716024556962N00656128EA0312903033000
+B1716094556990N00656157EA0314503053000
+B1716164557021N00656185EA0315003071000
+B1716234557057N00656213EA0315803086000
+B1716304557093N00656246EA0316603100000
+B1716374557132N00656277EA0316503111000
+B1716444557165N00656308EA0315203119000
+B1716514557199N00656350EA0314003121000
+B1716584557236N00656388EA0313203121000
+B1717054557275N00656417EA0312303118000
+B1717124557313N00656448EA0311303114000
+B1717194557352N00656479EA0310303108000
+B1717264557392N00656502EA0309503101000
+B1717334557433N00656529EA0308903094000
+B1717404557471N00656561EA0308303089000
+B1717474557509N00656594EA0308003084000
+B1717544557544N00656630EA0307603079000
+B1718014557580N00656666EA0306903073000
+B1718084557615N00656705EA0306203067000
+B1718154557652N00656742EA0305703062000
+B1718224557690N00656777EA0305303057000
+B1718294557728N00656812EA0304703052000
+B1718364557766N00656847EA0304103046000
+B1718434557803N00656881EA0303603040000
+B1718504557839N00656917EA0303003034000
+B1718574557872N00656957EA0302203029000
+B1719044557909N00656992EA0301503023000
+B1719114557950N00657019EA0300903023000
+B1719184557989N00657048EA0300303020000
+B1719254558027N00657077EA0299603013000
+B1719324558064N00657104EA0298403006000
+B1719394558100N00657134EA0297802999000
+B1719464558136N00657166EA0297002989000
+B1719544558174N00657210EA0296202979000
+B1720014558207N00657250EA0295602970000
+B1720084558241N00657288EA0294602961000
+B1720154558276N00657322EA0293702952000
+B1720224558312N00657361EA0293002943000
+B1720294558345N00657392EA0292002934000
+B1720364558381N00657424EA0290402924000
+B1720434558417N00657455EA0289602913000
+B1720504558454N00657484EA0288402902000
+B1720574558492N00657510EA0287602892000
+B1721044558530N00657531EA0286802881000
+B1721114558568N00657554EA0285902871000
+B1721184558606N00657576EA0284902861000
+B1721254558645N00657587EA0284202852000
+B1721324558684N00657612EA0283202843000
+B1721394558724N00657635EA0281602834000
+B1721464558768N00657652EA0280702825000
+B1721534558810N00657666EA0280002815000
+B1722004558852N00657685EA0279302805000
+B1722074558893N00657707EA0278402796000
+B1722144558936N00657728EA0277402786000
+B1722214558980N00657748EA0276502776000
+B1722284559023N00657770EA0276102768000
+B1722354559066N00657789EA0276302761000
+B1722424559104N00657795EA0276902756000
+B1722494559136N00657785EA0277302755000
+B1722564559167N00657767EA0277302754000
+B1723034559205N00657785EA0277502753000
+B1723104559242N00657807EA0276602752000
+B1723174559285N00657828EA0276302749000
+B1723244559323N00657852EA0276002746000
+B1723314559359N00657882EA0274702741000
+B1723384559398N00657915EA0274002736000
+B1723454559436N00657948EA0273502731000
+B1723524559474N00657985EA0273002725000
+B1723594559510N00658023EA0272402720000
+B1724064559547N00658057EA0271802715000
+B1724134559584N00658091EA0270802709000
+B1724204559624N00658121EA0270102703000
+B1724274559664N00658155EA0269302696000
+B1724344559702N00658193EA0268502688000
+B1724414559743N00658219EA0267402681000
+B1724484559786N00658241EA0266302672000
+B1724554559830N00658253EA0265002663000
+B1725024559872N00658278EA0263902653000
+B1725094559915N00658302EA0262902643000
+B1725164559959N00658326EA0261902633000
+B1725234559982N00658287EA0260602623000
+B1725314559963N00658219EA0259602611000
+B1725384559940N00658163EA0258702600000
+B1725454559912N00658105EA0258002590000
+B1725524559897N00658055EA0257402582000
+B1725594559932N00658050EA0256402573000
+B1726064559962N00658094EA0255502567000
+B1726134559932N00658108EA0254602559000
+B1726204559899N00658065EA0253802550000
+B1726274559869N00658019EA0252902542000
+B1726344559837N00657972EA0251902532000
+B1726414559803N00657925EA0251202523000
+B1726484559767N00657878EA0250702514000
+B1726554559729N00657834EA0250702508000
+B1727024559697N00657793EA0249702500000
+B1727094559663N00657753EA0249102492000
+B1727164559631N00657707EA0248502485000
+B1727234559599N00657660EA0248102479000
+B1727304559566N00657614EA0247602473000
+B1727374559533N00657572EA0247002467000
+B1727444559496N00657531EA0246702461000
+B1727514559463N00657487EA0246002456000
+B1727584559426N00657447EA0245002450000
+B1728054559391N00657402EA0244202443000
+B1728124559356N00657359EA0242902435000
+B1728194559316N00657324EA0242002426000
+B1728264559275N00657292EA0241202418000
+B1728334559233N00657257EA0240402409000
+B1728404559191N00657219EA0239402401000
+B1728474559148N00657187EA0239302393000
+B1728544559103N00657161EA0239902387000
+B1729014559067N00657126EA0239602384000
+B1729084559033N00657080EA0238802379000
+B1729154558997N00657038EA0238402375000
+B1729224558957N00657008EA0237102370000
+B1729294558909N00656969EA0235402363000
+B1729364558862N00656918EA0234002354000
+B1729434558812N00656872EA0232802345000
+B1729504558763N00656824EA0231802336000
+B1729574558719N00656771EA0229902326000
+B1730044558677N00656711EA0228402315000
+B1730114558637N00656647EA0227202303000
+B1730184558596N00656589EA0226102290000
+B1730254558554N00656535EA0224902278000
+B1730324558512N00656477EA0223802265000
+B1730394558473N00656421EA0222302253000
+B1730464558433N00656366EA0220502240000
+B1730534558393N00656310EA0219402226000
+B1731014558344N00656243EA0218402211000
+B1731084558305N00656177EA0217302197000
+B1731154558260N00656113EA0216602184000
+B1731224558211N00656057EA0215302172000
+B1731294558161N00656002EA0215002161000
+B1731364558106N00655951EA0213802150000
+B1731434558051N00655901EA0213202140000
+B1731504557998N00655844EA0212202130000
+B1731574557948N00655786EA0210702121000
+B1732044557896N00655730EA0209002110000
+B1732114557847N00655670EA0207602098000
+B1732184557800N00655615EA0206302086000
+B1732254557753N00655569EA0205902073000
+B1732324557715N00655536EA0205602063000
+B1732394557677N00655509EA0205802056000
+B1732464557639N00655481EA0205502049000
+B1732534557604N00655464EA0205302044000
+B1733004557569N00655448EA0205802040000
+B1733074557535N00655432EA0205502037000
+B1733144557499N00655412EA0205102034000
+B1733214557466N00655392EA0204302030000
+B1733284557435N00655375EA0203302025000
+B1733354557409N00655351EA0201602018000
+B1733424557394N00655297EA0200102009000
+B1733494557384N00655240EA0197901998000
+B1733564557369N00655184EA0195801985000
+B1734034557359N00655134EA0195401971000
+B1734104557349N00655106EA0194901960000
+B1734174557335N00655083EA0193701951000
+B1734244557314N00655041EA0192501939000
+B1734314557296N00654989EA0191301927000
+B1734384557274N00654940EA0190201915000
+B1734454557258N00654880EA0189101903000
+B1734524557245N00654816EA0187201890000
+B1734594557226N00654757EA0186601877000
+B1735064557215N00654696EA0186001865000
+B1735134557203N00654633EA0184901854000
+B1735204557195N00654565EA0183201844000
+B1735274557192N00654491EA0182001833000
+B1735344557186N00654423EA0180801822000
+B1735414557175N00654357EA0179601810000
+B1735484557169N00654287EA0178201800000
+B1735554557169N00654218EA0177001787000
+B1736024557170N00654159EA0176501775000
+B1736094557164N00654107EA0176001764000
+B1736164557155N00654057EA0175201753000
+B1736234557142N00654007EA0174701743000
+B1736304557129N00653958EA0173801734000
+B1736374557116N00653903EA0173501725000
+B1736454557100N00653843EA0173001717000
+B1736524557085N00653794EA0172801711000
+B1736594557061N00653750EA0172001704000
+B1737064557031N00653704EA0170601697000
+B1737134557004N00653655EA0170101688000
+B1737204556985N00653606EA0170701682000
+B1737274556972N00653547EA0171401679000
+B1737344556959N00653493EA0172001679000
+B1737414556940N00653427EA0172801681000
+B1737484556926N00653364EA0173901684000
+B1737554556946N00653314EA0174401688000
+B1738024556970N00653347EA0174901693000
+B1738094556952N00653377EA0175701699000
+B1738164556927N00653333EA0175601706000
+B1738234556905N00653268EA0176101711000
+B1738304556886N00653206EA0175901714000
+B1738374556857N00653157EA0175601717000
+B1738444556830N00653105EA0175101717000
+B1738514556803N00653053EA0174201717000
+B1738584556773N00653004EA0173901714000
+B1739054556749N00652949EA0173301711000
+B1739124556732N00652894EA0172401707000
+B1739194556699N00652827EA0171901702000
+B1739264556673N00652764EA0171001696000
+B1739334556643N00652698EA0169701689000
+B1739404556611N00652622EA0168701681000
+B1739474556583N00652551EA0168301673000
+B1739544556561N00652472EA0167701665000
+B1740014556541N00652404EA0168201659000
+B1740084556518N00652353EA0168101654000
+B1740154556501N00652305EA0168201651000
+B1740224556482N00652263EA0167701648000
+B1740294556462N00652222EA0167401646000
+B1740364556439N00652179EA0166901643000
+B1740434556416N00652133EA0166701639000
+B1740504556391N00652095EA0166401636000
+B1740574556367N00652057EA0166001633000
+B1741044556340N00652026EA0165101629000
+B1741114556315N00651993EA0163701625000
+B1741184556280N00651966EA0162701618000
+B1741254556243N00651941EA0162001611000
+B1741324556209N00651912EA0161801604000
+B1741394556177N00651887EA0160801597000
+B1741464556140N00651873EA0159601589000
+B1741534556100N00651864EA0158301580000
+B1742004556061N00651838EA0157301572000
+B1742074556023N00651833EA0156801564000
+B1742154555977N00651838EA0156101555000
+B1742224555943N00651825EA0155401546000
+B1742294555909N00651798EA0154501538000
+B1742364555878N00651760EA0153901529000
+B1742434555852N00651718EA0152801521000
+B1742504555828N00651670EA0152101513000
+B1742574555805N00651618EA0151301504000
+B1743044555780N00651565EA0150501495000
+B1743114555748N00651521EA0149601486000
+B1743184555720N00651469EA0148801479000
+B1743254555689N00651423EA0147601470000
+B1743324555653N00651390EA0146101462000
+B1743394555606N00651393EA0144401451000
+B1743464555562N00651423EA0142901439000
+B1743534555532N00651473EA0141901427000
+B1744004555523N00651540EA0141201414000
+B1744074555534N00651602EA0140301402000
+B1744144555541N00651668EA0139701390000
+B1744214555539N00651738EA0139401380000
+B1744284555543N00651808EA0138401371000
+B1744354555591N00651824EA0137701363000
+B1744424555637N00651826EA0137601354000
+B1744494555681N00651821EA0137101347000
+B1744564555721N00651821EA0136401341000
+B1745034555759N00651838EA0135401335000
+B1745104555797N00651865EA0134901328000
+B1745174555831N00651894EA0133801322000
+B1745244555864N00651928EA0133001314000
+B1745314555893N00651969EA0132201305000
+B1745384555929N00651998EA0131301297000
+B1745454555939N00652035EA0129801288000
+B1745524555903N00652030EA0128801279000
+B1745594555927N00652070EA0127001269000
+B1746064555915N00652118EA0126801261000
+B1746134555896N00652167EA0126101251000
+B1746204555906N00652207EA0124301242000
+B1746274555893N00652203EA0123201235000
+B1746344555892N00652262EA0122201224000
+B1746414555885N00652322EA0121401213000
+B1746484555878N00652380EA0120401202000
+B1746554555867N00652446EA0119401191000
+B1747024555850N00652505EA0118801181000
+B1747094555826N00652535EA0117501171000
+B1747164555851N00652543EA0116501160000
+B1747234555846N00652529EA0115201152000
+B1747304555862N00652573EA0114501142000
+B1747374555854N00652623EA0114201133000
+B1747444555837N00652650EA0113001124000
+B1747514555845N00652604EA0112601115000
+B1747594555826N00652578EA0111701105000
+B1748064555800N00652585EA0110401096000
+B1748134555771N00652577EA0109401086000
+B1748204555754N00652589EA0109601080000
+B1748274555754N00652590EA0109601075000
+B1748344555755N00652590EA0109501073000
+B1748414555754N00652590EA0109601070000
+B1748484555755N00652589EA0109501068000
+B1748554555755N00652589EA0109601064000
+B1749024555755N00652591EA0109601063000
+B1749094555755N00652592EA0109601061000
+B1749164555753N00652594EA0109601056000
diff --git a/examples/data/kml/2012-02-10.kml b/examples/data/kml/2012-02-10.kml
new file mode 100644
index 0000000..ad7b112
--- /dev/null
+++ b/examples/data/kml/2012-02-10.kml
@@ -0,0 +1,9391 @@
+<kml>
+  <Document>
+    <name>Skimap.org OpenSkiMap </name>
+    <description>Created from OpenStreetMap data. Renderer v0.5</description>
+    <!-- 
+Copyright (c) OpenStreetMap Contributors
+http://www.openstreetmap.org/
+
+This work is licensed under the
+Creative Commons Attribution-ShareAlike 2.0 License.
+http://creativecommons.org/licenses/by-sa/2.0/
+ -->
+    <ScreenOverlay id="CopyrightNotice">
+      <name>Copyright Notice</name>
+      <description>
+        <![CDATA[The data in this KML file is Copyright <a href="http://www.openstreetmap.org/">OpenStreetMap</a> Contributors. It is available under the <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike (CC-BY-SA) Version 2.0 License</a>.]]>
+      </description>
+      <Snippet>Copyright (c) OpenStreetMap Contributors. CC-BY-SA 2.0 License.</Snippet>
+      <Icon>
+        <href>OSMCopyright.png</href>
+      </Icon>
+      <overlayXY x="0" xunits="fraction" y="1" yunits="fraction"/>
+      <screenXY x="0" xunits="fraction" y="1" yunits="fraction"/>
+      <size x="0" xunits="fraction" y="0" yunits="fraction"/>
+    </ScreenOverlay>
+    <Folder>
+      <name>POI</name>
+      <description>Points of Interest</description>
+      <Folder>
+        <name>Parking</name>
+        <Style id="style-Parking">
+          <IconStyle>
+            <scale>0.2</scale>
+            <Icon>
+              <href>http://maps.google.com/mapfiles/kml/shapes/parking_lot.png</href>
+            </Icon>
+          </IconStyle>
+        </Style>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.5584046,46.4880564,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Coop</name>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.5609149,46.493261,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.5865419,46.4861414,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.4447639,46.4572778,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.4450385,46.4601225,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.4393367,46.45965,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.4413296,46.4571887,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.440856,46.4512387,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.4379632,46.452765,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.4439042,46.4554444,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.4442161,46.4540646,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.4701427,46.4536698,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.5806365,46.5135164,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.6038938,46.5174355,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.6033249,46.5169628,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Parking</styleUrl>
+          <Point>
+            <coordinates>7.6062434,46.5290881,0</coordinates>
+          </Point>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Fuel</name>
+        <Style id="style-Fuel">
+          <IconStyle>
+            <scale>0.7</scale>
+            <Icon>
+              <href>http://maps.google.com/mapfiles/kml/pal2/icon21.png</href>
+            </Icon>
+          </IconStyle>
+        </Style>
+        <Placemark>
+          <name>Garage Inniger</name>
+          <styleUrl>#style-Fuel</styleUrl>
+          <Point>
+            <coordinates>7.5660783,46.4900069,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Fuel</styleUrl>
+          <Point>
+            <coordinates>7.5926292,46.5284662,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Fuel</styleUrl>
+          <Point>
+            <coordinates>7.442845,46.458965,0</coordinates>
+          </Point>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Cinema</name>
+        <Style id="style-Cinema">
+          <IconStyle>
+            <scale>0.7</scale>
+            <Icon>
+              <href>http://maps.google.com/mapfiles/kml/pal2/icon30.png</href>
+            </Icon>
+          </IconStyle>
+        </Style>
+        <Placemark>
+          <name>Ciné Rex</name>
+          <styleUrl>#style-Cinema</styleUrl>
+          <Point>
+            <coordinates>7.5630412,46.4929077,0</coordinates>
+          </Point>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Hotel</name>
+        <Style id="style-Hotel">
+          <IconStyle>
+            <scale>0.7</scale>
+            <Icon>
+              <href>http://maps.google.com/mapfiles/kml/pal2/icon28.png</href>
+            </Icon>
+          </IconStyle>
+        </Style>
+        <Placemark>
+          <name>Hotel Crea</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.5676532,46.4982767,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Hotel Hari</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.5650953,46.4963004,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Bellevue</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.5563578,46.4921191,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Kreuz</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4409986,46.4570553,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Krone</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4426496,46.4567252,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Wildstrubel</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4430785,46.4574807,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Hotel des Alpes</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.5387572,46.4794195,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Viktoria Eden</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.5600327,46.4933357,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Berghaus Bärtschi</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.5632096,46.4454517,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Tenne</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4461369,46.4589363,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Parkhotel Bellevue</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4398359,46.455012,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Simmenhof</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4346619,46.4729836,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Iffigenalp</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4415194,46.4002088,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Reka Feriendorf</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4317292,46.4681013,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Bären</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.5583384,46.4923431,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Spillgerten</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.4824764,46.5681752,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Hotel Steinmattli</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.555973,46.4892051,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Alpina</name>
+          <styleUrl>#style-Hotel</styleUrl>
+          <Point>
+            <coordinates>7.5670248,46.4845444,0</coordinates>
+          </Point>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Restaurant</name>
+        <Style id="style-Restaurant">
+          <IconStyle>
+            <scale>0.7</scale>
+            <Icon>
+              <href>http://maps.google.com/mapfiles/kml/pal2/icon40.png</href>
+            </Icon>
+          </IconStyle>
+        </Style>
+        <Placemark>
+          <name>Sillerenbühl</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5177184,46.4713607,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Berghaus Stoss</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4294222,46.4403995,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Geilsbrüggli</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5134309,46.4571755,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4954338,46.4528516,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Standhütte</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4947421,46.443782,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.56919,46.4384245,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Wallegstübli</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4251977,46.4550003,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Betelberghütte</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4209174,46.4353096,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Chüejer Stuba</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5083945,46.4586075,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Hotel des Alpes</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5387572,46.4794195,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Berghaus Tschentenalp</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5457297,46.4987315,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Stierenberg</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4394912,46.5665216,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4761515,46.4266593,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Tenne</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4461369,46.4589363,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Andy&apos;s Pub, Terrasse</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4436412,46.4558537,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Pizzeria Roberto</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4426305,46.457097,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Krone</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4427032,46.4566172,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Anker</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.442741,46.4572569,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Pizzeria Antica Posta</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4418719,46.457229,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Rohrbach</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.6024672,46.5500964,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Bunderalp Berghaus</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.6011565,46.4904257,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Hohliebestübli</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5737679,46.48547,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Restaurant Siebenbrunnen</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4901423,46.4168265,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Berghölzli</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4229564,46.4967046,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Gasthaus Elsigbach</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.606331,46.5289162,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Wildstrubel</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5599318,46.4813358,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Kuspo</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.4527733,46.4494679,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Bühlberg</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.469499,46.4536402,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5124053,46.4727902,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <name>Berghaus Höchst</name>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.6035985,46.516601,0</coordinates>
+          </Point>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Restaurant</styleUrl>
+          <Point>
+            <coordinates>7.5059586,46.4504356,0</coordinates>
+          </Point>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Hospital</name>
+        <Style id="style-Hospital">
+          <IconStyle>
+            <scale>0.7</scale>
+            <Icon>
+              <href>http://maps.google.com/mapfiles/kml/pal3/icon38.png</href>
+            </Icon>
+          </IconStyle>
+        </Style>
+      </Folder>
+      <Folder>
+        <name>Toilet</name>
+        <Style id="style-Toilet">
+          <IconStyle>
+            <scale>0.7</scale>
+            <Icon>
+              <href>http://maps.google.com/mapfiles/kml/pal3/icon38.png</href>
+            </Icon>
+          </IconStyle>
+        </Style>
+      </Folder>
+    </Folder>
+    <Folder>
+      <name>Ski_Runs</name>
+      <Folder>
+        <name>Ski_Run_Downhill</name>
+        <Folder>
+          <name>Ski_Run_Downhill_Easy</name>
+          <Style id="style-Ski_Run_Downhill_Easy">
+            <LineStyle>
+              <color>ff00ff00</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+          <Placemark id="w4380588">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.429755,46.4386039,0 7.4293368,46.4393223,0 7.429232,46.4404117,0 7.4293996,46.441124,0 7.4300282,46.4415011,0 7.4296801,46.4435027,0 7.4304432,46.4436726,0 7.4309129,46.4436944,0 7.4311473,46.4436377,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388751">
+            <name>25</name>
+            <description>25, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4878089,46.443423,0 7.4877097,46.4433227,0 7.4862994,46.4433438,0 7.4839067,46.4431223,0 7.482119,46.4430627,0 7.4773624,46.442722,0 7.4739186,46.4425618,0 7.4726715,46.4431339,0 7.4712165,46.4431469,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388754">
+            <name>21</name>
+            <description>21, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4979152,46.4417323,0 7.4975394,46.4421891,0 7.4973136,46.4422123,0 7.4966307,46.4419276,0 7.4956492,46.4412029,0 7.4950704,46.4411561,0 7.4935875,46.4409666,0 7.4916014,46.4405342,0 7.4899677,46.4413831,0 7.4890906,46.4415271,0 7.4877254,46.4414311,0 7.4850666,46.4418636,0 7.482119,46.4430627,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388755">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4862994,46.4433438,0 7.4862235,46.4429825,0 7.486705,46.4424627,0 7.4890906,46.4415271,0 7.4895612,46.4412262,0 7.489583,46.4406462,0 7.4890687,46.4396996,0 7.4889051,46.4389092,0 7.488508,46.4385783,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388832">
+            <name>29</name>
+            <description>29, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4951921,46.4444865,0 7.4948475,46.4446679,0 7.4910249,46.4455562,0 7.490986,46.4460492,0 7.4907888,46.4463504,0 7.4907043,46.4468387,0 7.4909002,46.4469646,0 7.4931591,46.4473935,0 7.4934449,46.4474943,0 7.4935055,46.4476487,0 7.4918349,46.4503992,0 7.4914431,46.450472,0 7.4913811,46.4506976,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388836">
+            <name>27</name>
+            <description>27, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4753104,46.4467318,0 7.4742803,46.4466354,0 7.4734687,46.4464045,0 7.4728137,46.4460338,0 7.4722901,46.4454816,0 7.4719258,46.4449058,0 7.4712165,46.4431469,0 7.4702165,46.4426691,0 7.469432,46.4425057,0 7.4683009,46.4424017,0 7.4681436,46.4424662,0 7.4682319,46.4426424,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388837">
+            <name>34</name>
+            <description>34, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4914805,46.4507107,0 7.4913811,46.4506976,0 7.4891761,46.4507056,0 7.4885692,46.4500736,0 7.4861844,46.4492757,0 7.4861011,46.4492478,0 7.484473,46.448703,0 7.4838871,46.4485069,0 7.4832597,46.4477197,0 7.4815483,46.4467728,0 7.4810792,46.4465722,0 7.4804303,46.4464648,0 7.4794506,46.4464069,0 7.4786449,46.4466018,0 7.4778745,46.4467856,0 7.4773741,46.4467058,0 7.4766312,46.4464834,0 7.4753104,46.4467318,0 7.4751279,46.4473859,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4389270">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5183847,46.4722004,0 7.517934,46.471763,0 7.517821,46.4717479,0 7.5175412,46.4714731,0 7.5159991,46.4705791,0 7.5149527,46.4698298,0 7.5145904,46.4695704,0 7.514402,46.4689378,0 7.5134881,46.4678641,0 7.5128847,46.4677487,0 7.5125031,46.4673228,0 7.5119884,46.4670388,0 7.5118409,46.4666988,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4389276">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4977486,46.4514628,0 7.497407,46.4524101,0 7.4968324,46.4531477,0 7.4968557,46.453831,0 7.4979505,46.4552131,0 7.5010796,46.4572863,0 7.5044316,46.4577113,0 7.5048258,46.4577613,0 7.5065939,46.4574074,0 7.5087808,46.4574575,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4389278">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.49497,46.4533356,0 7.494742,46.4530283,0 7.4942068,46.4527205,0 7.4938455,46.451717,0 7.4928553,46.4509811,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4389279">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4981254,46.4509924,0 7.4981368,46.4511522,0 7.4977486,46.4514628,0 7.4950854,46.451349,0 7.4928553,46.4509811,0 7.4914805,46.4507107,0 7.4915714,46.4504852,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4389280">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4981254,46.4509924,0 7.4981445,46.4508305,0 7.4953246,46.4501477,0 7.4939146,46.450458,0 7.4928553,46.4509811,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569934">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5065878,46.4609089,0 7.5067588,46.4608409,0 7.5083597,46.4611852,0 7.5098203,46.4621242,0 7.5110321,46.4621081,0 7.5117865,46.462373,0 7.5122119,46.4631514,0 7.5129021,46.4633842,0 7.5135922,46.4634885,0 7.5141059,46.4636811,0 7.5149084,46.4637212,0 7.5157912,46.4643071,0 7.5168907,46.4644435,0 7.5179821,46.4643312,0 7.5187686,46.4646121,0 7.5204138,46.4662252,0 7.5208392,46.4662332,0 7.521409,46.4661208,0 7.5222597,46.4662894,0 7.5230542,46.4669796,0 7.52360 [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569938">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5326801,46.4684788,0 7.532755,46.468548,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569946">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5316173,46.4680148,0 7.5324807,46.4685101,0 7.5326801,46.4684788,0 7.5328962,46.4684417,0 7.5329356,46.4685522,0 7.5327143,46.4686321,0 7.532755,46.468548,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569960">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4931915,46.4549659,0 7.4929375,46.454661,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569963">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4925723,46.455196,0 7.492699,46.454997,0 7.4929375,46.454661,0 7.4942068,46.4527205,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569968">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.492699,46.454997,0 7.4910376,46.4540056,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569973">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5132264,46.4562522,0 7.5130985,46.4572035,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569977">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4851581,46.4533824,0 7.4845569,46.4536013,0 7.4839198,46.4538334,0 7.482829,46.4540915,0 7.4815336,46.4540876,0 7.4800837,46.4537836,0 7.4779806,46.4533427,0 7.4772153,46.4531822,0 7.4764495,46.4530216,0 7.4753254,46.4534852,0 7.474042,46.4536903,0 7.4726118,46.4532512,0 7.472292,46.4528248,0 7.4722433,46.4525611,0 7.4719968,46.4512258,0 7.4713736,46.45107,0 7.4709826,46.4512884,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569980">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4910376,46.4540056,0 7.490236,46.4537956,0 7.4895041,46.4536038,0 7.4851581,46.4533824,0 7.4822321,46.4520159,0 7.4770883,46.4509952,0 7.4722247,46.4508951,0 7.4717194,46.4509989,0 7.4713736,46.45107,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569988">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4951921,46.4444865,0 7.4952107,46.4438631,0 7.4956323,46.4435254,0 7.495863,46.4431325,0 7.4958466,46.442669,0 7.4956544,46.4421238,0 7.4950704,46.4411561,0 7.4949338,46.4409187,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127858">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5749906,46.4438887,0 7.5747715,46.4435867,0 7.5745699,46.4428739,0 7.5733777,46.441992,0 7.572843,46.4418712,0 7.5718612,46.4418531,0 7.5706985,46.4416291,0 7.5686003,46.4406872,0 7.568574,46.4409349,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127859">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5747715,46.4435867,0 7.574491,46.4435383,0 7.5730797,46.442439,0 7.5710547,46.4418652,0 7.5706985,46.4416291,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127862">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5687446,46.4376384,0 7.5689165,46.4376761,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127864">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5796203,46.43089,0 7.5799907,46.430675,0 7.5796593,46.4304735,0 7.578977,46.4304601,0 7.5783532,46.4302854,0 7.5755031,46.4292776,0 7.5748052,46.4286596,0 7.5743958,46.4286596,0 7.5737135,46.4284983,0 7.5734796,46.4281759,0 7.5725634,46.4274234,0 7.5717446,46.4273025,0 7.5712377,46.4269128,0 7.5701071,46.4264963,0 7.5693858,46.4272756,0 7.568684,46.4286999,0 7.5675338,46.4293717,0 7.5661994,46.4295295,0 7.5655793,46.4299569,0 7.5652203,46.4312391,0 7.5641106, [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127874">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5686003,46.4406872,0 7.5679939,46.4406328,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w138292329">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5065878,46.4609089,0 7.5056954,46.4603339,0 7.5058002,46.4601367,0 7.5057016,46.4599519,0 7.5066207,46.4591145,0 7.5076954,46.4577884,0 7.5087808,46.4574575,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w138292372">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5118409,46.4666988,0 7.5115891,46.4663378,0 7.5114205,46.4658587,0 7.510968,46.4655037,0 7.5107994,46.4648471,0 7.5087141,46.4627352,0 7.5081285,46.461697,0 7.5065878,46.4609089,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806187">
+            <name>Kuonisbergliweg</name>
+            <description>Kuonisbergliweg, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5508319,46.4815667,0 7.550886,46.481604,0 7.551017,46.481662,0 7.5517182,46.4815741,0 7.551993,46.481463,0 7.552258,46.481249,0 7.552478,46.481152,0 7.5528719,46.4810715,0 7.552972,46.481051,0 7.553187,46.480938,0 7.553375,46.480816,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806193">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5087808,46.4574575,0 7.5087624,46.4574732,0 7.5107571,46.4570949,0 7.512456,46.4571319,0 7.5130985,46.4572035,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806195">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4845569,46.4536013,0 7.4839705,46.4533006,0 7.4836023,46.4532825,0 7.4830277,46.4536666,0 7.4828207,46.453771,0 7.4826873,46.4537037,0 7.4825462,46.4531781,0 7.4822413,46.4531495,0 7.4808929,46.4536839,0 7.4800837,46.4537836,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806200">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.471843,46.4529933,0 7.4722433,46.4525611,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806202">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4781023,46.4524789,0 7.4772153,46.4531822,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806207">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.553375,46.480816,0 7.5536347,46.4807515,0 7.5541829,46.4807074,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806210">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4726118,46.4532512,0 7.4711386,46.4537235,0 7.4702555,46.4537971,0 7.4698184,46.4537065,0 7.4705402,46.4532965,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806212">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4966949,46.4456829,0 7.4987868,46.4474642,0 7.4990254,46.4485493,0 7.4986786,46.4497374,0 7.4981254,46.4509924,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806216">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4851581,46.4533824,0 7.4819071,46.4527893,0 7.4795821,46.4527576,0 7.4781023,46.4524789,0 7.4750189,46.4518982,0 7.4730834,46.4513691,0 7.4719968,46.4512258,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806220">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4779806,46.4533427,0 7.4774841,46.453759,0 7.4769609,46.4539583,0 7.4764209,46.4537428,0 7.4760416,46.4536833,0 7.475667,46.4538882,0 7.4750873,46.4539986,0 7.474042,46.4536903,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806222">
+            <description>, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5541829,46.4807074,0 7.5541599,46.4812366,0 7.5544557,46.4816299,0 7.555156,46.4817335,0 7.5553097,46.4822055,0 7.5554386,46.4823711,0 7.5559054,46.4825407,0 7.5568671,46.4822132,0 7.5569895,46.4818235,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806225">
+            <name>2</name>
+            <description>2, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4314691,46.4551589,0 7.4322178,46.4554411,0 7.4328404,46.4555345,0 7.4337122,46.4559081,0 7.4347085,46.4560638,0 7.4353574,46.456162,0 7.4358604,46.4560015,0 7.4367179,46.4557467,0 7.4372508,46.4549744,0 7.4376135,46.4546647,0 7.4373964,46.4539233,0 7.4375265,46.4532365,0 7.4372187,46.4531533,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806229">
+            <name>33</name>
+            <description>33, Downhill Run Difficulty: Easy</description>
+            <styleUrl>#style-Ski_Run_Downhill_Easy</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4861011,46.4492478,0 7.4844268,46.4491036,0 7.4832187,46.4488441,0 7.4823814,46.4481279,0 7.4814712,46.4478087,0 7.4801554,46.4478027,0 7.4781901,46.4484089,0 7.4742765,46.4489608,0 7.4741321,46.4490468,0 7.473553,46.4493747,0 7.4717194,46.4509989,0</coordinates>
+            </LineString>
+          </Placemark>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Intermediate</name>
+          <Style id="style-Ski_Run_Downhill_Intermediate">
+            <LineStyle>
+              <color>ffff0000</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+          <Placemark id="w4380587">
+            <name>10</name>
+            <description>10, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4144876,46.4472294,0 7.4149494,46.4475565,0 7.4152025,46.4477358,0 7.4154562,46.4478744,0 7.4167849,46.4483173,0 7.4184458,46.4500257,0 7.4214671,46.4526673,0 7.4235868,46.4533633,0 7.4242828,46.4539644,0 7.4253268,46.4544231,0 7.4260386,46.4555146,0 7.4271775,46.4562739,0 7.4277562,46.456385,0 7.4290744,46.4572198,0 7.4301992,46.4575186,0 7.4306302,46.4578101,0 7.4308495,46.4581425,0 7.4308935,46.458415,0 7.4307004,46.4584832,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4380593">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.409078,46.428856,0 7.4088684,46.4289664,0 7.4097542,46.4296455,0 7.410372,46.429866,0 7.411328,46.4299305,0 7.4122236,46.4299962,0 7.4128546,46.4302951,0 7.4136666,46.4313138,0 7.4162843,46.432802,0 7.4231145,46.4368711,0 7.4240783,46.4371015,0 7.424352,46.4373373,0 7.4244344,46.4376043,0 7.4240992,46.4384424,0 7.4241315,46.4385919,0 7.4242878,46.4386938,0 7.4245455,46.4386572,0 7.4257962,46.4380443,0 7.4269373,46.437921,0 7.4275298,46.4379127,0 7.4279308,46. [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388833">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4948475,46.4446679,0 7.4937003,46.444504,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388834">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4877097,46.4433227,0 7.4872195,46.4435325,0 7.4865607,46.4435325,0 7.4841571,46.443395,0 7.4823979,46.4436194,0 7.4816834,46.4439676,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4388835">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4841571,46.443395,0 7.4839067,46.4431223,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4389269">
+            <name>42</name>
+            <description>42, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.507632,46.44102,0 7.5076886,46.4408745,0 7.5079708,46.4410277,0 7.5086923,46.4410277,0 7.5091432,46.4420156,0 7.5088441,46.4425016,0 7.5066391,46.4435205,0 7.5059548,46.4445545,0 7.5060916,46.4454973,0 7.5055594,46.4485083,0 7.5066087,46.4500898,0 7.5079037,46.4503452,0 7.508768,46.4505156,0 7.5108818,46.4516561,0 7.5119614,46.4529182,0 7.5130411,46.4538915,0 7.5136795,46.4546008,0 7.5135329,46.455249,0 7.5134633,46.4557785,0 7.5132264,46.4562522,0 7.5133239, [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w4389281">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.494809,46.462495,0 7.4945658,46.4625743,0 7.4944643,46.4625499,0 7.4944832,46.4624806,0 7.4939029,46.4614558,0 7.491698,46.459654,0 7.4913687,46.4586774,0 7.4918389,46.45772,0 7.4931915,46.4549659,0 7.49497,46.4533356,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w4389282">
+            <name>55</name>
+            <description>55, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4944832,46.4624806,0 7.4946897,46.4623555,0 7.4948693,46.462373,0 7.4953055,46.4625448,0 7.4966403,46.4646571,0 7.4987475,46.4646495,0 7.5003928,46.4650414,0 7.5015139,46.4653964,0 7.5032905,46.4674926,0 7.5062062,46.4683885,0 7.5078412,46.4692527,0 7.5081555,46.4737303,0 7.5098447,46.4750362,0 7.5119216,46.4781195,0 7.511841,46.4787868,0 7.5153242,46.4822775,0 7.5197463,46.483668,0 7.5198736,46.4840895,0 7.5194921,46.4842678,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w20016062">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6214035,46.5184624,0 7.6206061,46.5185013,0 7.6200227,46.5186374,0 7.619556,46.5189097,0 7.6191476,46.5193181,0 7.6182141,46.5193375,0 7.6178835,46.5192792,0 7.6178641,46.5181707,0 7.6177474,46.5177623,0 7.6176307,46.5175484,0 7.6168139,46.5171789,0 7.6164833,46.5166538,0 7.616036,46.5164399,0 7.6147525,46.5162065,0 7.6136877,46.5157618,0 7.6125232,46.5155388,0 7.6076942,46.5164486,0 7.6060633,46.5169747,0 7.605432,46.5170536,0 7.6044409,46.516792,0 7.6038575 [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w20016063">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6222677,46.5125575,0 7.6219536,46.5125696,0 7.6204665,46.5130361,0 7.6200208,46.5128293,0 7.6186894,46.5128372,0 7.6177891,46.5125865,0 7.6155716,46.5135034,0 7.6147737,46.5140404,0 7.6139445,46.5144307,0 7.6130136,46.5146209,0 7.6108572,46.5152546,0 7.6087275,46.5157391,0 7.608396,46.5153693,0 7.6079624,46.5152801,0 7.6056234,46.515944,0 7.6038575,46.516854,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w20016066">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6255371,46.5095259,0 7.6255618,46.5090433,0 7.6249926,46.5088453,0 7.6244357,46.5089072,0 7.6237799,46.5088329,0 7.6231982,46.5089814,0 7.622926,46.5089319,0 7.6216266,46.5090062,0 7.6211935,46.5088824,0 7.621144,46.5086349,0 7.6213173,46.5083751,0 7.6212554,46.5081771,0 7.6209552,46.5080301,0 7.6206413,46.5079572,0 7.6201032,46.5079796,0 7.619909,46.5078859,0 7.6192046,46.507952,0 7.6186945,46.5082071,0 7.618242,46.5086102,0 7.6170479,46.5090519,0 7.6134008, [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w20016068">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6223085,46.5128439,0 7.6220228,46.5131772,0 7.621511,46.5141056,0 7.6214266,46.5149416,0 7.6207744,46.5165722,0 7.620101,46.517142,0 7.6197686,46.517605,0 7.6197092,46.5182816,0 7.621015,46.5182816,0 7.621478,46.5181985,0 7.6224277,46.5178305,0 7.6240841,46.5179513,0 7.6247575,46.5179513,0 7.6255728,46.5178449,0 7.6264944,46.5187665,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29376879">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4304432,46.4436726,0 7.4305366,46.443984,0 7.4310658,46.4445755,0 7.4306634,46.4459898,0 7.4299914,46.4465483,0 7.4303109,46.4472287,0 7.4299762,46.4484049,0 7.4302564,46.4493078,0 7.4315017,46.4511447,0 7.4317586,46.452333,0 7.4318155,46.4525963,0 7.4324157,46.4535271,0 7.432081,46.4536883,0 7.4310303,46.4533336,0 7.4311741,46.453932,0 7.4314691,46.4551589,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29376880">
+            <name>Tschuggen</name>
+            <description>Tschuggen, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4124787,46.433968,0 7.4140186,46.4327481,0 7.4162843,46.432802,0 7.4176098,46.434637,0 7.4180369,46.4362139,0 7.4170285,46.4381829,0 7.416902,46.4392336,0 7.4160927,46.4416618,0 7.4163856,46.4433081,0 7.4158679,46.4447115,0 7.4172976,46.4466046,0 7.4210461,46.449263,0 7.4230297,46.4499123,0 7.4246353,46.4516699,0 7.4266629,46.4522852,0 7.4293861,46.4546281,0 7.4314691,46.4551589,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569950">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5241429,46.4682155,0 7.5254618,46.4675494,0 7.5271632,46.4670117,0 7.5281584,46.4670197,0 7.5307345,46.4680148,0 7.5316173,46.4680148,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569956">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4913687,46.4586774,0 7.4912344,46.4582615,0 7.4921282,46.4561049,0 7.4910376,46.4540056,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569970">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4979152,46.4417323,0 7.4956492,46.4412029,0 7.4949338,46.4409187,0 7.4918344,46.4396017,0 7.488508,46.4385783,0 7.4862388,46.4377746,0 7.4860119,46.4374343,0 7.4861862,46.4374136,0 7.4864068,46.4375038,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569987">
+            <name>26</name>
+            <description>26, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4951921,46.4444865,0 7.494774,46.444374,0 7.4937003,46.444504,0 7.4906334,46.4443422,0 7.4888241,46.4444869,0 7.4871181,46.4440733,0 7.4863944,46.4442402,0 7.4830048,46.443886,0 7.4816834,46.4439676,0 7.4795401,46.4450123,0 7.4783043,46.4457271,0 7.4766312,46.4464834,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29920240">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.488878,46.370053,0 7.4894455,46.3702172,0 7.4899918,46.3703752,0 7.4913225,46.3705818,0 7.4927658,46.3712292,0 7.4942814,46.3711794,0 7.4954185,46.370487,0 7.4959412,46.3696855,0 7.4968794,46.3691378,0 7.4980271,46.3691169,0 7.4985995,46.3690143,0 7.4991844,46.3686383,0 7.4992309,46.3684758,0 7.4987031,46.368402,0 7.4977817,46.3683076,0 7.4988279,46.3674945,0 7.4990444,46.3655523,0 7.4983227,46.3649547,0 7.4983115,46.3639782,0 7.4985155,46.3636965,0 7.4981554 [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w31677463">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4899918,46.3703752,0 7.4900977,46.3710331,0 7.4897799,46.3720807,0 7.4893209,46.3741029,0 7.4888265,46.3742978,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127861">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5798737,46.4320992,0 7.5797957,46.4311319,0 7.5796203,46.43089,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127863">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5798737,46.4320992,0 7.5798711,46.4325194,0 7.5799962,46.432821,0 7.5804649,46.4331279,0 7.5815978,46.4342533,0 7.5818635,46.434668,0 7.5818869,46.4349533,0 7.5808556,46.4367572,0 7.5800508,46.4371395,0 7.5785547,46.437191,0 7.576949,46.4381409,0 7.576699,46.4385663,0 7.5763943,46.4385663,0 7.5759959,46.4382224,0 7.57373,46.4376025,0 7.5731128,46.4379471,0 7.570222,46.4383563,0 7.5696588,46.4383437,0 7.5691665,46.4381822,0 7.5685649,46.4378322,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127870">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5804649,46.4331279,0 7.5785664,46.434178,0 7.5767537,46.4348241,0 7.5762068,46.4355026,0 7.5753864,46.4358579,0 7.5743629,46.4359495,0 7.5725659,46.4366656,0 7.5696588,46.4383437,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127872">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5731128,46.4379471,0 7.5727761,46.4382333,0 7.5727077,46.438534,0 7.5728577,46.4387621,0 7.5731354,46.4393476,0 7.5730157,46.4396247,0 7.5726324,46.4399562,0 7.5721003,46.4402378,0 7.5709796,46.4402849,0 7.5686003,46.4406872,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w39229510">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4942814,46.3711794,0 7.4942998,46.3716666,0 7.4926402,46.3719589,0 7.4897799,46.3720807,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w53129639">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4899918,46.3703752,0 7.4932364,46.3691539,0 7.4938051,46.3683088,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w121275306">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6164187,46.5309288,0 7.6157406,46.5308985,0 7.6152942,46.5307285,0 7.6147089,46.5306361,0 7.6141852,46.5303588,0 7.6140774,46.5301278,0 7.614447,46.5292652,0 7.61437,46.5288801,0 7.6138155,46.5281716,0 7.6140774,46.5273244,0 7.6145086,46.5267853,0 7.6148167,46.5264618,0 7.6143084,46.5259997,0 7.614062,46.526277,0 7.6136153,46.5263232,0 7.6133842,46.526508,0 7.613338,46.5267699,0 7.6129553,46.5269559,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w138292096">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6230501,46.5217836,0 7.6227543,46.5219743,0 7.6224002,46.522133,0 7.6221374,46.5222917,0 7.6220837,46.5224246,0 7.6222393,46.5226387,0 7.6222768,46.52279,0 7.6224217,46.5229598,0 7.6226577,46.5230521,0 7.6229367,46.5232477,0 7.6229933,46.5233276,0 7.6229423,46.5234075,0 7.6228178,46.5233511,0 7.6226145,46.5232171,0 7.6225402,46.5232813,0 7.6226676,46.5234991,0 7.6227387,46.5237748,0 7.6227055,46.5240428,0 7.622677,46.5241963,0 7.6224463,46.5244646,0 7.6223114 [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806196">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4296801,46.4435027,0 7.4283947,46.4438683,0 7.4276134,46.4448795,0 7.4282822,46.4462702,0 7.4276225,46.4479365,0 7.4270854,46.4485039,0 7.4283468,46.4503228,0 7.4289924,46.4517144,0 7.4295822,46.4524001,0 7.4290117,46.4528401,0 7.429563,46.4533341,0 7.4311741,46.453932,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806197">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5465752,46.4729147,0 7.5468033,46.4729927,0 7.5471194,46.473351,0 7.5477099,46.4747335,0 7.5477488,46.4754147,0 7.5475016,46.4763233,0 7.5473399,46.4765628,0 7.5474617,46.4766434,0 7.5494984,46.4768773,0 7.5499886,46.4772338,0 7.550697,46.4782474,0 7.551339,46.4789507,0 7.5516645,46.4797119,0 7.5514629,46.4801692,0 7.547108,46.4815103,0 7.5470161,46.4816959,0 7.5469546,46.4819903,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806198">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5126782,46.4560798,0 7.5132264,46.4562522,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806201">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4871181,46.4440733,0 7.4865607,46.4435325,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806203">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5183847,46.4722004,0 7.5189475,46.4725535,0 7.519035,46.4731315,0 7.5188279,46.4738282,0 7.5187137,46.4739436,0 7.5188805,46.4742245,0 7.5191219,46.4746667,0 7.5187133,46.4762815,0 7.5185001,46.4767863,0 7.5178777,46.4770115,0 7.5180839,46.4781219,0 7.5180828,46.47883,0 7.5182874,46.480318,0 7.5183371,46.4806788,0 7.5191752,46.4813467,0 7.5196958,46.4814845,0 7.5213221,46.4813858,0 7.5216438,46.4815441,0 7.5206847,46.4840895,0 7.5202806,46.4840895,0 7.5198736 [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806204">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4951921,46.4444865,0 7.4964088,46.4441724,0 7.4962012,46.4450654,0 7.4965848,46.4456381,0 7.4966949,46.4456829,0 7.4968375,46.445741,0 7.4994665,46.4454308,0 7.502031,46.4464909,0 7.5033031,46.4476891,0 7.5034979,46.4480839,0 7.5033917,46.4492225,0 7.5043972,46.4500412,0 7.5050304,46.4507279,0 7.5054974,46.4518283,0 7.5064786,46.4530981,0 7.5069655,46.4535058,0 7.5078037,46.4537953,0 7.5097169,46.4542769,0 7.5126782,46.4560798,0 7.5128506,46.4564315,0 7.51289 [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806205">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5185001,46.4767863,0 7.5187069,46.4771038,0 7.5180839,46.4781219,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806208">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5465752,46.4729147,0 7.5465588,46.4727969,0 7.5463224,46.4727762,0 7.5457549,46.4722521,0 7.5454878,46.4722027,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806211">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5180828,46.47883,0 7.5187473,46.4791376,0 7.5191845,46.4795753,0 7.5186215,46.4800315,0 7.5182874,46.480318,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806213">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4918389,46.45772,0 7.4953567,46.4572878,0 7.4978347,46.4561065,0 7.4983647,46.4560378,0 7.4991114,46.4562022,0 7.4996241,46.4568782,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806217">
+            <description>, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5189475,46.4725535,0 7.520193,46.4732475,0 7.5214428,46.4736263,0 7.5205581,46.4749161,0 7.5201512,46.4752867,0 7.519466,46.4755006,0 7.5187133,46.4762815,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806231">
+            <name>38</name>
+            <description>38, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.490236,46.4537956,0 7.4895639,46.4533929,0 7.4892057,46.4526215,0 7.4891761,46.4507056,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806239">
+            <name>52</name>
+            <description>52, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5003928,46.4650414,0 7.5023418,46.4647048,0 7.5008661,46.4641698,0 7.4994242,46.4632353,0 7.4992965,46.462876,0 7.4999102,46.4623177,0 7.5002146,46.4620329,0 7.5000366,46.4616093,0 7.5000901,46.4612612,0 7.4995804,46.4611479,0 7.4993116,46.4600075,0 7.4993116,46.4590555,0 7.4989271,46.4580207,0 7.4984584,46.4575571,0 7.4986987,46.4571762,0 7.4996241,46.4568782,0 7.5010796,46.4572863,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806245">
+            <name>80</name>
+            <description>80, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5464542,46.4719979,0 7.5467662,46.4722875,0 7.5465752,46.4729147,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806247">
+            <name>84</name>
+            <description>84, Downhill Run Difficulty: Intermediate</description>
+            <styleUrl>#style-Ski_Run_Downhill_Intermediate</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.546737,46.4678791,0 7.5477148,46.4684613,0 7.547106,46.4704934,0 7.5464542,46.4719979,0 7.5454878,46.4722027,0 7.5453695,46.4722278,0 7.5448716,46.4723836,0 7.5446572,46.4723806,0 7.5443664,46.4725512,0 7.5440913,46.4725106,0 7.5440027,46.472332,0</coordinates>
+            </LineString>
+          </Placemark>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Advanced</name>
+          <Style id="style-Ski_Run_Downhill_Advanced">
+            <LineStyle>
+              <color>ff000000</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+          <Placemark id="w4389267">
+            <name>40</name>
+            <description>40, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5091432,46.4420156,0 7.5110414,46.4433129,0 7.5131315,46.4442903,0 7.5133879,46.4452478,0 7.5138387,46.4464089,0 7.5144526,46.4482402,0 7.5148288,46.449759,0 7.5147337,46.4509702,0 7.5151598,46.4521343,0 7.5147089,46.4532426,0 7.513803,46.4540077,0 7.5136795,46.4546008,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127866">
+            <description>, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5796203,46.43089,0 7.5790744,46.4310512,0 7.5786846,46.4309841,0 7.5786456,46.4308094,0 7.5786261,46.4306213,0 7.5783532,46.4302854,0 7.5779052,46.4304352,0 7.5774045,46.430602,0 7.5768107,46.4309467,0 7.5761544,46.4311244,0 7.5750606,46.4314798,0 7.5744512,46.4321798,0 7.5740527,46.4330468,0 7.5730292,46.4338276,0 7.5724197,46.4338222,0 7.5706227,46.4345814,0 7.5697555,46.4354376,0 7.5682133,46.437843,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127867">
+            <description>, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5761544,46.4311244,0 7.574334,46.4310113,0 7.5719744,46.4327452,0 7.5707477,46.4341668,0 7.5706227,46.4345814,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w33127875">
+            <description>, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5780116,46.4306132,0 7.5779052,46.4304352,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w103718991">
+            <name>51</name>
+            <description>51, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4948693,46.462373,0 7.4995804,46.4611479,0 7.5044316,46.4577113,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806227">
+            <name>30</name>
+            <description>30, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4907043,46.4468387,0 7.4893805,46.447632,0 7.4884723,46.4480082,0 7.4862639,46.4481923,0 7.484473,46.448703,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806234">
+            <name>4</name>
+            <description>4, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4317586,46.452333,0 7.4337182,46.4524766,0 7.434805,46.4526768,0 7.4356699,46.4530141,0 7.436796,46.453005,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806235">
+            <name>41</name>
+            <description>41, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5110414,46.4433129,0 7.5110529,46.4437445,0 7.5106546,46.4441126,0 7.5107095,46.4447933,0 7.5100632,46.445353,0 7.5079719,46.4459569,0 7.5066993,46.4469162,0 7.5061861,46.4474935,0 7.5071655,46.4486165,0 7.5105129,46.4501148,0 7.5108818,46.4516561,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806240">
+            <name>54</name>
+            <description>54, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5079037,46.4503452,0 7.5092498,46.4524805,0 7.5097169,46.4542769,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806242">
+            <name>57</name>
+            <description>57, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4966403,46.4646571,0 7.5032905,46.4674926,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806246">
+            <name>80</name>
+            <description>80, Downhill Run Difficulty: Advanced</description>
+            <styleUrl>#style-Ski_Run_Downhill_Advanced</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5465752,46.4729147,0 7.5475189,46.4734417,0 7.5477398,46.4739818,0 7.5496151,46.4749576,0 7.5498033,46.4759118,0 7.5509021,46.476891,0 7.5509823,46.4774471,0 7.5541829,46.4807074,0</coordinates>
+            </LineString>
+          </Placemark>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Expert</name>
+          <Style id="style-Ski_Run_Downhill_Expert">
+            <LineStyle>
+              <color>ff0066ff</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Generic</name>
+          <Style id="style-Ski_Run_Downhill_Generic">
+            <LineStyle>
+              <color>ffff3cc1</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+          <Placemark id="w4816707">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5535228,46.4865284,0 7.5535075,46.4866379,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w20016065">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6222148,46.5124924,0 7.6218631,46.5122645,0 7.6205305,46.5119903,0 7.620247,46.5118688,0 7.6199634,46.5115987,0 7.6199364,46.5109372,0 7.6197599,46.5108209,0 7.6194083,46.5108438,0 7.6191407,46.5109967,0 7.6180937,46.5111776,0 7.6178583,46.5110883,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569891">
+            <name>Oeystrasse</name>
+            <description>Oeystrasse, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5535075,46.4866379,0 7.5541077,46.486711,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569893">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5541077,46.486711,0 7.5548912,46.486666,0 7.5549402,46.4863477,0 7.5553483,46.4864375,0 7.5563116,46.4862579,0 7.556932,46.4864783,0 7.5570137,46.4867477,0 7.557332,46.4869844,0 7.5583606,46.4869191,0 7.55863,46.4870334,0 7.5590626,46.4870252,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w29569922">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5466507,46.4822665,0 7.5467405,46.4820455,0 7.5469546,46.4819903,0 7.546887,46.4821013,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w35035781">
+            <name>55</name>
+            <description>55, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5202806,46.4840895,0 7.5206995,46.4843934,0 7.521236,46.4846116,0 7.5215509,46.4848385,0 7.5235622,46.4848575,0 7.5243291,46.4849987,0 7.5254277,46.4849455,0 7.5258912,46.484845,0 7.5262259,46.4849337,0 7.5263644,46.4850796,0 7.5270499,46.4847209,0 7.5281228,46.4845732,0 7.5287322,46.4845909,0 7.5299857,46.4847785,0 7.5301055,46.4847918,0 7.5322129,46.484865,0 7.5335432,46.4842858,0 7.5344616,46.4843804,0 7.5353629,46.4842622,0 7.5359808,46.4840021,0 7.536427 [...]
+            </LineString>
+          </Placemark>
+          <Placemark id="w75076665">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5590626,46.4870252,0 7.5600259,46.4871885,0 7.5608912,46.4871232,0 7.5611443,46.4873681,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w103718990">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5548912,46.486666,0 7.5561531,46.4869638,0 7.5573714,46.4873324,0 7.5584605,46.4875866,0 7.5585589,46.487845,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w128629932">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5434451,46.4835786,0 7.5437149,46.4835647,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w147422272">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5442346,46.4836269,0 7.5443418,46.4836053,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w147422282">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5437149,46.4835647,0 7.5439543,46.4836822,0 7.5442346,46.4836269,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w147422285">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5443418,46.4836053,0 7.5452866,46.4835281,0 7.5460156,46.4835284,0 7.5483036,46.4841284,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w147422305">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5483036,46.4841284,0 7.5486892,46.4843265,0 7.5502237,46.4845773,0 7.5505897,46.4845683,0 7.5510877,46.4853643,0 7.5523785,46.486287,0 7.5528849,46.4864761,0 7.5535228,46.4865284,0</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark id="w148806194">
+            <description>, Downhill Run Difficulty: Unknown</description>
+            <styleUrl>#style-Ski_Run_Downhill_Generic</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5033917,46.4492225,0 7.503756,46.4493929,0 7.5041471,46.4492925,0 7.5047479,46.4492921,0 7.5054788,46.4495257,0 7.5060307,46.4500934,0 7.5059038,46.4503571,0 7.5047888,46.4499534,0 7.5044793,46.4499425,0 7.5043972,46.4500412,0</coordinates>
+            </LineString>
+          </Placemark>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Easy_Gladed</name>
+          <Style id="style-Ski_Run_Downhill_Easy_Gladed">
+            <LineStyle>
+              <color>ff00ff00</color>
+              <width></width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Intermediate_Gladed</name>
+          <Style id="style-Ski_Run_Downhill_Intermediate_Gladed">
+            <LineStyle>
+              <color>ffff0000</color>
+              <width></width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Advanced_Gladed</name>
+          <Style id="style-Ski_Run_Downhill_Advanced_Gladed">
+            <LineStyle>
+              <color>ff000000</color>
+              <width></width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Expert_Gladed</name>
+          <Style id="style-Ski_Run_Downhill_Expert_Gladed">
+            <LineStyle>
+              <color>ff0066ff</color>
+              <width></width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Generic_Gladed</name>
+          <Style id="style-Ski_Run_Downhill_Generic_Gladed">
+            <LineStyle>
+              <color>ffff3cc1</color>
+              <width></width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Easy_Lit</name>
+          <Style id="style-Ski_Run_Downhill_Easy_Lit">
+            <LineStyle>
+              <color>#ff00ff00</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Intermediate_Lit</name>
+          <Style id="style-Ski_Run_Downhill_Intermediate_Lit">
+            <LineStyle>
+              <color>#ffff0000</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Advanced_Lit</name>
+          <Style id="style-Ski_Run_Downhill_Advanced_Lit">
+            <LineStyle>
+              <color>#ff000000</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Expert_Lit</name>
+          <Style id="style-Ski_Run_Downhill_Expert_Lit">
+            <LineStyle>
+              <color>#ff0066ff</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Downhill_Generic_Lit</name>
+          <Style id="style-Ski_Run_Downhill_Generic_Lit">
+            <LineStyle>
+              <color>#ffff3cc1</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+      </Folder>
+      <Folder>
+        <name>Ski_Run_Nordic</name>
+        <Folder>
+          <name>Ski_Run_Nordic_Easy</name>
+          <Style id="style-Ski_Run_Nordic_Easy">
+            <LineStyle>
+              <color>#ff00ff00</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Intermediate</name>
+          <Style id="style-Ski_Run_Nordic_Intermediate">
+            <LineStyle>
+              <color>#ffff0000</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Advanced</name>
+          <Style id="style-Ski_Run_Nordic_Advanced">
+            <LineStyle>
+              <color>#ff000000</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Expert</name>
+          <Style id="style-Ski_Run_Nordic_Expert">
+            <LineStyle>
+              <color>#ff0066ff</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Generic</name>
+          <Style id="style-Ski_Run_Nordic_Generic">
+            <LineStyle>
+              <color>#ffff3cc1</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Easy_Gladed</name>
+          <Style id="style-Ski_Run_Nordic_Easy_Gladed">
+            <LineStyle>
+              <color>#ff00ff00</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Intermediate_Gladed</name>
+          <Style id="style-Ski_Run_Nordic_Intermediate_Gladed">
+            <LineStyle>
+              <color>#ffff0000</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Advanced_Gladed</name>
+          <Style id="style-Ski_Run_Nordic_Advanced_Gladed">
+            <LineStyle>
+              <color>#ff000000</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Expert_Gladed</name>
+          <Style id="style-Ski_Run_Nordic_Expert_Gladed">
+            <LineStyle>
+              <color>#ff0066ff</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Generic_Gladed</name>
+          <Style id="style-Ski_Run_Nordic_Generic_Gladed">
+            <LineStyle>
+              <color>#ffff3cc1</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Easy_Lit</name>
+          <Style id="style-Ski_Run_Nordic_Easy_Lit">
+            <LineStyle>
+              <color>#ff00ff00</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Intermediate_Lit</name>
+          <Style id="style-Ski_Run_Nordic_Intermediate_Lit">
+            <LineStyle>
+              <color>#ffff0000</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Advanced_Lit</name>
+          <Style id="style-Ski_Run_Nordic_Advanced_Lit">
+            <LineStyle>
+              <color>#ff000000</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Expert_Lit</name>
+          <Style id="style-Ski_Run_Nordic_Expert_Lit">
+            <LineStyle>
+              <color>#ff0066ff</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Ski_Run_Nordic_Generic_Lit</name>
+          <Style id="style-Ski_Run_Nordic_Generic_Lit">
+            <LineStyle>
+              <color>#ffff3cc1</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+      </Folder>
+    </Folder>
+    <Folder>
+      <name>Ski_Routes</name>
+      <Style id="style-Ski_Routes">
+        <LineStyle>
+          <color>#ffff3cc1</color>
+          <width>3</width>
+        </LineStyle>
+      </Style>
+    </Folder>
+    <Folder>
+      <name>Ski_Lift</name>
+      <Folder>
+        <name>Ski_Lift_Chairlift</name>
+        <Style id="style-Ski_Lift_Chairlift">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>6</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w4380585">
+          <name>Walleg</name>
+          <description>Walleg (Chairlift) Capacity: people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4307004,46.4584832,0 7.414217,46.447336,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w4388750">
+          <name>Metschberg</name>
+          <description>Metschberg (Chairlift) Capacity:4 people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4682319,46.4426424,0 7.4878089,46.443423,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w4389265">
+          <name>Luegli</name>
+          <description>Luegli (Chairlift) Capacity:4 people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5134775,46.4563718,0 7.507632,46.44102,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w4389266">
+          <name>Lavey</name>
+          <description>Lavey (Chairlift) Capacity:5 people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5137218,46.4574839,0 7.494809,46.462495,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w4389284">
+          <name>Aebi-Sillerenbühl</name>
+          <description>Aebi-Sillerenbühl (Chairlift) Capacity:6 people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5194921,46.4842678,0 7.5183847,46.4722004,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w8402416">
+          <name>Metschstand</name>
+          <description>Metschstand (Chairlift) Capacity:6 people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4751279,46.4473859,0 7.4951921,46.4444865,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w23300776">
+          <name>Bühlberg</name>
+          <description>Bühlberg (Chairlift) Capacity: people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4709826,46.4512884,0 7.4925723,46.455196,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w147422268">
+          <description> (Chairlift) Capacity:2 people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5437149,46.4835647,0 7.5466507,46.4822665,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w148806183">
+          <name>Boden-Chuenisbärgli</name>
+          <description>Boden-Chuenisbärgli (Chairlift) Capacity:4 people</description>
+          <Snippet>Chairlift</Snippet>
+          <styleUrl>#style-Ski_Lift_Chairlift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5570355,46.4818791,0 7.5465752,46.4729147,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_Gondola</name>
+        <Style id="style-Ski_Lift_Gondola">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>8</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w4380591">
+          <name>Stoss-Leiterli</name>
+          <description>Stoss-Leiterli (Gondola) Capacity: people</description>
+          <Snippet>Gondola</Snippet>
+          <styleUrl>#style-Ski_Lift_Gondola</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.429151,46.440554,0 7.4162843,46.432802,0 7.409078,46.428856,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w29376884">
+          <name>Lenk-Stoss</name>
+          <description>Lenk-Stoss (Gondola) Capacity: people</description>
+          <Snippet>Gondola</Snippet>
+          <styleUrl>#style-Ski_Lift_Gondola</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.436796,46.453005,0 7.429151,46.440554,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w29919593">
+          <name>Funitel Violettes-Plaine morte</name>
+          <description>Funitel Violettes-Plaine morte (Gondola) Capacity: people</description>
+          <Snippet>Gondola</Snippet>
+          <styleUrl>#style-Ski_Lift_Gondola</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4988727,46.3427065,0 7.4929566,46.358426,0 7.488878,46.370053,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_Cable_Car</name>
+        <Style id="style-Ski_Lift_Cable_Car">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>10</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w4389264">
+          <name>Geils-Hahnenmoos</name>
+          <description>Geils-Hahnenmoos (Cable Car) Capacity:4 people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.512872,46.457057,0 7.495256,46.453167,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w8402401">
+          <name>Metschbahn</name>
+          <description>Metschbahn (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.456975,46.44131,0 7.467957,46.442374,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w20016054">
+          <name>Elsigbach-Elsigenalp</name>
+          <description>Elsigbach-Elsigenalp (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.606468,46.529129,0 7.622388,46.522452,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w25576984">
+          <name>Gemmibahn</name>
+          <description>Gemmibahn (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.625227,46.383782,0 7.616339,46.398008,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w29569916">
+          <name>Sillerenbahn</name>
+          <description>Sillerenbahn (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.560206,46.487728,0 7.546887,46.4821013,0 7.532755,46.468548,0 7.517934,46.471763,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w33127855">
+          <name>Engstligenalp</name>
+          <description>Engstligenalp (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.566433,46.459076,0 7.56516,46.449387,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w35037933">
+          <name>Tschentenbahn</name>
+          <description>Tschentenbahn (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.55769,46.492944,0 7.5458795,46.4988409,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w40586987">
+          <description> (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.616339,46.398008,0 7.6132768,46.4028233,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w41617754">
+          <name>Iffigenalp-Rawil-Weisshorn</name>
+          <description>Iffigenalp-Rawil-Weisshorn (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4432715,46.4012898,0 7.4554936,46.3839921,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w41617756">
+          <name>Iffigenalp-Rawil-Weisshorn</name>
+          <description>Iffigenalp-Rawil-Weisshorn (Cable Car) Capacity: people</description>
+          <Snippet>Cable Car</Snippet>
+          <styleUrl>#style-Ski_Lift_Cable_Car</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4554936,46.3839921,0 7.4728668,46.3822403,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_Mixed_Lift</name>
+        <Style id="style-Ski_Lift_Mixed_Lift">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>8</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_Drag_Lift</name>
+        <Style id="style-Ski_Lift_Drag_Lift">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>4</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w4380584">
+          <name>Balmen</name>
+          <description>Balmen (Drag Lift)</description>
+          <Snippet>Drag Lift</Snippet>
+          <styleUrl>#style-Ski_Lift_Drag_Lift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4311473,46.4436377,0 7.429755,46.4386039,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w33127856">
+          <description> (Drag Lift)</description>
+          <Snippet>Drag Lift</Snippet>
+          <styleUrl>#style-Ski_Lift_Drag_Lift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5655255,46.449212,0 7.5679939,46.4406328,0 7.568652,46.4383091,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w33127857">
+          <description> (Drag Lift)</description>
+          <Snippet>Drag Lift</Snippet>
+          <styleUrl>#style-Ski_Lift_Drag_Lift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.568574,46.4409349,0 7.5749906,46.4438887,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w33127868">
+          <description> (Drag Lift)</description>
+          <Snippet>Drag Lift</Snippet>
+          <styleUrl>#style-Ski_Lift_Drag_Lift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5689165,46.4376761,0 7.5758497,46.4318298,0 7.5777092,46.4308174,0 7.5779358,46.4307636,0 7.5786456,46.4308094,0 7.5796203,46.43089,0 7.5801782,46.4310221,0 7.5779827,46.4329768,0 7.5690523,46.4378121,0 7.5689165,46.4376761,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w33127869">
+          <description> (Drag Lift)</description>
+          <Snippet>Drag Lift</Snippet>
+          <styleUrl>#style-Ski_Lift_Drag_Lift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5688149,46.4375738,0 7.5758005,46.4317871,0 7.5780116,46.4306132,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w121554245">
+          <name>Erli</name>
+          <description>Erli (Drag Lift)</description>
+          <Snippet>Drag Lift</Snippet>
+          <styleUrl>#style-Ski_Lift_Drag_Lift</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.62299,46.3828465,0 7.6192261,46.3858283,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_TBar</name>
+        <Style id="style-Ski_Lift_TBar">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>4</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w4388752">
+          <name>Guetfläck</name>
+          <description>Guetfläck (T-Bar)</description>
+          <Snippet>T-Bar</Snippet>
+          <styleUrl>#style-Ski_Lift_TBar</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4864068,46.4375038,0 7.4979322,46.4414643,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w4388830">
+          <description> (T-Bar)</description>
+          <Snippet>T-Bar</Snippet>
+          <styleUrl>#style-Ski_Lift_TBar</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4915714,46.4504852,0 7.4981254,46.4509924,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w20016060">
+          <description> (T-Bar)</description>
+          <Snippet>T-Bar</Snippet>
+          <styleUrl>#style-Ski_Lift_TBar</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6039602,46.5170216,0 7.6223253,46.5126763,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w20016061">
+          <description> (T-Bar)</description>
+          <Snippet>T-Bar</Snippet>
+          <styleUrl>#style-Ski_Lift_TBar</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6178567,46.5109719,0 7.6255759,46.5097159,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w31677466">
+          <name>Lac</name>
+          <description>Lac (T-Bar)</description>
+          <Snippet>T-Bar</Snippet>
+          <styleUrl>#style-Ski_Lift_TBar</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4938051,46.3683088,0 7.4894455,46.3702172,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w148806184">
+          <description> (T-Bar)</description>
+          <Snippet>T-Bar</Snippet>
+          <styleUrl>#style-Ski_Lift_TBar</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5074665,46.4712735,0 7.5028327,46.4648778,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w148806186">
+          <description> (T-Bar)</description>
+          <Snippet>T-Bar</Snippet>
+          <styleUrl>#style-Ski_Lift_TBar</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5440027,46.472332,0 7.546737,46.4678791,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_JBar</name>
+        <Style id="style-Ski_Lift_JBar">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>3</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w31677464">
+          <name>Glacier 2</name>
+          <description>Glacier 2 (J-Bar)</description>
+          <Snippet>J-Bar</Snippet>
+          <styleUrl>#style-Ski_Lift_JBar</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4888265,46.3742978,0 7.4889324,46.3707894,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_Platter</name>
+        <Style id="style-Ski_Lift_Platter">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>2</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w8402539">
+          <name>Aebi</name>
+          <description>Aebi (Platter)</description>
+          <Snippet>Platter</Snippet>
+          <styleUrl>#style-Ski_Lift_Platter</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5212812,46.4844127,0 7.5220797,46.4823123,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_Rope_Tow</name>
+        <Style id="style-Ski_Lift_Rope_Tow">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>2</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w148806185">
+          <description> (Rope Tow)</description>
+          <Snippet>Rope Tow</Snippet>
+          <styleUrl>#style-Ski_Lift_Rope_Tow</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5484827,46.4812398,0 7.5508319,46.4815667,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark id="w148806199">
+          <description> (Rope Tow)</description>
+          <Snippet>Rope Tow</Snippet>
+          <styleUrl>#style-Ski_Lift_Rope_Tow</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5469546,46.4819903,0 7.5473199,46.4814378,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Ski_Lift_Magic_Carpet</name>
+        <Style id="style-Ski_Lift_Magic_Carpet">
+          <LineStyle>
+            <color>#ff0e10b4</color>
+            <width>2</width>
+          </LineStyle>
+        </Style>
+        <Placemark id="w148806182">
+          <description> (Magic Carpet)</description>
+          <Snippet>Magic Carpet</Snippet>
+          <styleUrl>#style-Ski_Lift_Magic_Carpet</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4705402,46.4532965,0 7.471843,46.4529933,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+    </Folder>
+    <Folder>
+      <name>Ski_Boundary</name>
+      <Style id="style-Ski_Boundary">
+        <LineStyle>
+          <color>#ff0066ff</color>
+          <width>1</width>
+        </LineStyle>
+      </Style>
+    </Folder>
+    <Folder>
+      <name>Paths</name>
+      <Folder>
+        <name>Tracks</name>
+        <Style id="style-Tracks">
+          <LineStyle>
+            <color>#ff003f78</color>
+            <width>2</width>
+          </LineStyle>
+        </Style>
+        <Placemark>
+          <name>Hörnliweg</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.565494,46.5008679,0 7.5656791,46.500969,0 7.5658624,46.5011096,0 7.5661445,46.5013261,0 7.5666733,46.5015614,0 7.5667884,46.5017876,0 7.566748,46.5018344,0 7.5665807,46.5016761,0 7.5664381,46.5016324,0 7.566207,46.5016563,0 7.566185,46.501694,0 7.566361,46.501751,0 7.5664099,46.5018833,0 7.5665353,46.5022409,0 7.5667755,46.5024593,0 7.567001,46.502815,0 7.5669076,46.5033531,0 7.567179,46.5039149,0 7.5672453,46.5041525,0 7.5672579,46.5041977,0 7.5678887,46.50548 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.55826,46.4885102,0 7.5584046,46.4880564,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4722325,46.5557203,0 7.4723727,46.5554306,0 7.4724179,46.5554155,0 7.4725118,46.5554491,0 7.4727424,46.5554155,0 7.4729023,46.5555256,0 7.4730437,46.555317,0 7.4733032,46.5553483,0 7.4740136,46.5550725,0 7.4739997,46.5552336,0 7.4742734,46.5551527,0 7.4745005,46.5549001,0 7.4749441,46.5543583,0 7.4751759,46.5539538,0 7.4755333,46.553592,0 7.4758117,46.5533618,0 7.4763245,46.5528235,0 7.4764189,46.5523924,0 7.4765056,46.5521307,0 7.4766873,46.5520046,0 7.4768397 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.57743,46.513533,0 7.57697,46.513383,0 7.576639,46.513398,0 7.575972,46.513236,0 7.5754347,46.51317,0 7.5735754,46.5130497,0 7.573283,46.513028,0 7.5727554,46.5131053,0 7.5725651,46.51319,0 7.572003,46.513318,0 7.57147,46.5134376,0 7.57086,46.513632,0 7.5704027,46.5136993,0 7.5698483,46.5135546,0 7.569485,46.513179,0 7.568995,46.512935,0 7.5682886,46.5130065,0 7.5676272,46.512977,0 7.567304,46.512969,0 7.566875,46.512785,0 7.566209,46.512784,0 7.565811,46.512851 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5243291,46.4849987,0 7.5247153,46.4845022,0 7.525197,46.4841121,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5439138,46.4880345,0 7.5436907,46.4883773,0 7.5436564,46.4888146,0 7.5445919,46.4885664,0 7.5449953,46.4886255,0 7.5454416,46.4885664,0 7.5460167,46.4881409,0 7.5460596,46.4878868,0 7.546257,46.4878336,0 7.5465059,46.4880227,0 7.546566,46.4882709,0 7.5471926,46.4885959,0 7.5477419,46.4888205,0 7.5486174,46.488986,0 7.5491066,46.4891869,0 7.5493813,46.4894646,0 7.5494156,46.4900083,0 7.5491066,46.4903747,0 7.5488834,46.4907942,0 7.5489435,46.4908828,0 7.5492268, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5525656,46.4936365,0 7.5523274,46.4934746,0 7.5523274,46.4930905,0 7.5524115,46.4926899,0 7.5523257,46.4923796,0 7.5520468,46.4919365,0 7.5518322,46.4917444,0 7.5515532,46.4916706,0 7.5516391,46.4915228,0 7.551918,46.4915672,0 7.5524974,46.4918774,0 7.5528622,46.492099,0 7.553263,46.4922691,0 7.5533831,46.4923341,0 7.553469,46.4925764,0 7.5535806,46.4925409,0 7.5536063,46.4923164,0 7.5535291,46.4920859,0 7.5527051,46.4912587,0 7.5523274,46.4909928,0 7.5524562,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Panoramaweg</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5487911,46.4869921,0 7.5491129,46.4871325,0 7.5495421,46.4872654,0 7.5500785,46.4874058,0 7.5505077,46.4875462,0 7.5511729,46.4879007,0 7.5515698,46.4881962,0 7.5519668,46.4885951,0 7.5521814,46.4889718,0 7.5523638,46.489415,0 7.5523852,46.4897843,0 7.5524133,46.4901418,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5662091,46.4580919,0 7.5662713,46.458293,0 7.5669387,46.4587127,0 7.5669473,46.4590261,0 7.5667928,46.4591384,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4445475,46.5790933,0 7.4458753,46.5773845,0 7.4458753,46.57704,0 7.4458753,46.5764872,0 7.4454415,46.5759023,0 7.4449725,46.5753015,0 7.4445622,46.5747407,0 7.4442338,46.5745324,0 7.4439055,46.5743321,0 7.4437531,46.5740276,0 7.4435655,46.5738594,0 7.4435772,46.5737072,0 7.4437179,46.5733947,0 7.4436593,46.5731144,0 7.4434131,46.572858,0 7.4434131,46.5725455,0 7.4432606,46.5724094,0 7.443073,46.5721289,0 7.4428151,46.5718886,0 7.4427096,46.5716242,0 7.4423461,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.582288,46.50904,0 7.5818959,46.50922,0 7.5814771,46.5092119,0 7.58117,46.509261,0 7.580918,46.509277,0 7.5809353,46.5092018,0 7.581108,46.50897,0 7.581143,46.5088664,0 7.5811,46.508754,0 7.5810428,46.5086824,0 7.5809629,46.5086397,0 7.5806824,46.5085984,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5811311,46.5115993,0 7.5812245,46.5113495,0 7.581362,46.511302,0 7.581983,46.511495,0 7.5817095,46.5110604,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5659698,46.4470345,0 7.5650031,46.4460937,0 7.563934,46.445205,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5707798,46.4401998,0 7.569089,46.4414773,0 7.5687886,46.4416607,0 7.5684624,46.4417139,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5684624,46.4417139,0 7.5669518,46.4423053,0 7.5657759,46.4423822,0 7.5653982,46.4425064,0 7.5652008,46.4427608,0 7.5642996,46.4433581,0 7.564128,46.4436183,0 7.5631237,46.4440856,0 7.5624986,46.444518,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5633834,46.4449349,0 7.5632267,46.4453985,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5578623,46.4428613,0 7.5580572,46.4430058,0 7.558304,46.443065,0 7.5586366,46.4431167,0 7.5589907,46.4430946,0 7.5594091,46.4431389,0 7.5597284,46.4432301,0 7.5599777,46.4432794,0 7.5603342,46.4434764,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5014286,46.4245354,0 7.5006562,46.4241982,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5000468,46.4239793,0 7.4995318,46.4237071,0 7.4992657,46.4238313,0 7.4993,46.4240858,0 7.4987765,46.4239438,0 7.4983301,46.4237012,0 7.4979697,46.4233462,0 7.4974804,46.4232456,0 7.4969912,46.4232634,0 7.4965191,46.4230385,0 7.4949055,46.4225356,0 7.4928284,46.422293,0 7.4925108,46.4221865,0 7.4922705,46.4213819,0 7.4910088,46.421583,0 7.4907513,46.4216955,0 7.4911204,46.4219025,0 7.4904766,46.422222,0 7.4900475,46.4225415,0 7.4898844,46.4229202,0 7.4899359,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5006562,46.4241982,0 7.5003643,46.424139,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5003643,46.424139,0 7.5000468,46.4239793,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4843457,46.4265489,0 7.4840821,46.4265818,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4840821,46.4265818,0 7.4831295,46.4267008,0 7.482194,46.4265943,0 7.4811898,46.4266712,0 7.4788895,46.4265588,0 7.478323,46.4266475,0 7.4783109,46.4266478,0 7.4770527,46.4266771,0 7.4761172,46.426896,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5659698,46.4470345,0 7.5655203,46.4480124,0 7.5655891,46.448399,0 7.5651457,46.4489852,0 7.5649628,46.449227,0 7.56516,46.449387,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5623083,46.444399,0 7.5621882,46.4442866,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5621882,46.4442866,0 7.5619659,46.4441994,0 7.5603342,46.4434764,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5638662,46.4451512,0 7.5633834,46.4449349,0 7.5624986,46.444518,0 7.5623083,46.444399,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.563934,46.445205,0 7.5638662,46.4451512,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5650031,46.4460937,0 7.5644603,46.4461059,0 7.563467,46.446806,0 7.5631545,46.4467541,0 7.562727,46.446683,0 7.5621935,46.4470208,0 7.5616868,46.4474721,0 7.5615495,46.4474679,0 7.561039,46.447273,0 7.560624,46.447319,0 7.560726,46.447719,0 7.56098,46.448121,0 7.560985,46.448126,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5619659,46.4441994,0 7.5616754,46.4444958,0 7.5609186,46.4449775,0 7.56084,46.4452181,0 7.5609195,46.4455156,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6216319,46.5569936,0 7.621301,46.556518,0 7.621064,46.556056,0 7.620255,46.555568,0 7.61985,46.555023,0 7.619469,46.554934,0 7.61885,46.55517,0 7.618224,46.555101,0 7.616902,46.554591,0 7.616307,46.554441,0 7.6157588,46.5541889,0 7.615575,46.554088,0 7.615245,46.553345,0 7.615047,46.553178,0 7.614621,46.5530406,0 7.614502,46.552815,0 7.6145042,46.5525758,0 7.6144034,46.5523715,0 7.6143229,46.5523162,0 7.6137389,46.5522484,0 7.6133449,46.5520084,0 7.6131605,46.5 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.614076,46.555321,0 7.6141065,46.555273,0 7.6139027,46.555118,0 7.613895,46.554985,0 7.614333,46.554527,0 7.614442,46.554234,0 7.61451,46.554227,0 7.614586,46.55458,0 7.614753,46.554636,0 7.615356,46.554676,0 7.615528,46.554846,0 7.615611,46.554802,0 7.615595,46.554721,0 7.615483,46.554504,0 7.615205,46.5542,0 7.615198,46.554095,0 7.615281,46.554102,0 7.615478,46.55423,0 7.6157588,46.5541889,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.562625,46.528737,0 7.56258,46.528984,0 7.5624755,46.5290639,0 7.5622926,46.5292237,0 7.5622248,46.5293516,0 7.5622072,46.5294627,0 7.5623111,46.5297611,0 7.5622992,46.5298085,0 7.5622281,46.5298254,0 7.5620681,46.5297868,0 7.5619444,46.5298217,0 7.5617042,46.5300155,0 7.5616171,46.5301839,0 7.5614941,46.5302822,0 7.5612441,46.5305146,0 7.5613218,46.5305287,0 7.5615238,46.5304796,0 7.5615986,46.5304887,0 7.5617029,46.5305871,0 7.5617754,46.5305914,0 7.5619127,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.448503,46.459865,0 7.4481932,46.4599236,0 7.447857,46.459965,0 7.4477077,46.4598442,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.422303,46.459911,0 7.422095,46.459751,0 7.421974,46.45922,0 7.42177,46.459237,0 7.421713,46.459428,0 7.421433,46.459584,0 7.421153,46.459927,0 7.421124,46.460335,0 7.421335,46.460904,0 7.421273,46.461004,0 7.421129,46.46101,0 7.420944,46.460704,0 7.420039,46.459998,0 7.419421,46.459828,0 7.419236,46.459693,0 7.419076,46.459556,0 7.418931,46.459118,0 7.418705,46.458838,0 7.417878,46.458255,0 7.417994,46.458118,0 7.4184,46.457984,0 7.418286,46.45737,0 7.418312,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.464328,46.457064,0 7.463382,46.457176,0 7.462897,46.457377,0 7.462649,46.457567,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.469627,46.453826,0 7.469009,46.453963,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.448482,46.460149,0 7.448486,46.460146,0 7.448833,46.459856,0 7.448785,46.459794,0 7.448503,46.459865,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5903867,46.5152344,0 7.5903489,46.5153277,0 7.590271,46.515499,0 7.590262,46.515674,0 7.590325,46.515841,0 7.590276,46.515941,0 7.590159,46.516075,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.589031,46.518301,0 7.589029,46.518367,0 7.589031,46.51853,0 7.589068,46.51861,0 7.589181,46.518754,0 7.58928,46.518836,0 7.589371,46.518996,0 7.589441,46.519072,0 7.589449,46.519104,0 7.589424,46.519186,0 7.589486,46.519322,0 7.589476,46.519587,0 7.589486,46.519672,0 7.589452,46.51985,0 7.589515,46.519951,0 7.589558,46.520058,0 7.589665,46.520142,0 7.58973,46.520286,0 7.589863,46.520462,0 7.589887,46.520566,0 7.589898,46.520727,0 7.589946,46.520843,0 7.5900055, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6093448,46.5481847,0 7.6094427,46.5483293,0 7.6094101,46.548591,0 7.609356,46.548667,0 7.609166,46.548845,0 7.6089752,46.5489862,0 7.6088952,46.5490921,0 7.6086869,46.549561,0 7.608622,46.5497762,0 7.608591,46.54994,0 7.6086371,46.5501173,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Lischenstrasse</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5802181,46.4985699,0 7.5801466,46.4985211,0 7.580027,46.4983298,0 7.5798853,46.498233,0 7.5797367,46.4978481,0 7.5796769,46.4977522,0 7.579526,46.497591,0 7.5792835,46.4974686,0 7.5791957,46.4973171,0 7.5790319,46.4971786,0 7.5788853,46.4971104,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.578695,46.517886,0 7.578953,46.518042,0 7.579168,46.51811,0 7.579338,46.518213,0 7.579463,46.51835,0 7.579476,46.518507,0 7.579533,46.518679,0 7.579717,46.518822,0 7.579934,46.518941,0 7.580101,46.519058,0 7.580151,46.519196,0 7.580164,46.519362,0 7.580285,46.519495,0 7.5807866,46.5197277,0 7.581016,46.519826,0 7.581209,46.5199,0 7.581276,46.519904,0 7.5812961,46.5198713,0 7.581275,46.519829,0 7.581047,46.519686,0 7.58093,46.519564,0 7.580785,46.51945,0 7.58073 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5807866,46.5197277,0 7.5808963,46.5198879,0 7.580874,46.519925,0 7.580826,46.519954,0 7.580638,46.520001,0 7.5803428,46.5199976,0 7.5801735,46.5200411,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6128563,46.5576717,0 7.612698,46.557657,0 7.612517,46.557642,0 7.612308,46.557685,0 7.612183,46.557782,0 7.61231,46.557889,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6045687,46.4880471,0 7.6045863,46.4881633,0 7.6045673,46.4882513,0 7.6044723,46.4884403,0 7.6043857,46.488565,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5897212,46.4818723,0 7.5895673,46.4819072,0 7.589368,46.482049,0 7.589186,46.482293,0 7.5889665,46.4825243,0 7.588688,46.482802,0 7.588667,46.482876,0 7.588272,46.483302,0 7.587817,46.483767,0 7.587592,46.484096,0 7.587544,46.484295,0 7.5873982,46.4845334,0 7.58722,46.484682,0 7.586952,46.484887,0 7.586723,46.484991,0 7.586202,46.485288,0 7.585801,46.485609,0 7.5853807,46.486011,0 7.585214,46.486292,0 7.5851904,46.4864815,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5773923,46.4947336,0 7.577378,46.494574,0 7.577124,46.494315,0 7.5770454,46.4942655,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4393406,46.4117801,0 7.4392719,46.411641,0 7.4393529,46.411519,0 7.4396951,46.4114482,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4864609,46.3705861,0 7.4871769,46.3704428,0 7.4885874,46.3703193,0 7.4891387,46.370344,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4891387,46.370344,0 7.4902628,46.3705021,0 7.4912509,46.3708331,0 7.4922462,46.3712679,0 7.4926614,46.3714013,0 7.4932557,46.3710307,0 7.4943369,46.3708875,0 7.4952462,46.370512,0 7.4956472,46.3701464,0 7.4958119,46.3696573,0 7.4961341,46.3693312,0 7.4969503,46.369099,0 7.4977594,46.3690793,0 7.4982964,46.3690496,0 7.4989479,46.368768,0 7.4992988,46.3682987,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4922705,46.4213819,0 7.4920912,46.4210829,0 7.492428,46.4207877,0 7.4926512,46.4205796,0 7.493215,46.420485,0 7.4936048,46.420432,0 7.4938281,46.4200158,0 7.4938848,46.4191076,0 7.4936426,46.4187141,0 7.4928631,46.4181881,0 7.4924317,46.4180405,0 7.4916144,46.4174502,0 7.4910922,46.4173707,0 7.4904754,46.4171777,0 7.4902029,46.4168183,0 7.4901878,46.4164474,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5640376,46.4659612,0 7.5641356,46.4658925,0 7.5644622,46.465664,0 7.5647672,46.4653051,0 7.5649746,46.4650798,0 7.5651461,46.4649462,0 7.5660472,46.4644537,0 7.5661701,46.464399,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5661701,46.464399,0 7.566232,46.46429,0 7.5662324,46.4640747,0 7.566153,46.463848,0 7.5658337,46.4636438,0 7.5656605,46.4634444,0 7.5655755,46.463216,0 7.5656183,46.4631362,0 7.5658357,46.4630618,0 7.5667984,46.4630235,0 7.5669353,46.4631081,0 7.5670907,46.4632844,0 7.5673083,46.4635677,0 7.5677701,46.4639593,0 7.5677916,46.4643203,0 7.5678558,46.4645145,0 7.5681316,46.4648778,0 7.5682555,46.4648917,0 7.5682601,46.4647927,0 7.5682358,46.4644346,0 7.5683003,46.4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4248311,46.4957794,0 7.4245438,46.4955981,0 7.4236484,46.495249,0 7.4234662,46.4949758,0 7.423193,46.4947178,0 7.4228743,46.4944901,0 7.42196,46.4940534,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5735275,46.4691135,0 7.57336,46.469298,0 7.573238,46.469411,0 7.5731997,46.4695416,0 7.573284,46.4697528,0 7.5733001,46.4698644,0 7.573262,46.469952,0 7.5731973,46.4700178,0 7.573187,46.470135,0 7.5732019,46.4702022,0 7.573187,46.470352,0 7.5732409,46.4705046,0 7.573242,46.4705791,0 7.5732157,46.470724,0 7.5733061,46.4708862,0 7.5734015,46.4709989,0 7.5735742,46.4710778,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Hohliebeweg</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5733697,46.4768436,0 7.573353,46.476752,0 7.5733911,46.4766038,0 7.573493,46.476286,0 7.5734351,46.4760864,0 7.5733474,46.4760144,0 7.5732267,46.4758689,0 7.573313,46.47557,0 7.573431,46.475316,0 7.573552,46.475106,0 7.573604,46.474837,0 7.57359,46.4746865,0 7.573548,46.474581,0 7.5732579,46.4742404,0 7.5731951,46.4737075,0 7.5731212,46.4734883,0 7.5730983,46.4732924,0 7.5731432,46.4730867,0 7.5732774,46.472861,0 7.5734388,46.472535,0 7.5736016,46.4723781,0 7.5 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5733911,46.4766038,0 7.5737293,46.4768559,0 7.5738944,46.4769527,0 7.5740528,46.4769137,0 7.5742429,46.476773,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5751232,46.4803012,0 7.574269,46.480065,0 7.574085,46.480036,0 7.573709,46.479919,0 7.573569,46.479818,0 7.573342,46.479577,0 7.573053,46.47915,0 7.5729777,46.4790803,0 7.5728374,46.4790077,0 7.5727664,46.4789417,0 7.5727002,46.4787992,0 7.5726607,46.4787749,0 7.5726211,46.4788179,0 7.572565,46.4789796,0 7.5725895,46.4791432,0 7.572533,46.479272,0 7.572535,46.479423,0 7.572453,46.480005,0 7.5724148,46.4801166,0 7.572435,46.480232,0 7.5724691,46.4803328,0 7.5725 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5740293,46.4894136,0 7.574015,46.489153,0 7.5741006,46.4890715,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5741006,46.4890715,0 7.574056,46.488667,0 7.57397,46.488541,0 7.573774,46.488517,0 7.57331,46.488254,0 7.573174,46.488224,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.592367,46.5149672,0 7.5922017,46.5152686,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5463905,46.4726263,0 7.546366,46.472721,0 7.5463738,46.472813,0 7.5464139,46.4728843,0 7.546528,46.472992,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5477933,46.4743096,0 7.54757,46.474233,0 7.547457,46.474213,0 7.547301,46.474235,0 7.547152,46.474314,0 7.547062,46.474311,0 7.546977,46.474161,0 7.546801,46.473923,0 7.546706,46.47382,0 7.54664,46.473763,0 7.546483,46.473653,0 7.546253,46.47342,0 7.546126,46.47332,0 7.546031,46.473211,0 7.545932,46.473064,0 7.545876,46.472971,0 7.545769,46.472472,0 7.545809,46.472383,0 7.545972,46.472179,0 7.5460217,46.4721319,0 7.546117,46.472286,0 7.546154,46.472453,0 7.5462 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.550773,46.4757458,0 7.5506962,46.4757786,0 7.5505663,46.4760656,0 7.550485,46.4762,0 7.5501625,46.4766475,0 7.549997,46.476819,0 7.549832,46.476925,0 7.549748,46.476959,0 7.5494582,46.4770455,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5494582,46.4770455,0 7.5493221,46.4771051,0 7.5491396,46.4772255,0 7.548826,46.4773225,0 7.5486479,46.4774293,0 7.548434,46.477516,0 7.548247,46.477632,0 7.5479858,46.4777277,0 7.5476525,46.4777526,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5788121,46.4963841,0 7.578966,46.4963599,0 7.5790202,46.4963178,0 7.579056,46.496135,0 7.5789867,46.4959231,0 7.5790707,46.495913,0 7.5793381,46.4961651,0 7.5795192,46.4962795,0 7.579574,46.496281,0 7.5795861,46.4962396,0 7.5795507,46.496092,0 7.5795179,46.4960341,0 7.5795848,46.495996,0 7.5797434,46.4960857,0 7.5799401,46.4961536,0 7.580077,46.496183,0 7.58027,46.496287,0 7.5803426,46.4962898,0 7.5803678,46.4962349,0 7.5802526,46.496084,0 7.5801532,46.4959733, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.551122,46.463773,0 7.5510751,46.4639061,0 7.551126,46.464136,0 7.551157,46.46429,0 7.551131,46.464488,0 7.551011,46.464817,0 7.5511177,46.4651568,0 7.551141,46.465532,0 7.551148,46.465689,0 7.551205,46.465825,0 7.551178,46.465985,0 7.551117,46.466111,0 7.55102,46.466282,0 7.5509148,46.4667058,0 7.5508464,46.4667767,0 7.55076,46.466756,0 7.550766,46.466644,0 7.550804,46.466472,0 7.550801,46.46641,0 7.550818,46.466297,0 7.550888,46.46611,0 7.5508992,46.4659542,0  [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5324614,46.4521053,0 7.5326827,46.452079,0 7.532898,46.452116,0 7.5330862,46.4521987,0 7.5332827,46.4523798,0 7.533559,46.452494,0 7.534264,46.452695,0 7.5346068,46.4526309,0 7.5347041,46.4526012,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5505555,46.461797,0 7.5503452,46.461619,0 7.550283,46.461427,0 7.550137,46.4612643,0 7.549677,46.4609514,0 7.5496432,46.4608955,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5525656,46.4936365,0 7.5528161,46.4936972,0 7.5529717,46.4937895,0 7.5532023,46.4938745,0 7.5533579,46.4938597,0 7.5536959,46.4937378,0 7.5540177,46.4937341,0 7.5542269,46.4937489,0 7.5543128,46.4938375,0 7.5542538,46.4939262,0 7.5540499,46.494133,0 7.5538943,46.4943583,0 7.5538032,46.494602,0 7.5537978,46.4948273,0 7.553771,46.4950525,0 7.5538192,46.4951855,0 7.5540445,46.4955289,0 7.554184,46.4957985,0 7.5543771,46.4960496,0 7.554581,46.4961826,0 7.5548278,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Dauberhorn - Gemmibahn</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6026829,46.3875479,0 7.602328,46.387297,0 7.6021778,46.3868011,0 7.6021457,46.3865273,0 7.6018452,46.3866235,0 7.6017809,46.3864903,0 7.6014697,46.3864385,0 7.6010835,46.3865347,0 7.60059,46.3866605,0 7.6001286,46.3867049,0 7.5997639,46.3868011,0 7.5994205,46.3868603,0 7.5989592,46.3867715,0 7.5984335,46.3867789,0 7.5978219,46.3869047,0 7.5970387,46.3870009,0 7.5962984,46.3870824,0 7.5958693,46.3873858,0 7.5956869,46.3876152,0 7.5957298,46.3879926,0 7.5956976,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4800756,46.5665507,0 7.4797926,46.5665166,0 7.4796178,46.5666915,0 7.4795866,46.567193,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4854834,46.5161258,0 7.4855385,46.5162773,0 7.4860047,46.516287,0 7.4862334,46.5162894,0 7.4863353,46.5163123,0 7.4863709,46.516376,0 7.4863073,46.5165008,0 7.4861876,46.516595,0 7.4859915,46.5169922,0 7.4858387,46.5171984,0 7.4857878,46.5173207,0 7.4856325,46.5174683,0 7.4855638,46.517476,0 7.485551,46.517504,0 7.4855638,46.5175778,0 7.4855638,46.517644,0 7.4854939,46.5177249,0 7.485479,46.5178293,0 7.4854094,46.5178741,0 7.48529,46.5179586,0 7.4852304,46.5180 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4021735,46.5042278,0 7.4022338,46.5039567,0 7.4030306,46.5030461,0 7.4037515,46.5022493,0 7.4056866,46.5010162,0 7.4058004,46.5007506,0 7.4059332,46.4997451,0 7.4060281,46.4994985,0 7.406692,46.499195,0 7.4082666,46.4986638,0 7.4103534,46.4975065,0 7.4132181,46.495894,0 7.4147413,46.4949366,0 7.4158357,46.4942866,0 7.4175094,46.4931639,0 7.4190972,46.4920117,0 7.4198912,46.4915094,0 7.4200628,46.4913764,0 7.420213,46.4910662,0 7.4206636,46.4907264,0 7.4214576,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5590626,46.4870252,0 7.5596203,46.4873634,0 7.5598972,46.487543,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.42196,46.4940534,0 7.4214143,46.4939178,0 7.4213342,46.4938979,0 7.4209566,46.4938507,0 7.4206648,46.4939098,0 7.4203558,46.494022,0 7.4195919,46.4942879,0 7.4191112,46.4943588,0 7.4184675,46.4944416,0 7.4180469,46.4945775,0 7.4175132,46.4950208,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4262468,46.4595065,0 7.4262361,46.4592922,0 7.4262361,46.4590705,0 7.4262468,46.4587453,0 7.4261824,46.4585088,0 7.4257425,46.4580062,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4528183,46.5206213,0 7.4518921,46.5203291,0 7.4515129,46.5200991,0 7.4509055,46.5198462,0 7.4505617,46.5197602,0 7.4499281,46.5196986,0 7.4496551,46.5195907,0 7.4494311,46.5194705,0 7.4490583,46.5193646,0 7.4486957,46.5192179,0 7.4482353,46.5189694,0 7.4478544,46.5188064,0 7.4475591,46.5187391,0 7.4471488,46.5186023,0 7.4469498,46.5184034,0 7.4465396,46.5182355,0 7.4459925,46.5180117,0 7.4456879,46.5179496,0 7.4451533,46.5175952,0 7.444426,46.5172906,0 7.444152 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Hörnliweg</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5634771,46.498246,0 7.563543,46.498316,0 7.5638087,46.4985406,0 7.5638266,46.4989595,0 7.5643825,46.4994173,0 7.5647636,46.4997905,0 7.5650245,46.5000946,0 7.5652805,46.5002911,0 7.565369,46.500541,0 7.5654359,46.5006704,0 7.5654456,46.5007267,0 7.565494,46.5008679,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5704442,46.5055077,0 7.5702808,46.5053663,0 7.5701857,46.5052743,0 7.5700595,46.505126,0 7.5699587,46.5049793,0 7.5697775,46.5047638,0 7.5696764,46.5046204,0 7.5696176,46.5045153,0 7.569522,46.504287,0 7.5693937,46.504028,0 7.5693182,46.5038638,0 7.5692352,46.5036487,0 7.5691654,46.5034532,0 7.5690593,46.5033257,0 7.5688693,46.5031471,0 7.568744,46.5029817,0 7.5687151,46.5029089,0 7.5686907,46.5028223,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4293897,46.4761015,0 7.4294959,46.4760031,0 7.4295844,46.47592,0 7.4297078,46.4758018,0 7.429925,46.4756596,0 7.4300725,46.4755229,0 7.4302362,46.475316,0 7.4303756,46.4750833,0 7.4304722,46.4749115,0 7.4305178,46.4747323,0 7.4306707,46.4745217,0 7.4308584,46.4742853,0 7.4311427,46.4740562,0 7.431352,46.4738216,0 7.4314887,46.4735446,0 7.431588,46.4733063,0 7.431706,46.4730477,0 7.4317516,46.4728703,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4268244,46.4763947,0 7.4269585,46.4764612,0 7.4271248,46.4764871,0 7.4273876,46.4764354,0 7.4276022,46.4763578,0 7.4277363,46.4762802,0 7.4278812,46.4762507,0 7.4280486,46.4762655,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4340985,46.4707201,0 7.434238,46.4705945,0 7.4344365,46.4703802,0 7.4346457,46.4702213,0 7.4350534,46.4703728,0 7.4353769,46.4704585,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4353769,46.4704585,0 7.435482,46.4704761,0 7.4355162,46.4704903,0 7.4356185,46.4705018,0 7.4364604,46.4704052,0 7.4370811,46.4707552,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5318629,46.4633692,0 7.5317263,46.4629743,0 7.5313508,46.4623387,0 7.5311041,46.4613854,0 7.5310075,46.4608607,0 7.5306964,46.4603581,0 7.5305891,46.4600477,0 7.5305462,46.4596042,0 7.5303852,46.4589982,0 7.5299883,46.4585769,0 7.5287008,46.4575126,0 7.5283682,46.4569361,0 7.5281322,46.4561453,0 7.5281429,46.4557461,0 7.5282287,46.4554727,0 7.5285399,46.4551622,0 7.5292158,46.4544453,0 7.5298273,46.4542235,0 7.530396,46.4541053,0 7.530632,46.4540535,0 7.5307286 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5388594,46.4323326,0 7.5392281,46.4322406,0 7.5397646,46.4321519,0 7.540065,46.4321667,0 7.54058,46.4322406,0 7.5410091,46.4322998,0 7.5412666,46.4325068,0 7.5416314,46.4326695,0 7.5418889,46.432773,0 7.5421035,46.43298,0 7.5425326,46.4332462,0 7.5428974,46.4333645,0 7.5433695,46.4334385,0 7.5435626,46.4335568,0 7.5439917,46.4337934,0 7.5445067,46.434104,0 7.5450861,46.4343406,0 7.5456225,46.4346364,0 7.5460088,46.4347842,0 7.5463306,46.4348434,0 7.5465452,46.4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Gemmistrasse</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6237311,46.3837753,0 7.6234774,46.3838704,0 7.622544,46.3843698,0 7.6219235,46.3846108,0 7.6214367,46.3853915,0 7.6206176,46.3859502,0 7.6201284,46.3864565,0 7.6198804,46.3866291,0 7.6195346,46.3874896,0 7.6197172,46.3877987,0 7.6196075,46.3879736,0 7.6189509,46.3878995,0 7.6184904,46.3879967,0 7.6186038,46.3882094,0 7.6188989,46.3883671,0 7.6192004,46.3885456,0 7.619828,46.3888194,0 7.6202518,46.3889822,0 7.6205629,46.3889933,0 7.6210833,46.3890969,0 7.6215929 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bütscheggenweg</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5645004,46.5024523,0 7.5643032,46.5024079,0 7.5642002,46.5024009,0 7.5639082,46.5024017,0 7.563623,46.502347,0 7.5633927,46.5022879,0 7.5632576,46.5022067,0 7.563109,46.5020934,0 7.563005,46.50203,0 7.562912,46.501915,0 7.5628685,46.5017841,0 7.562789,46.5017139,0 7.5625977,46.5016474,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bütscheggenweg</name>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5658571,46.5029369,0 7.565378,46.502792,0 7.5652788,46.5027476,0 7.5650875,46.5026587,0 7.5648487,46.5025808,0 7.5645004,46.5024523,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5883223,46.5173041,0 7.5883922,46.5173254,0 7.588884,46.51737,0 7.589137,46.517445,0 7.589223,46.517428,0 7.5892426,46.5172029,0 7.589195,46.517181,0 7.589143,46.517165,0 7.588956,46.517047,0 7.588803,46.516895,0 7.588737,46.516809,0 7.588709,46.516743,0 7.5886797,46.5165501,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5879633,46.5171897,0 7.5882182,46.5172418,0 7.5883223,46.5173041,0 7.5884541,46.5174144,0 7.588621,46.517648,0 7.588713,46.51781,0 7.588762,46.517866,0 7.58888,46.517958,0 7.588934,46.518028,0 7.58896,46.518155,0 7.589031,46.518301,0 7.589079,46.518323,0 7.5892056,46.5183555,0 7.589288,46.518439,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5826523,46.4989336,0 7.5825898,46.4990355,0 7.5826343,46.4991879,0 7.5826984,46.499309,0 7.582719,46.499403,0 7.5828014,46.4995759,0 7.582807,46.499739,0 7.5828446,46.4998144,0 7.5829721,46.4999336,0 7.58306,46.5000875,0 7.583046,46.500152,0 7.582917,46.500426,0 7.5826608,46.5005706,0 7.5823436,46.5007509,0 7.5822184,46.50073,0 7.5820124,46.5005653,0 7.5818994,46.5004572,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.578672,46.5205961,0 7.5787651,46.520547,0 7.5788446,46.5204993,0 7.578937,46.520553,0 7.5793743,46.5206724,0 7.579642,46.520806,0 7.579854,46.520889,0 7.580014,46.520939,0 7.580248,46.520982,0 7.580479,46.520835,0 7.580655,46.520778,0 7.581053,46.520755,0 7.581774,46.520671,0 7.581938,46.520619,0 7.582083,46.520557,0 7.582782,46.520178,0 7.5828672,46.5200806,0 7.582853,46.519966,0 7.582691,46.5197745,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5785017,46.5014825,0 7.5782187,46.5013039,0 7.5773506,46.5011965,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5543278,46.5106844,0 7.552418,46.510272,0 7.552234,46.510298,0 7.5518293,46.510394,0 7.551497,46.510395,0 7.5511102,46.5103357,0 7.5504234,46.5103985,0 7.5498621,46.5103121,0 7.5489084,46.5104103,0 7.547537,46.510344,0 7.547371,46.510243,0 7.5472993,46.5100845,0 7.547166,46.509991,0 7.5470386,46.5099552,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5665772,46.5111305,0 7.5661335,46.5110512,0 7.565676,46.511024,0 7.564624,46.510737,0 7.5637674,46.5108027,0 7.5627058,46.5109232,0 7.5620088,46.5104446,0 7.5618541,46.5104123,0 7.5611605,46.5106807,0 7.5608878,46.5107049,0 7.5601998,46.5106693,0 7.5595979,46.5109139,0 7.5590547,46.5110383,0 7.558377,46.511309,0 7.5576766,46.5114214,0 7.557316,46.511429,0 7.5558858,46.5107802,0 7.5548832,46.5106228,0 7.5543278,46.5106844,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5572602,46.5039626,0 7.5565998,46.5037653,0 7.556337,46.503737,0 7.5561181,46.5036637,0 7.555636,46.503467,0 7.5542456,46.5027933,0 7.553992,46.502666,0 7.55387,46.502572,0 7.553751,46.5024,0 7.553569,46.502294,0 7.552955,46.502105,0 7.552762,46.501995,0 7.552663,46.50191,0 7.552167,46.501397,0 7.551822,46.501019,0 7.551661,46.500913,0 7.551534,46.500853,0 7.551234,46.500736,0 7.550892,46.500652,0 7.550273,46.500621,0 7.549463,46.500519,0 7.548911,46.500354,0 7 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5470386,46.5099552,0 7.546909,46.50992,0 7.546808,46.509814,0 7.546857,46.509759,0 7.547272,46.509792,0 7.547587,46.509838,0 7.547864,46.509808,0 7.5484138,46.5095411,0 7.548895,46.509268,0 7.5490654,46.5092289,0 7.549337,46.509187,0 7.549454,46.509095,0 7.549336,46.509014,0 7.548898,46.509065,0 7.5486376,46.5090759,0 7.5473181,46.5086821,0 7.5471077,46.5085813,0 7.546657,46.508168,0 7.546354,46.508088,0 7.5457686,46.5080083,0 7.545412,46.507947,0 7.5453714,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6155446,46.4496036,0 7.6158266,46.4496374,0 7.6163109,46.4496955,0 7.6171772,46.4499824,0 7.61826,46.4503153,0 7.6194595,46.4502464,0 7.6204757,46.4507399,0 7.621342,46.4512335,0 7.6221583,46.4518188,0 7.6229818,46.4535272,0 7.6229158,46.4551282,0 7.6233595,46.4571271,0 7.6247231,46.458704,0 7.6254607,46.4588344,0 7.6255846,46.458493,0 7.6262756,46.458691,0 7.6262981,46.459034,0 7.627519,46.4599796,0 7.6276489,46.4609378,0 7.6285887,46.4615968,0 7.6286387,46.46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.617833,46.5283281,0 7.6175991,46.528688,0 7.6175883,46.5289759,0 7.6181999,46.529559,0 7.6185325,46.5300831,0 7.6184037,46.5301495,0 7.6178136,46.5297366,0 7.617009,46.5297288,0 7.6164189,46.5295295,0 7.6158824,46.5295295,0 7.6157644,46.5297288,0 7.6158932,46.5301274,0 7.6163545,46.5303713,0 7.6167086,46.5307105,0 7.6170658,46.5311194,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6109659,46.5266158,0 7.6117361,46.526354,0 7.6118901,46.5263694,0 7.6118131,46.5265542,0 7.6112585,46.5273552,0 7.6113048,46.5275554,0 7.6121982,46.5271857,0 7.6127681,46.5270625,0 7.6129553,46.5269559,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5189956,46.4843231,0 7.5190332,46.4840125,0 7.518926,46.4835988,0 7.518132,46.4833772,0 7.5167158,46.482934,0 7.5166944,46.4827123,0 7.5173166,46.482343,0 7.5171235,46.4822395,0 7.5169079,46.4822839,0 7.5161794,46.4823282,0 7.5153211,46.4821213,0 7.5151279,46.4820031,0 7.5148061,46.4812791,0 7.5132611,46.4802153,0 7.5121453,46.4796981,0 7.5121882,46.4795356,0 7.5129178,46.4798459,0 7.513304,46.479905,0 7.5146559,46.4803335,0 7.5159648,46.4805551,0 7.5169304,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.580325,46.5027273,0 7.580134,46.5028204,0 7.5799106,46.5029702,0 7.5795711,46.5032229,0 7.579505,46.50336,0 7.5794962,46.5034404,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5887308,46.5121362,0 7.5878146,46.5121861,0 7.5875342,46.512005,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5486892,46.4843265,0 7.5482932,46.4846238,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5452866,46.4835281,0 7.5445192,46.4833872,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5439543,46.4836822,0 7.5442929,46.4838529,0 7.5444163,46.4839361,0 7.5444886,46.4839589,0 7.544905,46.4840167,0 7.5455029,46.4842106,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5482932,46.4846238,0 7.5469389,46.4843438,0 7.546616,46.484368,0 7.546398,46.4842227,0 7.5456648,46.4841873,0 7.5455029,46.4842106,0 7.5451848,46.4842565,0 7.5450642,46.484286,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Tracks</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.57139,46.4855698,0 7.5712639,46.4854836,0 7.571188,46.4854049,0 7.571083,46.4852752,0 7.5710397,46.4852471,0 7.5708579,46.4851424,0 7.5702202,46.4846207,0 7.5699875,46.4843914,0 7.5697506,46.4843808,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Winter_Hiking</name>
+        <Style id="style-Winter_Hiking">
+          <LineStyle>
+            <color>#ff003f78</color>
+            <width>2</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+      <Folder>
+        <name>Summer_Hiking</name>
+        <Style id="style-Summer_Hiking">
+          <LineStyle>
+            <color>#ff003f78</color>
+            <width>1</width>
+          </LineStyle>
+        </Style>
+        <Placemark>
+          <name>Haselweg</name>
+          <description>Haselweg, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5647157,46.4954991,0 7.5652338,46.4952461,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5654624,46.4590852,0 7.5657857,46.4590406,0 7.5660894,46.4588054,0 7.5661792,46.4586043,0 7.5661147,46.4582042,0 7.5662091,46.4580919,0 7.5662434,46.4579559,0 7.565883,46.4574237,0 7.5652732,46.457071,0 7.5649731,46.4568975,0 7.5644095,46.4567614,0 7.5638831,46.4564126,0 7.5632094,46.4558142,0 7.5631766,46.4555546,0 7.5628849,46.4551459,0 7.562303,46.4547165,0 7.5619564,46.454653,0 7.561394,46.4546978,0 7.5610892,46.4543912,0 7.5610362,46.4541518,0 7.5607503,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.569223,46.5076089,0 7.5689582,46.5076903,0 7.5679113,46.5074419,0 7.5678265,46.5072529,0 7.56764,46.5072284,0 7.5673403,46.507312,0 7.567078,46.50724,0 7.5666536,46.5072812,0 7.5655643,46.5070497,0 7.5654691,46.5069622,0 7.5645959,46.5067976,0 7.5646229,46.5066189,0 7.5643876,46.5063719,0 7.5638487,46.5060826,0 7.5636134,46.506044,0 7.5635323,46.5059295,0 7.5622206,46.5058099,0 7.5617203,46.5055797,0 7.5615608,46.5056736,0 7.5614142,46.5054717,0 7.561247,46.505 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6155345,46.3998258,0 7.6153734,46.4003914,0 7.6157251,46.4016849,0 7.6155493,46.4025742,0 7.6149472,46.4029894,0 7.6144356,46.4033422,0 7.6127356,46.4038677,0 7.6115633,46.4035443,0 7.6120396,46.4045298,0 7.6123253,46.4051208,0 7.613146,46.4064546,0 7.613439,46.408031,0 7.61467,46.4095668,0 7.615139,46.4106177,0 7.6161251,46.4113811,0 7.6171756,46.4129423,0 7.6173782,46.4140618,0 7.6173696,46.4148133,0 7.6174554,46.4152985,0 7.6170005,46.415979,0 7.6168546,46.4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5666254,46.4971783,0 7.5668656,46.497203,0 7.5672608,46.4970805,0 7.5678102,46.4970381,0 7.5683727,46.4970519,0 7.5693504,46.49736,0 7.5695856,46.4975015,0 7.5697801,46.497493,0 7.5698535,46.4975297,0 7.5697316,46.4975853,0 7.5698707,46.4976373,0 7.5701022,46.4975877,0 7.5701367,46.4975929,0 7.5707109,46.4976791,0 7.5708665,46.4976169,0 7.5711207,46.497742,0 7.5713865,46.4977649,0 7.5715411,46.4976389,0 7.5719446,46.4978024,0 7.5720307,46.4977428,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5654624,46.4590852,0 7.5649892,46.4595141,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Ueschinengrat</name>
+          <description>Ueschinengrat, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.613129,46.4372863,0 7.6146783,46.4377111,0 7.6156779,46.4377915,0 7.6171439,46.4379063,0 7.6186432,46.438067,0 7.6196094,46.4384918,0 7.6204424,46.438951,0 7.6213586,46.4392265,0 7.6214919,46.4394561,0 7.6218251,46.4394906,0 7.6218584,46.4397317,0 7.6221416,46.4400531,0 7.6221583,46.4404205,0 7.6225248,46.4405812,0 7.6225914,46.4408797,0 7.6228746,46.4409371,0 7.6231078,46.4411207,0 7.6232245,46.4413044,0 7.622858,46.4414996,0 7.6230246,46.4420276,0 7.6232578,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.613129,46.4372863,0 7.614645,46.4371601,0 7.6147949,46.436896,0 7.6150948,46.4367812,0 7.6165941,46.4367812,0 7.6169939,46.4366434,0 7.6178935,46.4359661,0 7.619193,46.4364368,0 7.6179269,46.4347261,0 7.6185766,46.4346802,0 7.6184933,46.4342439,0 7.6185932,46.4339224,0 7.6188098,46.4336469,0 7.619193,46.4339683,0 7.6194095,46.4337961,0 7.619876,46.434152,0 7.6199926,46.4339798,0 7.620559,46.4341865,0 7.6205257,46.4338191,0 7.620659,46.4335206,0 7.6207756,46.433 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.613129,46.4372863,0 7.6114798,46.4367468,0 7.6103046,46.4371303,0 7.6100952,46.437372,0 7.6096793,46.4373191,0 7.609981,46.4374867,0 7.6092641,46.4375619,0 7.609614,46.4376767,0 7.6091475,46.4379407,0 7.6094474,46.4381244,0 7.6091142,46.4382048,0 7.6091308,46.4384114,0 7.6087977,46.4385492,0 7.6086644,46.4388706,0 7.6091808,46.4387214,0 7.6107634,46.4388132,0 7.6111799,46.4389166,0 7.6113632,46.4392265,0 7.6116963,46.4392839,0 7.6114131,46.4396628,0 7.6116797,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6108634,46.444025,0 7.6112632,46.4445875,0 7.6115964,46.4452533,0 7.6121961,46.4457584,0 7.6125293,46.4463323,0 7.6131124,46.4478704,0 7.6135455,46.4484099,0 7.6141619,46.4488116,0 7.6144784,46.4491675,0 7.6150781,46.4493396,0 7.6155446,46.4496036,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4787161,46.5654517,0 7.4789409,46.56562,0 7.4788957,46.5659074,0 7.4785552,46.566147,0 7.4784732,46.566416,0 7.4785488,46.5665905,0 7.4795866,46.567193,0 7.4797515,46.5672887,0 7.4800482,46.5673099,0 7.4802419,46.5674885,0 7.4801802,46.5674932,0 7.4801654,46.5675985,0 7.4803315,46.5678527,0 7.4805001,46.5679469,0 7.4808497,46.568056,0 7.4811398,46.5680585,0 7.4815241,46.5681539,0 7.4816035,46.5684949,0 7.4818155,46.5686213,0 7.4821328,46.5687589,0 7.4821799,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.569223,46.5076089,0 7.5694207,46.5076825,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4682319,46.4426424,0 7.468149,46.4425956,0 7.4681436,46.4424662,0 7.467957,46.442374,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4393848,46.4651486,0 7.4393956,46.4653186,0 7.4393366,46.4654848,0 7.4392534,46.465595,0 7.4387103,46.4661122,0 7.4372103,46.4679225,0 7.4370442,46.4681471,0 7.4360816,46.4694487,0 7.4353769,46.4704585,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Simmendamm</name>
+          <description>Simmendamm, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4440412,46.4544542,0 7.4442289,46.4544062,0 7.4523989,46.4496459,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4677582,46.4299748,0 7.4671079,46.4296049,0 7.4655576,46.4299747,0 7.4594593,46.4346501,0 7.4575621,46.4367506,0 7.4565457,46.4372249,0 7.4560037,46.438038,0 7.454784,46.438309,0 7.4537676,46.4392576,0 7.4535952,46.4392812,0 7.4532036,46.4391925,0 7.4529461,46.4390077,0 7.4525438,46.4389005,0 7.4516104,46.4388968,0 7.4507038,46.4388413,0 7.4504133,46.4388159,0 7.4502317,46.4387637,0 7.450119,46.4387267,0 7.4499634,46.4388549,0 7.449765,46.4390631,0 7.4495343,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6092641,46.4375619,0 7.6088204,46.4375169,0 7.607629,46.437716,0 7.6078456,46.4379897,0 7.6053183,46.4381887,0 7.6040186,46.4382136,0 7.6040186,46.4378901,0 7.6036864,46.4378485,0 7.6032243,46.4377906,0 7.6029354,46.437293,0 7.6032965,46.4360489,0 7.6032604,46.4355015,0 7.6030437,46.4349292,0 7.6026466,46.4345809,0 7.602105,46.4335109,0 7.6010219,46.4318935,0 7.5998305,46.430948,0 7.5993611,46.4304005,0 7.5989279,46.428783,0 7.5988557,46.428136,0 7.5986391,46.4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4742902,46.543847,0 7.4740706,46.5437738,0 7.474096,46.5437005,0 7.4741839,46.5437162,0 7.4741585,46.5436234,0 7.4739037,46.5435112,0 7.473769,46.543193,0 7.4735787,46.5432623,0 7.4733698,46.5429187,0 7.4728954,46.5428416,0 7.4729051,46.5427908,0 7.4733112,46.542578,0 7.4735425,46.5427068,0 7.4735435,46.5426288,0 7.4732848,46.5422881,0 7.4731111,46.5423086,0 7.4730184,46.5422354,0 7.4730584,46.5420968,0 7.4730262,46.5419884,0 7.4727734,46.5419123,0 7.4729002,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4715599,46.5334518,0 7.4716933,46.5334754,0 7.4717591,46.5334871,0 7.4723134,46.5334289,0 7.4724659,46.5335346,0 7.4725436,46.5334476,0 7.472668,46.5334811,0 7.4727831,46.5334182,0 7.4727617,46.5334784,0 7.4729946,46.5335748,0 7.473016,46.5334463,0 7.473285,46.5334463,0 7.473562,46.5335266,0 7.4734933,46.5336569,0 7.4737722,46.5335744,0 7.4740695,46.533687,0 7.4742803,46.533611,0 7.4743445,46.5334447,0 7.4746862,46.5332667,0 7.4746312,46.5333989,0 7.4749193,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4826136,46.5327953,0 7.4832671,46.5330604,0 7.483638,46.5331012,0 7.4836392,46.5332404,0 7.4837808,46.5331216,0 7.4844133,46.5333052,0 7.4846353,46.5331804,0 7.4847205,46.5333172,0 7.4850038,46.533196,0 7.485209,46.5334301,0 7.4854334,46.5332644,0 7.4856758,46.5334481,0 7.4858403,46.5332236,0 7.4860635,46.5335045,0 7.4864127,46.5332812,0 7.4865448,46.5334001,0 7.4867464,46.5333544,0 7.4866924,46.5331996,0 7.4861523,46.5329248,0 7.4859435,46.5324759,0 7.4860743, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4450569,46.4629393,0 7.4444602,46.463138,0 7.443613,46.463674,0 7.4426102,46.4637086,0 7.4421779,46.4636567,0 7.4419013,46.463795,0 7.4417802,46.4640717,0 7.4414823,46.4643468,0 7.4411283,46.4644539,0 7.4406961,46.4643705,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6229468,46.3732175,0 7.6226819,46.3729271,0 7.6224073,46.3727198,0 7.6219266,46.3722934,0 7.6215061,46.3719381,0 7.6212314,46.3716301,0 7.6210426,46.3715235,0 7.6209545,46.3713816,0 7.6209319,46.3712759,0 7.6208667,46.3711625,0 7.6206931,46.3710179,0 7.62051,46.3708845,0 7.620338,46.3707338,0 7.6202476,46.3705534,0 7.6201733,46.3702665,0 7.6200628,46.3699434,0 7.6199611,46.3697469,0 7.6197608,46.3695189,0 7.6195411,46.3693534,0 7.6193051,46.3691457,0 7.6190999, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Gemmiweg</name>
+          <description>Gemmiweg, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6144451,46.3984215,0 7.6144629,46.3983312,0 7.6143611,46.398261,0 7.6140943,46.3980976,0 7.6139827,46.3980162,0 7.6139853,46.3978615,0 7.6139363,46.3976182,0 7.6133218,46.3975412,0 7.6124978,46.3971683,0 7.612206,46.3968545,0 7.6120139,46.3966832,0 7.6116052,46.3966355,0 7.611382,46.3964875,0 7.6117254,46.3962803,0 7.6120344,46.3962507,0 7.6122232,46.3963218,0 7.6123777,46.3963099,0 7.6124635,46.3962034,0 7.6121545,46.3961324,0 7.6121373,46.3960021,0 7.6123262, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4393848,46.4651486,0 7.4391324,46.4649312,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4444111,46.4575848,0 7.4448112,46.457744,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Schulstrasse</name>
+          <description>Schulstrasse, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4455274,46.4564945,0 7.4451624,46.4562853,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Kronenplatz</name>
+          <description>Kronenplatz, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4425957,46.4564794,0 7.4428776,46.4565207,0 7.4429918,46.455969,0 7.4427674,46.4559269,0 7.4425496,46.4558861,0 7.4424659,46.4563108,0 7.442629,46.4563359,0 7.4425957,46.4564794,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Kronenplatz</name>
+          <description>Kronenplatz, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4433217,46.4560368,0 7.4429918,46.455969,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.445441,46.4596274,0 7.4460723,46.4588277,0 7.4461285,46.4588623,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5597509,46.4884691,0 7.5600553,46.4879829,0 7.5605373,46.4880844,0 7.5607923,46.4876673,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4991265,46.3699083,0 7.4988246,46.3699358,0 7.498686,46.370369,0 7.4982529,46.370369,0 7.4976898,46.3704989,0 7.4968928,46.3705249,0 7.4968495,46.3707934,0 7.4958706,46.3712786,0 7.4948224,46.3714951,0 7.4936871,46.3716586,0 7.4926614,46.3714013,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5802311,46.4989017,0 7.5803456,46.4986969,0 7.5802886,46.4986171,0 7.5802181,46.4985699,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5659698,46.4470345,0 7.568545,46.4382212,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Hängebrücke Hohstalden</name>
+          <description>Hängebrücke Hohstalden, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.61705,46.560728,0 7.6174601,46.5593795,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.579346,46.50235,0 7.579269,46.50252,0 7.579288,46.502698,0 7.57914,46.502895,0 7.579196,46.503146,0 7.5789389,46.5032379,0 7.5787664,46.5034171,0 7.5777661,46.503767,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bonderlenbach Walking Path</name>
+          <description>Bonderlenbach Walking Path, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5774594,46.4953694,0 7.5773913,46.4953126,0 7.577239,46.495303,0 7.5771044,46.495242,0 7.576939,46.4951141,0 7.577052,46.494997,0 7.5772593,46.4948772,0 7.5773923,46.4947336,0 7.577531,46.494696,0 7.5776088,46.4943938,0 7.57769,46.49426,0 7.5778693,46.4941249,0 7.577957,46.493648,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bonderlenbach Walking Path</name>
+          <description>Bonderlenbach Walking Path, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5788628,46.4927947,0 7.5789515,46.4926509,0 7.5791509,46.4925641,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.563427,46.498168,0 7.5642551,46.4979457,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5707894,46.5079608,0 7.5707636,46.5078013,0 7.5696221,46.5072814,0 7.5695448,46.5076713,0 7.5694207,46.5076825,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5655643,46.5070497,0 7.564925,46.5070055,0 7.564616,46.5070823,0 7.5642126,46.5070527,0 7.5633286,46.5066747,0 7.5635174,46.5065565,0 7.564041,46.506592,0 7.5636204,46.506397,0 7.5629681,46.5064088,0 7.5604532,46.5069996,0 7.5600241,46.5066688,0 7.5589855,46.5063202,0 7.5580242,46.5058299,0 7.5574663,46.5057413,0 7.5568998,46.5057531,0 7.5559986,46.5055995,0 7.5532009,46.5040121,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5676637,46.4896332,0 7.5676054,46.4894827,0 7.567476,46.489347,0 7.5669614,46.4890433,0 7.566749,46.488896,0 7.566351,46.488737,0 7.566058,46.48822,0 7.566112,46.488037,0 7.5659924,46.4879446,0 7.565645,46.487817,0 7.56517,46.487748,0 7.564918,46.4876,0 7.563815,46.486383,0 7.563781,46.48615,0 7.563258,46.485336,0 7.563173,46.485097,0 7.5635808,46.4847034,0 7.56399,46.484315,0 7.564052,46.484108,0 7.563941,46.483716,0 7.563332,46.48324,0 7.563376,46.482928,0 7. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5611621,46.4717378,0 7.5610469,46.4717054,0 7.5609132,46.4715494,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5621068,46.4705513,0 7.5622317,46.4705599,0 7.5627956,46.4700239,0 7.563029,46.469433,0 7.5632876,46.4691042,0 7.5635408,46.4688811,0 7.5635817,46.469008,0 7.5640286,46.4684621,0 7.564014,46.467933,0 7.5640877,46.4678364,0 7.5641633,46.4678644,0 7.564247,46.467826,0 7.564276,46.467683,0 7.564102,46.467479,0 7.5643394,46.4671283,0 7.564496,46.466775,0 7.5644585,46.4665703,0 7.5642804,46.4663023,0 7.5641749,46.4659848,0 7.5641356,46.4658925,0 7.5642694,46.4656671 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5627558,46.4606653,0 7.562395,46.460344,0 7.562311,46.459841,0 7.562104,46.459635,0 7.562128,46.459302,0 7.562277,46.459023,0 7.562066,46.458465,0 7.562088,46.458007,0 7.562559,46.457277,0 7.562258,46.456812,0 7.5625,46.456613,0 7.563527,46.456393,0 7.5638831,46.4564126,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5435227,46.4827013,0 7.5436247,46.4830653,0 7.5435592,46.4832093,0 7.5435643,46.4834307,0 7.5434451,46.4835786,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5436127,46.4825783,0 7.5435227,46.4827013,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5405449,46.4792038,0 7.5407348,46.4794281,0 7.5407722,46.4795516,0 7.5408429,46.4796713,0 7.5412903,46.480107,0 7.5414256,46.4803418,0 7.5418407,46.4804783,0 7.5427092,46.4811396,0 7.5431686,46.4820548,0 7.5434355,46.482271,0 7.5435897,46.4824673,0 7.5436127,46.4825783,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5392734,46.4802349,0 7.5395718,46.4800879,0 7.5395976,46.4799933,0 7.5400439,46.4798633,0 7.540207,46.4795973,0 7.5401555,46.4790949,0 7.54034,46.479224,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5287322,46.4845909,0 7.5294532,46.4849041,0 7.5297364,46.4848864,0 7.5299855,46.4847806,0 7.5301035,46.4847938,0 7.5299338,46.4850755,0 7.5309724,46.4849159,0 7.5322129,46.484865,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5564947,46.4921923,0 7.5561256,46.49234,0 7.5558595,46.4922159,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5289364,46.4906938,0 7.5297775,46.4904456,0 7.5303783,46.4905165,0 7.5325241,46.4899728,0 7.5333567,46.4895533,0 7.5343609,46.4893051,0 7.5350647,46.4892401,0 7.5353651,46.4892814,0 7.5353565,46.4891751,0 7.5358801,46.488986,0 7.5377512,46.4885191,0 7.5381632,46.4883359,0 7.539073,46.4883359,0 7.5392876,46.4882355,0 7.5399056,46.4881586,0 7.5406694,46.4881527,0 7.5425577,46.4885605,0 7.5426865,46.4886019,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5605804,46.4538416,0 7.5601817,46.4540178,0 7.5599834,46.4542594,0 7.5600283,46.4548461,0 7.560247,46.455188,0 7.560294,46.455557,0 7.5600484,46.4561044,0 7.5601535,46.4562692,0 7.560098,46.4567024,0 7.5602085,46.4572266,0 7.5611106,46.4583043,0 7.561229,46.4584659,0 7.5612212,46.4586588,0 7.5614828,46.4589198,0 7.5614623,46.4593025,0 7.5619777,46.4604155,0 7.5619267,46.4606423,0 7.5620549,46.4609595,0 7.5622266,46.4611132,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5607503,46.4539705,0 7.5605804,46.4538416,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5592176,46.4928554,0 7.5588805,46.4931539,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.58757,46.5206516,0 7.587624,46.520509,0 7.587569,46.520492,0 7.5873231,46.5205316,0 7.5872162,46.5205068,0 7.5870656,46.5205131,0 7.5870192,46.5204851,0 7.586853,46.520522,0 7.5867788,46.5204989,0 7.5867531,46.5204556,0 7.586698,46.520419,0 7.58654,46.520501,0 7.586356,46.520353,0 7.586116,46.520307,0 7.585928,46.520346,0 7.586103,46.520418,0 7.586086,46.520493,0 7.585796,46.520522,0 7.585176,46.5203633,0 7.5847859,46.5202177,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6265519,46.5699584,0 7.6262293,46.5697064,0 7.6258508,46.5695701,0 7.6252722,46.5695891,0 7.6245642,46.5694303,0 7.6239117,46.5688845,0 7.623715,46.5687,0 7.6236341,46.568349,0 7.62342,46.567928,0 7.6233636,46.567667,0 7.6230644,46.5674407,0 7.623046,46.567261,0 7.622904,46.567049,0 7.6228902,46.5669243,0 7.6225899,46.5663963,0 7.6221994,46.5658716,0 7.621795,46.565414,0 7.6214698,46.5652029,0 7.6213299,46.5649714,0 7.62114,46.564566,0 7.620754,46.564259,0 7.62 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.618372,46.559119,0 7.618307,46.559387,0 7.618404,46.55956,0 7.618755,46.559665,0 7.618969,46.559649,0 7.619314,46.559828,0 7.619385,46.559913,0 7.619791,46.560116,0 7.619984,46.560295,0 7.6200836,46.5604261,0 7.620185,46.560498,0 7.6202482,46.5605223,0 7.6202935,46.5605318,0 7.6203308,46.5605679,0 7.6203162,46.5606165,0 7.620289,46.560703,0 7.620332,46.561026,0 7.620423,46.561139,0 7.620723,46.56129,0 7.620805,46.561706,0 7.6208667,46.5617554,0 7.6211,46.561821 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4499634,46.4388549,0 7.449004,46.4378119,0 7.4487208,46.4371258,0 7.4489182,46.4368774,0 7.4492358,46.4367177,0 7.4496821,46.4368892,0 7.4495619,46.4359014,0 7.4491671,46.4354518,0 7.4478625,46.4349549,0 7.4459484,46.4347183,0 7.4453047,46.434393,0 7.4449099,46.4337068,0 7.4447811,46.4330857,0 7.4444636,46.4330029,0 7.444043,46.4326302,0 7.4439314,46.4322634,0 7.4433821,46.4320268,0 7.4429959,46.4309502,0 7.4428843,46.4308082,0 7.4424895,46.4306544,0 7.4423521, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4411642,46.3998745,0 7.4407992,46.3997408,0 7.4405978,46.3996171,0 7.440568,46.3996036,0 7.439607,46.3991398,0 7.4392012,46.3987612,0 7.4388588,46.3986409,0 7.4356488,46.3977589,0 7.4353398,46.3974985,0 7.4336403,46.3965928,0 7.4334086,46.3963205,0 7.432679,46.3958055,0 7.429941,46.3951426,0 7.4290913,46.3947104,0 7.4276236,46.3936508,0 7.4269198,46.3933371,0 7.4264391,46.3932246,0 7.4253662,46.3927096,0 7.4246882,46.392082,0 7.4240187,46.3917564,0 7.4232806,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4212979,46.3905547,0 7.4212979,46.3903416,0 7.4214094,46.3901462,0 7.4214094,46.3899982,0 7.4215296,46.3898028,0 7.4214867,46.3895838,0 7.421358,46.3895009,0 7.4211262,46.3895542,0 7.421049,46.3893411,0 7.4209288,46.3892049,0 7.4200018,46.3892641,0 7.4197358,46.3894654,0 7.4195813,46.3894772,0 7.4193152,46.3894654,0 7.4192208,46.3893055,0 7.4184483,46.3887786,0 7.4182337,46.3885951,0 7.4179419,46.3884412,0 7.417693,46.3884353,0 7.4176415,46.3887727,0 7.4177187, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.3842169,46.3434602,0 7.3841439,46.3438004,0 7.3847101,46.3439064,0 7.3844032,46.3440306,0 7.3846307,46.3442059,0 7.384472,46.3446077,0 7.384091,46.3450132,0 7.3840434,46.3454953,0 7.3842868,46.3461382,0 7.3847683,46.34635,0 7.3851228,46.346803,0 7.3853715,46.3470586,0 7.3858901,46.3476723,0 7.3863028,46.3482859,0 7.387033,46.3486256,0 7.3874669,46.3491406,0 7.3872658,46.3495497,0 7.3875304,46.3498966,0 7.3881654,46.3499259,0 7.3878744,46.3501523,0 7.3882289,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4681028,46.3828006,0 7.4685635,46.3827568,0 7.4690493,46.382662,0 7.469454,46.382552,0 7.4695566,46.3824441,0 7.4698788,46.3824318,0 7.4702351,46.3823567,0 7.4705841,46.3822218,0 7.4707965,46.3819506,0 7.4709561,46.3816876,0 7.4712107,46.3814354,0 7.4719174,46.3811665,0 7.4720289,46.3809119,0 7.4715655,46.3805211,0 7.4715578,46.3803844,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4773344,46.3802503,0 7.4784834,46.3804797,0 7.479522,46.3806514,0 7.481436,46.3807817,0 7.4856331,46.3808231,0 7.4888174,46.3808527,0 7.4920618,46.3819599,0 7.4971688,46.3817823,0 7.5060608,46.3832329,0 7.5186865,46.3873596,0 7.5244114,46.3897988,0 7.5249779,46.3906927,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5249779,46.3906927,0 7.5245058,46.3908348,0 7.5242569,46.3912137,0 7.5239479,46.3913499,0 7.5235617,46.3916636,0 7.5234329,46.3920425,0 7.5237677,46.3923503,0 7.5237248,46.3924806,0 7.5233729,46.3925398,0 7.5233128,46.3926522,0 7.5233214,46.3927825,0 7.522815,46.3936231,0 7.5228407,46.3938717,0 7.5227377,46.3940375,0 7.5228922,46.3945347,0 7.5232012,46.3946354,0 7.5235617,46.3946354,0 7.5238535,46.3947893,0 7.5238535,46.3952806,0 7.5239479,46.3954404,0 7.524205 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5284329,46.4005085,0 7.5284283,46.4009631,0 7.5287888,46.4013656,0 7.529072,46.401555,0 7.5293038,46.401774,0 7.5294411,46.4019811,0 7.5297501,46.4022001,0 7.5299475,46.4027328,0 7.5313036,46.4036384,0 7.5324194,46.4058933,0 7.5325138,46.4064674,0 7.5330717,46.4068048,0 7.5332262,46.4073492,0 7.5332691,46.4084382,0 7.5336468,46.4092075,0 7.533561,46.4094147,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.533561,46.4094147,0 7.5338185,46.4089767,0 7.5343077,46.408521,0 7.5394146,46.405408,0 7.5409853,46.4053429,0 7.5429079,46.4057513,0 7.5435517,46.4062484,0 7.5440838,46.4066509,0 7.5445301,46.4068166,0 7.5453541,46.4068225,0 7.5462296,46.4065858,0 7.5478604,46.4051417,0 7.5478432,46.4048043,0 7.548032,46.4044966,0 7.5486243,46.404177,0 7.5488045,46.4039166,0 7.5510447,46.4031175,0 7.5512764,46.402863,0 7.5519116,46.4027447,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5519116,46.4027447,0 7.5535424,46.4026973,0 7.5542977,46.4025789,0 7.5558941,46.4026204,0 7.5565464,46.4025197,0 7.5572932,46.4021232,0 7.5587351,46.401774,0 7.5594904,46.4015076,0 7.5599539,46.4011288,0 7.560941,46.4004718,0 7.5616619,46.399945,0 7.5617821,46.3993827,0 7.5619967,46.3991992,0 7.5620653,46.3988618,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5620653,46.3988618,0 7.5626404,46.3984415,0 7.5632241,46.3979147,0 7.563576,46.3978911,0 7.5648291,46.3976128,0 7.5652325,46.3976661,0 7.5661595,46.3980686,0 7.5670607,46.3982225,0 7.5689404,46.3990808,0 7.5700218,46.3994182,0 7.5704167,46.3994774,0 7.5709231,46.3998325,0 7.5716698,46.4000397,0 7.5719616,46.4003001,0 7.5723822,46.4003238,0 7.5727598,46.4002528,0 7.5731547,46.4002824,0 7.5734637,46.4000693,0 7.5739014,46.4000279,0 7.5741675,46.4001048,0 7.574279 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Lämmernweg nord</name>
+          <description>Lämmernweg nord, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5746567,46.4000811,0 7.5745487,46.4005859,0 7.5747632,46.4010476,0 7.574892,46.4016217,0 7.575304,46.4014797,0 7.5758619,46.4012488,0 7.5763339,46.4004024,0 7.5762395,46.4000887,0 7.5764198,46.4000828,0 7.5762653,46.3998105,0 7.5760335,46.3995738,0 7.5760335,46.3991476,0 7.576703,46.3991535,0 7.5767803,46.3989819,0 7.577218,46.3991239,0 7.5771751,46.3988398,0 7.5767202,46.3983899,0 7.5771236,46.3984255,0 7.5772008,46.3983544,0 7.576909,46.3981887,0 7.5773607,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6223005,46.4319807,0 7.6218319,46.4319245,0 7.6216002,46.4320073,0 7.6212483,46.4319067,0 7.6209393,46.4319067,0 7.6207762,46.4316878,0 7.6202698,46.4313152,0 7.6197205,46.430623,0 7.6196261,46.4300788,0 7.6191626,46.4296173,0 7.6190338,46.4291086,0 7.6188193,46.4290435,0 7.6188107,46.4287595,0 7.6186304,46.4285288,0 7.6188193,46.428097,0 7.6185618,46.4276,0 7.6169911,46.4264404,0 7.6170512,46.4261683,0 7.6174202,46.4257778,0 7.6176691,46.4257009,0 7.617446,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5723588,46.4404035,0 7.572171,46.4403665,0 7.5717311,46.4401927,0 7.5716185,46.4400929,0 7.5714683,46.440019,0 7.5712591,46.4400116,0 7.5709855,46.4400375,0 7.5707798,46.4401998,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5603342,46.4434764,0 7.5606322,46.4434199,0 7.5607824,46.4433164,0 7.5610291,46.4433016,0 7.5612115,46.443309,0 7.5614261,46.4431907,0 7.5616943,46.4431759,0 7.5619779,46.4431581,0 7.5621449,46.443102,0 7.5622951,46.443028,0 7.5623917,46.4429171,0 7.5624561,46.4428062,0 7.562617,46.4427323,0 7.5628316,46.4427175,0 7.5631105,46.4426658,0 7.5633684,46.442614,0 7.5636792,46.4424809,0 7.5637328,46.4423479,0 7.5637757,46.4422074,0 7.563883,46.4421335,0 7.5640586,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5578623,46.4428613,0 7.5574675,46.4428376,0 7.5562401,46.4421989,0 7.5553904,46.4415956,0 7.5545922,46.4411993,0 7.5531674,46.4401583,0 7.5520945,46.4397857,0 7.5515452,46.4394486,0 7.5512276,46.4389458,0 7.5500603,46.4382479,0 7.5478888,46.4365917,0 7.5459061,46.435521,0 7.5430308,46.4344326,0 7.5427647,46.434196,0 7.5416146,46.4337878,0 7.5403786,46.4336045,0 7.5392456,46.4328177,0 7.5388594,46.4323326,0 7.5385161,46.4322143,0 7.538353,46.4320369,0 7.5376578, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5099774,46.4268191,0 7.5097027,46.4267599,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.510046,46.4269729,0 7.5099774,46.4268191,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5097027,46.4267599,0 7.5091706,46.4267008,0 7.5088101,46.4268782,0 7.5086899,46.4270261,0 7.5082865,46.4270261,0 7.507514,46.4268901,0 7.507205,46.4267422,0 7.5070591,46.4265351,0 7.5070935,46.4263635,0 7.5055828,46.4258015,0 7.5046387,46.4252572,0 7.504201,46.4251566,0 7.5038748,46.4249614,0 7.5029049,46.4247543,0 7.50245,46.4245827,0 7.5018921,46.424636,0 7.5014286,46.4245354,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Krummenbach</name>
+          <description>Krummenbach, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4421122,46.4525537,0 7.4426894,46.4528647,0 7.4433701,46.4534102,0 7.4441109,46.4543138,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Krummenbach</name>
+          <description>Krummenbach, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4419716,46.4526353,0 7.4421122,46.4525537,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Krummenbach</name>
+          <description>Krummenbach, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4408543,46.4522683,0 7.4415573,46.4524314,0 7.4419716,46.4526353,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Krummenbach</name>
+          <description>Krummenbach, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4409061,46.4521561,0 7.4408543,46.4522683,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Chäligang - Klettersteig</name>
+          <description>Chäligang - Klettersteig, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.560727,46.450533,0 7.5606144,46.4505986,0 7.5603311,46.4507338,0 7.5603426,46.4509315,0 7.5605864,46.4511387,0 7.5605865,46.4512611,0 7.560682,46.4513342,0 7.5607896,46.4513261,0 7.5611184,46.4513877,0 7.561297,46.4513409,0 7.5614312,46.4513311,0 7.5614866,46.4514444,0 7.5615925,46.4516057,0 7.5617415,46.4517005,0 7.5619471,46.4517731,0 7.561897,46.4519024,0 7.561663,46.4519071,0 7.5615552,46.4517685,0 7.561466,46.4516993,0 7.5612982,46.4516854,0 7.5611181,46.4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Lischmattenstrasse</name>
+          <description>Lischmattenstrasse, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4394643,46.4538143,0 7.4390415,46.45383,0 7.4382168,46.4536333,0 7.437853,46.4534971,0 7.4376096,46.4533399,0 7.4375083,46.4531784,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Kronenplatz</name>
+          <description>Kronenplatz, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4433518,46.4557718,0 7.442802,46.4557537,0 7.4423281,46.4556781,0 7.4422089,46.4564137,0 7.4423398,46.456437,0 7.4423078,46.4566492,0 7.4425442,46.4567004,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Kronenplatz</name>
+          <description>Kronenplatz, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4427674,46.4559269,0 7.442802,46.4557537,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4382168,46.4536333,0 7.4375687,46.4542067,0 7.437657,46.4544786,0 7.4381129,46.4544954,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.60993,46.555202,0 7.6100086,46.5551481,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6100086,46.5551481,0 7.610275,46.555066,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6095758,46.5550283,0 7.609867,46.5551309,0 7.60993,46.555202,0 7.6099053,46.5554036,0 7.6099572,46.5557181,0 7.6101794,46.5559656,0 7.6108008,46.5563903,0 7.611201,46.5569152,0 7.6114692,46.5571666,0 7.6117685,46.5573938,0 7.612146,46.5574221,0 7.612332,46.5574959,0 7.6126626,46.5575627,0 7.6128563,46.5576717,0 7.613043,46.557777,0 7.613162,46.557793,0 7.613359,46.557997,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6093995,46.5548684,0 7.6095758,46.5550283,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5655203,46.4480124,0 7.5666754,46.448165,0 7.5673192,46.4478693,0 7.5689671,46.4480468,0 7.5695336,46.4481946,0 7.5695508,46.4500988,0 7.5691388,46.4506665,0 7.5698941,46.4505482,0 7.571027,46.4506665,0 7.5716794,46.4504891,0 7.571954,46.4505305,0 7.5729153,46.4498386,0 7.5735419,46.4491881,0 7.5738251,46.4491408,0 7.5767777,46.4471419,0 7.5782368,46.4464796,0 7.5799277,46.4461365,0 7.5812409,46.4461957,0 7.5844767,46.445971,0 7.5848286,46.4460833,0 7.5858243,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5939181,46.4442322,0 7.5959351,46.4431026,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5959351,46.4431026,0 7.5961202,46.4418992,0 7.5961202,46.4410298,0 7.595837,46.440184,0 7.5952104,46.4388413,0 7.5955194,46.4386284,0 7.5955366,46.4382735,0 7.5956911,46.4379541,0 7.5960086,46.4378476,0 7.5962232,46.4374336,0 7.5963949,46.4374336,0 7.5964635,46.437197,0 7.596867,46.4373153,0 7.598163,46.4381493,0 7.5981802,46.4380251,0 7.5983862,46.4380251,0 7.5989269,46.4382794,0 7.5993475,46.4388118,0 7.5999225,46.4390306,0 7.6001886,46.4393323,0 7.6002916,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5612557,46.4542097,0 7.56213,46.454218,0 7.562429,46.454144,0 7.563113,46.454125,0 7.563817,46.454263,0 7.563935,46.454456,0 7.564016,46.454315,0 7.564211,46.454463,0 7.564278,46.454308,0 7.564431,46.454381,0 7.564714,46.454334,0 7.564919,46.454464,0 7.564952,46.454256,0 7.565156,46.454369,0 7.565617,46.454428,0 7.5655305,46.4542175,0 7.566296,46.4542338,0 7.5666072,46.454436,0 7.566648,46.454824,0 7.56674,46.454724,0 7.5668857,46.4548685,0 7.56691,46.454801,0  [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5603797,46.4499063,0 7.560335,46.449238,0 7.560977,46.449165,0 7.561242,46.449273,0 7.560913,46.448711,0 7.560942,46.448252,0 7.560985,46.448126,0 7.561464,46.447771,0 7.5615495,46.4474679,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.610275,46.555066,0 7.6105103,46.555047,0 7.6107934,46.5551847,0 7.6109108,46.5551734,0 7.6110474,46.5552324,0 7.6114422,46.5551757,0 7.6119279,46.5551549,0 7.6122496,46.5548187,0 7.6123306,46.5545839,0 7.612552,46.554217,0 7.612904,46.554303,0 7.61296,46.554373,0 7.6130079,46.5544692,0 7.6130907,46.5545095,0 7.6132761,46.5545054,0 7.6134222,46.5545429,0 7.6135505,46.5546015,0 7.613591,46.554708,0 7.6135566,46.5548319,0 7.6135434,46.5549507,0 7.613595,46.5551225 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.617521,46.559201,0 7.6174601,46.5593795,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4246182,46.4549791,0 7.411038,46.4488524,0 7.4096398,46.4473342,0 7.4094562,46.4479668,0 7.4081709,46.4475873,0 7.4071281,46.4487423,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5359591,46.4821973,0 7.5356587,46.4821315,0 7.5352401,46.4817035,0 7.5341426,46.4802405,0 7.5343946,46.47985,0 7.5341784,46.4798098,0 7.5334093,46.4782263,0 7.5320814,46.4778883,0 7.5322482,46.4776474,0 7.5324047,46.4775918,0 7.5324047,46.4774868,0 7.5322359,46.477493,0 7.5319641,46.4772829,0 7.5311872,46.4771753,0 7.5311809,46.4769707,0 7.5303944,46.4766186,0 7.5299839,46.4762294,0 7.5298295,46.47583,0 7.5293827,46.4753729,0 7.5295227,46.4751876,0 7.5292591,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.469009,46.453963,0 7.468853,46.454502,0 7.468722,46.454633,0 7.468855,46.454838,0 7.468892,46.455254,0 7.468526,46.45547,0 7.468214,46.455827,0 7.467811,46.456011,0 7.467729,46.456012,0 7.467757,46.45589,0 7.4676573,46.4558604,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4563512,46.4596817,0 7.455519,46.460138,0 7.454885,46.460326,0 7.454269,46.460142,0 7.453772,46.460157,0 7.453588,46.460227,0 7.453646,46.46034,0 7.453343,46.460297,0 7.45308,46.460158,0 7.452336,46.460143,0 7.452167,46.460202,0 7.4516199,46.4601237,0 7.451444,46.460176,0 7.451314,46.459955,0 7.451083,46.460086,0 7.450785,46.459827,0 7.450364,46.460159,0 7.450148,46.460235,0 7.449941,46.460206,0 7.449216,46.460572,0 7.449004,46.460411,0 7.44851,46.460273,0 7.44 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.462649,46.457567,0 7.462344,46.457799,0 7.461469,46.458186,0 7.460724,46.458266,0 7.459338,46.45872,0 7.458959,46.458929,0 7.4592,46.459053,0 7.458746,46.459142,0 7.458955,46.45922,0 7.458388,46.459277,0 7.458083,46.459431,0 7.457836,46.45934,0 7.457735,46.459414,0 7.457338,46.459278,0 7.45734,46.459367,0 7.457047,46.459355,0 7.4569312,46.4594356,0 7.4568436,46.4593926,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5805282,46.4980101,0 7.580457,46.497915,0 7.580459,46.4978244,0 7.580511,46.497795,0 7.580503,46.497773,0 7.580458,46.497732,0 7.5804891,46.4976849,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5919258,46.5139835,0 7.59165,46.514158,0 7.591592,46.514182,0 7.591323,46.514218,0 7.5911034,46.5143796,0 7.590773,46.514376,0 7.590312,46.514486,0 7.590308,46.514779,0 7.59027,46.515012,0 7.590204,46.515141,0 7.590222,46.51527,0 7.590202,46.515354,0 7.5903489,46.5153277,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5892426,46.5172029,0 7.589245,46.51707,0 7.5896037,46.5169541,0 7.590129,46.516719,0 7.590166,46.516508,0 7.590272,46.516442,0 7.590262,46.516414,0 7.590288,46.516298,0 7.590159,46.516075,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6058722,46.5395795,0 7.605907,46.539608,0 7.606061,46.539669,0 7.606172,46.539786,0 7.606187,46.539933,0 7.606162,46.540082,0 7.606252,46.540169,0 7.606368,46.540183,0 7.606546,46.540228,0 7.606795,46.540172,0 7.6069728,46.5401954,0 7.6069839,46.540212,0 7.606977,46.54025,0 7.606945,46.540322,0 7.606899,46.540361,0 7.606783,46.540417,0 7.606721,46.540496,0 7.606687,46.54052,0 7.606704,46.540646,0 7.606769,46.540707,0 7.606912,46.540757,0 7.60689,46.540889,0 7.6 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5816826,46.510603,0 7.5816199,46.5104057,0 7.5815976,46.510255,0 7.5814942,46.5099865,0 7.5814306,46.5099385,0 7.5813666,46.5097595,0 7.5812168,46.5096608,0 7.581074,46.509605,0 7.580956,46.509462,0 7.58117,46.509261,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5817563,46.5106037,0 7.5816826,46.510603,0 7.581587,46.510645,0 7.5815173,46.5107508,0 7.581501,46.510818,0 7.581546,46.5109334,0 7.5817095,46.5110604,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5820585,46.510608,0 7.5817563,46.5106037,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5751846,46.4916084,0 7.575377,46.491636,0 7.575561,46.491752,0 7.5756106,46.4917412,0 7.575728,46.491716,0 7.575891,46.491602,0 7.576027,46.491461,0 7.576068,46.491431,0 7.5763871,46.4912304,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5785473,46.524736,0 7.5785046,46.5247628,0 7.5783963,46.5246919,0 7.578219,46.52477,0 7.578012,46.524791,0 7.577872,46.524792,0 7.577779,46.524725,0 7.5777363,46.5246185,0 7.577476,46.524428,0 7.577197,46.524302,0 7.577086,46.524206,0 7.5770596,46.5241235,0 7.5771338,46.5239975,0 7.5771004,46.523902,0 7.5770609,46.5237564,0 7.576847,46.5235427,0 7.576721,46.523295,0 7.576719,46.523211,0 7.5764009,46.5230245,0 7.5762273,46.5227649,0 7.576096,46.522687,0 7.575972 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6212158,46.4102508,0 7.6212492,46.4100544,0 7.6211982,46.4097513,0 7.6210007,46.4091406,0 7.6207267,46.4087452,0 7.6204904,46.4083771,0 7.620217,46.4075677,0 7.620217,46.4073832,0 7.6198856,46.4070185,0 7.6198283,46.4067857,0 7.619621,46.4066037,0 7.619344,46.4063771,0 7.6189554,46.4061266,0 7.618675,46.4058191,0 7.6178658,46.4053226,0 7.6174956,46.405028,0 7.6149472,46.4029894,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.605321,46.550618,0 7.6061811,46.5507498,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6047518,46.55048,0 7.605321,46.550618,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.605639,46.551512,0 7.605518,46.551205,0 7.605264,46.550932,0 7.605187,46.550759,0 7.6052305,46.5506929,0 7.605321,46.550618,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6172232,46.5604252,0 7.617237,46.560489,0 7.6173791,46.5605246,0 7.6174549,46.560685,0 7.617571,46.560749,0 7.617485,46.560801,0 7.617071,46.560756,0 7.6169366,46.5607994,0 7.6169276,46.5608025,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.613359,46.557997,0 7.613697,46.558202,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.613697,46.558202,0 7.6138249,46.5582483,0 7.6139093,46.5582304,0 7.6140763,46.5582933,0 7.614314,46.558345,0 7.614538,46.558564,0 7.614538,46.558685,0 7.614618,46.558742,0 7.614736,46.559067,0 7.615214,46.559535,0 7.616327,46.560016,0 7.6164317,46.5601639,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6070675,46.5503877,0 7.6072145,46.5505602,0 7.6073825,46.5506985,0 7.6073485,46.5507163,0 7.6068988,46.5507717,0 7.6068687,46.550799,0 7.606966,46.5508537,0 7.6070453,46.5509456,0 7.6069006,46.5509478,0 7.6065934,46.5508793,0 7.6064744,46.5508128,0 7.6061811,46.5507498,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5453714,46.5078755,0 7.545088,46.507775,0 7.5449722,46.5077871,0 7.5448429,46.507819,0 7.5445859,46.5078239,0 7.5442708,46.507799,0 7.544171,46.5077577,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5596756,46.5135221,0 7.5598557,46.5136074,0 7.5600289,46.5136176,0 7.5602821,46.5135897,0 7.5605638,46.5135813,0 7.5607673,46.5135679,0 7.5610239,46.5134916,0 7.5612473,46.5134206,0 7.5614853,46.5133285,0 7.5616609,46.5132468,0 7.5621499,46.5130522,0 7.562457,46.512863,0 7.562552,46.512868,0 7.562705,46.51281,0 7.562819,46.512666,0 7.562913,46.512718,0 7.563163,46.512741,0 7.56333,46.51267,0 7.563476,46.512661,0 7.563577,46.512724,0 7.563753,46.512733,0 7.56408 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6260233,46.4823623,0 7.6258492,46.4823721,0 7.6255624,46.482439,0 7.6255071,46.4823834,0 7.6254122,46.4823258,0 7.6253676,46.4823044,0 7.625279,46.4822506,0 7.6251996,46.4822146,0 7.6250474,46.4821868,0 7.6250248,46.4823099,0 7.6247359,46.4822272,0 7.6247046,46.4824268,0 7.6245089,46.4823389,0 7.6243517,46.4822979,0 7.6242366,46.4822368,0 7.6242534,46.4824095,0 7.6242673,46.4825683,0 7.624107,46.4827243,0 7.623839,46.4830581,0 7.6236473,46.4832026,0 7.6233765,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6155646,46.4852336,0 7.615535,46.485289,0 7.615492,46.485321,0 7.615502,46.485336,0 7.615555,46.485348,0 7.61559,46.485422,0 7.615556,46.485471,0 7.615536,46.48548,0 7.615488,46.485564,0 7.615401,46.485584,0 7.615524,46.485579,0 7.61562,46.485595,0 7.615819,46.485559,0 7.615941,46.485561,0 7.616144,46.485543,0 7.616285,46.485512,0 7.616448,46.485431,0 7.616671,46.485489,0 7.616797,46.485459,0 7.6168,46.485484,0 7.616873,46.485518,0 7.616883,46.485555,0 7.616845 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6210982,46.4905384,0 7.620964,46.4905577,0 7.6209202,46.490512,0 7.6207783,46.4905281,0 7.6206561,46.4906049,0 7.6205331,46.4906336,0 7.6203543,46.4906494,0 7.6202419,46.4906959,0 7.6200854,46.490772,0 7.6200422,46.4908145,0 7.6199348,46.490882,0 7.6198603,46.4909638,0 7.6198001,46.4910073,0 7.6198169,46.4910749,0 7.61978,46.491125,0 7.619825,46.491157,0 7.6199204,46.491208,0 7.6199692,46.4912974,0 7.6199436,46.4913231,0 7.6200376,46.4914214,0 7.6200257,46.4914 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.590707,46.478723,0 7.590711,46.478539,0 7.590772,46.478439,0 7.590744,46.478278,0 7.590758,46.478056,0 7.59075,46.477896,0 7.5907974,46.4776477,0 7.59091,46.477543,0 7.590919,46.47749,0 7.590799,46.477172,0 7.590746,46.477112,0 7.590719,46.4770114,0 7.590691,46.4769634,0 7.590748,46.476776,0 7.590759,46.476723,0 7.5907497,46.476653,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5907497,46.476653,0 7.59074,46.47658,0 7.590712,46.476443,0 7.590647,46.476366,0 7.590672,46.475923,0 7.590589,46.475456,0 7.5904172,46.4757219,0 7.590124,46.47586,0 7.59005,46.475799,0 7.58971,46.475946,0 7.589323,46.475984,0 7.589385,46.476094,0 7.589159,46.476482,0 7.5888497,46.4765801,0 7.588444,46.476598,0 7.588278,46.476609,0 7.587762,46.476493,0 7.587559,46.476305,0 7.587223,46.476143,0 7.586993,46.476253,0 7.586734,46.476292,0 7.586469,46.47637,0 7.5860 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5897212,46.4818723,0 7.589943,46.481844,0 7.5900556,46.4818181,0 7.590092,46.481759,0 7.589998,46.481475,0 7.58998,46.481335,0 7.590041,46.481122,0 7.5900774,46.481021,0 7.590016,46.480837,0 7.5900969,46.4806249,0 7.590166,46.480569,0 7.590156,46.4804,0 7.590309,46.480142,0 7.590366,46.480088,0 7.590412,46.479927,0 7.590453,46.479764,0 7.590448,46.479591,0 7.590517,46.479423,0 7.590573,46.479359,0 7.590686,46.479229,0 7.5907469,46.4790091,0 7.590726,46.478903,0 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6011402,46.490361,0 7.6011243,46.4902803,0 7.6011843,46.4901643,0 7.6014333,46.4899023,0 7.6016833,46.4894923,0 7.6017903,46.4891893,0 7.6017893,46.4889183,0 7.6015133,46.4888943,0 7.6012443,46.4886913,0 7.6012193,46.4886393,0 7.6012223,46.4882563,0 7.6012023,46.4882303,0 7.6009833,46.4882253,0 7.6009323,46.4882113,0 7.6006563,46.4882393,0 7.6003743,46.4883773,0 7.6001003,46.4884293,0 7.5999913,46.4883763,0 7.5997933,46.4883763,0 7.5996383,46.4884183,0 7.599531 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5979589,46.4885316,0 7.5978355,46.488491,0 7.5977604,46.4884577,0 7.5976853,46.488454,0 7.5975887,46.488491,0 7.5974899,46.4885634,0 7.5972776,46.4886018,0 7.5970898,46.4887237,0 7.5969075,46.488768,0 7.5967733,46.4888603,0 7.5966285,46.4888714,0 7.5965319,46.4887827,0 7.5964461,46.4887163,0 7.5963764,46.4887089,0 7.5963281,46.4886055,0 7.596404,46.4883944,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5922214,46.488268,0 7.5923677,46.4881323,0 7.5925617,46.4879943,0 7.5926257,46.4879633,0 7.5927327,46.4878773,0 7.5928177,46.4877743,0 7.5928317,46.4877043,0 7.5927997,46.4874863,0 7.5927757,46.4874453,0 7.5924828,46.4871774,0 7.5922205,46.4870198,0 7.592117,46.4869065,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4419793,46.4126531,0 7.4419058,46.4125374,0 7.4412531,46.4122448,0 7.4409621,46.4121367,0 7.4400956,46.4120547,0 7.4397671,46.4120185,0 7.4393406,46.4117801,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4396951,46.4114482,0 7.4412106,46.4111941,0 7.4415882,46.4111763,0 7.4425324,46.4115077,0 7.4430285,46.4114178,0 7.4434583,46.4112146,0 7.4437284,46.4109221,0 7.4441582,46.410684,0 7.4448156,46.4103702,0 7.4448583,46.4102856,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4448583,46.4102856,0 7.4453851,46.4101867,0 7.4457995,46.4099307,0 7.4460429,46.4095548,0 7.4466952,46.4082055,0 7.4468089,46.4080037,0 7.44678,46.4078413,0 7.4465215,46.407632,0 7.4462232,46.4075539,0 7.4462137,46.4073898,0 7.4464603,46.4072978,0 7.4464994,46.4071501,0 7.4465756,46.4070943,0 7.4464327,46.4070516,0 7.4463232,46.4069827,0 7.4462423,46.4067824,0 7.4464797,46.406528,0 7.4467295,46.4064004,0 7.447149,46.4061475,0 7.4472186,46.4059651,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4411642,46.3998745,0 7.4411731,46.3997126,0 7.4414034,46.3994827,0 7.4414034,46.3994032,0 7.4415671,46.3992862,0 7.4417733,46.3992444,0 7.44184,46.3991273,0 7.4417611,46.398935,0 7.4418824,46.3986925,0 7.4421067,46.3983329,0 7.4421916,46.398036,0 7.4423553,46.3976848,0 7.4425069,46.3974548,0 7.4427736,46.3970869,0 7.4427069,46.3969447,0 7.4427615,46.3967106,0 7.4428949,46.3964346,0 7.4429858,46.3962548,0 7.4429797,46.3961378,0 7.4427979,46.396121,0 7.4422643,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4491612,46.3892601,0 7.4494042,46.3890803,0 7.4496031,46.3889065,0 7.4499788,46.3887297,0 7.4500893,46.3886626,0 7.4503014,46.3885803,0 7.4503766,46.3885895,0 7.450434,46.3886596,0 7.4505622,46.3886017,0 7.4507965,46.3884553,0 7.4509114,46.3884248,0 7.4508804,46.3886321,0 7.4508274,46.388809,0 7.4508274,46.3889614,0 7.4508672,46.3890224,0 7.4510793,46.3890772,0 7.4512075,46.3891626,0 7.4513887,46.3891687,0 7.4518086,46.3892357,0 7.4520296,46.3891748,0 7.4522726 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4592072,46.3852908,0 7.4593044,46.3851567,0 7.4594017,46.3851536,0 7.4594459,46.3851018,0 7.459437,46.3850256,0 7.4595475,46.3849311,0 7.4596492,46.3849158,0 7.4597508,46.384928,0 7.4598657,46.3848975,0 7.4601398,46.3846567,0 7.4602591,46.3846079,0 7.4603696,46.3846292,0 7.4606524,46.3845164,0 7.4608734,46.3842359,0 7.4608867,46.384117,0 7.4609,46.3840225,0 7.4610016,46.3839128,0 7.4610237,46.3837725,0 7.4612049,46.3834554,0 7.4612447,46.3833182,0 7.4613331,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4611073,46.3822106,0 7.4612404,46.3822517,0 7.4614568,46.3823456,0 7.4616159,46.382348,0 7.4615585,46.3822694,0 7.4616911,46.3822938,0 7.4617211,46.3821629,0 7.4618236,46.3820919,0 7.4619784,46.3822176,0 7.4622961,46.3823287,0 7.4629055,46.38253,0 7.463308,46.3826662,0 7.4634069,46.3828895,0 7.4636321,46.382777,0 7.4639005,46.38287,0 7.4639274,46.3829525,0 7.4640506,46.382901,0 7.4640671,46.3829953,0 7.4643743,46.3829246,0 7.4643871,46.3830368,0 7.4645354,46.38 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4715578,46.3803844,0 7.4716905,46.3801436,0 7.4721055,46.3799782,0 7.4722339,46.3800409,0 7.472586,46.3799856,0 7.472571,46.3798732,0 7.4733791,46.3800682,0 7.4740397,46.3799886,0 7.4740981,46.3801672,0 7.4743717,46.3802091,0 7.4747225,46.3801399,0 7.4753201,46.3804002,0 7.4756569,46.3803819,0 7.4760285,46.3805054,0 7.4773344,46.3802503,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4773344,46.3802503,0 7.4775896,46.3800954,0 7.478055,46.3799769,0 7.4786994,46.3798188,0 7.4797233,46.3793595,0 7.4798307,46.3792508,0 7.4798737,46.3786976,0 7.4799238,46.3784851,0 7.4801171,46.3782629,0 7.480246,46.3778331,0 7.4804321,46.3776553,0 7.4803963,46.3775269,0 7.4810479,46.3771514,0 7.4812842,46.3769291,0 7.4815634,46.3765389,0 7.4815634,46.3763364,0 7.4819429,46.3760548,0 7.4822293,46.3759511,0 7.4822794,46.3758473,0 7.4826875,46.3756053,0 7.4829596 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.574892,46.4016217,0 7.5752629,46.4028429,0 7.5758871,46.4029302,0 7.5773776,46.4030385,0 7.5779149,46.4031005,0 7.5783777,46.4034398,0 7.58076,46.4045863,0 7.582163,46.4048456,0 7.582205,46.4049976,0 7.5843654,46.405166,0 7.5848908,46.406216,0 7.5892869,46.4093376,0 7.5906357,46.409781,0 7.5916796,46.4096886,0 7.5924095,46.4102984,0 7.5930562,46.4102984,0 7.5939153,46.4108249,0 7.5942811,46.4113213,0 7.5946519,46.4119154,0 7.5946557,46.4121992,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5946557,46.4121992,0 7.5947645,46.4125775,0 7.5944483,46.4128069,0 7.5945428,46.4130565,0 7.5944653,46.413244,0 7.5944498,46.4133897,0 7.5946916,46.4136176,0 7.5947536,46.4140872,0 7.5948451,46.414329,0 7.5947955,46.4146018,0 7.5947645,46.4149149,0 7.5946374,46.4151908,0 7.5945723,46.4153086,0 7.5944064,46.4153582,0 7.5941894,46.4154868,0 7.5940592,46.4157705,0 7.5939368,46.4158464,0 7.5936888,46.4159673,0 7.5935586,46.4162881,0 7.5934367,46.4165774,0 7.5933156 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5296583,46.4300374,0 7.5307656,46.4296824,0 7.531478,46.4296114,0 7.5326109,46.4289607,0 7.5328856,46.4290672,0 7.5332632,46.4290672,0 7.5335465,46.4288779,0 7.5331946,46.4285643,0 7.5331087,46.4283632,0 7.5331946,46.4279491,0 7.5328942,46.4278071,0 7.5325423,46.4278366,0 7.5318213,46.4276592,0 7.531435,46.4276296,0 7.531272,46.4277657,0 7.5310316,46.427742,0 7.5309029,46.4274699,0 7.5305682,46.4272214,0 7.5304909,46.4270025,0 7.5302506,46.4269019,0 7.5299588,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4901878,46.4164474,0 7.4912908,46.4158099,0 7.4918247,46.4154004,0 7.4920565,46.4151024,0 7.4923119,46.4150314,0 7.4928417,46.4151449,0 7.4930356,46.4152159,0 7.4930734,46.4151024,0 7.4929174,46.4148895,0 7.4929174,46.4147902,0 7.4934093,46.4148611,0 7.4939864,46.4152443,0 7.4942844,46.4152679,0 7.4943175,46.4150693,0 7.4943175,46.415022,0 7.4945634,46.4150503,0 7.4947574,46.4150929,0 7.4947621,46.4149557,0 7.4947526,46.4148611,0 7.495202,46.4148375,0 7.4958737 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4675434,46.3874105,0 7.4669887,46.3873872,0 7.465311,46.386759,0 7.464535,46.3867072,0 7.4624656,46.3860347,0 7.4615639,46.3857169,0 7.4609857,46.3855182,0 7.4604773,46.3854862,0 7.4600662,46.3855409,0 7.4598666,46.3854598,0 7.4597279,46.3853215,0 7.4592072,46.3852908,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4715578,46.3803844,0 7.4713128,46.3802364,0 7.4710557,46.3801046,0 7.4707899,46.3799475,0 7.4698841,46.3796959,0 7.4694796,46.3795216,0 7.4681501,46.3786158,0 7.4675495,46.378284,0 7.4674162,46.3781604,0 7.4666402,46.3783304,0 7.4661228,46.3783304,0 7.4655094,46.3783895,0 7.4651103,46.3781752,0 7.4646468,46.3781259,0 7.4641455,46.3780629,0 7.4636854,46.377983,0 7.463201,46.3777408,0 7.4629927,46.3777214,0 7.4624696,46.3775035,0 7.4618424,46.3773751,0 7.4614379, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5888202,46.5408269,0 7.5888528,46.5408766,0 7.588875,46.54106,0 7.588924,46.54119,0 7.588901,46.54133,0 7.588834,46.541485,0 7.588767,46.541914,0 7.588787,46.541944,0 7.588761,46.542065,0 7.588373,46.542474,0 7.588166,46.542546,0 7.587836,46.5425,0 7.587632,46.542542,0 7.587456,46.542619,0 7.587403,46.542651,0 7.58737,46.542709,0 7.58737,46.542829,0 7.587412,46.542915,0 7.586862,46.543252,0 7.586847,46.543396,0 7.586674,46.543453,0 7.5862511,46.5434681,0 7.5860 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6020138,46.5498841,0 7.601882,46.549922,0 7.601685,46.54992,0 7.601626,46.54996,0 7.601722,46.550054,0 7.601309,46.550264,0 7.6011991,46.550366,0 7.601219,46.55041,0 7.601399,46.550388,0 7.6015586,46.550506,0 7.601421,46.550513,0 7.6013647,46.5506373,0 7.601262,46.550705,0 7.601287,46.550811,0 7.601333,46.550808,0 7.6017485,46.5512085,0 7.601757,46.5512704,0 7.601563,46.551184,0 7.601708,46.551289,0 7.6015783,46.5512632,0 7.6018501,46.5513874,0 7.6016629,46.551 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6009266,46.5531762,0 7.600218,46.55332,0 7.6001175,46.5534133,0 7.599965,46.553401,0 7.599942,46.553433,0 7.599895,46.553426,0 7.59987,46.553456,0 7.599729,46.553497,0 7.599659,46.553448,0 7.599272,46.553485,0 7.598813,46.55346,0 7.598656,46.5534106,0 7.598414,46.553382,0 7.598358,46.553294,0 7.598138,46.553232,0 7.5979213,46.5532318,0 7.5977704,46.5533893,0 7.597562,46.55353,0 7.5971441,46.5537263,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.585006,46.545887,0 7.585308,46.545812,0 7.585676,46.545648,0 7.586004,46.545501,0 7.586149,46.54546,0 7.586274,46.545474,0 7.586592,46.545575,0 7.586746,46.545413,0 7.587392,46.545051,0 7.587454,46.545042,0 7.58755,46.545093,0 7.587657,46.545196,0 7.587685,46.545255,0 7.587735,46.545312,0 7.587937,46.545379,0 7.588127,46.545313,0 7.588555,46.545203,0 7.588655,46.545235,0 7.588914,46.54519,0 7.58927,46.544999,0 7.589602,46.544965,0 7.589747,46.544873,0 7.590138, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5849503,46.5458153,0 7.585006,46.545887,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5800023,46.5344493,0 7.5798945,46.5343797,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5798945,46.5343797,0 7.5799446,46.5343023,0 7.580358,46.534014,0 7.580229,46.53383,0 7.580478,46.53353,0 7.58063,46.533409,0 7.580662,46.533282,0 7.580985,46.533044,0 7.581097,46.532718,0 7.581299,46.53254,0 7.581403,46.532292,0 7.581436,46.532046,0 7.581655,46.531986,0 7.581711,46.531738,0 7.582004,46.531552,0 7.582176,46.531554,0 7.582523,46.531376,0 7.582614,46.531184,0 7.582583,46.53111,0 7.582906,46.530769,0 7.582863,46.530726,0 7.5829341,46.5305863,0 7.58 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.574907,46.522174,0 7.575241,46.522126,0 7.575519,46.522007,0 7.575683,46.5219091,0 7.576177,46.5216802,0 7.5766449,46.5215308,0 7.5769984,46.5213232,0 7.5771978,46.5209949,0 7.5773429,46.5207243,0 7.5778537,46.5203175,0 7.5781433,46.5201358,0 7.5782994,46.5200566,0 7.5784074,46.5199962,0 7.5786242,46.5200434,0 7.5788573,46.5200418,0 7.5791451,46.5200439,0 7.5795373,46.5200993,0 7.5797431,46.5200959,0 7.5799979,46.5200668,0 7.5801735,46.5200411,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5749471,46.5223416,0 7.574907,46.522174,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6160369,46.3979777,0 7.6157131,46.3979155,0 7.6154834,46.3978111,0 7.6151754,46.3978003,0 7.6150423,46.3977139,0 7.6148727,46.3976239,0 7.6147448,46.3976527,0 7.6145725,46.3976563,0 7.6144133,46.3977751,0 7.6141693,46.3976716,0 7.6139253,46.3976149,0 7.6138913,46.3974511,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5867784,46.5343331,0 7.586636,46.5343169,0 7.5862536,46.534387,0 7.5858189,46.5340589,0 7.5855344,46.5338818,0 7.5852999,46.5338814,0 7.5852102,46.5338558,0 7.5849817,46.5337454,0 7.5844205,46.5337057,0 7.5841258,46.5338472,0 7.5837589,46.5338793,0 7.583468,46.534194,0 7.5831458,46.5339879,0 7.5829768,46.5340463,0 7.5827503,46.5340428,0 7.5824606,46.5341234,0 7.5822823,46.533987,0 7.582175,46.534088,0 7.582192,46.534143,0 7.582098,46.534248,0 7.582032,46.534242 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5760918,46.4642406,0 7.5761528,46.4641344,0 7.5760963,46.4639355,0 7.575963,46.4637864,0 7.5761054,46.4635605,0 7.576007,46.463488,0 7.5760865,46.4634391,0 7.5762155,46.4634251,0 7.5762909,46.4634787,0 7.5763343,46.4633983,0 7.5761492,46.4633829,0 7.5759358,46.4633025,0 7.5756982,46.4632692,0 7.5753259,46.4633112,0 7.5752247,46.4634065,0 7.5750741,46.4633328,0 7.574982,46.4633792,0 7.5748702,46.4634855,0 7.5746599,46.4634921,0 7.5743257,46.463372,0 7.5741265,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5697137,46.4643644,0 7.5696709,46.4640308,0 7.569641,46.463862,0 7.569569,46.463753,0 7.5695632,46.4636037,0 7.569509,46.46342,0 7.5695177,46.4633725,0 7.5695743,46.4633062,0 7.569566,46.4631985,0 7.5694414,46.4631404,0 7.569341,46.4630756,0 7.569295,46.462921,0 7.569227,46.462647,0 7.569219,46.462572,0 7.5696607,46.4623892,0 7.5698225,46.462294,0 7.5698465,46.4622325,0 7.5698383,46.4621907,0 7.5697712,46.4621462,0 7.569602,46.462112,0 7.5692687,46.4619905,0 7. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5696509,46.4645017,0 7.5698207,46.4647295,0 7.5699592,46.4650421,0 7.5699802,46.46521,0 7.5702017,46.4657804,0 7.5705419,46.466011,0 7.5707753,46.4661825,0 7.570989,46.4663287,0 7.5710874,46.4664496,0 7.5712645,46.4664834,0 7.5713153,46.4665155,0 7.5713181,46.4665988,0 7.5712129,46.4666974,0 7.5713008,46.4667194,0 7.5713972,46.4667082,0 7.5715031,46.4667483,0 7.5715626,46.4668221,0 7.5717327,46.4668831,0 7.5717584,46.467238,0 7.571919,46.4672926,0 7.5719463,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5733474,46.4760144,0 7.573387,46.476093,0 7.573364,46.476147,0 7.573205,46.47634,0 7.5731633,46.4764965,0 7.573011,46.476853,0 7.573171,46.477301,0 7.573158,46.477392,0 7.573204,46.477643,0 7.573264,46.477724,0 7.57326,46.47782,0 7.573312,46.477974,0 7.573405,46.478005,0 7.573513,46.478382,0 7.573327,46.478605,0 7.573124,46.478741,0 7.5730652,46.4788205,0 7.572965,46.478971,0 7.5729777,46.4790803,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.572435,46.480232,0 7.5723796,46.4802457,0 7.572367,46.480409,0 7.5724103,46.4805829,0 7.5724509,46.4806753,0 7.572588,46.4807929,0 7.5728106,46.4809482,0 7.572871,46.481109,0 7.5730504,46.4810728,0 7.5731338,46.4810853,0 7.573273,46.481198,0 7.5733182,46.4812789,0 7.573379,46.481352,0 7.5734294,46.4814738,0 7.573584,46.481614,0 7.5736388,46.4817822,0 7.5735255,46.4818236,0 7.5735632,46.481887,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4991732,46.4109774,0 7.4971806,46.4100626,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5630315,46.4863658,0 7.5630346,46.4863294,0 7.5629344,46.4861077,0 7.5628594,46.4858963,0 7.5628286,46.4857459,0 7.5627536,46.4854418,0 7.5629093,46.4851483,0 7.5631453,46.4849427,0 7.5634035,46.4848222,0 7.5635808,46.4847034,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5609581,46.485938,0 7.5605165,46.4858118,0 7.5600333,46.4857315,0 7.5598958,46.4857688,0 7.559625,46.485895,0 7.5595375,46.4858721,0 7.5593626,46.4856971,0 7.5591709,46.4856971,0 7.5590842,46.4856691,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5583125,46.4854727,0 7.5582182,46.4854102,0 7.5579355,46.4853406,0 7.5577332,46.4852617,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4491612,46.3892601,0 7.4489159,46.389038,0 7.448525,46.3888934,0 7.4484874,46.3885331,0 7.4481152,46.3884317,0 7.4478024,46.3883001,0 7.4481997,46.3879463,0 7.4479682,46.3878061,0 7.448763,46.3874695,0 7.4490379,46.387263,0 7.4491418,46.3869723,0 7.448928,46.3867195,0 7.4480727,46.3866647,0 7.4475718,46.3865635,0 7.4472541,46.3866225,0 7.4469059,46.3864371,0 7.4462221,46.3860969,0 7.4456494,46.3858171,0 7.445017,46.3854714,0 7.4447187,46.385348,0 7.4441818,46.3 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.54034,46.479224,0 7.5405449,46.4792038,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5405449,46.4792038,0 7.5405797,46.4790433,0 7.5405327,46.4789723,0 7.5404097,46.4788593,0 7.5402977,46.4788013,0 7.5402217,46.4787403,0 7.5401727,46.4786613,0 7.5401477,46.4785803,0 7.5401417,46.4784913,0 7.5401847,46.4783583,0 7.5401077,46.4781393,0 7.5398797,46.4779323,0 7.5397957,46.4778963,0 7.5396827,46.4778273,0 7.5395287,46.4776643,0 7.5392937,46.4774943,0 7.5392307,46.4773863,0 7.5392767,46.4772613,0 7.5393877,46.4770953,0 7.5393527,46.4769173,0 7.53929 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5405449,46.4792038,0 7.5406524,46.4792776,0 7.5407781,46.479334,0 7.5408591,46.4794291,0 7.5409698,46.4795263,0 7.5411333,46.4796215,0 7.5412319,46.4796548,0 7.5413719,46.4796758,0 7.5416056,46.4797181,0 7.5418305,46.4797854,0 7.54201,46.4798595,0 7.5421246,46.4798622,0 7.5422038,46.4797679,0 7.5422344,46.4798088,0 7.5422886,46.4799859,0 7.5423131,46.4800371,0 7.5426664,46.4798968,0 7.5429766,46.4798709,0 7.5432583,46.4799198,0 7.5434381,46.4799008,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>weltcuptrail</name>
+          <description>weltcuptrail, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.546366,46.472721,0 7.546582,46.472858,0 7.547273,46.473451,0 7.547355,46.4734738,0 7.547384,46.473463,0 7.547498,46.473357,0 7.547742,46.47342,0 7.547824,46.473408,0 7.547981,46.473591,0 7.547883,46.473721,0 7.547835,46.473855,0 7.5478299,46.473905,0 7.547809,46.473981,0 7.5477828,46.4740075,0 7.547779,46.474138,0 7.547809,46.474276,0 7.5477933,46.4743096,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>weltcuptrail</name>
+          <description>weltcuptrail, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5480239,46.4745659,0 7.548071,46.474601,0 7.548147,46.474528,0 7.548245,46.474637,0 7.5483324,46.4746403,0 7.548341,46.47449,0 7.548407,46.474385,0 7.548466,46.474353,0 7.54865,46.474336,0 7.54875,46.47437,0 7.548891,46.474445,0 7.549013,46.474522,0 7.54923,46.474725,0 7.549299,46.4748896,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>weltcuptrail</name>
+          <description>weltcuptrail, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5493338,46.4748532,0 7.549414,46.47493,0 7.549582,46.475164,0 7.549651,46.475295,0 7.549684,46.475505,0 7.54967,46.475541,0 7.549721,46.475697,0 7.549688,46.475774,0 7.5496779,46.4758944,0 7.549687,46.476009,0 7.549675,46.476086,0 7.549617,46.476191,0 7.549632,46.476283,0 7.549615,46.476398,0 7.549678,46.47656,0 7.549695,46.476669,0 7.5497552,46.4767867,0 7.549748,46.476959,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Weltcuptrail</name>
+          <description>Weltcuptrail, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.549748,46.476959,0 7.549775,46.477008,0 7.549895,46.477112,0 7.550177,46.477211,0 7.55031,46.477289,0 7.55055,46.47749,0 7.55062,46.47756,0 7.550649,46.47761,0 7.5507845,46.4777077,0 7.55114,46.477912,0 7.551194,46.477987,0 7.551282,46.478149,0 7.551346,46.478194,0 7.551429,46.478302,0 7.551526,46.478356,0 7.551621,46.478457,0 7.551717,46.478663,0 7.551707,46.47887,0 7.551658,46.47893,0 7.551561,46.479008,0 7.551522,46.479094,0 7.551569,46.479147,0 7.551878,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.551653,46.479461,0 7.5518381,46.4797245,0 7.5520744,46.4800436,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>weltcuptrail</name>
+          <description>weltcuptrail, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5520744,46.4800436,0 7.5523543,46.4803948,0 7.552633,46.480644,0 7.552654,46.480686,0 7.552661,46.480821,0 7.552597,46.480934,0 7.5528719,46.4810715,0 7.553538,46.481365,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>weltcuptrail</name>
+          <description>weltcuptrail, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.553538,46.481365,0 7.5536631,46.4813963,0 7.5538861,46.4814296,0 7.5539842,46.4814906,0 7.554022,46.481474,0 7.5540645,46.48153,0 7.5541435,46.48172,0 7.5543894,46.4818397,0 7.554494,46.4819297,0 7.5545233,46.4819795,0 7.5545342,46.4819645,0 7.5545621,46.4819692,0 7.5545859,46.4820172,0 7.554821,46.481838,0 7.554956,46.481708,0 7.555151,46.48159,0 7.555222,46.481636,0 7.55523,46.48166,0 7.5553253,46.4817137,0 7.55537,46.481745,0 7.555477,46.481777,0 7.5556084,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5545859,46.4820172,0 7.55461,46.482137,0 7.554617,46.482234,0 7.554605,46.482389,0 7.554629,46.482655,0 7.554708,46.482908,0 7.5547019,46.4829911,0 7.5548169,46.4831683,0 7.55481,46.483357,0 7.5548512,46.4833925,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5589672,46.4720202,0 7.5588162,46.471941,0 7.5582203,46.4719026,0 7.5581135,46.4719351,0 7.558022,46.471878,0 7.5578016,46.4719941,0 7.5576517,46.4720351,0 7.5576179,46.4720443,0 7.5575959,46.4718987,0 7.557722,46.471563,0 7.5579085,46.471328,0 7.557727,46.471356,0 7.5578843,46.4712066,0 7.558052,46.470647,0 7.5583051,46.4703056,0 7.5580457,46.4703479,0 7.5579895,46.470307,0 7.55807,46.470201,0 7.557818,46.469769,0 7.557864,46.469491,0 7.5576416,46.4695163,0 7. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5534638,46.4774581,0 7.5534455,46.4773887,0 7.5536469,46.4769512,0 7.5541106,46.4766077,0 7.554105,46.476402,0 7.5542249,46.476267,0 7.554407,46.476171,0 7.554414,46.476057,0 7.554147,46.475643,0 7.55415,46.475587,0 7.554261,46.475443,0 7.554396,46.475107,0 7.554392,46.474963,0 7.55435,46.474903,0 7.5544589,46.4747756,0 7.554432,46.47466,0 7.554649,46.474518,0 7.554669,46.474458,0 7.554782,46.474308,0 7.5551416,46.4740944,0 7.555307,46.473841,0 7.555855,46.4736 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5467453,46.4607696,0 7.54649,46.46086,0 7.546379,46.460852,0 7.546278,46.460823,0 7.545332,46.460219,0 7.5452056,46.4601933,0 7.5450453,46.4602259,0 7.544678,46.460625,0 7.5446722,46.4605383,0 7.5445511,46.460897,0 7.544186,46.460965,0 7.5441541,46.4609626,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.543932,46.457905,0 7.5439224,46.4576498,0 7.5439863,46.457507,0 7.5443697,46.4571846,0 7.544414,46.457028,0 7.5444229,46.4568876,0 7.5443132,46.4567359,0 7.5441254,46.4565893,0 7.5437854,46.4563725,0 7.543601,46.456324,0 7.5433883,46.456225,0 7.543038,46.45609,0 7.5429552,46.4560635,0 7.5426803,46.4560349,0 7.5424803,46.4559119,0 7.5424073,46.4558342,0 7.5423486,46.4557438,0 7.5422303,46.4556441,0 7.542099,46.4555716,0 7.541851,46.455355,0 7.541218,46.4550142,0 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5441541,46.4609626,0 7.5440914,46.4606083,0 7.5438826,46.4599873,0 7.5438935,46.459889,0 7.5437841,46.4595562,0 7.543707,46.459351,0 7.543697,46.458911,0 7.543855,46.4586,0 7.5438914,46.4582169,0 7.543963,46.457984,0 7.543932,46.457905,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5441541,46.4609626,0 7.5443022,46.4612074,0 7.544328,46.461298,0 7.544419,46.461445,0 7.544713,46.461762,0 7.545105,46.462076,0 7.545267,46.462233,0 7.545313,46.462295,0 7.545411,46.462463,0 7.545425,46.462521,0 7.545408,46.462596,0 7.545312,46.462754,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.545312,46.462754,0 7.545134,46.462514,0 7.5450942,46.4625956,0 7.545048,46.462549,0 7.545021,46.462594,0 7.544907,46.462658,0 7.5448176,46.4625996,0 7.544809,46.462548,0 7.544682,46.462664,0 7.5445887,46.462662,0 7.544541,46.462678,0 7.5445217,46.4627506,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5445217,46.4627506,0 7.544556,46.462863,0 7.544642,46.462973,0 7.544646,46.463071,0 7.544535,46.463181,0 7.5444536,46.4632176,0 7.544159,46.463337,0 7.544005,46.463444,0 7.543837,46.463533,0 7.543703,46.463733,0 7.543456,46.463916,0 7.54331,46.464225,0 7.543007,46.464459,0 7.542768,46.464717,0 7.542685,46.464932,0 7.54251,46.465228,0 7.542382,46.46565,0 7.542912,46.466323,0 7.543704,46.466981,0 7.543754,46.467237,0 7.543974,46.46768,0 7.543981,46.467838,0 7.543 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5882589,46.4861244,0 7.5885014,46.4860791,0 7.5886623,46.4860126,0 7.5888769,46.4859609,0 7.5890164,46.4859609,0 7.5890486,46.4860644,0 7.589349,46.4861973,0 7.5894348,46.4862269,0 7.5895528,46.4862121,0 7.5898425,46.4860644,0 7.5902395,46.4860791,0 7.5903575,46.486057,0 7.5905292,46.486057,0 7.5905935,46.4861382,0 7.5905721,46.486286,0 7.5904004,46.4863746,0 7.5902609,46.4864928,0 7.5901966,46.4866258,0 7.5903146,46.4867735,0 7.5904862,46.4868695,0 7.590615,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.592399,46.488507,0 7.5926427,46.4885981,0 7.5928466,46.4886055,0 7.5930183,46.4886793,0 7.5933508,46.4886202,0 7.5935225,46.4886276,0 7.5935547,46.4886646,0 7.5936727,46.4886572,0 7.5939302,46.4887901,0 7.5941448,46.4887384,0 7.5943701,46.4887089,0 7.5945847,46.4889231,0 7.5949924,46.4890561,0 7.5952391,46.4890191,0 7.5954108,46.4889896,0 7.5956146,46.48896,0 7.5957005,46.4888345,0 7.5958292,46.488731,0 7.5959365,46.4885981,0 7.5960104,46.4885348,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.624132,46.520973,0 7.6238068,46.5208419,0 7.6234849,46.5205687,0 7.623163,46.5203989,0 7.6226695,46.5204358,0 7.62253,46.5204727,0 7.6223584,46.5204248,0 7.6221062,46.5202107,0 7.6217951,46.5200667,0 7.6214893,46.5199338,0 7.6211728,46.5198046,0 7.6209046,46.5197825,0 7.6205506,46.5197714,0 7.6202448,46.5197419,0 7.6199712,46.519753,0 7.6196923,46.5198268,0 7.6194026,46.5199744,0 7.6190968,46.5200556,0 7.6188232,46.520063,0 7.6186247,46.520004,0 7.6183672,46.51 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.609237,46.5005217,0 7.6090546,46.5002927,0 7.608883,46.500049,0 7.6087757,46.4998792,0 7.6086147,46.4998127,0 7.6079495,46.4996945,0 7.607574,46.4996059,0 7.6074453,46.4994951,0 7.6073487,46.4993326,0 7.6071127,46.4991628,0 7.6068552,46.499052,0 7.6067694,46.4989338,0 7.6067265,46.4985793,0 7.6067694,46.4982987,0 7.6067694,46.4981805,0 7.6066835,46.4980476,0 7.6064368,46.4979811,0 7.6060827,46.4979368,0 7.6058038,46.4979442,0 7.6054926,46.4978999,0 7.6052566,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5557343,46.4981656,0 7.5557397,46.4982247,0 7.55567,46.4982801,0 7.555568,46.4983096,0 7.5554661,46.4983761,0 7.5554232,46.4984906,0 7.5553964,46.4986457,0 7.5553857,46.4988008,0 7.5554286,46.4989522,0 7.5554232,46.4990888,0 7.5554822,46.499159,0 7.5556753,46.499303,0 7.5558845,46.4995024,0 7.5559489,46.4995356,0 7.5560187,46.4997609,0 7.5559489,46.4997978,0 7.5560938,46.4999566,0 7.5562279,46.5000046,0 7.5562118,46.500108,0 7.5560669,46.500167,0 7.5556968,46.5 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Via Ferrata Dauberhorn</name>
+          <description>Via Ferrata Dauberhorn, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.615535,46.3933165,0 7.6153571,46.3931316,0 7.6148421,46.392954,0 7.6139623,46.39288,0 7.6134473,46.3929836,0 7.6128036,46.3930724,0 7.6122672,46.3931316,0 7.6120311,46.3928356,0 7.6117736,46.3925988,0 7.6112801,46.3924212,0 7.6111084,46.3922288,0 7.611087,46.3919624,0 7.6113016,46.391696,0 7.6112801,46.3913112,0 7.6113445,46.390956,0 7.6112586,46.39066,0 7.6112801,46.3902012,0 7.6111728,46.389846,0 7.6108295,46.38955,0 7.610572,46.3892244,0 7.610572,46.3888248, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Via Ferrata Dauberhorn</name>
+          <description>Via Ferrata Dauberhorn, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6043064,46.3843844,0 7.6048126,46.3847763,0 7.6042547,46.3845839,0 7.6050486,46.3850872,0 7.6058425,46.3852944,0 7.6066794,46.3852944,0 7.6065292,46.3857976,0 7.6058425,46.3860789,0 7.6052846,46.3862713,0 7.6052632,46.3864785,0 7.6045551,46.3867005,0 7.6042976,46.3868781,0 7.6040186,46.3870409,0 7.6034393,46.3870853,0 7.6030959,46.3870705,0 7.6028384,46.3874554,0 7.6026829,46.3875479,0 7.6022051,46.3877699,0 7.6020231,46.3879142,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Lämmernweg süd</name>
+          <description>Lämmernweg süd, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5773607,46.3980323,0 7.5767505,46.3977455,0 7.5767827,46.3975531,0 7.5771046,46.3971092,0 7.5777805,46.3966134,0 7.578671,46.3962953,0 7.5799799,46.3960807,0 7.5813317,46.3957403,0 7.5844109,46.3950966,0 7.5849366,46.394993,0 7.5874471,46.3949782,0 7.5887775,46.3952742,0 7.5891478,46.3953803,0 7.5896036,46.3955109,0 7.5912022,46.3955923,0 7.5928438,46.3956663,0 7.5953221,46.3960955,0 7.5978327,46.3964729,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4394297,46.5665636,0 7.4395718,46.5667101,0 7.4396474,46.5668294,0 7.4396594,46.5670283,0 7.43954,46.5671159,0 7.4394047,46.5671875,0 7.4392894,46.5672074,0 7.4391501,46.5671954,0 7.4389114,46.5673228,0 7.4388159,46.5673267,0 7.4387125,46.567275,0 7.4385454,46.5672352,0 7.4383464,46.5672551,0 7.4380719,46.5673307,0 7.4378372,46.5674421,0 7.4374911,46.5675217,0 7.4371967,46.5675575,0 7.4370017,46.5675336,0 7.4367789,46.5676848,0 7.4365203,46.5677087,0 7.4361185, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4920336,46.5215194,0 7.4920087,46.5216089,0 7.4916557,46.5219819,0 7.4912678,46.5220963,0 7.491044,46.5220913,0 7.4906312,46.522335,0 7.4903278,46.5224941,0 7.4898653,46.5229069,0 7.4892835,46.5233495,0 7.4883087,46.5239214,0 7.4876324,46.5242944,0 7.4875777,46.5244237,0 7.4875578,46.5246624,0 7.4874981,46.5247967,0 7.4872644,46.524931,0 7.4871052,46.524921,0 7.4868019,46.5248116,0 7.4862598,46.524747,0 7.4861802,46.5247768,0 7.4861454,46.524926,0 7.4861554,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4751759,46.5539538,0 7.475336,46.5540147,0 7.4755769,46.5537815,0 7.4758178,46.5538048,0 7.4759654,46.5540224,0 7.4758722,46.5540768,0 7.4759499,46.5545431,0 7.4757789,46.5555377,0 7.4757945,46.5557786,0 7.4757246,46.5560117,0 7.4758023,46.5561516,0 7.4757028,46.5567762,0 7.4756876,46.5570949,0 7.4758849,46.5573377,0 7.475976,46.5578234,0 7.4759608,46.5582331,0 7.4760974,46.5586126,0 7.4763554,46.5587491,0 7.4763554,46.5589464,0 7.4766134,46.5592803,0 7.4772205 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4528183,46.5206213,0 7.4533716,46.5207021,0 7.4542419,46.5206399,0 7.4545279,46.520584,0 7.4548014,46.5206151,0 7.4551371,46.5207394,0 7.4557836,46.5207891,0 7.4566787,46.5207829,0 7.4572817,46.5208202,0 7.4578536,46.5207954,0 7.4583945,46.5206897,0 7.4586369,46.5206772,0 7.4588296,46.5207145,0 7.4591964,46.5206959,0 7.4596502,46.5206586,0 7.4601413,46.5207394,0 7.4604024,46.5207208,0 7.4610924,46.5204721,0 7.4613908,46.5203105,0 7.4618881,46.5202421,0 7.462702 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5644603,46.4461059,0 7.5645107,46.4465933,0 7.5642589,46.446939,0 7.5639358,46.4470668,0 7.5637291,46.4472922,0 7.56347,46.4474613,0 7.5637404,46.4476568,0 7.5639733,46.447871,0 7.5642364,46.44801,0 7.5643529,46.4480589,0 7.5643905,46.4482881,0 7.5643341,46.4484234,0 7.5645483,46.448709,0 7.5648114,46.4488029,0 7.5651457,46.4489852,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5614623,46.4593025,0 7.5611273,46.4593835,0 7.560775,46.4592943,0 7.5603616,46.4591768,0 7.5601173,46.4593272,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6045778,46.4977876,0 7.6046204,46.4977082,0 7.6049205,46.4975268,0 7.6050087,46.4974899,0 7.6051066,46.4975268,0 7.6050665,46.4973744,0 7.6049991,46.4971754,0 7.6049301,46.4970679,0 7.6047729,46.4969989,0 7.6044584,46.4969508,0 7.6042706,46.4969203,0 7.6042706,46.4967968,0 7.6044664,46.4966941,0 7.6044532,46.4966183,0 7.604413,46.4964618,0 7.6044291,46.4962673,0 7.6043749,46.4958962,0 7.6043509,46.4956034,0 7.6043288,46.4952464,0 7.6041383,46.4949355,0 7.604003 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.561897,46.4519024,0 7.562231,46.4519425,0 7.5622941,46.4520086,0 7.5625157,46.4520579,0 7.5627528,46.4519979,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.560335,46.449238,0 7.5600857,46.4492598,0 7.5598715,46.449117,0 7.5596084,46.4490493,0 7.5593942,46.4489366,0 7.5593266,46.4488765,0 7.5591725,46.4486059,0 7.5593792,46.4484631,0 7.5597023,46.4483128,0 7.5599917,46.4481512,0 7.5604201,46.4480836,0 7.5608598,46.4481813,0 7.560985,46.448126,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6042768,46.486003,0 7.6044596,46.4859007,0 7.6047448,46.4859446,0 7.6050206,46.4858788,0 7.6052901,46.4858161,0 7.6055001,46.485719,0 7.605633,46.4855823,0 7.6054326,46.4855797,0 7.6054207,46.4855607,0 7.6056389,46.4855403,0 7.6056593,46.4855377,0 7.6058197,46.4854916,0 7.6059853,46.4853622,0 7.6061485,46.4851949,0 7.6063972,46.4851147,0 7.6065223,46.4850104,0 7.6065753,46.4848692,0 7.606816,46.4848274,0 7.6069893,46.4848066,0 7.6069796,46.4846285,0 7.606771,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6073503,46.5155013,0 7.6071538,46.515465,0 7.606817,46.5154259,0 7.6065284,46.5153838,0 7.6061659,46.5153941,0 7.60594,46.5155194,0 7.6059144,46.5154506,0 7.6057305,46.5154896,0 7.6054882,46.5154968,0 7.6052941,46.5154126,0 7.6049911,46.5153746,0 7.6047252,46.5152986,0 7.6044397,46.5153243,0 7.6041881,46.5153089,0 7.603904,46.5152803,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5109074,46.4975939,0 7.5106958,46.4976333,0 7.5103212,46.4976753,0 7.510222,46.4976293,0 7.5098982,46.4976558,0 7.5096505,46.4976143,0 7.5095384,46.4976181,0 7.5091324,46.4975663,0 7.5088809,46.497604,0 7.5085719,46.4976313,0 7.5082007,46.4977481,0 7.5079323,46.4977971,0 7.5077203,46.4979365,0 7.5074575,46.4980448,0 7.507172,46.4981654,0 7.5070421,46.498269,0 7.5068461,46.4983538,0 7.5066002,46.4983557,0 7.5064655,46.4984311,0 7.5062762,46.498416,0 7.5062112,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5415101,46.4829137,0 7.5411092,46.4830045,0 7.5405377,46.4830449,0 7.5399432,46.4831921,0 7.5395854,46.4833624,0 7.5389331,46.4834865,0 7.5383761,46.4836019,0 7.537822,46.4836856,0 7.5371957,46.4838472,0 7.5368933,46.4838149,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5605804,46.4538416,0 7.5606075,46.4535339,0 7.5606906,46.4534892,0 7.5606227,46.4533264,0 7.5607983,46.4530402,0 7.5605217,46.4530282,0 7.5602932,46.4529945,0 7.5601489,46.4529392,0 7.5598771,46.452997,0 7.5600647,46.4528719,0 7.5600527,46.4527228,0 7.559995,46.4525761,0 7.5599204,46.4524606,0 7.5598411,46.4522947,0 7.5597232,46.4521792,0 7.5596078,46.4520566,0 7.5597112,46.4519026,0 7.5597881,46.4518401,0 7.5598699,46.4518281,0 7.55993,46.4518088,0 7.5599325,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5952104,46.4388413,0 7.5950256,46.4384877,0 7.5948831,46.4383082,0 7.5947934,46.4380997,0 7.5943235,46.4378331,0 7.5942576,46.4376351,0 7.5943499,46.4373606,0 7.5942655,46.4370122,0 7.5942971,46.4366611,0 7.5941916,46.4363998,0 7.5938564,46.4360514,0 7.5936689,46.4358772,0 7.5934235,46.4354338,0 7.5932202,46.4351381,0 7.5930117,46.4349323,0 7.5925736,46.4346314,0 7.5923492,46.4345284,0 7.5919374,46.4340348,0 7.5918899,46.4339108,0 7.5919454,46.433726,0 7.591847 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5296583,46.4300374,0 7.5292858,46.4300524,0 7.5290588,46.4300577,0 7.5289348,46.4300867,0 7.5287368,46.4300762,0 7.5285785,46.4301184,0 7.5285204,46.4302715,0 7.5283462,46.4303111,0 7.5282274,46.4304193,0 7.5280031,46.4305117,0 7.5277813,46.4306278,0 7.5275095,46.4308363,0 7.5272006,46.4309762,0 7.5269367,46.4311716,0 7.5266701,46.4313062,0 7.5262715,46.431813,0 7.5259997,46.4321112,0 7.525873,46.4322221,0 7.5256011,46.4324781,0 7.5255826,46.4325599,0 7.5254058 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5531803,46.3637433,0 7.5528114,46.3639866,0 7.5525992,46.3642187,0 7.5525078,46.3645431,0 7.5526612,46.3646039,0 7.5525567,46.3646918,0 7.5527167,46.3648923,0 7.5526579,46.3649621,0 7.5531019,46.3651356,0 7.5533435,46.3653158,0 7.5534937,46.365487,0 7.553399,46.3657461,0 7.5533859,46.3658632,0 7.5540813,46.3660367,0 7.554398,46.3662507,0 7.554558,46.3662935,0 7.5544894,46.3665075,0 7.5575791,46.3665852,0 7.5581286,46.3669084,0 7.5585494,46.3672031,0 7.5593082,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Geissweg</name>
+          <description>Geissweg, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6222616,46.3768109,0 7.6221674,46.3766908,0 7.6219495,46.3765308,0 7.6217027,46.3762199,0 7.6214667,46.3759238,0 7.6214023,46.3757166,0 7.6213272,46.3755685,0 7.6213057,46.3754279,0 7.621295,46.3752429,0 7.6212839,46.3751056,0 7.6212735,46.3748801,0 7.6212735,46.3747543,0 7.6212092,46.3745767,0 7.6211233,46.3744064,0 7.6211126,46.374251,0 7.6211155,46.3740319,0 7.6210626,46.373873,0 7.6209285,46.3736805,0 7.6208534,46.3735175,0 7.6206785,46.3733627,0 7.6205037, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5284879,46.4891875,0 7.5286313,46.4893803,0 7.5287117,46.4900478,0 7.5284951,46.4908182,0 7.5289364,46.4906938,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4345295,46.4574371,0 7.4347762,46.4573336,0 7.4350874,46.4572893,0 7.4353341,46.4572301,0 7.4354414,46.4570823,0 7.4356774,46.4567867,0 7.4357204,46.4564319,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4357204,46.4564319,0 7.4363534,46.4565058,0 7.4372546,46.4566093,0 7.4375872,46.4566536,0 7.4377803,46.4567202,0 7.4379949,46.456698,0 7.4382202,46.4566389,0 7.4384777,46.4566019,0 7.4387566,46.4566536,0 7.4390892,46.4567793,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4319089,46.4675275,0 7.4326197,46.4677909,0 7.4330703,46.46802,0 7.4340467,46.4683451,0 7.4347869,46.4685668,0 7.4351195,46.4686629,0 7.4354092,46.4689289,0 7.4357955,46.4693649,0 7.4360816,46.4694487,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4389752,46.4648103,0 7.4388936,46.4647475,0 7.4374799,46.4641657,0 7.4368575,46.4640778,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4391324,46.4649312,0 7.4389752,46.4648103,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4291628,46.5638818,0 7.4290955,46.5638078,0 7.4290258,46.5636455,0 7.4289346,46.5634796,0 7.4288327,46.5633357,0 7.4286825,46.5631919,0 7.4284893,46.5630997,0 7.428264,46.5630443,0 7.4280441,46.5630812,0 7.4278563,46.5631624,0 7.4276686,46.5632103,0 7.4275774,46.5631439,0 7.4275345,46.5630443,0 7.4274755,46.5629005,0 7.427336,46.5627677,0 7.4273413,46.5626239,0 7.4272716,46.562528,0 7.4272126,46.5623583,0 7.4271482,46.5621923,0 7.42688,46.5619415,0 7.4265689,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5658624,46.5011096,0 7.5659292,46.5011241,0 7.5660166,46.5011678,0 7.5662026,46.5012103,0 7.5666147,46.5013842,0 7.5667588,46.5014242,0 7.5669066,46.5014373,0 7.5670507,46.5015243,0 7.5671619,46.5016086,0 7.5673501,46.5017095,0 7.5675991,46.5017956,0 7.5677317,46.5018426,0 7.5678619,46.5020131,0 7.5678935,46.5020157,0 7.5679011,46.5019704,0 7.56788,46.50188,0 7.567992,46.5019974,0 7.5681955,46.5021296,0 7.5685303,46.5022514,0 7.5686352,46.5023384,0 7.5686706,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5678619,46.5020131,0 7.5679328,46.5022479,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5686907,46.5028223,0 7.568699,46.5027941,0 7.56873,46.5027741,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5613391,46.4939717,0 7.5611723,46.4943217,0 7.5611146,46.4943645,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4099747,46.4812081,0 7.4100874,46.4812561,0 7.4102644,46.4813559,0 7.4104897,46.48133,0 7.4106882,46.4812598,0 7.4109618,46.4812266,0 7.4111978,46.4811564,0 7.4113319,46.4810382,0 7.4114124,46.4808756,0 7.4114982,46.4807759,0 7.4116806,46.4807759,0 7.4118791,46.4809089,0 7.4120293,46.4809532,0 7.4122624,46.480898,0 7.4124263,46.4807981,0 7.4125819,46.4807242,0 7.4128125,46.4807611,0 7.4130003,46.4807205,0 7.4131827,46.4806282,0 7.413349,46.4805727,0 7.4136172,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4317516,46.4728703,0 7.4318669,46.4725932,0 7.4320708,46.4722681,0 7.4322907,46.47198,0 7.4326233,46.4716548,0 7.4330793,46.4713851,0 7.4334119,46.4711893,0 7.4336855,46.4709972,0 7.4340985,46.4707201,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6164187,46.5309288,0 7.6170658,46.5311194,0 7.6182054,46.5313292,0 7.6193915,46.5318375,0 7.6194839,46.5322688,0 7.6204851,46.5333009,0 7.6213939,46.5338554,0 7.6221795,46.5344869,0 7.6231345,46.5348566,0 7.6244438,46.5351031,0 7.6247981,46.5355343,0 7.6250907,46.5362891,0 7.6253526,46.5364431,0 7.6258455,46.5370439,0 7.6256606,46.5375368,0 7.625445,46.5377524,0 7.6255066,46.5380297,0 7.6262306,46.5384302,0 7.6269853,46.5383069,0 7.6273704,46.5384764,0 7.628032 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.490681,46.4144632,0 7.4904801,46.4146018,0 7.4903907,46.4147865,0 7.4903163,46.4150995,0 7.4902866,46.4155664,0 7.4902493,46.4159204,0 7.4902493,46.4162641,0 7.4902047,46.4164591,0 7.4899517,46.4165925,0 7.4896093,46.4167823,0 7.489267,46.4169927,0 7.4890958,46.4170543,0 7.4889395,46.4170594,0 7.4886865,46.416967,0 7.4884707,46.4168593,0 7.4882102,46.4166284,0 7.4878679,46.4164488,0 7.4874883,46.4164027,0 7.4871386,46.4164796,0 7.4869302,46.4165925,0 7.4866251, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4884845,46.4446966,0 7.4884442,46.4451792,0 7.4886803,46.4457411,0 7.4893562,46.4462955,0 7.4899463,46.4468869,0 7.4900643,46.4470791,0 7.490311,46.4472344,0 7.4906651,46.4473083,0 7.4910513,46.4473083,0 7.4916307,46.4472935,0 7.49221,46.4474118,0 7.4926499,46.4474414,0 7.4929074,46.447397,0 7.4932186,46.4472639,0 7.4937872,46.4471457,0 7.4945382,46.4471678,0 7.4951283,46.4473083,0 7.4956969,46.4477223,0 7.495933,46.4479588,0 7.4961904,46.4480771,0 7.4965552,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4909655,46.4491638,0 7.4912123,46.4492377,0 7.4914912,46.4491933,0 7.491738,46.4490677,0 7.4919204,46.4490233,0 7.4921779,46.4489716,0 7.4924568,46.448905,0 7.4929933,46.4487868,0 7.4932293,46.4487424,0 7.493358,46.4486759,0 7.4935404,46.4486241,0 7.4937014,46.4485946,0 7.4938623,46.4485206,0 7.4939374,46.4484245,0 7.4940661,46.4483358,0 7.4941949,46.4482915,0 7.4943236,46.4482915,0 7.4944309,46.448321,0 7.4944846,46.4483802,0 7.4945918,46.4484393,0 7.4947099,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4988512,46.4461551,0 7.4989692,46.4461403,0 7.4991301,46.4460516,0 7.4992696,46.4460959,0 7.4993233,46.4462142,0 7.499452,46.4463399,0 7.4995915,46.4464064,0 7.4997524,46.4464803,0 7.4999563,46.4465395,0 7.500085,46.4465469,0 7.5000314,46.4463842,0 7.499967,46.4462955,0 7.499967,46.4462068,0 7.5000314,46.4461551,0 7.5001708,46.4462142,0 7.5002674,46.446266,0 7.500321,46.4462364,0 7.5002245,46.4461255,0 7.5002352,46.446022,0 7.5002459,46.4459481,0 7.500203,46.44 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5010721,46.4422369,0 7.5011686,46.4424217,0 7.5013188,46.4426139,0 7.5015549,46.4427322,0 7.5017694,46.4428135,0 7.5019733,46.4428875,0 7.5021771,46.4429466,0 7.502381,46.4430797,0 7.5026063,46.4431536,0 7.5027887,46.4432275,0 7.5030033,46.4433015,0 7.5031749,46.4433976,0 7.503368,46.4434641,0 7.5036577,46.4434789,0 7.5040654,46.4434789,0 7.5044624,46.4433828,0 7.5046555,46.4433384,0 7.505031,46.4432497,0 7.5052563,46.443161,0 7.5054494,46.4430131,0 7.5057177,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6100216,46.4187252,0 7.6103389,46.4186035,0 7.6105213,46.4185296,0 7.6110684,46.4183669,0 7.6114761,46.4183669,0 7.6117336,46.4184704,0 7.6120769,46.4184926,0 7.6127421,46.4184482,0 7.6133,46.4182855,0 7.6139974,46.4180266,0 7.6144587,46.4178121,0 7.6147591,46.4174201,0 7.6151239,46.4171465,0 7.6154672,46.4168728,0 7.6156711,46.4165769,0 7.6159179,46.4162663,0 7.6159822,46.4164512,0 7.61595,46.4166213,0 7.6161937,46.4166891,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5100736,46.4420964,0 7.5100993,46.4420041,0 7.5101369,46.4419339,0 7.5102764,46.4418525,0 7.5104158,46.4417195,0 7.5105124,46.4415457,0 7.510609,46.4413054,0 7.5107484,46.4410836,0 7.5108396,46.4409321,0 7.5108504,46.4408027,0 7.5108396,46.4406437,0 7.5109362,46.4405624,0 7.5110381,46.4404293,0 7.511081,46.4403406,0 7.511081,46.4402223,0 7.5110435,46.4400375,0 7.5111132,46.4398157,0 7.5112098,46.4396456,0 7.5112849,46.439483,0 7.5112795,46.4392907,0 7.5113332,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4169002,46.3606281,0 7.4166642,46.3605984,0 7.4164925,46.360554,0 7.4164604,46.3606577,0 7.4166857,46.3606503,0 7.4167822,46.3607836,0 7.4165784,46.3607539,0 7.4163316,46.3607317,0 7.4161063,46.3607391,0 7.4159132,46.3608206,0 7.4157093,46.3608798,0 7.4156879,46.3609687,0 7.4153875,46.3611167,0 7.4151622,46.361213,0 7.4150012,46.361213,0 7.4147867,46.36125,0 7.4149047,46.3613537,0 7.4150763,46.3613907,0 7.4152587,46.3614499,0 7.4150978,46.3614869,0 7.4149369,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Lämmernweg süd</name>
+          <description>Lämmernweg süd, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.611382,46.3964875,0 7.6114292,46.3962389,0 7.6108557,46.3963143,0 7.6102376,46.3963577,0 7.6097209,46.3964049,0 7.6097625,46.3965224,0 7.6089079,46.3964609,0 7.607996,46.3964387,0 7.6073737,46.3964387,0 7.6069124,46.3964239,0 7.6068694,46.3963499,0 7.6065261,46.3963277,0 7.6062794,46.3964387,0 7.606054,46.3964387,0 7.6053889,46.3962907,0 7.6048417,46.3963721,0 7.6044233,46.3964979,0 7.6042623,46.3965866,0 7.603919,46.3966754,0 7.6035435,46.3966236,0 7.6030929,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5890918,46.3955507,0 7.5891478,46.3953803,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5890918,46.3955507,0 7.5889469,46.3955137,0 7.5887431,46.3955433,0 7.5885929,46.3955359,0 7.5882281,46.3956617,0 7.5881798,46.3956099,0 7.5879277,46.3957505,0 7.5879009,46.3958134,0 7.5877989,46.3958171,0 7.5878043,46.3958615,0 7.5876916,46.3958282,0 7.5877077,46.3959318,0 7.587925,46.3962126,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bunkertunnel</name>
+          <description>Bunkertunnel, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6097625,46.3965224,0 7.6108557,46.3963143,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.618857,46.3719589,0 7.6188592,46.3720632,0 7.6189053,46.3722772,0 7.6187819,46.3724918,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4673625,46.4564555,0 7.467345,46.456468,0 7.467191,46.456466,0 7.467011,46.456589,0 7.4668276,46.4566405,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6086644,46.4388706,0 7.6059896,46.4390346,0 7.6040186,46.4382136,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6188287,46.4183578,0 7.619399,46.41861,0 7.6196936,46.4187362,0 7.6200723,46.418852,0 7.6203984,46.4190413,0 7.6208718,46.4191045,0 7.6213242,46.4191045,0 7.6217029,46.4191045,0 7.6223026,46.4190203,0 7.6225795,46.4190323,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.545644,46.4989186,0 7.5453618,46.4983976,0 7.5448129,46.497796,0 7.5442378,46.4967916,0 7.5442063,46.4956444,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Gemmiweg</name>
+          <description>Gemmiweg, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6165875,46.3938373,0 7.6168364,46.3943921,0 7.6173565,46.3951755,0 7.6172441,46.395445,0 7.6169051,46.3958102,0 7.616989,46.3961054,0 7.6171827,46.3958529,0 7.6174721,46.3954421,0 7.617529,46.3951648,0 7.6173761,46.3949876,0 7.6176494,46.3952003,0 7.6175373,46.3949445,0 7.6173232,46.3945064,0 7.6170816,46.3940832,0 7.6167553,46.3939985,0 7.6167307,46.3937498,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Gemmiweg</name>
+          <description>Gemmiweg, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6167307,46.3937498,0 7.6172078,46.3936647,0 7.6176542,46.3933273,0 7.6179288,46.3933273,0 7.6176112,46.3937595,0 7.6179288,46.3941146,0 7.6181262,46.3942746,0 7.6181691,46.3937713,0 7.6181863,46.3935464,0 7.6189588,46.3927649,0 7.6184722,46.3925455,0 7.6182284,46.3927317,0 7.6178116,46.3929224,0 7.6166641,46.3926529,0 7.6163907,46.3927661,0 7.6159441,46.3927095,0 7.6158621,46.3925335,0 7.6153802,46.3923545,0 7.6151785,46.3920809,0 7.6151421,46.3918357,0 7.61538 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4785053,46.4263539,0 7.4783109,46.4266478,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bonderlenbach Walking Path</name>
+          <description>Bonderlenbach Walking Path, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5792169,46.4925621,0 7.5791509,46.4925641,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bonderlenbach Walking Path</name>
+          <description>Bonderlenbach Walking Path, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5792169,46.4925621,0 7.5793125,46.4925286,0 7.5793674,46.4922433,0 7.579896,46.491972,0 7.580289,46.491577,0 7.580358,46.4913398,0 7.580717,46.4910715,0 7.5810337,46.4907202,0 7.5813065,46.4905421,0 7.5813831,46.4904028,0 7.5817008,46.4902111,0 7.582209,46.489783,0 7.582811,46.489678,0 7.583084,46.489476,0 7.583642,46.489351,0 7.584382,46.488724,0 7.584451,46.488496,0 7.584687,46.488298,0 7.584991,46.4884,0 7.585394,46.488367,0 7.586046,46.488033,0 7.586489,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5835968,46.5163224,0 7.5835278,46.516243,0 7.5831875,46.5160665,0 7.582901,46.515494,0 7.5829329,46.5151783,0 7.583018,46.515011,0 7.582857,46.515017,0 7.582842,46.514962,0 7.582983,46.514806,0 7.583006,46.514618,0 7.5826838,46.5145655,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.583998,46.516732,0 7.5836354,46.5165224,0 7.583146,46.51642,0 7.583074,46.516172,0 7.582901,46.516045,0 7.5828838,46.5161271,0 7.582968,46.516266,0 7.58253,46.516101,0 7.582413,46.516123,0 7.582236,46.516301,0 7.581972,46.516325,0 7.5813369,46.5161948,0 7.5811935,46.5160699,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5758881,46.4885517,0 7.57579,46.488698,0 7.575762,46.488936,0 7.575673,46.48907,0 7.5754732,46.4891609,0 7.5754081,46.4892532,0 7.5751268,46.4894422,0 7.574963,46.489548,0 7.574921,46.489618,0 7.574974,46.489689,0 7.575061,46.489711,0 7.575154,46.489709,0 7.575232,46.489819,0 7.57509,46.489989,0 7.575101,46.490052,0 7.5751655,46.4901109,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.583616,46.5164476,0 7.5835968,46.5163224,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5836354,46.5165224,0 7.583616,46.5164476,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.577443,46.4885782,0 7.577979,46.488368,0 7.578077,46.488296,0 7.578219,46.488228,0 7.578307,46.48821,0 7.578387,46.488215,0 7.578434,46.488189,0 7.578734,46.488188,0 7.578873,46.488171,0 7.578928,46.488196,0 7.579113,46.488162,0 7.579226,46.488174,0 7.579338,46.488153,0 7.579673,46.488129,0 7.579867,46.488075,0 7.580044,46.488002,0 7.580178,46.487914,0 7.580318,46.487883,0 7.580371,46.487925,0 7.5806,46.488021,0 7.5807961,46.4880853,0 7.5815952,46.4884243,0</co [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5900055,46.5210825,0 7.590046,46.521112,0 7.590122,46.521211,0 7.590218,46.521275,0 7.590325,46.521253,0 7.590386,46.521219,0 7.590563,46.521275,0 7.590713,46.521298,0 7.590841,46.521428,0 7.590872,46.521404,0 7.590961,46.521528,0 7.590941,46.521642,0 7.590964,46.521732,0 7.591091,46.521789,0 7.591134,46.521776,0 7.5912266,46.5218003,0 7.591198,46.521758,0 7.591338,46.521783,0 7.591454,46.521725,0 7.591541,46.5217,0 7.591606,46.521663,0 7.5914358,46.5216049,0</ [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5788446,46.5204993,0 7.5787501,46.5204233,0 7.5786342,46.5202629,0 7.5782994,46.5200566,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5797057,46.509266,0 7.579856,46.508887,0 7.579984,46.509007,0 7.580344,46.509065,0 7.580417,46.509061,0 7.5806678,46.5089152,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5751655,46.4901109,0 7.575234,46.490227,0 7.575412,46.490443,0 7.575564,46.490731,0 7.575587,46.491121,0 7.575613,46.491252,0 7.5756106,46.4917412,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5718566,46.492604,0 7.5719484,46.4925554,0 7.5720948,46.4923908,0 7.5721505,46.4922987,0 7.5722725,46.4920071,0 7.5723428,46.4917874,0 7.5724562,46.4915977,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5299338,46.4850755,0 7.5298545,46.4853025,0 7.5296791,46.4856935,0 7.5292968,46.4861218,0 7.528969,46.4863518,0 7.5287592,46.4867026,0 7.5286528,46.4871826,0 7.5284947,46.4876225,0 7.5283193,46.4879071,0 7.5284171,46.4881687,0 7.5285206,46.4886632,0 7.5285629,46.4889495,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5611621,46.4717378,0 7.5611814,46.4715986,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5611814,46.4715986,0 7.5612549,46.47139,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5886158,46.521106,0 7.5882453,46.5211526,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5284782,46.4890732,0 7.5280137,46.4891138,0 7.527826,46.4891156,0 7.5277837,46.4891524,0 7.5275537,46.4892205,0 7.5273587,46.4891892,0 7.5272741,46.4893364,0 7.5271434,46.4897762,0 7.5270835,46.4902156,0 7.5269728,46.4906006,0 7.5266136,46.4908715,0 7.5262039,46.4908149,0 7.5263157,46.4908679,0 7.5264182,46.4909433,0 7.5267561,46.4910387,0 7.5270399,46.4912235,0 7.5267326,46.4911435,0 7.5260461,46.4911093,0 7.5256069,46.4911246,0 7.5252571,46.491094,0 7.5251971 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5284723,46.4889619,0 7.5284782,46.4890732,0 7.5284879,46.4891875,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.589224,46.5211243,0 7.5887088,46.5208145,0 7.5886158,46.521106,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5882453,46.5211526,0 7.587849,46.5206548,0 7.5876898,46.5205699,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5811876,46.5165553,0 7.581105,46.516431,0 7.581328,46.516318,0 7.5813369,46.5161948,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5572902,46.4904128,0 7.5569738,46.4903625,0 7.5567747,46.4902998,0 7.5565619,46.4901569,0 7.5564031,46.4900393,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5442063,46.4956444,0 7.5441027,46.4955627,0 7.543313,46.4953914,0 7.5417852,46.4952141,0 7.5384722,46.4958877,0 7.5378027,46.4959527,0 7.5386696,46.4954209,0 7.5404806,46.493666,0 7.5404463,46.4936187,0 7.5395536,46.4938492,0 7.539073,46.4940796,0 7.5377598,46.4944932,0 7.5374851,46.4946528,0 7.5371332,46.4947178,0 7.5368843,46.4946941,0 7.5364552,46.4944578,0 7.5350304,46.4942333,0 7.5356312,46.4942155,0 7.5346699,46.4938078,0 7.5345669,46.4938137,0 7.5337944, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5797311,46.5157548,0 7.5795577,46.5157983,0 7.5794887,46.5156381,0 7.5798922,46.5156733,0 7.5802352,46.5155193,0 7.5807117,46.5159997,0 7.5811935,46.5160699,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6240644,46.4319535,0 7.6229314,46.4322197,0 7.6225538,46.4321901,0 7.6223005,46.4319807,0 7.6220817,46.4317997,0 7.6217384,46.4311371,0 7.6211719,46.4303385,0 7.6206312,46.429321,0 7.6206397,46.428824,0 7.6206655,46.4282561,0 7.6202878,46.4277355,0 7.6201591,46.427138,0 7.6203136,46.4265109,0 7.6203994,46.4260021,0 7.6208887,46.4251619,0 7.621129,46.4249194,0 7.6213779,46.4249312,0 7.6214637,46.4246768,0 7.6217555,46.4245171,0 7.622056,46.424523,0 7.6221847,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5939523,46.4441727,0 7.5941669,46.4450295,0 7.5934587,46.4457548,0 7.5933515,46.4466271,0 7.5945316,46.4482231,0 7.5945316,46.4490074,0 7.594943,46.450099,0 7.5953899,46.4508259,0 7.5959049,46.4512694,0 7.5969564,46.4515798,0 7.5982438,46.4518016,0 7.5986526,46.4521268,0 7.5989734,46.4519199,0 7.5995956,46.4519199,0 7.6003692,46.4512982,0 7.6023637,46.4513285,0 7.6027285,46.4516685,0 7.6031576,46.451639,0 7.6036941,46.4516537,0 7.6038443,46.4518311,0 7.6055823, [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.565617,46.454428,0 7.5666152,46.4552017,0 7.5666581,46.4555121,0 7.5668942,46.4560583,0 7.5663148,46.4560591,0 7.5659082,46.4558226,0 7.5657784,46.4563547,0 7.5656925,46.4567539,0 7.5652732,46.457071,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5631545,46.4467541,0 7.5632249,46.4472628,0 7.5633107,46.4479429,0 7.5632249,46.4485269,0 7.5631498,46.449,0 7.5635575,46.4492214,0 7.5643198,46.4494214,0 7.5645982,46.4497762,0 7.5646202,46.4501898,0 7.5648128,46.4507002,0 7.5644372,46.4508776,0 7.5647162,46.4511359,0 7.5650917,46.4512546,0 7.5650702,46.4513876,0 7.5658749,46.4517424,0 7.5653385,46.4518016,0 7.5646947,46.4515503,0 7.5639115,46.4515724,0 7.5640939,46.4518459,0 7.5642225,46.4520855,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5145904,46.4695704,0 7.5139015,46.469419,0 7.5126127,46.4689973,0 7.510378,46.4680514,0 7.5095656,46.4678181,0 7.5084436,46.4667202,0 7.5071567,46.4661894,0 7.505739,46.4654072,0 7.5052464,46.4648341,0 7.5041354,46.4642962,0 7.5039997,46.4641152,0 7.5025871,46.4638186,0 7.5017828,46.463507,0 7.5013203,46.4635723,0 7.5007337,46.4632858,0 7.5001289,46.4627517,0 7.5002388,46.4623825,0 7.5000975,46.462029,0 7.4998932,46.4618562,0 7.4996275,46.4618288,0 7.4998608,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4392764,46.5663903,0 7.4384143,46.5654398,0 7.4383285,46.5644956,0 7.4369552,46.5639645,0 7.4358394,46.5630793,0 7.4334362,46.5624892,0 7.4318054,46.561545,0 7.4313762,46.5601286,0 7.4301746,46.5598335,0 7.4283721,46.5600106,0 7.4268272,46.5598925,0 7.4253681,46.5597745,0 7.4243488,46.5597302,0 7.4237311,46.5597542,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6025506,46.5498156,0 7.6028653,46.5497501,0 7.6028389,46.54964,0 7.6031894,46.5495721,0 7.6035778,46.5494457,0 7.6037914,46.5494037,0 7.6040446,46.549479,0 7.6042355,46.5496465,0 7.6045554,46.5500853,0 7.604603,46.550328,0 7.6047518,46.55048,0 7.604832,46.550562,0 7.6048525,46.5506675,0 7.604877,46.550899,0 7.60495,46.550924,0 7.6051,46.551122,0 7.605191,46.551234,0 7.605464,46.551456,0 7.605639,46.551512,0 7.605784,46.551733,0 7.605943,46.551818,0 7.606095,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5849029,46.5115884,0 7.58481,46.5116222,0 7.5846421,46.5115122,0 7.5846131,46.5115867,0 7.5845005,46.5115558,0 7.5843126,46.5114523,0 7.584142,46.5112744,0 7.5839847,46.5111716,0 7.5834605,46.5109729,0 7.5833227,46.5109291,0 7.5831168,46.5109274,0 7.5827628,46.5107142,0 7.5825833,46.5106646,0 7.5823735,46.5106181,0 7.5820585,46.510608,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5620328,46.4912044,0 7.5624485,46.4911228,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5870469,46.5174702,0 7.5869142,46.5174469,0 7.5867683,46.5173533,0 7.5866814,46.5173433,0 7.5865673,46.5172963,0 7.5864711,46.5172304,0 7.5864401,46.5171526,0 7.5864303,46.5170445,0 7.5861962,46.5172065,0 7.5861315,46.5173462,0 7.5861156,46.5174414,0 7.5860537,46.5175235,0 7.5860095,46.5175323,0 7.5859337,46.5175202,0 7.5858968,46.5174461,0 7.5858323,46.5174205,0 7.5857805,46.5174263,0 7.5855589,46.517562,0 7.5853542,46.517598,0 7.5850387,46.5177229,0 7.5848903 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6168363,46.5609385,0 7.6169212,46.5608065,0 7.6169276,46.5608025,0 7.61705,46.560728,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.580134,46.5028204,0 7.5796817,46.5029734,0 7.5793242,46.5029233,0 7.579196,46.503146,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.580325,46.5027273,0 7.5804032,46.5026495,0 7.5801302,46.5020994,0 7.58,46.501965,0 7.5796142,46.5018839,0 7.578915,46.5018479,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.489344,46.4970621,0 7.4894459,46.4970965,0 7.4895445,46.4970424,0 7.4896947,46.4970225,0 7.4897056,46.4969934,0 7.4898076,46.4969784,0 7.4899233,46.4970458,0 7.4901552,46.4970463,0 7.4902717,46.4970463,0 7.4903687,46.4970477,0 7.4904743,46.4971045,0 7.4906798,46.4971168,0 7.4907075,46.497224,0 7.4909032,46.4972302,0 7.4910534,46.4972581,0 7.4912316,46.4972956,0 7.4913717,46.4972872,0 7.4914988,46.4973022,0 7.4915715,46.4972667,0 7.4916332,46.4972247,0 7.4918452 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5810925,46.497901,0 7.580999,46.498044,0 7.580567,46.497948,0 7.5805282,46.4980101,0 7.580489,46.498073,0 7.5806637,46.4981927,0 7.580764,46.498291,0 7.580732,46.498332,0 7.5806387,46.4983733,0 7.5803456,46.4986969,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5868088,46.5114574,0 7.5867929,46.5114531,0 7.5867416,46.5114409,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5875342,46.512005,0 7.5873571,46.5120171,0 7.5869236,46.5118061,0 7.5868421,46.5116025,0 7.5868468,46.5114841,0 7.5868088,46.5114574,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5633366,46.4810949,0 7.563085,46.4812124,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5461028,46.4845429,0 7.5460141,46.4844262,0 7.5458652,46.4843459,0 7.5456547,46.4842848,0 7.5455029,46.4842106,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4579366,46.4368633,0 7.4561507,46.438472,0 7.4554266,46.4407469,0 7.4562657,46.4407434,0 7.4565824,46.4408413,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Margeliweg</name>
+          <description>Margeliweg, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5702308,46.4974098,0 7.5701367,46.4975929,0 7.570127,46.497612,0 7.569897,46.497685,0 7.5695,46.497694,0 7.569391,46.497615,0 7.569158,46.49761,0 7.569122,46.497717,0 7.569308,46.49812,0 7.570074,46.498377,0 7.57033,46.498687,0 7.5705898,46.498823,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5685948,46.4864379,0 7.5688213,46.4863868,0 7.5691195,46.4862141,0 7.569185,46.4860615,0 7.5693007,46.4859109,0 7.5694777,46.4858092,0 7.5698205,46.4856595,0 7.5701528,46.485471,0 7.5704268,46.485429,0 7.5706475,46.4853774,0 7.5710397,46.4852471,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5677844,46.4896259,0 7.567876,46.4895408,0 7.567961,46.489547,0 7.5679627,46.4894969,0 7.5680063,46.4894105,0 7.5680732,46.4893894,0 7.5681704,46.489411,0 7.5682202,46.4893757,0 7.5682202,46.489292,0 7.5682275,46.4892296,0 7.5682582,46.4891723,0 7.5683261,46.4891145,0 7.5683411,46.4890816,0 7.5683272,46.4889471,0 7.5684098,46.4889418,0 7.5685373,46.4889605,0 7.5687317,46.4889811,0 7.5688378,46.4889221,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.571083,46.4852752,0 7.5712609,46.4852006,0 7.5714092,46.4851008,0 7.5715368,46.4849655,0 7.571555,46.4849207,0 7.5718393,46.4846598,0 7.5719243,46.4846003,0 7.5721098,46.484547,0 7.5721753,46.4845139,0 7.5722317,46.4845225,0 7.572362,46.4844702,0 7.5724345,46.4844726,0 7.5724951,46.4845446,0 7.5725829,46.484605,0 7.5727,46.484345,0 7.5728469,46.4841998,0 7.5728858,46.4841269,0 7.5730058,46.4840919,0 7.5730633,46.4841159,0 7.573079,46.4840679,0 7.5731306,46.4841 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5684612,46.487926,0 7.5684632,46.487807,0 7.5684908,46.4874257,0 7.5683489,46.4873599,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5756624,46.4951092,0 7.5750979,46.4947883,0 7.5743523,46.4946252,0 7.5737649,46.4942215,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5728372,46.4890235,0 7.5727436,46.4888729,0 7.5722582,46.4884277,0 7.5718875,46.4882051,0 7.5717091,46.4881898,0 7.5714861,46.4882473,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <description>, Summer Walking Path</description>
+          <styleUrl>#style-Summer_Hiking</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.563239,46.4912821,0 7.5633949,46.4913423,0 7.5634393,46.4913395,0 7.5642021,46.4916877,0 7.564343,46.4917357,0 7.5645316,46.4919494,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+    </Folder>
+    <Folder>
+      <name>Waterways</name>
+      <Folder>
+        <name>Waterway_River</name>
+        <Style id="style-Waterway_River">
+          <LineStyle>
+            <color>#a0ea8b17</color>
+            <width>8</width>
+          </LineStyle>
+        </Style>
+        <Placemark>
+          <name>Rotten</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>8.3809611,46.5793095,0 8.3810126,46.578759,0 8.3804404,46.5779554,0 8.3798931,46.577374,0 8.3796941,46.57669,0 8.3797688,46.5757666,0 8.3793707,46.5750997,0 8.3802912,46.574313,0 8.3811619,46.5730647,0 8.3808633,46.5722438,0 8.3797328,46.5712548,0 8.3789478,46.5704823,0 8.3785,46.5695246,0 8.3773308,46.56908,0 8.375067,46.567746,0 8.3744202,46.5672671,0 8.3728778,46.5667711,0 8.3720818,46.5664119,0 8.3707135,46.5663948,0 8.3695194,46.5661554,0 8.3686985,46.565471 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Engstlige</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6022785,46.5401947,0 7.6025091,46.540512,0 7.6031368,46.5413754,0 7.6026218,46.5429104,0 7.6027935,46.5440911,0 7.6017635,46.5453898,0 7.602103,46.5468677,0 7.6022785,46.5471607,0 7.6033085,46.5479872,0 7.6043384,46.5489316,0 7.6057117,46.54964,0 7.6057117,46.5507025,0 7.6077717,46.5521191,0 7.6090281,46.5540874,0 7.6097828,46.554791,0 7.6104014,46.5553546,0 7.6122349,46.5567229,0 7.6142948,46.556959,0 7.6150274,46.5575363,0 7.6158784,46.5582068,0 7.6165495,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4148104,46.4967759,0 7.4160013,46.4959967,0 7.4175624,46.4951252,0 7.4178913,46.4949773,0 7.4184173,46.4947409,0 7.4193487,46.4946931,0 7.4201105,46.4947596,0 7.4212638,46.4950993,0 7.4229066,46.4958041,0 7.4239943,46.496366,0 7.4253086,46.4972116,0 7.4259845,46.4977434,0 7.4264298,46.4983564,0 7.4267034,46.4990432,0 7.427154,46.4997744,0 7.4279211,46.5003061,0 7.4291656,46.5007825,0 7.4300186,46.5014102,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Simme</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4148104,46.4967759,0 7.4140004,46.4972966,0 7.4128648,46.4984032,0 7.4120378,46.4988758,0 7.4116834,46.4993483,0 7.4114471,46.5002048,0 7.4109746,46.5010613,0 7.4102738,46.5016021,0 7.4094683,46.5017406,0 7.4089071,46.5017111,0 7.4082574,46.5019769,0 7.4079333,46.5023075,0 7.4067806,46.5030402,0 7.4056266,46.5035924,0 7.4046502,46.5039764,0 7.4037385,46.504192,0 7.4032394,46.5044749,0 7.402762,46.5046706,0 7.4023435,46.5047998,0 7.4018339,46.5048885,0 7.4011395 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Simme</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4429173,46.4572666,0 7.4429683,46.4571225,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Simme</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.44395,46.4543877,0 7.443789,46.4545688,0 7.4436469,46.4548072,0 7.4435745,46.4550326,0 7.443494,46.4555186,0 7.443441,46.455818,0 7.443435,46.4561136,0 7.4433377,46.4564021,0 7.4429683,46.4571225,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Simme</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4612723,46.4333085,0 7.45888,46.4355827,0 7.4579349,46.4367641,0 7.4560742,46.4384476,0 7.4554244,46.4400129,0 7.455212,46.4413715,0 7.4552472,46.4423757,0 7.4547003,46.4438428,0 7.4532036,46.4478792,0 7.4527959,46.449025,0 7.4522863,46.4494907,0 7.4515084,46.4499268,0 7.4496061,46.4508817,0 7.4446738,46.4539829,0 7.4442665,46.4542916,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Simme</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4442665,46.4542916,0 7.4441377,46.4543619,0 7.44395,46.4543877,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5823262,46.3982278,0 7.5836565,46.3984054,0 7.5848002,46.398503,0 7.5847788,46.3978223,0 7.5848431,46.3973118,0 7.5854654,46.3969048,0 7.5862915,46.3966828,0 7.5870533,46.3968456,0 7.5876434,46.3967346,0 7.5876648,46.3963795,0 7.5874717,46.3958763,0 7.5879121,46.395537,0 7.5886701,46.3953454,0 7.5898039,46.395609,0 7.5912654,46.3960014,0 7.5926709,46.3963765,0 7.5938339,46.3967716,0 7.596617,46.3973843,0 7.5990921,46.3975722,0 7.6018644,46.3974561,0 7.6032688,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Simme</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4145422,46.4951732,0 7.4142955,46.4947005,0 7.4144778,46.4943903,0 7.4168811,46.4925068,0 7.4176214,46.4915687,0 7.4179647,46.4914284,0 7.4194131,46.4914801,0 7.4201304,46.4912558,0 7.4213014,46.490638,0 7.4221978,46.4901039,0 7.4230395,46.4899437,0 7.4239108,46.4895723,0 7.4250036,46.4889521,0 7.4259192,46.4881251,0 7.4262736,46.4870323,0 7.4262441,46.4857623,0 7.4258601,46.4834291,0 7.4260078,46.4823658,0 7.4290744,46.4758704,0 7.4296701,46.4748344,0 7.430231 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5848002,46.398503,0 7.5848152,46.3989973,0 7.5849719,46.3993465,0 7.5851104,46.3997361,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5926709,46.3963765,0 7.5940689,46.396307,0 7.5958359,46.3966059,0 7.5970139,46.3966103,0 7.5990503,46.3969699,0 7.6011746,46.3970535,0 7.6032688,46.3970143,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.617414,46.3854152,0 7.6178217,46.3849933,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6190072,46.3886233,0 7.6193077,46.3883828,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6198816,46.3890377,0 7.620123,46.3887972,0 7.6201366,46.3881642,0 7.6199113,46.3874908,0 7.6200401,46.3867211,0 7.6205486,46.38637,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6181114,46.3727879,0 7.6185084,46.3726473,0 7.6190448,46.3726399,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Engstlige</name>
+          <styleUrl>#style-Waterway_River</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5679163,46.4904384,0 7.5682865,46.490783,0 7.56887,46.4909814,0 7.5690784,46.4912436,0 7.5690856,46.4915223,0 7.569252,46.4918013,0 7.5692638,46.4922844,0 7.569386,46.4926358,0 7.5694157,46.4934985,0 7.5699636,46.4939489,0 7.5700405,46.4942176,0 7.5699498,46.4946884,0 7.5705973,46.4953414,0 7.5713722,46.4959515,0 7.5716743,46.4961181,0 7.5720713,46.4967711,0 7.5722066,46.4968701,0 7.5723745,46.4969336,0 7.572558,46.4968807,0 7.5730315,46.4969189,0 7.5734753,46. [...]
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Waterway_Stream</name>
+        <Style id="style-Waterway_Stream">
+          <LineStyle>
+            <color>#a0ea8b17</color>
+            <width>4</width>
+          </LineStyle>
+        </Style>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4482603,46.4605075,0 7.4479974,46.4601472,0 7.4477238,46.4599273,0 7.4475369,46.4598635,0 7.4465542,46.459732,0 7.4454239,46.4596948,0 7.4441592,46.4598904,0 7.4427902,46.4601787,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4427902,46.4601787,0 7.4422655,46.4603116,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4422655,46.4603116,0 7.4420697,46.4603689,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Tschentbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5498993,46.5131535,0 7.5516111,46.512984,0 7.5534331,46.5128769,0 7.5551428,46.5130268,0 7.556419,46.5133488,0 7.5568307,46.5137849,0 7.5571667,46.5138959,0 7.5583266,46.514089,0 7.5589673,46.5141025,0 7.5609632,46.5138736,0 7.5615361,46.5137486,0 7.5622618,46.5133878,0 7.5633041,46.5130869,0 7.5638865,46.5131159,0 7.5649706,46.5131294,0 7.565441,46.5131179,0 7.5657838,46.5130325,0 7.5664322,46.5130568,0 7.5671807,46.5131231,0 7.5683759,46.5133121,0 7.569028,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Tschentbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5796094,46.5155709,0 7.5798811,46.5155784,0 7.5804693,46.5157084,0 7.5808291,46.5159788,0 7.581439,46.5159571,0 7.5819875,46.5161131,0 7.5828673,46.5159575,0 7.5835048,46.5163951,0 7.5840989,46.5164935,0 7.5842966,46.5165233,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bonderlenbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5950493,46.4758228,0 7.5907678,46.4813085,0 7.5897696,46.4824297,0 7.5889451,46.4849235,0 7.588016,46.4856619,0 7.5871102,46.4859308,0 7.5866819,46.4864895,0 7.5847333,46.4880633,0 7.5834673,46.4887214,0 7.5817525,46.4898969,0 7.5814474,46.4901303,0 7.5810387,46.490633,0 7.5801554,46.4913069,0 7.5799536,46.4916604,0 7.5792927,46.4922356,0 7.5790885,46.4927514,0 7.5784129,46.4935776,0 7.5784782,46.494305,0 7.578291,46.4948469,0 7.5783849,46.4950906,0 7.5778436,4 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5864107,46.5038145,0 7.5849124,46.5043821,0 7.5842642,46.5051023,0 7.5834123,46.505664,0 7.582847,46.5058125,0 7.5826781,46.5057472,0 7.5823863,46.5057664,0 7.5821249,46.505979,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5901733,46.4963584,0 7.5878156,46.4992787,0 7.5872543,46.4997632,0 7.5868956,46.5001347,0 7.5862173,46.5005062,0 7.5854443,46.5007068,0 7.5845889,46.5007134,0 7.5841943,46.5006119,0 7.5836448,46.5004516,0 7.5831399,46.5005241,0 7.5821281,46.5010073,0 7.5802143,46.50181,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6031924,46.5097266,0 7.5935129,46.513263,0 7.5907758,46.5139709,0 7.5894533,46.5145143,0 7.5885612,46.5149031,0 7.5883184,46.5153558,0 7.5880954,46.5157955,0 7.586282,46.5170016,0 7.5857963,46.5175161,0 7.5856085,46.5179936,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.627585,46.5698201,0 7.6274104,46.5701313,0 7.6247923,46.57119,0 7.6243015,46.5713244,0 7.6229993,46.5714951,0 7.6219771,46.5717669,0 7.6195533,46.5723564,0 7.618023,46.5727097,0 7.6164988,46.5733015,0 7.6160679,46.5736132,0 7.615965,46.573772,0 7.6158862,46.574073,0 7.6158473,46.5742219,0 7.6155516,46.5747077,0 7.6118253,46.5770347,0 7.6101343,46.5797527,0 7.6049675,46.5845394,0 7.6009691,46.5902559,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Krummenbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4345353,46.4542156,0 7.4375443,46.4530688,0 7.4379198,46.4525218,0 7.4388861,46.4520338,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Krummenbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4388861,46.4520338,0 7.4394596,46.4521561,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Krummenbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4394596,46.4521561,0 7.440223,46.4521175,0 7.4411836,46.4522683,0 7.4419013,46.4524977,0 7.442767,46.4530941,0 7.4435144,46.4537976,0 7.4438251,46.4541901,0 7.44395,46.4543877,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6043384,46.5489316,0 7.6036134,46.5492848,0 7.6020999,46.5497933,0 7.6016803,46.5498747,0 7.6010186,46.5501518,0 7.5938758,46.5534441,0 7.5928254,46.5539036,0 7.5921917,46.5543492,0 7.5913683,46.5548097,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6097828,46.554791,0 7.6092077,46.5550334,0 7.6083698,46.555712,0 7.6069001,46.556455,0 7.6046978,46.5571409,0 7.6034027,46.5574888,0 7.6029575,46.5586298,0 7.6021076,46.559089,0 7.6011565,46.5596316,0 7.5990811,46.560389,0 7.5971888,46.5607735,0 7.5962684,46.5607439,0 7.5949954,46.5611342,0 7.5936106,46.5614773,0 7.592888,46.5622047,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Engstlige</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5694288,46.4386699,0 7.5689025,46.4392606,0 7.568774,46.43946,0 7.568331,46.439699,0 7.567927,46.44015,0 7.567747,46.440192,0 7.567521,46.44046,0 7.5667949,46.4408454,0 7.5660904,46.4414907,0 7.565442,46.441646,0 7.5644443,46.4421245,0 7.5642466,46.4424135,0 7.56422,46.442644,0 7.5632839,46.443386,0 7.5615746,46.4449583,0 7.5621347,46.4456216,0 7.5626654,46.4466302,0 7.5627503,46.4485911,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5684827,46.4381903,0 7.568705,46.4386855,0 7.5687017,46.4389496,0 7.5689025,46.4392606,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5646506,46.4447386,0 7.5645313,46.4447993,0 7.5644484,46.4450193,0 7.5640955,46.4450566,0 7.5638276,46.4451873,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Engstligfall</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5627503,46.4485911,0 7.5629257,46.4519973,0 7.5622285,46.4525302,0 7.5607905,46.4537849,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5620068,46.5282186,0 7.5616241,46.5285431,0 7.5612987,46.5290602,0 7.5610529,46.5299302,0 7.5611554,46.5308279,0 7.5614905,46.5326035,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Otterbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5888244,46.5220523,0 7.5871462,46.521574,0 7.5861579,46.5215056,0 7.5848115,46.5211241,0 7.5830923,46.5211693,0 7.580815,46.522144,0 7.5765962,46.5222701,0 7.5744876,46.5222718,0 7.5650623,46.5253673,0 7.5641575,46.5257686,0 7.5630746,46.526248,0 7.562304,46.5273981,0 7.5621005,46.5277942,0 7.5620068,46.5282186,0 7.5620048,46.5291866,0 7.5623207,46.5299472,0 7.5624241,46.5306152,0 7.5627651,46.5313534,0 7.5628991,46.531972,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6030484,46.5615227,0 7.6049878,46.5605166,0 7.6063117,46.5602212,0 7.6087389,46.5599177,0 7.6107247,46.5592709,0 7.6120968,46.5587128,0 7.6127925,46.5583692,0 7.6139269,46.5579905,0 7.6150274,46.5575363,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5897984,46.5505716,0 7.590784,46.549945,0 7.5924214,46.5492396,0 7.5962237,46.5481799,0 7.5984549,46.547619,0 7.5998111,46.5476291,0 7.602103,46.5468677,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6025091,46.540512,0 7.6004436,46.5410848,0 7.5997811,46.5413145,0 7.5993888,46.5415236,0 7.5987378,46.5417055,0 7.5981278,46.5415615,0 7.5960941,46.5413591,0 7.5895257,46.5433921,0 7.5862162,46.545057,0 7.5845458,46.5461244,0 7.5839739,46.5467957,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Bettbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5952076,46.5310701,0 7.5933564,46.5308251,0 7.5920313,46.5309442,0 7.5907951,46.5309688,0 7.5893698,46.5311437,0 7.5871115,46.5320641,0 7.5840636,46.5327994,0 7.5808357,46.5338491,0 7.5792828,46.5348533,0 7.5769635,46.5361725,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5632368,46.463919,0 7.5643968,46.463232,0 7.5657493,46.4626938,0 7.5683745,46.4623092,0 7.5707137,46.4620696,0 7.5751947,46.4618406,0 7.5771588,46.4618878,0 7.5796521,46.4627464,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.563575,46.4676896,0 7.564838,46.4677747,0 7.5668754,46.4675639,0 7.5702666,46.4666669,0 7.572771,46.4663288,0 7.5792436,46.4665687,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.563948,46.4668286,0 7.5654428,46.4666022,0 7.5697357,46.466088,0 7.5727472,46.4655845,0 7.5754053,46.4654321,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Waleggbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4408874,46.4624093,0 7.4405704,46.4620447,0 7.4382377,46.4605186,0 7.4374644,46.459883,0 7.4365609,46.459575,0 7.4343172,46.4589405,0 7.4305385,46.4591194,0 7.4286491,46.4587615,0 7.4281059,46.4584361,0 7.4259568,46.4575088,0 7.4244689,46.4571508,0 7.4239493,46.457281,0 7.423477,46.4564838,0 7.4226976,46.4560282,0 7.4220836,46.4550682,0 7.4213514,46.4545313,0 7.420265,46.4548567,0 7.4199816,46.4538642,0 7.419155,46.4534249,0 7.4176945,46.4527747,0 7.4167971,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.455212,46.4413715,0 7.4541445,46.440869,0 7.4523968,46.4403156,0 7.4508381,46.4397623,0 7.4500823,46.4393554,0 7.4491849,46.4388834,0 7.4487125,46.4384277,0 7.4484055,46.4379557,0 7.4480512,46.4371582,0 7.4469176,46.436377,0 7.4457368,46.4358887,0 7.4445087,46.4352702,0 7.4440363,46.4346517,0 7.4439891,46.4340983,0 7.443871,46.4334961,0 7.4439419,46.433138,0 7.4434931,46.4326659,0 7.4430916,46.4320474,0 7.4427846,46.4316567,0 7.441651,46.4311359,0 7.4410369,46. [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Gilsbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5444891,46.4838255,0 7.5441715,46.4835228,0 7.543632,46.4826983,0 7.5431692,46.482315,0 7.5427131,46.4818558,0 7.5424228,46.4811668,0 7.5418523,46.4805595,0 7.5414058,46.4804053,0 7.5410234,46.4801636,0 7.5404661,46.4792391,0 7.5401919,46.478841,0 7.5391844,46.4774431,0 7.5389666,46.4766853,0 7.5386024,46.4761968,0 7.5383865,46.4757296,0 7.5376236,46.4739031,0 7.537638,46.4735448,0 7.5382409,46.4729685,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5579549,46.4702079,0 7.5585842,46.4702669,0 7.5596437,46.4708957,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5610883,46.4713922,0 7.5596437,46.4708957,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6113718,46.5266965,0 7.610492,46.5267482,0 7.6098322,46.5271948,0 7.6091348,46.5277705,0 7.6084374,46.5283758,0 7.6074933,46.5287818,0 7.6072465,46.5290438,0 7.606989,46.5291951,0 7.6063078,46.5294461,0 7.6059752,46.5295568,0 7.6051061,46.5297709,0 7.6038991,46.5300772,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.6011565,46.5596316,0 7.600767,46.5601643,0 7.6003628,46.5608149,0 7.6000703,46.5616961,0 7.5995972,46.5624472,0 7.5990811,46.5628907,0 7.5982726,46.5633757,0 7.5976963,46.5635176,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5622868,46.4987922,0 7.563293,46.498268,0 7.5640554,46.4980879,0 7.5649734,46.4979027,0 7.5661467,46.4975824,0 7.5672189,46.4974246,0 7.5679539,46.4973689,0 7.5684799,46.4974478,0 7.5689384,46.4976242,0 7.5694981,46.4977727,0 7.570604,46.4978563,0 7.5716963,46.4978702,0 7.5722763,46.4977959,0 7.5730315,46.4969189,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Allebach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5396772,46.4842367,0 7.5411265,46.4838022,0 7.5436247,46.4837589,0 7.5442613,46.4839194,0 7.5444006,46.4838783,0 7.5444891,46.4838255,0 7.5460021,46.483802,0 7.5486107,46.4844951,0 7.5496668,46.4846853,0 7.5502713,46.4849285,0 7.550623,46.485323,0 7.5523906,46.4863698,0 7.5529233,46.4865507,0 7.5537024,46.4865959,0 7.5547532,46.4867557,0 7.5592633,46.4879144,0 7.5604607,46.4882109,0 7.562318,46.4882312,0 7.5628498,46.4883362,0 7.5651569,46.489581,0 7.5658291,46 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Engstlige</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5607905,46.4537849,0 7.5604924,46.4541209,0 7.560399,46.454507,0 7.5606654,46.4568691,0 7.5619095,46.4595042,0 7.5625295,46.4614662,0 7.5626063,46.4627988,0 7.5632368,46.463919,0 7.5637327,46.4648,0 7.5640365,46.4664917,0 7.563948,46.4668286,0 7.5639095,46.4669753,0 7.563575,46.4676896,0 7.5632036,46.4684826,0 7.562787,46.4697544,0 7.5623296,46.4703181,0 7.5619262,46.4705013,0 7.5613885,46.4709202,0 7.56112,46.4712946,0 7.5610883,46.4713922,0 7.5611153,46.47161 [...]
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5962122,46.5089224,0 7.5886622,46.5110814,0 7.5869149,46.5114364,0 7.5829228,46.5126941,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.5641575,46.5257686,0 7.5613671,46.5258087,0 7.5604396,46.5259298,0 7.5596879,46.5260952,0 7.5590727,46.5263174,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4458894,46.38078,0 7.445546,46.3804839,0 7.4447092,46.3800546,0 7.4438509,46.379951,0 7.4439796,46.3802767,0 7.4442371,46.3809132,0 7.4443659,46.3813425,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.4452456,46.3812536,0 7.4444517,46.3803803,0 7.4438509,46.379951,0 7.4431428,46.3797808,0 7.4419411,46.3796031,0 7.4409755,46.3796993,0 7.4399348,46.3796919,0 7.4392482,46.3795143,0 7.4387225,46.3794773,0 7.4384221,46.3795365,0 7.4379286,46.379766,0 7.4372848,46.3803581,0 7.4369522,46.3810612,0</coordinates>
+          </LineString>
+        </Placemark>
+        <Placemark>
+          <name>Schmittenbach</name>
+          <styleUrl>#style-Waterway_Stream</styleUrl>
+          <LineString>
+            <altitudeMode>relativeToGround</altitudeMode>
+            <coordinates>7.561025,46.4950847,0 7.5620763,46.4944701,0 7.562971,46.4940767,0 7.5634598,46.4938949,0 7.564526,46.4932355,0 7.5657085,46.4926575,0 7.5662682,46.492473,0 7.5667333,46.4923318,0 7.5674467,46.4921962,0 7.5692638,46.4922844,0</coordinates>
+          </LineString>
+        </Placemark>
+      </Folder>
+      <Folder>
+        <name>Waterway_Canal</name>
+        <Style id="style-Waterway_Canal">
+          <LineStyle>
+            <color>#a0ea8b17</color>
+            <width>4</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+      <Folder>
+        <name>Waterway_Drain</name>
+        <Style id="style-Waterway_Drain">
+          <LineStyle>
+            <color>#a0ea8b17</color>
+            <width>2</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+    </Folder>
+    <Folder>
+      <name>Railways</name>
+      <Folder>
+        <name>Railway_Rail_Casing</name>
+        <Style id="style-Railway_Rail_Casing">
+          <LineStyle>
+            <color>#80ffffff</color>
+            <width>6</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+      <Folder>
+        <name>Railway_Rail_Core</name>
+        <Style id="style-Railway_Rail_Core">
+          <LineStyle>
+            <color>#ff000000</color>
+            <width>4</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+      <Folder>
+        <name>Railway_Lightrail</name>
+        <Style id="style-Railway_Lightrail">
+          <LineStyle>
+            <color>#ff000000</color>
+            <width>4</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+      <Folder>
+        <name>Railway_Tram</name>
+        <Style id="style-Railway_Tram">
+          <LineStyle>
+            <color>#ff000000</color>
+            <width>2</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+    </Folder>
+    <Folder>
+      <name>Natural_Features</name>
+      <Folder>
+        <name>Cliff</name>
+        <Style id="style-Cliff">
+          <LineStyle>
+            <color>#ff8b8b8b</color>
+            <width>2</width>
+          </LineStyle>
+        </Style>
+      </Folder>
+    </Folder>
+    <Folder>
+      <name>Roads</name>
+      <Folder>
+        <name>Core</name>
+        <Folder>
+          <name>Motorway</name>
+          <Style id="style-Motorway">
+            <LineStyle>
+              <color>#ffbf3333</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Motorway_Link</name>
+          <Style id="style-Motorway_Link">
+            <LineStyle>
+              <color>#ffbf3333</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Trunk</name>
+          <Style id="style-Trunk">
+            <LineStyle>
+              <color>#ff17cfea</color>
+              <width>6</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Trunk_Link</name>
+          <Style id="style-Trunk_Link">
+            <LineStyle>
+              <color>#ff17cfea</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Primary</name>
+          <Style id="style-Primary">
+            <LineStyle>
+              <color>#ff17cfea</color>
+              <width>4</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Primary_Link</name>
+          <Style id="style-Primary_Link">
+            <LineStyle>
+              <color>#ff17cfea</color>
+              <width>2</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Secondary</name>
+          <Style id="style-Secondary">
+            <LineStyle>
+              <color>#ff17e8ea</color>
+              <width>4</width>
+            </LineStyle>
+          </Style>
+          <Placemark>
+            <name>Lenkstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4421289,46.4613278,1 7.4424372,46.4608567,1 7.4425659,46.4606405,1 7.4426223,46.4604964,1 7.4426893,46.4602414,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lenkstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4323137,46.4764918,1 7.4336701,46.4747049,1 7.4348985,46.4732419,1 7.4359588,46.472141,1 7.4370811,46.4707552,1 7.4377578,46.4699427,1 7.4380689,46.469466,1 7.4384373,46.46873,1 7.4387197,46.4681415,1 7.4387985,46.4679364,1 7.4388238,46.4677498,1 7.4388285,46.4674118,1 7.4388628,46.4671901,1 7.4389654,46.4669807,1 7.4390935,46.4668317,1 7.4398408,46.466209,1 7.4400461,46.4659856,1 7.4402163,46.4657472,1 7.4403488,46.4655089,1 7.4404453,46.465217,1 7.4406961,4 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lenkstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4245844,46.4920082,1 7.4262126,46.4909139,1 7.4265951,46.4906478,1 7.4269109,46.4904109,1 7.4271226,46.4901976,1 7.4272528,46.4900189,1 7.4272987,46.4897359,1 7.4273256,46.4892013,1 7.4274383,46.4887803,1 7.427669,46.4881746,1 7.427858,46.4877541,1 7.4279747,46.4875615,1 7.4281029,46.4874142,1 7.4283818,46.4871409,1 7.4290041,46.4866386,1 7.4293903,46.4862988,1 7.4296806,46.4859289,1 7.4299413,46.4854299,1 7.430212,46.4846591,1 7.4303388,46.4844164,1 7.430592 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lenkstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4191059,46.4991161,1 7.4194662,46.4987815,1 7.4197451,46.4984344,1 7.4198288,46.4982833,1 7.4198964,46.4981614,1 7.4200241,46.4977476,1 7.4201298,46.4970122,1 7.4203128,46.4962737,1 7.4204663,46.4959279,1 7.4206823,46.4955804,1 7.4210493,46.4951362,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lenkstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.421178,46.4949811,1 7.42196,46.4940534,1 7.4224211,46.4935642,1 7.4227418,46.4933061,1 7.4230877,46.4930497,1 7.4245844,46.4920082,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lenkstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4210493,46.4951362,1 7.421178,46.4949811,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lenkstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.442705,46.4601691,1 7.4427198,46.4601214,1 7.4427644,46.4599513,1 7.4428057,46.4598036,1 7.442913,46.4596483,1 7.4430721,46.4594012,1 7.4431497,46.4591692,1 7.443156,46.4590737,1 7.4431495,46.4589587,1 7.442987,46.4576685,1 7.4429961,46.4574482,1 7.4430461,46.4572518,1 7.4430622,46.4571982,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lenkstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4426893,46.4602414,1 7.442705,46.4601691,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Landstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5690779,46.4942399,1 7.5692844,46.4945619,1 7.5698423,46.4953005,1 7.5709768,46.4961208,1 7.5713873,46.4963345,1 7.5716754,46.4967489,1 7.5721169,46.4972208,1 7.5741339,46.4978412,1 7.5749927,46.4993482,1 7.5753145,46.5003082,1 7.5763776,46.5014193,1 7.5765386,46.5015899,1 7.5769888,46.501843,1 7.5784191,46.501918,1 7.5789112,46.5019253,1 7.5796023,46.5019527,1 7.5798635,46.5020363,1 7.5800494,46.5021673,1 7.580325,46.5027273,1 7.5803532,46.5027703,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6122594,46.5585364,1 7.6122192,46.5585079,1 7.610827,46.5573928,1 7.6094322,46.5564928,1 7.6086383,46.5555632,1 7.6077585,46.5551205,1 7.6058702,46.5535859,1 7.6048832,46.5526563,1 7.6046901,46.5520365,1 7.6040249,46.5516086,1 7.6028571,46.5505041,1 7.6026829,46.5500915,1 7.6025506,46.5498156,1 7.6025022,46.5497569,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6025022,46.5497569,1 7.6023929,46.5496256,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.612416,46.5586345,1 7.6122594,46.5585364,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6001154,46.5474612,1 7.6002652,46.547606,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6246335,46.5705545,1 7.6246247,46.5705495,1 7.6242166,46.5702873,1 7.6233582,46.5694317,1 7.6227574,46.5683549,1 7.6224141,46.5680303,1 7.6221411,46.5675483,1 7.6218995,46.5671196,1 7.6216416,46.5666731,1 7.6211267,46.5661273,1 7.6204829,46.5648438,1 7.6191955,46.5639734,1 7.6182728,46.5626161,1 7.6179588,46.5615664,1 7.6178013,46.5612694,1 7.6174972,46.56112,1 7.6168363,46.5609385,1 7.6157193,46.560403,1 7.6145821,46.5600341,1 7.6137452,46.5592522,1 7.612416 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6023929,46.5496256,1 7.6020079,46.5491442,1 7.6007848,46.5481112,1 7.6002652,46.547606,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6001154,46.5474612,1 7.5998406,46.5471962,1 7.599669,46.5467387,1 7.5997977,46.5460599,1 7.6002483,46.5451891,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5917717,46.5267057,1 7.5923442,46.5260517,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.592227,46.5309052,1 7.5922718,46.5309677,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5987934,46.5407011,1 7.5987112,46.5396482,1 7.5984459,46.5390659,1 7.5987605,46.5380854,1 7.5981669,46.5376949,1 7.5979738,46.5372669,1 7.5975232,46.5369126,1 7.5972013,46.5362041,1 7.5967401,46.5358949,1 7.5963645,46.5355251,1 7.596107,46.5352151,1 7.5959139,46.5346099,1 7.5954367,46.534118,1 7.5951966,46.5330623,1 7.5942831,46.5321152,1 7.5939398,46.5315985,1 7.5936058,46.5312116,1 7.5932888,46.5311187,1 7.5926021,46.5311329,1 7.5924089,46.5310813,1 7.59237 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5923442,46.5260517,1 7.5925689,46.5257627,1 7.5928454,46.5253974,1 7.5927869,46.5248461,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5987934,46.5407011,1 7.5990252,46.5417356,1 7.5997548,46.5427687,1 7.600656,46.5435067,1 7.6005487,46.5442594,1 7.6002483,46.5451891,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Adelbodenstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.592227,46.5309052,1 7.5922401,46.5306523,1 7.5928025,46.5295318,1 7.5927596,46.5290299,1 7.5926159,46.5287063,1 7.5920786,46.5277859,1 7.5917134,46.5271711,1 7.5916653,46.5270074,1 7.5917717,46.5267057,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Landstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5597987,46.4888045,1 7.5599098,46.488794,1 7.5600095,46.4888091,1 7.5600873,46.4888392,1 7.5604036,46.4890905,1 7.5605568,46.4891692,1 7.5607125,46.4892161,1 7.5615168,46.4893029,1 7.5626755,46.4897461,1 7.5641775,46.4897756,1 7.5658886,46.4903417,1 7.5659944,46.4903674,1 7.5670612,46.490656,1 7.5674115,46.490768,1 7.5677132,46.4909027,1 7.5688982,46.4924052,1 7.568897,46.4933261,1 7.5688982,46.4937051,1 7.5690779,46.4942399,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Landstrasse</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5807143,46.5031184,1 7.5803532,46.5027703,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Landstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5597987,46.4888045,1 7.5597424,46.4888794,1 7.5597289,46.4889654,1 7.5598431,46.4891256,1 7.5604219,46.4895759,1 7.5610442,46.4898123,1 7.5618596,46.4904771,1 7.5619481,46.4908394,1 7.5619716,46.4909369,1 7.5620328,46.4912044,1 7.5620419,46.4912371,1 7.5621386,46.4916589,1 7.5623751,46.4918667,1 7.5633831,46.4927964,1 7.5633791,46.492965,1 7.5633139,46.4930204,1 7.5632271,46.4930606,1 7.5631435,46.493056,1 7.5625349,46.4929938,1 7.5615826,46.4930937,1 7.56097 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Landstrasse (223.1)</name>
+            <styleUrl>#style-Secondary</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5927869,46.5248461,1 7.5922439,46.524217,1 7.5915151,46.5232566,1 7.5901418,46.5224298,1 7.5896053,46.5219869,1 7.589224,46.5211243,1 7.5890023,46.5205153,1 7.5882535,46.5188272,1 7.5879102,46.5182808,1 7.5872235,46.5177345,1 7.5870469,46.5174702,1 7.587009,46.517011,1 7.5876833,46.5164516,1 7.5880389,46.5161546,1 7.5880818,46.5159478,1 7.5878243,46.5158445,1 7.5868373,46.5160955,1 7.5864725,46.5160512,1 7.5863867,46.5158592,1 7.5868373,46.5151357,1 7.5868587 [...]
+            </LineString>
+          </Placemark>
+        </Folder>
+        <Folder>
+          <name>Unclassified</name>
+          <Style id="style-Unclassified">
+            <LineStyle>
+              <color>#ffd0d0d0</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+          <Placemark>
+            <name>Schlegelistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5650662,46.4957333,1 7.5647157,46.4954991,1 7.5643603,46.4953787,1 7.5628576,46.4946658,1 7.5626535,46.4945986,1 7.5617886,46.4948002,1 7.561591,46.494845,1 7.5614673,46.4947425,1 7.5615188,46.494565,1 7.5617978,46.4943139,1 7.5617449,46.4941344,1 7.5613391,46.4939717,1 7.5598323,46.4933677,1 7.5597217,46.4932641,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Ruheweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5628576,46.4946658,1 7.5631584,46.4945553,1 7.5636005,46.4947211,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Dorfstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5597217,46.4932641,1 7.5595144,46.4930964,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Sunneweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5589173,46.4942818,1 7.5592854,46.4947564,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Haltenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5580946,46.4928578,1 7.5580394,46.4929428,1 7.5580016,46.493001,1 7.5584826,46.4935359,1 7.5589806,46.4941802,1 7.5589173,46.4942818,1 7.5580289,46.4940058,1 7.557863,46.4940514,1 7.5585141,46.4945781,1 7.5584892,46.4949762,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bellevuegaessli</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5581971,46.4920378,1 7.5579392,46.492211,1 7.5576315,46.4922586,1 7.5573333,46.4922537,1 7.5568548,46.4922385,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bellevuestrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5568451,46.4909915,1 7.5562427,46.4910686,1 7.5560919,46.4912908,1 7.5563797,46.4920739,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Senggistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.556064,46.4904831,1 7.5558567,46.490661,1 7.555653,46.4908226,1 7.5555547,46.4908982,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Untere Kurhausstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5594245,46.493615,1 7.5603132,46.4940893,1 7.5611146,46.4943645,1 7.5612008,46.4943941,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Obere Dorfstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5576315,46.4922586,1 7.5580946,46.4928578,1 7.5584537,46.4927197,1 7.5588805,46.4931539,1 7.5590802,46.4933577,1 7.5594245,46.493615,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5559303,46.4904006,1 7.5560779,46.4899713,1 7.5561408,46.4893354,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.599669,46.5467387,1 7.5994759,46.5465921,1 7.5994329,46.5460756,1 7.5998836,46.5456919,1 7.5998192,46.5452196,1 7.6005487,46.5449983,1 7.6007848,46.5444965,1 7.6010637,46.5442308,1 7.6011066,46.5438176,1 7.60145,46.5432715,1 7.6011281,46.5426074,1 7.6011066,46.5421794,1 7.6007068,46.54153,1 7.6001666,46.5412566,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alte Adelbodenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5982021,46.522924,1 7.5984662,46.5231705,1 7.5989692,46.523522,1 7.5991969,46.5235962,1 7.5997134,46.5240328,1 7.5999724,46.5242085,1 7.6002352,46.5243045,1 7.6008843,46.5244115,1 7.6011526,46.5245222,1 7.6012759,46.5246809,1 7.6017856,46.5255889,1 7.6019197,46.525803,1 7.6021074,46.5259285,1 7.6024799,46.5260617,1 7.6030516,46.5262828,1 7.6033037,46.5263123,1 7.6034753,46.5262754,1 7.6038103,46.5260773,1 7.604218,46.5260773,1 7.6046472,46.5258854,1 7.6049047 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hörnliweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5617886,46.4948002,1 7.5618606,46.4948615,1 7.5623632,46.494749,1 7.5625028,46.4947991,1 7.5625853,46.4950604,1 7.5626507,46.4952674,1 7.5627191,46.4953707,1 7.5631362,46.496001,1 7.5633343,46.4964952,1 7.5633664,46.4966989,1 7.5633291,46.4970595,1 7.5632368,46.4976696,1 7.563267,46.49787,1 7.5633854,46.4980113,1 7.563427,46.498168,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.559232,46.4796016,1 7.5585617,46.4808415,1 7.5583492,46.4819039,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5609767,46.4931868,1 7.561166,46.4933554,1 7.5615163,46.4934914,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5793256,46.4906279,1 7.580064,46.4905866,1 7.5805941,46.4903711,1 7.581293,46.4898469,1 7.5815091,46.4898495,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5594245,46.493615,1 7.5598323,46.4933677,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5587375,46.4925106,1 7.5584537,46.4927197,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5535228,46.4865284,1 7.5535075,46.4866379,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4450513,46.4614534,1 7.4452221,46.4614886,1 7.4456382,46.4613184,1 7.4461757,46.4609278,1 7.4463157,46.4610248,1 7.4464015,46.4610858,1 7.4466914,46.4607591,1 7.4468012,46.4607348,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bühlbergstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4430622,46.4571982,1 7.4431212,46.4572001,1 7.4432434,46.4572082,1 7.4442759,46.457382,1 7.4444794,46.4574163,1 7.4448677,46.4575035,1 7.4464578,46.4579817,1 7.4465356,46.4580981,1 7.4476729,46.4597444,1 7.4477077,46.4598442,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Gutenbrunnenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4448677,46.4575035,1 7.4448112,46.457744,1 7.4446903,46.4584104,1 7.4446715,46.4588889,1 7.4446685,46.4592476,1 7.4447089,46.4594931,1 7.4447493,46.4595984,1 7.444827,46.4597038,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Wallenbachstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4421289,46.4613278,1 7.4420439,46.4613149,1 7.4419537,46.4612981,1 7.4418739,46.4612798,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Ägertenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.441257,46.4569858,1 7.4409713,46.4574792,1 7.4407225,46.4578869,1 7.4398636,46.4589239,1 7.4396997,46.4590756,1 7.4393993,46.4592865,1 7.4389969,46.4594599,1 7.4386873,46.4595765,1 7.4384892,46.4596916,1 7.438253,46.4598534,1 7.438103,46.459935,1 7.4378459,46.4600208,1 7.4377581,46.4600511,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rütistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4378459,46.4600208,1 7.4371477,46.4594844,1 7.4369002,46.4593711,1 7.4351732,46.4588118,1 7.4346689,46.4587157,1 7.4343168,46.4586884,1 7.433596,46.4585605,1 7.4332261,46.4585191,1 7.4327699,46.458627,1 7.432094,46.4586566,1 7.4318151,46.4585975,1 7.4316005,46.4585827,1 7.4312142,46.4585309,1 7.430828,46.4585679,1 7.4304096,46.4586862,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4427198,46.4601214,1 7.4441314,46.4598231,1 7.444827,46.4597038,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4403161,46.4578243,1 7.4407225,46.4578869,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4407225,46.4578869,1 7.4409101,46.4579181,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4404453,46.465217,1 7.4393848,46.4651486,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Fuhrenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4296586,46.4726679,1 7.4298576,46.4724974,1 7.4299482,46.4723427,1 7.4302165,46.4718551,1 7.4304096,46.4715226,1 7.4309246,46.4709019,1 7.4314181,46.4703033,1 7.4340467,46.4683451,1 7.4344114,46.4681161,1 7.4347333,46.4678353,1 7.4351088,46.4673623,1 7.4359993,46.4657735,1 7.4367235,46.464426,1 7.4368575,46.4640778,1 7.4368843,46.4636223,1 7.4366858,46.462123,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schadaulistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4318747,46.4771523,1 7.4308709,46.4767833,1 7.4304263,46.4765871,1 7.4295513,46.4761553,1 7.4293897,46.4761015,1 7.4292187,46.4760445,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4523989,46.4496459,1 7.452694,46.4494094,1 7.4529944,46.4490804,1 7.4538849,46.446604,1 7.454593,46.4446597,1 7.4548183,46.4438761,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oberriedstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4430622,46.4571982,1 7.4430863,46.457126,1 7.4433572,46.4566273,1 7.443502,46.4562947,1 7.4435554,46.4560527,1 7.4435718,46.4557441,1 7.4436426,46.455437,1 7.4437272,46.454981,1 7.4437756,46.4548719,1 7.4440412,46.4544542,1 7.444062,46.4544122,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4490998,46.4394476,1 7.4493703,46.4398371,1 7.4496041,46.4400538,1 7.4498937,46.4404937,1 7.4501101,46.4406845,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4501101,46.4406845,1 7.4518839,46.4414253,1 7.4527026,46.4418144,1 7.4535265,46.4432753,1 7.4540243,46.4437721,1 7.4545085,46.4440271,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4518839,46.4414253,1 7.4463319,46.4499791,1 7.4459512,46.4506147,1 7.4453521,46.4516335,1 7.4453308,46.4518244,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Pöschenriedstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.439194,46.451784,1 7.4391746,46.4521405,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Wallenbachstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.441721,46.461265,1 7.4416647,46.4612502,1 7.4414716,46.4614165,1 7.4413107,46.4614646,1 7.4411444,46.461472,1 7.4407767,46.4613635,1 7.4398247,46.4608733,1 7.439138,46.4604323,1 7.4390154,46.4603058,1 7.438972,46.4601436,1 7.4389969,46.4594599,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Pöschenriedstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.439194,46.451784,1 7.4393621,46.4512978,1 7.4397084,46.4508377,1 7.4397951,46.4507502,1 7.4408595,46.449676,1 7.441074,46.4493211,1 7.4412135,46.4489959,1 7.4412457,46.4486706,1 7.4412457,46.4482641,1 7.4413208,46.4480793,1 7.441589,46.4477022,1 7.4417178,46.4472513,1 7.4424473,46.4464677,1 7.442676,46.4460304,1 7.4430129,46.4450125,1 7.4431554,46.4447748,1 7.4432091,46.4444791,1 7.4432735,46.4442573,1 7.4433807,46.444176,1 7.4435095,46.4441242,1 7.4436275,46 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4384991,46.4161204,1 7.4388581,46.415908,1 7.4389068,46.4156322,1 7.4388317,46.4152994,1 7.4389927,46.4149221,1 7.4394325,46.4147224,1 7.4399797,46.4143378,1 7.4403767,46.4141307,1 7.4406985,46.413857,1 7.4409959,46.4135401,1 7.4413392,46.4130075,1 7.4419793,46.4126531,1 7.4419305,46.4125999,1 7.4415906,46.4124847,1 7.441101,46.4124355,1 7.4404666,46.4125933,1 7.4404194,46.4125372,1 7.4405193,46.4124716,1 7.4412531,46.4122448,1 7.4423692,46.4122678,1 7.442404 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Gutenbrunnenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4449449,46.4598479,1 7.4450899,46.4600345,1 7.4451328,46.4601213,1 7.4451487,46.4602746,1 7.4450926,46.4604484,1 7.4448382,46.4608729,1 7.4447171,46.4611856,1 7.4446607,46.4613556,1 7.444642,46.4615773,1 7.4446527,46.4617085,1 7.4446688,46.4618747,1 7.4447493,46.4621371,1 7.4450569,46.4629393,1 7.4451223,46.4632094,1 7.445055,46.4636188,1 7.4449424,46.4639884,1 7.4445079,46.4650156,1 7.4444084,46.4652649,1 7.4442226,46.465441,1 7.4440304,46.4655661,1 7.443516 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Gutenbrunnenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.444827,46.4597038,1 7.4448524,46.4597347,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Wallenbachstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4418739,46.4612798,1 7.441721,46.461265,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schanzenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4448677,46.4575035,1 7.4448703,46.4570212,1 7.4451135,46.4568262,1 7.4455274,46.4564945,1 7.4460994,46.4560016,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4432434,46.4572082,1 7.4433858,46.4575296,1 7.4438332,46.4578509,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oertlistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4446688,46.4618747,1 7.4449263,46.4618784,1 7.4450513,46.4614534,1 7.4455535,46.4605947,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4464015,46.4610858,1 7.4459878,46.4615401,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4477077,46.4598442,1 7.4465974,46.459692,1 7.445441,46.4596274,1 7.444827,46.4597038,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Untere Haltenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4464578,46.4579817,1 7.4474714,46.4583086,1 7.4475806,46.4582904,1 7.4478352,46.4579994,1 7.4480413,46.457563,1 7.4481747,46.4576539,1 7.448593,46.4576963,1 7.4486688,46.4577077,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Untere Haltenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4478352,46.4579994,1 7.4483384,46.4580722,1 7.4486688,46.4577077,1 7.4487506,46.4576175,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oeystrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5535075,46.4866379,1 7.5541077,46.486711,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5705898,46.498823,1 7.5706468,46.4988918,1 7.571328,46.499657,1 7.5715737,46.4997902,1 7.571972,46.499918,1 7.5724383,46.5003898,1 7.57264,46.500482,1 7.572698,46.50071,1 7.573314,46.500878,1 7.573326,46.500982,1 7.5736,46.501081,1 7.573867,46.501362,1 7.574116,46.501755,1 7.574486,46.502791,1 7.575551,46.504242,1 7.575842,46.505145,1 7.575844,46.5053877,1 7.5758952,46.5056591,1 7.5759918,46.5060425,1 7.57603,46.506199,1 7.57625,46.506853,1 7.5763751,46.50700 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.570559,46.498933,1 7.5706468,46.4988918,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.580669,46.513662,1 7.5807275,46.5139652,1 7.5807645,46.5144849,1 7.5810451,46.5147994,1 7.5814548,46.5149276,1 7.5815259,46.5149997,1 7.5814644,46.5151169,1 7.581154,46.515336,1 7.5808687,46.5154174,1 7.5804932,46.5153665,1 7.5796209,46.5152968,1 7.5795576,46.5153762,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5796209,46.5152968,1 7.5791481,46.514688,1 7.57917,46.514448,1 7.578968,46.514106,1 7.578725,46.513934,1 7.577749,46.513746,1 7.57743,46.513533,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Mattenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5617403,46.4958305,1 7.5617231,46.4956946,1 7.561869,46.4956828,1 7.5631362,46.496001,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Fichtenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5642551,46.4979457,1 7.5637573,46.4971953,1 7.5633291,46.4970595,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hörnliweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.563427,46.498168,1 7.5634771,46.498246,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Obere Kurhausstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5594245,46.493615,1 7.5594073,46.4937805,1 7.559845,46.4940345,1 7.5599738,46.4943241,1 7.5608149,46.494649,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.556064,46.4904831,1 7.5562058,46.4901582,1 7.5560779,46.4899713,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Aebiweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.525197,46.4841121,1 7.5254535,46.4838699,1 7.5283631,46.4827706,1 7.5290927,46.4828534,1 7.5296334,46.4826879,1 7.5306977,46.4826465,1 7.5316762,46.4823628,1 7.5330409,46.4820851,1 7.5332297,46.4820851,1 7.5339335,46.482351,1 7.5343284,46.4823096,1 7.5346202,46.4821914,1 7.5349549,46.4818014,1 7.5351352,46.4817541,1 7.5352897,46.4818014,1 7.5355986,46.4821501,1 7.5359591,46.4821973,1 7.5371522,46.4817482,1 7.5372294,46.4812576,1 7.537032,46.4807671,1 7.537100 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5568548,46.4922385,1 7.5564947,46.4921923,1 7.5563797,46.4920739,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schwendliweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5563573,46.493575,1 7.5559968,46.4931141,1 7.5558595,46.4922159,1 7.555705,46.4920327,1 7.5556793,46.492015,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5426865,46.4886019,1 7.5426779,46.4886728,1 7.5428925,46.4887023,1 7.5430813,46.4884246,1 7.5433731,46.4882059,1 7.5439138,46.4880345,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5621068,46.4705513,1 7.5621068,46.4703326,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.563823,46.4661917,1 7.5640376,46.4659612,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5649892,46.4595141,1 7.5667928,46.4591384,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5649892,46.4595141,1 7.5639522,46.4598625,1 7.5627558,46.4606653,1 7.5624583,46.460924,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5573333,46.4922537,1 7.5572692,46.4923768,1 7.5575911,46.4927979,1 7.5576125,46.4928259,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Holzachseggenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.574161,46.5050942,1 7.5745177,46.5050132,1 7.5746686,46.5050133,1 7.5748119,46.5051096,1 7.5749181,46.5052865,1 7.5749613,46.5054369,1 7.5749935,46.5057891,1 7.5751992,46.5059527,1 7.5762188,46.5070028,1 7.5765527,46.5070657,1 7.5768093,46.5071724,1 7.5769754,46.5073393,1 7.5770131,46.5075288,1 7.5769805,46.5077763,1 7.5771975,46.508068,1 7.5774508,46.5082856,1 7.5776375,46.5085748,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Holzachseggenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.580641,46.513675,1 7.580404,46.513551,1 7.5802043,46.5134503,1 7.5797717,46.5127021,1 7.579667,46.512463,1 7.5796377,46.5123126,1 7.5796306,46.5118712,1 7.5795023,46.511653,1 7.579245,46.511192,1 7.578725,46.510501,1 7.57876,46.510111,1 7.5785213,46.5099119,1 7.5783897,46.5097234,1 7.5784323,46.509327,1 7.5782946,46.5090724,1 7.5779976,46.5089351,1 7.5777993,46.5087052,1 7.5776375,46.5085748,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6170304,46.559005,1 7.617521,46.559201,1 7.61769,46.559157,1 7.618127,46.558916,1 7.618334,46.558972,1 7.618372,46.559119,1 7.6185053,46.5592427,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Badstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4360929,46.4545316,1 7.4354269,46.4543073,1 7.4353973,46.4541646,1 7.4355302,46.454095,1 7.4358702,46.4539509,1 7.4367144,46.4534407,1 7.4375083,46.4531784,1 7.4376245,46.45314,1 7.4379057,46.4527118,1 7.4380056,46.4525884,1 7.4382313,46.4524161,1 7.4385957,46.4522631,1 7.4391746,46.4521405,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oberriedstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4677582,46.4299748,1 7.4681778,46.429499,1 7.4698944,46.4283987,1 7.4703192,46.4282113,1 7.4717398,46.4279136,1 7.4726925,46.4278012,1 7.4760571,46.4270912,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4391746,46.4521405,1 7.4395197,46.4518404,1 7.4397686,46.4510539,1 7.4414767,46.4497766,1 7.4416701,46.4495646,1 7.4418257,46.4493133,1 7.4418875,46.4490852,1 7.4419222,46.4486812,1 7.4419812,46.448478,1 7.4421475,46.448271,1 7.442228,46.4480196,1 7.4422977,46.4478348,1 7.4425445,46.4476463,1 7.4426679,46.447273,1 7.4428288,46.4470808,1 7.4431238,46.4469588,1 7.4434028,46.4469071,1 7.4436335,46.4469108,1 7.4442576,46.447074,1 7.4454113,46.4464497,1 7.4456129, [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schulstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4451624,46.4562853,1 7.445156,46.4561345,1 7.4435718,46.4557441,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schanzenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4442759,46.457382,1 7.4444358,46.4572544,1 7.4448703,46.4570212,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rawilstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4391746,46.4521405,1 7.4392237,46.4523389,1 7.4393814,46.4528307,1 7.4394509,46.45341,1 7.4394643,46.4538143,1 7.439476,46.4543009,1 7.4395189,46.4545023,1 7.4396638,46.4549532,1 7.4397362,46.4551084,1 7.4398844,46.4554098,1 7.4401167,46.4559428,1 7.4402861,46.4562004,1 7.4405596,46.4564869,1 7.4409145,46.4567899,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lischmattenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4441109,46.4543138,1 7.4439634,46.4542879,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schulstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4435718,46.4557441,1 7.4435047,46.4557418,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schulstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4434082,46.4557385,1 7.4433518,46.4557718,1 7.4433217,46.4560368,1 7.4432619,46.4563432,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rawilstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4428556,46.4571631,1 7.4430005,46.457189,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hohliebestrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4409145,46.4567899,1 7.4403726,46.4567837,1 7.4398295,46.4567497,1 7.4395506,46.4568162,1 7.4390892,46.4567793,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Badgässli</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4396638,46.4549532,1 7.4383275,46.4545323,1 7.4381129,46.4544954,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5815091,46.4898495,1 7.5817066,46.490105,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lischenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.579127,46.5015699,1 7.5795483,46.5015782,1 7.579604,46.501575,1 7.5796209,46.5015556,1 7.5796354,46.5015389,1 7.5796387,46.5014767,1 7.579516,46.5011987,1 7.579582,46.5009187,1 7.579558,46.5007779,1 7.5793455,46.5005247,1 7.5789309,46.500105,1 7.5789603,46.4999343,1 7.5792023,46.4997735,1 7.5792682,46.499649,1 7.5793383,46.4996065,1 7.579615,46.499543,1 7.5798441,46.4995124,1 7.5798959,46.4994904,1 7.5800692,46.4992295,1 7.5802311,46.4989017,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lischenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5789513,46.5016989,1 7.579127,46.5015699,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6045066,46.4846583,1 7.6045315,46.4850165,1 7.6044123,46.4855701,1 7.6042768,46.486003,1 7.6045886,46.4873469,1 7.6048256,46.487741,1 7.6047148,46.4879113,1 7.6045687,46.4880471,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5966573,46.4922393,1 7.5971767,46.4928758,1 7.5974568,46.4931936,1 7.598244,46.493757,1 7.598438,46.494168,1 7.598278,46.494257,1 7.596752,46.494475,1 7.5956114,46.49432,1 7.595106,46.494366,1 7.594802,46.494659,1 7.593749,46.496477,1 7.593536,46.497015,1 7.593565,46.497162,1 7.593723,46.497259,1 7.594193,46.497251,1 7.594485,46.497334,1 7.595287,46.497681,1 7.595584,46.497731,1 7.596066,46.497622,1 7.596171,46.49767,1 7.5961782,46.4978242,1 7.596517,46.49794 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6027655,46.503524,1 7.6032706,46.5032719,1 7.6039262,46.5029587,1 7.6040764,46.5028406,1 7.6040979,46.5026559,1 7.6040979,46.5025304,1 7.6041623,46.5023901,1 7.6043768,46.5022645,1 7.6048275,46.5020873,1 7.6050098,46.5020873,1 7.6051601,46.502139,1 7.6053317,46.5021242,1 7.6058252,46.5019839,1 7.6061686,46.5018214,1 7.606351,46.5016442,1 7.6065548,46.501371,1 7.6067372,46.5012454,1 7.6071234,46.5011199,1 7.6080139,46.5007949,1 7.6083572,46.5007285,1 7.6087864 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.609263,46.506585,1 7.609625,46.506622,1 7.609763,46.506742,1 7.608437,46.508551,1 7.608362,46.509014,1 7.608517,46.509398,1 7.608975,46.509513,1 7.609143,46.509667,1 7.608922,46.509968,1 7.608936,46.510136,1 7.6096937,46.5108052,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6132752,46.5086326,1 7.6130864,46.508084,1 7.6134655,46.5075013,1 7.6137376,46.5073456,1 7.6137642,46.5068918,1 7.6136461,46.5067741,1 7.6132371,46.5067476,1 7.6123986,46.5065152,1 7.6121506,46.5065575,1 7.6117664,46.5069924,1 7.6118209,46.5074455,1 7.6111969,46.5077415,1 7.610704,46.508093,1 7.609919,46.508256,1 7.609829,46.508341,1 7.609937,46.509377,1 7.609669,46.509781,1 7.6097521,46.5101913,1 7.6096937,46.5108052,1 7.609751,46.511164,1 7.610325,46.511757 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6109659,46.5266158,1 7.6107,46.526694,1 7.61007,46.527171,1 7.609988,46.527489,1 7.609498,46.527984,1 7.608709,46.529361,1 7.608698,46.530009,1 7.608567,46.530339,1 7.608337,46.530401,1 7.608207,46.530327,1 7.607761,46.529968,1 7.607315,46.529449,1 7.606862,46.52918,1 7.6065623,46.5291566,1 7.6061361,46.5293018,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rinderwaldstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5881401,46.5275704,1 7.5879485,46.527459,1 7.587679,46.527221,1 7.587317,46.526255,1 7.587425,46.5259306,1 7.5872959,46.5256373,1 7.586076,46.524567,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5826066,46.5259242,1 7.5829568,46.5262864,1 7.5833805,46.5268825,1 7.5836909,46.5270954,1 7.5838082,46.5273334,1 7.5840578,46.5276561,1 7.584423,46.5281035,1 7.584751,46.528836,1 7.5847782,46.5294052,1 7.5847345,46.5296666,1 7.5845956,46.5298968,1 7.5842076,46.5301916,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rinderwaldstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5774574,46.5275452,1 7.5772166,46.5274306,1 7.5766573,46.5267791,1 7.576019,46.525654,1 7.575555,46.524558,1 7.5753315,46.5243657,1 7.5749549,46.5242103,1 7.57448,46.5241341,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5745874,46.5254626,1 7.5721265,46.5258724,1 7.5710266,46.5262635,1 7.5703591,46.5265893,1 7.5704551,46.5266365,1 7.5708354,46.5265253,1 7.5721092,46.5264585,1 7.5735188,46.5265577,1 7.573599,46.526742,1 7.573578,46.527052,1 7.573646,46.5272475,1 7.5744837,46.5279216,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5703591,46.5265893,1 7.568595,46.5263443,1 7.5673853,46.5264725,1 7.5663447,46.5266784,1 7.5654095,46.5267497,1 7.564572,46.5270254,1 7.5632688,46.5279901,1 7.562625,46.528737,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5632688,46.5279901,1 7.563293,46.528047,1 7.5639,46.527924,1 7.565404,46.52747,1 7.565998,46.527405,1 7.5672493,46.5275054,1 7.568548,46.527754,1 7.5689,46.527947,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4348713,46.4607347,1 7.433706,46.46137,1 7.4332548,46.4615372,1 7.432767,46.461688,1 7.4322834,46.461897,1 7.430689,46.462586,1 7.430159,46.462852,1 7.429281,46.463456,1 7.427987,46.464066,1 7.427716,46.464332,1 7.427499,46.464333,1 7.427753,46.463371,1 7.427638,46.462469,1 7.427267,46.461642,1 7.426829,46.461129,1 7.426752,46.460286,1 7.426453,46.460009,1 7.426347,46.45962,1 7.4262468,46.4595065,1 7.425969,46.459287,1 7.42578,46.459278,1 7.42571,46.459377,1  [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5426103,46.4830368,1 7.5424403,46.4825688,1 7.5421893,46.4825118,1 7.5419623,46.4825828,1 7.5416513,46.4828808,1 7.5415101,46.4829137,1 7.5411413,46.4827908,1 7.5402763,46.4830068,1 7.5400713,46.4829268,1 7.5403793,46.4826278,1 7.5407663,46.4824648,1 7.5407743,46.4822388,1 7.5405388,46.4820442,1 7.5403653,46.4819008,1 7.5396433,46.4815648,1 7.5392734,46.4802349,1 7.5390599,46.4794675,1 7.5381653,46.4784568,1 7.5376503,46.4775028,1 7.5369473,46.4771058,1 7.536 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.469627,46.453826,1 7.4703038,46.4532183,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alpenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.55887,46.49044,1 7.55864,46.490402,1 7.55846,46.49025,1 7.5579974,46.4904534,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.543024,46.4839871,1 7.5426103,46.4830368,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Dorfstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5595144,46.4930964,1 7.5592176,46.4928554,1 7.5587375,46.4925106,1 7.5581971,46.4920378,1 7.5571221,46.4911702,1 7.5568451,46.4909915,1 7.556403,46.4906599,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Dorfstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.556403,46.4906599,1 7.556064,46.4904831,1 7.5559303,46.4904006,1 7.5549954,46.4898085,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Risetensträssli</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5561408,46.4893354,1 7.5561531,46.4890823,1 7.5561565,46.4890135,1 7.556089,46.4888482,1 7.5559288,46.4884562,1 7.5555284,46.4878909,1 7.5553086,46.487412,1 7.5549867,46.4871765,1 7.5545078,46.4871844,1 7.5535075,46.4866379,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5981221,46.5280116,1 7.598181,46.528212,1 7.598159,46.528341,1 7.598092,46.528455,1 7.59791,46.528842,1 7.597834,46.52896,1 7.597782,46.529368,1 7.597859,46.5296,1 7.598016,46.529719,1 7.59821,46.529793,1 7.598476,46.529826,1 7.59895,46.529716,1 7.599487,46.529729,1 7.5996702,46.5297785,1 7.599726,46.529845,1 7.599787,46.529949,1 7.599809,46.530111,1 7.599803,46.530257,1 7.599647,46.530568,1 7.599725,46.53097,1 7.599832,46.531108,1 7.599978,46.531232,1 7.5999 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5744837,46.5279216,1 7.5746977,46.5280938,1 7.5771625,46.5297081,1 7.5773,46.529821,1 7.577183,46.530712,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4568436,46.4593926,1 7.4568637,46.4594526,1 7.4569135,46.4595047,1 7.4570376,46.4595784,1 7.4576408,46.459836,1 7.4576957,46.4598904,1 7.4576821,46.4599445,1 7.4576328,46.4599825,1 7.4575461,46.4599848,1 7.4572033,46.4598226,1 7.4568717,46.459731,1 7.4564869,46.4597211,1 7.4563512,46.4596817,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4563512,46.4596817,1 7.4562979,46.4595824,1 7.4562834,46.4593869,1 7.4562147,46.4592473,1 7.4559877,46.4590046,1 7.4559252,46.4587348,1 7.4558864,46.4581792,1 7.456013,46.4574831,1 7.4561972,46.456936,1 7.4560344,46.4563522,1 7.4560192,46.4561245,1 7.4563026,46.4555022,1 7.456367,46.4551475,1 7.4564528,46.4549996,1 7.4565816,46.4549331,1 7.4565816,46.454837,1 7.4565616,46.4547349,1 7.4564528,46.4547261,1 7.4563455,46.4548222,1 7.4562919,46.4549257,1 7.4562003 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rawilstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4409145,46.4567899,1 7.4410666,46.4568934,1 7.441257,46.4569858,1 7.4424533,46.457099,1 7.4428556,46.4571631,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Egernschwandweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5786446,46.518287,1 7.578694,46.518135,1 7.578724,46.517978,1 7.578695,46.517886,1 7.578512,46.517455,1 7.578309,46.5171813,1 7.577878,46.516652,1 7.577605,46.516534,1 7.577438,46.51649,1 7.577041,46.516159,1 7.576838,46.516078,1 7.576264,46.515795,1 7.575735,46.515618,1 7.575121,46.515397,1 7.574844,46.515369,1 7.574591,46.515424,1 7.574228,46.515451,1 7.573965,46.515492,1 7.57367,46.515483,1 7.57341,46.515411,1 7.573285,46.51521,1 7.573152,46.515082,1 7.572 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5669006,46.5111824,1 7.566536,46.5113136,1 7.566172,46.511362,1 7.565683,46.511382,1 7.565051,46.511454,1 7.564704,46.511647,1 7.564224,46.51188,1 7.564123,46.512021,1 7.563941,46.51213,1 7.563809,46.512144,1 7.563635,46.512083,1 7.563415,46.512069,1 7.563285,46.512081,1 7.563183,46.512048,1 7.562725,46.511852,1 7.562645,46.511873,1 7.562606,46.511942,1 7.562637,46.512081,1 7.5625296,46.5121876,1 7.562224,46.512308,1 7.562061,46.512386,1 7.561732,46.512565,1  [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.556817,46.5135283,1 7.5564776,46.5135931,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5564776,46.5135931,1 7.555653,46.5136131,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Egerlenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.555653,46.5136131,1 7.5547124,46.5135725,1 7.554273,46.513568,1 7.553829,46.513568,1 7.553433,46.513609,1 7.5530228,46.5136488,1 7.552596,46.513654,1 7.552093,46.513613,1 7.551338,46.513505,1 7.5509052,46.5134765,1 7.5505971,46.5134655,1 7.5499677,46.5136782,1 7.5495893,46.5137309,1 7.549533,46.513828,1 7.5496296,46.5138873,1 7.54985,46.513882,1 7.55001,46.513903,1 7.550029,46.51409,1 7.550048,46.514291,1 7.5501728,46.5144035,1 7.550758,46.514543,1 7.5511026, [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Egernschwandweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.565665,46.51313,1 7.5655319,46.5130257,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Egernschwandweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5655319,46.5130257,1 7.5654903,46.5129931,1 7.56538,46.512798,1 7.565474,46.512629,1 7.565684,46.512455,1 7.565875,46.512336,1 7.566545,46.512105,1 7.566632,46.512061,1 7.566984,46.512021,1 7.567198,46.511978,1 7.567389,46.511901,1 7.567571,46.511851,1 7.568036,46.511904,1 7.568265,46.511945,1 7.568517,46.512006,1 7.568808,46.512056,1 7.569195,46.512073,1 7.569429,46.512012,1 7.569807,46.511803,1 7.570015,46.511579,1 7.570141,46.511395,1 7.570386,46.511321,1  [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4472186,46.4059651,1 7.4473377,46.4046987,1 7.447185,46.4043595,1 7.4464891,46.403864,1 7.4461202,46.4034297,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Iffigenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4461202,46.4034297,1 7.44569,46.4028394,1 7.4452036,46.402289,1 7.4440926,46.4015624,1 7.4434951,46.4012667,1 7.4427384,46.4009962,1 7.4411642,46.3998745,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Labrunnenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5848963,46.5385742,1 7.584971,46.538598,1 7.5850687,46.5385678,1 7.585274,46.538445,1 7.585513,46.538362,1 7.585815,46.538336,1 7.5861975,46.5384377,1 7.586687,46.538565,1 7.586868,46.53855,1 7.586922,46.5385852,1 7.586858,46.538634,1 7.5865846,46.5387579,1 7.5864754,46.5388895,1 7.5863858,46.5390299,1 7.5863538,46.53914,1 7.586145,46.539473,1 7.585906,46.539748,1 7.5859743,46.5397566,1 7.5862337,46.5397277,1 7.5864971,46.5397002,1 7.5866758,46.539656,1 7.586 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6000148,46.5411065,1 7.5998328,46.5411104,1 7.599728,46.540985,1 7.599815,46.540729,1 7.599744,46.54068,1 7.599461,46.541161,1 7.5990539,46.5414724,1 7.5989053,46.5416069,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Linterstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5925397,46.5451903,1 7.592485,46.545252,1 7.592525,46.54534,1 7.592614,46.545474,1 7.592697,46.545941,1 7.592776,46.546324,1 7.592795,46.546568,1 7.592784,46.547071,1 7.592699,46.547674,1 7.592756,46.547908,1 7.592822,46.548097,1 7.592806,46.5481874,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Linterstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.592806,46.5481874,1 7.592761,46.548238,1 7.592644,46.548376,1 7.592455,46.548557,1 7.592255,46.548698,1 7.592146,46.548812,1 7.591958,46.548924,1 7.591674,46.548987,1 7.591507,46.549084,1 7.591392,46.549196,1 7.591209,46.549305,1 7.591037,46.549435,1 7.590866,46.549519,1 7.590794,46.549642,1 7.590617,46.549749,1 7.590437,46.549933,1 7.5904257,46.5500262,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Linterstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5904257,46.5500262,1 7.5905254,46.5500717,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Kratzernweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5905254,46.5500717,1 7.590707,46.549997,1 7.59085,46.549908,1 7.591069,46.549881,1 7.591421,46.549938,1 7.591668,46.550065,1 7.592004,46.550226,1 7.592637,46.550442,1 7.593226,46.55058,1 7.593383,46.550702,1 7.593531,46.550877,1 7.593684,46.55115,1 7.593958,46.551669,1 7.594276,46.55222,1 7.594324,46.552364,1 7.5943061,46.5527315,1 7.594134,46.552894,1 7.594091,46.55297,1 7.59395,46.553062,1 7.593757,46.553112,1 7.593606,46.553197,1 7.59307,46.5535336,1 7.592 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Kratzernweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.592429,46.554253,1 7.592863,46.5539574,1 7.593574,46.55385,1 7.59392,46.553942,1 7.594217,46.553964,1 7.594676,46.553977,1 7.594954,46.553786,1 7.595205,46.553817,1 7.595561,46.55408,1 7.595675,46.554108,1 7.59587,46.554013,1 7.596056,46.553807,1 7.596398,46.553526,1 7.59646,46.553509,1 7.5967647,46.5536546,1 7.596819,46.553667,1 7.5969261,46.5536743,1 7.5970949,46.5537103,1 7.5971441,46.5537263,1 7.5971816,46.5538848,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Kratzernweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5923612,46.5541928,1 7.592429,46.554253,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.598828,46.5418043,1 7.5986652,46.5418556,1 7.5984839,46.5418271,1 7.5981032,46.541696,1 7.5978471,46.5416201,1 7.5977275,46.5416254,1 7.5978138,46.5416964,1 7.5979877,46.5417862,1 7.5981191,46.5418557,1 7.5980869,46.5419247,1 7.597906,46.5419125,1 7.5977139,46.5418563,1 7.5974461,46.5417375,1 7.5971628,46.5416562,1 7.596846,46.5416131,1 7.5964607,46.5415809,1 7.5962965,46.5415976,1 7.5963199,46.5416784,1 7.5964588,46.541693,1 7.596682,46.5416906,1 7.597639,46 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5989053,46.5416069,1 7.598828,46.5418043,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6001666,46.5412566,1 7.6000721,46.5411632,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Fehrmelthal</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4233856,46.4967518,1 7.4241495,46.4971123,1 7.4248619,46.4973545,1 7.4252291,46.4974725,1 7.4255929,46.4976732,1 7.4258661,46.4978981,1 7.426026,46.4981971,1 7.4261976,46.498398,1 7.4261976,46.4985752,1 7.4261376,46.498652,1 7.4256827,46.4984452,1 7.425305,46.4982798,1 7.4250743,46.4980211,1 7.4247643,46.4980198,1 7.4245669,46.4981203,1 7.4236742,46.4992133,1 7.4231077,46.4998042,1 7.4224039,46.5003654,1 7.4216744,46.5005013,1 7.4215885,46.5006195,1 7.4218718 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4198288,46.4982833,1 7.4199867,46.4982171,1 7.4204588,46.4980104,1 7.4212742,46.4977031,1 7.4221153,46.4973486,1 7.4228878,46.497,1 7.4233856,46.4967518,1 7.4239729,46.4964435,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4206823,46.4955804,1 7.4200296,46.495446,1 7.4196538,46.4953841,1 7.4194202,46.4953456,1 7.4187164,46.4951801,1 7.4180555,46.4951506,1 7.4177448,46.4951104,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6045687,46.4880471,1 7.604255,46.4883112,1 7.6039469,46.4884404,1 7.6036512,46.4886227,1 7.603341,46.4887189,1 7.6032878,46.4889924,1 7.6021413,46.489726,1 7.6017531,46.4900467,1 7.6011402,46.490361,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5922214,46.488268,1 7.5922897,46.4884803,1 7.592399,46.488507,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.596404,46.4883944,1 7.5967553,46.4880553,1 7.5966803,46.4878323,1 7.5963163,46.4876073,1 7.5963243,46.4872963,1 7.5964903,46.4875193,1 7.5966533,46.4875613,1 7.5969273,46.4874763,1 7.5971273,46.4876053,1 7.5975163,46.4876923,1 7.5975213,46.4878273,1 7.5977823,46.4880603,1 7.5979919,46.4884754,1 7.5979589,46.4885316,1 7.5978879,46.4887234,1 7.5972663,46.4893073,1 7.5965123,46.4896783,1 7.5951997,46.4905833,1 7.5944647,46.4907653,1 7.5942015,46.4909197,1 7.5938 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6011402,46.490361,1 7.6010393,46.4904099,1 7.6003528,46.4908825,1 7.5998973,46.4910808,1 7.599409,46.491188,1 7.5966772,46.4913521,1 7.5964583,46.4914338,1 7.5961988,46.4916268,1 7.5961708,46.4917495,1 7.596319,46.491996,1 7.5966573,46.4922393,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.419988,46.5053819,1 7.4200223,46.5055355,1 7.4199966,46.5057068,1 7.4199193,46.5058604,1 7.4197734,46.5060258,1 7.4195073,46.5061144,1 7.4191898,46.5062503,1 7.4189323,46.5064157,1 7.4188121,46.5066638,1 7.4188722,46.5068706,1 7.4189666,46.5070951,1 7.4189923,46.5073491,1 7.4190782,46.5075618,1 7.4191297,46.5077803,1 7.4191039,46.5079989,1 7.4190267,46.5082057,1 7.4189494,46.508377,1 7.4189139,46.5084718,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4230607,46.5136342,1 7.4228547,46.5134865,1 7.4226401,46.5132798,1 7.4222882,46.5131026,1 7.4218248,46.5129963,1 7.4211982,46.51289,1 7.4205545,46.5128014,1 7.4202283,46.5126596,1 7.4199365,46.5124765,1 7.4197476,46.5123761,1 7.4193185,46.5123465,1 7.4191211,46.512317,1 7.4190009,46.5121811,1 7.419061,46.5119862,1 7.4192327,46.5118444,1 7.4195932,46.5117086,1 7.4199966,46.5115314,1 7.4204085,46.5113483,1 7.4207175,46.511236,1 7.4210179,46.5111356,1 7.421387,4 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4259103,46.506333,1 7.4256528,46.5063212,1 7.4254125,46.506268,1 7.4251121,46.5061794,1 7.4249576,46.5060613,1 7.4248288,46.5059254,1 7.4247859,46.5057541,1 7.4246915,46.5056359,1 7.4243224,46.5055296,1 7.4236358,46.5053819,1 7.4232152,46.5052224,1 7.422829,46.5050452,1 7.4223827,46.5049211,1 7.4220737,46.5048798,1 7.4218248,46.5049034,1 7.421593,46.5049034,1 7.4213527,46.5049211,1 7.4210952,46.5050452,1 7.4208892,46.5051397,1 7.4206317,46.5052224,1 7.4203742 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4305407,46.5051685,1 7.4303563,46.5050038,1 7.4298928,46.5045253,1 7.4297126,46.5043185,1 7.4294637,46.5041177,1 7.4290517,46.5038695,1 7.4288371,46.5036923,1 7.428468,46.5034324,1 7.4282106,46.5031192,1 7.4279016,46.5029479,1 7.4276012,46.5027766,1 7.4274982,46.5027411,1 7.4273866,46.5027589,1 7.4273351,46.5028179,1 7.4275153,46.5029302,1 7.427687,46.5030424,1 7.4278157,46.5031783,1 7.4279187,46.5032965,1 7.4279445,46.5033851,1 7.4279016,46.5034383,1 7.42770 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4668276,46.4566405,1 7.466626,46.456393,1 7.46638,46.456395,1 7.465978,46.457075,1 7.46552,46.45722,1 7.464934,46.457247,1 7.464328,46.457064,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.464328,46.457064,1 7.46402,46.45673,1 7.46447,46.45557,1 7.4642956,46.4543861,1 7.464124,46.45378,1 7.4641132,46.4532257,1 7.4642966,46.4529589,1 7.4642849,46.4527822,1 7.46408,46.45269,1 7.4638128,46.4527083,1 7.4636626,46.4529744,1 7.4634575,46.4537658,1 7.4603495,46.4557922,1 7.4588078,46.4570244,1 7.4581153,46.4575795,1 7.4574404,46.4583035,1 7.4570682,46.4587555,1 7.4569587,46.4589788,1 7.4568436,46.4593926,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4703038,46.4532183,1 7.4710333,46.4527157,1 7.4713445,46.452553,1 7.4714196,46.4524422,1 7.4712908,46.4523978,1 7.4711192,46.4524274,1 7.4708774,46.4525547,1 7.4706364,46.4526048,1 7.4701321,46.4525826,1 7.4698401,46.452539,1 7.46948,46.4526,1 7.4683618,46.4533587,1 7.4678361,46.4538687,1 7.4676216,46.4543418,1 7.4674922,46.4547505,1 7.4675572,46.4549109,1 7.4675679,46.4551105,1 7.4675467,46.4553607,1 7.4675786,46.4555096,1 7.4676859,46.4556722,1 7.4676573,46 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4418257,46.4493133,1 7.4429563,46.4496699,1 7.4449209,46.4532605,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Eselmoosgassa</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5352429,46.4735013,1 7.5361986,46.4737653,1 7.5368105,46.4739849,1 7.5370959,46.4740236,1 7.5375596,46.4740753,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Eselmoosgassa</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5375596,46.4740753,1 7.5377988,46.4741219,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.54748,46.480984,1 7.5484605,46.4809685,1 7.5488016,46.4810009,1 7.5501316,46.4812134,1 7.5504155,46.4813022,1 7.5507216,46.4814522,1 7.5509021,46.4815181,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Kuonisbergliweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5518939,46.4844236,1 7.5519996,46.4841301,1 7.5523714,46.4835666,1 7.5525084,46.4833243,1 7.5528638,46.4823913,1 7.5529761,46.4821915,1 7.553538,46.481365,1 7.553631,46.481207,1 7.553657,46.480986,1 7.553549,46.480827,1 7.553375,46.480816,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4243085,46.4962111,1 7.4246201,46.4963695,1 7.4248078,46.4963991,1 7.4249741,46.4962993,1 7.4251565,46.4960408,1 7.4254194,46.4957565,1 7.4257949,46.4953466,1 7.4266078,46.4947785,1 7.4271663,46.49439,1 7.4277734,46.4936979,1 7.4282348,46.4930423,1 7.4286597,46.4925445,1 7.4289438,46.4921742,1 7.4290296,46.4920487,1 7.4291818,46.4920224,1 7.4292764,46.492141,1 7.4290968,46.4923259,1 7.4288097,46.4927134,1 7.4286112,46.4933701,1 7.4285262,46.4938679,1 7.428004 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.603904,46.5152803,1 7.6038399,46.515509,1 7.6038519,46.5158038,1 7.6039341,46.5160746,1 7.6039201,46.5163173,1 7.6038358,46.5164998,1 7.6036794,46.5167405,1 7.6033694,46.5171449,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4398617,46.4296989,1 7.4397759,46.4296619,1 7.4397115,46.4295362,1 7.4396686,46.4293809,1 7.4395291,46.429233,1 7.4391643,46.4289742,1 7.4389927,46.4289077,1 7.4388961,46.4289594,1 7.4388317,46.4293292,1 7.4387459,46.4294623,1 7.4386064,46.4294845,1 7.4384562,46.4293957,1 7.4383489,46.4292404,1 7.4382094,46.4290334,1 7.4381343,46.4289151,1 7.4374584,46.4288263,1 7.436922,46.4288337,1 7.4367181,46.4288263,1 7.4361388,46.428708,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Glauistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4444107,46.4389564,1 7.4442498,46.4390377,1 7.444121,46.43923,1 7.4434022,46.4402429,1 7.4433056,46.4402724,1 7.4432413,46.4402724,1 7.4431769,46.4401911,1 7.4431876,46.4401172,1 7.4432305,46.4398806,1 7.4432305,46.4396218,1 7.4432091,46.43923,1 7.4432091,46.4388751,1 7.4432413,46.4386237,1 7.4432413,46.4383945,1 7.4431769,46.4382096,1 7.4424903,46.4373076,1 7.44234,46.4372115,1 7.4415676,46.4367531,1 7.4414388,46.4366348,1 7.4413852,46.4364795,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Glauistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4424903,46.4373076,1 7.4423615,46.4369601,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Glauistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4433056,46.4402724,1 7.4431233,46.4408047,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Seefluhstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4434129,46.4428009,1 7.4433056,46.443311,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Seefluhstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4437348,46.4427639,1 7.4434129,46.4428009,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4380056,46.4525884,1 7.4378983,46.4525958,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4378983,46.4525958,1 7.4377374,46.4526105,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4377374,46.4526105,1 7.4376301,46.452714,1 7.437437,46.453054,1 7.437319,46.4530762,1 7.4372117,46.4529875,1 7.4371366,46.4528249,1 7.4371151,46.4527066,1 7.4369756,46.4526253,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Untere Bühlstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.433596,46.4585605,1 7.433639,46.4585162,1 7.4338965,46.4585383,1 7.4342612,46.4585088,1 7.4344544,46.4584496,1 7.4346367,46.4583166,1 7.4346904,46.4581244,1 7.4346689,46.4579249,1 7.4344865,46.4577032,1 7.4344651,46.4575406,1 7.4345295,46.4574371,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rütistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4304096,46.4586862,1 7.4302379,46.4586344,1 7.4301962,46.4583535,1 7.4301362,46.4577031,1 7.430222,46.4569817,1 7.4301104,46.456284,1 7.4302821,46.4559884,1 7.4308571,46.4556691,1 7.4291826,46.4541298,1 7.427084,46.4535514,1 7.4274775,46.4522141,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4353588,46.4606376,1 7.4352054,46.4610438,1 7.4349693,46.4614355,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.430159,46.462852,1 7.4301306,46.4627805,1 7.4301306,46.4625736,1 7.430195,46.4620637,1 7.4302272,46.4618346,1 7.4301521,46.4614724,1 7.4300233,46.4613172,1 7.4297015,46.4611029,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Flöschstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.430159,46.462852,1 7.4302272,46.4629801,1 7.4302808,46.4631574,1 7.4303452,46.4642216,1 7.430313,46.4646429,1 7.4302379,46.4654336,1 7.4301199,46.4663278,1 7.4299697,46.4668007,1 7.4296908,46.4675249,1 7.4294547,46.4679831,1 7.4292187,46.468589,1 7.4291066,46.4688619,1 7.4290537,46.4691138,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4290537,46.4691138,1 7.4286822,46.4691654,1 7.4284659,46.4692383,1 7.4281887,46.4695127,1 7.4278132,46.4699265,1 7.4276201,46.4700817,1 7.4271158,46.4705176,1 7.4268262,46.4707615,1 7.4268047,46.4708649,1 7.4269334,46.4710275,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Obere Ägertenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4302379,46.4654336,1 7.430592,46.4651602,1 7.4308602,46.4648646,1 7.4309997,46.4646133,1 7.4313859,46.4639999,1 7.4317721,46.4632313,1 7.4320082,46.4627436,1 7.4321155,46.4624849,1 7.4322834,46.461897,1 7.4323193,46.461199,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Sagistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4351088,46.4673623,1 7.4358872,46.4676242,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oberriedstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4545769,46.4439833,1 7.4547271,46.4439241,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oberriedstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4547271,46.4439241,1 7.4548183,46.4438761,1 7.454876,46.443826,1 7.4550079,46.4436536,1 7.4551627,46.4430606,1 7.4553113,46.4426596,1 7.4554721,46.4423588,1 7.4560542,46.4417253,1 7.4562979,46.441431,1 7.45647,46.441134,1 7.4564938,46.441,1 7.4565824,46.4408413,1 7.4566176,46.4407782,1 7.4572602,46.4399218,1 7.4576464,46.4396497,1 7.4579549,46.4395665,1 7.4587721,46.4394172,1 7.4590882,46.439328,1 7.4594231,46.4391233,1 7.4597503,46.438854,1 7.4600197,46.4385 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oberriedstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4440966,46.4543426,1 7.4441109,46.4543138,1 7.4442933,46.4540773,1 7.444583,46.4537447,1 7.4447935,46.4534764,1 7.4449209,46.4532605,1 7.4449978,46.4530345,1 7.4450658,46.4527542,1 7.4451127,46.4523018,1 7.4451741,46.4520707,1 7.4453308,46.4518244,1 7.4460796,46.4511056,1 7.4469774,46.4504619,1 7.4478827,46.4500392,1 7.448556,46.4497567,1 7.4490141,46.4495254,1 7.4498329,46.4490688,1 7.4503311,46.4488049,1 7.450763,46.448663,1 7.451105,46.4485549,1 7.4513722, [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oberriedstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.444062,46.4544122,1 7.4440966,46.4543426,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lischmattenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4439634,46.4542879,1 7.4438105,46.4542602,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lischmattenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4438105,46.4542602,1 7.4433035,46.4541697,1 7.4407581,46.4538384,1 7.4394643,46.4538143,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rawilstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4430005,46.457189,1 7.4430622,46.4571982,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schulstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4435047,46.4557418,1 7.4434082,46.4557385,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Gutenbrunnenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4448524,46.4597347,1 7.4449449,46.4598479,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bühlbergstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4476773,46.4598777,1 7.4476229,46.4599377,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bühlbergstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4476229,46.4599377,1 7.4475736,46.459992,1 7.4472866,46.4601065,1 7.4471632,46.4601564,1 7.4470908,46.4602063,1 7.4469806,46.460365,1 7.4468012,46.4607348,1 7.4466644,46.4609528,1 7.4465596,46.4612913,1 7.446482,46.4616641,1 7.4465494,46.4620495,1 7.4467601,46.4623722,1 7.4469595,46.462428,1 7.4470958,46.4624741,1 7.4471548,46.4625571,1 7.4471354,46.4626788,1 7.4470643,46.4628183,1 7.4470759,46.4629039,1 7.447149,46.4629496,1 7.4472496,46.4629448,1 7.4473107, [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Ägertenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4376101,46.4601022,1 7.4375109,46.4601364,1 7.4365881,46.4604558,1 7.4361085,46.4605709,1 7.4353588,46.4606376,1 7.4350766,46.4606669,1 7.4348713,46.4607347,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Ägertenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4377581,46.4600511,1 7.4376101,46.4601022,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Sagistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4361018,46.4677055,1 7.4363271,46.4677904,1 7.4370442,46.4681471,1 7.4371615,46.468206,1 7.4384373,46.46873,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Sagistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4358872,46.4676242,1 7.4361018,46.4677055,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Mittlere Ägertenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4290537,46.4691138,1 7.4305276,46.4683451,1 7.4316423,46.467711,1 7.4319089,46.4675275,1 7.4327807,46.4664017,1 7.4335209,46.4654705,1 7.435674,46.4631469,1 7.4366858,46.462123,1 7.4374483,46.4612465,1 7.4377862,46.4608179,1 7.4378453,46.4606479,1 7.4378131,46.4605149,1 7.4377148,46.4603861,1 7.4375109,46.4601364,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Flöschstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4296586,46.4726679,1 7.4295084,46.4724019,1 7.429171,46.4719433,1 7.4290276,46.4717095,1 7.4289541,46.4714632,1 7.4289403,46.4708977,1 7.4290537,46.4691138,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schadaulistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4288706,46.4759627,1 7.4284414,46.475863,1 7.4282269,46.4757891,1 7.4280485,46.4756506,1 7.4279098,46.4754978,1 7.4278668,46.4752687,1 7.427899,46.4750249,1 7.4280814,46.4747663,1 7.4289342,46.4740116,1 7.4295727,46.4730964,1 7.4296586,46.4728821,1 7.4296586,46.4726679,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schadaulistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4292187,46.4760445,1 7.4288706,46.4759627,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4239729,46.4964435,1 7.4241194,46.4963413,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4241194,46.4963413,1 7.4243085,46.4962111,1 7.4245872,46.4960192,1 7.4248311,46.4957794,1 7.4250679,46.4955465,1 7.425394,46.4950502,1 7.425394,46.494607,1 7.4253855,46.4943529,1 7.4252825,46.4941166,1 7.4252996,46.4939629,1 7.4255571,46.493443,1 7.4257889,46.4929289,1 7.4260378,46.4923971,1 7.4263553,46.4919657,1 7.4267244,46.4915698,1 7.427042,46.4912389,1 7.4274368,46.4908607,1 7.4277973,46.4903348,1 7.4277544,46.4901043,1 7.4276085,46.489927,1 7.4273767,4 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4451135,46.4568262,1 7.4457293,46.4570504,1 7.4457346,46.4571022,1 7.4455791,46.4573572,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4310896,46.4978651,1 7.4312559,46.4980313,1 7.4313202,46.4981679,1 7.4314812,46.4983193,1 7.4317494,46.4984966,1 7.43246,46.4986638,1 7.43263,46.4987973,1 7.4326179,46.498943,1 7.4327757,46.4992223,1 7.4332371,46.4995258,1 7.4335304,46.4996856,1 7.4339273,46.4998112,1 7.4342385,46.4998038,1 7.4345241,46.4997444,1 7.4352577,46.4996228,1 7.4360463,46.4995231,1 7.4366203,46.4994493,1 7.437087,46.4993717,1 7.4374357,46.4992757,1 7.4382029,46.4989309,1 7.4388787,4 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.592399,46.488507,1 7.59321,46.488437,1 7.59392,46.488552,1 7.594131,46.488536,1 7.5943718,46.4884212,1 7.5948158,46.4885033,1 7.5952399,46.4885619,1 7.5955708,46.4884936,1 7.5960104,46.4885348,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5960104,46.4885348,1 7.5962371,46.488494,1 7.596404,46.4883944,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5148593,46.4576658,1 7.5139753,46.4570098,1 7.5137473,46.4566738,1 7.5134953,46.4566158,1 7.5132313,46.4567988,1 7.5131163,46.4569628,1 7.5132733,46.4572948,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Diemtigtalstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5600746,46.6314618,1 7.5598156,46.6312398,1 7.559655,46.6309751,1 7.5593873,46.6307986,1 7.5590242,46.6307277,1 7.5582769,46.6304248,1 7.5576765,46.6305044,1 7.5572299,46.6304384,1 7.5555999,46.6298843,1 7.5555016,46.629737,1 7.5554714,46.6294791,1 7.5553783,46.6293059,1 7.5551891,46.629144,1 7.5549186,46.6289567,1 7.5544468,46.6288002,1 7.5541557,46.6287772,1 7.5537162,46.6287061,1 7.553227,46.6285376,1 7.5526808,46.6281825,1 7.5524817,46.6280484,1 7.5518999 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6072841,46.5284422,1 7.6065438,46.5287744,1 7.6059609,46.5289507,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rainweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5725176,46.503522,1 7.571786,46.5036569,1 7.5716948,46.503694,1 7.5715584,46.5037674,1 7.5714301,46.5038062,1 7.5713036,46.5036465,1 7.5711946,46.5034698,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rainweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5716948,46.503694,1 7.5714793,46.5034154,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Trogweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5717115,46.5024556,1 7.5720126,46.5023572,1 7.572155,46.5022396,1 7.5722022,46.5021698,1 7.5721933,46.5021194,1 7.572159,46.502032,1 7.5721677,46.5020008,1 7.572181,46.50198,1 7.572291,46.5019165,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Laserweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5717043,46.5024447,1 7.570935,46.502664,1 7.5706686,46.5027262,1 7.5703643,46.5027686,1 7.5702629,46.5027661,1 7.5701922,46.5027436,1 7.57008,46.502591,1 7.5699495,46.5024145,1 7.569842,46.502313,1 7.569743,46.5022761,1 7.5696887,46.5022836,1 7.5696452,46.5023073,1 7.5696416,46.5023484,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Tannenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5625853,46.4950604,1 7.5629277,46.4952317,1 7.5632285,46.4954048,1 7.56365,46.495627,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5627191,46.4953707,1 7.5625165,46.4953073,1 7.5621808,46.4951509,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Aebiweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5371522,46.4817482,1 7.5372839,46.4820083,1 7.537241,46.4823334,1 7.5370908,46.4827175,1 7.5371766,46.4828653,1 7.5376916,46.4829392,1 7.5382709,46.4830869,1 7.5387215,46.4830721,1 7.5390649,46.483013,1 7.5393653,46.482821,1 7.5395369,46.4827471,1 7.5397515,46.482688,1 7.5400614,46.4825351,1 7.5405388,46.4820442,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Senggistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5524133,46.4901418,1 7.552748,46.4907505,1 7.5531342,46.4908864,1 7.5536321,46.4912646,1 7.5545504,46.491625,1 7.5550053,46.4920091,1 7.5554688,46.4922455,1 7.5555976,46.4922278,1 7.5556793,46.492015,1 7.5554173,46.49169,1 7.5550311,46.4914773,1 7.5549109,46.4913118,1 7.5549882,46.4910991,1 7.5555547,46.4908982,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4673625,46.4564555,1 7.4673641,46.4565592,1 7.4673418,46.45667,1 7.4673426,46.4568327,1 7.467407,46.4569435,1 7.4675943,46.457032,1 7.4676,46.45709,1 7.4675143,46.4571431,1 7.4673962,46.4571579,1 7.4672782,46.4571061,1 7.4671066,46.4569879,1 7.4669969,46.4568804,1 7.4668383,46.4568253,1 7.4668276,46.4566405,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4676573,46.4558604,1 7.4673625,46.4564555,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5555691,46.489152,1 7.5555719,46.4891333,1 7.5555852,46.489115,1 7.5555979,46.4891035,1 7.5556169,46.4890931,1 7.5556628,46.4890846,1 7.5557363,46.4890835,1 7.5559446,46.4890818,1 7.5561531,46.4890823,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Gruebiweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5552097,46.4887457,1 7.5553556,46.4888139,1 7.5555678,46.4888499,1 7.5558846,46.4888569,1 7.556089,46.4888482,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alte Strasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5850973,46.5007372,1 7.5850387,46.5007685,1 7.5846542,46.5009922,1 7.5846239,46.5011334,1 7.5847252,46.501739,1 7.5847275,46.5020678,1 7.5849919,46.5028044,1 7.5855069,46.5035872,1 7.5855713,46.5038678,1 7.5857301,46.5039004,1 7.5859361,46.5039121,1 7.5860004,46.5040303,1 7.5858717,46.5045176,1 7.5860434,46.5048573,1 7.5863867,46.5051675,1 7.5868778,46.506548,1 7.5869798,46.5067495,1 7.587087,46.5069209,1 7.58715,46.5070534,1 7.5872426,46.5074858,1 7.587245,4 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alte Strasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5851089,46.5006757,1 7.5850973,46.5007372,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alte Strasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5851089,46.5006757,1 7.5850643,46.5006438,1 7.5845945,46.5005489,1 7.5842102,46.5002567,1 7.5838483,46.4999466,1 7.5830537,46.4991232,1 7.5826523,46.4989336,1 7.582594,46.4989054,1 7.5810925,46.497901,1 7.5804891,46.4976849,1 7.5801849,46.4975458,1 7.5795841,46.4969549,1 7.5791121,46.4966595,1 7.5788121,46.4963841,1 7.5784683,46.4960686,1 7.5779508,46.4959746,1 7.5778518,46.4959324,1 7.577856,46.4958566,1 7.5780392,46.495596,1 7.5779939,46.49555,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bütscheggenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5753139,46.5088011,1 7.5752226,46.5089091,1 7.5750338,46.5093631,1 7.5749573,46.5094711,1 7.574882,46.5094983,1 7.5747902,46.5094904,1 7.5746294,46.5094263,1 7.5745088,46.5093055,1 7.574491,46.5092875,1 7.57442,46.509189,1 7.574359,46.509088,1 7.574338,46.508939,1 7.574222,46.508688,1 7.574139,46.508567,1 7.574031,46.508442,1 7.573789,46.508273,1 7.573645,46.508149,1 7.573516,46.507976,1 7.57336,46.507811,1 7.573107,46.50769,1 7.572656,46.507421,1 7.572422,46 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hohliebeweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5748122,46.4926149,1 7.5748165,46.4925846,1 7.5748422,46.4925475,1 7.5752285,46.4925784,1 7.5753308,46.4925713,1 7.5753936,46.4925327,1 7.5753914,46.4924534,1 7.5752299,46.4923705,1 7.5750836,46.4923319,1 7.5747518,46.4923365,1 7.574514,46.4923496,1 7.5744161,46.4923149,1 7.5742703,46.4921827,1 7.5741195,46.4920273,1 7.5739786,46.4915334,1 7.5738497,46.4911149,1 7.5737082,46.4907245,1 7.5736295,46.490499,1 7.573569,46.490309,1 7.5735774,46.490168,1 7.5737097, [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5855548,46.5376895,1 7.5856085,46.5377307,1 7.585568,46.5378347,1 7.5853884,46.5379208,1 7.5851067,46.5380153,1 7.584983,46.538079,1 7.5849247,46.5381363,1 7.5848752,46.5382295,1 7.5848662,46.5384329,1 7.5848963,46.5385742,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5817066,46.490105,1 7.5817008,46.4902111,1 7.5816733,46.4907526,1 7.5812232,46.4913729,1 7.5812639,46.4917049,1 7.5811183,46.492002,1 7.5811882,46.4921709,1 7.5809319,46.4930271,1 7.5812974,46.4941264,1 7.581237,46.494378,1 7.5814383,46.4945894,1 7.5819709,46.4947404,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5776565,46.5036379,1 7.5777661,46.503767,1 7.5789243,46.5048037,1 7.580017,46.5059799,1 7.5800649,46.5062539,1 7.5801586,46.5064359,1 7.5804202,46.5068391,1 7.580475,46.506968,1 7.5806871,46.5075547,1 7.580774,46.507992,1 7.5807475,46.5081673,1 7.5806755,46.5083959,1 7.5806824,46.5085984,1 7.5806998,46.5088309,1 7.5806678,46.5089152,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.561354,46.5249937,1 7.5611075,46.5254464,1 7.5603269,46.5258299,1 7.5602224,46.5259294,1 7.5602179,46.5259521,1 7.5602395,46.5259798,1 7.5603954,46.5260321,1 7.5606287,46.5260943,1 7.5612083,46.5262005,1 7.5612555,46.5262337,1 7.5613375,46.5263696,1 7.561382,46.526515,1 7.5613927,46.5267583,1 7.5615433,46.5277193,1 7.5616651,46.5279657,1 7.5617554,46.5283091,1 7.561906,46.5284,1 7.5620182,46.5284211,1 7.5621819,46.5281266,1 7.562649,46.527644,1 7.564524,46.52 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5914358,46.5216049,1 7.591663,46.52154,1 7.591774,46.521568,1 7.59211,46.521848,1 7.592208,46.521883,1 7.592531,46.521957,1 7.592895,46.522174,1 7.592974,46.522297,1 7.593075,46.522407,1 7.593585,46.522719,1 7.593747,46.52275,1 7.593935,46.522758,1 7.5944256,46.5230091,1 7.594503,46.523136,1 7.594599,46.52325,1 7.594762,46.523392,1 7.595077,46.523553,1 7.595237,46.523611,1 7.59534,46.523697,1 7.595377,46.523739,1 7.595485,46.524006,1 7.595641,46.524151,1 7.59 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5656379,46.4915646,1 7.5660518,46.4919536,1 7.5663034,46.4920439,1 7.5662885,46.4923288,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5855548,46.5376895,1 7.5855334,46.5376761,1 7.5854732,46.5376661,1 7.585217,46.537669,1 7.5845096,46.5376307,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bühlbergstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4477077,46.4598442,1 7.4476773,46.4598777,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rütistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4274775,46.4522141,1 7.4261397,46.4530454,1 7.4264807,46.4545093,1 7.4246182,46.4549791,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Ausserschwandstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5739397,46.5051162,1 7.5733159,46.5041805,1 7.5725176,46.503522,1 7.5722936,46.5033372,1 7.5717115,46.5024556,1 7.5717043,46.5024447,1 7.5714965,46.50213,1 7.5709593,46.5015986,1 7.5696299,46.5006507,1 7.566752,46.4977228,1 7.5665412,46.4976961,1 7.5663817,46.4976202,1 7.5663132,46.4975194,1 7.5663009,46.4973709,1 7.566314,46.4972084,1 7.5662826,46.497065,1 7.5662005,46.4969304,1 7.5656932,46.4963425,1 7.5650662,46.4957333,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Birkenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5597583,46.4842011,1 7.560472,46.4841615,1 7.5610374,46.4841326,1 7.561747,46.4840627,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bütscheggenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5739397,46.5051162,1 7.5742401,46.5059307,1 7.5740276,46.5063991,1 7.5741474,46.5067344,1 7.5748979,46.5074196,1 7.5754552,46.508546,1 7.5753139,46.5088011,1 7.5752707,46.5092956,1 7.5756239,46.5103671,1 7.5758202,46.5105712,1 7.5757377,46.5108812,1 7.5750941,46.5111403,1 7.5726804,46.5114307,1 7.5719504,46.5112933,1 7.5717288,46.5112797,1 7.5712568,46.5112509,1 7.5709967,46.5111631,1 7.5695622,46.5107082,1 7.5693037,46.510755,1 7.5685318,46.5110658,1 7.56759 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Dählenweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5619024,46.484733,1 7.5605313,46.4847046,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Fliederweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5573139,46.4905062,1 7.5575742,46.4906144,1 7.5580001,46.49089,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Obere Bodenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5621068,46.4703326,1 7.5618747,46.4704067,1 7.5615007,46.4706892,1 7.5612123,46.4709431,1 7.5609132,46.4715494,1 7.5596006,46.476687,1 7.5595328,46.4773032,1 7.5598308,46.4782305,1 7.559232,46.4796016,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5167801,46.4849324,1 7.5181617,46.4850001,1 7.5189956,46.4843231,1 7.5198652,46.4843966,1 7.5207213,46.4847725,1 7.5217773,46.484755,1 7.5222435,46.4846581,1 7.5224367,46.4843815,1 7.524081,46.4841142,1 7.5247031,46.4843208,1 7.525197,46.4841121,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5622864,46.461042,1 7.5622266,46.4611132,1 7.5622539,46.462548,1 7.5636079,46.4648625,1 7.563823,46.4661917,1 7.5638651,46.4664717,1 7.5630107,46.4683629,1 7.5628846,46.468745,1 7.5628282,46.4694412,1 7.562485,46.4699422,1 7.5621068,46.4703326,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5622314,46.476374,1 7.5622314,46.4762793,1 7.561865,46.4755649,1 7.5619871,46.4745086,1 7.5617307,46.4740812,1 7.5617185,46.4732508,1 7.5613338,46.472689,1 7.5614864,46.4719136,1 7.5612588,46.4715361,1 7.5612549,46.47139,1 7.5612834,46.4712484,1 7.5615722,46.4708814,1 7.5621068,46.4705513,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5624583,46.460924,1 7.5622864,46.461042,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5622313,46.4764657,1 7.5622314,46.476374,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5796758,46.5157114,1 7.5797311,46.5157548,1 7.5799023,46.5158239,1 7.5801322,46.5158917,1 7.5802236,46.5159468,1 7.5802588,46.5160395,1 7.5802508,46.5162606,1 7.5803341,46.5164925,1 7.580727,46.516711,1 7.581195,46.5171189,1 7.581244,46.51722,1 7.5812692,46.5174308,1 7.5813528,46.517721,1 7.5813228,46.5178771,1 7.5814321,46.518047,1 7.5817535,46.5185832,1 7.5820489,46.5190792,1 7.5821911,46.5191199,1 7.5823268,46.5191792,1 7.582469,46.5193924,1 7.5826412,46.5 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5796758,46.5157114,1 7.579568,46.5155332,1 7.5795576,46.5153762,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5167801,46.4849324,1 7.5166386,46.4850139,1 7.5163346,46.4854944,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5496477,46.485998,1 7.5490011,46.4856419,1 7.5478033,46.4852982,1 7.5471908,46.4852248,1 7.5459925,46.4848673,1 7.5448208,46.4848031,1 7.5437823,46.4847023,1 7.5435293,46.4846839,1 7.5433828,46.4847756,1 7.5432896,46.4849131,1 7.5430633,46.4850506,1 7.5429168,46.4850231,1 7.542757,46.4849039,1 7.5424774,46.4848764,1 7.5421313,46.4849681,1 7.5410395,46.4851881,1 7.5404803,46.4853807,1 7.5390955,46.4861049,1 7.537125,46.487095,1 7.5352743,46.4871775,1 7.5339162 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.556403,46.4906599,1 7.5564895,46.4903578,1 7.5564031,46.4900393,1 7.5564249,46.4897068,1 7.5563499,46.4894643,1 7.5561408,46.4893354,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Zelgstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5571221,46.4911702,1 7.557339,46.490971,1 7.5573284,46.4908942,1 7.5572427,46.4907622,1 7.5573095,46.4906602,1 7.5573139,46.4905062,1 7.5572902,46.4904128,1 7.557545,46.490364,1 7.5577631,46.4903969,1 7.5579974,46.4904534,1 7.5592506,46.4915649,1 7.5598352,46.4920944,1 7.5599801,46.492216,1 7.5605367,46.492528,1 7.5615826,46.4930937,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6221411,46.5675483,1 7.6217555,46.5670542,1 7.6214032,46.5667511,1 7.6212605,46.5665937,1 7.6211744,46.5664214,1 7.6211495,46.5663947,1 7.6211127,46.5663881,1 7.6210786,46.5663881,1 7.6210545,46.5663925,1 7.6210286,46.5664097,1 7.6210092,46.5666306,1 7.6210364,46.5667281,1 7.621389,46.567218,1 7.621477,46.567386,1 7.621554,46.567623,1 7.621569,46.567826,1 7.621649,46.568184,1 7.6217257,46.5683166,1 7.6218557,46.5683782,1 7.6219111,46.5684444,1 7.6219239,46.56 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alte Strasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5716754,46.4967489,1 7.5718925,46.4966978,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alte Strasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5718925,46.4966978,1 7.5721073,46.4966416,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alte Strasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5721073,46.4966416,1 7.572546,46.4965413,1 7.5738335,46.4964527,1 7.5761938,46.4961277,1 7.5775242,46.4954778,1 7.5778322,46.4954612,1 7.5778754,46.4954761,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hubelstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5619481,46.4908394,1 7.5618004,46.4908374,1 7.5611634,46.4903397,1 7.5610885,46.4903465,1 7.5601168,46.4909892,1 7.5592506,46.4915649,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Ladholzstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5924089,46.5310813,1 7.5922889,46.5311342,1 7.5917636,46.5312026,1 7.5913287,46.5311455,1 7.590988,46.531039,1 7.590563,46.531075,1 7.590277,46.531153,1 7.589796,46.531169,1 7.589642,46.531198,1 7.5895858,46.5312368,1 7.5896155,46.5312723,1 7.589692,46.531289,1 7.589899,46.531281,1 7.59009,46.531248,1 7.590295,46.531242,1 7.590523,46.53127,1 7.59101,46.531411,1 7.591227,46.531491,1 7.591367,46.531568,1 7.591589,46.531763,1 7.591977,46.531849,1 7.592203,46.531 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lischenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5789112,46.5019253,1 7.578915,46.5018479,1 7.5789126,46.5017241,1 7.5789513,46.5016989,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Neuweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5763776,46.5014193,1 7.576294,46.5014686,1 7.5765898,46.5017882,1 7.5770648,46.5028188,1 7.5776565,46.5036379,1 7.5775725,46.5038386,1 7.577659,46.504053,1 7.577975,46.504743,1 7.578067,46.505214,1 7.5785206,46.505896,1 7.57858,46.506791,1 7.578819,46.507217,1 7.579365,46.507691,1 7.579607,46.508434,1 7.579732,46.508536,1 7.5797057,46.509266,1 7.579671,46.510226,1 7.5797453,46.5109917,1 7.580007,46.511906,1 7.5802506,46.512384,1 7.5805152,46.5129738,1 7.58063 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Oeystrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5597987,46.4888045,1 7.5596114,46.4887086,1 7.5590977,46.4887413,1 7.55826,46.4885102,1 7.557679,46.4883499,1 7.5562602,46.4872899,1 7.555135,46.486923,1 7.5541077,46.486711,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rinderwaldstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5920786,46.5277859,1 7.592013,46.5278814,1 7.5921113,46.5283229,1 7.5922599,46.5285511,1 7.5922599,46.5286679,1 7.592178,46.5287971,1 7.5920264,46.5289161,1 7.5918009,46.5290055,1 7.5914879,46.5290493,1 7.5913605,46.5289891,1 7.5913074,46.5288595,1 7.5915011,46.528447,1 7.5913605,46.528071,1 7.5910448,46.5275052,1 7.5906628,46.5273391,1 7.5905726,46.5270945,1 7.5902867,46.5267791,1 7.5898693,46.5266264,1 7.589723,46.5261891,1 7.5898509,46.5259126,1 7.5892239, [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schmittengraben</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5632271,46.4930606,1 7.5633842,46.4930788,1 7.5635249,46.4931345,1 7.5635872,46.49323,1 7.5633938,46.4935302,1 7.5633565,46.4937197,1 7.5633739,46.4938029,1 7.5633923,46.4938168,1 7.5634261,46.4938155,1 7.5635035,46.4937563,1 7.5636349,46.4936571,1 7.5641212,46.4931646,1 7.5643068,46.4930036,1 7.5644847,46.4928738,1 7.5648105,46.4927291,1 7.5649245,46.4926975,1 7.565606,46.4923128,1 7.5660014,46.4922682,1 7.5662885,46.4923288,1 7.5663814,46.4923822,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schmittengraben</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.568897,46.4933261,1 7.5687413,46.4932105,1 7.5686769,46.4927008,1 7.5684103,46.4924955,1 7.5675587,46.4923767,1 7.5671661,46.4924553,1 7.5665136,46.4924594,1 7.5664566,46.49243,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schulgässli</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5658886,46.4903417,1 7.5656473,46.4907108,1 7.5661236,46.4911985,1 7.5660442,46.491516,1 7.5656379,46.4915646,1 7.5653456,46.4914022,1 7.5648195,46.4911815,1 7.5641047,46.49108,1 7.5635494,46.4910794,1 7.563239,46.4912821,1 7.5627963,46.4915881,1 7.5623751,46.4918667,1 7.5620712,46.4920622,1 7.5613774,46.4922729,1 7.5610408,46.4922866,1 7.5605367,46.492528,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5876833,46.5164516,1 7.5875192,46.5167316,1 7.5874183,46.5169215,1 7.587425,46.5170785,1 7.5875775,46.5172966,1 7.5876717,46.5173423,1 7.5877738,46.517356,1 7.587872,46.517324,1 7.5879397,46.5171981,1 7.5879633,46.5171897,1 7.5879931,46.5171784,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5658886,46.4903417,1 7.565932,46.4902542,1 7.5659587,46.4900282,1 7.5658668,46.4898255,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5987112,46.5396482,1 7.5993066,46.5400455,1 7.5999067,46.5402763,1 7.6000501,46.5404757,1 7.6000148,46.5411065,1 7.6000721,46.5411632,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5922439,46.524217,1 7.5926503,46.5241251,1 7.5930389,46.524197,1 7.592967,46.5247871,1 7.5930735,46.5248648,1 7.593788,46.5252748,1 7.5941389,46.5256564,1 7.5940752,46.5260536,1 7.594492,46.52675,1 7.5951405,46.526862,1 7.5954175,46.5271921,1 7.5955472,46.5272157,1 7.5958773,46.5270624,1 7.5961485,46.5270919,1 7.5966466,46.5275795,1 7.5966706,46.527934,1 7.5973676,46.5279039,1 7.5980285,46.5279941,1 7.5981221,46.5280116,1 7.5983157,46.5281985,1 7.5984235,46.5 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5784191,46.501918,1 7.5784483,46.5020248,1 7.5785677,46.5021453,1 7.5789152,46.5022869,1 7.579346,46.50235,1 7.57937,46.5023535,1 7.5795731,46.5024713,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bonderlenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5871283,46.4860133,1 7.5870001,46.4859898,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bonderlenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5870001,46.4859898,1 7.5865419,46.4861414,1 7.5861778,46.4863286,1 7.5851904,46.4864815,1 7.5844927,46.4870776,1 7.5840558,46.4872544,1 7.5834347,46.4869748,1 7.5831949,46.4870435,1 7.5833797,46.487296,1 7.5831716,46.4875457,1 7.5827035,46.4876497,1 7.5815952,46.4884243,1 7.5809932,46.489163,1 7.5795925,46.490413,1 7.5793256,46.4906279,1 7.5782826,46.4914569,1 7.5773048,46.4918834,1 7.5769663,46.4921038,1 7.5767396,46.4922837,1 7.5764568,46.4926086,1 7.576200 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bonderlenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5871283,46.4860133,1 7.5871827,46.4860238,1 7.5880126,46.4861803,1 7.588105,46.4862347,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hirzbodenportstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.587042,46.4886078,1 7.5865782,46.4891164,1 7.5860911,46.4895304,1 7.5853664,46.4900213,1 7.5849608,46.4901754,1 7.5842203,46.490802,1 7.5836122,46.4911889,1 7.5834458,46.4913556,1 7.5830459,46.4921806,1 7.5824807,46.4927062,1 7.5818375,46.4934555,1 7.5817816,46.4938726,1 7.5819709,46.4947404,1 7.5821341,46.4953662,1 7.5823615,46.4964461,1 7.5827043,46.4971018,1 7.5829548,46.4981568,1 7.5832431,46.4984279,1 7.5840128,46.4988362,1 7.5842205,46.4990653,1 7.58387 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5821341,46.4953662,1 7.5837231,46.4970956,1 7.5857965,46.4987966,1 7.5860984,46.499632,1 7.586803,46.4998836,1 7.5870948,46.4997729,1 7.5872156,46.499632,1 7.5874027,46.4997231,1 7.5871018,46.5006672,1 7.5871059,46.5011125,1 7.5874893,46.5015618,1 7.5883262,46.5019288,1 7.5886041,46.5022256,1 7.5892868,46.5025669,1 7.5894274,46.5030495,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.587042,46.4886078,1 7.587899,46.48825,1 7.5882043,46.4882427,1 7.5886503,46.488306,1 7.588931,46.488327,1 7.589214,46.488259,1 7.589931,46.487709,1 7.590149,46.487378,1 7.5904105,46.4872809,1 7.590543,46.487167,1 7.590873,46.487027,1 7.5911572,46.4869727,1 7.5912821,46.4869728,1 7.591414,46.486973,1 7.5915741,46.4868982,1 7.591735,46.486781,1 7.5919641,46.4868266,1 7.5918939,46.4869026,1 7.591729,46.487148,1 7.591454,46.488028,1 7.5911193,46.4884027,1 7.59150 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5850387,46.5007685,1 7.5850317,46.501067,1 7.5855276,46.5016065,1 7.5865636,46.5024871,1 7.5868966,46.5026795,1 7.5872814,46.5030569,1 7.5874664,46.5030643,1 7.5877032,46.5027091,1 7.5876292,46.5023613,1 7.587681,46.5021467,1 7.5879622,46.5022947,1 7.5889464,46.5026203,1 7.5894274,46.5030495,1 7.5895162,46.5032567,1 7.5898342,46.5032999,1 7.5898564,46.5037902,1 7.589797,46.5040501,1 7.5899159,46.5043324,1 7.5898936,46.5047335,1 7.5904433,46.5055655,1 7.591126 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.587042,46.4886078,1 7.5874305,46.4882863,1 7.587553,46.4879879,1 7.5876084,46.4877632,1 7.588218,46.4872813,1 7.5886301,46.4867943,1 7.5885713,46.4864604,1 7.5883219,46.4862734,1 7.588105,46.4862347,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Bodenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5655667,46.489498,1 7.5651387,46.4893362,1 7.564879,46.4889907,1 7.5647194,46.4885724,1 7.5641218,46.4881265,1 7.5639912,46.4878728,1 7.5639752,46.4876249,1 7.5637244,46.487204,1 7.5634686,46.4869531,1 7.5632835,46.4867532,1 7.5630315,46.4863658,1 7.5626687,46.4859012,1 7.5625647,46.4856405,1 7.5623769,46.4854461,1 7.5621275,46.4851632,1 7.5619548,46.4849002,1 7.5619024,46.484733,1 7.5618104,46.4844506,1 7.561747,46.4840627,1 7.5614957,46.4825944,1 7.5614079, [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Eselmoosgassa</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5561553,46.4856415,1 7.5557635,46.4856558,1 7.5549529,46.485598,1 7.5547141,46.4854509,1 7.5544736,46.4853845,1 7.5543692,46.4854041,1 7.5542189,46.4854749,1 7.5541303,46.4854825,1 7.5540353,46.4855054,1 7.553853,46.485527,1 7.553726,46.485561,1 7.553685,46.485587,1 7.553433,46.485684,1 7.5532166,46.4856797,1 7.553134,46.485678,1 7.5529402,46.4854934,1 7.5526494,46.4852944,1 7.552326,46.484918,1 7.552172,46.4848,1 7.5520961,46.4847183,1 7.552012,46.484569,1 7 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Flecklistrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.561295,46.4811046,1 7.5614161,46.48107,1 7.5619614,46.4809337,1 7.56233,46.4809424,1 7.563085,46.4812124,1 7.5638695,46.48163,1 7.5642386,46.4822449,1 7.5651023,46.4831244,1 7.5654245,46.4839163,1 7.5657444,46.4842614,1 7.5661292,46.484468,1 7.5666203,46.4846783,1 7.5668295,46.4847669,1 7.5671931,46.484926,1 7.5674652,46.4851221,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Fuhrenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5561553,46.4856415,1 7.5568207,46.4854527,1 7.5575266,46.4853598,1 7.5577332,46.4852617,1 7.5579355,46.484896,1 7.5580374,46.4845238,1 7.5577925,46.4836498,1 7.557817,46.4830379,1 7.5583492,46.4819039,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Gspennweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5638695,46.48163,1 7.564176,46.4816392,1 7.5645116,46.4816762,1 7.5650441,46.4817209,1 7.5652433,46.4817563,1 7.5655296,46.4818457,1 7.5658943,46.4819458,1 7.5661964,46.4820121,1 7.5663732,46.4820583,1 7.5665937,46.4821825,1 7.5668676,46.4822782,1 7.5670657,46.4823033,1 7.5673032,46.4822205,1 7.5673958,46.4820244,1 7.567317,46.4817693,1 7.5673377,46.4816797,1 7.5674461,46.4816661,1 7.5675411,46.481702,1 7.5676495,46.4818092,1 7.5677125,46.481968,1 7.5680791,4 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5549954,46.4898085,1 7.553959,46.4889851,1 7.553271,46.4880191,1 7.552624,46.4874431,1 7.551504,46.4870491,1 7.550608,46.4864261,1 7.5496477,46.485998,1 7.549065,46.4855751,1 7.5461028,46.4845429,1 7.545601,46.4843911,1 7.5450642,46.484286,1 7.544646,46.4842091,1 7.544096,46.4842611,1 7.54335,46.4841501,1 7.543024,46.4839871,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Kreuzgasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5583492,46.4819039,1 7.558488,46.4819183,1 7.5589982,46.4817042,1 7.5599043,46.4812412,1 7.560118,46.4811965,1 7.561295,46.4811046,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lismiweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5671931,46.484926,1 7.5670729,46.4855393,1 7.5667849,46.4857561,1 7.566834,46.4858727,1 7.5671599,46.4862692,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5658155,46.489718,1 7.5655667,46.489498,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5658668,46.4898255,1 7.5658155,46.489718,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.566834,46.4858727,1 7.5665666,46.4859805,1 7.566584,46.4861788,1 7.5667501,46.4863846,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.561295,46.4811046,1 7.560827,46.4806023,1 7.5607781,46.4791491,1 7.5609247,46.4781599,1 7.5622314,46.476548,1 7.5622314,46.476513,1 7.5622313,46.4764657,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Walezubestrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5674652,46.4851221,1 7.5677176,46.4855439,1 7.5679169,46.4859883,1 7.5686415,46.4865509,1 7.568748,46.486657,1 7.5688367,46.4867031,1 7.5696467,46.487175,1 7.570372,46.4879376,1 7.5704705,46.4881439,1 7.5707587,46.4883279,1 7.5708117,46.4883663,1 7.5709129,46.488434,1 7.5714324,46.4889418,1 7.5718473,46.4897383,1 7.5721035,46.4900381,1 7.5722968,46.4907052,1 7.5725212,46.4911091,1 7.5728347,46.4914564,1 7.5729843,46.4919146,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Kuonisbergliweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5508319,46.4815667,1 7.550886,46.481604,1 7.551017,46.481662,1 7.5517182,46.4815741,1 7.551993,46.481463,1 7.552258,46.481249,1 7.552478,46.481152,1 7.5528719,46.4810715,1 7.552972,46.481051,1 7.553187,46.480938,1 7.553375,46.480816,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Kuonisbergliweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5508319,46.4815667,1 7.5509021,46.4815181,1 7.551101,46.481458,1 7.551329,46.481362,1 7.5514522,46.4812387,1 7.551571,46.48097,1 7.551688,46.480578,1 7.551781,46.480405,1 7.551891,46.480258,1 7.5520744,46.4800436,1 7.5524006,46.4797169,1 7.5526215,46.4795293,1 7.5529788,46.4789449,1 7.553007,46.47881,1 7.552982,46.478716,1 7.5529262,46.4786992,1 7.5527854,46.4787285,1 7.5524896,46.4790539,1 7.5523318,46.4792022,1 7.5521392,46.479332,1 7.5518842,46.4794254,1 7 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Köpflisbergstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.457797,46.4368213,1 7.4575621,46.4367506,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Köpflisbergstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4579366,46.4368633,1 7.457797,46.4368213,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Köpflisbergstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4606355,46.4376757,1 7.4579366,46.4368633,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Alte Strasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5778754,46.4954761,1 7.5779939,46.49555,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lischenstrasse</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5778518,46.4959324,1 7.5777961,46.4960149,1 7.5778017,46.4962336,1 7.5779563,46.4963871,1 7.5783668,46.4966863,1 7.5788599,46.4970856,1 7.5788853,46.4971104,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Margeliweg</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5665136,46.4924594,1 7.5665266,46.4925761,1 7.5667785,46.4927724,1 7.5669022,46.4932502,1 7.566879,46.4935537,1 7.5670434,46.4938744,1 7.5672909,46.4940688,1 7.5678329,46.4948354,1 7.5681231,46.4949172,1 7.5682468,46.4954237,1 7.5687843,46.4960333,1 7.569229,46.4964059,1 7.5693856,46.4964512,1 7.5696317,46.496726,1 7.5697815,46.4969634,1 7.5699588,46.4971615,1 7.5702091,46.4972483,1 7.5702308,46.4974098,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Schmittengraben</name>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5663814,46.4923822,1 7.5664566,46.49243,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5648105,46.4927291,1 7.5650265,46.4920778,1 7.5647011,46.4919159,1 7.5645316,46.4919494,1 7.5646492,46.4920872,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Unclassified</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5724996,46.4938582,1 7.5721087,46.4928193,1 7.5718566,46.492604,1 7.5717708,46.4916012,1 7.5715854,46.4913815,1 7.5705649,46.4909123,1</coordinates>
+            </LineString>
+          </Placemark>
+        </Folder>
+        <Folder>
+          <name>Pedestrian</name>
+          <Style id="style-Pedestrian">
+            <LineStyle>
+              <color>#ff808080</color>
+              <width>3</width>
+            </LineStyle>
+          </Style>
+          <Placemark>
+            <name>Schulgässli</name>
+            <styleUrl>#style-Pedestrian</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5605367,46.492528,1 7.5595144,46.4930964,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Kronenplatz</name>
+            <styleUrl>#style-Pedestrian</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4425957,46.4564794,1 7.4425442,46.4567004,1 7.4424533,46.457099,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Pedestrian</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5598352,46.4920944,1 7.5587375,46.4925106,1</coordinates>
+            </LineString>
+          </Placemark>
+        </Folder>
+        <Folder>
+          <name>Service</name>
+          <Style id="style-Service">
+            <LineStyle>
+              <color>#ffd0d0d0</color>
+              <width>2</width>
+            </LineStyle>
+          </Style>
+          <Placemark>
+            <name>Gartenweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5643603,46.4953787,1 7.5650953,46.4963004,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Fitzerweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5575266,46.4853598,1 7.5577103,46.485572,1 7.5583125,46.4854727,1 7.5585068,46.4854474,1 7.5590842,46.4856691,1 7.5593687,46.4856356,1 7.5591302,46.4852633,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Walehältiweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.559232,46.4796016,1 7.5586532,46.4793161,1 7.5582045,46.4789538,1 7.557758,46.4790122,1 7.5577696,46.4790842,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.566314,46.4972084,1 7.5666254,46.4971783,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5676532,46.4982767,1 7.5669653,46.497796,1 7.566752,46.4977228,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5555284,46.4878909,1 7.5553714,46.4877889,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5609767,46.4931868,1 7.5609149,46.493261,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4794227,46.5658312,1 7.4790691,46.5656171,1 7.4789409,46.56562,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4562979,46.441431,1 7.456496,46.4414858,1 7.456975,46.44131,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5028378,46.5395826,1 7.503522,46.5419711,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.574028,46.5050557,1 7.574161,46.5050942,1 7.5740709,46.5051857,1 7.5739397,46.5051162,1 7.574028,46.5050557,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4438332,46.4578509,1 7.4443253,46.4578916,1 7.444375,46.45771,1 7.4444111,46.4575848,1 7.4444794,46.4574163,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5798959,46.4994904,1 7.580177,46.499669,1 7.580039,46.499962,1 7.580111,46.50019,1 7.5802269,46.5002556,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5796209,46.5015556,1 7.5800453,46.5016055,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.577957,46.493648,1 7.578012,46.493478,1 7.578502,46.492951,1 7.5788628,46.4927947,1 7.5789815,46.4928026,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5823413,46.514709,1 7.5826838,46.5145655,1 7.582687,46.5143769,1 7.582609,46.514204,1 7.581843,46.513665,1 7.5816472,46.5136336,1 7.5810861,46.5130171,1 7.5802506,46.512384,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.581843,46.513665,1 7.5821177,46.5135156,1 7.582334,46.513319,1 7.582116,46.512569,1 7.581709,46.511981,1 7.5811311,46.5115993,1 7.5809768,46.5114974,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5840532,46.5197587,1 7.5841373,46.5198684,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4760571,46.4270912,1 7.4761172,46.426896,1 7.4759369,46.4265765,1 7.476203,46.426446,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Krummenbach</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4391746,46.4521405,1 7.4397148,46.4520287,1 7.440477,46.4520745,1 7.4409061,46.4521561,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Krummenbach</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.440477,46.4520745,1 7.440551,46.4518706,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Krummenbach</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4409061,46.4521561,1 7.4416534,46.4523294,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4355302,46.454095,1 7.436013,46.4543413,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4461285,46.4588623,1 7.4465356,46.4580981,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4358702,46.4539509,1 7.4359997,46.4540404,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5789815,46.4928026,1 7.5790734,46.4928471,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5919641,46.4868266,1 7.592117,46.4869065,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6059609,46.5289507,1 7.6056635,46.5289968,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.592703,46.526096,1 7.593466,46.525483,1 7.5930735,46.5248648,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.592178,46.5287971,1 7.5922406,46.5288691,1 7.5923247,46.529017,1 7.5923721,46.5291939,1 7.5923976,46.5293461,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.578854,46.5249327,1 7.5785473,46.524736,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5615433,46.5277193,1 7.561374,46.5277584,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5771625,46.5297081,1 7.5757467,46.5295395,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Hahnenmoosstrasse</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5132733,46.4572948,1 7.5133883,46.4573978,1 7.5132933,46.4574818,1 7.5130673,46.4573498,1 7.5126303,46.4572888,1 7.5118483,46.4574828,1 7.5101523,46.4576848,1 7.5095283,46.4576228,1 7.5085313,46.4572698,1 7.5080333,46.4572118,1 7.5069933,46.4572868,1 7.5061813,46.4572468,1 7.5057723,46.4574628,1 7.5058393,46.4578288,1 7.5087808,46.4574575,1 7.5031103,46.4577448,1 7.5030413,46.4578388,1 7.5034833,46.4581518,1 7.5034483,46.4582518,1 7.5024893,46.4581448,1 7.500 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5751846,46.4916084,1 7.5749365,46.491503,1 7.5747446,46.4914272,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5769663,46.4921038,1 7.576441,46.491776,1 7.576364,46.491621,1 7.576362,46.491427,1 7.5763871,46.4912304,1 7.5763182,46.4911237,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5795925,46.490413,1 7.5794074,46.4902555,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5734897,46.4935177,1 7.573538,46.4934839,1 7.5735483,46.493418,1 7.573556,46.4933099,1 7.5735755,46.4932551,1 7.573676,46.4931932,1 7.5738286,46.4931243,1 7.5739371,46.4931082,1 7.574012,46.493094,1 7.5741504,46.4930548,1 7.5742015,46.4930235,1 7.5742826,46.4928928,1 7.574376,46.492803,1 7.574421,46.492763,1 7.574598,46.492717,1 7.574774,46.492685,1 7.5749459,46.492669,1 7.5751353,46.4926314,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.574376,46.492803,1 7.5746354,46.4929073,1 7.5748091,46.4930498,1 7.5749942,46.4932398,1 7.5752138,46.4933824,1 7.5754645,46.4934693,1 7.5757087,46.4935283,1 7.5761725,46.4935343,1 7.5763535,46.4935589,1 7.5764212,46.4936211,1 7.576495,46.493829,1 7.576602,46.494096,1 7.576795,46.494181,1 7.5770454,46.4942655,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5849078,46.5347552,1 7.5849885,46.5347378,1 7.585183,46.534753,1 7.5855229,46.5347513,1 7.5856717,46.5347707,1 7.585943,46.5348464,1 7.586016,46.5348314,1 7.58602,46.5347903,1 7.5858345,46.5346537,1 7.5856432,46.5344437,1 7.5856581,46.5344076,1 7.5857148,46.5344078,1 7.5859478,46.5345439,1 7.5861633,46.5345952,1 7.586366,46.5346123,1 7.586484,46.534542,1 7.5866893,46.5343725,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.587059,46.5342825,1 7.587135,46.534398,1 7.5871929,46.5344569,1 7.5873657,46.5345937,1 7.587636,46.534746,1 7.5878421,46.5348345,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Falkiweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.561747,46.4840627,1 7.5623648,46.4840221,1 7.5624662,46.4841424,1 7.562591,46.4842295,1 7.5630513,46.4842235,1 7.5633106,46.4842166,1 7.5634827,46.4841367,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5623769,46.4854461,1 7.5622912,46.4855938,1 7.5622704,46.4860729,1 7.5621787,46.4861073,1 7.5619413,46.4860499,1 7.5615122,46.4859008,1 7.5611623,46.4859065,1 7.5609581,46.485938,1 7.5608373,46.4860184,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5622704,46.4860729,1 7.5623863,46.4862233,1 7.5624681,46.4863847,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5556026,46.4788917,1 7.5555477,46.479214,1 7.5556151,46.4795353,1 7.5556149,46.4801761,1 7.5556517,46.4804555,1 7.5557955,46.4808898,1 7.5558411,46.4812561,1 7.5558839,46.4816013,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5548512,46.4833925,1 7.5550889,46.4838028,1 7.5552822,46.4840196,1 7.5554987,46.4843666,1 7.5556369,46.4845961,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5601552,46.4830974,1 7.560116,46.4826468,1 7.5614957,46.4825944,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Falkiweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5630513,46.4842235,1 7.5630409,46.4844811,1 7.5628733,46.4846662,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Birkenweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.560472,46.4841615,1 7.5604406,46.4845196,1 7.5602381,46.4846229,1 7.5596029,46.4846037,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Birkenweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5610374,46.4841326,1 7.5611142,46.4843658,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Brunniweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5567689,46.4813658,1 7.5568027,46.4816531,1 7.5569895,46.4818235,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5566823,46.4811255,1 7.5567689,46.4813658,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Egghausweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.562353,46.4820061,1 7.5622413,46.4825617,1 7.5614957,46.4825944,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5783668,46.4966863,1 7.5779866,46.4968608,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5788599,46.4970856,1 7.578559,46.497615,1 7.5784905,46.4976816,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5804891,46.4976849,1 7.5804732,46.4976377,1 7.580323,46.4974715,1 7.580186,46.4973576,1 7.580208,46.4972438,1 7.5802253,46.4971513,1 7.5802103,46.4970622,1 7.5801714,46.4970016,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.580573,46.518538,1 7.580476,46.5182,1 7.580281,46.517923,1 7.580272,46.517884,1 7.5803133,46.5178587,1 7.580384,46.517862,1 7.580533,46.518081,1 7.580644,46.518193,1 7.580787,46.518268,1 7.580881,46.518395,1 7.581021,46.518517,1 7.581108,46.518651,1 7.581235,46.518762,1 7.581369,46.519014,1 7.5815,46.519189,1 7.581947,46.519404,1 7.582104,46.519512,1 7.582187,46.519603,1 7.582507,46.519782,1 7.58259,46.519851,1 7.582661,46.5198661,1 7.5827033,46.5198324,1 7.5 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5532166,46.4856797,1 7.553475,46.485585,1 7.553817,46.485256,1 7.553812,46.485215,1 7.5536868,46.4849435,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5615007,46.4706892,1 7.5613997,46.470631,1 7.5607353,46.4711441,1 7.560183,46.471455,1 7.5601093,46.4714637,1 7.560081,46.4714134,1 7.5602488,46.4711103,1 7.5603802,46.4708687,1 7.5608448,46.4705818,1 7.5616215,46.4698555,1 7.5617283,46.4695452,1 7.5616912,46.4694069,1 7.5616128,46.4693072,1 7.5614945,46.469236,1 7.5613456,46.469107,1 7.5613033,46.4689269,1 7.5615058,46.4686482,1 7.5616043,46.468364,1 7.5615151,46.4679643,1 7.5616194,46.4674144,1 7.5614199,46 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5601093,46.4714637,1 7.5595884,46.4717158,1 7.559275,46.47182,1 7.5589672,46.4720202,1 7.5584806,46.4723453,1 7.5581622,46.4724206,1 7.55787,46.472668,1 7.5575608,46.4728455,1 7.55748,46.472929,1 7.557326,46.473397,1 7.557232,46.473534,1 7.557135,46.473651,1 7.556988,46.473764,1 7.5568899,46.4738759,1 7.556803,46.4740459,1 7.556738,46.474206,1 7.5567085,46.4744798,1 7.5567473,46.4745861,1 7.556734,46.474669,1 7.5566457,46.4748183,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.552982,46.478716,1 7.553269,46.477763,1 7.5534638,46.4774581,1 7.5535454,46.4773304,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4714196,46.4524422,1 7.4714839,46.4523756,1 7.4714947,46.4522943,1 7.4714517,46.4522278,1 7.471441,46.4519617,1 7.4716556,46.4516365,1 7.4717951,46.4512964,1 7.4718916,46.4508529,1 7.472471,46.4500102,1 7.472825,46.449308,1 7.473222,46.4487684,1 7.4733722,46.4486501,1 7.4739087,46.4484061,1 7.4745953,46.4483027,1 7.4755072,46.4481696,1 7.4758828,46.4480291,1 7.4760008,46.447933,1 7.4758077,46.4478222,1 7.4754751,46.4477556,1 7.4751532,46.4476817,1 7.4750459,4 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.4938009,46.4443235,1 7.4948406,46.4440224,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5134953,46.4566158,1 7.5133908,46.4565887,1 7.513144,46.4564409,1 7.5130367,46.4562857,1 7.5130474,46.4560714,1 7.5129509,46.4559753,1 7.5124574,46.4556575,1 7.5121891,46.4554875,1 7.5120282,46.4554431,1 7.5115025,46.4553766,1 7.5107515,46.4552509,1 7.5101292,46.4549109,1 7.5096357,46.4545192,1 7.5092709,46.4540831,1 7.5091743,46.4537948,1 7.5093889,46.4534992,1 7.5097215,46.4531665,1 7.5098181,46.4527452,1 7.5101936,46.4521243,1 7.5107622,46.4518434,1 7.5111 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5346943,46.4673158,1 7.5349879,46.4672014,1 7.5352239,46.4672753,1 7.5352454,46.4675413,1 7.5350737,46.4678812,1 7.5349665,46.4680881,1 7.5350523,46.4683246,1 7.5352454,46.4685759,1 7.5356746,46.4688862,1 7.5363827,46.4692409,1 7.5369191,46.4694921,1 7.5374341,46.4696252,1 7.5378632,46.4696547,1 7.5380993,46.4696252,1 7.5383353,46.469433,1 7.5383782,46.4692261,1 7.5380564,46.468295,1 7.5380993,46.4679847,1 7.5384211,46.4675856,1 7.5388718,46.4671718,1 7.53890 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5090349,46.4503503,1 7.5091616,46.4501765,1 7.5092153,46.4499695,1 7.5092904,46.4498586,1 7.5095586,46.4497551,1 7.5096873,46.449659,1 7.5098268,46.4495186,1 7.5099234,46.4493855,1 7.5100414,46.4492746,1 7.5102881,46.4492599,1 7.510374,46.4491933,1 7.5104705,46.4490677,1 7.5107495,46.4489124,1 7.5110177,46.4488976,1 7.5112752,46.4488829,1 7.5115112,46.4488755,1 7.5117258,46.4488976,1 7.5119618,46.4489716,1 7.512273,46.448979,1 7.5126163,46.4491046,1 7.5127772 [...]
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5675205,46.4896429,1 7.5675839,46.4901911,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5613927,46.5267583,1 7.5616121,46.5269084,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5789126,46.5017241,1 7.5785017,46.5014825,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5789309,46.500105,1 7.5788346,46.4997917,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5791699,46.4928879,1 7.5790734,46.4928471,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5789309,46.500105,1 7.5786124,46.5000666,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5844175,46.5180817,1 7.5843919,46.5179006,1 7.5842967,46.5176599,1 7.584072,46.5172756,1 7.583998,46.516732,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5747518,46.4923365,1 7.5747561,46.4922525,1 7.5748319,46.4921223,1 7.5748181,46.4918,1 7.574828,46.4916949,1 7.574893,46.4916664,1 7.5750862,46.4916562,1 7.5751846,46.4916084,1 7.5752826,46.491563,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5856684,46.5185937,1 7.585732,46.518904,1 7.585997,46.519247,1 7.5863,46.519441,1 7.5866689,46.5195382,1 7.586981,46.519691,1 7.587645,46.520291,1 7.587742,46.520478,1 7.5876898,46.5205699,1 7.58757,46.5206516,1 7.587464,46.5207519,1 7.587397,46.520905,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5871749,46.5189125,1 7.5864254,46.5189694,1 7.5859396,46.5188548,1 7.5856684,46.5185937,1 7.5852648,46.5183663,1 7.5851079,46.5182339,1 7.5848608,46.5181009,1 7.5844175,46.5180817,1 7.5841229,46.5179971,1 7.5839457,46.5179174,1 7.5837708,46.5177703,1 7.5837251,46.5176286,1 7.5836592,46.5174623,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5802588,46.5160395,1 7.5805381,46.5164442,1 7.5811876,46.5165553,1 7.5812782,46.5165868,1 7.5820222,46.5167732,1 7.5823119,46.5170409,1 7.5823387,46.5174783,1 7.5824085,46.5176703,1 7.5828028,46.5180929,1 7.5833177,46.5182535,1 7.5835431,46.5183753,1 7.5837979,46.5183661,1 7.5840124,46.5183144,1 7.5834867,46.5181206,1 7.5833553,46.5179767,1 7.583358,46.517626,1 7.5834867,46.5174323,1 7.5836592,46.5174623,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6025022,46.5497569,1 7.6020138,46.5498841,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.6122192,46.5585079,1 7.6125202,46.5582846,1 7.6125382,46.5581503,1 7.6124765,46.5580017,1 7.61231,46.557889,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5875485,46.5190239,1 7.5871749,46.5189125,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5620419,46.4912371,1 7.5627963,46.4915881,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5853231,46.5118698,1 7.5867416,46.5114409,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5808419,46.5032417,1 7.5806755,46.503651,1 7.5807632,46.5038849,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5833344,46.5060923,1 7.5829935,46.505959,1 7.582733,46.50693,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5619716,46.4909369,1 7.562116,46.4908836,1 7.5624485,46.4911228,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5845033,46.511303,1 7.5847716,46.5113253,1 7.5849493,46.5116193,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5925689,46.5257627,1 7.592703,46.526096,1 7.5926549,46.5263226,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5823956,46.5048989,1 7.5822898,46.5036369,1 7.5815068,46.5029364,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5890023,46.5205153,1 7.5884929,46.5201995,1 7.5883311,46.5199786,1 7.5882242,46.5196358,1 7.5875485,46.5190239,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5709768,46.4961208,1 7.5710612,46.4963304,1 7.5713268,46.4965265,1 7.5716017,46.497285,1 7.5720307,46.4977428,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.588105,46.4862347,1 7.5882589,46.4861244,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Brunniweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5583492,46.4819039,1 7.55795,46.481785,1 7.5573748,46.4816562,1 7.5568027,46.4816531,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Fuhrenstrasse</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5535228,46.4865284,1 7.5540973,46.4860504,1 7.5553724,46.4858594,1 7.5555516,46.4857964,1 7.555751,46.4857822,1 7.5561161,46.4856628,1 7.5561553,46.4856415,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Rörliweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5666203,46.4846783,1 7.5665448,46.4847291,1 7.5656341,46.4848814,1 7.5658042,46.4853983,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5589982,46.4817042,1 7.5590716,46.4818306,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.566311,46.4842938,1 7.5661292,46.484468,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5668295,46.4847669,1 7.5669459,46.4845543,1 7.566928,46.4842878,1 7.566311,46.4842938,1 7.5661779,46.4842949,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5616769,46.4873407,1 7.5618759,46.4873603,1 7.562336,46.4875068,1 7.5629211,46.4878619,1 7.5633173,46.488305,1 7.5638849,46.4885749,1 7.5651387,46.4893362,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Strubelweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5561553,46.4856415,1 7.5560704,46.4854118,1 7.5559655,46.4852385,1 7.5558801,46.4850392,1 7.5558516,46.4849379,1 7.5556369,46.4845961,1 7.5557556,46.4835758,1 7.5556465,46.4832228,1 7.5556302,46.482438,1 7.5556902,46.4823253,1 7.5559629,46.481946,1 7.5559405,46.4817142,1 7.5558839,46.4816013,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <name>Lärcheweg</name>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5611634,46.4903397,1 7.5610451,46.4902373,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5737082,46.4907245,1 7.5735328,46.490616,1 7.5733673,46.4903853,1 7.5733062,46.4902442,1 7.5732825,46.4900712,1 7.5733348,46.4898921,1 7.5733339,46.4894668,1 7.5732422,46.4892976,1 7.5730973,46.4891714,1 7.5728372,46.4890235,1 7.5726529,46.489033,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5696679,46.4904828,1 7.5696337,46.4903928,1 7.5694953,46.4902536,1 7.5693484,46.4900982,1 7.5692716,46.489935,1 7.5692449,46.4897418,1 7.569231,46.4895346,1 7.5691648,46.4893786,1 7.5689467,46.4891493,1 7.5688378,46.4889221,1 7.5689846,46.4887416,1 7.5687855,46.4885286,1 7.5687156,46.4884763,1 7.5686163,46.4882459,1 7.5685316,46.4880573,1 7.5684612,46.487926,1 7.5683453,46.4878612,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5739091,46.4841923,1 7.5735123,46.4842222,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5707587,46.4883279,1 7.5714861,46.4882473,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5737649,46.4942215,1 7.5729909,46.4941247,1 7.5724996,46.4938582,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5686415,46.4865509,1 7.5685948,46.4864379,1 7.5685481,46.4863398,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5687156,46.4884763,1 7.5686259,46.4885828,1 7.5686407,46.4886975,1 7.5688378,46.4889221,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5601168,46.4909892,1 7.5595847,46.4906371,1 7.5594989,46.4906215,1 7.5593649,46.490633,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5708117,46.4883663,1 7.5710165,46.488705,1 7.5710179,46.4888509,1 7.5708758,46.4889223,1 7.5708124,46.4889286,1 7.5707761,46.4888902,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5740561,46.4844231,1 7.5739091,46.4841923,1 7.5738582,46.4838387,1 7.5738109,46.4836506,1 7.5736241,46.4835863,1 7.5733468,46.4835758,1 7.5730751,46.4834722,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.5778322,46.4954612,1 7.5774594,46.4953694,1 7.57696,46.4953792,1 7.5765186,46.4953534,1 7.5761855,46.4952056,1 7.5756624,46.4951092,1 7.5748615,46.4951854,1</coordinates>
+            </LineString>
+          </Placemark>
+          <Placemark>
+            <styleUrl>#style-Service</styleUrl>
+            <LineString>
+              <altitudeMode>relativeToGround</altitudeMode>
+              <coordinates>7.568748,46.486657,1 7.5687618,46.4868008,1 7.5686633,46.4868728,1 7.5683637,46.4869243,1 7.5682553,46.4869895,1 7.5682593,46.4871482,1 7.5683489,46.4873599,1 7.5683539,46.4874461,1</coordinates>
+            </LineString>
+          </Placemark>
+        </Folder>
+      </Folder>
+      <Folder>
+        <name>Casings</name>
+        <Folder>
+          <name>Motorway_Casing</name>
+          <Style id="style-Motorway_Casing">
+            <LineStyle>
+              <color>#ff000000</color>
+              <width>7</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Motorway_Link_Casing</name>
+          <Style id="style-Motorway_Link_Casing">
+            <LineStyle>
+              <color>#ff000000</color>
+              <width>4</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Trunk_Casing</name>
+          <Style id="style-Trunk_Casing">
+            <LineStyle>
+              <color>#ff000000</color>
+              <width>7</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+        <Folder>
+          <name>Trunk_Link_Casing</name>
+          <Style id="style-Trunk_Link_Casing">
+            <LineStyle>
+              <color>#ff000000</color>
+              <width>4</width>
+            </LineStyle>
+          </Style>
+        </Folder>
+      </Folder>
+    </Folder>
+  </Document>
+</kml>
diff --git a/examples/data/kml/2012_Earthquakes_Mag5.kml b/examples/data/kml/2012_Earthquakes_Mag5.kml
new file mode 100644
index 0000000..7a8466f
--- /dev/null
+++ b/examples/data/kml/2012_Earthquakes_Mag5.kml
@@ -0,0 +1,10758 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/2.0" xmlns:atom="http://www.w3.org/2005/Atom">
+    <Document>
+        <name>2012 Earthquakes, Magnitude 5</name>
+        <atom:author>
+            <atom:name>U.S. Geological Survey</atom:name>
+        </atom:author>
+        <atom:link href="http://earthquake.usgs.gov"/>
+        <Folder>
+            <name>Magnitude 5</name>
+            <Placemark id="2012 Jan 15 13:40:16.40 UTC">
+                <name>M 5.9 - 2012 Jan 15, SOUTH SHETLAND ISLANDS</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-56.072,-60.975,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 19 06:48:48.75 UTC">
+                <name>M 5.9 - 2012 Jan 19, OFF W. COAST OF S. ISLAND, N.Z.</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>165.778,-46.686,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 17:42:51.72 UTC">
+                <name>M 5.9 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-177.386,-29.43,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 18:52:48.39 UTC">
+                <name>M 5.9 - 2012 Feb 9, MACQUARIE ISLAND REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>157.837,-58.312,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 10 01:47:34.19 UTC">
+                <name>M 5.9 - 2012 Feb 10, FIJI REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-178.549,-17.968,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 13 10:55:09.44 UTC">
+                <name>M 5.9 - 2012 Feb 13, COSTA RICA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-84.121,9.183,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 02:35:00.53 UTC">
+                <name>M 5.9 - 2012 Feb 26, TAIWAN</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>120.891,22.661,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 8 22:50:08.41 UTC">
+                <name>M 5.9 - 2012 Mar 8, SOUTHERN XINJIANG, CHINA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>81.307,39.383,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 19 23:46:35.40 UTC">
+                <name>M 5.9 - 2012 Mar 19, SAMOA ISLANDS REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-175.702,-14.621,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 09:01:06.75 UTC">
+                <name>M 5.9 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>89.441,2.199,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 22:28:59.18 UTC">
+                <name>M 5.9 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>93.821,3.269,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 10 02:13:56.16 UTC">
+                <name>M 5.9 - 2012 May 10, EASTER ISLAND REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-112.587,-28.73,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 19 19:05:18.97 UTC">
+                <name>M 5.9 - 2012 May 19, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>143.311,39.665,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 23 15:02:25.31 UTC">
+                <name>M 5.9 - 2012 May 23, HOKKAIDO, JAPAN REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>142.082,41.335,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 23 23:19:18.05 UTC">
+                <name>M 5.9 - 2012 May 23, WESTERN INDIAN-ANTARCTIC RIDGE</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>139.536,-50.352,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 28 21:47:09.40 UTC">
+                <name>M 5.9 - 2012 May 28, TONGA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-175.976,-19.962,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 2 07:52:53.99 UTC">
+                <name>M 5.9 - 2012 Jun 2, SALTA, ARGENTINA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-63.555,-22.059,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 4 11:18:13.45 UTC">
+                <name>M 5.9 - 2012 Jun 4, JAVA, INDONESIA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>106.371,-7.692,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 9 21:00:18.07 UTC">
+                <name>M 5.9 - 2012 Jun 9, TAIWAN REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>122.248,24.572,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 16 22:18:47.47 UTC">
+                <name>M 5.9 - 2012 Jun 16, LUZON, PHILIPPINES</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>119.563,15.593,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 18 04:25:25.60 UTC">
+                <name>M 5.9 - 2012 Jul 18, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-128.893,-55.661,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 18 08:09:46.20 UTC">
+                <name>M 5.9 - 2012 Jul 18, FIJI REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-178.508,-20.872,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 21 06:11:57.91 UTC">
+                <name>M 5.9 - 2012 Jul 21, VANUATU REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>173.789,-19.19,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 29 12:22:11.81 UTC">
+                <name>M 5.9 - 2012 Jul 29, OFFSHORE GUATEMALA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-92.294,14.191,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 8 10:57:44.30 UTC">
+                <name>M 5.9 - 2012 Aug 8, FIJI</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>178.062,-16.02,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 25 14:16:17.08 UTC">
+                <name>M 5.9 - 2012 Aug 25, HOKKAIDO, JAPAN REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>142.913,42.419,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 9 05:39:37.05 UTC">
+                <name>M 5.9 - 2012 Sep 9, KURIL ISLANDS</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>155.75,49.247,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 11 16:36:49.84 UTC">
+                <name>M 5.9 - 2012 Sep 11, SOUTH OF MARIANA ISLANDS</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>143.218,11.838,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 8 06:26:23.02 UTC">
+                <name>M 5.9 - 2012 Oct 8, GULF OF CALIFORNIA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-109.574,25.127,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 18 01:27:16.02 UTC">
+                <name>M 5.9 - 2012 Oct 18, WEST OF MACQUARIE ISLAND</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>144.006,-54.217,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 23 08:53:38.24 UTC">
+                <name>M 5.9 - 2012 Oct 23, IZU ISLANDS, JAPAN REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>139.251,29.057,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 15 08:21:48.45 UTC">
+                <name>M 5.9 - 2012 Nov 15, BISMARCK SEA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>148.27,-3.109,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 17 05:12:56.77 UTC">
+                <name>M 5.9 - 2012 Nov 17, TONGA REGION</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-172.32,-18.381,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 21 21:36:22.74 UTC">
+                <name>M 5.9 - 2012 Nov 21, LIBERTADOR O'HIGGINS, CHILE</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-71.868,-33.939,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 22 13:07:10.42 UTC">
+                <name>M 5.9 - 2012 Nov 22, SALTA, ARGENTINA</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-63.571,-22.742,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 29 11:10:21.67 UTC">
+                <name>M 5.9 - 2012 Nov 29, NEAR N COAST OF NEW GUINEA, PNG.</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>145.562,-3.423,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 17 17:41:32.30 UTC">
+                <name>M 5.9 - 2012 Dec 17, CENTRAL EAST PACIFIC RISE</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-104.495,-4.178,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 27 00:37:08.83 UTC">
+                <name>M 5.9 - 2012 Dec 27, OFFSHORE MAULE, CHILE</name>
+                <magnitude>5.9</magnitude>
+                <Point>
+                    <coordinates>-73.255,-35.783,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 14 16:36:21.04 UTC">
+                <name>M 5.8 - 2012 Jan 14, BABUYAN ISL REGION, PHILIPPINES</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>121.156,19.202,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 18 12:50:20.53 UTC">
+                <name>M 5.8 - 2012 Jan 18, MOLUCCA SEA</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>126.829,-0.877,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 07:40:12.80 UTC">
+                <name>M 5.8 - 2012 Feb 4, TONGA</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-174.035,-20.536,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 6 11:33:36.98 UTC">
+                <name>M 5.8 - 2012 Feb 6, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>123.08,9.821,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 14 06:22:01.17 UTC">
+                <name>M 5.8 - 2012 Feb 14, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>141.386,36.214,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 15 03:31:20.61 UTC">
+                <name>M 5.8 - 2012 Feb 15, OFF COAST OF OREGON</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-127.518,43.625,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 16 02:20:28.73 UTC">
+                <name>M 5.8 - 2012 Feb 16, MAURITIUS - REUNION REGION</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>65.405,-17.839,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 16 07:58:02.50 UTC">
+                <name>M 5.8 - 2012 Mar 16, LEYTE, PHILIPPINES</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>125.633,10.037,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 17 19:50:20.56 UTC">
+                <name>M 5.8 - 2012 Mar 17, SOUTHERN EAST PACIFIC RISE</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-107.644,-34.905,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 10 05:09:08.41 UTC">
+                <name>M 5.8 - 2012 Apr 10, NORTH OF ASCENSION ISLAND</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-13.972,-1.261,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 08:55:46.96 UTC">
+                <name>M 5.8 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>91.748,1.271,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 23:56:32.93 UTC">
+                <name>M 5.8 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>89.685,1.841,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 14 19:26:43.25 UTC">
+                <name>M 5.8 - 2012 Apr 14, SUNDA STRAIT, INDONESIA</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>105.457,-6.81,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 16 02:17:50.34 UTC">
+                <name>M 5.8 - 2012 Apr 16, SULAWESI, INDONESIA</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>121.855,-2.64,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 16 11:23:43.38 UTC">
+                <name>M 5.8 - 2012 Apr 16, SOUTHERN GREECE</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>21.475,36.632,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 23:14:31.37 UTC">
+                <name>M 5.8 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>93.36,2.158,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 29 10:28:51.87 UTC">
+                <name>M 5.8 - 2012 Apr 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>140.349,35.596,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 2 12:17:59.36 UTC">
+                <name>M 5.8 - 2012 May 2, WEST OF MACQUARIE ISLAND</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>143.836,-54.565,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 19 08:35:10.70 UTC">
+                <name>M 5.8 - 2012 May 19, ANTOFAGASTA, CHILE</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-70.562,-25.729,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 29 03:33:25.48 UTC">
+                <name>M 5.8 - 2012 May 29, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-179.61,-22.13,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 29 07:00:03.00 UTC">
+                <name>M 5.8 - 2012 May 29, NORTHERN ITALY</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>11.086,44.851,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 1 06:56:20.24 UTC">
+                <name>M 5.8 - 2012 Jun 1, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>133.269,-0.72,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 7 09:01:51.13 UTC">
+                <name>M 5.8 - 2012 Jun 7, FIJI REGION</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-176.34,-20.192,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 29 15:31:46.66 UTC">
+                <name>M 5.8 - 2012 Jun 29, SOUTH ATLANTIC OCEAN</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-9.663,-24.747,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 12 12:51:58.86 UTC">
+                <name>M 5.8 - 2012 Jul 12, KURIL ISLANDS</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>151.665,45.452,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 20 06:32:56.09 UTC">
+                <name>M 5.8 - 2012 Jul 20, KURIL ISLANDS</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>156.132,49.354,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 5 13:55:10.36 UTC">
+                <name>M 5.8 - 2012 Aug 5, FIJI REGION</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-178.358,-21.15,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 16 13:24:44.36 UTC">
+                <name>M 5.8 - 2012 Aug 16, SOUTHEAST OF EASTER ISLAND</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-98.905,-36.429,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 18 15:31:40.06 UTC">
+                <name>M 5.8 - 2012 Aug 18, HALMAHERA, INDONESIA</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>128.697,2.645,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 3 06:49:49.73 UTC">
+                <name>M 5.8 - 2012 Sep 3, MORO GULF, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>123.875,6.61,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 27 23:53:49.03 UTC">
+                <name>M 5.8 - 2012 Sep 27, SOLOMON ISLANDS</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>157.456,-8.838,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 04:58:04.93 UTC">
+                <name>M 5.8 - 2012 Oct 14, SOLOMON ISLANDS</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>156.048,-7.145,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 23 09:39:30.70 UTC">
+                <name>M 5.8 - 2012 Oct 23, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>171.691,-22.312,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 11 10:54:41.35 UTC">
+                <name>M 5.8 - 2012 Nov 11, MYANMAR</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>95.832,22.72,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 4 01:42:48.46 UTC">
+                <name>M 5.8 - 2012 Dec 4, SOUTHERN ALASKA</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-150.76,61.237,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 5 17:08:13.56 UTC">
+                <name>M 5.8 - 2012 Dec 5, EASTERN IRAN</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>59.571,33.506,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 14 16:52:38.24 UTC">
+                <name>M 5.8 - 2012 Dec 14, FIJI REGION</name>
+                <magnitude>5.8</magnitude>
+                <Point>
+                    <coordinates>-178.186,-15.307,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 18:38:08.09 UTC">
+                <name>M 5.7 - 2012 Jan 7, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-176.935,-28.613,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 17 12:55:34.72 UTC">
+                <name>M 5.7 - 2012 Jan 17, SAMAR, PHILIPPINES</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>125.837,11.177,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 19 05:58:38.79 UTC">
+                <name>M 5.7 - 2012 Jan 19, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>165.57,-10.966,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 20 20:32:53.44 UTC">
+                <name>M 5.7 - 2012 Jan 20, FLORES REGION, INDONESIA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>119.701,-8.406,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 3 04:33:09.00 UTC">
+                <name>M 5.7 - 2012 Feb 3, VANUATU</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>167.187,-17.463,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 10 05:34:05.03 UTC">
+                <name>M 5.7 - 2012 Feb 10, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>132.691,-0.324,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 4 12:49:02.44 UTC">
+                <name>M 5.7 - 2012 Mar 4, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>169.769,-21.529,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 25 01:05:34.53 UTC">
+                <name>M 5.7 - 2012 Mar 25, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-135.923,-54.576,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 1 14:04:24.91 UTC">
+                <name>M 5.7 - 2012 Apr 1, EASTERN HONSHU, JAPAN</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>140.957,37.116,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 1 21:44:04.13 UTC">
+                <name>M 5.7 - 2012 Apr 1, NEW IRELAND REGION, P.N.G.</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>153.427,-4.516,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 11:53:36.16 UTC">
+                <name>M 5.7 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>89.544,2.913,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 13 10:10:01.20 UTC">
+                <name>M 5.7 - 2012 Apr 13, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>141.152,36.988,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 22:19:46.81 UTC">
+                <name>M 5.7 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>93.853,3.256,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 21 01:19:28.46 UTC">
+                <name>M 5.7 - 2012 Apr 21, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-16.181,-35.229,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 23 21:21:44.86 UTC">
+                <name>M 5.7 - 2012 Apr 23, MOLUCCA SEA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>125.293,0.374,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 25 07:42:23.38 UTC">
+                <name>M 5.7 - 2012 Apr 25, NICOBAR ISLANDS, INDIA REGION</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>93.945,9.011,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 29 08:09:04.34 UTC">
+                <name>M 5.7 - 2012 Apr 29, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>94.509,2.704,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 30 08:00:10.00 UTC">
+                <name>M 5.7 - 2012 Apr 30, NORTH INDIAN OCEAN</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>89.598,1.757,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 1 16:37:58.80 UTC">
+                <name>M 5.7 - 2012 May 1, GUERRERO, MEXICO</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-101.085,18.251,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 5 20:23:31.16 UTC">
+                <name>M 5.7 - 2012 May 5, TONGA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-174.227,-21.477,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 12 23:28:43.57 UTC">
+                <name>M 5.7 - 2012 May 12, TAJIKISTAN</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>70.354,38.612,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 16 00:59:32.38 UTC">
+                <name>M 5.7 - 2012 May 16, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>149.711,-5.504,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 4 14:18:52.30 UTC">
+                <name>M 5.7 - 2012 Jun 4, FIJI REGION</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-177.919,-15.279,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 11 05:29:11.51 UTC">
+                <name>M 5.7 - 2012 Jun 11, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>69.351,36.023,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 15 01:14:07.52 UTC">
+                <name>M 5.7 - 2012 Jun 15, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>126.354,5.719,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 17 03:43:10.05 UTC">
+                <name>M 5.7 - 2012 Jun 17, SOLOMON ISLANDS</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>160.356,-8.511,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 22 04:31:17.30 UTC">
+                <name>M 5.7 - 2012 Jun 22, MACQUARIE ISLAND REGION</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>158.79,-54.36,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 27 06:30:59.86 UTC">
+                <name>M 5.7 - 2012 Jun 27, EL SALVADOR</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-89.967,13.834,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 2 23:31:37.91 UTC">
+                <name>M 5.7 - 2012 Jul 2, NEAR COAST OF CENTRAL PERU</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-75.598,-14.423,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 7 03:35:28.58 UTC">
+                <name>M 5.7 - 2012 Jul 7, NEW IRELAND REGION, P.N.G.</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>153.296,-4.651,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 11 02:31:16.66 UTC">
+                <name>M 5.7 - 2012 Jul 11, KURIL ISLANDS</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>151.424,45.401,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 11 11:12:40.25 UTC">
+                <name>M 5.7 - 2012 Jul 11, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-177.362,-26.051,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 12 14:00:34.34 UTC">
+                <name>M 5.7 - 2012 Jul 12, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>70.906,36.527,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 29 02:21:12.60 UTC">
+                <name>M 5.7 - 2012 Jul 29, MYANMAR</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>94.299,22.935,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 18 10:23:32.21 UTC">
+                <name>M 5.7 - 2012 Aug 18, VANUATU REGION</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>172.379,-13.504,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 18 17:45:02.27 UTC">
+                <name>M 5.7 - 2012 Aug 18, TONGA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-173.042,-15.598,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 24 04:43:48.35 UTC">
+                <name>M 5.7 - 2012 Aug 24, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-176.807,-27.311,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 3 19:44:22.36 UTC">
+                <name>M 5.7 - 2012 Sep 3, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>125.044,7.905,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 6 23:33:06.26 UTC">
+                <name>M 5.7 - 2012 Sep 6, CENTRAL EAST PACIFIC RISE</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-105.891,-4.6,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 8 06:54:18.57 UTC">
+                <name>M 5.7 - 2012 Sep 8, MARIANA ISLANDS REGION</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>145.923,21.527,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 8 20:29:31.21 UTC">
+                <name>M 5.7 - 2012 Sep 8, COSTA RICA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-85.323,10.082,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 15 16:32:21.51 UTC">
+                <name>M 5.7 - 2012 Sep 15, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>113.865,-10.732,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 20 21:03:42.12 UTC">
+                <name>M 5.7 - 2012 Sep 20, FIJI REGION</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-178.513,-20.757,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 3 13:32:34.94 UTC">
+                <name>M 5.7 - 2012 Oct 3, KEPULAUAN BATU, INDONESIA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>97.672,-0.429,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 5 00:19:56.96 UTC">
+                <name>M 5.7 - 2012 Oct 5, NORTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-46.457,17.479,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 8 01:50:26.21 UTC">
+                <name>M 5.7 - 2012 Oct 8, ANTOFAGASTA, CHILE</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-68.165,-21.725,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 09:41:58.95 UTC">
+                <name>M 5.7 - 2012 Oct 14, KURIL ISLANDS</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>154.428,48.308,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 29 15:29:50.39 UTC">
+                <name>M 5.7 - 2012 Oct 29, MOLUCCA SEA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>125.185,-0.142,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 1 14:12:01.82 UTC">
+                <name>M 5.7 - 2012 Nov 1, JAVA, INDONESIA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>107.529,-6.762,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 6 01:36:21.63 UTC">
+                <name>M 5.7 - 2012 Nov 6, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>122.2,1.374,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 7 22:42:48.22 UTC">
+                <name>M 5.7 - 2012 Nov 7, OFFSHORE GUATEMALA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-92.156,13.849,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 14 05:21:42.47 UTC">
+                <name>M 5.7 - 2012 Nov 14, NEGROS, PHILIPPINES</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>122.472,9.982,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 27 02:59:06.52 UTC">
+                <name>M 5.7 - 2012 Nov 27, SERAM, INDONESIA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>129.219,-2.952,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 30 11:20:38.43 UTC">
+                <name>M 5.7 - 2012 Nov 30, TONGA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-175.595,-18.824,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 19:50:23.43 UTC">
+                <name>M 5.7 - 2012 Dec 7, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>146.954,-7.661,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 17 17:46:46.63 UTC">
+                <name>M 5.7 - 2012 Dec 17, CENTRAL EAST PACIFIC RISE</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>-104.177,-4.028,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 23 13:31:40.76 UTC">
+                <name>M 5.7 - 2012 Dec 23, BLACK SEA, OFFSHORE GEORGIA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>41.075,42.42,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 29 07:59:41.10 UTC">
+                <name>M 5.7 - 2012 Dec 29, BISMARCK SEA</name>
+                <magnitude>5.7</magnitude>
+                <Point>
+                    <coordinates>148.899,-3.563,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 5 01:13:40.43 UTC">
+                <name>M 5.6 - 2012 Jan 5, TONGA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-173.543,-17.691,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 13 16:02:23.03 UTC">
+                <name>M 5.6 - 2012 Jan 13, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-27.073,-60.548,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 16 03:59:44.59 UTC">
+                <name>M 5.6 - 2012 Jan 16, SOUTH SHETLAND ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-56.095,-60.752,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 17 23:21:35.04 UTC">
+                <name>M 5.6 - 2012 Jan 17, COQUIMBO, CHILE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-71.499,-31.655,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 00:22:18.94 UTC">
+                <name>M 5.6 - 2012 Jan 28, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>142.211,40.177,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 04:43:41.03 UTC">
+                <name>M 5.6 - 2012 Jan 28, SOUTHERN EAST PACIFIC RISE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-110.517,-36.793,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 06:46:30.29 UTC">
+                <name>M 5.6 - 2012 Feb 2, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>149.774,-6.563,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 09:32:16.88 UTC">
+                <name>M 5.6 - 2012 Feb 2, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>149.718,-6.586,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 13:09:23.17 UTC">
+                <name>M 5.6 - 2012 Feb 4, SAMAR, PHILIPPINES</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>125.754,11.872,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 20:05:31.71 UTC">
+                <name>M 5.6 - 2012 Feb 4, VANCOUVER ISLAND, CANADA REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-127.906,48.887,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 6 04:19:59.91 UTC">
+                <name>M 5.6 - 2012 Feb 6, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>123.227,10.092,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 11 02:58:17.00 UTC">
+                <name>M 5.6 - 2012 Feb 11, OFFSHORE BIO-BIO, CHILE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-73.884,-37.456,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 13 21:07:02.77 UTC">
+                <name>M 5.6 - 2012 Feb 13, NORTHERN CALIFORNIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-123.79,41.143,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 20 19:09:36.29 UTC">
+                <name>M 5.6 - 2012 Feb 20, OFFSHORE CHIAPAS, MEXICO</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-92.779,14.276,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 05:24:59.26 UTC">
+                <name>M 5.6 - 2012 Feb 26, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-177.73,-32.495,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 28 15:07:35.04 UTC">
+                <name>M 5.6 - 2012 Feb 28, BONIN ISLANDS, JAPAN REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>139.391,28.2,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 29 14:32:47.83 UTC">
+                <name>M 5.6 - 2012 Feb 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>141.001,35.2,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 5 23:06:30.88 UTC">
+                <name>M 5.6 - 2012 Mar 5, MASBATE REGION, PHILIPPINES</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>123.7,12.354,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 7 12:00:46.01 UTC">
+                <name>M 5.6 - 2012 Mar 7, PAPUA, INDONESIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>138.888,-2.814,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 12 06:06:40.64 UTC">
+                <name>M 5.6 - 2012 Mar 12, NORTHWESTERN KASHMIR</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>73.152,36.741,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 14 10:57:40.10 UTC">
+                <name>M 5.6 - 2012 Mar 14, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>144.806,40.755,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 26 16:58:10.63 UTC">
+                <name>M 5.6 - 2012 Mar 26, SOUTHWEST INDIAN RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>60.653,-30.04,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 14 15:13:14.14 UTC">
+                <name>M 5.6 - 2012 Apr 14, KURIL ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>155.651,49.38,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 17 08:51:24.92 UTC">
+                <name>M 5.6 - 2012 Apr 17, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-177.236,-31.894,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 22 13:11:19.70 UTC">
+                <name>M 5.6 - 2012 Apr 22, WEST OF MACQUARIE ISLAND</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>140.29,-52.867,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 23 22:40:22.44 UTC">
+                <name>M 5.6 - 2012 Apr 23, KURIL ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>154.739,48.397,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 24 09:50:58.39 UTC">
+                <name>M 5.6 - 2012 Apr 24, CARLSBERG RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>61.511,5.649,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 24 15:15:38.16 UTC">
+                <name>M 5.6 - 2012 Apr 24, SOUTH OF TONGA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-175.95,-24.228,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 26 19:21:42.61 UTC">
+                <name>M 5.6 - 2012 Apr 26, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>94.459,2.696,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 28 19:21:03.11 UTC">
+                <name>M 5.6 - 2012 Apr 28, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>152.11,-5.328,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 29 15:02:18.42 UTC">
+                <name>M 5.6 - 2012 Apr 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>142.037,39.745,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 30 07:39:45.56 UTC">
+                <name>M 5.6 - 2012 Apr 30, OFFSHORE COQUIMBO, CHILE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-71.46,-29.868,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 6 12:40:59.05 UTC">
+                <name>M 5.6 - 2012 May 6, CENTRAL PERU</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-75.801,-13.82,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 7 04:40:27.79 UTC">
+                <name>M 5.6 - 2012 May 7, AZERBAIJAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>46.789,41.549,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 07:19:54.88 UTC">
+                <name>M 5.6 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>143.248,39.548,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 22 00:00:32.77 UTC">
+                <name>M 5.6 - 2012 May 22, BULGARIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>22.968,42.645,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 29 02:40:53.32 UTC">
+                <name>M 5.6 - 2012 May 29, KOMANDORSKIYE OSTROVA REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>168.925,54.368,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 31 23:01:03.36 UTC">
+                <name>M 5.6 - 2012 May 31, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>133.181,-0.902,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 19 20:56:41.42 UTC">
+                <name>M 5.6 - 2012 Jun 19, NEAR ISLANDS, ALEUTIAN ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>171.701,53.351,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 1 04:13:52.09 UTC">
+                <name>M 5.6 - 2012 Jul 1, MYANMAR-INDIA BORDER REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>94.696,25.592,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 9 13:55:00.58 UTC">
+                <name>M 5.6 - 2012 Jul 9, EASTERN MEDITERRANEAN SEA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>28.919,35.604,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 9 19:25:07.11 UTC">
+                <name>M 5.6 - 2012 Jul 9, RYUKYU ISLANDS, JAPAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>130.099,29.381,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 16 16:33:10.08 UTC">
+                <name>M 5.6 - 2012 Jul 16, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>137.053,-1.296,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 19 07:36:35.47 UTC">
+                <name>M 5.6 - 2012 Jul 19, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>71.375,37.248,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 20 14:03:13.76 UTC">
+                <name>M 5.6 - 2012 Jul 20, FIJI REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-179.287,-21.222,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 21 04:54:05.50 UTC">
+                <name>M 5.6 - 2012 Jul 21, EAST OF NORTH ISLAND, N.Z.</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-179.968,-37.713,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 22 07:02:13.62 UTC">
+                <name>M 5.6 - 2012 Jul 22, BISMARCK SEA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>149.532,-4.872,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 26 10:48:22.10 UTC">
+                <name>M 5.6 - 2012 Jul 26, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>169.509,-21.103,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 29 09:20:54.98 UTC">
+                <name>M 5.6 - 2012 Jul 29, PRIMOR'YE, RUSSIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>139.073,47.379,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 9 02:34:41.12 UTC">
+                <name>M 5.6 - 2012 Aug 9, REVILLA GIGEDO ISLANDS REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-109.332,19.946,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 16 12:08:20.94 UTC">
+                <name>M 5.6 - 2012 Aug 16, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-36.768,7.335,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 19 08:07:35.78 UTC">
+                <name>M 5.6 - 2012 Aug 19, OFF COAST OF WASHINGTON</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-128.619,47.789,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 21 17:39:38.00 UTC">
+                <name>M 5.6 - 2012 Aug 21, SOUTHWEST OF SUMATRA, INDONESIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>92.056,-0.172,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 24 10:01:53.94 UTC">
+                <name>M 5.6 - 2012 Aug 24, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-179.533,-33.435,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 26 11:22:22.09 UTC">
+                <name>M 5.6 - 2012 Aug 26, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-179.778,-65.478,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 30 12:18:43.09 UTC">
+                <name>M 5.6 - 2012 Aug 30, WESTERN INDIAN-ANTARCTIC RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>114.08,-50.143,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 23:37:58.35 UTC">
+                <name>M 5.6 - 2012 Aug 31, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>126.719,10.388,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 6 06:46:33.86 UTC">
+                <name>M 5.6 - 2012 Sep 6, PAPUA, INDONESIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>140.252,-3.661,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 11 01:28:18.80 UTC">
+                <name>M 5.6 - 2012 Sep 11, KURIL ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>151.111,45.335,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 25 03:06:53.85 UTC">
+                <name>M 5.6 - 2012 Sep 25, TONGA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-173.901,-15.517,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 7 03:14:24.00 UTC">
+                <name>M 5.6 - 2012 Oct 7, LUZON, PHILIPPINES</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>120.939,18.543,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 9 07:49:51.87 UTC">
+                <name>M 5.6 - 2012 Oct 9, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>139.224,-2.72,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 15 01:19:03.19 UTC">
+                <name>M 5.6 - 2012 Oct 15, OFF EAST COAST OF KAMCHATKA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>159.379,51.9,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 16 12:41:25.76 UTC">
+                <name>M 5.6 - 2012 Oct 16, KURIL ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>156.438,49.618,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 16 23:42:55.69 UTC">
+                <name>M 5.6 - 2012 Oct 16, NORTH ISLAND OF NEW ZEALAND</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>176.167,-38.639,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 19 10:13:54.99 UTC">
+                <name>M 5.6 - 2012 Oct 19, MID-INDIAN RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>67.057,-9.289,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 23 09:33:19.67 UTC">
+                <name>M 5.6 - 2012 Oct 23, WEST OF MACQUARIE ISLAND</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>148.206,-57.512,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 25 10:32:28.19 UTC">
+                <name>M 5.6 - 2012 Oct 25, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>141.699,38.306,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 3 12:58:12.22 UTC">
+                <name>M 5.6 - 2012 Nov 3, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-34.073,7.048,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 5 04:30:26.72 UTC">
+                <name>M 5.6 - 2012 Nov 5, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>143.61,37.791,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 6 01:42:26.33 UTC">
+                <name>M 5.6 - 2012 Nov 6, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>122.167,1.357,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 6 06:17:27.78 UTC">
+                <name>M 5.6 - 2012 Nov 6, CARLSBERG RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>57.203,9.963,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 7 23:42:19.46 UTC">
+                <name>M 5.6 - 2012 Nov 7, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>148.034,-8.652,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 13 23:23:48.05 UTC">
+                <name>M 5.6 - 2012 Nov 13, TONGA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-175.934,-21.043,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 14 23:41:56.43 UTC">
+                <name>M 5.6 - 2012 Nov 14, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>151.341,-5.86,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 16 06:24:42.03 UTC">
+                <name>M 5.6 - 2012 Nov 16, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-134.758,-53.955,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 17 02:51:23.39 UTC">
+                <name>M 5.6 - 2012 Nov 17, VANUATU</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>167.46,-14.99,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 28 03:09:48.72 UTC">
+                <name>M 5.6 - 2012 Nov 28, NORTHERN PERU</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-76.101,-4.522,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 28 08:56:16.22 UTC">
+                <name>M 5.6 - 2012 Nov 28, BANDA SEA</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>131.134,-5.398,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 3 09:27:37.04 UTC">
+                <name>M 5.6 - 2012 Dec 3, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>-136.244,-54.672,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 8 16:35:16.82 UTC">
+                <name>M 5.6 - 2012 Dec 8, NEAR S COAST OF NEW GUINEA, PNG.</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>143.973,-7.211,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 9 21:45:35.21 UTC">
+                <name>M 5.6 - 2012 Dec 9, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>126.166,6.703,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 17 00:28:58.80 UTC">
+                <name>M 5.6 - 2012 Dec 17, KURIL ISLANDS</name>
+                <magnitude>5.6</magnitude>
+                <Point>
+                    <coordinates>155.837,49.785,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 5 09:35:32.10 UTC">
+                <name>M 5.5 - 2012 Jan 5, DOMINICAN REPUBLIC</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-70.361,18.325,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 6 18:54:39.31 UTC">
+                <name>M 5.5 - 2012 Jan 6, CENTRAL EAST PACIFIC RISE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-107.312,-6.341,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 03:20:49.99 UTC">
+                <name>M 5.5 - 2012 Jan 12, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>141.071,36.994,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 14:11:08.43 UTC">
+                <name>M 5.5 - 2012 Jan 12, SOUTH OF AFRICA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>28.152,-52.113,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 22 06:00:05.41 UTC">
+                <name>M 5.5 - 2012 Jan 22, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-24.899,-56.655,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 24 16:31:07.79 UTC">
+                <name>M 5.5 - 2012 Jan 24, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-27.723,-56.336,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 17:27:06.98 UTC">
+                <name>M 5.5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>167.179,-17.954,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 21:50:50.57 UTC">
+                <name>M 5.5 - 2012 Feb 4, OWEN FRACTURE ZONE REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>57.561,13.046,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 08:49:25.27 UTC">
+                <name>M 5.5 - 2012 Feb 9, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-25.816,-56.383,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 11 07:06:48.45 UTC">
+                <name>M 5.5 - 2012 Feb 11, MOLUCCA SEA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>126.853,-0.978,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 14 03:27:50.50 UTC">
+                <name>M 5.5 - 2012 Feb 14, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>141.402,36.193,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 23 05:08:12.79 UTC">
+                <name>M 5.5 - 2012 Feb 23, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-13.193,-17.699,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 02:46:21.28 UTC">
+                <name>M 5.5 - 2012 Feb 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-177.5,-24.477,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 4 09:44:14.60 UTC">
+                <name>M 5.5 - 2012 Mar 4, OFF COAST OF CENTRAL AMERICA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-84.34,2.687,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 10 14:10:39.85 UTC">
+                <name>M 5.5 - 2012 Mar 10, ALASKA PENINSULA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-157.567,55.146,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 12 12:32:46.36 UTC">
+                <name>M 5.5 - 2012 Mar 12, KURIL ISLANDS</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>147.609,45.239,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 13 23:06:43.56 UTC">
+                <name>M 5.5 - 2012 Mar 13, OFFSHORE CHIAPAS, MEXICO</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-93.026,14.959,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 15 19:20:18.26 UTC">
+                <name>M 5.5 - 2012 Mar 15, NEAR S. COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>139.279,35.802,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 17 17:00:56.86 UTC">
+                <name>M 5.5 - 2012 Mar 17, CARLSBERG RIDGE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>63.404,3.823,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 24 22:18:38.25 UTC">
+                <name>M 5.5 - 2012 Mar 24, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-136.157,-54.367,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 26 17:48:42.42 UTC">
+                <name>M 5.5 - 2012 Mar 26, NORTHERN EAST PACIFIC RISE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-104.228,9.995,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 28 08:25:51.35 UTC">
+                <name>M 5.5 - 2012 Mar 28, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-140.014,-57.331,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 6 19:24:13.94 UTC">
+                <name>M 5.5 - 2012 Apr 6, KEP. MENTAWAI REGION, INDONESIA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>100.426,-3.345,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 09:00:09.71 UTC">
+                <name>M 5.5 - 2012 Apr 11, ANDREANOF ISLANDS, ALEUTIAN IS.</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-176.097,51.364,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 13:58:04.72 UTC">
+                <name>M 5.5 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>90.854,1.495,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 19:04:20.01 UTC">
+                <name>M 5.5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>92.092,1.19,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 14:50:52.85 UTC">
+                <name>M 5.5 - 2012 Apr 12, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>141.468,37.513,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 18 05:37:55.94 UTC">
+                <name>M 5.5 - 2012 Apr 18, BONIN ISLANDS, JAPAN REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>138.772,28.689,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 24 14:57:10.11 UTC">
+                <name>M 5.5 - 2012 Apr 24, NICOBAR ISLANDS, INDIA REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>93.949,8.868,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 24 20:22:10.41 UTC">
+                <name>M 5.5 - 2012 Apr 24, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>140.472,35.622,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 30 18:11:44.42 UTC">
+                <name>M 5.5 - 2012 Apr 30, BANDA SEA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>128.511,-5.689,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 1 15:44:37.80 UTC">
+                <name>M 5.5 - 2012 May 1, OFF COAST OF BAJA CALIFORNIA SUR</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-108.44,21.951,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 2 17:06:05.53 UTC">
+                <name>M 5.5 - 2012 May 2, SOUTHEAST OF EASTER ISLAND</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-102.728,-35.883,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 9 04:35:00.11 UTC">
+                <name>M 5.5 - 2012 May 9, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>127.45,6.232,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 9 14:49:51.28 UTC">
+                <name>M 5.5 - 2012 May 9, NORTH OF ASCENSION ISLAND</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-13.6,-0.966,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 29 10:55:57.00 UTC">
+                <name>M 5.5 - 2012 May 29, NORTHERN ITALY</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>11.008,44.888,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 1 05:07:01.98 UTC">
+                <name>M 5.5 - 2012 Jun 1, ANTARCTICA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-148.864,-77.08,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 3 11:14:47.75 UTC">
+                <name>M 5.5 - 2012 Jun 3, MID-INDIAN RIDGE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>67.21,-16.235,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 6 01:08:35.52 UTC">
+                <name>M 5.5 - 2012 Jun 6, TAIWAN REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>121.428,22.357,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 12 05:59:38.69 UTC">
+                <name>M 5.5 - 2012 Jun 12, SUNDA STRAIT, INDONESIA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>105.494,-5.677,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 13 07:06:44.59 UTC">
+                <name>M 5.5 - 2012 Jun 13, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-28.394,-55.796,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 14 20:17:24.52 UTC">
+                <name>M 5.5 - 2012 Jun 14, MOLUCCA SEA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>126.828,1.293,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 21 22:34:37.28 UTC">
+                <name>M 5.5 - 2012 Jun 21, FIJI REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-178.186,-17.963,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 22 02:20:06.63 UTC">
+                <name>M 5.5 - 2012 Jun 22, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-178.65,-32.935,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 23 21:27:29.60 UTC">
+                <name>M 5.5 - 2012 Jun 23, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>90.509,2.628,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 24 07:59:34.86 UTC">
+                <name>M 5.5 - 2012 Jun 24, SICHUAN-YUNNAN BORDER REG, CHINA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>100.781,27.767,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 27 20:39:15.91 UTC">
+                <name>M 5.5 - 2012 Jun 27, TONGA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-173.268,-15.222,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 30 16:24:36.99 UTC">
+                <name>M 5.5 - 2012 Jun 30, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>170.992,-22.088,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 3 03:49:33.04 UTC">
+                <name>M 5.5 - 2012 Jul 3, SOLOMON ISLANDS</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>163.331,-10.82,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 12 15:40:12.63 UTC">
+                <name>M 5.5 - 2012 Jul 12, SERAM, INDONESIA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>129.321,-2.885,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 16 03:08:31.72 UTC">
+                <name>M 5.5 - 2012 Jul 16, NEAR EAST COAST OF KAMCHATKA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>161.234,55.777,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 26 10:20:05.49 UTC">
+                <name>M 5.5 - 2012 Jul 26, TONGA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-174.491,-21.015,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 2 07:37:45.18 UTC">
+                <name>M 5.5 - 2012 Aug 2, KEP. TANIMBAR REGION, INDONESIA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>131.121,-6.944,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 3 07:22:30.56 UTC">
+                <name>M 5.5 - 2012 Aug 3, FIJI REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-176.916,-16.919,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 12 18:31:25.11 UTC">
+                <name>M 5.5 - 2012 Aug 12, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-157.718,-63.004,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 15 23:45:52.33 UTC">
+                <name>M 5.5 - 2012 Aug 15, OFFSHORE EL SALVADOR</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-89.215,13.148,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 17 21:27:53.73 UTC">
+                <name>M 5.5 - 2012 Aug 17, NORTHERN EAST PACIFIC RISE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-103.003,8.348,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 24 07:03:10.52 UTC">
+                <name>M 5.5 - 2012 Aug 24, BALLENY ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>171.324,-63.581,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 26 20:57:58.20 UTC">
+                <name>M 5.5 - 2012 Aug 26, SOUTHERN CALIFORNIA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-115.549,33.024,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 05:38:04.42 UTC">
+                <name>M 5.5 - 2012 Aug 27, OFFSHORE EL SALVADOR</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-88.612,12.297,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 28 06:08:16.10 UTC">
+                <name>M 5.5 - 2012 Aug 28, OFFSHORE EL SALVADOR</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-88.654,12.458,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 29 19:05:11.12 UTC">
+                <name>M 5.5 - 2012 Aug 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>141.814,38.425,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 18:01:48.20 UTC">
+                <name>M 5.5 - 2012 Sep 1, CHIAPAS, MEXICO</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-92.773,16.229,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 7 03:19:42.53 UTC">
+                <name>M 5.5 - 2012 Sep 7, SICHUAN-YUNNAN-GUIZHOU RG, CHINA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>103.983,27.575,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 9 19:23:51.01 UTC">
+                <name>M 5.5 - 2012 Sep 9, RAT ISLANDS, ALEUTIAN ISLANDS</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>175.01,52.78,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 12 03:27:46.31 UTC">
+                <name>M 5.5 - 2012 Sep 12, CRETE, GREECE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>24.11,34.783,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 13 01:54:52.64 UTC">
+                <name>M 5.5 - 2012 Sep 13, FIJI REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>175.845,-18.627,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 14 07:18:38.38 UTC">
+                <name>M 5.5 - 2012 Sep 14, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-16.01,-39.676,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 17 20:07:54.38 UTC">
+                <name>M 5.5 - 2012 Sep 17, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>150.119,-5.687,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 22 06:58:26.17 UTC">
+                <name>M 5.5 - 2012 Sep 22, TONGA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-174.194,-20.896,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 24 10:31:23.33 UTC">
+                <name>M 5.5 - 2012 Sep 24, TONGA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-174.292,-21.212,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 29 07:11:12.93 UTC">
+                <name>M 5.5 - 2012 Sep 29, OAXACA, MEXICO</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-98.393,16.304,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 2 19:41:29.44 UTC">
+                <name>M 5.5 - 2012 Oct 2, BALLENY ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>177.83,-64.969,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 5 18:22:56.83 UTC">
+                <name>M 5.5 - 2012 Oct 5, OFF THE COAST OF GUATEMALA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-91.504,13.028,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 5 20:02:10.66 UTC">
+                <name>M 5.5 - 2012 Oct 5, GULF OF CALIFORNIA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-108.512,23.582,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 11 17:22:09.93 UTC">
+                <name>M 5.5 - 2012 Oct 11, VALPARAISO, CHILE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-70.31,-32.865,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 10:13:38.60 UTC">
+                <name>M 5.5 - 2012 Oct 14, AZERBAIJAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>46.405,41.825,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 10:41:23.26 UTC">
+                <name>M 5.5 - 2012 Oct 14, CHIAPAS, MEXICO</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-92.289,14.684,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 15 17:52:20.96 UTC">
+                <name>M 5.5 - 2012 Oct 15, GUATEMALA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-91.01,14.062,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 19 15:34:09.77 UTC">
+                <name>M 5.5 - 2012 Oct 19, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-176.8,-30.809,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 21 01:25:22.59 UTC">
+                <name>M 5.5 - 2012 Oct 21, ICELAND REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-18.666,66.309,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 19:09:53.90 UTC">
+                <name>M 5.5 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-132.082,52.294,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 29 06:28:33.13 UTC">
+                <name>M 5.5 - 2012 Oct 29, FLORES REGION, INDONESIA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>123.465,-8.185,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 2 01:52:03.35 UTC">
+                <name>M 5.5 - 2012 Nov 2, NEAR EAST COAST OF KAMCHATKA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>162.799,55.887,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 6 11:09:31.96 UTC">
+                <name>M 5.5 - 2012 Nov 6, SOUTHEAST OF EASTER ISLAND</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-104.8,-35.465,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 11 18:19:45.08 UTC">
+                <name>M 5.5 - 2012 Nov 11, MYANMAR</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>95.866,23.132,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 15 11:22:22.26 UTC">
+                <name>M 5.5 - 2012 Nov 15, NEAR ISLANDS, ALEUTIAN ISLANDS</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>173.351,52.496,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 29 07:09:12.13 UTC">
+                <name>M 5.5 - 2012 Nov 29, NEAR COAST OF NORTHERN PERU</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-81.07,-6.588,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 29 19:32:31.75 UTC">
+                <name>M 5.5 - 2012 Nov 29, OFFSHORE GUATEMALA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-92.113,13.757,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 6 00:43:24.10 UTC">
+                <name>M 5.5 - 2012 Dec 6, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>126.638,10.974,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 08:48:13.04 UTC">
+                <name>M 5.5 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>143.607,37.828,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 13 23:03:38.53 UTC">
+                <name>M 5.5 - 2012 Dec 13, EAST OF SEVERNAYA ZEMLYA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>121.383,80.804,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 22 16:41:45.74 UTC">
+                <name>M 5.5 - 2012 Dec 22, MYANMAR</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>94.782,22.443,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 26 23:01:56.68 UTC">
+                <name>M 5.5 - 2012 Dec 26, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>-144.483,-56.186,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 28 17:32:18.07 UTC">
+                <name>M 5.5 - 2012 Dec 28, SULAWESI, INDONESIA</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>122.918,-0.145,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 29 17:50:52.84 UTC">
+                <name>M 5.5 - 2012 Dec 29, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5.5</magnitude>
+                <Point>
+                    <coordinates>70.599,35.711,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 07:31:42.70 UTC">
+                <name>M 5.4 - 2012 Jan 7, HALMAHERA, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>127.475,1.705,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 17:24:51.12 UTC">
+                <name>M 5.4 - 2012 Jan 7, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>145.214,-5.081,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 17 15:27:48.53 UTC">
+                <name>M 5.4 - 2012 Jan 17, CENTRAL EAST PACIFIC RISE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-104.146,-4.045,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 20 22:50:53.74 UTC">
+                <name>M 5.4 - 2012 Jan 20, KEPULAUAN SANGIHE, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>125.307,4.795,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 26 15:52:57.60 UTC">
+                <name>M 5.4 - 2012 Jan 26, SCOTIA SEA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-51.411,-60.582,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 18:49:01.41 UTC">
+                <name>M 5.4 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-177.172,-29.519,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 19:05:39.73 UTC">
+                <name>M 5.4 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-177.259,-29.574,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 1 07:14:29.10 UTC">
+                <name>M 5.4 - 2012 Feb 1, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>102.203,-3.676,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 3 06:01:38.88 UTC">
+                <name>M 5.4 - 2012 Feb 3, VANUATU</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>167.232,-17.386,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 04:09:33.99 UTC">
+                <name>M 5.4 - 2012 Feb 4, CENTRAL MONGOLIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>105.61,42.291,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 19:29:15.00 UTC">
+                <name>M 5.4 - 2012 Feb 4, SAMAR, PHILIPPINES</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>125.719,11.937,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 8 12:01:37.48 UTC">
+                <name>M 5.4 - 2012 Feb 8, NEAR WEST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>137.999,37.858,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 05:58:58.18 UTC">
+                <name>M 5.4 - 2012 Feb 9, BOUGAINVILLE REGION, P.N.G.</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>155.72,-6.987,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 18 19:15:25.52 UTC">
+                <name>M 5.4 - 2012 Feb 18, TONGA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-173.521,-20.957,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 22 10:45:22.87 UTC">
+                <name>M 5.4 - 2012 Feb 22, KEPULAUAN KAI, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>133.565,-5.173,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 08:08:52.95 UTC">
+                <name>M 5.4 - 2012 Feb 26, TARAPACA, CHILE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-69.29,-18.811,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 05:07:48.35 UTC">
+                <name>M 5.4 - 2012 Feb 27, KURIL ISLANDS</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>152.74,46.922,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 19:31:51.72 UTC">
+                <name>M 5.4 - 2012 Feb 27, RYUKYU ISLANDS, JAPAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>127.096,25.557,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 28 22:52:37.85 UTC">
+                <name>M 5.4 - 2012 Feb 28, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>144.137,37.203,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 29 16:03:57.29 UTC">
+                <name>M 5.4 - 2012 Feb 29, VANUATU</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>168.038,-17.647,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 29 22:32:35.61 UTC">
+                <name>M 5.4 - 2012 Feb 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>140.448,36.427,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 2 05:09:59.40 UTC">
+                <name>M 5.4 - 2012 Mar 2, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>146.265,-8.048,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 5 08:12:33.65 UTC">
+                <name>M 5.4 - 2012 Mar 5, HALMAHERA, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>128.626,1.937,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 6 02:52:41.96 UTC">
+                <name>M 5.4 - 2012 Mar 6, NICOBAR ISLANDS, INDIA REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>93.691,8.571,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 7 12:02:52.29 UTC">
+                <name>M 5.4 - 2012 Mar 7, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-25.306,-57.941,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 9 17:25:33.19 UTC">
+                <name>M 5.4 - 2012 Mar 9, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>140.392,36.719,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 14 11:40:17.10 UTC">
+                <name>M 5.4 - 2012 Mar 14, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>144.848,40.905,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 19 13:49:05.25 UTC">
+                <name>M 5.4 - 2012 Mar 19, MOLUCCA SEA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>125.075,0.353,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 30 18:16:08.30 UTC">
+                <name>M 5.4 - 2012 Mar 30, OFFSHORE CHIAPAS, MEXICO</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-93.063,14.381,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 1 13:14:32.67 UTC">
+                <name>M 5.4 - 2012 Apr 1, TRISTAN DA CUNHA REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-14.877,-35.191,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 2 08:17:06.95 UTC">
+                <name>M 5.4 - 2012 Apr 2, TONGA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-173.514,-16.935,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 3 03:08:08.02 UTC">
+                <name>M 5.4 - 2012 Apr 3, NEAR COAST OF NORTHERN PERU</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-80.583,-5.18,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 3 23:42:19.37 UTC">
+                <name>M 5.4 - 2012 Apr 3, KEPULAUAN KAI, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>133.876,-5.654,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 10:36:54.28 UTC">
+                <name>M 5.4 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>91.87,1.167,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 11:29:02.49 UTC">
+                <name>M 5.4 - 2012 Apr 11, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-27.979,-56.871,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 11:34:01.33 UTC">
+                <name>M 5.4 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>92.855,0.734,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 18:54:45.16 UTC">
+                <name>M 5.4 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>92.694,2.475,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 22:51:57.33 UTC">
+                <name>M 5.4 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>89.556,2.865,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 14 15:21:56.33 UTC">
+                <name>M 5.4 - 2012 Apr 14, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>92.141,0.244,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 21 11:36:05.37 UTC">
+                <name>M 5.4 - 2012 Apr 21, CENTRAL PERU</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-71.481,-14.82,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 22 12:20:46.12 UTC">
+                <name>M 5.4 - 2012 Apr 22, WEST OF MACQUARIE ISLAND</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>140.329,-52.753,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 1 05:33:51.12 UTC">
+                <name>M 5.4 - 2012 May 1, VOLCANO ISLANDS, JAPAN REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>141.207,25.404,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 3 04:59:54.50 UTC">
+                <name>M 5.4 - 2012 May 3, OFF COAST OF BAJA CALIFORNIA SUR</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-108.779,21.21,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 11 12:41:35.30 UTC">
+                <name>M 5.4 - 2012 May 11, ASSAM, INDIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>92.889,26.175,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 11 18:48:29.58 UTC">
+                <name>M 5.4 - 2012 May 11, CYPRUS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>34.142,34.304,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 24 19:18:54.97 UTC">
+                <name>M 5.4 - 2012 May 24, NEUQUEN, ARGENTINA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-70.467,-36.912,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 30 21:20:56.16 UTC">
+                <name>M 5.4 - 2012 May 30, EASTERN KAZAKHSTAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>78.745,43.384,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 9 14:23:20.10 UTC">
+                <name>M 5.4 - 2012 Jun 9, KURIL ISLANDS</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>154.852,48.851,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 11 05:02:14.25 UTC">
+                <name>M 5.4 - 2012 Jun 11, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>69.401,36.039,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 15 08:43:32.72 UTC">
+                <name>M 5.4 - 2012 Jun 15, BISMARCK SEA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>146.309,-3.381,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 20 21:55:53.81 UTC">
+                <name>M 5.4 - 2012 Jun 20, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>123.426,0.102,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 20 23:20:56.03 UTC">
+                <name>M 5.4 - 2012 Jun 20, SOLOMON ISLANDS</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>156.998,-8.7,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 24 10:25:54.75 UTC">
+                <name>M 5.4 - 2012 Jun 24, JUJUY, ARGENTINA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-66.702,-22.445,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 26 17:19:04.15 UTC">
+                <name>M 5.4 - 2012 Jun 26, GUATEMALA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-92.049,15.378,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 1 23:39:08.77 UTC">
+                <name>M 5.4 - 2012 Jul 1, ATACAMA, CHILE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-70.878,-28.561,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 2 18:53:27.33 UTC">
+                <name>M 5.4 - 2012 Jul 2, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-179.342,-33.385,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 7 08:11:37.02 UTC">
+                <name>M 5.4 - 2012 Jul 7, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-27.414,-56.203,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 11 03:57:14.45 UTC">
+                <name>M 5.4 - 2012 Jul 11, TONGA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-174.678,-16.103,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 11 20:52:37.03 UTC">
+                <name>M 5.4 - 2012 Jul 11, NEAR COAST OF CENTRAL PERU</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-75.288,-15.276,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 14 04:30:58.77 UTC">
+                <name>M 5.4 - 2012 Jul 14, KURIL ISLANDS</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>151.316,45.516,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 14 14:22:22.56 UTC">
+                <name>M 5.4 - 2012 Jul 14, WESTERN INDIAN-ANTARCTIC RIDGE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>124.64,-49.044,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 19 05:14:27.92 UTC">
+                <name>M 5.4 - 2012 Jul 19, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-27.809,-56.038,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 20 18:14:53.26 UTC">
+                <name>M 5.4 - 2012 Jul 20, FLORES REGION, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>123.682,-8.006,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 22 05:39:13.39 UTC">
+                <name>M 5.4 - 2012 Jul 22, NEW IRELAND REGION, P.N.G.</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>153.375,-4.169,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 27 03:37:56.72 UTC">
+                <name>M 5.4 - 2012 Jul 27, MARIANA ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>142.985,21.671,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 28 16:01:11.47 UTC">
+                <name>M 5.4 - 2012 Jul 28, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-32.667,4.548,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 1 20:43:40.68 UTC">
+                <name>M 5.4 - 2012 Aug 1, NEAR N COAST OF NEW GUINEA, PNG.</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>144.639,-4.39,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 3 04:08:58.27 UTC">
+                <name>M 5.4 - 2012 Aug 3, BOUGAINVILLE REGION, P.N.G.</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>155.718,-6.939,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 3 11:58:58.20 UTC">
+                <name>M 5.4 - 2012 Aug 3, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>165.038,-11.478,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 6 18:55:13.48 UTC">
+                <name>M 5.4 - 2012 Aug 6, HALMAHERA, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>128.429,2.702,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 8 07:11:01.93 UTC">
+                <name>M 5.4 - 2012 Aug 8, NORTHEAST OF TAIWAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>124.921,25.873,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 9 15:03:05.54 UTC">
+                <name>M 5.4 - 2012 Aug 9, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-27.988,-59.762,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 13 20:32:59.28 UTC">
+                <name>M 5.4 - 2012 Aug 13, PAKISTAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>73.663,34.849,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 26 19:31:22.90 UTC">
+                <name>M 5.4 - 2012 Aug 26, SOUTHERN CALIFORNIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-115.546,33.019,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 30 10:53:58.42 UTC">
+                <name>M 5.4 - 2012 Aug 30, WESTERN INDIAN-ANTARCTIC RIDGE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>114.106,-50.211,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 13:27:31.99 UTC">
+                <name>M 5.4 - 2012 Aug 31, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>126.887,10.485,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 01:16:08.78 UTC">
+                <name>M 5.4 - 2012 Sep 1, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>126.683,10.449,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 01:20:38.27 UTC">
+                <name>M 5.4 - 2012 Sep 1, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>126.812,10.528,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 2 14:42:15.52 UTC">
+                <name>M 5.4 - 2012 Sep 2, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>126.652,11.308,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 09:58:10.97 UTC">
+                <name>M 5.4 - 2012 Sep 4, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>126.77,10.46,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 7 17:41:02.01 UTC">
+                <name>M 5.4 - 2012 Sep 7, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>113.833,-10.73,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 12 04:28:12.90 UTC">
+                <name>M 5.4 - 2012 Sep 12, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>152.098,-5.022,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 12 21:52:16.91 UTC">
+                <name>M 5.4 - 2012 Sep 12, SOUTH INDIAN OCEAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>82.926,-23.996,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 13 05:54:48.96 UTC">
+                <name>M 5.4 - 2012 Sep 13, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>126.938,10.238,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 13 23:40:02.95 UTC">
+                <name>M 5.4 - 2012 Sep 13, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>113.755,-10.768,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 21 12:17:26.16 UTC">
+                <name>M 5.4 - 2012 Sep 21, TARAPACA, CHILE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-68.961,-19.569,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 22 12:29:58.00 UTC">
+                <name>M 5.4 - 2012 Sep 22, OAXACA, MEXICO</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-98.281,16.262,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 25 18:33:01.73 UTC">
+                <name>M 5.4 - 2012 Sep 25, TONGA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-174.313,-21.192,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 30 15:35:53.73 UTC">
+                <name>M 5.4 - 2012 Sep 30, EAST OF THE VOLCANO ISLANDS</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>146.043,23,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 3 18:28:33.86 UTC">
+                <name>M 5.4 - 2012 Oct 3, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>126.95,5.858,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 4 23:14:56.40 UTC">
+                <name>M 5.4 - 2012 Oct 4, NORTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-46.498,17.443,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 5 00:15:41.71 UTC">
+                <name>M 5.4 - 2012 Oct 5, NORTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-46.453,17.501,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 7 11:42:47.16 UTC">
+                <name>M 5.4 - 2012 Oct 7, AZERBAIJAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>48.437,40.747,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 10 22:49:33.05 UTC">
+                <name>M 5.4 - 2012 Oct 10, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-26.573,-60.326,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 11:11:36.43 UTC">
+                <name>M 5.4 - 2012 Oct 14, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>144.333,38.215,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 16 02:03:28.76 UTC">
+                <name>M 5.4 - 2012 Oct 16, IZU ISLANDS, JAPAN REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>140.222,31.277,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 17 17:23:42.95 UTC">
+                <name>M 5.4 - 2012 Oct 17, TONGA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-174.187,-19.042,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 21 06:55:09.50 UTC">
+                <name>M 5.4 - 2012 Oct 21, CENTRAL CALIFORNIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-120.856,36.311,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 21 20:28:17.00 UTC">
+                <name>M 5.4 - 2012 Oct 21, OFFSHORE EL SALVADOR</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-88.337,12.562,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 24 17:55:59.99 UTC">
+                <name>M 5.4 - 2012 Oct 24, CAYMAN ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-81.692,17.785,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 25 20:49:35.76 UTC">
+                <name>M 5.4 - 2012 Oct 25, NORTHERN PERU</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-76.074,-5.919,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 27 20:13:03.30 UTC">
+                <name>M 5.4 - 2012 Oct 27, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>151.532,-6.141,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 19:03:21.85 UTC">
+                <name>M 5.4 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-132.667,52.834,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 29 02:22:44.50 UTC">
+                <name>M 5.4 - 2012 Oct 29, NIAS REGION, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>98.381,0.88,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 1 23:37:18.24 UTC">
+                <name>M 5.4 - 2012 Nov 1, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>122.105,1.229,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 4 06:37:38.26 UTC">
+                <name>M 5.4 - 2012 Nov 4, SOUTHERN PERU</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-71.878,-15.874,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 7 06:26:32.84 UTC">
+                <name>M 5.4 - 2012 Nov 7, NORTHWESTERN IRAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>46.62,38.418,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 17 18:12:19.87 UTC">
+                <name>M 5.4 - 2012 Nov 17, SOUTHEAST OF EASTER ISLAND</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-95.075,-37.209,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 17 18:43:50.65 UTC">
+                <name>M 5.4 - 2012 Nov 17, SOUTHEAST OF EASTER ISLAND</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-95.142,-37.182,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 20 16:23:24.78 UTC">
+                <name>M 5.4 - 2012 Nov 20, OFFSHORE O'HIGGINS, CHILE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-72.254,-33.921,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 21 16:46:40.13 UTC">
+                <name>M 5.4 - 2012 Nov 21, SOUTH OF SUMBAWA, INDONESIA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>117.931,-11.359,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 26 00:17:14.86 UTC">
+                <name>M 5.4 - 2012 Nov 26, CENTRAL EAST PACIFIC RISE</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-108.329,-9.098,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 27 07:34:25.40 UTC">
+                <name>M 5.4 - 2012 Nov 27, ALAMAGAN REG, N. MARIANA ISLANDS</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>145.763,17.684,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 3 23:58:35.43 UTC">
+                <name>M 5.4 - 2012 Dec 3, OFFSHORE GUATEMALA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-92.372,14.16,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 12 01:44:20.69 UTC">
+                <name>M 5.4 - 2012 Dec 12, FIJI REGION</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-176.278,-19.556,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 20 21:47:29.76 UTC">
+                <name>M 5.4 - 2012 Dec 20, MOLUCCA SEA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>126.217,0.562,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 25 07:34:41.22 UTC">
+                <name>M 5.4 - 2012 Dec 25, MOLUCCA SEA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>125.464,1.109,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 27 09:41:59.69 UTC">
+                <name>M 5.4 - 2012 Dec 27, TONGA</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>-173.562,-18.302,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 29 14:59:38.91 UTC">
+                <name>M 5.4 - 2012 Dec 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.4</magnitude>
+                <Point>
+                    <coordinates>142.024,38.738,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 00:50:08.04 UTC">
+                <name>M 5.3 - 2012 Jan 1, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>166.218,-11.366,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 5 00:54:31.11 UTC">
+                <name>M 5.3 - 2012 Jan 5, OFF COAST OF AISEN, CHILE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-76.472,-45.992,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 8 21:51:49.54 UTC">
+                <name>M 5.3 - 2012 Jan 8, VANUATU</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>167.887,-17.425,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 22:08:11.10 UTC">
+                <name>M 5.3 - 2012 Jan 12, SOUTH OF AFRICA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>28.196,-52.042,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 22:30:59.28 UTC">
+                <name>M 5.3 - 2012 Jan 12, TONGA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-173.59,-16.753,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 16 10:26:47.02 UTC">
+                <name>M 5.3 - 2012 Jan 16, MOLUCCA SEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>125.475,-0.228,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 17 23:23:23.00 UTC">
+                <name>M 5.3 - 2012 Jan 17, OFFSHORE COQUIMBO, CHILE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-71.615,-31.728,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 18 17:01:22.37 UTC">
+                <name>M 5.3 - 2012 Jan 18, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>165.536,-11.018,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 18 17:02:57.42 UTC">
+                <name>M 5.3 - 2012 Jan 18, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>165.464,-10.999,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 26 22:04:06.91 UTC">
+                <name>M 5.3 - 2012 Jan 26, MARIANA ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>142.852,21.645,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 27 01:33:24.00 UTC">
+                <name>M 5.3 - 2012 Jan 27, DODECANESE ISLANDS, GREECE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>25.064,36.044,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 00:17:11.11 UTC">
+                <name>M 5.3 - 2012 Jan 28, CATANDUANES, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>124.586,13.386,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 17:47:35.79 UTC">
+                <name>M 5.3 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-177.139,-29.59,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 19:37:31.42 UTC">
+                <name>M 5.3 - 2012 Jan 28, PAPUA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>140.788,-4.081,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 29 21:43:25.09 UTC">
+                <name>M 5.3 - 2012 Jan 29, NORTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-46.529,16.488,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 1 01:29:24.86 UTC">
+                <name>M 5.3 - 2012 Feb 1, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>165.901,-10.802,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 1 04:30:47.11 UTC">
+                <name>M 5.3 - 2012 Feb 1, SAMAR, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>125.557,11.6,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 1 21:43:46.48 UTC">
+                <name>M 5.3 - 2012 Feb 1, EASTER ISLAND REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-111.525,-31.585,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 13:57:07.05 UTC">
+                <name>M 5.3 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>167.176,-17.455,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 6 11:40:15.38 UTC">
+                <name>M 5.3 - 2012 Feb 6, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>123.108,9.85,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 7 20:37:44.17 UTC">
+                <name>M 5.3 - 2012 Feb 7, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>123.42,10.194,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 8 00:41:02.77 UTC">
+                <name>M 5.3 - 2012 Feb 8, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>123.43,10.249,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 8 01:58:41.47 UTC">
+                <name>M 5.3 - 2012 Feb 8, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-177.409,-29.455,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 14 23:39:16.42 UTC">
+                <name>M 5.3 - 2012 Feb 14, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-29.228,0.859,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 17 14:35:42.66 UTC">
+                <name>M 5.3 - 2012 Feb 17, SOUTHEAST INDIAN RIDGE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>84.932,-42.024,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 21 13:50:42.62 UTC">
+                <name>M 5.3 - 2012 Feb 21, BERING STRAIT</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-167.057,67.744,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 22 12:02:45.51 UTC">
+                <name>M 5.3 - 2012 Feb 22, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>94.4,4.99,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 24 13:43:16.66 UTC">
+                <name>M 5.3 - 2012 Feb 24, NORTHERN COLOMBIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-72.952,6.702,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 24 19:12:20.54 UTC">
+                <name>M 5.3 - 2012 Feb 24, MOLUCCA SEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.34,1.516,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 2 10:11:43.22 UTC">
+                <name>M 5.3 - 2012 Mar 2, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>141.043,35.16,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 3 11:01:47.25 UTC">
+                <name>M 5.3 - 2012 Mar 3, COQUIMBO, CHILE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-71.129,-30.348,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 6 06:05:50.09 UTC">
+                <name>M 5.3 - 2012 Mar 6, STATE OF YAP, MICRONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>140.306,10.527,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 8 20:03:17.23 UTC">
+                <name>M 5.3 - 2012 Mar 8, MINDORO, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>120.519,13.57,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 10 02:26:57.00 UTC">
+                <name>M 5.3 - 2012 Mar 10, TARAPACA, CHILE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-69.25,-19.738,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 11 18:11:09.36 UTC">
+                <name>M 5.3 - 2012 Mar 11, CARLSBERG RIDGE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>65.125,3.077,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 11 22:30:26.58 UTC">
+                <name>M 5.3 - 2012 Mar 11, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-16.696,-41.153,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 17 15:49:17.04 UTC">
+                <name>M 5.3 - 2012 Mar 17, CARLSBERG RIDGE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>63.465,3.758,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 19 13:42:34.67 UTC">
+                <name>M 5.3 - 2012 Mar 19, NEW GUINEA, PAPUA NEW GUINEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>143.888,-4.36,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 20 18:22:33.10 UTC">
+                <name>M 5.3 - 2012 Mar 20, OAXACA, MEXICO</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-98.172,16.289,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 23 09:25:14.00 UTC">
+                <name>M 5.3 - 2012 Mar 23, SOUTH AUSTRALIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>131.955,-26.163,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 26 09:30:18.74 UTC">
+                <name>M 5.3 - 2012 Mar 26, CHUKOTKA, RUSSIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-174.648,66.363,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 26 17:48:09.27 UTC">
+                <name>M 5.3 - 2012 Mar 26, EAST OF NORTH ISLAND, N.Z.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-179.075,-35.689,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 29 00:36:40.36 UTC">
+                <name>M 5.3 - 2012 Mar 29, SOUTHWEST INDIAN RIDGE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>44.605,-40.957,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 1 22:23:48.00 UTC">
+                <name>M 5.3 - 2012 Apr 1, GUERRERO, MEXICO</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-98.54,16.46,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 3 10:42:34.27 UTC">
+                <name>M 5.3 - 2012 Apr 3, NEW IRELAND REGION, P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>153.442,-4.397,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 4 20:27:26.39 UTC">
+                <name>M 5.3 - 2012 Apr 4, NEW IRELAND REGION, P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>152.173,-3.824,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 7 11:58:04.80 UTC">
+                <name>M 5.3 - 2012 Apr 7, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>149.555,-6.746,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 8 21:43:30.90 UTC">
+                <name>M 5.3 - 2012 Apr 8, TAIWAN REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>122.35,24,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 09:02:48.10 UTC">
+                <name>M 5.3 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>91.785,1.636,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 09:51:40.14 UTC">
+                <name>M 5.3 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>90.299,2.521,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 10:01:18.33 UTC">
+                <name>M 5.3 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>90.351,2.483,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 10:21:15.38 UTC">
+                <name>M 5.3 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>92.482,2.822,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 11:52:28.64 UTC">
+                <name>M 5.3 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>91.958,1.084,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 13:42:40.26 UTC">
+                <name>M 5.3 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>93.584,2.164,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 14:34:17.96 UTC">
+                <name>M 5.3 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>90.833,1.477,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 14:54:28.46 UTC">
+                <name>M 5.3 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>91.9,1.276,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 20:21:52.91 UTC">
+                <name>M 5.3 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>92.746,3.753,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 14 19:31:50.00 UTC">
+                <name>M 5.3 - 2012 Apr 14, SUNDA STRAIT, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>105.444,-6.777,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 14 20:53:55.91 UTC">
+                <name>M 5.3 - 2012 Apr 14, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-25.209,-56.845,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 16 03:27:40.75 UTC">
+                <name>M 5.3 - 2012 Apr 16, GULF OF CALIFORNIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-108.793,23.952,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 16 09:46:27.66 UTC">
+                <name>M 5.3 - 2012 Apr 16, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>92.417,0.798,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 16 18:01:14.94 UTC">
+                <name>M 5.3 - 2012 Apr 16, SULAWESI, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>121.939,-2.58,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 18 19:52:38.96 UTC">
+                <name>M 5.3 - 2012 Apr 18, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>131.909,-0.501,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 19 17:23:39.33 UTC">
+                <name>M 5.3 - 2012 Apr 19, MOLUCCA SEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.434,1.199,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 25 07:53:21.27 UTC">
+                <name>M 5.3 - 2012 Apr 25, NICOBAR ISLANDS, INDIA REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>93.906,8.945,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 28 18:00:32.88 UTC">
+                <name>M 5.3 - 2012 Apr 28, KEP. MENTAWAI REGION, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>100.439,-3.338,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 3 16:14:16.63 UTC">
+                <name>M 5.3 - 2012 May 3, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>152.085,-5.466,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 7 14:15:14.45 UTC">
+                <name>M 5.3 - 2012 May 7, AZERBAIJAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>46.719,41.553,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 12 13:23:15.96 UTC">
+                <name>M 5.3 - 2012 May 12, MOLUCCA SEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.108,2.241,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 13 01:19:10.01 UTC">
+                <name>M 5.3 - 2012 May 13, SOUTH INDIAN OCEAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>89.416,-3.347,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 13 04:46:05.93 UTC">
+                <name>M 5.3 - 2012 May 13, SULAWESI, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>122.996,-0.115,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 08:20:57.95 UTC">
+                <name>M 5.3 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>143.175,39.619,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 23 20:25:58.20 UTC">
+                <name>M 5.3 - 2012 May 23, KURIL ISLANDS</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>152.557,46.66,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 1 12:32:27.69 UTC">
+                <name>M 5.3 - 2012 Jun 1, SOUTHERN XINJIANG, CHINA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>75.194,39.803,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 3 21:00:59.35 UTC">
+                <name>M 5.3 - 2012 Jun 3, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-25.57,-60.562,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 5 11:01:20.00 UTC">
+                <name>M 5.3 - 2012 Jun 5, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>94.672,5.482,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 14 05:52:53.61 UTC">
+                <name>M 5.3 - 2012 Jun 14, TURKEY-SYRIA-IRAQ BORDER REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>42.325,37.294,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 17 17:26:26.94 UTC">
+                <name>M 5.3 - 2012 Jun 17, TONGA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-174.311,-20.588,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 18 08:29:04.44 UTC">
+                <name>M 5.3 - 2012 Jun 18, MENDOZA, ARGENTINA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-68.496,-33.009,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 20 00:41:44.43 UTC">
+                <name>M 5.3 - 2012 Jun 20, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>133.281,-0.727,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 28 15:51:58.60 UTC">
+                <name>M 5.3 - 2012 Jun 28, VANUATU</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>166.625,-13.504,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 3 02:31:03.07 UTC">
+                <name>M 5.3 - 2012 Jul 3, NEAR S. COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>139.744,34.934,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 5 08:14:19.29 UTC">
+                <name>M 5.3 - 2012 Jul 5, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.554,5.126,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 7 00:50:27.02 UTC">
+                <name>M 5.3 - 2012 Jul 7, NORTH ISLAND OF NEW ZEALAND</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>175.807,-39.068,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 9 12:25:47.34 UTC">
+                <name>M 5.3 - 2012 Jul 9, SULAWESI, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>122.791,-0.171,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 11 00:16:10.00 UTC">
+                <name>M 5.3 - 2012 Jul 11, SOLOMON ISLANDS</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>156.275,-8.442,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 18 04:33:59.33 UTC">
+                <name>M 5.3 - 2012 Jul 18, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>102.794,-4.381,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 18 06:36:48.23 UTC">
+                <name>M 5.3 - 2012 Jul 18, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.073,11.281,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 20 03:40:12.15 UTC">
+                <name>M 5.3 - 2012 Jul 20, KURIL ISLANDS</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>155.599,49.506,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 21 12:46:30.93 UTC">
+                <name>M 5.3 - 2012 Jul 21, BANDA SEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>129.266,-5.387,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 22 16:56:02.64 UTC">
+                <name>M 5.3 - 2012 Jul 22, TONGA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-175.029,-21.804,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 29 22:05:09.17 UTC">
+                <name>M 5.3 - 2012 Jul 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>142.323,39.075,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 4 11:24:15.01 UTC">
+                <name>M 5.3 - 2012 Aug 4, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>96.296,4.857,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 6 03:28:23.11 UTC">
+                <name>M 5.3 - 2012 Aug 6, RYUKYU ISLANDS, JAPAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>130.603,29.487,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 9 11:04:24.90 UTC">
+                <name>M 5.3 - 2012 Aug 9, LOMBOK REGION, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>116.363,-8.718,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 14 12:06:14.86 UTC">
+                <name>M 5.3 - 2012 Aug 14, BONIN ISLANDS, JAPAN REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>142.53,28.718,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 15 17:49:04.60 UTC">
+                <name>M 5.3 - 2012 Aug 15, NORTHWESTERN IRAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>46.672,38.41,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 22 11:38:19.58 UTC">
+                <name>M 5.3 - 2012 Aug 22, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>147.25,-6.047,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 17:54:26.13 UTC">
+                <name>M 5.3 - 2012 Aug 27, KEPULAUAN TALAUD, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.698,3.622,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 28 08:53:36.88 UTC">
+                <name>M 5.3 - 2012 Aug 28, OFF COAST OF CENTRAL AMERICA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-88.706,11.978,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 28 15:51:06.75 UTC">
+                <name>M 5.3 - 2012 Aug 28, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>92.986,4.409,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 00:35:35.69 UTC">
+                <name>M 5.3 - 2012 Aug 31, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-32.155,3.807,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 13:14:59.42 UTC">
+                <name>M 5.3 - 2012 Aug 31, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.926,10.562,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 18:38:55.08 UTC">
+                <name>M 5.3 - 2012 Aug 31, GULF OF ADEN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>50.47,13.239,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 00:25:02.67 UTC">
+                <name>M 5.3 - 2012 Sep 1, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.45,10.229,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 00:50:53.04 UTC">
+                <name>M 5.3 - 2012 Sep 4, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.888,10.423,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 06:43:01.00 UTC">
+                <name>M 5.3 - 2012 Sep 4, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.778,10.666,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 06:54:59.71 UTC">
+                <name>M 5.3 - 2012 Sep 4, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.827,10.634,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 14:43:17.98 UTC">
+                <name>M 5.3 - 2012 Sep 4, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.896,10.501,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 5 00:35:30.45 UTC">
+                <name>M 5.3 - 2012 Sep 5, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.711,11.596,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 6 02:22:20.12 UTC">
+                <name>M 5.3 - 2012 Sep 6, KEPULAUAN TALAUD, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.879,4.499,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 7 04:16:30.49 UTC">
+                <name>M 5.3 - 2012 Sep 7, SICHUAN-YUNNAN-GUIZHOU RG, CHINA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>104.007,27.572,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 7 12:30:31.66 UTC">
+                <name>M 5.3 - 2012 Sep 7, HALMAHERA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>128.238,2.461,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 11 14:21:36.29 UTC">
+                <name>M 5.3 - 2012 Sep 11, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>113.832,-10.705,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 15 10:26:25.96 UTC">
+                <name>M 5.3 - 2012 Sep 15, SAMAR, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>125.468,12.556,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 15 17:35:40.98 UTC">
+                <name>M 5.3 - 2012 Sep 15, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>113.883,-10.738,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 16 21:46:18.87 UTC">
+                <name>M 5.3 - 2012 Sep 16, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.723,10.624,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 20 20:47:46.61 UTC">
+                <name>M 5.3 - 2012 Sep 20, KEPULAUAN BATU, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>98.817,-0.065,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 20 21:21:05.44 UTC">
+                <name>M 5.3 - 2012 Sep 20, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.381,5.998,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 23 06:40:57.74 UTC">
+                <name>M 5.3 - 2012 Sep 23, FIJI REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>175.174,-16.93,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 23 23:42:27.14 UTC">
+                <name>M 5.3 - 2012 Sep 23, SOUTH OF MARIANA ISLANDS</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>143.25,11.705,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 26 17:45:00.63 UTC">
+                <name>M 5.3 - 2012 Sep 26, ANTOFAGASTA, CHILE</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-68.441,-22.262,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 29 11:24:32.65 UTC">
+                <name>M 5.3 - 2012 Sep 29, NICOBAR ISLANDS, INDIA REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>92.78,6.107,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 2 06:25:32.57 UTC">
+                <name>M 5.3 - 2012 Oct 2, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>123.287,8.297,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 2 17:37:22.01 UTC">
+                <name>M 5.3 - 2012 Oct 2, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>101.919,-2.917,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 3 06:26:17.85 UTC">
+                <name>M 5.3 - 2012 Oct 3, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>152.718,-6.299,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 7 08:36:32.18 UTC">
+                <name>M 5.3 - 2012 Oct 7, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>151.794,-5.53,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 10 12:19:44.93 UTC">
+                <name>M 5.3 - 2012 Oct 10, COSTA RICA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-85.476,10.1,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 11 17:07:54.73 UTC">
+                <name>M 5.3 - 2012 Oct 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>92.585,1.471,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 13 23:07:54.65 UTC">
+                <name>M 5.3 - 2012 Oct 13, NEAR N COAST OF NEW GUINEA, PNG.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>142.326,-2.538,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 15 07:49:01.80 UTC">
+                <name>M 5.3 - 2012 Oct 15, VANUATU</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>165.506,-13.114,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 16 13:39:25.58 UTC">
+                <name>M 5.3 - 2012 Oct 16, KYUSHU, JAPAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>130.199,31.216,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 21 00:10:35.87 UTC">
+                <name>M 5.3 - 2012 Oct 21, ICELAND REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-18.569,66.37,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 25 18:40:38.89 UTC">
+                <name>M 5.3 - 2012 Oct 25, FIJI REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-178.259,-19.857,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 25 23:05:24.00 UTC">
+                <name>M 5.3 - 2012 Oct 25, SOUTHERN ITALY</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>16.01,39.88,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 02:43:08.62 UTC">
+                <name>M 5.3 - 2012 Oct 28, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.635,10.431,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 18:57:31.30 UTC">
+                <name>M 5.3 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-132.374,52.472,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 2 01:22:14.04 UTC">
+                <name>M 5.3 - 2012 Nov 2, FLORES SEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>121.64,-7.788,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 3 11:12:21.68 UTC">
+                <name>M 5.3 - 2012 Nov 3, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>126.93,10.515,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 4 23:46:38.73 UTC">
+                <name>M 5.3 - 2012 Nov 4, KEPULAUAN SANGIHE, INDONESIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>125.076,4.6,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 6 14:20:36.12 UTC">
+                <name>M 5.3 - 2012 Nov 6, BISMARCK SEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>148.846,-3.836,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 9 05:51:42.25 UTC">
+                <name>M 5.3 - 2012 Nov 9, SOUTH OF AUSTRALIA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>124.723,-42.732,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 9 15:07:51.05 UTC">
+                <name>M 5.3 - 2012 Nov 9, BALI SEA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>117.614,-7.947,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 11 21:33:07.72 UTC">
+                <name>M 5.3 - 2012 Nov 11, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>151.688,-5.45,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 16 08:25:57.76 UTC">
+                <name>M 5.3 - 2012 Nov 16, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>140.988,35.217,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 19 10:55:09.03 UTC">
+                <name>M 5.3 - 2012 Nov 19, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>151.655,-5.785,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 19 17:54:07.46 UTC">
+                <name>M 5.3 - 2012 Nov 19, PAKISTAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>67.584,30.538,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 22 05:21:47.86 UTC">
+                <name>M 5.3 - 2012 Nov 22, KOMANDORSKIYE OSTROVA REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>168.316,54.099,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 23 20:21:30.45 UTC">
+                <name>M 5.3 - 2012 Nov 23, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>141.694,38.212,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 29 10:37:41.85 UTC">
+                <name>M 5.3 - 2012 Nov 29, FIJI REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-177.157,-20.721,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 1 08:00:57.94 UTC">
+                <name>M 5.3 - 2012 Dec 1, ALASKA PENINSULA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-154.121,58.422,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 6 21:33:25.53 UTC">
+                <name>M 5.3 - 2012 Dec 6, BOUVET ISLAND REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-1.917,-54.179,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 14:08:42.86 UTC">
+                <name>M 5.3 - 2012 Dec 7, SOUTHERN XINJIANG, CHINA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>88.098,38.745,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 13 00:53:28.77 UTC">
+                <name>M 5.3 - 2012 Dec 13, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-178.39,-30.911,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 13 21:26:39.18 UTC">
+                <name>M 5.3 - 2012 Dec 13, OFFSHORE EL SALVADOR</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-89.967,13.071,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 24 07:54:10.00 UTC">
+                <name>M 5.3 - 2012 Dec 24, NEAR EAST COAST OF KAMCHATKA</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>162.034,54.907,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 26 20:24:26.65 UTC">
+                <name>M 5.3 - 2012 Dec 26, ASCENSION ISLAND REGION</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-13.132,-10.411,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 27 05:36:12.06 UTC">
+                <name>M 5.3 - 2012 Dec 27, BARBADOS REGION, WINDWARD ISL.</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-58.002,13.006,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 30 12:21:21.87 UTC">
+                <name>M 5.3 - 2012 Dec 30, OFFSHORE CHIAPAS, MEXICO</name>
+                <magnitude>5.3</magnitude>
+                <Point>
+                    <coordinates>-92.991,14.446,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 16:45:05.02 UTC">
+                <name>M 5.2 - 2012 Jan 1, SOUTH ISLAND OF NEW ZEALAND</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>172.881,-43.476,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 18:09:06.46 UTC">
+                <name>M 5.2 - 2012 Jan 1, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>96.419,4.547,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 3 15:40:02.35 UTC">
+                <name>M 5.2 - 2012 Jan 3, GUAM REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>143.737,12.689,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 4 15:35:51.03 UTC">
+                <name>M 5.2 - 2012 Jan 4, KEPULAUAN BARAT DAYA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>128.737,-7.354,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 4 18:56:57.29 UTC">
+                <name>M 5.2 - 2012 Jan 4, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>166.375,-10.67,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 5 21:55:21.32 UTC">
+                <name>M 5.2 - 2012 Jan 5, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-143.95,-56.146,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 8 00:35:52.50 UTC">
+                <name>M 5.2 - 2012 Jan 8, FIJI REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-178.541,-17.897,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 9 19:53:35.30 UTC">
+                <name>M 5.2 - 2012 Jan 9, SOUTHERN IRAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>55.726,27.034,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 9 21:30:51.00 UTC">
+                <name>M 5.2 - 2012 Jan 9, OFFSHORE VALPARAISO, CHILE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-71.594,-32.573,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 10 01:45:39.04 UTC">
+                <name>M 5.2 - 2012 Jan 10, VANUATU REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>171.404,-16.993,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 10 13:08:38.95 UTC">
+                <name>M 5.2 - 2012 Jan 10, TONGA REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-172.779,-17.414,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 11 22:21:33.99 UTC">
+                <name>M 5.2 - 2012 Jan 11, BANDA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>123.462,-6.885,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 05:37:28.76 UTC">
+                <name>M 5.2 - 2012 Jan 12, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>142.461,38.336,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 13 19:46:04.82 UTC">
+                <name>M 5.2 - 2012 Jan 13, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-130.72,51.076,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 15 13:41:31.42 UTC">
+                <name>M 5.2 - 2012 Jan 15, OFF E. COAST OF N. ISLAND, N.Z.</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>177.217,-36.573,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 16 08:26:17.39 UTC">
+                <name>M 5.2 - 2012 Jan 16, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>123.09,0.002,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 18 01:19:36.45 UTC">
+                <name>M 5.2 - 2012 Jan 18, MOLUCCA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.898,-0.951,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 19 09:01:55.97 UTC">
+                <name>M 5.2 - 2012 Jan 19, OFF W. COAST OF S. ISLAND, N.Z.</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>165.604,-46.763,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 20 13:30:50.59 UTC">
+                <name>M 5.2 - 2012 Jan 20, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>143.311,37.75,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 22 21:03:35.95 UTC">
+                <name>M 5.2 - 2012 Jan 22, LAKE RUDOLF REGION, KENYA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>36.091,3.678,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 23 11:45:43.70 UTC">
+                <name>M 5.2 - 2012 Jan 23, EASTERN HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>140.965,37.108,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 25 16:04:09.30 UTC">
+                <name>M 5.2 - 2012 Jan 25, SOUTH PACIFIC OCEAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-122.202,-6.672,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 25 20:42:55.91 UTC">
+                <name>M 5.2 - 2012 Jan 25, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.573,38.19,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 26 04:24:58.30 UTC">
+                <name>M 5.2 - 2012 Jan 26, DODECANESE ISLANDS, GREECE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>25.07,36.06,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 26 04:42:05.57 UTC">
+                <name>M 5.2 - 2012 Jan 26, ROTA REGION, N. MARIANA ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>145.189,14.338,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 27 22:43:16.14 UTC">
+                <name>M 5.2 - 2012 Jan 27, EASTERN HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>138.888,35.474,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 17:45:46.80 UTC">
+                <name>M 5.2 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-177.267,-29.452,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 18:17:50.68 UTC">
+                <name>M 5.2 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-177.175,-29.69,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 29 00:06:52.05 UTC">
+                <name>M 5.2 - 2012 Jan 29, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>124.727,5.936,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 30 13:20:35.83 UTC">
+                <name>M 5.2 - 2012 Jan 30, SIMEULUE, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>96.647,2.072,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 17:28:46.42 UTC">
+                <name>M 5.2 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>167.304,-17.597,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 17:45:28.54 UTC">
+                <name>M 5.2 - 2012 Feb 4, VANUATU</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>167.81,-17.086,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 5 00:05:57.01 UTC">
+                <name>M 5.2 - 2012 Feb 5, KEPULAUAN KAI, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>133.949,-5.489,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 5 07:10:16.58 UTC">
+                <name>M 5.2 - 2012 Feb 5, KYRGYZSTAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>74.784,41.437,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 7 23:37:05.34 UTC">
+                <name>M 5.2 - 2012 Feb 7, SVALBARD REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>7.323,76.848,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 8 10:54:42.29 UTC">
+                <name>M 5.2 - 2012 Feb 8, NEAR COAST OF ECUADOR</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-79.258,0.658,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 10 05:36:22.56 UTC">
+                <name>M 5.2 - 2012 Feb 10, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>132.794,-0.266,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 12 04:41:01.15 UTC">
+                <name>M 5.2 - 2012 Feb 12, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>144.252,38.529,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 13 09:09:14.38 UTC">
+                <name>M 5.2 - 2012 Feb 13, TONGA REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-172.415,-18.175,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 14 01:34:38.70 UTC">
+                <name>M 5.2 - 2012 Feb 14, AEGEAN SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>24.09,40.13,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 15 01:49:40.01 UTC">
+                <name>M 5.2 - 2012 Feb 15, FIJI REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-177.378,-19.321,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 15 14:07:51.22 UTC">
+                <name>M 5.2 - 2012 Feb 15, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>146.958,-7.501,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 17 15:44:23.23 UTC">
+                <name>M 5.2 - 2012 Feb 17, WESTERN XIZANG</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>82.787,32.388,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 19 05:54:49.68 UTC">
+                <name>M 5.2 - 2012 Feb 19, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>140.313,36.761,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 20 02:28:17.77 UTC">
+                <name>M 5.2 - 2012 Feb 20, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>99.562,1.846,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 25 06:15:13.60 UTC">
+                <name>M 5.2 - 2012 Feb 25, KURIL ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>155.941,49.186,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 25 06:18:04.29 UTC">
+                <name>M 5.2 - 2012 Feb 25, KURIL ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>155.982,49.23,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 11:59:06.80 UTC">
+                <name>M 5.2 - 2012 Feb 26, SOUTHWESTERN SIBERIA, RUSSIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>95.981,51.687,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 16:28:31.86 UTC">
+                <name>M 5.2 - 2012 Feb 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-176.946,-25.159,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 01:11:48.39 UTC">
+                <name>M 5.2 - 2012 Feb 27, SOUTHWESTERN RYUKYU ISL., JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>123.355,23.873,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 18:48:55.30 UTC">
+                <name>M 5.2 - 2012 Feb 27, CENTRAL IRAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>56.778,31.428,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 29 09:00:05.37 UTC">
+                <name>M 5.2 - 2012 Feb 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.513,37.305,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 4 00:51:39.29 UTC">
+                <name>M 5.2 - 2012 Mar 4, FIJI REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-178.593,-17.835,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 4 03:31:08.40 UTC">
+                <name>M 5.2 - 2012 Mar 4, AEGEAN SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>24.059,40.134,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 6 11:36:23.17 UTC">
+                <name>M 5.2 - 2012 Mar 6, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>100.16,-0.836,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 7 06:18:11.03 UTC">
+                <name>M 5.2 - 2012 Mar 7, RYUKYU ISLANDS, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>127.13,25.609,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 8 03:51:35.04 UTC">
+                <name>M 5.2 - 2012 Mar 8, VANUATU</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>167.152,-17.895,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 14 09:18:42.80 UTC">
+                <name>M 5.2 - 2012 Mar 14, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-176.331,-24.412,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 14 21:38:55.35 UTC">
+                <name>M 5.2 - 2012 Mar 14, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.612,35.502,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 16 00:38:03.91 UTC">
+                <name>M 5.2 - 2012 Mar 16, KURIL ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>156.074,49.274,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 17 15:16:23.75 UTC">
+                <name>M 5.2 - 2012 Mar 17, CARLSBERG RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>63.41,3.705,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 20 19:02:38.90 UTC">
+                <name>M 5.2 - 2012 Mar 20, OFFSHORE OAXACA, MEXICO</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-98.715,15.899,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 25 10:26:54.06 UTC">
+                <name>M 5.2 - 2012 Mar 25, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-23.863,-60.835,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 25 13:22:41.65 UTC">
+                <name>M 5.2 - 2012 Mar 25, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.603,37.692,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 26 17:56:18.91 UTC">
+                <name>M 5.2 - 2012 Mar 26, NORTHERN EAST PACIFIC RISE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-104.373,9.581,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 28 08:54:16.23 UTC">
+                <name>M 5.2 - 2012 Mar 28, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>101.235,-4.403,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 30 19:51:05.98 UTC">
+                <name>M 5.2 - 2012 Mar 30, BOUGAINVILLE REGION, P.N.G.</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>154.659,-6.583,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 30 22:02:11.96 UTC">
+                <name>M 5.2 - 2012 Mar 30, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>95.115,4.616,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 31 09:04:39.27 UTC">
+                <name>M 5.2 - 2012 Mar 31, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>179.299,-23.63,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 3 07:25:08.00 UTC">
+                <name>M 5.2 - 2012 Apr 3, TARAPACA, CHILE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-69.093,-19.638,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 7 20:09:40.55 UTC">
+                <name>M 5.2 - 2012 Apr 7, BANDA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>130.684,-6.057,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 04:53:26.38 UTC">
+                <name>M 5.2 - 2012 Apr 11, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-14.397,-16.856,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 09:08:01.61 UTC">
+                <name>M 5.2 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>91.802,1.252,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 14:08:40.40 UTC">
+                <name>M 5.2 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>92.11,1.107,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 15:46:51.22 UTC">
+                <name>M 5.2 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>92.2,2.945,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 21:02:39.41 UTC">
+                <name>M 5.2 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>91.662,0.306,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 11:20:00.98 UTC">
+                <name>M 5.2 - 2012 Apr 12, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.032,36.865,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 13:09:45.56 UTC">
+                <name>M 5.2 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>93.401,2.396,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 13 10:10:04.62 UTC">
+                <name>M 5.2 - 2012 Apr 13, OAXACA, MEXICO</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-98.138,16.236,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 16 16:05:53.62 UTC">
+                <name>M 5.2 - 2012 Apr 16, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>92.235,0.176,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 19 03:33:27.36 UTC">
+                <name>M 5.2 - 2012 Apr 19, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.181,36.976,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 19:34:06.77 UTC">
+                <name>M 5.2 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>93.824,3.249,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 21 11:04:30.40 UTC">
+                <name>M 5.2 - 2012 Apr 21, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>93.723,3.268,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 21 12:36:11.02 UTC">
+                <name>M 5.2 - 2012 Apr 21, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>170.183,-21.825,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 22 11:44:32.60 UTC">
+                <name>M 5.2 - 2012 Apr 22, SOLOMON ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>158.583,-9.192,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 23 00:20:34.44 UTC">
+                <name>M 5.2 - 2012 Apr 23, GUATEMALA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-89.211,15.766,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 23 14:54:54.62 UTC">
+                <name>M 5.2 - 2012 Apr 23, KEPULAUAN BABAR, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>129.226,-7.22,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 25 13:27:20.98 UTC">
+                <name>M 5.2 - 2012 Apr 25, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-14.631,-12.771,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 29 01:57:51.90 UTC">
+                <name>M 5.2 - 2012 Apr 29, PAPUA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>136.109,-3.059,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 30 13:06:58.74 UTC">
+                <name>M 5.2 - 2012 Apr 30, ANDAMAN ISLANDS, INDIA REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>93.327,14.405,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 3 10:09:35.64 UTC">
+                <name>M 5.2 - 2012 May 3, IRAN-IRAQ BORDER REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>47.726,32.747,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 3 10:19:36.85 UTC">
+                <name>M 5.2 - 2012 May 3, GANSU-NEI MONGOL BDR REG, CHINA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>98.525,40.513,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 3 15:20:25.67 UTC">
+                <name>M 5.2 - 2012 May 3, WESTERN TURKEY</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>29.092,39.175,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 10 00:28:21.78 UTC">
+                <name>M 5.2 - 2012 May 10, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>142.171,39.772,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 10 19:11:22.65 UTC">
+                <name>M 5.2 - 2012 May 10, MOLUCCA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.293,1.38,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 15 19:22:24.39 UTC">
+                <name>M 5.2 - 2012 May 15, SOUTH OF TONGA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-175.967,-24.568,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 16 01:28:17.96 UTC">
+                <name>M 5.2 - 2012 May 16, SOUTH OF TONGA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-175.965,-24.566,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 21 03:18:44.39 UTC">
+                <name>M 5.2 - 2012 May 21, RYUKYU ISLANDS, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>127.284,27.197,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 21 10:17:11.14 UTC">
+                <name>M 5.2 - 2012 May 21, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>143.47,39.364,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 23 17:50:27.32 UTC">
+                <name>M 5.2 - 2012 May 23, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-27.607,0.849,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 27 03:50:21.76 UTC">
+                <name>M 5.2 - 2012 May 27, KEP. MENTAWAI REGION, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>100.155,-2.82,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 29 01:56:04.44 UTC">
+                <name>M 5.2 - 2012 May 29, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>144.645,39.099,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 30 21:22:32.83 UTC">
+                <name>M 5.2 - 2012 May 30, NEAR EAST COAST OF KAMCHATKA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>161.392,54.739,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 5 07:20:52.60 UTC">
+                <name>M 5.2 - 2012 Jun 5, VANUATU</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>168.324,-18.114,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 14 16:15:13.63 UTC">
+                <name>M 5.2 - 2012 Jun 14, TAIWAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>121.584,23.699,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 14 21:51:26.28 UTC">
+                <name>M 5.2 - 2012 Jun 14, NORTHERN XINJIANG, CHINA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>84.279,42.166,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 19 10:53:29.00 UTC">
+                <name>M 5.2 - 2012 Jun 19, NEAR S.E. COAST OF AUSTRALIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>146.2,-38.304,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 19 13:40:57.26 UTC">
+                <name>M 5.2 - 2012 Jun 19, OFF COAST OF OREGON</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-127.273,43.443,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 20 09:59:04.59 UTC">
+                <name>M 5.2 - 2012 Jun 20, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>103.194,-4.928,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 21 20:32:46.58 UTC">
+                <name>M 5.2 - 2012 Jun 21, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>143.364,39.38,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 21 23:52:53.27 UTC">
+                <name>M 5.2 - 2012 Jun 21, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-178.622,-32.829,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 26 14:17:40.92 UTC">
+                <name>M 5.2 - 2012 Jun 26, KAMCHATKA PENINSULA, RUSSIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>160.519,56.157,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 27 12:57:01.34 UTC">
+                <name>M 5.2 - 2012 Jun 27, FLORES REGION, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>119.938,-8.304,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 27 21:20:56.67 UTC">
+                <name>M 5.2 - 2012 Jun 27, TONGA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-173.341,-15.138,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 28 05:51:53.56 UTC">
+                <name>M 5.2 - 2012 Jun 28, EASTERN HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>140.934,37.165,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 29 13:00:26.08 UTC">
+                <name>M 5.2 - 2012 Jun 29, OFFSHORE CHIAPAS, MEXICO</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-93.062,14.939,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 30 00:09:09.80 UTC">
+                <name>M 5.2 - 2012 Jun 30, BONIN ISLANDS, JAPAN REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>143.386,28.134,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 8 14:41:23.12 UTC">
+                <name>M 5.2 - 2012 Jul 8, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-24.188,-56.456,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 10 10:26:59.57 UTC">
+                <name>M 5.2 - 2012 Jul 10, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>134.248,-1.692,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 12 01:43:01.62 UTC">
+                <name>M 5.2 - 2012 Jul 12, GUATEMALA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-90.938,14.75,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 12 04:11:16.04 UTC">
+                <name>M 5.2 - 2012 Jul 12, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>165.977,-10.752,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 14 03:43:58.05 UTC">
+                <name>M 5.2 - 2012 Jul 14, KURIL ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>151.329,45.54,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 14 19:55:17.95 UTC">
+                <name>M 5.2 - 2012 Jul 14, MYANMAR-INDIA BORDER REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>94.48,25.424,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 14 20:39:30.48 UTC">
+                <name>M 5.2 - 2012 Jul 14, TONGA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-173.13,-17.787,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 15 14:34:46.40 UTC">
+                <name>M 5.2 - 2012 Jul 15, KURIL ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>146.41,43.244,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 17 12:38:45.50 UTC">
+                <name>M 5.2 - 2012 Jul 17, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-178.991,-31.431,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 21 06:04:21.25 UTC">
+                <name>M 5.2 - 2012 Jul 21, OFFSHORE NORTHERN CALIFORNIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-125.331,40.412,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 23 00:22:04.72 UTC">
+                <name>M 5.2 - 2012 Jul 23, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>135.414,-2.537,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 24 05:25:28.70 UTC">
+                <name>M 5.2 - 2012 Jul 24, OAXACA, MEXICO</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-98.307,16.266,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 24 06:50:06.02 UTC">
+                <name>M 5.2 - 2012 Jul 24, WESTERN IRAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>50.961,31.705,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 26 01:06:31.77 UTC">
+                <name>M 5.2 - 2012 Jul 26, TAJIKISTAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>74.008,38.313,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 26 06:12:12.36 UTC">
+                <name>M 5.2 - 2012 Jul 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-178.61,-26.442,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 29 14:21:18.43 UTC">
+                <name>M 5.2 - 2012 Jul 29, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>104.418,-5.997,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 31 06:50:15.61 UTC">
+                <name>M 5.2 - 2012 Jul 31, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>103.086,-4.769,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 2 03:15:27.01 UTC">
+                <name>M 5.2 - 2012 Aug 2, BOUGAINVILLE REGION, P.N.G.</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>154.833,-6.319,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 2 10:26:14.64 UTC">
+                <name>M 5.2 - 2012 Aug 2, EAST OF NORTH ISLAND, N.Z.</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-179.786,-35.56,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 7 00:39:02.00 UTC">
+                <name>M 5.2 - 2012 Aug 7, ATACAMA, CHILE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-70.803,-27.801,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 8 14:05:17.90 UTC">
+                <name>M 5.2 - 2012 Aug 8, ALASKA PENINSULA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-161.214,54.881,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 8 22:42:14.10 UTC">
+                <name>M 5.2 - 2012 Aug 8, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-26.056,-55.769,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 9 07:09:46.67 UTC">
+                <name>M 5.2 - 2012 Aug 9, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-15.876,-33.145,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 10 11:40:03.43 UTC">
+                <name>M 5.2 - 2012 Aug 10, WEST CHILE RISE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-83.235,-42.814,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 11 17:47:30.92 UTC">
+                <name>M 5.2 - 2012 Aug 11, NORTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-31.541,52.149,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 14 02:13:57.45 UTC">
+                <name>M 5.2 - 2012 Aug 14, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-26.108,-59.203,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 15 10:04:29.12 UTC">
+                <name>M 5.2 - 2012 Aug 15, REYKJANES RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-32.646,57.886,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 17 00:12:10.39 UTC">
+                <name>M 5.2 - 2012 Aug 17, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-18.707,-0.353,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 19 01:57:03.64 UTC">
+                <name>M 5.2 - 2012 Aug 19, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>94.753,5.063,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 21 03:09:39.42 UTC">
+                <name>M 5.2 - 2012 Aug 21, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>102.995,-4.749,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 22 18:19:33.75 UTC">
+                <name>M 5.2 - 2012 Aug 22, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>179.107,-24.085,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 23 15:54:50.88 UTC">
+                <name>M 5.2 - 2012 Aug 23, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-25.452,-58.895,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 25 18:36:59.82 UTC">
+                <name>M 5.2 - 2012 Aug 25, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>140.969,36.962,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 05:23:20.34 UTC">
+                <name>M 5.2 - 2012 Aug 27, GULF OF CALIFORNIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-113.89,30.551,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 09:01:23.13 UTC">
+                <name>M 5.2 - 2012 Aug 27, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>99.031,2.376,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 12:05:23.41 UTC">
+                <name>M 5.2 - 2012 Aug 27, ANDAMAN ISLANDS, INDIA REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>92.802,10.21,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 23:16:00.51 UTC">
+                <name>M 5.2 - 2012 Aug 27, GULF OF CALIFORNIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-113.909,30.545,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 30 06:56:44.28 UTC">
+                <name>M 5.2 - 2012 Aug 30, CERAM SEA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>131.002,-3.432,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 30 13:51:05.88 UTC">
+                <name>M 5.2 - 2012 Aug 30, JAN MAYEN ISLAND REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-7.936,70.94,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 13:16:14.03 UTC">
+                <name>M 5.2 - 2012 Aug 31, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.777,10.372,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 13:31:37.36 UTC">
+                <name>M 5.2 - 2012 Aug 31, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.916,10.456,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 18:21:34.47 UTC">
+                <name>M 5.2 - 2012 Aug 31, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>151.891,-4.95,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 20:26:49.87 UTC">
+                <name>M 5.2 - 2012 Aug 31, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.73,10.727,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 19:46:07.88 UTC">
+                <name>M 5.2 - 2012 Sep 1, TONGA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-174.552,-21.623,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 2 12:44:03.46 UTC">
+                <name>M 5.2 - 2012 Sep 2, SVALBARD REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>6.764,78.43,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 06:58:02.40 UTC">
+                <name>M 5.2 - 2012 Sep 4, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.701,10.535,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 12:07:26.63 UTC">
+                <name>M 5.2 - 2012 Sep 4, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>113.822,-10.771,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 13:31:04.18 UTC">
+                <name>M 5.2 - 2012 Sep 4, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>113.911,-10.652,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 15:11:13.35 UTC">
+                <name>M 5.2 - 2012 Sep 4, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.712,10.611,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 6 01:57:08.90 UTC">
+                <name>M 5.2 - 2012 Sep 6, SOUTHERN IRAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>53.879,26.942,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 7 06:58:58.83 UTC">
+                <name>M 5.2 - 2012 Sep 7, CHAGOS ARCHIPELAGO REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>72.179,-6.877,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 8 04:11:48.48 UTC">
+                <name>M 5.2 - 2012 Sep 8, SOLOMON ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>160.404,-9.849,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 9 05:39:18.03 UTC">
+                <name>M 5.2 - 2012 Sep 9, KURIL ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>155.517,49.427,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 10 14:35:42.81 UTC">
+                <name>M 5.2 - 2012 Sep 10, ANDAMAN ISLANDS, INDIA REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>93.616,10.459,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 11 18:10:06.90 UTC">
+                <name>M 5.2 - 2012 Sep 11, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.758,10.709,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 12 11:27:50.79 UTC">
+                <name>M 5.2 - 2012 Sep 12, SOLOMON ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>161.016,-10.11,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 13 17:22:08.44 UTC">
+                <name>M 5.2 - 2012 Sep 13, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>140.388,35.752,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 16 05:51:09.45 UTC">
+                <name>M 5.2 - 2012 Sep 16, COSTA RICA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-85.459,10.168,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 18 01:46:44.39 UTC">
+                <name>M 5.2 - 2012 Sep 18, MOLUCCA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>125.849,1.336,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 18 03:23:45.84 UTC">
+                <name>M 5.2 - 2012 Sep 18, SOUTHWEST OF SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>103.739,-6.169,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 25 01:43:14.17 UTC">
+                <name>M 5.2 - 2012 Sep 25, SOUTH OF AFRICA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>25.583,-53.21,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 25 05:37:58.39 UTC">
+                <name>M 5.2 - 2012 Sep 25, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>178.327,-25.555,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 25 08:33:00.73 UTC">
+                <name>M 5.2 - 2012 Sep 25, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>69.211,36.277,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 25 19:42:33.08 UTC">
+                <name>M 5.2 - 2012 Sep 25, SOLOMON ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>159.746,-9.748,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 28 23:22:32.67 UTC">
+                <name>M 5.2 - 2012 Sep 28, SOLOMON ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>157.425,-8.93,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 1 17:32:28.95 UTC">
+                <name>M 5.2 - 2012 Oct 1, OFF COAST OF JALISCO, MEXICO</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-107.164,18.607,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 1 22:55:47.25 UTC">
+                <name>M 5.2 - 2012 Oct 1, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>143.189,39.74,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 2 18:37:38.70 UTC">
+                <name>M 5.2 - 2012 Oct 2, ASSAM, INDIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>92.818,26.879,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 10 16:56:33.00 UTC">
+                <name>M 5.2 - 2012 Oct 10, SOUTHERN IRAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>52.49,29.33,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 12 04:57:19.83 UTC">
+                <name>M 5.2 - 2012 Oct 12, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>140.346,35.764,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 15 20:19:00.50 UTC">
+                <name>M 5.2 - 2012 Oct 15, FIJI REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-178.251,-20.446,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 22 09:55:55.15 UTC">
+                <name>M 5.2 - 2012 Oct 22, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-25.59,-56.301,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 27 09:32:30.22 UTC">
+                <name>M 5.2 - 2012 Oct 27, CARLSBERG RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>57.091,9.82,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 27 15:46:28.38 UTC">
+                <name>M 5.2 - 2012 Oct 27, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.812,10.415,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 04:25:28.51 UTC">
+                <name>M 5.2 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-132.49,52.624,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 1 06:57:23.50 UTC">
+                <name>M 5.2 - 2012 Nov 1, KURIL ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>155.489,49.399,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 5 00:24:43.50 UTC">
+                <name>M 5.2 - 2012 Nov 5, SOUTHWEST INDIAN RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>61.983,-28.775,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 5 00:29:59.16 UTC">
+                <name>M 5.2 - 2012 Nov 5, MOLUCCA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>125.236,-0.144,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 8 17:38:05.32 UTC">
+                <name>M 5.2 - 2012 Nov 8, WESTERN INDIAN-ANTARCTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>117.354,-49.699,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 9 03:51:57.87 UTC">
+                <name>M 5.2 - 2012 Nov 9, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.246,36.838,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 9 09:54:39.80 UTC">
+                <name>M 5.2 - 2012 Nov 9, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-27.344,-56.391,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 9 19:59:45.99 UTC">
+                <name>M 5.2 - 2012 Nov 9, NIAS REGION, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>97.464,0.886,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 11 14:56:10.59 UTC">
+                <name>M 5.2 - 2012 Nov 11, SANTA CRUZ ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>164.828,-10.755,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 12 14:47:41.50 UTC">
+                <name>M 5.2 - 2012 Nov 12, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>178.919,-24.277,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 14 07:41:53.21 UTC">
+                <name>M 5.2 - 2012 Nov 14, TONGA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-174.079,-20.739,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 14 18:22:32.06 UTC">
+                <name>M 5.2 - 2012 Nov 14, FIJI REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>173.738,-14.484,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 20 17:08:59.79 UTC">
+                <name>M 5.2 - 2012 Nov 20, TAIWAN REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>121.454,22.339,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 21 22:52:29.37 UTC">
+                <name>M 5.2 - 2012 Nov 21, OFFSHORE O'HIGGINS, CHILE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-71.994,-33.916,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 22 18:01:10.39 UTC">
+                <name>M 5.2 - 2012 Nov 22, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>102.826,-4.535,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 27 11:58:19.35 UTC">
+                <name>M 5.2 - 2012 Nov 27, PAPUA, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>138.75,-2.712,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 08:36:20.37 UTC">
+                <name>M 5.2 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>143.93,37.325,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 23:00:00.50 UTC">
+                <name>M 5.2 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>143.762,37.739,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 9 20:52:39.24 UTC">
+                <name>M 5.2 - 2012 Dec 9, TONGA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-174.22,-16.236,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 10 20:47:51.22 UTC">
+                <name>M 5.2 - 2012 Dec 10, BANDA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>129.904,-6.511,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 11 12:18:21.49 UTC">
+                <name>M 5.2 - 2012 Dec 11, VANUATU</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>167.669,-18.974,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 14 04:04:06.86 UTC">
+                <name>M 5.2 - 2012 Dec 14, OFFSHORE GUATEMALA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-91.679,13.926,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 15 04:27:02.33 UTC">
+                <name>M 5.2 - 2012 Dec 15, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.205,37.311,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 16 10:07:12.04 UTC">
+                <name>M 5.2 - 2012 Dec 16, GUATEMALA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-91.457,14.675,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 16 15:52:00.92 UTC">
+                <name>M 5.2 - 2012 Dec 16, ROTA REGION, N. MARIANA ISLANDS</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>146.733,14.185,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 23 00:29:56.57 UTC">
+                <name>M 5.2 - 2012 Dec 23, VANUATU</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>167.11,-13.086,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 23 06:38:57.45 UTC">
+                <name>M 5.2 - 2012 Dec 23, TURKEY-IRAN BORDER REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>44.868,38.458,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 23 12:52:24.45 UTC">
+                <name>M 5.2 - 2012 Dec 23, KEPULAUAN TALAUD, INDONESIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.584,4.19,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 25 22:44:33.51 UTC">
+                <name>M 5.2 - 2012 Dec 25, BLACK SEA, OFFSHORE GEORGIA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>40.974,42.436,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 26 13:17:57.26 UTC">
+                <name>M 5.2 - 2012 Dec 26, BIO-BIO, CHILE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-73.267,-37.274,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 27 16:33:59.87 UTC">
+                <name>M 5.2 - 2012 Dec 27, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-14.876,-12.396,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 29 23:05:24.20 UTC">
+                <name>M 5.2 - 2012 Dec 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>141.168,37.018,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 30 06:44:41.48 UTC">
+                <name>M 5.2 - 2012 Dec 30, SCOTIA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-36.887,-60.906,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 30 11:33:43.03 UTC">
+                <name>M 5.2 - 2012 Dec 30, MOLUCCA SEA</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>126.587,1.569,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 30 20:49:27.83 UTC">
+                <name>M 5.2 - 2012 Dec 30, CENTRAL PERU</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>-70.938,-12.861,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 31 20:02:04.16 UTC">
+                <name>M 5.2 - 2012 Dec 31, BALLENY ISLANDS REGION</name>
+                <magnitude>5.2</magnitude>
+                <Point>
+                    <coordinates>154.301,-61.623,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 00:30:08.77 UTC">
+                <name>M 5.1 - 2012 Jan 1, GUAM REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.487,12.008,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 12:27:57.25 UTC">
+                <name>M 5.1 - 2012 Jan 1, SOUTH ISLAND OF NEW ZEALAND</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>172.852,-43.47,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 15:44:12.07 UTC">
+                <name>M 5.1 - 2012 Jan 1, GUAM REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.607,12.018,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 21:07:24.67 UTC">
+                <name>M 5.1 - 2012 Jan 1, HALMAHERA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>128.368,2.205,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 22:59:09.10 UTC">
+                <name>M 5.1 - 2012 Jan 1, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>166.921,-14.381,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 4 04:47:34.05 UTC">
+                <name>M 5.1 - 2012 Jan 4, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.44,-14.748,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 5 23:14:49.12 UTC">
+                <name>M 5.1 - 2012 Jan 5, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>99.069,-0.935,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 6 00:38:48.40 UTC">
+                <name>M 5.1 - 2012 Jan 6, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-14.263,-14.092,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 18:22:19.33 UTC">
+                <name>M 5.1 - 2012 Jan 7, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-166.854,-63.697,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 20:00:44.74 UTC">
+                <name>M 5.1 - 2012 Jan 7, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-173.318,-17.549,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 9 00:06:54.80 UTC">
+                <name>M 5.1 - 2012 Jan 9, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-174.142,-15.063,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 10 18:52:09.11 UTC">
+                <name>M 5.1 - 2012 Jan 10, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.937,2.386,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 11 17:08:00.60 UTC">
+                <name>M 5.1 - 2012 Jan 11, NORTHERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>52.775,36.328,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 13 17:49:10.12 UTC">
+                <name>M 5.1 - 2012 Jan 13, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.566,-32.809,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 13 20:03:46.82 UTC">
+                <name>M 5.1 - 2012 Jan 13, SIMEULUE, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>96.273,2.405,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 13 20:25:24.54 UTC">
+                <name>M 5.1 - 2012 Jan 13, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.476,-32.882,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 14 13:47:53.18 UTC">
+                <name>M 5.1 - 2012 Jan 14, SOUTH ISLAND OF NEW ZEALAND</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>172.765,-43.538,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 15 18:41:09.13 UTC">
+                <name>M 5.1 - 2012 Jan 15, SOUTH SHETLAND ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-53.571,-61.33,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 15 19:06:45.51 UTC">
+                <name>M 5.1 - 2012 Jan 15, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-12.912,-15.675,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 16 15:06:03.09 UTC">
+                <name>M 5.1 - 2012 Jan 16, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-25.045,-56.718,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 16 18:20:50.47 UTC">
+                <name>M 5.1 - 2012 Jan 16, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.424,-33.33,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 18 16:09:08.65 UTC">
+                <name>M 5.1 - 2012 Jan 18, MOLUCCA SEA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.806,-0.906,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 18 17:26:03.55 UTC">
+                <name>M 5.1 - 2012 Jan 18, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>165.478,-11.023,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 19 04:06:42.00 UTC">
+                <name>M 5.1 - 2012 Jan 19, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>165.477,-10.979,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 19 12:35:51.30 UTC">
+                <name>M 5.1 - 2012 Jan 19, NORTHEASTERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>58.835,36.288,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 23 20:50:14.50 UTC">
+                <name>M 5.1 - 2012 Jan 23, DOMINICAN REPUBLIC</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-70.077,19.542,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 24 10:34:19.08 UTC">
+                <name>M 5.1 - 2012 Jan 24, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.102,8.584,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 25 00:45:57.71 UTC">
+                <name>M 5.1 - 2012 Jan 25, FOX ISLANDS, ALEUTIAN ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-167.049,52.654,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 25 06:02:34.75 UTC">
+                <name>M 5.1 - 2012 Jan 25, OFF W. COAST OF S. ISLAND, N.Z.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>165.714,-46.68,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 25 07:17:04.22 UTC">
+                <name>M 5.1 - 2012 Jan 25, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>152.136,-5.209,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 27 00:06:49.36 UTC">
+                <name>M 5.1 - 2012 Jan 27, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>138.259,-1.452,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 27 09:54:31.75 UTC">
+                <name>M 5.1 - 2012 Jan 27, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>93.018,2.732,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 27 17:16:25.93 UTC">
+                <name>M 5.1 - 2012 Jan 27, SOUTH OF LOMBOK, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>116.013,-10.369,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 04:46:23.41 UTC">
+                <name>M 5.1 - 2012 Jan 28, BABUYAN ISL REGION, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>121.205,19.251,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 08:51:36.27 UTC">
+                <name>M 5.1 - 2012 Jan 28, POTOSI, BOLIVIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-66.436,-21.464,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 14:47:19.36 UTC">
+                <name>M 5.1 - 2012 Jan 28, SIMEULUE, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>96.678,2.07,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 17:45:30.74 UTC">
+                <name>M 5.1 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-177.166,-29.428,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 29 18:18:24.19 UTC">
+                <name>M 5.1 - 2012 Jan 29, KYUSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>131.806,32.588,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 31 19:58:02.47 UTC">
+                <name>M 5.1 - 2012 Jan 31, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.18,-14.255,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 02:09:22.35 UTC">
+                <name>M 5.1 - 2012 Feb 2, WESTERN INDIAN-ANTARCTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.049,-49.649,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 13:39:23.13 UTC">
+                <name>M 5.1 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.53,-17.754,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 15:04:52.86 UTC">
+                <name>M 5.1 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.32,-17.686,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 16:11:35.95 UTC">
+                <name>M 5.1 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.429,-17.717,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 19:30:59.21 UTC">
+                <name>M 5.1 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.287,-17.395,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 19:44:34.17 UTC">
+                <name>M 5.1 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.209,-17.43,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 20:26:31.91 UTC">
+                <name>M 5.1 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.327,-17.534,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 02:54:22.49 UTC">
+                <name>M 5.1 - 2012 Feb 4, TAIWAN REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>122.602,24.699,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 18:01:46.70 UTC">
+                <name>M 5.1 - 2012 Feb 4, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-26.746,0.922,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 5 23:50:41.19 UTC">
+                <name>M 5.1 - 2012 Feb 5, FIJI REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-177.987,-20.423,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 8 08:52:27.16 UTC">
+                <name>M 5.1 - 2012 Feb 8, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>119.951,-0.462,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 8 13:06:41.20 UTC">
+                <name>M 5.1 - 2012 Feb 8, OFF COAST OF CHIAPAS, MEXICO</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-94.427,14.682,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 02:39:40.38 UTC">
+                <name>M 5.1 - 2012 Feb 9, SERAM, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>130.789,-3.252,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 05:09:11.73 UTC">
+                <name>M 5.1 - 2012 Feb 9, SERAM, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>130.694,-3.339,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 11:21:08.34 UTC">
+                <name>M 5.1 - 2012 Feb 9, CROZET ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>44.526,-41.065,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 15:18:13.59 UTC">
+                <name>M 5.1 - 2012 Feb 9, PAPUA REGION, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>140.72,-1.755,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 18:57:03.99 UTC">
+                <name>M 5.1 - 2012 Feb 9, NORTHERN XINJIANG, CHINA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.985,44.742,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 19:17:30.55 UTC">
+                <name>M 5.1 - 2012 Feb 9, UTTARANCHAL, INDIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>78.282,30.986,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 19:21:01.65 UTC">
+                <name>M 5.1 - 2012 Feb 9, MACQUARIE ISLAND REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>158.057,-58.307,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 11 05:10:51.31 UTC">
+                <name>M 5.1 - 2012 Feb 11, FIJI REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-176.113,-20.991,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 11 15:23:07.90 UTC">
+                <name>M 5.1 - 2012 Feb 11, SOLOMON ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>160.274,-9.954,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 13 10:12:07.24 UTC">
+                <name>M 5.1 - 2012 Feb 13, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.851,-32.554,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 14 04:12:23.04 UTC">
+                <name>M 5.1 - 2012 Feb 14, SOUTHERN EAST PACIFIC RISE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-116.529,-49.723,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 14 22:34:38.20 UTC">
+                <name>M 5.1 - 2012 Feb 14, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.642,36.16,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 15 23:03:48.83 UTC">
+                <name>M 5.1 - 2012 Feb 15, ANDREANOF ISLANDS, ALEUTIAN IS.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-177.97,51.763,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 17 01:57:29.47 UTC">
+                <name>M 5.1 - 2012 Feb 17, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>168.847,-19.367,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 18 04:50:22.43 UTC">
+                <name>M 5.1 - 2012 Feb 18, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>151.415,-5.285,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 20 23:54:20.40 UTC">
+                <name>M 5.1 - 2012 Feb 20, TONGA REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-172.96,-17.678,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 22 00:50:43.76 UTC">
+                <name>M 5.1 - 2012 Feb 22, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.051,-17.868,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 23 13:25:30.19 UTC">
+                <name>M 5.1 - 2012 Feb 23, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>151.926,-5.197,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 23 14:09:09.50 UTC">
+                <name>M 5.1 - 2012 Feb 23, OFF COAST OF CHIAPAS, MEXICO</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-93.37,14.16,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 23 18:26:23.46 UTC">
+                <name>M 5.1 - 2012 Feb 23, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-176.185,-29.231,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 25 01:12:00.09 UTC">
+                <name>M 5.1 - 2012 Feb 25, MAUG ISLANDS REG, N. MARIANA IS.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>145.747,19.122,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 25 05:06:21.54 UTC">
+                <name>M 5.1 - 2012 Feb 25, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>179.534,-25.686,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 25 07:01:45.35 UTC">
+                <name>M 5.1 - 2012 Feb 25, SAMAR, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>125.782,11.774,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 11:07:41.20 UTC">
+                <name>M 5.1 - 2012 Feb 26, SOUTHWESTERN SIBERIA, RUSSIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>96.084,51.693,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 11:17:02.95 UTC">
+                <name>M 5.1 - 2012 Feb 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-177.222,-24.869,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 13:49:59.05 UTC">
+                <name>M 5.1 - 2012 Feb 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-177.205,-24.672,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 19:37:09.24 UTC">
+                <name>M 5.1 - 2012 Feb 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-177.305,-24.849,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 14:34:21.87 UTC">
+                <name>M 5.1 - 2012 Feb 27, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-177.123,-24.757,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 14:54:43.99 UTC">
+                <name>M 5.1 - 2012 Feb 27, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-177.229,-24.688,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 28 05:33:32.54 UTC">
+                <name>M 5.1 - 2012 Feb 28, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>156.1,49.262,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 29 07:05:12.11 UTC">
+                <name>M 5.1 - 2012 Feb 29, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>166.487,-12.543,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 29 11:36:35.59 UTC">
+                <name>M 5.1 - 2012 Feb 29, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>156.103,49.259,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 1 00:59:59.99 UTC">
+                <name>M 5.1 - 2012 Mar 1, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.45,-17.893,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 2 16:48:30.66 UTC">
+                <name>M 5.1 - 2012 Mar 2, RAT ISLANDS, ALEUTIAN ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>178.588,52.228,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 3 18:22:32.53 UTC">
+                <name>M 5.1 - 2012 Mar 3, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>170.307,-21.994,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 4 16:05:14.11 UTC">
+                <name>M 5.1 - 2012 Mar 4, TONGA REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-174.798,-22.309,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 4 23:17:07.17 UTC">
+                <name>M 5.1 - 2012 Mar 4, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>102.706,-4.323,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 5 05:14:13.81 UTC">
+                <name>M 5.1 - 2012 Mar 5, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>170.343,-21.591,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 5 06:55:30.78 UTC">
+                <name>M 5.1 - 2012 Mar 5, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>97.062,4.197,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 5 07:41:04.53 UTC">
+                <name>M 5.1 - 2012 Mar 5, HARYANA - DELHI REGION, INDIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>76.649,28.809,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 5 12:45:44.52 UTC">
+                <name>M 5.1 - 2012 Mar 5, KEPULAUAN BABAR, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>129.212,-7.076,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 7 13:56:02.09 UTC">
+                <name>M 5.1 - 2012 Mar 7, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>168.194,-19.571,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 8 15:30:27.19 UTC">
+                <name>M 5.1 - 2012 Mar 8, MINDORO, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>120.556,13.592,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 8 18:21:38.50 UTC">
+                <name>M 5.1 - 2012 Mar 8, IRAN-IRAQ BORDER REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>46.957,32.874,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 13 23:16:16.51 UTC">
+                <name>M 5.1 - 2012 Mar 13, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>166.983,-17.599,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 19 05:04:59.64 UTC">
+                <name>M 5.1 - 2012 Mar 19, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>119.927,-0.882,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 19 17:50:50.54 UTC">
+                <name>M 5.1 - 2012 Mar 19, KAMCHATKA PENINSULA, RUSSIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>164.724,58.864,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 20 18:35:36.95 UTC">
+                <name>M 5.1 - 2012 Mar 20, OAXACA, MEXICO</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-98.22,16.228,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 20 20:14:39.99 UTC">
+                <name>M 5.1 - 2012 Mar 20, OAXACA, MEXICO</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-97.987,16.478,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 20 21:07:11.82 UTC">
+                <name>M 5.1 - 2012 Mar 20, TONGA REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-175.753,-23.882,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 22 00:21:36.95 UTC">
+                <name>M 5.1 - 2012 Mar 22, KEPULAUAN SANGIHE, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>125.859,3.513,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 22 16:46:47.79 UTC">
+                <name>M 5.1 - 2012 Mar 22, OAXACA, MEXICO</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-98.343,16.334,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 25 13:59:22.57 UTC">
+                <name>M 5.1 - 2012 Mar 25, FIJI REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.774,-18.638,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 30 04:38:33.66 UTC">
+                <name>M 5.1 - 2012 Mar 30, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.244,37.539,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 30 10:55:24.40 UTC">
+                <name>M 5.1 - 2012 Mar 30, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>144.807,40.764,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 31 17:06:48.94 UTC">
+                <name>M 5.1 - 2012 Mar 31, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-175.234,-20.326,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 6 19:26:15.43 UTC">
+                <name>M 5.1 - 2012 Apr 6, KEP. MENTAWAI REGION, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>100.452,-3.346,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 10:08:28.97 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>90.062,2.594,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 11:04:45.19 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.482,0.604,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 12:00:35.28 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.493,2.235,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 12:10:52.77 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.631,1.347,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 12:21:59.15 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.797,3.163,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 12:37:48.38 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.626,2.583,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 14:20:56.96 UTC">
+                <name>M 5.1 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>89.933,2.833,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 15:09:25.71 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>90.164,2.674,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 16:04:23.88 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.863,3.368,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 22:15:25.88 UTC">
+                <name>M 5.1 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.496,0.619,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 00:01:15.34 UTC">
+                <name>M 5.1 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.158,0.252,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 13 12:12:05.66 UTC">
+                <name>M 5.1 - 2012 Apr 13, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.151,37.022,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 14 12:18:25.93 UTC">
+                <name>M 5.1 - 2012 Apr 14, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>90.347,2.589,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 17 03:24:26.41 UTC">
+                <name>M 5.1 - 2012 Apr 17, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>94.621,5.373,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 18 17:40:39.56 UTC">
+                <name>M 5.1 - 2012 Apr 18, SOUTHEASTERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>58.063,27.941,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 18 18:38:12.19 UTC">
+                <name>M 5.1 - 2012 Apr 18, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>131.893,-0.545,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 18 18:42:57.96 UTC">
+                <name>M 5.1 - 2012 Apr 18, IRAN-IRAQ BORDER REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>47.004,32.506,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 01:21:07.54 UTC">
+                <name>M 5.1 - 2012 Apr 20, IRAN-IRAQ BORDER REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>47.023,32.511,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 22 03:17:28.98 UTC">
+                <name>M 5.1 - 2012 Apr 22, NORTH INDIAN OCEAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>91.745,1.379,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 23 02:14:18.82 UTC">
+                <name>M 5.1 - 2012 Apr 23, SOUTH OF TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-175.993,-24.008,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 24 19:43:53.29 UTC">
+                <name>M 5.1 - 2012 Apr 24, NORTH INDIAN OCEAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>91.724,1.154,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 25 16:30:59.56 UTC">
+                <name>M 5.1 - 2012 Apr 25, NICOBAR ISLANDS, INDIA REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>93.882,8.826,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 26 18:41:20.87 UTC">
+                <name>M 5.1 - 2012 Apr 26, HOKKAIDO, JAPAN REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.818,41.485,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 27 10:29:37.98 UTC">
+                <name>M 5.1 - 2012 Apr 27, SULAWESI, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>121.913,-2.662,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 1 13:59:39.60 UTC">
+                <name>M 5.1 - 2012 May 1, SULAWESI, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>121.906,-2.613,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 1 22:13:18.60 UTC">
+                <name>M 5.1 - 2012 May 1, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-175.874,-30.267,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 2 05:14:05.93 UTC">
+                <name>M 5.1 - 2012 May 2, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-176.175,-24.331,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 4 16:23:43.08 UTC">
+                <name>M 5.1 - 2012 May 4, NORTH INDIAN OCEAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>89.719,2.001,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 5 20:12:35.06 UTC">
+                <name>M 5.1 - 2012 May 5, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.628,38.182,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 11 20:34:25.34 UTC">
+                <name>M 5.1 - 2012 May 11, IZU ISLANDS, JAPAN REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>138.61,30.669,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 14 10:12:31.99 UTC">
+                <name>M 5.1 - 2012 May 14, SOUTHERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>57.722,27.955,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 15 05:19:55.52 UTC">
+                <name>M 5.1 - 2012 May 15, NORTH INDIAN OCEAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>89.561,2.71,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 17 21:40:42.20 UTC">
+                <name>M 5.1 - 2012 May 17, SOUTHERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>53.851,26.942,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 18 14:47:22.40 UTC">
+                <name>M 5.1 - 2012 May 18, AZERBAIJAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>46.789,41.439,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 01:55:50.06 UTC">
+                <name>M 5.1 - 2012 May 20, MARIANA ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>147.257,17.017,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 06:54:43.78 UTC">
+                <name>M 5.1 - 2012 May 20, EAST OF KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>151.761,44.688,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 08:40:42.83 UTC">
+                <name>M 5.1 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.197,39.577,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 22:15:45.08 UTC">
+                <name>M 5.1 - 2012 May 20, NEAR N COAST OF NEW GUINEA, PNG.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.917,-3.188,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 22:21:02.98 UTC">
+                <name>M 5.1 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.619,39.556,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 22 02:38:43.99 UTC">
+                <name>M 5.1 - 2012 May 22, MOLUCCA SEA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.619,2.41,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 23 20:36:51.31 UTC">
+                <name>M 5.1 - 2012 May 23, ROTA REGION, N. MARIANA ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>145.413,14.065,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 26 00:51:28.39 UTC">
+                <name>M 5.1 - 2012 May 26, LOYALTY ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>168.626,-20.796,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 26 03:27:03.72 UTC">
+                <name>M 5.1 - 2012 May 26, NORTH OF SVALBARD</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>32.186,85.939,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 28 16:36:46.24 UTC">
+                <name>M 5.1 - 2012 May 28, NEAR S. COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>139.95,35.707,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 29 11:00:25.05 UTC">
+                <name>M 5.1 - 2012 May 29, NORTHERN ITALY</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>10.955,44.873,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 1 08:48:10.44 UTC">
+                <name>M 5.1 - 2012 Jun 1, NEAR S. COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>139.642,35.98,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 3 19:20:43.00 UTC">
+                <name>M 5.1 - 2012 Jun 3, NORTHERN ITALY</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>10.94,44.9,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 5 00:35:26.03 UTC">
+                <name>M 5.1 - 2012 Jun 5, NORTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-44.854,13.501,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 6 14:04:16.81 UTC">
+                <name>M 5.1 - 2012 Jun 6, SOUTHWESTERN SIBERIA, RUSSIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>96.037,51.706,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 7 01:10:25.93 UTC">
+                <name>M 5.1 - 2012 Jun 7, MOLUCCA SEA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.477,1.602,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 9 08:49:30.21 UTC">
+                <name>M 5.1 - 2012 Jun 9, CERAM SEA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>127.671,-2.987,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 9 09:53:51.51 UTC">
+                <name>M 5.1 - 2012 Jun 9, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-26.424,-60.577,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 10 08:18:05.84 UTC">
+                <name>M 5.1 - 2012 Jun 10, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-27.674,-55.981,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 12 13:48:34.71 UTC">
+                <name>M 5.1 - 2012 Jun 12, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.657,-31.696,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 14 11:04:04.84 UTC">
+                <name>M 5.1 - 2012 Jun 14, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>179.633,-22.25,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 16 13:05:26.88 UTC">
+                <name>M 5.1 - 2012 Jun 16, MAUG ISLANDS REG, N. MARIANA IS.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>145.401,20.632,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 17 23:43:53.23 UTC">
+                <name>M 5.1 - 2012 Jun 17, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-26.603,-57.124,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 18 12:50:42.63 UTC">
+                <name>M 5.1 - 2012 Jun 18, HALMAHERA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>129.203,2.035,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 19 04:27:57.35 UTC">
+                <name>M 5.1 - 2012 Jun 19, KEP. MENTAWAI REGION, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>100.99,-2.921,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 22 05:02:06.78 UTC">
+                <name>M 5.1 - 2012 Jun 22, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.33,-32.979,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 24 19:28:04.11 UTC">
+                <name>M 5.1 - 2012 Jun 24, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-27.611,-60.228,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 25 03:30:07.73 UTC">
+                <name>M 5.1 - 2012 Jun 25, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.051,-32.627,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 27 11:30:01.12 UTC">
+                <name>M 5.1 - 2012 Jun 27, VOLCANO ISLANDS, JAPAN REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.482,23.126,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 1 22:01:25.90 UTC">
+                <name>M 5.1 - 2012 Jul 1, NORTHEASTERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>59.927,34.481,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 3 13:47:03.19 UTC">
+                <name>M 5.1 - 2012 Jul 3, NORTHERN PERU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-76.15,-4.035,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 4 14:36:34.50 UTC">
+                <name>M 5.1 - 2012 Jul 4, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.169,-30.749,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 7 00:56:29.73 UTC">
+                <name>M 5.1 - 2012 Jul 7, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>151.232,45.465,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 7 20:32:38.23 UTC">
+                <name>M 5.1 - 2012 Jul 7, DOMINICAN REPUBLIC</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-71.136,18.243,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 9 20:13:07.39 UTC">
+                <name>M 5.1 - 2012 Jul 9, MYANMAR</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>96.529,25.347,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 10 02:28:12.01 UTC">
+                <name>M 5.1 - 2012 Jul 10, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-176.408,-25.142,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 11 02:49:57.54 UTC">
+                <name>M 5.1 - 2012 Jul 11, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>151.435,45.377,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 11 15:15:47.05 UTC">
+                <name>M 5.1 - 2012 Jul 11, GALAPAGOS ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-90.855,1.582,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 13 04:50:44.58 UTC">
+                <name>M 5.1 - 2012 Jul 13, FIJI REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.551,-18.273,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 13 21:26:13.21 UTC">
+                <name>M 5.1 - 2012 Jul 13, SOUTHERN PERU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-73.172,-15.232,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 17 20:06:53.57 UTC">
+                <name>M 5.1 - 2012 Jul 17, SOUTHERN EAST PACIFIC RISE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-115.177,-23.496,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 18 18:24:08.68 UTC">
+                <name>M 5.1 - 2012 Jul 18, OFFSHORE TARAPACA, CHILE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-70.365,-20.693,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 20 18:54:11.88 UTC">
+                <name>M 5.1 - 2012 Jul 20, KODIAK ISLAND REGION, ALASKA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-153.542,56.595,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 21 01:52:01.69 UTC">
+                <name>M 5.1 - 2012 Jul 21, OFFSHORE NORTHERN CALIFORNIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-125.528,40.385,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 22 02:11:12.21 UTC">
+                <name>M 5.1 - 2012 Jul 22, MYANMAR</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>96.427,24.998,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 22 04:41:57.29 UTC">
+                <name>M 5.1 - 2012 Jul 22, HOKKAIDO, JAPAN REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>142.848,42.552,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 24 19:41:42.51 UTC">
+                <name>M 5.1 - 2012 Jul 24, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>166.416,-12.042,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 1 09:24:41.21 UTC">
+                <name>M 5.1 - 2012 Aug 1, EAST OF NORTH ISLAND, N.Z.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-179.679,-35.663,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 2 05:17:08.59 UTC">
+                <name>M 5.1 - 2012 Aug 2, EAST OF NORTH ISLAND, N.Z.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-179.6,-37.584,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 2 19:06:12.70 UTC">
+                <name>M 5.1 - 2012 Aug 2, MYANMAR</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>96.324,26.103,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 3 06:06:09.99 UTC">
+                <name>M 5.1 - 2012 Aug 3, ROSS SEA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>164.067,-76.313,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 3 13:01:08.24 UTC">
+                <name>M 5.1 - 2012 Aug 3, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-13.831,-25.807,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 4 02:00:30.07 UTC">
+                <name>M 5.1 - 2012 Aug 4, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>100.471,-1.758,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 4 12:54:27.11 UTC">
+                <name>M 5.1 - 2012 Aug 4, EAST OF NORTH ISLAND, N.Z.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-179.752,-35.779,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 6 12:20:44.41 UTC">
+                <name>M 5.1 - 2012 Aug 6, SOUTHWEST OF AFRICA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>13.771,-52.261,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 10 04:41:40.25 UTC">
+                <name>M 5.1 - 2012 Aug 10, NIAS REGION, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>96.965,1.901,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 11 09:34:22.79 UTC">
+                <name>M 5.1 - 2012 Aug 11, SOUTHERN XINJIANG, CHINA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>78.154,39.963,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 11 22:24:02.00 UTC">
+                <name>M 5.1 - 2012 Aug 11, NORTHWESTERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>46.759,38.482,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 14 14:02:25.00 UTC">
+                <name>M 5.1 - 2012 Aug 14, NORTHWESTERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>46.79,38.45,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 16 14:14:30.90 UTC">
+                <name>M 5.1 - 2012 Aug 16, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-18.759,-0.269,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 20 16:42:55.01 UTC">
+                <name>M 5.1 - 2012 Aug 20, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.323,36.927,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 21 17:51:36.94 UTC">
+                <name>M 5.1 - 2012 Aug 21, SOUTHWEST OF SUMATRA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>92.008,-0.177,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 22 10:13:57.47 UTC">
+                <name>M 5.1 - 2012 Aug 22, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-173.661,-20.038,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 04:39:27.94 UTC">
+                <name>M 5.1 - 2012 Aug 27, OFFSHORE EL SALVADOR</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-88.399,12.76,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 09:05:03.87 UTC">
+                <name>M 5.1 - 2012 Aug 27, NEAR COAST OF NICARAGUA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-88.282,12.172,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 29 13:34:30.18 UTC">
+                <name>M 5.1 - 2012 Aug 29, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>168.334,-17.61,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 30 19:00:08.44 UTC">
+                <name>M 5.1 - 2012 Aug 30, KEPULAUAN BARAT DAYA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>128.647,-7.806,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 16:55:11.39 UTC">
+                <name>M 5.1 - 2012 Aug 31, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.705,11.026,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 17:02:07.09 UTC">
+                <name>M 5.1 - 2012 Aug 31, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-27.493,-55.804,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 22:01:20.25 UTC">
+                <name>M 5.1 - 2012 Aug 31, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.867,10.977,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 05:09:45.65 UTC">
+                <name>M 5.1 - 2012 Sep 1, NORTHERN COLOMBIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-72.919,6.719,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 2 00:50:00.50 UTC">
+                <name>M 5.1 - 2012 Sep 2, EASTERN IRAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>59.897,33.474,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 3 02:14:43.26 UTC">
+                <name>M 5.1 - 2012 Sep 3, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.393,10.338,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 5 03:47:18.60 UTC">
+                <name>M 5.1 - 2012 Sep 5, TAIWAN REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>122.341,24.026,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 5 20:36:32.91 UTC">
+                <name>M 5.1 - 2012 Sep 5, GULF OF ADEN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>46.238,12.084,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 8 16:27:38.99 UTC">
+                <name>M 5.1 - 2012 Sep 8, MOLUCCA SEA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.691,2.387,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 9 09:36:41.14 UTC">
+                <name>M 5.1 - 2012 Sep 9, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>151.322,45.291,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 10 11:23:29.54 UTC">
+                <name>M 5.1 - 2012 Sep 10, KEPULAUAN TALAUD, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.132,3.999,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 11 06:35:38.00 UTC">
+                <name>M 5.1 - 2012 Sep 11, SAN JUAN, ARGENTINA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-68.35,-31.875,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 12 19:29:56.18 UTC">
+                <name>M 5.1 - 2012 Sep 12, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>71.442,36.697,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 13 01:40:30.04 UTC">
+                <name>M 5.1 - 2012 Sep 13, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>113.98,-10.901,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 13 17:23:47.35 UTC">
+                <name>M 5.1 - 2012 Sep 13, NORTH OF SEVERNAYA ZEMLYA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>116.863,82.899,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 14 06:56:16.84 UTC">
+                <name>M 5.1 - 2012 Sep 14, SOUTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-16.021,-39.644,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 15 07:04:01.76 UTC">
+                <name>M 5.1 - 2012 Sep 15, SAMAR, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>125.524,12.532,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 18 01:44:50.39 UTC">
+                <name>M 5.1 - 2012 Sep 18, KODIAK ISLAND REGION, ALASKA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-154.142,56.937,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 20 17:44:49.12 UTC">
+                <name>M 5.1 - 2012 Sep 20, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>149.845,-5.691,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 20 18:32:11.54 UTC">
+                <name>M 5.1 - 2012 Sep 20, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.344,39.607,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 22 09:37:00.35 UTC">
+                <name>M 5.1 - 2012 Sep 22, SAKHALIN, RUSSIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.915,46.078,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 24 00:28:01.88 UTC">
+                <name>M 5.1 - 2012 Sep 24, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.54,5.629,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 26 01:41:39.06 UTC">
+                <name>M 5.1 - 2012 Sep 26, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-174.328,-21.205,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 29 17:48:59.47 UTC">
+                <name>M 5.1 - 2012 Sep 29, LA PAZ, BOLIVIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-69.405,-17.182,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 1 18:40:54.59 UTC">
+                <name>M 5.1 - 2012 Oct 1, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.028,36.916,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 2 11:35:47.85 UTC">
+                <name>M 5.1 - 2012 Oct 2, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-174.407,-21.155,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 4 01:55:21.71 UTC">
+                <name>M 5.1 - 2012 Oct 4, MINDORO, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>120.664,13.249,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 9 07:14:58.86 UTC">
+                <name>M 5.1 - 2012 Oct 9, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>139.107,-2.706,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 11 22:03:43.92 UTC">
+                <name>M 5.1 - 2012 Oct 11, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-25.71,-56.316,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 13 10:03:59.73 UTC">
+                <name>M 5.1 - 2012 Oct 13, SOLOMON ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>162.831,-11.106,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 13 17:52:49.92 UTC">
+                <name>M 5.1 - 2012 Oct 13, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-173.991,-19.963,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 13 22:36:30.77 UTC">
+                <name>M 5.1 - 2012 Oct 13, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-174.479,-16.886,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 11:09:34.49 UTC">
+                <name>M 5.1 - 2012 Oct 14, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>154.429,48.345,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 13:17:28.57 UTC">
+                <name>M 5.1 - 2012 Oct 14, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>69.216,36.167,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 13:18:53.03 UTC">
+                <name>M 5.1 - 2012 Oct 14, SOLOMON ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>161.415,-10.271,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 15 22:45:02.69 UTC">
+                <name>M 5.1 - 2012 Oct 15, OFF EAST COAST OF KAMCHATKA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>159.519,51.81,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 18 04:14:32.39 UTC">
+                <name>M 5.1 - 2012 Oct 18, FLORES REGION, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>123.671,-8.059,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 19 03:35:11.55 UTC">
+                <name>M 5.1 - 2012 Oct 19, EASTERN MEDITERRANEAN SEA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>30.978,32.552,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 19 17:22:08.55 UTC">
+                <name>M 5.1 - 2012 Oct 19, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>176.649,-21.039,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 21 20:44:15.00 UTC">
+                <name>M 5.1 - 2012 Oct 21, OFFSHORE EL SALVADOR</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-88.332,12.59,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 22 14:46:41.90 UTC">
+                <name>M 5.1 - 2012 Oct 22, FED. STATES OF MICRONESIA REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>147.678,2.893,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 23 10:45:20.67 UTC">
+                <name>M 5.1 - 2012 Oct 23, ANTOFAGASTA, CHILE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-70.55,-25.767,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 23 18:00:44.84 UTC">
+                <name>M 5.1 - 2012 Oct 23, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>147.873,-6.579,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 26 21:38:18.68 UTC">
+                <name>M 5.1 - 2012 Oct 26, SANTA CRUZ ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>165.484,-11.58,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 04:26:45.87 UTC">
+                <name>M 5.1 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-132.395,52.735,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 09:17:27.70 UTC">
+                <name>M 5.1 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-132.01,52.243,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 19:16:50.76 UTC">
+                <name>M 5.1 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-132.478,52.647,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 29 19:49:07.45 UTC">
+                <name>M 5.1 - 2012 Oct 29, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>132.789,-0.457,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 30 07:12:31.01 UTC">
+                <name>M 5.1 - 2012 Oct 30, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>151.873,-4.563,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 30 10:59:32.86 UTC">
+                <name>M 5.1 - 2012 Oct 30, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-174.714,-18.275,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 1 09:50:59.09 UTC">
+                <name>M 5.1 - 2012 Nov 1, ANDREANOF ISLANDS, ALEUTIAN IS.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-179.699,51.011,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 3 19:25:13.22 UTC">
+                <name>M 5.1 - 2012 Nov 3, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-173.617,-16.662,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 5 00:55:39.81 UTC">
+                <name>M 5.1 - 2012 Nov 5, KEPULAUAN SANGIHE, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>125.144,4.684,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 7 10:46:40.80 UTC">
+                <name>M 5.1 - 2012 Nov 7, CENTRAL EAST PACIFIC RISE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-108.73,-8.962,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 7 19:55:33.24 UTC">
+                <name>M 5.1 - 2012 Nov 7, OFFSHORE GUATEMALA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-92.193,13.967,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 8 03:24:28.31 UTC">
+                <name>M 5.1 - 2012 Nov 8, SOUTH INDIAN OCEAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>53.497,-36.132,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 8 07:39:42.85 UTC">
+                <name>M 5.1 - 2012 Nov 8, VANUATU</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>167.194,-14.663,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 8 17:56:38.45 UTC">
+                <name>M 5.1 - 2012 Nov 8, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-173.33,-18.807,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 10 06:05:27.19 UTC">
+                <name>M 5.1 - 2012 Nov 10, JAVA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>106.666,-7.373,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 10 17:15:09.90 UTC">
+                <name>M 5.1 - 2012 Nov 10, OFFSHORE GUATEMALA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-92.224,13.815,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 11 23:16:44.33 UTC">
+                <name>M 5.1 - 2012 Nov 11, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>155.213,49.357,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 12 14:58:09.65 UTC">
+                <name>M 5.1 - 2012 Nov 12, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-173.09,-17.631,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 13 01:56:46.76 UTC">
+                <name>M 5.1 - 2012 Nov 13, OFF COAST OF ECUADOR</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-81.577,-1.736,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 13 04:55:45.00 UTC">
+                <name>M 5.1 - 2012 Nov 13, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-132.033,52.705,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 17 09:06:26.71 UTC">
+                <name>M 5.1 - 2012 Nov 17, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>171.578,-22.278,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 18 20:01:26.48 UTC">
+                <name>M 5.1 - 2012 Nov 18, MINDANAO, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>125.809,5.979,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 19 04:09:26.72 UTC">
+                <name>M 5.1 - 2012 Nov 19, EAST OF SOUTH SANDWICH ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-18.067,-59.391,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 19 10:15:53.90 UTC">
+                <name>M 5.1 - 2012 Nov 19, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>151.625,-5.793,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 19 16:45:50.37 UTC">
+                <name>M 5.1 - 2012 Nov 19, OFFSHORE O'HIGGINS, CHILE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-72.17,-33.928,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 21 18:16:38.50 UTC">
+                <name>M 5.1 - 2012 Nov 21, OFFSHORE O'HIGGINS, CHILE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-72.1,-33.931,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 23 04:52:40.05 UTC">
+                <name>M 5.1 - 2012 Nov 23, LUZON, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>120.708,14.069,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 24 01:30:00.63 UTC">
+                <name>M 5.1 - 2012 Nov 24, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.702,38.23,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 26 07:23:39.61 UTC">
+                <name>M 5.1 - 2012 Nov 26, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.702,10.438,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 26 23:13:52.47 UTC">
+                <name>M 5.1 - 2012 Nov 26, ANDAMAN ISLANDS, INDIA REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>93.637,13.85,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 27 14:42:15.10 UTC">
+                <name>M 5.1 - 2012 Nov 27, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>154.943,48.17,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 27 15:40:55.94 UTC">
+                <name>M 5.1 - 2012 Nov 27, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-27.281,-56.082,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 28 15:07:43.13 UTC">
+                <name>M 5.1 - 2012 Nov 28, BONIN ISLANDS, JAPAN REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.194,27.243,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 29 00:30:31.29 UTC">
+                <name>M 5.1 - 2012 Nov 29, FIJI REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.772,-21.106,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 2 04:44:37.27 UTC">
+                <name>M 5.1 - 2012 Dec 2, OFF COAST OF CENTRAL AMERICA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-88.988,11.852,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 2 13:32:44.66 UTC">
+                <name>M 5.1 - 2012 Dec 2, TONGA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-174.214,-20.69,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 5 23:08:36.86 UTC">
+                <name>M 5.1 - 2012 Dec 5, FIJI REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-178.95,-20.781,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 6 02:24:28.33 UTC">
+                <name>M 5.1 - 2012 Dec 6, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>90.434,2.421,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 14:32:17.20 UTC">
+                <name>M 5.1 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.633,37.813,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 16:01:54.64 UTC">
+                <name>M 5.1 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.771,37.654,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 8 06:16:57.03 UTC">
+                <name>M 5.1 - 2012 Dec 8, NEAR S COAST OF NEW GUINEA, PNG.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>144.006,-7.235,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 8 14:26:55.85 UTC">
+                <name>M 5.1 - 2012 Dec 8, TAIWAN REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>122.35,25.748,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 9 02:34:17.09 UTC">
+                <name>M 5.1 - 2012 Dec 9, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.617,37.744,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 11 18:21:38.45 UTC">
+                <name>M 5.1 - 2012 Dec 11, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>143.833,37.633,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 14 04:58:48.46 UTC">
+                <name>M 5.1 - 2012 Dec 14, OFFSHORE GUATEMALA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-91.725,13.824,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 14 17:46:45.30 UTC">
+                <name>M 5.1 - 2012 Dec 14, NEW IRELAND REGION, P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>153.404,-5.272,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 15 07:33:14.40 UTC">
+                <name>M 5.1 - 2012 Dec 15, NEW IRELAND REGION, P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>153.405,-4.893,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 18 08:12:22.03 UTC">
+                <name>M 5.1 - 2012 Dec 18, OFFSHORE EL SALVADOR</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-89.978,13.054,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 18 18:36:24.30 UTC">
+                <name>M 5.1 - 2012 Dec 18, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>141.917,36.664,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 22 03:50:08.20 UTC">
+                <name>M 5.1 - 2012 Dec 22, NORTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>94.221,5.169,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 22 04:42:37.57 UTC">
+                <name>M 5.1 - 2012 Dec 22, KURIL ISLANDS</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>155.103,49.818,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 22 18:07:17.45 UTC">
+                <name>M 5.1 - 2012 Dec 22, BABUYAN ISL REGION, PHILIPPINES</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>121.194,19.061,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 24 12:12:35.34 UTC">
+                <name>M 5.1 - 2012 Dec 24, OFFSHORE ATACAMA, CHILE</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-71.494,-29.037,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 24 12:58:20.18 UTC">
+                <name>M 5.1 - 2012 Dec 24, KEPULAUAN TALAUD, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>126.679,4.149,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 25 08:46:31.83 UTC">
+                <name>M 5.1 - 2012 Dec 25, SOUTHWEST OF SUMATRA, INDONESIA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>101.25,-7.893,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 26 02:24:32.79 UTC">
+                <name>M 5.1 - 2012 Dec 26, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>147.287,-5.914,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 28 10:35:45.05 UTC">
+                <name>M 5.1 - 2012 Dec 28, KERMADEC ISLANDS REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-176.245,-29.596,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 28 13:42:34.81 UTC">
+                <name>M 5.1 - 2012 Dec 28, KOMANDORSKIYE OSTROVA REGION</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>164.724,55.707,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 29 07:59:15.86 UTC">
+                <name>M 5.1 - 2012 Dec 29, BISMARCK SEA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>148.757,-3.315,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 31 01:15:18.77 UTC">
+                <name>M 5.1 - 2012 Dec 31, GUATEMALA</name>
+                <magnitude>5.1</magnitude>
+                <Point>
+                    <coordinates>-92.037,15.031,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 04:56:40.98 UTC">
+                <name>M 5 - 2012 Jan 1, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-149.214,-58.259,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 1 19:32:52.62 UTC">
+                <name>M 5 - 2012 Jan 1, BOUGAINVILLE REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>154.209,-5.413,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 4 02:07:53.42 UTC">
+                <name>M 5 - 2012 Jan 4, RYUKYU ISLANDS, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>130.221,27.917,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 4 18:04:48.18 UTC">
+                <name>M 5 - 2012 Jan 4, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.671,-15.552,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 4 18:54:11.32 UTC">
+                <name>M 5 - 2012 Jan 4, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.663,-15.14,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 5 16:47:08.10 UTC">
+                <name>M 5 - 2012 Jan 5, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.197,38.714,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 6 08:08:40.46 UTC">
+                <name>M 5 - 2012 Jan 6, OFF COAST OF ARAUCANIA, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-75.091,-38.024,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 6 19:04:03.97 UTC">
+                <name>M 5 - 2012 Jan 6, BONIN ISLANDS, JAPAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.559,26.944,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 6 23:37:45.47 UTC">
+                <name>M 5 - 2012 Jan 6, SOUTHERN ALASKA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-153.232,59.852,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 03:21:27.44 UTC">
+                <name>M 5 - 2012 Jan 7, PAPUA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>138.055,-3.752,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 04:30:31.08 UTC">
+                <name>M 5 - 2012 Jan 7, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>152.594,-4.329,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 18:00:58.62 UTC">
+                <name>M 5 - 2012 Jan 7, BABUYAN ISL REGION, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>121.191,19.254,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 7 21:30:11.00 UTC">
+                <name>M 5 - 2012 Jan 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.073,36.063,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 8 06:20:06.38 UTC">
+                <name>M 5 - 2012 Jan 8, NORTHERN XINJIANG, CHINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>87.474,42.203,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 8 23:40:58.46 UTC">
+                <name>M 5 - 2012 Jan 8, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-179.895,-23.337,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 9 02:38:03.25 UTC">
+                <name>M 5 - 2012 Jan 9, KERMADEC ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-176.09,-29.512,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 9 17:45:32.38 UTC">
+                <name>M 5 - 2012 Jan 9, SANTA CRUZ ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>165.105,-10.516,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 9 20:13:12.32 UTC">
+                <name>M 5 - 2012 Jan 9, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>133.064,-0.814,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 10 18:07:12.99 UTC">
+                <name>M 5 - 2012 Jan 10, NEAR COAST OF ECUADOR</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-80.28,-0.74,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 00:19:05.51 UTC">
+                <name>M 5 - 2012 Jan 12, MINDANAO, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.918,8.432,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 02:20:23.87 UTC">
+                <name>M 5 - 2012 Jan 12, SOUTH OF AFRICA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>23.53,-53.252,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 02:52:38.46 UTC">
+                <name>M 5 - 2012 Jan 12, SOUTH OF AFRICA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>23.746,-53.209,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 07:08:08.64 UTC">
+                <name>M 5 - 2012 Jan 12, TONGA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-172.393,-17.989,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 15:26:28.76 UTC">
+                <name>M 5 - 2012 Jan 12, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.895,36.672,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 12 17:12:08.93 UTC">
+                <name>M 5 - 2012 Jan 12, TONGA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-172.531,-17.822,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 13 06:49:24.18 UTC">
+                <name>M 5 - 2012 Jan 13, SANTA CRUZ ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>165.262,-10.52,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 13 15:54:41.08 UTC">
+                <name>M 5 - 2012 Jan 13, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-27.208,-60.597,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 13 22:49:59.51 UTC">
+                <name>M 5 - 2012 Jan 13, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>70.512,36.009,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 14 11:34:56.85 UTC">
+                <name>M 5 - 2012 Jan 14, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-26.086,-60.695,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 16 12:50:13.59 UTC">
+                <name>M 5 - 2012 Jan 16, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-24.981,-56.754,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 16 17:53:12.25 UTC">
+                <name>M 5 - 2012 Jan 16, NORTH OF ASCENSION ISLAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-12.601,-2.114,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 16 18:39:51.13 UTC">
+                <name>M 5 - 2012 Jan 16, TONGA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-172.909,-19.289,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 17 10:00:22.03 UTC">
+                <name>M 5 - 2012 Jan 17, MINDANAO, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.972,6.516,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 18 11:35:50.50 UTC">
+                <name>M 5 - 2012 Jan 18, SAN JUAN, ARGENTINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-68.084,-31.767,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 19 06:28:19.09 UTC">
+                <name>M 5 - 2012 Jan 19, DOMINICAN REPUBLIC REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-68.755,18.058,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 19 23:35:34.39 UTC">
+                <name>M 5 - 2012 Jan 19, TONGA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-172.416,-17.898,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 21 03:19:50.71 UTC">
+                <name>M 5 - 2012 Jan 21, BALLENY ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>177.584,-65.042,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 21 12:03:32.14 UTC">
+                <name>M 5 - 2012 Jan 21, MARIANA ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>147.034,19.727,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 22 11:24:09.00 UTC">
+                <name>M 5 - 2012 Jan 22, ATACAMA, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-71.03,-28.682,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 23 17:22:07.00 UTC">
+                <name>M 5 - 2012 Jan 23, OFFSHORE BIO-BIO, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-73.486,-36.424,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 23 21:55:16.77 UTC">
+                <name>M 5 - 2012 Jan 23, OFFSHORE BIO-BIO, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-73.031,-36.338,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 25 14:37:02.66 UTC">
+                <name>M 5 - 2012 Jan 25, NEAR WEST COAST OF COLOMBIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-77.505,5.519,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 25 17:47:11.35 UTC">
+                <name>M 5 - 2012 Jan 25, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>153.487,-6.802,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 26 04:21:16.99 UTC">
+                <name>M 5 - 2012 Jan 26, KEPULAUAN BABAR, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>129.935,-7.1,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 27 01:08:31.13 UTC">
+                <name>M 5 - 2012 Jan 27, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.891,37.904,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 27 14:53:13.00 UTC">
+                <name>M 5 - 2012 Jan 27, NORTHERN ITALY</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>10.03,44.48,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 17:56:41.71 UTC">
+                <name>M 5 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.077,-29.52,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 18:09:26.24 UTC">
+                <name>M 5 - 2012 Jan 28, KERMADEC ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-176.893,-29.505,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 28 20:00:34.46 UTC">
+                <name>M 5 - 2012 Jan 28, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.036,-29.554,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 29 21:54:20.07 UTC">
+                <name>M 5 - 2012 Jan 29, NORTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-46.467,16.624,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jan 31 19:53:44.14 UTC">
+                <name>M 5 - 2012 Jan 31, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.843,-30.699,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 1 04:26:14.45 UTC">
+                <name>M 5 - 2012 Feb 1, SAMAR, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.615,11.61,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 02:48:07.11 UTC">
+                <name>M 5 - 2012 Feb 2, WEST OF MACQUARIE ISLAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>153.349,-60.843,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 09:16:17.24 UTC">
+                <name>M 5 - 2012 Feb 2, NEW IRELAND REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>153.638,-5.341,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 13:48:16.50 UTC">
+                <name>M 5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.248,-17.783,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 13:50:25.02 UTC">
+                <name>M 5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.126,-17.933,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 15:07:06.51 UTC">
+                <name>M 5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.413,-17.858,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 15:10:14.97 UTC">
+                <name>M 5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.108,-17.433,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 15:14:59.93 UTC">
+                <name>M 5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.198,-17.899,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 15:22:56.84 UTC">
+                <name>M 5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.648,-18.2,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 18:35:29.37 UTC">
+                <name>M 5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.327,-17.529,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 2 19:20:46.93 UTC">
+                <name>M 5 - 2012 Feb 2, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.791,-18.011,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 3 11:26:51.24 UTC">
+                <name>M 5 - 2012 Feb 3, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>149.939,-6.644,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 3 20:34:03.36 UTC">
+                <name>M 5 - 2012 Feb 3, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.83,-19.49,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 05:56:02.53 UTC">
+                <name>M 5 - 2012 Feb 4, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.869,37.343,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 4 20:10:12.94 UTC">
+                <name>M 5 - 2012 Feb 4, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.423,-18.026,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 5 06:10:39.75 UTC">
+                <name>M 5 - 2012 Feb 5, SOUTHERN IRAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>51.488,28.59,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 6 10:13:53.70 UTC">
+                <name>M 5 - 2012 Feb 6, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>123.356,10.019,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 7 04:05:35.02 UTC">
+                <name>M 5 - 2012 Feb 7, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>123.595,10.108,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 7 13:30:04.78 UTC">
+                <name>M 5 - 2012 Feb 7, HOKKAIDO, JAPAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.219,45.559,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 7 19:09:30.12 UTC">
+                <name>M 5 - 2012 Feb 7, BABUYAN ISL REGION, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>121.5,19.684,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 8 01:53:01.30 UTC">
+                <name>M 5 - 2012 Feb 8, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>123.183,9.839,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 9 05:18:48.51 UTC">
+                <name>M 5 - 2012 Feb 9, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.545,-15.325,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 11 05:39:07.85 UTC">
+                <name>M 5 - 2012 Feb 11, NEGROS- CEBU REG, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>123.264,10.071,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 12 09:28:16.35 UTC">
+                <name>M 5 - 2012 Feb 12, NEAR COAST OF SOUTHERN PERU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-74.157,-15.64,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 12 18:09:21.67 UTC">
+                <name>M 5 - 2012 Feb 12, ASCENSION ISLAND REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-13.051,-7.074,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 13 00:49:31.32 UTC">
+                <name>M 5 - 2012 Feb 13, MOZAMBIQUE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>40.891,-13.928,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 13 03:32:05.67 UTC">
+                <name>M 5 - 2012 Feb 13, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.233,-17.552,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 13 07:50:39.87 UTC">
+                <name>M 5 - 2012 Feb 13, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.703,-33.982,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 14 04:03:58.81 UTC">
+                <name>M 5 - 2012 Feb 14, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-25.357,0.599,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 14 18:07:56.36 UTC">
+                <name>M 5 - 2012 Feb 14, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.153,-18.038,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 15 06:28:37.50 UTC">
+                <name>M 5 - 2012 Feb 15, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.475,37.803,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 15 18:31:53.65 UTC">
+                <name>M 5 - 2012 Feb 15, NICOBAR ISLANDS, INDIA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.9,6.306,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 16 15:54:28.30 UTC">
+                <name>M 5 - 2012 Feb 16, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>152.193,-5.697,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 17 11:26:49.97 UTC">
+                <name>M 5 - 2012 Feb 17, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>166.829,-14.824,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 18 01:34:19.80 UTC">
+                <name>M 5 - 2012 Feb 18, OFFSHORE OAXACA, MEXICO</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-95.67,15.264,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 18 22:58:49.56 UTC">
+                <name>M 5 - 2012 Feb 18, MOLUCCA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.909,2.446,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 19 08:07:24.79 UTC">
+                <name>M 5 - 2012 Feb 19, NORTH ISLAND OF NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>174.124,-39.382,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 19 15:17:28.99 UTC">
+                <name>M 5 - 2012 Feb 19, CROZET ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>44.553,-41.015,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 19 23:33:08.23 UTC">
+                <name>M 5 - 2012 Feb 19, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.639,-17.861,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 20 13:59:23.79 UTC">
+                <name>M 5 - 2012 Feb 20, KASHMIR-XINJIANG BORDER REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>79.717,35.723,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 20 14:18:03.82 UTC">
+                <name>M 5 - 2012 Feb 20, KASHMIR-XINJIANG BORDER REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>79.835,35.84,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 20 20:59:08.81 UTC">
+                <name>M 5 - 2012 Feb 20, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>151.4,-4.792,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 22 20:44:42.83 UTC">
+                <name>M 5 - 2012 Feb 22, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-173.294,-17.463,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 23 04:05:34.16 UTC">
+                <name>M 5 - 2012 Feb 23, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.761,-20.57,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 24 02:02:44.06 UTC">
+                <name>M 5 - 2012 Feb 24, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.264,-15.206,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 24 05:42:30.71 UTC">
+                <name>M 5 - 2012 Feb 24, MINDANAO, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.955,9.958,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 24 14:13:02.42 UTC">
+                <name>M 5 - 2012 Feb 24, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>103.103,-4.695,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 09:23:09.69 UTC">
+                <name>M 5 - 2012 Feb 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.234,-24.739,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 12:12:23.46 UTC">
+                <name>M 5 - 2012 Feb 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.459,-24.796,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 26 16:27:14.79 UTC">
+                <name>M 5 - 2012 Feb 26, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.48,-18.036,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 00:33:49.07 UTC">
+                <name>M 5 - 2012 Feb 27, BOUGAINVILLE REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>154.871,-6.535,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 03:01:50.40 UTC">
+                <name>M 5 - 2012 Feb 27, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.122,-24.734,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 03:43:05.03 UTC">
+                <name>M 5 - 2012 Feb 27, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>155.843,49.272,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 27 16:29:25.42 UTC">
+                <name>M 5 - 2012 Feb 27, RYUKYU ISLANDS, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>127.182,25.511,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 28 05:20:48.52 UTC">
+                <name>M 5 - 2012 Feb 28, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.023,36.373,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 28 15:24:21.10 UTC">
+                <name>M 5 - 2012 Feb 28, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>156.127,49.115,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 28 18:46:23.74 UTC">
+                <name>M 5 - 2012 Feb 28, TONGA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-175.419,-22.084,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 29 01:22:52.65 UTC">
+                <name>M 5 - 2012 Feb 29, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>156.2,49.282,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Feb 29 21:59:37.94 UTC">
+                <name>M 5 - 2012 Feb 29, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.399,-17.794,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 1 00:16:01.06 UTC">
+                <name>M 5 - 2012 Mar 1, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>144.154,37.21,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 2 05:13:32.16 UTC">
+                <name>M 5 - 2012 Mar 2, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>146.483,-7.956,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 2 12:25:30.77 UTC">
+                <name>M 5 - 2012 Mar 2, BALLENY ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>176.623,-64.822,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 2 13:40:12.36 UTC">
+                <name>M 5 - 2012 Mar 2, SOUTHERN XINJIANG, CHINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>74.38,39.75,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 2 17:52:31.87 UTC">
+                <name>M 5 - 2012 Mar 2, HALMAHERA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>127.077,1.809,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 3 17:29:52.95 UTC">
+                <name>M 5 - 2012 Mar 3, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>170.341,-22.089,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 3 17:53:49.46 UTC">
+                <name>M 5 - 2012 Mar 3, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.066,-23.934,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 3 22:12:55.00 UTC">
+                <name>M 5 - 2012 Mar 3, OFFSHORE MAULE, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-72.8,-35.749,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 4 16:27:21.04 UTC">
+                <name>M 5 - 2012 Mar 4, ANTOFAGASTA, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-69.848,-21.554,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 5 06:24:26.84 UTC">
+                <name>M 5 - 2012 Mar 5, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.389,40.167,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 6 02:59:25.97 UTC">
+                <name>M 5 - 2012 Mar 6, NICOBAR ISLANDS, INDIA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>93.873,8.559,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 9 18:18:59.28 UTC">
+                <name>M 5 - 2012 Mar 9, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.033,35.642,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 11 11:10:52.57 UTC">
+                <name>M 5 - 2012 Mar 11, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-176.949,-24.921,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 11 22:02:40.90 UTC">
+                <name>M 5 - 2012 Mar 11, VOLCANO ISLANDS, JAPAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.579,23.718,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 13 02:39:55.67 UTC">
+                <name>M 5 - 2012 Mar 13, COMOROS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>43.286,-10.923,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 13 18:23:41.99 UTC">
+                <name>M 5 - 2012 Mar 13, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>179.981,-23.734,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 14 17:41:10.14 UTC">
+                <name>M 5 - 2012 Mar 14, ANDAMAN ISLANDS, INDIA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>93.854,10.535,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 16 17:18:33.03 UTC">
+                <name>M 5 - 2012 Mar 16, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>171.119,-22.507,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 19 02:30:21.86 UTC">
+                <name>M 5 - 2012 Mar 19, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>152.963,-4.585,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 20 15:05:58.60 UTC">
+                <name>M 5 - 2012 Mar 20, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>169.33,-19.684,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 20 22:25:40.07 UTC">
+                <name>M 5 - 2012 Mar 20, OFFSHORE GUERRERO, MEXICO</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-98.694,16.273,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 21 11:36:14.80 UTC">
+                <name>M 5 - 2012 Mar 21, GUERRERO, MEXICO</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-98.504,16.511,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 22 12:59:28.88 UTC">
+                <name>M 5 - 2012 Mar 22, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.526,-15.188,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 22 14:35:17.28 UTC">
+                <name>M 5 - 2012 Mar 22, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.449,-21.355,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 23 14:35:31.87 UTC">
+                <name>M 5 - 2012 Mar 23, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.263,-16.261,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 24 07:28:33.00 UTC">
+                <name>M 5 - 2012 Mar 24, VALPARAISO, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-71.063,-33.052,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 25 20:45:45.70 UTC">
+                <name>M 5 - 2012 Mar 25, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>168.75,-19.108,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 26 10:35:32.64 UTC">
+                <name>M 5 - 2012 Mar 26, EASTERN TURKEY</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>42.33,39.171,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 26 17:58:25.76 UTC">
+                <name>M 5 - 2012 Mar 26, NORTHERN EAST PACIFIC RISE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-104.337,10.001,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 27 23:40:12.60 UTC">
+                <name>M 5 - 2012 Mar 27, NEPAL-INDIA BORDER REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>87.777,26.087,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 30 06:19:33.17 UTC">
+                <name>M 5 - 2012 Mar 30, SOUTHEAST OF EASTER ISLAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-101.463,-35.843,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Mar 30 09:38:59.79 UTC">
+                <name>M 5 - 2012 Mar 30, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.97,-21.177,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 2 19:54:33.61 UTC">
+                <name>M 5 - 2012 Apr 2, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.813,37.937,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 2 23:55:00.12 UTC">
+                <name>M 5 - 2012 Apr 2, OFFSHORE GUERRERO, MEXICO</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-98.572,16.281,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 3 02:11:03.00 UTC">
+                <name>M 5 - 2012 Apr 3, OFFSHORE O'HIGGINS, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-72.757,-33.847,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 3 11:26:59.61 UTC">
+                <name>M 5 - 2012 Apr 3, KEPULAUAN BARAT DAYA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.367,-7.035,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 6 08:50:57.01 UTC">
+                <name>M 5 - 2012 Apr 6, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.414,-21.281,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 7 20:37:51.16 UTC">
+                <name>M 5 - 2012 Apr 7, CENTRAL MID-ATLANTIC RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-28.091,1.053,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 07:41:46.76 UTC">
+                <name>M 5 - 2012 Apr 11, BANDA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>130.261,-6.236,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 09:06:22.58 UTC">
+                <name>M 5 - 2012 Apr 11, NORTH INDIAN OCEAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>91.923,0.916,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 10:10:04.03 UTC">
+                <name>M 5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.726,2.668,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 13:15:30.07 UTC">
+                <name>M 5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>90.78,4.601,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 14:18:44.23 UTC">
+                <name>M 5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.287,2.539,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 11 15:06:39.81 UTC">
+                <name>M 5 - 2012 Apr 11, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.311,1.269,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 02:46:49.00 UTC">
+                <name>M 5 - 2012 Apr 12, NORTH INDIAN OCEAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>91.754,1.301,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 02:54:43.90 UTC">
+                <name>M 5 - 2012 Apr 12, NORTH INDIAN OCEAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>91.717,1.172,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 07:01:44.00 UTC">
+                <name>M 5 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>93.9,1.983,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 12 14:46:25.66 UTC">
+                <name>M 5 - 2012 Apr 12, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>93.746,3.279,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 13 04:15:10.45 UTC">
+                <name>M 5 - 2012 Apr 13, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>168.086,-18.25,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 13 05:31:45.70 UTC">
+                <name>M 5 - 2012 Apr 13, NORTH INDIAN OCEAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>89.705,2.653,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 13 13:06:28.40 UTC">
+                <name>M 5 - 2012 Apr 13, OFFSHORE OAXACA, MEXICO</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-98.145,16.207,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 14 21:10:34.64 UTC">
+                <name>M 5 - 2012 Apr 14, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>94.079,2.835,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 14 23:49:24.84 UTC">
+                <name>M 5 - 2012 Apr 14, WEST CHILE RISE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-97.183,-36.3,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 16 18:36:15.36 UTC">
+                <name>M 5 - 2012 Apr 16, NORTH ISLAND OF NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>175.805,-38.556,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 16 23:53:29.81 UTC">
+                <name>M 5 - 2012 Apr 16, MID-INDIAN RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>78.876,-36.534,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 17 19:45:36.76 UTC">
+                <name>M 5 - 2012 Apr 17, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.61,2.584,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 18 01:18:37.95 UTC">
+                <name>M 5 - 2012 Apr 18, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.052,-13.288,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 18 01:43:59.23 UTC">
+                <name>M 5 - 2012 Apr 18, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.541,3.329,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 18 19:07:58.02 UTC">
+                <name>M 5 - 2012 Apr 18, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.766,3.586,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 19 01:58:08.60 UTC">
+                <name>M 5 - 2012 Apr 19, TAIWAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>121.67,24.13,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 19 15:46:50.72 UTC">
+                <name>M 5 - 2012 Apr 19, NEAR N COAST OF PAPUA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>134.492,-1.677,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 03:05:41.78 UTC">
+                <name>M 5 - 2012 Apr 20, IRAN-IRAQ BORDER REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>46.99,32.453,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 07:51:23.75 UTC">
+                <name>M 5 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>91.901,2.564,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 10:17:11.94 UTC">
+                <name>M 5 - 2012 Apr 20, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.334,2.025,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 20:18:34.76 UTC">
+                <name>M 5 - 2012 Apr 20, VOLCANO ISLANDS, JAPAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.688,25.447,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 20 20:44:57.06 UTC">
+                <name>M 5 - 2012 Apr 20, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-173.594,-17.617,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 21 05:25:08.41 UTC">
+                <name>M 5 - 2012 Apr 21, IRAN-IRAQ BORDER REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>47.049,32.407,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 23 02:57:50.79 UTC">
+                <name>M 5 - 2012 Apr 23, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-27.674,-55.517,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 23 03:08:03.90 UTC">
+                <name>M 5 - 2012 Apr 23, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-175.17,-17.966,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 23 10:57:19.65 UTC">
+                <name>M 5 - 2012 Apr 23, SOUTH OF TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-175.934,-24.007,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 24 14:05:26.56 UTC">
+                <name>M 5 - 2012 Apr 24, TONGA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-175.999,-23.785,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 25 20:17:55.08 UTC">
+                <name>M 5 - 2012 Apr 25, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>151.694,-4.114,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 26 06:38:32.26 UTC">
+                <name>M 5 - 2012 Apr 26, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.879,-18.802,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 28 19:06:48.09 UTC">
+                <name>M 5 - 2012 Apr 28, SOUTHWEST INDIAN RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>43.501,-40.999,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 30 16:56:42.11 UTC">
+                <name>M 5 - 2012 Apr 30, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>105.422,-8.354,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 30 19:12:50.00 UTC">
+                <name>M 5 - 2012 Apr 30, KEPULAUAN TALAUD, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>127.507,3.712,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 30 20:17:43.43 UTC">
+                <name>M 5 - 2012 Apr 30, KERMADEC ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-176.231,-30.038,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Apr 30 21:40:38.51 UTC">
+                <name>M 5 - 2012 Apr 30, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.962,3.314,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 2 13:48:12.60 UTC">
+                <name>M 5 - 2012 May 2, NORTHERN MID-ATLANTIC RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-44.95,23.352,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 2 20:04:20.28 UTC">
+                <name>M 5 - 2012 May 2, TONGA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-175.668,-23.551,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 3 21:20:36.39 UTC">
+                <name>M 5 - 2012 May 3, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>150.557,46.903,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 4 10:55:37.02 UTC">
+                <name>M 5 - 2012 May 4, VANCOUVER ISLAND, CANADA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-130.241,50.648,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 7 06:46:56.29 UTC">
+                <name>M 5 - 2012 May 7, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-173.659,-15.169,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 8 09:16:34.93 UTC">
+                <name>M 5 - 2012 May 8, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>144.644,37.364,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 11 10:18:10.01 UTC">
+                <name>M 5 - 2012 May 11, GANSU-QINGHAI BORDER REG, CHINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>102.048,37.735,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 14 02:45:21.58 UTC">
+                <name>M 5 - 2012 May 14, ANDREANOF ISLANDS, ALEUTIAN IS.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.832,51.445,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 14 19:28:47.04 UTC">
+                <name>M 5 - 2012 May 14, MOLUCCA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.338,1.29,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 17 19:49:32.79 UTC">
+                <name>M 5 - 2012 May 17, SANTA CRUZ ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>166.185,-12.596,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 18 21:23:28.13 UTC">
+                <name>M 5 - 2012 May 18, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.178,39.646,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 19 20:06:02.11 UTC">
+                <name>M 5 - 2012 May 19, NORTH OF HALMAHERA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>128.118,3.304,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 19 22:23:23.12 UTC">
+                <name>M 5 - 2012 May 19, FOX ISLANDS, ALEUTIAN ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-171.728,52.068,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 08:41:44.90 UTC">
+                <name>M 5 - 2012 May 20, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.116,39.543,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 20 13:18:02.00 UTC">
+                <name>M 5 - 2012 May 20, NORTHERN ITALY</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>11.49,44.831,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 24 18:19:40.39 UTC">
+                <name>M 5 - 2012 May 24, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>147.114,-7.33,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 25 00:25:55.93 UTC">
+                <name>M 5 - 2012 May 25, NORWEGIAN SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>5.518,72.939,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 25 02:44:50.47 UTC">
+                <name>M 5 - 2012 May 25, SOUTH ISLAND OF NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>172.81,-43.473,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 25 18:10:43.49 UTC">
+                <name>M 5 - 2012 May 25, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.46,-33.075,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 25 18:20:07.60 UTC">
+                <name>M 5 - 2012 May 25, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-173.763,-19.184,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 26 17:18:01.87 UTC">
+                <name>M 5 - 2012 May 26, SOUTHERN SUMATRA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>103.03,-4.9,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 26 17:54:18.47 UTC">
+                <name>M 5 - 2012 May 26, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.991,-30.825,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 29 20:08:15.07 UTC">
+                <name>M 5 - 2012 May 29, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>173.796,-15.524,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 30 06:57:05.99 UTC">
+                <name>M 5 - 2012 May 30, BANDA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>130.318,-6.199,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 30 13:56:14.70 UTC">
+                <name>M 5 - 2012 May 30, STATE OF YAP, MICRONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>139.559,11.271,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 May 31 17:29:57.50 UTC">
+                <name>M 5 - 2012 May 31, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.314,-17.683,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 3 11:39:23.91 UTC">
+                <name>M 5 - 2012 Jun 3, POTOSI, BOLIVIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-68.026,-21.338,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 4 00:15:41.27 UTC">
+                <name>M 5 - 2012 Jun 4, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>169.134,-21.941,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 4 16:40:03.22 UTC">
+                <name>M 5 - 2012 Jun 4, HALMAHERA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>127.699,-0.677,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 6 04:17:31.75 UTC">
+                <name>M 5 - 2012 Jun 6, MOLUCCA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.905,-0.953,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 6 16:11:14.54 UTC">
+                <name>M 5 - 2012 Jun 6, KERMADEC ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.441,-27.034,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 7 00:02:27.98 UTC">
+                <name>M 5 - 2012 Jun 7, TONGA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.717,-22.91,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 7 18:39:45.65 UTC">
+                <name>M 5 - 2012 Jun 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.295,39.875,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 7 19:25:25.00 UTC">
+                <name>M 5 - 2012 Jun 7, MAULE, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-71.075,-36.036,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 8 16:15:14.80 UTC">
+                <name>M 5 - 2012 Jun 8, SOUTHERN IRAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>50.705,29.784,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 9 12:02:46.37 UTC">
+                <name>M 5 - 2012 Jun 9, OFF EAST COAST OF KAMCHATKA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>159.206,51.698,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 9 20:25:26.71 UTC">
+                <name>M 5 - 2012 Jun 9, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-23.239,-60.883,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 10 13:32:55.67 UTC">
+                <name>M 5 - 2012 Jun 10, PAGAN REG., N. MARIANA ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>145.616,18.689,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 14 15:07:53.86 UTC">
+                <name>M 5 - 2012 Jun 14, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.161,-17.111,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 17 09:01:52.45 UTC">
+                <name>M 5 - 2012 Jun 17, TAIWAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>121.574,23.647,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 18 00:02:40.65 UTC">
+                <name>M 5 - 2012 Jun 18, AZORES ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-29.151,41.84,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 18 20:14:55.38 UTC">
+                <name>M 5 - 2012 Jun 18, NORTH OF FRANZ JOSEF LAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>41.025,86.386,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 19 04:37:34.90 UTC">
+                <name>M 5 - 2012 Jun 19, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.624,-20.552,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 19 20:14:05.72 UTC">
+                <name>M 5 - 2012 Jun 19, GUJARAT, INDIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>70.252,23.647,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 21 11:40:34.81 UTC">
+                <name>M 5 - 2012 Jun 21, HALMAHERA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>128.278,2.7,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 22 07:58:43.42 UTC">
+                <name>M 5 - 2012 Jun 22, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.492,39.369,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 23 07:43:45.27 UTC">
+                <name>M 5 - 2012 Jun 23, ANDREANOF ISLANDS, ALEUTIAN IS.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.666,51.242,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 25 03:09:04.31 UTC">
+                <name>M 5 - 2012 Jun 25, KERMADEC ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.878,-27.424,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 25 13:05:28.00 UTC">
+                <name>M 5 - 2012 Jun 25, DODECANESE ISLANDS, GREECE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>28.941,36.439,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 26 12:32:35.16 UTC">
+                <name>M 5 - 2012 Jun 26, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-176.697,-21.926,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 27 20:48:54.69 UTC">
+                <name>M 5 - 2012 Jun 27, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-173.408,-15.132,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jun 29 17:47:25.48 UTC">
+                <name>M 5 - 2012 Jun 29, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>152.342,-4.937,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 1 02:49:46.00 UTC">
+                <name>M 5 - 2012 Jul 1, CENTRAL IRAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>51.02,31.841,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 4 21:29:26.15 UTC">
+                <name>M 5 - 2012 Jul 4, ST. MARTIN REGION, LEEWARD ISL.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-62.983,18.12,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 5 09:46:21.39 UTC">
+                <name>M 5 - 2012 Jul 5, IZU ISLANDS, JAPAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.64,32.284,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 6 06:16:47.00 UTC">
+                <name>M 5 - 2012 Jul 6, ISLA CHILOE, LOS LAGOS, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-74.015,-42.646,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 7 14:26:03.85 UTC">
+                <name>M 5 - 2012 Jul 7, KEP. MENTAWAI REGION, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>100.591,-3.638,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 7 20:32:26.83 UTC">
+                <name>M 5 - 2012 Jul 7, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-150.669,-59.52,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 7 22:49:20.08 UTC">
+                <name>M 5 - 2012 Jul 7, MAURITIUS - REUNION REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>66.882,-17.083,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 9 10:39:00.85 UTC">
+                <name>M 5 - 2012 Jul 9, ALAMAGAN REG, N. MARIANA ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>146.017,17.141,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 11 01:11:37.82 UTC">
+                <name>M 5 - 2012 Jul 11, CERAM SEA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>127.378,-2.02,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 13 22:37:25.98 UTC">
+                <name>M 5 - 2012 Jul 13, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>151.829,45.255,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 14 17:36:22.58 UTC">
+                <name>M 5 - 2012 Jul 14, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>151.878,45.378,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 15 20:05:06.03 UTC">
+                <name>M 5 - 2012 Jul 15, CENTRAL PERU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-73.796,-13.58,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 17 19:26:30.99 UTC">
+                <name>M 5 - 2012 Jul 17, KERMADEC ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-179.093,-31.283,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 20 20:24:20.47 UTC">
+                <name>M 5 - 2012 Jul 20, KEPULAUAN SANGIHE, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.808,3.395,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 21 20:47:46.64 UTC">
+                <name>M 5 - 2012 Jul 21, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-173.39,-15.197,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 22 09:26:02.99 UTC">
+                <name>M 5 - 2012 Jul 22, CENTRAL TURKEY</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>36.384,37.546,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 22 18:02:12.08 UTC">
+                <name>M 5 - 2012 Jul 22, NEAR COAST OF NICARAGUA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-87.028,11.639,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 23 06:54:31.15 UTC">
+                <name>M 5 - 2012 Jul 23, NEAR ISLANDS, ALEUTIAN ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>172.869,52.016,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 23 19:47:14.11 UTC">
+                <name>M 5 - 2012 Jul 23, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.465,-30.83,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 24 10:28:06.13 UTC">
+                <name>M 5 - 2012 Jul 24, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>151.631,45.464,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 24 19:06:26.09 UTC">
+                <name>M 5 - 2012 Jul 24, OFF E. COAST OF N. ISLAND, N.Z.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>179.91,-37.776,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 25 17:20:11.14 UTC">
+                <name>M 5 - 2012 Jul 25, KYUSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>130.348,30.981,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 25 19:01:36.42 UTC">
+                <name>M 5 - 2012 Jul 25, VANUATU REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.728,-19.297,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 25 21:43:28.95 UTC">
+                <name>M 5 - 2012 Jul 25, SOLOMON ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>159.699,-9.725,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Jul 28 11:23:43.82 UTC">
+                <name>M 5 - 2012 Jul 28, NORTH OF SVALBARD</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-3.97,81.294,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 1 09:52:22.37 UTC">
+                <name>M 5 - 2012 Aug 1, SOUTHERN XINJIANG, CHINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>75.556,39.774,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 2 14:32:08.26 UTC">
+                <name>M 5 - 2012 Aug 2, SOUTH SHETLAND ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-58.258,-61.401,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 4 19:05:39.16 UTC">
+                <name>M 5 - 2012 Aug 4, SAN JUAN, ARGENTINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-69.358,-31.928,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 5 14:10:30.33 UTC">
+                <name>M 5 - 2012 Aug 5, EASTERN XIZANG</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>94.849,30.352,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 5 20:37:23.80 UTC">
+                <name>M 5 - 2012 Aug 5, TURKEY-SYRIA-IRAQ BORDER REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>42.965,37.421,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 6 04:43:25.81 UTC">
+                <name>M 5 - 2012 Aug 6, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>170.39,-21.406,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 6 05:30:19.51 UTC">
+                <name>M 5 - 2012 Aug 6, RYUKYU ISLANDS, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>130.521,29.495,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 6 11:49:13.92 UTC">
+                <name>M 5 - 2012 Aug 6, SOUTHWEST OF AFRICA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>13.628,-52.29,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 10 09:01:20.91 UTC">
+                <name>M 5 - 2012 Aug 10, NEAR COAST OF NICARAGUA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-88.17,12.075,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 11 12:30:12.00 UTC">
+                <name>M 5 - 2012 Aug 11, NORTHWESTERN IRAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>46.78,38.44,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 11 15:43:19.20 UTC">
+                <name>M 5 - 2012 Aug 11, NORTHWESTERN IRAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>46.735,38.436,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 16 06:35:38.82 UTC">
+                <name>M 5 - 2012 Aug 16, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.856,-18.46,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 17 08:47:36.72 UTC">
+                <name>M 5 - 2012 Aug 17, BOUGAINVILLE REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>154.53,-6.747,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 17 16:09:28.27 UTC">
+                <name>M 5 - 2012 Aug 17, BOUGAINVILLE REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>154.525,-6.792,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 20 11:18:28.43 UTC">
+                <name>M 5 - 2012 Aug 20, OFF W COAST OF NORTHERN SUMATRA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.889,3.318,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 22 01:33:05.97 UTC">
+                <name>M 5 - 2012 Aug 22, HOKKAIDO, JAPAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.86,42.404,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 23 16:30:21.79 UTC">
+                <name>M 5 - 2012 Aug 23, NEPAL</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>82.69,28.47,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 26 23:06:14.30 UTC">
+                <name>M 5 - 2012 Aug 26, HALMAHERA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>128.801,2.626,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 00:39:55.00 UTC">
+                <name>M 5 - 2012 Aug 27, ANTOFAGASTA, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-69.414,-23.739,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 27 03:47:19.02 UTC">
+                <name>M 5 - 2012 Aug 27, MOLUCCA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.835,2.154,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 29 19:35:54.24 UTC">
+                <name>M 5 - 2012 Aug 29, VIRGIN ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-64.324,19.652,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 30 08:04:39.97 UTC">
+                <name>M 5 - 2012 Aug 30, OFFSHORE BIO-BIO, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-73.397,-37.199,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 17:00:35.87 UTC">
+                <name>M 5 - 2012 Aug 31, SOUTH SANDWICH ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-27.525,-55.789,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Aug 31 18:37:45.03 UTC">
+                <name>M 5 - 2012 Aug 31, GALAPAGOS ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-95.26,2.526,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 08:08:11.15 UTC">
+                <name>M 5 - 2012 Sep 1, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.845,10.351,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 08:13:16.36 UTC">
+                <name>M 5 - 2012 Sep 1, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.881,10.356,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 10:38:39.16 UTC">
+                <name>M 5 - 2012 Sep 1, OFFSHORE ATACAMA, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-71.114,-27.24,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 1 20:41:37.32 UTC">
+                <name>M 5 - 2012 Sep 1, NEW GUINEA, PAPUA NEW GUINEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.643,-6.531,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 3 08:49:22.83 UTC">
+                <name>M 5 - 2012 Sep 3, MORO GULF, MINDANAO, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>123.861,6.561,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 3 10:00:36.54 UTC">
+                <name>M 5 - 2012 Sep 3, ANDREANOF ISLANDS, ALEUTIAN IS.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.052,51.224,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 02:11:31.73 UTC">
+                <name>M 5 - 2012 Sep 4, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-175.067,-21.956,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 02:12:52.87 UTC">
+                <name>M 5 - 2012 Sep 4, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-179.958,-22.003,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 04:27:13.02 UTC">
+                <name>M 5 - 2012 Sep 4, SOUTH OF JAVA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>113.962,-10.839,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 06:45:10.28 UTC">
+                <name>M 5 - 2012 Sep 4, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.772,10.666,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 4 20:00:17.53 UTC">
+                <name>M 5 - 2012 Sep 4, TAIWAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>121.135,22.174,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 6 03:43:40.09 UTC">
+                <name>M 5 - 2012 Sep 6, SOUTHERN IRAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>53.97,26.96,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 6 19:04:25.79 UTC">
+                <name>M 5 - 2012 Sep 6, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.613,10.946,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 7 02:36:59.87 UTC">
+                <name>M 5 - 2012 Sep 7, ANTOFAGASTA, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-68.191,-22.351,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 7 17:44:38.99 UTC">
+                <name>M 5 - 2012 Sep 7, PHILIPPINE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.73,10.55,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 7 18:43:59.64 UTC">
+                <name>M 5 - 2012 Sep 7, MARIANA ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.322,21.606,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 8 07:39:58.47 UTC">
+                <name>M 5 - 2012 Sep 8, SOUTH OF KERMADEC ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.875,-33.129,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 9 00:13:50.13 UTC">
+                <name>M 5 - 2012 Sep 9, KERMADEC ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-176.539,-28.091,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 9 14:36:36.64 UTC">
+                <name>M 5 - 2012 Sep 9, KERMADEC ISLANDS, NEW ZEALAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.935,-30.404,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 11 03:21:21.22 UTC">
+                <name>M 5 - 2012 Sep 11, YUNNAN, CHINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>99.267,24.647,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 11 20:52:05.29 UTC">
+                <name>M 5 - 2012 Sep 11, SOUTH OF MARIANA ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.353,11.828,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 12 02:57:26.55 UTC">
+                <name>M 5 - 2012 Sep 12, SOUTHWEST INDIAN RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>46.07,-39.962,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 14 03:21:45.40 UTC">
+                <name>M 5 - 2012 Sep 14, NORTHERN XINJIANG, CHINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>82.425,43.637,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 16 13:02:53.83 UTC">
+                <name>M 5 - 2012 Sep 16, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.657,-18.447,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 17 19:09:33.68 UTC">
+                <name>M 5 - 2012 Sep 17, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.052,39.832,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 17 21:15:46.09 UTC">
+                <name>M 5 - 2012 Sep 17, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.397,-14.867,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 18 08:05:40.08 UTC">
+                <name>M 5 - 2012 Sep 18, KEPULAUAN TALAUD, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.438,4.488,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 20 03:32:35.38 UTC">
+                <name>M 5 - 2012 Sep 20, LOYALTY ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>168.242,-20.296,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 20 15:52:35.30 UTC">
+                <name>M 5 - 2012 Sep 20, MOLUCCA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.872,2.185,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 21 08:47:40.09 UTC">
+                <name>M 5 - 2012 Sep 21, CENTRAL MEDITERRANEAN SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>22.63,35.3,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 21 11:59:37.81 UTC">
+                <name>M 5 - 2012 Sep 21, SOLOMON ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>158.013,-9.069,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 22 03:52:26.10 UTC">
+                <name>M 5 - 2012 Sep 22, GREECE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>22.77,38.1,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 25 14:21:39.28 UTC">
+                <name>M 5 - 2012 Sep 25, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.319,36.114,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 26 06:45:17.97 UTC">
+                <name>M 5 - 2012 Sep 26, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-175.399,-18.853,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 26 17:15:52.92 UTC">
+                <name>M 5 - 2012 Sep 26, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.416,-26.04,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Sep 29 14:12:01.54 UTC">
+                <name>M 5 - 2012 Sep 29, MINDORO, PHILIPPINES</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>120.723,13.847,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 1 17:24:40.58 UTC">
+                <name>M 5 - 2012 Oct 1, SOUTH OF FIJI ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-179.427,-24.745,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 2 03:33:34.20 UTC">
+                <name>M 5 - 2012 Oct 2, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.903,-18.839,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 2 18:39:08.88 UTC">
+                <name>M 5 - 2012 Oct 2, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.157,-20.728,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 3 21:02:38.50 UTC">
+                <name>M 5 - 2012 Oct 3, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>151.197,-5.727,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 5 08:13:20.04 UTC">
+                <name>M 5 - 2012 Oct 5, NORTHEAST OF TAIWAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.078,26.271,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 5 18:08:19.93 UTC">
+                <name>M 5 - 2012 Oct 5, BANDA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>129.547,-6.661,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 8 12:00:48.06 UTC">
+                <name>M 5 - 2012 Oct 8, BANDA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>129.191,-4.478,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 8 22:26:05.96 UTC">
+                <name>M 5 - 2012 Oct 8, BANDA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>129.292,-4.511,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 12 19:24:16.64 UTC">
+                <name>M 5 - 2012 Oct 12, COSTA RICA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-84.268,9.598,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 14 14:16:53.32 UTC">
+                <name>M 5 - 2012 Oct 14, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>154.453,48.38,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 15 21:04:20.60 UTC">
+                <name>M 5 - 2012 Oct 15, OFFSHORE COQUIMBO, CHILE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-71.787,-31.814,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 15 23:43:46.58 UTC">
+                <name>M 5 - 2012 Oct 15, HINDU KUSH REGION, AFGHANISTAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>69.683,35.949,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 17 14:49:57.67 UTC">
+                <name>M 5 - 2012 Oct 17, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-173.573,-15.036,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 17 19:38:55.81 UTC">
+                <name>M 5 - 2012 Oct 17, NIAS REGION, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>97.229,1.265,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 18 02:33:27.97 UTC">
+                <name>M 5 - 2012 Oct 18, MADHYA PRADESH, INDIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>81.314,23.769,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 25 10:09:45.00 UTC">
+                <name>M 5 - 2012 Oct 25, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>124.55,0.69,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 25 10:31:19.18 UTC">
+                <name>M 5 - 2012 Oct 25, TAIWAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>120.558,22.417,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 25 18:57:06.16 UTC">
+                <name>M 5 - 2012 Oct 25, PAPUA, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>140.348,-3.907,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 27 20:14:57.47 UTC">
+                <name>M 5 - 2012 Oct 27, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>169.829,-21.494,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 03:08:52.41 UTC">
+                <name>M 5 - 2012 Oct 28, ANDAMAN ISLANDS, INDIA REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>92.575,10.345,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 06:16:52.14 UTC">
+                <name>M 5 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-131.36,52.335,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 28 07:25:21.51 UTC">
+                <name>M 5 - 2012 Oct 28, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-131.561,52.319,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 29 06:13:28.69 UTC">
+                <name>M 5 - 2012 Oct 29, FLORES REGION, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>123.571,-8.284,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 29 06:34:47.51 UTC">
+                <name>M 5 - 2012 Oct 29, FLORES REGION, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>123.561,-8.041,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 29 11:07:15.00 UTC">
+                <name>M 5 - 2012 Oct 29, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-131.182,51.952,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Oct 30 02:55:08.00 UTC">
+                <name>M 5 - 2012 Oct 30, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-132.117,52.222,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 1 03:16:01.50 UTC">
+                <name>M 5 - 2012 Nov 1, QUEEN CHARLOTTE ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-132.024,52.55,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 1 03:31:24.98 UTC">
+                <name>M 5 - 2012 Nov 1, BANDA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>129.137,-5.612,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 1 09:48:04.20 UTC">
+                <name>M 5 - 2012 Nov 1, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.638,-20.284,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 1 13:26:12.27 UTC">
+                <name>M 5 - 2012 Nov 1, EASTERN NEW GUINEA REG., P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>145.559,-5.28,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 4 12:13:03.58 UTC">
+                <name>M 5 - 2012 Nov 4, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>171.388,-22.265,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 6 01:38:20.12 UTC">
+                <name>M 5 - 2012 Nov 6, MINAHASA, SULAWESI, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>122.088,1.281,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 9 16:18:41.87 UTC">
+                <name>M 5 - 2012 Nov 9, SOLOMON ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>161.13,-10.121,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 10 09:06:51.27 UTC">
+                <name>M 5 - 2012 Nov 10, FLORES REGION, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>120.676,-8.887,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 11 23:21:13.51 UTC">
+                <name>M 5 - 2012 Nov 11, OFFSHORE GUATEMALA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-92.299,13.897,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 12 11:15:09.26 UTC">
+                <name>M 5 - 2012 Nov 12, IZU ISLANDS, JAPAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>137.994,29.691,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 13 18:28:12.81 UTC">
+                <name>M 5 - 2012 Nov 13, MYANMAR</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>95.943,22.895,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 15 06:42:34.80 UTC">
+                <name>M 5 - 2012 Nov 15, OFFSHORE CHIAPAS, MEXICO</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-92.727,13.843,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 15 16:08:17.83 UTC">
+                <name>M 5 - 2012 Nov 15, SOUTH OF MARIANA ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.554,11.668,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 19 17:10:12.31 UTC">
+                <name>M 5 - 2012 Nov 19, PACIFIC-ANTARCTIC RIDGE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-147.523,-57.349,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 21 17:42:36.66 UTC">
+                <name>M 5 - 2012 Nov 21, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.648,38.479,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 22 09:09:32.31 UTC">
+                <name>M 5 - 2012 Nov 22, BALI REGION, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>115.124,-8.918,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 22 22:44:31.93 UTC">
+                <name>M 5 - 2012 Nov 22, SOUTHEAST OF LOYALTY ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>173.923,-22.354,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 23 00:40:21.23 UTC">
+                <name>M 5 - 2012 Nov 23, MOLUCCA SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.824,1.619,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 23 20:50:46.81 UTC">
+                <name>M 5 - 2012 Nov 23, SOLOMON ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>162.74,-10.789,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 26 05:33:48.80 UTC">
+                <name>M 5 - 2012 Nov 26, SOUTHERN XINJIANG, CHINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>90.355,40.411,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 26 17:35:41.80 UTC">
+                <name>M 5 - 2012 Nov 26, DODECANESE ISLANDS, GREECE</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>27.993,36.655,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 28 23:15:29.84 UTC">
+                <name>M 5 - 2012 Nov 28, NORTHERN ALGERIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>5.312,36.941,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 29 00:09:39.00 UTC">
+                <name>M 5 - 2012 Nov 29, MENDOZA, ARGENTINA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-69.106,-32.91,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 29 12:41:35.78 UTC">
+                <name>M 5 - 2012 Nov 29, NORTHEAST OF TAIWAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>125.191,26.112,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Nov 29 23:22:36.46 UTC">
+                <name>M 5 - 2012 Nov 29, NEAR ISLANDS, ALEUTIAN ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>172.416,52.635,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 1 20:10:14.85 UTC">
+                <name>M 5 - 2012 Dec 1, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.38,-20.688,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 2 17:45:37.18 UTC">
+                <name>M 5 - 2012 Dec 2, TAIWAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>121.631,23.91,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 2 23:45:14.20 UTC">
+                <name>M 5 - 2012 Dec 2, KURIL ISLANDS</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>151.47,45.701,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 5 13:48:42.22 UTC">
+                <name>M 5 - 2012 Dec 5, SAMOA ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-173.266,-14.936,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 5 23:41:54.11 UTC">
+                <name>M 5 - 2012 Dec 5, KERMADEC ISLANDS REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-177.523,-31.103,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 02:25:46.47 UTC">
+                <name>M 5 - 2012 Dec 7, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>151.429,-5.293,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 12:58:07.15 UTC">
+                <name>M 5 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.627,37.835,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 7 15:15:31.56 UTC">
+                <name>M 5 - 2012 Dec 7, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.781,37.869,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 8 10:27:30.38 UTC">
+                <name>M 5 - 2012 Dec 8, NEAR S COAST OF NEW GUINEA, PNG.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>144.044,-7.167,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 8 19:00:07.41 UTC">
+                <name>M 5 - 2012 Dec 8, NEAR S COAST OF NEW GUINEA, PNG.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>144.041,-7.258,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 9 18:30:04.63 UTC">
+                <name>M 5 - 2012 Dec 9, NEW GUINEA, PAPUA NEW GUINEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.117,-3.563,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 9 23:50:33.02 UTC">
+                <name>M 5 - 2012 Dec 9, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.811,37.519,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 10 17:34:36.13 UTC">
+                <name>M 5 - 2012 Dec 10, KEPULAUAN TALAUD, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>126.869,3.655,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 11 23:16:23.17 UTC">
+                <name>M 5 - 2012 Dec 11, VANUATU</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>167.736,-18.987,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 13 17:16:22.20 UTC">
+                <name>M 5 - 2012 Dec 13, COSTA RICA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-84.015,9.062,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 14 02:34:52.55 UTC">
+                <name>M 5 - 2012 Dec 14, NEW BRITAIN REGION, P.N.G.</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>152.959,-5.015,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 15 12:43:30.09 UTC">
+                <name>M 5 - 2012 Dec 15, OFF THE COAST OF EL SALVADOR</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-88.605,12.247,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 17 22:52:19.63 UTC">
+                <name>M 5 - 2012 Dec 17, OFF EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>143.568,37.728,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 19 16:02:19.99 UTC">
+                <name>M 5 - 2012 Dec 19, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.283,-20.508,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 20 19:38:45.82 UTC">
+                <name>M 5 - 2012 Dec 20, TONGA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-174.074,-20.765,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 21 08:07:20.27 UTC">
+                <name>M 5 - 2012 Dec 21, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.71,38.633,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 21 14:43:39.42 UTC">
+                <name>M 5 - 2012 Dec 21, IZU ISLANDS, JAPAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>142.212,29.779,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 24 23:24:50.06 UTC">
+                <name>M 5 - 2012 Dec 24, WEST OF MACQUARIE ISLAND</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>146.898,-55.683,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 25 17:36:32.80 UTC">
+                <name>M 5 - 2012 Dec 25, PAKISTAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>66.465,28.464,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 26 02:06:37.12 UTC">
+                <name>M 5 - 2012 Dec 26, TAIWAN REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>122.55,24.043,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 26 02:58:23.23 UTC">
+                <name>M 5 - 2012 Dec 26, FIJI REGION</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>-178.619,-20.69,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 29 07:19:35.32 UTC">
+                <name>M 5 - 2012 Dec 29, NEAR EAST COAST OF HONSHU, JAPAN</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>141.025,37.064,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 29 07:56:00.31 UTC">
+                <name>M 5 - 2012 Dec 29, BISMARCK SEA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>148.752,-3.371,0</coordinates>
+                </Point>
+            </Placemark>
+            <Placemark id="2012 Dec 30 07:56:52.07 UTC">
+                <name>M 5 - 2012 Dec 30, SUNDA STRAIT, INDONESIA</name>
+                <magnitude>5</magnitude>
+                <Point>
+                    <coordinates>105.283,-6.96,0</coordinates>
+                </Point>
+            </Placemark>
+        </Folder>
+    </Document>
+</kml>
\ No newline at end of file
diff --git a/examples/data/kml/timezones.kml b/examples/data/kml/timezones.kml
new file mode 100644
index 0000000..9ba605e
--- /dev/null
+++ b/examples/data/kml/timezones.kml
@@ -0,0 +1,1608 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://earth.google.com/kml/2.2">
+<Document>
+  <Style id="hidelist"><ListStyle><listItemType>checkHideChildren</listItemType><bgColor>00ffffff</bgColor><maxSnippetLines>0</maxSnippetLines></ListStyle></Style>
+
+  <Style id="nStylem1200"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d261d6cd</color></PolyStyle></Style>
+  <Style id="nStylem1100"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d25bb85f</color></PolyStyle></Style>
+  <Style id="nStylem1000"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d20c939c</color></PolyStyle></Style>			
+  <Style id="nStylem0950"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2eafeff</color></PolyStyle></Style>
+  <Style id="nStylem0900"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d299f7ff</color></PolyStyle></Style>
+  <Style id="nStylem0850"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2eafeff</color></PolyStyle></Style>
+  <Style id="nStylem0800"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d261d6cd</color></PolyStyle></Style>
+  <Style id="nStylem0700"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d25bb85f</color></PolyStyle></Style>
+  <Style id="nStylem0600"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d20c939c</color></PolyStyle></Style>			
+  <Style id="nStylem0500"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d299f7ff</color></PolyStyle></Style>	
+  <Style id="nStylem0400"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d261d6cd</color></PolyStyle></Style>
+  <Style id="nStylem0350"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2eafeff</color></PolyStyle></Style>
+  <Style id="nStylem0300"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d25bb85f</color></PolyStyle></Style>
+  <Style id="nStylem0200"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d20c939c</color></PolyStyle></Style>			
+  <Style id="nStylem0100"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d299f7ff</color></PolyStyle></Style>		
+  <Style id="nStyle0000"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d261d6cd</color></PolyStyle></Style>
+  <Style id="nStyle0100"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d25bb85f</color></PolyStyle></Style>
+  <Style id="nStyle0200"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d20c939c</color></PolyStyle></Style>			
+  <Style id="nStyle0300"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d299f7ff</color></PolyStyle></Style>	
+  <Style id="nStyle0350"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2eafeff</color></PolyStyle></Style>
+  <Style id="nStyle0400"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d261d6cd</color></PolyStyle></Style>
+  <Style id="nStyle0450"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2f8f6e2</color></PolyStyle></Style>
+  <Style id="nStyle0500"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d25bb85f</color></PolyStyle></Style>
+  <Style id="nStyle0550"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2eafeff</color></PolyStyle></Style>
+  <Style id="nStyle0575"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2f8f6e2</color></PolyStyle></Style>
+  <Style id="nStyle0600"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d20c939c</color></PolyStyle></Style>			
+  <Style id="nStyle0650"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d25bb85f</color></PolyStyle></Style>
+  <Style id="nStyle0700"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d299f7ff</color></PolyStyle></Style>	
+  <Style id="nStyle0800"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d261d6cd</color></PolyStyle></Style>
+  <Style id="nStyle0900"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d25bb85f</color></PolyStyle></Style>
+  <Style id="nStyle0950"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2eafeff</color></PolyStyle></Style>
+  <Style id="nStyle1000"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d20c939c</color></PolyStyle></Style>			
+  <Style id="nStyle1050"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2eafeff</color></PolyStyle></Style>
+  <Style id="nStyle1100"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d299f7ff</color></PolyStyle></Style>	
+  <Style id="nStyle1150"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2f8f6e2</color></PolyStyle></Style>
+  <Style id="nStyle1200"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d261d6cd</color></PolyStyle></Style>
+  <Style id="nStyle1275"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d2eafeff</color></PolyStyle></Style>
+  <Style id="nStyle1300"><LineStyle><color>4cffffff</color><width>1.0</width></LineStyle><PolyStyle><color>d25bb85f</color></PolyStyle></Style>
+
+  <Style id="hStylem1200"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da61d6cd</color></PolyStyle></Style>
+  <Style id="hStylem1100"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da5bb85f</color></PolyStyle></Style>
+  <Style id="hStylem1000"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da0c939c</color></PolyStyle></Style>			
+  <Style id="hStylem0950"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daeafeff</color></PolyStyle></Style>
+  <Style id="hStylem0900"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da99f7ff</color></PolyStyle></Style>
+  <Style id="hStylem0850"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daeafeff</color></PolyStyle></Style>
+  <Style id="hStylem0800"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da61d6cd</color></PolyStyle></Style>
+  <Style id="hStylem0700"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da5bb85f</color></PolyStyle></Style>
+  <Style id="hStylem0600"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da0c939c</color></PolyStyle></Style>			
+  <Style id="hStylem0500"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da99f7ff</color></PolyStyle></Style>	
+  <Style id="hStylem0400"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da61d6cd</color></PolyStyle></Style>
+  <Style id="hStylem0350"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daeafeff</color></PolyStyle></Style>
+  <Style id="hStylem0300"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da5bb85f</color></PolyStyle></Style>
+  <Style id="hStylem0200"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da0c939c</color></PolyStyle></Style>			
+  <Style id="hStylem0100"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da99f7ff</color></PolyStyle></Style>		
+  <Style id="hStyle0000"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da61d6cd</color></PolyStyle></Style>
+  <Style id="hStyle0100"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da5bb85f</color></PolyStyle></Style>
+  <Style id="hStyle0200"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da0c939c</color></PolyStyle></Style>			
+  <Style id="hStyle0300"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da99f7ff</color></PolyStyle></Style>	
+  <Style id="hStyle0350"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daeafeff</color></PolyStyle></Style>
+  <Style id="hStyle0400"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da61d6cd</color></PolyStyle></Style>
+  <Style id="hStyle0450"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daf8f6e2</color></PolyStyle></Style>
+  <Style id="hStyle0500"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da5bb85f</color></PolyStyle></Style>
+  <Style id="hStyle0550"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daeafeff</color></PolyStyle></Style>
+  <Style id="hStyle0575"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daf8f6e2</color></PolyStyle></Style>
+  <Style id="hStyle0600"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da0c939c</color></PolyStyle></Style>			
+  <Style id="hStyle0650"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da5bb85f</color></PolyStyle></Style>
+  <Style id="hStyle0700"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da99f7ff</color></PolyStyle></Style>	
+  <Style id="hStyle0800"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da61d6cd</color></PolyStyle></Style>
+  <Style id="hStyle0900"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da5bb85f</color></PolyStyle></Style>
+  <Style id="hStyle0950"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daeafeff</color></PolyStyle></Style>
+  <Style id="hStyle1000"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da0c939c</color></PolyStyle></Style>			
+  <Style id="hStyle1050"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daeafeff</color></PolyStyle></Style>
+  <Style id="hStyle1100"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da99f7ff</color></PolyStyle></Style>	
+  <Style id="hStyle1150"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daf8f6e2</color></PolyStyle></Style>
+  <Style id="hStyle1200"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da61d6cd</color></PolyStyle></Style>
+  <Style id="hStyle1275"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>daeafeff</color></PolyStyle></Style>
+  <Style id="hStyle1300"><LineStyle><color>c0ffffff</color><width>1.0</width></LineStyle><PolyStyle><color>da5bb85f</color></PolyStyle></Style>
+
+
+  <StyleMap id="khStylem1200"><Pair><key>normal</key><styleUrl>#nStylem1200</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem1200</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem1100"><Pair><key>normal</key><styleUrl>#nStylem1100</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem1100</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem1000"><Pair><key>normal</key><styleUrl>#nStylem1000</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem1000</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0950"><Pair><key>normal</key><styleUrl>#nStylem0950</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0950</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0900"><Pair><key>normal</key><styleUrl>#nStylem0900</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0900</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0850"><Pair><key>normal</key><styleUrl>#nStylem0850</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0850</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0800"><Pair><key>normal</key><styleUrl>#nStylem0800</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0800</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0700"><Pair><key>normal</key><styleUrl>#nStylem0700</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0700</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0600"><Pair><key>normal</key><styleUrl>#nStylem0600</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0600</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0500"><Pair><key>normal</key><styleUrl>#nStylem0500</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0500</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0400"><Pair><key>normal</key><styleUrl>#nStylem0400</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0400</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0350"><Pair><key>normal</key><styleUrl>#nStylem0350</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0350</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0300"><Pair><key>normal</key><styleUrl>#nStylem0300</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0300</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0200"><Pair><key>normal</key><styleUrl>#nStylem0200</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0200</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStylem0100"><Pair><key>normal</key><styleUrl>#nStylem0100</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStylem0100</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0000"><Pair><key>normal</key><styleUrl>#nStyle0000</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0000</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0100"><Pair><key>normal</key><styleUrl>#nStyle0100</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0100</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0200"><Pair><key>normal</key><styleUrl>#nStyle0200</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0200</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0300"><Pair><key>normal</key><styleUrl>#nStyle0300</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0300</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0350"><Pair><key>normal</key><styleUrl>#nStyle0350</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0350</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0400"><Pair><key>normal</key><styleUrl>#nStyle0400</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0400</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0450"><Pair><key>normal</key><styleUrl>#nStyle0450</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0450</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0500"><Pair><key>normal</key><styleUrl>#nStyle0500</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0500</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0550"><Pair><key>normal</key><styleUrl>#nStyle0550</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0550</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0575"><Pair><key>normal</key><styleUrl>#nStyle0575</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0575</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0600"><Pair><key>normal</key><styleUrl>#nStyle0600</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0600</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0650"><Pair><key>normal</key><styleUrl>#nStyle0650</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0650</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0700"><Pair><key>normal</key><styleUrl>#nStyle0700</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0700</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0800"><Pair><key>normal</key><styleUrl>#nStyle0800</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0800</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0900"><Pair><key>normal</key><styleUrl>#nStyle0900</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0900</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle0950"><Pair><key>normal</key><styleUrl>#nStyle0950</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle0950</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle1000"><Pair><key>normal</key><styleUrl>#nStyle1000</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle1000</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle1050"><Pair><key>normal</key><styleUrl>#nStyle1050</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle1050</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle1100"><Pair><key>normal</key><styleUrl>#nStyle1100</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle1100</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle1150"><Pair><key>normal</key><styleUrl>#nStyle1150</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle1150</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle1200"><Pair><key>normal</key><styleUrl>#nStyle1200</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle1200</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle1275"><Pair><key>normal</key><styleUrl>#nStyle1275</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle1275</styleUrl></Pair></StyleMap>
+  <StyleMap id="khStyle1300"><Pair><key>normal</key><styleUrl>#nStyle1300</styleUrl></Pair><Pair><key>highlight</key><styleUrl>#hStyle1300</styleUrl></Pair></StyleMap>
+
+  <styleUrl>#hidelist</styleUrl>
+
+		<Placemark>
+			<name>GMT -12:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-12);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem1200</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-179.0623,-89.90000000000001,0 -180,-89.90000000000001,0 -180,-86.5,0 -180,-81.49999,0 -180,-76.5,0 -180,-71.5,0 -180,-66.5,0 -180,-61.5,0 -180,-56.5,0 -180,-51.50000000000001,0 -176.2216,-48.22535,0 -172.5,-45,0 -172.4998,-50,0 -172.4996,-55.00000000000001,0 -172.4995,-60.00000000000001,0 -172.4993,-65,0 -172.4991,-70,0 -172.4989,-75,0 -172.4987,-80,0 -172.4986,-83.3,0 -172.4984,-88.3,0 -172.4984,-89.90000000000001,0 -173.4361,-89.90000000000001,0 -174.3738,-89.90000000000001,0 -175.311 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-172.509,74.89999,0 -172.509,70.23302,0 -175.7817,72.31562,0 -180,75,0 -180,79.90000000000001,0 -180,84.90001,0 -180,89.90000000000001,0 -179.0636,89.90000000000001,0 -178.1273,89.90000000000001,0 -177.1909,89.90000000000001,0 -176.2545,89.90000000000001,0 -175.3181,89.90000000000001,0 -174.3818,89.90000000000001,0 -173.4454,89.90000000000001,0 -172.509,89.90000000000001,0 -172.509,84.90001,0 -172.509,79.90000000000001,0 -172.509,74.89999,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT -11:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-11);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem1100</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+180,49.99722,0 180,48,0 176.0055,49.99722,0 180,49.99722,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-167.5405,-5.592744,0 -167.5405,-7.092370000000001,0 -172.5404,-7.073442000000002,0 -172.9307,-7.071967,0 -172.9307,-10.5021,0 -167.9308,-10.46422,0 -167.5405,-10.46127,0 -167.5405,-15.46126,0 -167.5405,-20.46127,0 -167.5405,-22.51781,0 -162.5405,-22.51781,0 -157.5405,-22.51781,0 -157.5063,-22.51781,0 -157.5063,-27.51781,0 -157.5063,-32.51781,0 -157.5063,-37.51781,0 -157.5063,-40.2,0 -157.5063,-45.2,0 -157.5063,-50.2,0 -157.5063,-50.7,0 -157.5063,-55.7,0 -157.5063,-60.7,0 -157.5063,-65.7 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-167.1914,68.69023,0 -169,68,0 -172.509,70.23302,0 -172.509,74.89999,0 -172.509,79.90000000000001,0 -172.509,84.90001,0 -172.509,89.90000000000001,0 -171.5101,89.90000000000001,0 -170.5112,89.90000000000001,0 -169.5124,89.90000000000001,0 -168.5135,89.90000000000001,0 -167.5146,89.90000000000001,0 -166.5157,89.90000000000001,0 -165.5168,89.90000000000001,0 -164.5179,89.90000000000001,0 -163.519,89.90000000000001,0 -162.5201,89.90000000000001,0 -161.5212,89.90000000000001,0 -160.5223,89.9 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT -10:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-10);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem1000</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-142.5293,-4.65319,0 -142.5293,-9.653193,0 -142.5293,-13.48625,0 -137.5294,-13.45937,0 -134.3385,-13.44221,0 -134.3385,-18.44221,0 -134.3385,-21.37773,0 -136.8102,-23.676,0 -141.8102,-23.676,0 -142.5293,-23.676,0 -142.5293,-28.676,0 -142.5293,-33.676,0 -142.5293,-38.676,0 -142.5293,-43.676,0 -142.5293,-48.67599000000001,0 -142.5293,-53.676,0 -142.5293,-56.87600000000001,0 -142.5293,-61.876,0 -142.5293,-66.87600999999999,0 -142.5293,-71.87600000000001,0 -142.5293,-73.476,0 -142.5293,-78.4 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-175,50.01045,0 -180,50.0103,0 -180,50.02665,0 -180,55.02666,0 -175,55.02376000000001,0 -170,55.02087000000001,0 -169.3902,55.02052,0 -169.3893,50.02052000000001,0 -169.3893,50.01063000000001,0 -170,50.01062000000001,0 -175,50.01045,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+180,49.99722,0 176.0055,49.99722,0 171.5334,52.23330000000001,0 170,53,0 173.415,55.03272,0 178.415,55.03272,0 180,55.03272,0 180,54.99723,0 180,49.99722,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-142.4651,74.90014000000001,0 -142.4453,70.32476,0 -147.4331,70.67321,0 -152.421,71.02166,0 -157.4088,71.37009999999999,0 -157.5256,71.37826,0 -157.5256,74.89999,0 -157.5256,79.90000000000001,0 -157.5256,84.90001,0 -157.5256,89.90000000000001,0 -156.5259,89.90000000000001,0 -155.5262,89.90000000000001,0 -154.5265,89.90000000000001,0 -153.5268,89.90000000000001,0 -152.5271,89.90000000000001,0 -151.5274,89.90000000000001,0 -150.5277,89.90000000000001,0 -149.528,89.90000000000001,0 -148.528 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT -09:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-9.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0950</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-141.5368,-7.197858,0 -136.5368,-7.197858,0 -135.6827,-7.197858,0 -135.6827,-11.10058,0 -140.6827,-11.10058,0 -141.5368,-11.10058,0 -141.5368,-7.197858,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT -09:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-9);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0900</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+178.415,55.03272,0 173.415,55.03272,0 177.7114,57.59015000000001,0 180,58.95238000000001,0 180,55.03272,0 178.415,55.03272,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-127.5151,74.89999,0 -127.5151,70.49976,0 -128.2554,70.67574000000001,0 -128.8733,70.34173000000001,0 -129.7417,70.30833,0 -129.9588,70.14133,0 -130.4598,70.22484,0 -133.5828,69.57352,0 -134.3343,69.85742999999999,0 -135.6703,69.64033000000001,0 -136.2715,69.22282,0 -136.4206,68.90156,0 -137.0624,68.95941999999999,0 -137.2391,69.01522,0 -137.4809,69.01522,0 -138.2296,69.18262,0 -138.3319,69.24308000000001,0 -138.383,69.31749000000001,0 -138.5411,69.26168,0 -138.6248,69.28493,0 -138.8806, [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<innerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-141.5368,-7.197858,0 -141.5368,-11.10058,0 -140.6827,-11.10058,0 -135.6827,-11.10058,0 -135.6827,-7.197858,0 -136.5368,-7.197858,0 -141.5368,-7.197858,0 </coordinates>
+					</LinearRing>
+				</innerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT -08:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-8.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0850</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-127.5075,-26,0 -131.5,-26,0 -131.5,-22.5,0 -127.508,-22.5,0 -122.508,-22.5,0 -121,-22.5,0 -121,-26,0 -126,-26,0 -127.5075,-26,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT -08:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-8);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0800</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-138.8806,69.61044,0 -138.6248,69.28493,0 -138.5411,69.26168,0 -138.383,69.31749000000001,0 -138.3319,69.24308000000001,0 -138.2296,69.18262,0 -137.4809,69.01522,0 -137.2391,69.01522,0 -137.0624,68.95941999999999,0 -136.4206,68.90156,0 -136.4461,68.87302,0 -136.4447,68.58778,0 -136.4442,68.43304000000001,0 -136.445,67.71554999999999,0 -136.4211,67.65526000000001,0 -136.2411,67.62053,0 -136.1578,67.50776999999999,0 -136.2053,67.40694000000001,0 -136.1164,67.38274,0 -136.1428,67.35942,0 -1 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-126.1624,71.89608,0 -127.5151,70.49976,0 -127.5151,74.89999,0 -127.5151,79.90000000000001,0 -127.5151,84.90001,0 -127.5151,89.90000000000001,0 -126.5769,89.90000000000001,0 -125.6388,89.90000000000001,0 -124.7006,89.90000000000001,0 -123.7625,89.90000000000001,0 -122.8243,89.90000000000001,0 -121.8862,89.90000000000001,0 -120.948,89.90000000000001,0 -120.0099,89.90000000000001,0 -119.0717,89.90000000000001,0 -118.1335,89.90000000000001,0 -117.1954,89.90000000000001,0 -116.2572,89.900000 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>			
+		</Placemark>
+		<Placemark>
+			<name>GMT -07:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-7);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0700</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-97.51546,89.90000000000001,0 -97.51546,84.90001,0 -97.51546,80.63566,0 -102.0002,80.63531,0 -102.0004,75.63531,0 -102.0005,73.3723,0 -101.191,73.22286,0 -100.9536,73.20439,0 -100.5149,73.23768,0 -98.38002,72.95116,0 -98.29798,72.94485,0 -97.00784,72.74532000000001,0 -96.89134,72.69624,0 -96.71005,72.71178000000001,0 -96.41336,72.64267,0 -95.11967,72.46542,0 -93.87927000000001,72.25537,0 -93.74417000000003,72.01089,0 -93.19248000000002,71.65391,0 -92.93285,71.44838,0 -92.78141000000001,7 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT -06:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-6);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0600</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-82.51007,89.90000000000001,0 -82.5051,84.90001,0 -82.50320000000001,82.97593999999999,0 -84.99902,82.98072000000001,0 -84.99903999999999,77.98072999999999,0 -84.99907,72.98072000000001,0 -84.9991,67.98071,0 -84.9991,66.25666,0 -85.64087000000001,66.05121,0 -86.11559,65.84233,0 -86.74223000000002,64.72197,0 -87.25494000000001,64.20925,0 -87.6917,63.6016,0 -87.52079000000001,63.03194,0 -86.66628,62.44327,0 -85.00069000000001,61.95694000000001,0 -85.00126,56.95695000000001,0 -85.00144,55.2 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT -05:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0500</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-67.50302000000001,89.90000000000001,0 -67.50302000000001,84.90001,0 -67.50302000000001,82.99629,0 -64.77722,82.92871,0 -63.38053000000001,82.86113,0 -62.89619,82.57953999999999,0 -61.43191,82.50069000000002,0 -59.49456,82.01636000000002,0 -60.51955,81.93752000000001,0 -61.47697000000001,81.79107999999999,0 -61.49949,81.73477000000001,0 -61.02642,81.47570000000002,0 -61.31927,81.39686,0 -61.35306000000001,81.34054,0 -61.30801,81.16032,0 -61.55581000000002,81.11526000000001,0 -62.23162000 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT -04:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-4);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0400</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-52.50595000000001,64.94479,0 -52.50631,59.94478000000001,0 -52.50666,54.94477,0 -52.50703,49.94478,0 -52.50738,44.94477,0 -52.50773000000001,39.94478,0 -52.50809000000001,34.94477,0 -52.50845000000001,29.94478,0 -52.50846,29.83971,0 -52.50841,24.83971,0 -52.50838,19.83971,0 -52.50835,15.23971,0 -52.5083,10.2397,0 -52.50826000000001,5.239709,0 -52.50826000000001,5.098526,0 -52.91902,5.485283,0 -54.47205,5.976981000000002,0 -55.15563000000001,6.048935,0 -56.97724,6.000021,0 -57.0683300000 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<innerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-56.12872,46.48062,0 -56.12872,47.16830000000001,0 -56.74985000000001,47.16830000000001,0 -56.74985000000001,46.48062,0 -56.12872,46.48062,0 </coordinates>
+					</LinearRing>
+					<LinearRing>
+						<coordinates>
+-57.07413,53.19926000000002,0 -57.10572,51.03270000000001,0 -57.32588,50.86326,0 -57.94108,49.80638,0 -58.39064,49.19907,0 -58.77711000000001,48.81260000000002,0 -59.22667000000001,48.58387000000001,0 -59.28977,48.48923,0 -59.43964,47.90558999999999,0 -59.3292,47.5901,0 -59.2109,47.527,0 -58.29600000000001,47.62165000000001,0 -57.71236,47.58221000000001,0 -56.97096000000001,47.3456,0 -56.81322,47.47968,0 -56.30055,47.5901,0 -56.01662,47.24306000000001,0 -55.88254000000001,47.250950000000 [...]
+					</LinearRing>
+				</innerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-52.52415,84.90001,0 -52.52951,82.29564000000001,0 -52.95565,82.35877000000001,0 -53.42914,82.29564000000001,0 -54.21828,82.37454,0 -56.03332,82.31142000000001,0 -58.87425,82.10625,0 -59.49456,82.01636000000002,0 -61.43191,82.50069000000002,0 -62.89619,82.57953999999999,0 -63.38053000000001,82.86113,0 -64.77722,82.92871,0 -67.50302000000001,82.99629,0 -67.50302000000001,84.90001,0 -67.50302000000001,89.90000000000001,0 -66.50375,89.90000000000001,0 -65.50446,89.90000000000001,0 -64.50519 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT -03.30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-3.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0350</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-55.39375,51.64408,0 -55.53551,50.93423,0 -55.44086,50.79227,0 -55.50396,50.03511,0 -55.43297,49.94835000000001,0 -55.78001,49.76695,0 -55.72480000000001,49.68018,0 -55.33043000000001,49.53822,0 -55.07016,49.58554000000001,0 -54.81778000000001,49.70385,0 -54.09216,49.77482000000001,0 -53.91076,49.6092,0 -53.43753,49.27005,0 -53.59527,48.93091,0 -53.56372,48.82837,0 -53.57161,48.71006000000001,0 -53.50852,48.59177,0 -53.41388,48.63908000000001,0 -53.26402000000001,48.59966,0 -53.082600000 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT -03:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-3);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0300</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-56.12872,46.48062,0 -56.74985000000001,46.48062,0 -56.74985000000001,47.16830000000001,0 -56.12872,47.16830000000001,0 -56.12872,46.48062,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-37.51992,84.90001,0 -37.51992,83.74590000000001,0 -34.51386,83.78599,0 -29.51426,83.7223,0 -28.22116000000001,83.70583000000001,0 -23.25304,83.14206,0 -22.56975,83.06453000000002,0 -21.33607,82.72414000000001,0 -19.25519,82.23316,0 -18.10955,81.78892999999999,0 -17.59517,81.92921,0 -16.16897,82.02274,0 -13.71401,81.90584,0 -12.03061,81.69541,0 -12.03061,81.55513000000001,0 -14.53233,80.80695,0 -15.51431,80.61991,0 -17.31461,79.94186999999999,0 -17.47827,79.26384,0 -17.52503,77.76749,0 - [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<innerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-19.77925,75.15038,0 -19.60578,75.14566000000001,0 -19.46688,75.2666,0 -19.43014,75.36224,0 -19.4368,75.46748000000001,0 -19.48732,75.56003,0 -19.57222,75.62255,0 -19.67559,75.64335,0 -19.77806,75.6185,0 -19.86044,75.55269,0 -19.90594,75.4571,0 -19.90611,75.27975000000001,0 -19.77925,75.15038,0 </coordinates>
+					</LinearRing>
+					<LinearRing>
+						<coordinates>
+-22.03397,75.85133,0 -21.86051,75.84662,0 -21.72161,75.96755,0 -21.68487,76.06319000000001,0 -21.69154,76.16843000000002,0 -21.74206,76.26098,0 -21.82695,76.32351,0 -21.93032,76.3443,0 -22.03279,76.31946000000001,0 -22.11516,76.25364,0 -22.16067,76.15807000000001,0 -22.16084,75.98069,0 -22.03397,75.85133,0 </coordinates>
+					</LinearRing>
+				</innerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>			
+		</Placemark>
+		<Placemark>
+			<name>GMT -02:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-2);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0200</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-25.28129,67.4954,0 -25.28129,62.86423,0 -22.54213,62.86423,0 -22.5419,60.19076,0 -22.54149,55.19075000000002,0 -22.54108,50.19075,0 -22.54066,45.19075,0 -22.54025,40.19075,0 -26.74697,40.19075,0 -31.74697000000001,40.19075,0 -31.74697000000001,36.49937,0 -27.5395,36.49937,0 -22.5395,36.49937,0 -22.53887,33.39533,0 -22.53785,28.39532,0 -22.53685,23.39533000000001,0 -22.53583,18.39532,0 -27.51274,18.39532,0 -27.51274,13.4011,0 -22.53482,13.4011,0 -22.53417,10.20111,0 -22.53316,5.201108,0  [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-22.55908,84.90009000000001,0 -22.56975,83.06453000000002,0 -23.25304,83.14206,0 -28.22116000000001,83.70583000000001,0 -29.51426,83.7223,0 -34.51386,83.78599,0 -37.51992,83.74590000000001,0 -37.51992,84.90001,0 -37.51992,89.90000000000001,0 -36.5206,89.90000000000001,0 -35.52126,89.90000000000001,0 -34.52194,89.90000000000001,0 -33.52261,89.90000000000001,0 -32.52328,89.90000000000001,0 -31.52396,89.90000000000001,0 -30.52463,89.90000000000001,0 -29.5253,89.90000000000001,0 -28.52597,89 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>	
+		</Placemark>
+		<Placemark>
+			<name>GMT -01:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(-1);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStylem0100</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-8.807823000000001,54.70094,0 -9.054081,54.29253,0 -9.834866999999999,54.36460000000001,0 -10.12917,54.26851,0 -10.25529,54.12435000000001,0 -10.29734,53.98021000000001,0 -10.32736,53.58982,0 -10.18322,53.39763,0 -9.8649,53.12735000000001,0 -9.498528000000002,52.94116,0 -9.68472,52.71294,0 -9.948978,52.56879000000001,0 -10.65169,52.04025,0 -10.42346,51.86608,0 -10.24928,51.55978,0 -9.828864000000001,51.43965,0 -9.50454,51.40962,0 -8.525547,51.58981000000001,0 -7.812513,51.89045000000001, [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-19.46688,75.2666,0 -19.60578,75.14566000000001,0 -19.77925,75.15038,0 -19.90611,75.27975000000001,0 -19.90594,75.4571,0 -19.86044,75.55269,0 -19.77806,75.6185,0 -19.67559,75.64335,0 -19.57222,75.62255,0 -19.48732,75.56003,0 -19.4368,75.46748000000001,0 -19.43014,75.36224,0 -19.46688,75.2666,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-7.511742000000002,84.90001,0 -7.511742000000002,79.90000000000001,0 -7.511742000000002,74.89999,0 -7.511742000000002,69.90000000000001,0 -7.511742000000002,67.45737,0 -12.51173,67.47004,0 -17.51171,67.48272,0 -22.5117,67.49539,0 -22.51389,67.4954,0 -22.51389,69.82120999999999,0 -22.03747,69.97009,0 -21.35944,70.48445,0 -21.17239,70.78841,0 -21.78029,72.14449000000001,0 -21.42958000000001,72.84589,0 -20.28394,73.40702,0 -19.34872,74.17858,0 -18.13293,74.58775,0 -17.26786,74.98521,0 -17.2 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>	
+		</Placemark>
+		<Placemark>
+			<name>GMT +00:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(0);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0000</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-8.201223000000002,42.15273,0 -8.185554,42.06471,0 -8.121942000000001,42.07944,0 -8.079723,42.05416,0 -8.084997000000001,42.02027,0 -8.218610999999999,41.91361000000001,0 -8.140554,41.80917000000001,0 -8.014725,41.83388,0 -7.892217,41.92666,0 -7.880004,41.85277,0 -7.692498,41.905,0 -7.591662,41.87972,0 -7.607781,41.83111000000001,0 -7.493058,41.87306000000001,0 -7.420284,41.81332,0 -7.37028,41.85139,0 -7.200558,41.88361,0 -7.182783,41.97944,0 -7.133607,41.99499,0 -7.056108,41.95111,0 -6. [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-21.72161,75.96755,0 -21.86051,75.84662,0 -22.03397,75.85133,0 -22.16084,75.98069,0 -22.16067,76.15807000000001,0 -22.11516,76.25364,0 -22.03279,76.31946000000001,0 -21.93032,76.3443,0 -21.82695,76.32351,0 -21.74206,76.26098,0 -21.69154,76.16843000000002,0 -21.68487,76.06319000000001,0 -21.72161,75.96755,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+7.516629,69.90000000000001,0 7.516629,64.90000000000001,0 7.516629,63.25726,0 5.039118,62.19351,0 4.799088000000001,61.86831,0 4.590036,61.01659999999999,0 4.651983,60.7456,0 4.930722,60.25007,0 5.108805,59.16606000000001,0 5.45724,58.68601000000001,0 5.681772000000001,58.48469,0 6.595425,58.0511,0 7.013538000000001,57.97367,0 7.499043000000001,57.95962999999999,0 7.499043000000001,53.79065000000001,0 6.866424,53.69189,0 6.262488000000001,53.52154,0 5.495949,53.46734,0 5.023638,53.335720 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +01:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(1);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0100</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+22.54661000000001,89.90000000000001,0 22.54661000000001,84.90001,0 22.54661000000001,81.51716999999999,0 27.54661,81.51716999999999,0 32.54661,81.51716999999999,0 33.89268,81.51716999999999,0 33.89268,76.51716999999999,0 33.89268,75.84414,0 28.89267,75.84414,0 23.89267,75.84414,0 22.54661000000001,75.84414,0 22.54661000000001,70.84514,0 23.95011,71.17124,0 24.72286,71.15327000000001,0 25.9988,71.18922000000001,0 28.20923,71.09936999999999,0 28.92806,70.93761000000001,0 30.18603,70.73994, [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT +02:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(2);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0200</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+28.09417,69.93859000000001,0 28.32332,69.88749,0 28.37972,69.8275,0 29.1275,69.68582000000001,0 29.29972,69.48027,0 28.81916,69.23193000000001,0 28.78694,69.11915999999999,0 28.95734,69.05162,0 28.43195,68.89694,0 28.47917,68.8736,0 28.73778,68.87582,0 28.82056,68.84444000000001,0 28.73861,68.73416,0 28.4575,68.53194000000001,0 28.69334,68.19749,0 29.35695,68.08249000000001,0 29.69167,67.81527,0 30.02861,67.69472,0 29.98972,67.67194000000001,0 29.97778,67.57249,0 29.93279,67.51389,0 29.5 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+37.5369,84.90001,0 37.5369,81.47494,0 35.86762,81.47494,0 35.86762,78.71200000000002,0 37.59446,78.71200000000002,0 37.56522,73.71208,0 37.5369,68.86902000000001,0 37.16386,68.89137,0 36.23384,69.15934,0 35.31956,69.30909,0 33.48315,69.49036,0 33.13635,69.77410999999999,0 32.28514,69.92385,0 31.92259,70.01843,0 31.17443,70.36256,0 30.18603,70.73994,0 28.92806,70.93761000000001,0 28.20923,71.09936999999999,0 25.9988,71.18922000000001,0 24.72286,71.15327000000001,0 23.95011,71.17124,0 22.5 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>	
+		</Placemark>
+		<Placemark>
+			<name>GMT +03:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(3);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0300</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+42.79083,37.38472,0 42.95554,37.32222,0 43.14971,37.37777,0 43.27916,37.3161,0 43.35666,37.33083,0 43.49471,37.24972,0 43.79110000000001,37.23194,0 43.83444,37.20499,0 43.91138,37.22415,0 44.01416,37.32054,0 44.11638,37.31638,0 44.26166,37.24194,0 44.26777,37.1675,0 44.19333,37.10027,0 44.25527,36.98666,0 44.31721,36.97055,0 44.35111,37.04833,0 44.43638000000001,37.06304,0 44.63806,37.18748,0 44.78733,37.1497,0 44.76554,37.11694,0 44.78499,37.08472,0 44.90972000000001,37.02388,0 44.88416 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+52.49656000000001,84.90001,0 52.49656000000001,82.81507000000001,0 57.49650000000001,82.84008,0 62.49644000000001,82.86508000000001,0 67.49638,82.89008,0 67.53675,82.89028,0 67.53675,81.66452,0 67.53675,77.00954,0 68.50082,76.95638,0 68.47275999999999,76.92554,0 68.80942,76.86638000000002,0 68.75443,76.82222,0 68.93137,76.78276,0 68.89361,76.75749,0 68.90054000000001,76.72776,0 69.03027000000002,76.70802999999999,0 68.85637,76.65665,0 68.78471999999999,76.58778,0 68.92554,76.55888,0 68.5 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>	
+		</Placemark>
+		<Placemark>
+			<name>GMT +03:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(3.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0350</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+44.81304,39.63081,0 44.8886,39.60582,0 44.95028000000001,39.43582,0 45.06304999999999,39.37305,0 45.13055000000001,39.28556,0 45.14193,39.21748,0 45.30999000000001,39.19832,0 45.43499000000001,39.0511,0 45.43941000000001,38.99804,0 45.87194000000001,38.87999,0 46.05637,38.87831,0 46.17825000000001,38.84114000000001,0 46.35471,38.91054,0 46.54037,38.87559,0 46.83832000000001,39.15527000000001,0 46.94886,39.15443,0 47.02556,39.18942,0 47.09971,39.30444,0 47.29221,39.37693,0 47.39166,39.470 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT +04:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(4);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0400</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+54.48864,25.8831,0 54.55681,25.86849,0 55.33095,26.23366,0 55.89573,26.62316,0 56.84196,27.03251,0 56.92389,26.98249,0 56.96971,27,0 56.9711,26.96388,0 56.92694,26.95166,0 57.02138,26.85222,0 57.08777,26.63972,0 57.0935,26.38464,0 57.09309,26.29857,0 57.12579,26.26425,0 57.21388,26.1725,0 57.16721,26.07222,0 57.27138,25.91944,0 57.31806,25.77083,0 57.6261,25.73027,0 57.74805,25.74554,0 57.78695,25.69833,0 57.77694,25.62806,0 57.95777,25.70027,0 58.04554,25.57695,0 58.13499,25.54138,0 58. [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+40.25339,43.58252,0 40.54306,43.50861,0 40.68471,43.54583,0 41.04416000000001,43.37498000000001,0 41.16805,43.38722,0 41.29554,43.33610000000001,0 41.39332,43.3461,0 41.58971,43.22275,0 41.93971,43.21749,0 42.05777,43.18610000000001,0 42.18111,43.23555,0 42.41526,43.23916,0 42.62583,43.14305,0 42.7011,43.1825,0 42.85722000000001,43.17748,0 43.0211,43.10444,0 43.01082,43.05666,0 43.20083,42.93637,0 43.56055,42.86082,0 43.67083,42.7911,0 43.82721,42.7514,0 43.8361,42.72776,0 43.73555,42.63 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+51.39554,54.67722000000001,0 51.39388,54.59304000000001,0 51.49388,54.59527,0 51.52333,54.64638,0 51.67972,54.56166000000001,0 51.92722000000001,54.53611,0 51.93277,54.43638,0 52.01999,54.43665,0 52.08526000000001,54.33942,0 52.12028000000001,54.35111,0 52.105,54.40054000000001,0 52.2,54.40639,0 52.20972,54.44304,0 52.36388,54.45916,0 52.35054,54.42333,0 52.37915,54.41444,0 52.43943,54.47887,0 52.50306000000001,54.45193,0 52.49416,54.39999,0 52.53745,54.37707,0 52.51166,54.32194,0 52.279 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+47.59415,61.05888,0 47.88139,60.99833,0 47.95999,61.00972,0 47.9875,60.88665000000001,0 48.41924,60.85386000000001,0 48.53917,60.59999000000001,0 48.53999,60.55915,0 48.48110000000001,60.52499,0 48.51111000000001,60.51194,0 48.50416000000001,60.48276,0 48.61777000000001,60.43333000000001,0 48.54137999999999,60.41109,0 48.67582000000001,60.40638000000001,0 48.76305,60.365,0 48.70499,60.30471,0 48.45917000000001,60.19415,0 48.50999,59.70388,0 49.08554,59.65554,0 49.03416,59.48444,0 49.1477 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+57.49650000000001,82.84008,0 52.49656000000001,82.81507000000001,0 52.49656000000001,84.90001,0 52.49656000000001,89.90000000000001,0 53.43657000000001,89.90000000000001,0 54.37659,89.90000000000001,0 55.31659000000001,89.90000000000001,0 56.25661,89.90000000000001,0 57.19662,89.90000000000001,0 58.13662000000001,89.90000000000001,0 59.07665,89.90000000000001,0 60.01665,89.90000000000001,0 60.95667,89.90000000000001,0 61.89668,89.90000000000001,0 62.83669,89.90000000000001,0 63.7767,89.9 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +04:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(4.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0450</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+74.91575,37.23733,0 74.8111,37.22041,0 74.75110000000001,37.30375,0 74.65109,37.23457,0 74.52970999999999,37.24178,0 74.47942999999999,37.17925,0 74.39722,37.17841,0 74.40054000000001,37.13896,0 74.56543000000001,37.02782,0 74.55304,36.96173000000001,0 74.48888,37.01034000000001,0 74.41998,37.00144,0 74.25194000000001,36.89917,0 74.15166000000001,36.90387,0 74.12109000000001,36.83858000000001,0 74.03831,36.81468,0 73.8522,36.89273000000001,0 73.6683,36.90964,0 72.55663,36.82126,0 72.4741 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT +05:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0500</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+74.69081,37.06259,0 74.73943,37.02037,0 74.81749000000001,37.02176000000001,0 74.90166000000001,36.91093,0 74.95972,36.98012,0 75.14444,36.99987,0 75.39722,36.91406000000001,0 75.45444000000001,36.73044,0 75.52303000000001,36.72906,0 75.54637,36.76963,0 75.63916,36.76355,0 75.85526000000002,36.66717,0 76.00499000000001,36.4586,0 75.99082,36.31444,0 76.04166000000001,36.23751,0 75.99359,36.20833,0 75.99387,36.15971,0 75.92303,36.1236,0 75.92609,36.07721,0 75.97275999999999,36.01165,0 76.1 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<innerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+70.25215,-6.970275,0 70.25215,-9.433405000000001,0 73.35092,-9.431101,0 73.34769,-6.970275,0 70.25215,-6.970275,0 </coordinates>
+					</LinearRing>
+				</innerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+78.59721999999999,72.20972,0 78.67693,72.17944,0 78.80803,72.18332000000001,0 78.7711,72.17027,0 78.91165,72.14444,0 78.91081,72.11471,0 79.01859,72.11998,0 79.09193000000001,72.10165000000001,0 79.09444000000001,72.07055,0 79.38275000000002,72.06219,0 79.42276,72.03554,0 79.69692000000001,72.05915,0 79.86720000000001,72.02249000000001,0 79.91002,71.98448000000001,0 80.23093,71.94193,0 80.24838,71.91006,0 80.34878999999999,71.88601,0 80.2719,71.87848,0 80.27464000000001,71.85148,0 80.173 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+68.67328999999999,82.13631,0 67.53675,81.66452,0 67.53675,82.89028,0 67.53675,84.90001,0 67.53675,89.90000000000001,0 68.53611000000001,89.90000000000001,0 69.53547,89.90000000000001,0 70.53484,89.90000000000001,0 71.53419,89.90000000000001,0 72.53355000000001,89.90000000000001,0 73.53292999999999,89.90000000000001,0 74.53227,89.90000000000001,0 75.53164,89.90000000000001,0 76.53100000000001,89.90000000000001,0 77.53036,89.90000000000001,0 78.52972,89.90000000000001,0 79.52907999999999,8 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +05:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(5.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0550</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+69.14654,7.824959000000001,0 67.51169000000002,7.824905,0 67.51169000000002,12.15223,0 72.51169,12.15223,0 74.14655000000001,12.15223,0 74.14655000000001,7.825121,0 69.14654,7.824959000000001,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+94.5928,5.880672000000001,0 92.9025,5.880672000000001,0 90.34064000000001,5.884479,0 90.33504000000001,10.88448,0 90.33015,15.23029,0 94.58984000000001,15.23029,0 94.59142,10.23029,0 94.5928,5.880672000000001,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+79.43803000000001,35.96054000000001,0 79.46193,35.85804,0 79.58109000000002,35.86971,0 79.65886999999999,35.81916,0 79.63443000000001,35.75916,0 79.69359,35.65083,0 79.81303,35.62943,0 79.85887,35.5661,0 79.91914,35.61749,0 79.96416000000001,35.59583,0 80.05749,35.40777,0 80.14776999999999,35.45722,0 80.20663999999999,35.56193,0 80.2741,35.52753,0 80.29776,35.50333,0 80.38388000000001,35.51111,0 80.38666000000001,35.42528,0 80.28943,35.33999,0 80.29803,35.2075,0 80.19026,35.08764,0 80.20 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>	
+		</Placemark>
+		<Placemark>
+			<name>GMT +05:45</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(5.75);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0575</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+82.0664,27.91416,0 81.97776000000002,27.91722,0 81.88026000000001,27.85721,0 81.48027,28.08,0 81.42192,28.16638,0 81.31999000000002,28.13,0 81.31218,28.19333,0 81.19359,28.36667,0 81.01888,28.40416000000001,0 81.00694,28.44305,0 80.93858,28.44111,0 80.89249,28.50638,0 80.79832,28.52389,0 80.66249000000001,28.63277,0 80.58499000000001,28.6536,0 80.57720999999999,28.68556,0 80.50555,28.65833,0 80.50861,28.56693,0 80.44026,28.62888,0 80.35776,28.62944,0 80.24609,28.75082,0 80.05582,28.83611 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT +06:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(6);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0600</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+73.35092,-9.431101,0 70.25215,-9.433405000000001,0 70.25215,-6.970275,0 73.34769,-6.970275,0 73.35092,-9.431101,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+88.43304000000001,26.55139000000001,0 88.68082,26.42027,0 88.69164000000001,26.34277,0 88.73037000000001,26.32068,0 88.67950999999999,26.30742,0 88.66918,26.2609,0 88.76734,26.29859,0 88.82383,26.23343,0 88.88330000000001,26.2852,0 89.02048000000001,26.23517,0 89.04134000000001,26.28179,0 88.98159000000001,26.29568,0 88.90916,26.39271,0 88.93877999999999,26.44582,0 89.06721,26.3877,0 89.12967,26.15927,0 89.31990999999999,26.02483000000001,0 89.39355000000001,26.0479,0 89.52551,25.98821,0 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+90.00002000000002,28.32405,0 90.38165000000001,28.25139,0 90.39554000000001,28.19888,0 90.35027,28.11222,0 90.37053000000002,28.08027,0 90.60804,28.06445,0 90.69942,28.09583,0 90.90998999999999,28.04944,0 91.01082000000001,27.98,0 91.08693,27.96999,0 91.21444,28.07305,0 91.31499,28.09667,0 91.41943000000001,28.01056,0 91.66721,27.94194,0 91.65776,27.76472,0 91.65277000000002,27.71167,0 91.59498000000001,27.64554,0 91.62082000000001,27.54861,0 91.67359,27.48861,0 91.76555000000002,27.4569 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+75.2397,58.21998,0 75.06638000000001,58.11833,0 75.56441,57.93387,0 75.58275999999999,57.64639,0 75.71249,57.63917000000001,0 75.8586,57.39917,0 75.96638,57.41416,0 76.10887,57.25027999999999,0 76.19192,56.97276000000001,0 76.25194999999999,56.91833,0 76.28943,56.72694,0 76.14915000000001,56.63082,0 76.0461,56.62165000000002,0 76.01528,56.55165000000001,0 75.86526000000001,56.49971000000001,0 75.84415,56.45,0 75.895,56.44276,0 75.93581,56.47971,0 76.0061,56.45388,0 76.05748,56.48277,0 76 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+82.27669,74.95653,0 82.27669,73.92335,0 77.53673000000001,73.93346,0 72.53674,73.94411,0 67.53675,73.95477,0 67.53675,76.19176,0 68.31331,76.28333000000001,0 68.16943999999999,76.31805,0 68.33333,76.33582,0 68.43941,76.38972,0 68.40109,76.40609000000001,0 68.57971000000001,76.43304999999999,0 68.92554,76.55888,0 68.78471999999999,76.58778,0 68.85637,76.65665,0 69.03027000000002,76.70802999999999,0 68.90054000000001,76.72776,0 68.89361,76.75749,0 68.93137,76.78276,0 68.75443,76.82222,0 68 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +06:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(6.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0650</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+97.51384,-11.2595,0 97.51384,-13.93535,0 93.69904000000001,-13.93192,0 93.69904000000001,-11.2595,0 97.51384,-11.2595,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+97.56944,28.54888,0 97.63136,28.48416,0 97.71138000000001,28.51694,0 97.79694000000001,28.34916,0 97.90886999999999,28.37638,0 98.01888,28.27832,0 98.01304,28.21472,0 98.06944,28.21138,0 98.13621999999999,28.15632,0 98.15776,28.11333,0 98.13082,27.96916,0 98.20387000000001,27.91638,0 98.16692000000001,27.87055,0 98.23248,27.82471,0 98.22693000000002,27.73471,0 98.31638,27.54194,0 98.36887,27.52944,0 98.40860000000001,27.55750000000002,0 98.43248000000001,27.68944,0 98.52164999999999,27.6 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +07:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(7);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0700</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+105.3275,23.37803,0 105.398,23.28167,0 105.4458,23.28445,0 105.5544,23.16028,0 105.5657,23.09678,0 105.5775,23.05916,0 105.7244,23.04805,0 105.8725,22.91027,0 105.9872,22.93583,0 106.0153,22.98472,0 106.1347,22.98861,0 106.2294,22.95083,0 106.25,22.87416,0 106.285,22.8586,0 106.4194,22.87056,0 106.5203,22.93528,0 106.6005,22.90917,0 106.648,22.85333,0 106.7072,22.865,0 106.7614,22.79471,0 106.8217,22.80028,0 106.7669,22.74249,0 106.7128,22.58666,0 106.6761,22.57277,0 106.6386,22.61416,0  [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+111.0883,72.37220000000001,0 111.3592,72.31693,0 111.5806,72.31944,0 111.6686,72.26582999999999,0 111.6242,72.21361,0 111.7436,72.20721,0 111.775,72.14499000000001,0 112.0122,72.13332,0 112.0111,71.40694000000001,0 112.333,71.34333,0 112.5128,71.26582999999999,0 112.6428,71.2897,0 112.7258,71.24359,0 112.6869,71.20277,0 112.5219,71.16388000000001,0 112.5975,71.10471,0 112.385,71.0647,0 112.2561,71.00000000000001,0 112.0775,71.06164,0 111.9772,70.98276,0 111.4647,70.93864000000001,0 111.3 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +08:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(8);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0800</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+108.4614,64.28581,0 108.5394,64.23248,0 108.4769,64.20081999999999,0 108.5441,64.1747,0 108.49,64.1147,0 108.7383,63.98082,0 108.6839,63.9086,0 108.7719,63.86472,0 108.6489,63.78582,0 108.6056,63.80749,0 108.4661,63.78944000000001,0 108.3716,63.82638,0 108.2886,63.80805,0 108.2703,63.67888,0 108.1164,63.62249,0 108.1314,63.56777,0 108.5586,63.59972000000001,0 108.8566,63.53582000000002,0 109.0433,63.55416000000002,0 109.2289,63.44027,0 109.2717,63.34722,0 109.363,63.36193,0 109.3917,63.3 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+112.8831,77.93326,0 112.5097,77.85098000000001,0 112.5144,79.90003,0 112.5259,84.90002,0 112.5374,89.90000000000001,0 113.5351,89.90000000000001,0 114.5329,89.90000000000001,0 115.5306,89.90000000000001,0 116.5284,89.90000000000001,0 117.5262,89.90000000000001,0 118.5239,89.90000000000001,0 119.5217,89.90000000000001,0 120.5195,89.90000000000001,0 121.5172,89.90000000000001,0 122.515,89.90000000000001,0 123.5128,89.90000000000001,0 124.5105,89.90000000000001,0 125.5083,89.90000000000001, [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +09:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(9);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0900</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+131.1522,-31.47416,0 131.7691,-31.72222,0 132.0908,-31.92111,0 132.2039,-32.03168,0 132.4142,-32.01167,0 132.4794,-32.03251,0 132.4508,-31.97277,0 132.5491,-31.93889,0 132.7644,-31.95084,0 132.8355,-31.97972,0 132.9774,-32.11306,0 133.0591,-32.11473,0 133.1447,-32.20583,0 133.1855,-32.18666,0 133.2672,-32.22084000000001,0 133.3041,-32.19694,0 133.4172,-32.21334,0 133.5382,-32.32338,0 133.7763,-32.43159,0 133.8505,-32.54055,0 133.9055,-32.54501,0 133.9314,-32.50084,0 133.9938,-32.50611,0  [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+140.948,46.03066,0 145.5292,44.44866,0 145.6765,43.53654,0 145.8775,43.38366,0 145.8579,43.31955,0 145.8469,43.2832,0 145.5455,43.11722,0 144.8695,42.9269,0 144.7778,42.92555,0 144.4636,42.93083,0 144.325,42.99805,0 144.0244,42.92139,0 143.8928,42.84916,0 143.5955,42.61971000000001,0 143.3738,42.36167,0 143.3297,42.28167,0 143.3169,42.04277,0 143.2463,41.92527,0 142.943,42.10665,0 142.501,42.25373,0 142.501,37.25373,0 142.501,32.25372,0 142.501,28.64826,0 137.5011,28.62327,0 135.5122,28. [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+142.5194,79.90000000000001,0 142.5194,77.68817,0 138.667,77.71629,0 133.9557,76.04201000000001,0 131.8621,75.29801999999999,0 131.8621,71.38942,0 132.2701,66.40608,0 132.678,61.42275999999999,0 132.8709,59.06711,0 132.8588,59.02208000000001,0 132.9268,58.97153000000001,0 132.905,58.92134000000001,0 132.6281,58.88062,0 132.5582,58.80028999999999,0 132.5681,58.63096000000001,0 132.539,58.58086,0 132.404,58.50661,0 132.2431,58.51441000000001,0 132.1915,58.47281,0 132.2631,58.30735,0 132.092 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +09:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(9.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle0950</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+129,-14.87108,0 129.0917,-14.90135,0 129.3895,-14.71341,0 129.4171,-14.63216,0 129.3632,-14.4277,0 129.4122,-14.23111,0 129.4925,-14.14223,0 129.4789,-14.04722,0 129.5889,-14.09722,0 129.6136,-14.05833,0 129.5977,-13.99945,0 129.6308,-14.04056,0 129.7327,-13.99472,0 129.75,-13.93222,0 129.7169,-13.86722,0 129.8152,-13.77779,0 129.8105,-13.75167,0 129.7844,-13.76305,0 129.7827,-13.69221,0 129.8275,-13.51945,0 129.8708,-13.50194,0 129.8861,-13.44528,0 129.9136,-13.51389,0 129.9861,-13.5277 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT +10:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(10);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle1000</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+157.5176,-9.204364,0 157.5176,-14.20437,0 157.5176,-19.20436,0 157.5176,-24.20437,0 157.5176,-29.20436000000001,0 157.5176,-34.20436,0 157.5176,-39.20436,0 157.5176,-39.30436,0 157.5176,-44.30436,0 157.5176,-49.30437,0 157.5176,-54.30436,0 157.5176,-59.00436,0 157.5176,-64.00436000000001,0 157.5176,-69.00436000000001,0 157.5176,-74.00436000000001,0 157.5176,-79.00436000000001,0 157.5176,-84.00436000000001,0 157.5176,-89.00436000000001,0 157.5176,-89.90000000000001,0 156.5791,-89.90000000 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+157.5082,43.79277,0 157.5082,38.79276,0 157.5082,33.79276,0 157.5082,28.79276,0 157.5082,23.79276000000001,0 157.5082,18.79276,0 157.5082,17,0 157.5082,12,0 157.501,12,0 152.501,12,0 147.501,12,0 142.501,12,0 142.501,14.23089,0 142.501,19.23089,0 140.5122,19.23089,0 135.5122,19.23089,0 135.5122,23.61333000000001,0 135.5122,28.61333,0 137.5011,28.62327,0 142.501,28.64826,0 142.501,32.25372,0 142.501,37.25373,0 142.501,42.25373,0 142.943,42.10665,0 143.2463,41.92527,0 143.3169,42.04277,0 1 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+157.5071,79.90000000000001,0 157.5071,77.646,0 158.1819,76.97113,0 158.435,76.60558,0 158.5194,76.15566,0 158.4631,75.95882,0 158.1257,75.79011,0 157.0853,75.4808,0 152.1637,74.59863,0 151.1239,74.41226,0 149.3243,74.29978,0 145.7813,74.66534,0 144.2066,74.66534,0 142.2944,74.52473000000001,0 142.2944,74.13106999999999,0 143.5036,73.76551000000001,0 143.9254,73.48432,0 144.0097,73.25936,0 143.9816,72.92194000000001,0 143.8973,72.69698,0 142.6355,67.8588,0 141.3738,63.02061,0 141.2248,62. [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +10:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(10.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle1050</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+157.8347,-33.62319,0 157.833,-30.36589,0 162.833,-30.36515,0 164.8248,-30.36486,0 164.8248,-33.62319,0 159.8248,-33.62319,0 157.8347,-33.62319,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT +11:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(11);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle1100</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+166.3565,-27.96984000000001,0 166.3565,-30.78259,0 167.5012,-30.78259,0 172.5012,-30.78259,0 172.5012,-32.24902,0 169.8135,-36.46523,0 167.1259,-40.68143,0 165.0656,-43.91332,0 165.0573,-48.91331,0 165.049,-53.9133,0 165.048,-54.52042000000001,0 170.048,-54.52042000000001,0 172.5188,-54.52042000000001,0 172.5163,-59.52043,0 172.5138,-64.52042,0 172.5113,-69.52042,0 172.5088,-74.52042,0 172.5063,-79.52042,0 172.5038,-84.52042000000002,0 172.5013,-89.52042,0 172.5011,-89.90000000000001,0 1 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<innerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+157.833,-30.36589,0 157.8347,-33.62319,0 159.8248,-33.62319,0 164.8248,-33.62319,0 164.8248,-30.36486,0 162.833,-30.36515,0 157.833,-30.36589,0 </coordinates>
+					</LinearRing>
+				</innerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+172.5346,74.89999,0 172.5346,71.32091,0 167.5346,71.32091,0 162.5346,71.32091,0 159.7593,71.32091,0 160.3981,70.18025,0 160.6752,70.07872999999999,0 160.9,70.04337,0 162.2945,69.98492,0 162.3981,69.86644,0 162.4037,69.67095000000001,0 162.271,69.58094000000001,0 162.2592,69.52155000000001,0 162.1759,69.45047,0 162.1934,69.42339,0 162.4407,69.38332,0 162.8192,69.22402,0 162.5843,69.15031000000001,0 162.5256,69.11716,0 162.4894,69.04481,0 162.4924,69.00284000000001,0 162.5952,68.95761,0 16 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +11:30</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(11.5);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle1150</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+172.5013,-27.96984000000001,0 172.5012,-30.78259,0 167.5012,-30.78259,0 166.3565,-30.78259,0 166.3565,-27.96984000000001,0 171.3565,-27.96984000000001,0 172.5013,-27.96984000000001,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+		<Placemark>
+			<name>GMT +12:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(12);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle1200</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-172.5,-38.5,0 -172.5,-43.5,0 -172.5,-45,0 -176.2216,-48.22535,0 -180,-51.50000000000001,0 -180,-46.50682,0 -175.0824,-46.50682,0 -175.0824,-43.00079,0 -180,-43.00079,0 -180,-38.5,0 -180,-33.5,0 -180,-28.5,0 -180,-23.5,0 -175,-23.5,0 -172.5,-23.5,0 -172.5,-28.5,0 -172.5,-33.5,0 -172.5,-38.5,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-177,-20.99139,0 -180,-21.87818,0 -180,-20,0 -180,-15,0 -180,-10,0 -180,-4.999996,0 -177,-9.000000999999999,0 -174,-13,0 -172.5,-15,0 -177,-15,0 -177,-15.99139,0 -177,-20.99139,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-177.5929,60.38517000000001,0 -180,58.95238000000001,0 -180,60.00000000000001,0 -180,65,0 -180,70,0 -180,75,0 -175.7817,72.31562,0 -172.509,70.23302,0 -169,68,0 -169,65.5,0 -173.2965,62.94258000000001,0 -177.5929,60.38517000000001,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+180,68.95238000000001,0 180,63.95238000000001,0 180,58.95238000000001,0 177.7114,57.59015000000001,0 173.415,55.03272,0 170,53,0 171.5334,52.23330000000001,0 176.0055,49.99722,0 180,48,0 180,46.99903,0 180,41.99904,0 180,36.99903,0 180,31.99903000000001,0 180,26.99904,0 180,21.99903,0 180,16.99904,0 180,11.99903,0 180,6.999039000000001,0 180,1.999034,0 180,-3.000961,0 180,-8.000964,0 180,-13.00097,0 180,-18.00096,0 180,-23.00097,0 180,-28.00096,0 180,-33.00097,0 180,-38.00096,0 180,-43.0 [...]
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>	
+		</Placemark>
+		<Placemark>
+			<name>GMT +12:45</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(12.75);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle1275</styleUrl>
+			<MultiGeometry>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+180,-46.50451,0 176.0435,-46.50451,0 176.0435,-45.19365,0 177.8549,-43.00097,0 180,-43.00097,0 180,-46.50451,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-175.0824,-46.50682,0 -180,-46.50682,0 -180,-43.00079,0 -175.0824,-43.00079,0 -175.0824,-46.50682,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+			</MultiGeometry>
+		</Placemark>
+		<Placemark>
+			<name>GMT +13:00</name>
+		<description><![CDATA[<div style="width:300px;height:50px;"  id="clock" ></div>
+<script language="JavaScript">
+      var int=self.setInterval("tick()",50);
+      function tick(){
+        document.getElementById("clock").innerHTML=calc(13);
+      }
+    function calc(offset) {
+       d = new Date();
+       utc = d.getTime() + (d.getTimezoneOffset() * 60000);
+       nd = new Date(utc + (3600000*offset));
+       return nd.toLocaleString();
+   }
+</script>
+]]></description>
+		  <styleUrl>#khStyle1300</styleUrl>
+			<Polygon>
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+-180,-21.87818,0 -177,-20.99139,0 -177,-15.99139,0 -177,-15,0 -172.5,-15,0 -172.5,-20,0 -172.5,-23.5,0 -175,-23.5,0 -180,-23.5,0 -180,-21.87818,0 </coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+				<tessellate>1</tessellate>
+			</Polygon>
+		</Placemark>
+</Document>
+</kml>
diff --git a/examples/data/ogcsample.xml b/examples/data/ogcsample.xml
new file mode 100644
index 0000000..0d4c52d
--- /dev/null
+++ b/examples/data/ogcsample.xml
@@ -0,0 +1,284 @@
+<?xml version='1.0' encoding="UTF-8"?>
+<WMS_Capabilities version="1.3.0" xmlns="http://www.opengis.net/wms"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd">
+<Service>
+  <Name>WMS</Name>
+  <Title>Acme Corp. Map Server</Title>
+  <Abstract>Map Server maintained by Acme Corporation.  Contact: webmaster at wmt.acme.com.  High-quality maps showing roadrunner nests and possible ambush locations.</Abstract>
+
+  <KeywordList>
+    <Keyword>bird</Keyword>
+    <Keyword>roadrunner</Keyword>
+    <Keyword>ambush</Keyword>
+  </KeywordList>
+  <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+   xlink:href="http://hostname/" />
+
+
+  <ContactInformation>
+    <ContactPersonPrimary>
+      <ContactPerson>Jeff Smith</ContactPerson>
+      <ContactOrganization>NASA</ContactOrganization>
+    </ContactPersonPrimary>
+    <ContactPosition>Computer Scientist</ContactPosition>
+
+    <ContactAddress>
+      <AddressType>postal</AddressType>
+      <Address>NASA Goddard Space Flight Center</Address>
+      <City>Greenbelt</City>
+      <StateOrProvince>MD</StateOrProvince>
+      <PostCode>20771</PostCode>
+
+      <Country>USA</Country>
+    </ContactAddress>
+    <ContactVoiceTelephone>+1 301 555-1212</ContactVoiceTelephone>
+    <ContactElectronicMailAddress>user at host.com</ContactElectronicMailAddress>
+  </ContactInformation>
+
+  <Fees>none</Fees>
+
+  <AccessConstraints>none</AccessConstraints>
+  <LayerLimit>16</LayerLimit>
+  <MaxWidth>2048</MaxWidth>
+  <MaxHeight>2048</MaxHeight>
+</Service>
+<Capability>
+  <Request>
+    <GetCapabilities>
+
+      <Format>text/xml</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+          <Post>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+
+          </Post>
+        </HTTP>
+      </DCPType>
+    </GetCapabilities>
+    <GetMap>
+      <Format>image/gif</Format>
+      <Format>image/png</Format>
+      <Format>image/jpeg</Format>
+
+      <DCPType>
+        <HTTP>
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+        </HTTP>
+      </DCPType>
+    </GetMap>
+
+    <GetFeatureInfo>
+      <Format>text/xml</Format>
+      <Format>text/plain</Format>
+      <Format>text/html</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+        </HTTP>
+      </DCPType>
+    </GetFeatureInfo>
+  </Request>
+  <Exception>
+    <Format>XML</Format>
+
+    <Format>INIMAGE</Format>
+    <Format>BLANK</Format>
+  </Exception>
+  <Layer>
+    <Title>Acme Corp. Map Server</Title>
+    <CRS>CRS:84</CRS>
+
+    <AuthorityURL name="DIF_ID">
+      <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+       xlink:href="http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html" />
+    </AuthorityURL>
+    <BoundingBox CRS="CRS:84"
+     minx="-1" miny="-1" maxx="1" maxy="1" resx="0.0" resy="0.0"/>
+    <Layer>
+
+      <Name>ROADS_RIVERS</Name>
+      <Title>Roads and Rivers</Title>
+
+      <CRS>EPSG:26986</CRS>
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-71.63</westBoundLongitude>
+        <eastBoundLongitude>-70.78</eastBoundLongitude>
+        <southBoundLatitude>41.75</southBoundLatitude>
+        <northBoundLatitude>42.90</northBoundLatitude>
+
+      </EX_GeographicBoundingBox>
+      <BoundingBox CRS="CRS:84"
+       minx="-71.63" miny="41.75" maxx="-70.78" maxy="42.90" resx="0.01" resy="0.01"/>
+      <BoundingBox CRS="EPSG:26986"
+       minx="189000" miny="834000" maxx="285000" maxy="962000" resx="1" resy="1" />
+      <Attribution>
+        <Title>State College University</Title>
+        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+         xlink:href="http://www.university.edu/" />
+
+        <LogoURL width="100" height="100">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/icons/logo.gif" />
+        </LogoURL>
+      </Attribution>
+      <Identifier authority="DIF_ID">123456</Identifier>
+      <FeatureListURL>
+
+        <Format>XML</Format>
+        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+         xlink:href="http://www.university.edu/data/roads_rivers.gml" />
+      </FeatureListURL>
+      <Style>
+        <Name>USGS</Name>
+        <Title>USGS Topo Map Style</Title>
+        <Abstract>Features are shown in a style like that used in USGS topographic maps.</Abstract>
+
+        <LegendURL width="72" height="72">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/legends/usgs.gif" />
+        </LegendURL>
+        <StyleSheetURL>
+          <Format>text/xsl</Format>
+
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/stylesheets/usgs.xsl" />
+        </StyleSheetURL>
+      </Style>
+      <MinScaleDenominator>1000</MinScaleDenominator>
+      <MaxScaleDenominator>250000</MaxScaleDenominator>
+      <Layer queryable="1">
+        <Name>ROADS_1M</Name>
+        <Title>Roads at 1:1M scale</Title>
+        <Abstract>Roads at a scale of 1 to 1 million.</Abstract>
+
+        <KeywordList>
+          <Keyword>road</Keyword>
+          <Keyword>transportation</Keyword>
+          <Keyword>atlas</Keyword>
+        </KeywordList>
+        <Identifier authority="DIF_ID">123456</Identifier>
+        <MetadataURL type="FGDC:1998">
+
+                <Format>text/plain</Format>
+                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="http://www.university.edu/metadata/roads.txt" />
+             </MetadataURL>
+        <MetadataURL type="ISO19115:2003">
+               <Format>text/xml</Format>
+               <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+                xlink:type="simple"
+                xlink:href="http://www.university.edu/metadata/roads.xml" />
+             </MetadataURL>
+
+        <Style>
+          <Name>ATLAS</Name>
+          <Title>Road atlas style</Title>
+          <Abstract>Roads are shown in a style like that used in a commercial road atlas.</Abstract>
+        <LegendURL width="72" height="72">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/legends/atlas.gif" />
+
+        </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>RIVERS_1M</Name>
+        <Title>Rivers at 1:1M scale</Title>
+        <Abstract>Rivers at a scale of 1 to 1 million.</Abstract>
+
+        <KeywordList>
+          <Keyword>river</Keyword>
+          <Keyword>canal</Keyword>
+          <Keyword>waterway</Keyword>
+        </KeywordList>
+      </Layer>
+    </Layer>
+
+    <Layer queryable="1">
+      <Title>Weather Forecast Data</Title>
+      <CRS>CRS:84</CRS>
+
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+        <eastBoundLongitude>180</eastBoundLongitude>
+
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="2000-08-22">1999-01-01/2000-08-22/P1D</Dimension>
+      <Layer>
+
+        <Name>Clouds</Name>
+        <Title>Forecast cloud cover</Title>
+      </Layer>
+      <Layer>
+        <Name>Temperature</Name>
+        <Title>Forecast temperature</Title>
+      </Layer>
+
+      <Layer>
+        <Name>Pressure</Name>
+        <Title>Forecast barometric pressure</Title>
+         <Dimension name="elevation" units="EPSG:5030" />
+         <Dimension name="time" units="ISO8601" default="2000-08-22">
+           1999-01-01/2000-08-22/P1D</Dimension>
+
+         <Dimension name="elevation" units="CRS:88" default="0" nearestValue="1">0,1000,3000,5000,10000</Dimension>
+      </Layer>
+    </Layer>
+    <Layer opaque="1" noSubsets="1" fixedWidth="512" fixedHeight="256">
+      <Name>ozone_image</Name>
+      <Title>Global ozone distribution (1992)</Title>
+
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+        <eastBoundLongitude>180</eastBoundLongitude>
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="1992">1992</Dimension>
+
+    </Layer>
+    <Layer cascaded="1">
+      <Name>population</Name>
+      <Title>World population, annual</Title>
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+
+        <eastBoundLongitude>180</eastBoundLongitude>
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="2000">1990/2000/P1Y</Dimension>
+    </Layer>
+  </Layer>
+
+</Capability>
+</WMS_Capabilities>
diff --git a/examples/data/sld/countries.sld b/examples/data/sld/countries.sld
new file mode 100644
index 0000000..9ae5eeb
--- /dev/null
+++ b/examples/data/sld/countries.sld
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld" xmlns:sld="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
+  <sld:NamedLayer>
+    <sld:Name>countries</sld:Name>
+    <sld:UserStyle>
+      <sld:Name>countries</sld:Name>
+      <sld:Title>A sample style for countries</sld:Title>
+      <sld:IsDefault>1</sld:IsDefault>
+      <sld:Abstract>A sample style for countries</sld:Abstract>
+      <sld:FeatureTypeStyle>
+        <sld:Name>name</sld:Name>
+        <sld:Rule>
+          <sld:Name>Sample</sld:Name>
+          <sld:Title>Sample</sld:Title>
+          <sld:PolygonSymbolizer>
+            <sld:Fill>
+              <sld:CssParameter name="fill">#ff0000</sld:CssParameter>
+              <sld:CssParameter name="fill-opacity">0.6</sld:CssParameter>
+            </sld:Fill>
+            <sld:Stroke>
+              <sld:CssParameter name="stroke">#00FF00</sld:CssParameter>
+              <sld:CssParameter name="stroke-opacity">0.5</sld:CssParameter>
+              <sld:CssParameter name="stroke-width">4</sld:CssParameter>
+            </sld:Stroke>
+          </sld:PolygonSymbolizer>
+        </sld:Rule>
+        <sld:Rule>  
+          <sld:MaxScaleDenominator>20000000</sld:MaxScaleDenominator>
+          <sld:TextSymbolizer>
+            <sld:Label>
+              <ogc:PropertyName>name</ogc:PropertyName>
+            </sld:Label>
+            <sld:Font>
+              <sld:CssParameter name="font-family">Arial</sld:CssParameter>
+              <sld:CssParameter name="font-size">10</sld:CssParameter>
+              <sld:CssParameter name="font-style">Normal</sld:CssParameter>
+            </sld:Font>
+          </sld:TextSymbolizer>          
+        </sld:Rule>
+      </sld:FeatureTypeStyle>
+    </sld:UserStyle>
+  </sld:NamedLayer>
+</sld:StyledLayerDescriptor>
diff --git a/examples/data/topojson/us.json b/examples/data/topojson/us.json
new file mode 100644
index 0000000..721f640
--- /dev/null
+++ b/examples/data/topojson/us.json
@@ -0,0 +1 @@
+{"type":"Topology","objects":{"counties":{"type":"GeometryCollection","geometries":[{"type":"Polygon","id":53073,"arcs":[[0,1,2,3]]},{"type":"Polygon","id":30105,"arcs":[[4,5,6,7,8,9]]},{"type":"Polygon","id":30029,"arcs":[[10,11,12,13,14,15,16,17,18,19]]},{"type":"Polygon","id":16021,"arcs":[[20,21,22,23]]},{"type":"Polygon","id":30071,"arcs":[[-9,24,25,26,27,28,29]]},{"type":"Polygon","id":38079,"arcs":[[30,31,32,33]]},{"type":"Polygon","id":30053,"arcs":[[-19,34,35,-21,36]]},{"type":" [...]
diff --git a/examples/data/topojson/world-110m.json b/examples/data/topojson/world-110m.json
new file mode 100644
index 0000000..2f4dd1f
--- /dev/null
+++ b/examples/data/topojson/world-110m.json
@@ -0,0 +1 @@
+{"type":"Topology","transform":{"scale":[0.0036000360003600037,0.0016925586033320111],"translate":[-180,-85.60903777459777]},"objects":{"land":{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7,8,9]],[[10,11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29,30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42,43]],[[44]],[[45]],[[46]],[[47,48,49,50]],[[5 [...]
diff --git a/examples/device-orientation.html b/examples/device-orientation.html
new file mode 100644
index 0000000..589ddb2
--- /dev/null
+++ b/examples/device-orientation.html
@@ -0,0 +1,58 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Device-Orientation example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Device orientation example</h4>
+          <label class="checkbox" for="track">
+            <input id="track" type="checkbox"/>track changes
+          </label>
+          <p>α : <code id="alpha"></code></p>
+          <p>β : <code id="beta"></code></p>
+          <p>γ : <code id="gamma"></code></p>
+          <p>heading : <code id="heading"></code></p>
+          <p id="shortdesc">Listen to DeviceOrientation events</p>
+          <div id="docs">
+            <p>See the <a href="device-orientation.js" target="_blank">device-orientation.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">orientation, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=device-orientation" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/device-orientation.js b/examples/device-orientation.js
new file mode 100644
index 0000000..8f35693
--- /dev/null
+++ b/examples/device-orientation.js
@@ -0,0 +1,55 @@
+goog.require('ol.DeviceOrientation');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.dom.Input');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+
+var projection = ol.proj.get('EPSG:3857');
+var view = new ol.View({
+  center: [0, 0],
+  projection: projection,
+  extent: projection.getExtent(),
+  zoom: 2
+});
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: view
+});
+
+var deviceOrientation = new ol.DeviceOrientation();
+var track = new ol.dom.Input(document.getElementById('track'));
+track.bindTo('checked', deviceOrientation, 'tracking');
+
+deviceOrientation.on('change', function(event) {
+  $('#alpha').text(deviceOrientation.getAlpha() + ' [rad]');
+  $('#beta').text(deviceOrientation.getBeta() + ' [rad]');
+  $('#gamma').text(deviceOrientation.getGamma() + ' [rad]');
+  $('#heading').text(deviceOrientation.getHeading() + ' [rad]');
+});
+
+// tilt the map
+deviceOrientation.on(['change:beta', 'change:gamma'], function(event) {
+  var center = view.getCenter();
+  var resolution = view.getResolution();
+  var beta = event.target.getBeta() || 0;
+  var gamma = event.target.getGamma() || 0;
+
+  center[0] -= resolution * gamma * 25;
+  center[1] += resolution * beta * 25;
+
+  view.setCenter(view.constrainCenter(center));
+});
diff --git a/examples/drag-and-drop-image-vector.html b/examples/drag-and-drop-image-vector.html
new file mode 100644
index 0000000..422d31e
--- /dev/null
+++ b/examples/drag-and-drop-image-vector.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Drag-and-Drop image vector example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">Drag-and-Drop image vector example</h4>
+          <p id="shortdesc">Example of using the drag-and-drop interaction with a ol.source.ImageVector. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. Each file is rendered to an image on the client.</p>
+          <div id="docs">
+            <p>See the <a href="drag-and-drop-image-vector.js" target="_blank">drag-and-drop-image-vector.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">drag-and-drop-image-vector, gpx, geojson, igc, kml, topojson, vector, image</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=drag-and-drop-image-vector" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/drag-and-drop-image-vector.js b/examples/drag-and-drop-image-vector.js
new file mode 100644
index 0000000..90a6f54
--- /dev/null
+++ b/examples/drag-and-drop-image-vector.js
@@ -0,0 +1,155 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.format.GPX');
+goog.require('ol.format.GeoJSON');
+goog.require('ol.format.IGC');
+goog.require('ol.format.KML');
+goog.require('ol.format.TopoJSON');
+goog.require('ol.interaction');
+goog.require('ol.interaction.DragAndDrop');
+goog.require('ol.layer.Image');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.BingMaps');
+goog.require('ol.source.ImageVector');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var defaultStyle = {
+  'Point': [new ol.style.Style({
+    image: new ol.style.Circle({
+      fill: new ol.style.Fill({
+        color: 'rgba(255,255,0,0.5)'
+      }),
+      radius: 5,
+      stroke: new ol.style.Stroke({
+        color: '#ff0',
+        width: 1
+      })
+    })
+  })],
+  'LineString': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: '#f00',
+      width: 3
+    })
+  })],
+  'Polygon': [new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: 'rgba(0,255,255,0.5)'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#0ff',
+      width: 1
+    })
+  })],
+  'MultiPoint': [new ol.style.Style({
+    image: new ol.style.Circle({
+      fill: new ol.style.Fill({
+        color: 'rgba(255,0,255,0.5)'
+      }),
+      radius: 5,
+      stroke: new ol.style.Stroke({
+        color: '#f0f',
+        width: 1
+      })
+    })
+  })],
+  'MultiLineString': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: '#0f0',
+      width: 3
+    })
+  })],
+  'MultiPolygon': [new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: 'rgba(0,0,255,0.5)'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#00f',
+      width: 1
+    })
+  })]
+};
+
+var styleFunction = function(feature, resolution) {
+  var featureStyleFunction = feature.getStyleFunction();
+  if (featureStyleFunction) {
+    return featureStyleFunction.call(feature, resolution);
+  } else {
+    return defaultStyle[feature.getGeometry().getType()];
+  }
+};
+
+var dragAndDropInteraction = new ol.interaction.DragAndDrop({
+  formatConstructors: [
+    ol.format.GPX,
+    ol.format.GeoJSON,
+    ol.format.IGC,
+    ol.format.KML,
+    ol.format.TopoJSON
+  ]
+});
+
+var map = new ol.Map({
+  interactions: ol.interaction.defaults().extend([dragAndDropInteraction]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.BingMaps({
+        imagerySet: 'Aerial',
+        key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+dragAndDropInteraction.on('addfeatures', function(event) {
+  var vectorSource = new ol.source.Vector({
+    features: event.features,
+    projection: event.projection
+  });
+  map.getLayers().push(new ol.layer.Image({
+    source: new ol.source.ImageVector({
+      source: vectorSource,
+      style: styleFunction
+    })
+  }));
+  var view = map.getView();
+  view.fitExtent(
+      vectorSource.getExtent(), /** @type {ol.Size} */ (map.getSize()));
+});
+
+var displayFeatureInfo = function(pixel) {
+  var features = [];
+  map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    features.push(feature);
+  });
+  if (features.length > 0) {
+    var info = [];
+    var i, ii;
+    for (i = 0, ii = features.length; i < ii; ++i) {
+      info.push(features[i].get('name'));
+    }
+    document.getElementById('info').innerHTML = info.join(', ') || '&nbsp';
+  } else {
+    document.getElementById('info').innerHTML = ' ';
+  }
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var pixel = map.getEventPixel(evt.originalEvent);
+  displayFeatureInfo(pixel);
+});
+
+map.on('click', function(evt) {
+  displayFeatureInfo(evt.pixel);
+});
diff --git a/examples/drag-and-drop.html b/examples/drag-and-drop.html
new file mode 100644
index 0000000..eff604f
--- /dev/null
+++ b/examples/drag-and-drop.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Drag-and-Drop example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">Drag-and-Drop example</h4>
+          <p id="shortdesc">Example of using the drag-and-drop interaction. Drag and drop GPX, GeoJSON, IGC, KML, or TopoJSON files on to the map. There is no projection transform support, so this will only work with data in EPSG:4326 and EPSG:3857.</p>
+          <div id="docs">
+            <p>See the <a href="drag-and-drop.js" target="_blank">drag-and-drop.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">drag-and-drop, gpx, geojson, igc, kml, topojson</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=drag-and-drop" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/drag-and-drop.js b/examples/drag-and-drop.js
new file mode 100644
index 0000000..c481a7f
--- /dev/null
+++ b/examples/drag-and-drop.js
@@ -0,0 +1,151 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.format.GPX');
+goog.require('ol.format.GeoJSON');
+goog.require('ol.format.IGC');
+goog.require('ol.format.KML');
+goog.require('ol.format.TopoJSON');
+goog.require('ol.interaction');
+goog.require('ol.interaction.DragAndDrop');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.BingMaps');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var defaultStyle = {
+  'Point': [new ol.style.Style({
+    image: new ol.style.Circle({
+      fill: new ol.style.Fill({
+        color: 'rgba(255,255,0,0.5)'
+      }),
+      radius: 5,
+      stroke: new ol.style.Stroke({
+        color: '#ff0',
+        width: 1
+      })
+    })
+  })],
+  'LineString': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: '#f00',
+      width: 3
+    })
+  })],
+  'Polygon': [new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: 'rgba(0,255,255,0.5)'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#0ff',
+      width: 1
+    })
+  })],
+  'MultiPoint': [new ol.style.Style({
+    image: new ol.style.Circle({
+      fill: new ol.style.Fill({
+        color: 'rgba(255,0,255,0.5)'
+      }),
+      radius: 5,
+      stroke: new ol.style.Stroke({
+        color: '#f0f',
+        width: 1
+      })
+    })
+  })],
+  'MultiLineString': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: '#0f0',
+      width: 3
+    })
+  })],
+  'MultiPolygon': [new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: 'rgba(0,0,255,0.5)'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#00f',
+      width: 1
+    })
+  })]
+};
+
+var styleFunction = function(feature, resolution) {
+  var featureStyleFunction = feature.getStyleFunction();
+  if (featureStyleFunction) {
+    return featureStyleFunction.call(feature, resolution);
+  } else {
+    return defaultStyle[feature.getGeometry().getType()];
+  }
+};
+
+var dragAndDropInteraction = new ol.interaction.DragAndDrop({
+  formatConstructors: [
+    ol.format.GPX,
+    ol.format.GeoJSON,
+    ol.format.IGC,
+    ol.format.KML,
+    ol.format.TopoJSON
+  ]
+});
+
+var map = new ol.Map({
+  interactions: ol.interaction.defaults().extend([dragAndDropInteraction]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.BingMaps({
+        imagerySet: 'Aerial',
+        key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'
+      })
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+dragAndDropInteraction.on('addfeatures', function(event) {
+  var vectorSource = new ol.source.Vector({
+    features: event.features,
+    projection: event.projection
+  });
+  map.getLayers().push(new ol.layer.Vector({
+    source: vectorSource,
+    style: styleFunction
+  }));
+  var view = map.getView();
+  view.fitExtent(
+      vectorSource.getExtent(), /** @type {ol.Size} */ (map.getSize()));
+});
+
+var displayFeatureInfo = function(pixel) {
+  var features = [];
+  map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    features.push(feature);
+  });
+  if (features.length > 0) {
+    var info = [];
+    var i, ii;
+    for (i = 0, ii = features.length; i < ii; ++i) {
+      info.push(features[i].get('name'));
+    }
+    document.getElementById('info').innerHTML = info.join(', ') || '&nbsp';
+  } else {
+    document.getElementById('info').innerHTML = ' ';
+  }
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var pixel = map.getEventPixel(evt.originalEvent);
+  displayFeatureInfo(pixel);
+});
+
+map.on('click', function(evt) {
+  displayFeatureInfo(evt.pixel);
+});
diff --git a/examples/drag-features.html b/examples/drag-features.html
new file mode 100644
index 0000000..109afa0
--- /dev/null
+++ b/examples/drag-features.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Drag features example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Drag features example</h4>
+          <p id="shortdesc">Example of a drag features interaction.</p>
+          <div id="docs">
+            <p>See the <a href="drag-features.js" target="_blank">drag-features.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">drag, feature, vector, editing</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=drag-features" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/drag-features.js b/examples/drag-features.js
new file mode 100644
index 0000000..faff5ae
--- /dev/null
+++ b/examples/drag-features.js
@@ -0,0 +1,192 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Pointer');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.TileJSON');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Icon');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+/**
+ * Define a namespace for the application.
+ */
+window.app = {};
+var app = window.app;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ */
+app.Drag = function() {
+
+  ol.interaction.Pointer.call(this, {
+    handleDownEvent: app.Drag.prototype.handleDownEvent,
+    handleDragEvent: app.Drag.prototype.handleDragEvent,
+    handleMoveEvent: app.Drag.prototype.handleMoveEvent,
+    handleUpEvent: app.Drag.prototype.handleUpEvent
+  });
+
+  /**
+   * @type {ol.Pixel}
+   * @private
+   */
+  this.coordinate_ = null;
+
+  /**
+   * @type {string|undefined}
+   * @private
+   */
+  this.cursor_ = 'pointer';
+
+  /**
+   * @type {ol.Feature}
+   * @private
+   */
+  this.feature_ = null;
+
+  /**
+   * @type {string|undefined}
+   * @private
+   */
+  this.previousCursor_ = undefined;
+
+};
+ol.inherits(app.Drag, ol.interaction.Pointer);
+
+
+/**
+ * @param {ol.MapBrowserEvent} evt Map browser event.
+ * @return {boolean} `true` to start the drag sequence.
+ */
+app.Drag.prototype.handleDownEvent = function(evt) {
+  var map = evt.map;
+
+  var feature = map.forEachFeatureAtPixel(evt.pixel,
+      function(feature, layer) {
+        return feature;
+      });
+
+  if (feature) {
+    this.coordinate_ = evt.coordinate;
+    this.feature_ = feature;
+  }
+
+  return !!feature;
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} evt Map browser event.
+ */
+app.Drag.prototype.handleDragEvent = function(evt) {
+  var map = evt.map;
+
+  var feature = map.forEachFeatureAtPixel(evt.pixel,
+      function(feature, layer) {
+        return feature;
+      });
+
+  var deltaX = evt.coordinate[0] - this.coordinate_[0];
+  var deltaY = evt.coordinate[1] - this.coordinate_[1];
+
+  var geometry = /** @type {ol.geom.SimpleGeometry} */
+      (this.feature_.getGeometry());
+  geometry.translate(deltaX, deltaY);
+
+  this.coordinate_[0] = evt.coordinate[0];
+  this.coordinate_[1] = evt.coordinate[1];
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} evt Event.
+ */
+app.Drag.prototype.handleMoveEvent = function(evt) {
+  if (this.cursor_) {
+    var map = evt.map;
+    var feature = map.forEachFeatureAtPixel(evt.pixel,
+        function(feature, layer) {
+          return feature;
+        });
+    var element = evt.map.getTargetElement();
+    if (feature) {
+      if (element.style.cursor != this.cursor_) {
+        this.previousCursor_ = element.style.cursor;
+        element.style.cursor = this.cursor_;
+      }
+    } else if (this.previousCursor_ !== undefined) {
+      element.style.cursor = this.previousCursor_;
+      this.previousCursor_ = undefined;
+    }
+  }
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} evt Map browser event.
+ * @return {boolean} `false` to stop the drag sequence.
+ */
+app.Drag.prototype.handleUpEvent = function(evt) {
+  this.coordinate_ = null;
+  this.feature_ = null;
+  return false;
+};
+
+
+var pointFeature = new ol.Feature(new ol.geom.Point([0, 0]));
+
+var lineFeature = new ol.Feature(
+    new ol.geom.LineString([[-1e7, 1e6], [-1e6, 3e6]]));
+
+var polygonFeature = new ol.Feature(
+    new ol.geom.Polygon([[[-3e6, -1e6], [-3e6, 1e6],
+        [-1e6, 1e6], [-1e6, -1e6], [-3e6, -1e6]]]));
+
+
+var map = new ol.Map({
+  interactions: ol.interaction.defaults().extend([new app.Drag()]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.TileJSON({
+        url: 'http://api.tiles.mapbox.com/v3/mapbox.geography-class.jsonp'
+      })
+    }),
+    new ol.layer.Vector({
+      source: new ol.source.Vector({
+        features: [pointFeature, lineFeature, polygonFeature]
+      }),
+      style: new ol.style.Style({
+        image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
+          anchor: [0.5, 46],
+          anchorXUnits: 'fraction',
+          anchorYUnits: 'pixels',
+          opacity: 0.95,
+          src: 'data/icon.png'
+        })),
+        stroke: new ol.style.Stroke({
+          width: 3,
+          color: [255, 0, 0, 1]
+        }),
+        fill: new ol.style.Fill({
+          color: [0, 0, 255, 0.6]
+        })
+      })
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/drag-rotate-and-zoom.html b/examples/drag-rotate-and-zoom.html
new file mode 100644
index 0000000..5dcb3fe
--- /dev/null
+++ b/examples/drag-rotate-and-zoom.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Drag rotate and zoom example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Drag rotate and zoom example</h4>
+          <p id="shortdesc">A single interaction to drag, rotate, and zoom.</p>
+          <div id="docs">
+            <p><code>Shift</code> + Drag to rotate and zoom the map around its center.</p>
+            <p>See the <a href="drag-rotate-and-zoom.js" target="_blank">drag-rotate-and-zoom.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">drag, rotate, zoom, interaction</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=drag-rotate-and-zoom" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/drag-rotate-and-zoom.js b/examples/drag-rotate-and-zoom.js
new file mode 100644
index 0000000..50dd2f1
--- /dev/null
+++ b/examples/drag-rotate-and-zoom.js
@@ -0,0 +1,24 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.interaction');
+goog.require('ol.interaction.DragRotateAndZoom');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.MapQuest');
+
+
+var map = new ol.Map({
+  interactions: ol.interaction.defaults().extend([
+    new ol.interaction.DragRotateAndZoom()
+  ]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuest({layer: 'sat'})
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/draw-and-modify-features.html b/examples/draw-and-modify-features.html
new file mode 100644
index 0000000..277812d
--- /dev/null
+++ b/examples/draw-and-modify-features.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Draw and modify features example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Draw and modify features example</h4>
+          <p id="shortdesc">Example of using the ol.interaction.Draw interaction together with
+          the ol.interaction.Modify interaction.</p>
+          <form class="form-inline">
+            <label>Geometry type  </label>
+              <select id="type">
+                <option value="Point">Point</option>
+                <option value="LineString">LineString</option>
+                <option value="Polygon">Polygon</option>
+              </select>
+          </form>
+
+          <div id="docs">
+            <p>See the <a href="draw-and-modify-features.js" target="_blank">draw-and-modify-features.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">draw, edit, modify, vector, featureoverlay</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=draw-and-modify-features" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/draw-and-modify-features.js b/examples/draw-and-modify-features.js
new file mode 100644
index 0000000..d6c1de8
--- /dev/null
+++ b/examples/draw-and-modify-features.js
@@ -0,0 +1,84 @@
+goog.require('ol.FeatureOverlay');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.events.condition');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Draw');
+goog.require('ol.interaction.Modify');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.MapQuest');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.MapQuest({layer: 'sat'})
+});
+
+var map = new ol.Map({
+  layers: [raster],
+  target: 'map',
+  view: new ol.View({
+    center: [-11000000, 4600000],
+    zoom: 4
+  })
+});
+
+// The features are not added to a regular vector layer/source,
+// but to a feature overlay which holds a collection of features.
+// This collection is passed to the modify and also the draw
+// interaction, so that both can add or modify features.
+var featureOverlay = new ol.FeatureOverlay({
+  style: new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: 'rgba(255, 255, 255, 0.2)'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#ffcc33',
+      width: 2
+    }),
+    image: new ol.style.Circle({
+      radius: 7,
+      fill: new ol.style.Fill({
+        color: '#ffcc33'
+      })
+    })
+  })
+});
+featureOverlay.setMap(map);
+
+var modify = new ol.interaction.Modify({
+  features: featureOverlay.getFeatures(),
+  // the SHIFT key must be pressed to delete vertices, so
+  // that new vertices can be drawn at the same position
+  // of existing vertices
+  deleteCondition: function(event) {
+    return ol.events.condition.shiftKeyOnly(event) &&
+        ol.events.condition.singleClick(event);
+  }
+});
+map.addInteraction(modify);
+
+var draw; // global so we can remove it later
+function addInteraction() {
+  draw = new ol.interaction.Draw({
+    features: featureOverlay.getFeatures(),
+    type: /** @type {ol.geom.GeometryType} */ (typeSelect.value)
+  });
+  map.addInteraction(draw);
+}
+
+var typeSelect = document.getElementById('type');
+
+
+/**
+ * Let user change the geometry type.
+ * @param {Event} e Change event.
+ */
+typeSelect.onchange = function(e) {
+  map.removeInteraction(draw);
+  addInteraction();
+};
+
+addInteraction();
diff --git a/examples/draw-features.html b/examples/draw-features.html
new file mode 100644
index 0000000..229155f
--- /dev/null
+++ b/examples/draw-features.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Draw features example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Draw features example</h4>
+          <p id="shortdesc">Example of using the ol.interaction.Draw interaction.</p>
+          <form class="form-inline">
+            <label>Geometry type  </label>
+              <select id="type">
+                <option value="None">None</option>
+                <option value="Point">Point</option>
+                <option value="LineString">LineString</option>
+                <option value="Polygon">Polygon</option>
+              </select>
+          </form>
+
+          <div id="docs">
+            <p>See the <a href="draw-features.js" target="_blank">draw-features.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">draw, edit, vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=draw-features" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/draw-features.js b/examples/draw-features.js
new file mode 100644
index 0000000..dc66e2c
--- /dev/null
+++ b/examples/draw-features.js
@@ -0,0 +1,73 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Draw');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.MapQuest');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.MapQuest({layer: 'sat'})
+});
+
+var source = new ol.source.Vector();
+
+var vector = new ol.layer.Vector({
+  source: source,
+  style: new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: 'rgba(255, 255, 255, 0.2)'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#ffcc33',
+      width: 2
+    }),
+    image: new ol.style.Circle({
+      radius: 7,
+      fill: new ol.style.Fill({
+        color: '#ffcc33'
+      })
+    })
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [-11000000, 4600000],
+    zoom: 4
+  })
+});
+
+var typeSelect = document.getElementById('type');
+
+var draw; // global so we can remove it later
+function addInteraction() {
+  var value = typeSelect.value;
+  if (value !== 'None') {
+    draw = new ol.interaction.Draw({
+      source: source,
+      type: /** @type {ol.geom.GeometryType} */ (value)
+    });
+    map.addInteraction(draw);
+  }
+}
+
+
+/**
+ * Let user change the geometry type.
+ * @param {Event} e Change event.
+ */
+typeSelect.onchange = function(e) {
+  map.removeInteraction(draw);
+  addInteraction();
+};
+
+addInteraction();
diff --git a/examples/dynamic-data.html b/examples/dynamic-data.html
new file mode 100644
index 0000000..b7ea32d
--- /dev/null
+++ b/examples/dynamic-data.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Dynamic data example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Dynamic data example</h4>
+          <p id="shortdesc">Example of dynamic data.</p>
+          <div id="docs">
+            <p>See the <a href="dynamic-data.js" target="_blank">dynamic-data.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">dynamic-data</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=dynamic-data" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/dynamic-data.js b/examples/dynamic-data.js
new file mode 100644
index 0000000..793d4ef
--- /dev/null
+++ b/examples/dynamic-data.js
@@ -0,0 +1,79 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.MapQuest');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuest({layer: 'sat'})
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var imageStyle = new ol.style.Circle({
+  radius: 5,
+  snapToPixel: false,
+  fill: new ol.style.Fill({color: 'yellow'}),
+  stroke: new ol.style.Stroke({color: 'red', width: 1})
+});
+
+var headInnerImageStyle = new ol.style.Style({
+  image: new ol.style.Circle({
+    radius: 2,
+    snapToPixel: false,
+    fill: new ol.style.Fill({color: 'blue'})
+  })
+});
+
+var headOuterImageStyle = new ol.style.Circle({
+  radius: 5,
+  snapToPixel: false,
+  fill: new ol.style.Fill({color: 'black'})
+});
+
+var n = 200;
+var omegaTheta = 30000; // Rotation period in ms
+var R = 7e6;
+var r = 2e6;
+var p = 2e6;
+map.on('postcompose', function(event) {
+  var vectorContext = event.vectorContext;
+  var frameState = event.frameState;
+  var theta = 2 * Math.PI * frameState.time / omegaTheta;
+  var coordinates = [];
+  var i;
+  for (i = 0; i < n; ++i) {
+    var t = theta + 2 * Math.PI * i / n;
+    var x = (R + r) * Math.cos(t) + p * Math.cos((R + r) * t / r);
+    var y = (R + r) * Math.sin(t) + p * Math.sin((R + r) * t / r);
+    coordinates.push([x, y]);
+  }
+  vectorContext.setImageStyle(imageStyle);
+  vectorContext.drawMultiPointGeometry(
+      new ol.geom.MultiPoint(coordinates), null);
+
+  var headPoint = new ol.geom.Point(coordinates[coordinates.length - 1]);
+  var headFeature = new ol.Feature(headPoint);
+  vectorContext.drawFeature(headFeature, headInnerImageStyle);
+
+  vectorContext.setImageStyle(headOuterImageStyle);
+  vectorContext.drawMultiPointGeometry(headPoint, null);
+
+  map.render();
+});
+map.render();
diff --git a/examples/earthquake-clusters.html b/examples/earthquake-clusters.html
new file mode 100644
index 0000000..d3f630e
--- /dev/null
+++ b/examples/earthquake-clusters.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Earthquake Clusters</title>
+    <style>
+      #map {
+        position: relative;
+      }
+      #info {
+        position: absolute;
+        height: 1px;
+        width: 1px;
+        z-index: 100;
+      }
+      .tooltip.in {
+        opacity: 1;
+        filter: alpha(opacity=100);
+      }
+      .tooltip.top .tooltip-arrow {
+        border-top-color: white;
+      }
+      .tooltip-inner {
+        border: 2px solid white;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Earthquake Clusters</h4>
+          <p id="shortdesc">Demonstrates the use of style geometries to render source features of a cluster.</p>
+          <div id="docs">
+            <p>
+              This example parses a KML file and renders the features as clusters on a vector layer.  The styling in this example is quite involved. Single earthquake locations (rendered as stars) have a size relative to their magnitude. Clusters have an opacity relative to the number of features in the cluster, and a size that represents the extent of the features that make up the cluster. When clicking or hovering on a cluster, the individual features that make up the cluster will be shown.
+            </p>
+            <p>To achieve this, we make heavy use of style functions and <code>ol.style.Style#geometry</code>. See the <a href="earthquake-clusters.js" target="_blank">earthquake-clusters.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">KML, vector, style, geometry, cluster</div>
+        </div>
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=earthquake-clusters" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/earthquake-clusters.js b/examples/earthquake-clusters.js
new file mode 100644
index 0000000..0850960
--- /dev/null
+++ b/examples/earthquake-clusters.js
@@ -0,0 +1,154 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.extent');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Select');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Cluster');
+goog.require('ol.source.KML');
+goog.require('ol.source.Stamen');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.RegularShape');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.style.Text');
+
+
+var earthquakeFill = new ol.style.Fill({
+  color: 'rgba(255, 153, 0, 0.8)'
+});
+var earthquakeStroke = new ol.style.Stroke({
+  color: 'rgba(255, 204, 0, 0.2)',
+  width: 1
+});
+var textFill = new ol.style.Fill({
+  color: '#fff'
+});
+var textStroke = new ol.style.Stroke({
+  color: 'rgba(0, 0, 0, 0.6)',
+  width: 3
+});
+var invisibleFill = new ol.style.Fill({
+  color: 'rgba(255, 255, 255, 0.01)'
+});
+
+function createEarthquakeStyle(feature) {
+  // 2012_Earthquakes_Mag5.kml stores the magnitude of each earthquake in a
+  // standards-violating <magnitude> tag in each Placemark.  We extract it
+  // from the Placemark's name instead.
+  var name = feature.get('name');
+  var magnitude = parseFloat(name.substr(2));
+  var radius = 5 + 20 * (magnitude - 5);
+
+  return new ol.style.Style({
+    geometry: feature.getGeometry(),
+    image: new ol.style.RegularShape({
+      radius1: radius,
+      radius2: 3,
+      points: 5,
+      angle: Math.PI,
+      fill: earthquakeFill,
+      stroke: earthquakeStroke
+    })
+  });
+}
+
+var maxFeatureCount;
+function calculateClusterInfo(resolution) {
+  maxFeatureCount = 0;
+  var features = vector.getSource().getFeatures();
+  var feature, radius;
+  for (var i = features.length - 1; i >= 0; --i) {
+    feature = features[i];
+    var originalFeatures = feature.get('features');
+    var extent = ol.extent.createEmpty();
+    for (var j = 0, jj = originalFeatures.length; j < jj; ++j) {
+      ol.extent.extend(extent, originalFeatures[j].getGeometry().getExtent());
+    }
+    maxFeatureCount = Math.max(maxFeatureCount, jj);
+    radius = 0.25 * (ol.extent.getWidth(extent) + ol.extent.getHeight(extent)) /
+        resolution;
+    feature.set('radius', radius);
+  }
+}
+
+var currentResolution;
+function styleFunction(feature, resolution) {
+  if (resolution != currentResolution) {
+    calculateClusterInfo(resolution);
+    currentResolution = resolution;
+  }
+  var style;
+  var size = feature.get('features').length;
+  if (size > 1) {
+    style = [new ol.style.Style({
+      image: new ol.style.Circle({
+        radius: feature.get('radius'),
+        fill: new ol.style.Fill({
+          color: [255, 153, 0, Math.min(0.8, 0.4 + (size / maxFeatureCount))]
+        })
+      }),
+      text: new ol.style.Text({
+        text: size.toString(),
+        fill: textFill,
+        stroke: textStroke
+      })
+    })];
+  } else {
+    var originalFeature = feature.get('features')[0];
+    style = [createEarthquakeStyle(originalFeature)];
+  }
+  return style;
+}
+
+function selectStyleFunction(feature, resolution) {
+  var styles = [new ol.style.Style({
+    image: new ol.style.Circle({
+      radius: feature.get('radius'),
+      fill: invisibleFill
+    })
+  })];
+  var originalFeatures = feature.get('features');
+  var originalFeature;
+  for (var i = originalFeatures.length - 1; i >= 0; --i) {
+    originalFeature = originalFeatures[i];
+    styles.push(createEarthquakeStyle(originalFeature));
+  }
+  return styles;
+}
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.Cluster({
+    distance: 40,
+    source: new ol.source.KML({
+      extractStyles: false,
+      projection: 'EPSG:3857',
+      url: 'data/kml/2012_Earthquakes_Mag5.kml'
+    })
+  }),
+  style: styleFunction
+});
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.Stamen({
+    layer: 'toner'
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  interactions: ol.interaction.defaults().extend([new ol.interaction.Select({
+    condition: function(evt) {
+      return evt.originalEvent.type == 'mousemove' ||
+          evt.type == 'singleclick';
+    },
+    style: selectStyleFunction
+  })]),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/epsg-4326.html b/examples/epsg-4326.html
new file mode 100644
index 0000000..8fd47ec
--- /dev/null
+++ b/examples/epsg-4326.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>EPSG:4326 example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">EPSG:4326 example</h4>
+          <p id="shortdesc">Example of a map in EPSG:4326.</p>
+          <div id="docs">
+            <p>See the <a href="epsg-4326.js" target="_blank">epsg-4326.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">epsg4326</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=epsg-4326" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/epsg-4326.js b/examples/epsg-4326.js
new file mode 100644
index 0000000..d5ee910
--- /dev/null
+++ b/examples/epsg-4326.js
@@ -0,0 +1,33 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.ScaleLine');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.TileWMS');
+
+
+var layers = [
+  new ol.layer.Tile({
+    source: new ol.source.TileWMS({
+      url: 'http://demo.boundlessgeo.com/geoserver/wms',
+      params: {
+        'LAYERS': 'ne:NE1_HR_LC_SR_W_DR'
+      }
+    })
+  })
+];
+
+var map = new ol.Map({
+  controls: ol.control.defaults().extend([
+    new ol.control.ScaleLine({
+      units: 'degrees'
+    })
+  ]),
+  layers: layers,
+  target: 'map',
+  view: new ol.View({
+    projection: 'EPSG:4326',
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/export-map.html b/examples/export-map.html
new file mode 100644
index 0000000..a076633
--- /dev/null
+++ b/examples/export-map.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Export map example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+          <div id="no-download" class="alert alert-error" style="display: none">
+            This example requires a browser that supports the
+            <a href="http://caniuse.com/#feat=download">link download</a> attribute.
+          </div>
+          <a id="export-png" class="btn" download="map.png"><i class="icon-download"></i> Export PNG</a>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Export map example</h4>
+          <p id="shortdesc">Example of exporting a map as a PNG image.</p>
+          <div id="docs">
+            <p>See the <a href="export-map.js" target="_blank">export-map.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">export, png, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=export-map" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/export-map.js b/examples/export-map.js
new file mode 100644
index 0000000..f55f940
--- /dev/null
+++ b/examples/export-map.js
@@ -0,0 +1,49 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.OSM');
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    }),
+    new ol.layer.Vector({
+      source: new ol.source.GeoJSON({
+        projection: 'EPSG:3857',
+        url: 'data/geojson/countries.geojson'
+      })
+    })
+  ],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var exportPNGElement = document.getElementById('export-png');
+
+if ('download' in exportPNGElement) {
+  exportPNGElement.addEventListener('click', function(e) {
+    map.once('postcompose', function(event) {
+      var canvas = event.context.canvas;
+      exportPNGElement.href = canvas.toDataURL('image/png');
+    });
+    map.renderSync();
+  }, false);
+} else {
+  var info = document.getElementById('no-download');
+  /**
+   * display error message
+   */
+  info.style.display = '';
+}
diff --git a/examples/fractal.html b/examples/fractal.html
new file mode 100644
index 0000000..4904d81
--- /dev/null
+++ b/examples/fractal.html
@@ -0,0 +1,64 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Fractal Example</title>
+    <style>
+      .map {
+        background: whitesmoke;
+      }
+      #depth {
+        width: 100px;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>        
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Fractal Example</h4>
+          <p id="shortdesc">Example of a fractal.</p>
+          <label for="depth">
+            depth: 
+            <input id="depth" type="range" min="0" max="9" step="1" value="5">
+             (<span id="count">#</span> points)
+          </label>
+          <div id="docs">
+            <p>See the <a href="fractal.js" target="_blank">fractal.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">fractal, vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=fractal" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/fractal.js b/examples/fractal.js
new file mode 100644
index 0000000..fb0cbea
--- /dev/null
+++ b/examples/fractal.js
@@ -0,0 +1,124 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.LineString');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Vector');
+
+var radius = 10e6;
+var cos30 = Math.cos(Math.PI / 6);
+var sin30 = Math.sin(Math.PI / 6);
+var rise = radius * sin30;
+var run = radius * cos30;
+
+var triangle = new ol.geom.LineString([
+  [0, radius], [run, -rise], [-run, -rise], [0, radius]
+]);
+
+var feature = new ol.Feature(triangle);
+
+var layer = new ol.layer.Vector({
+  source: new ol.source.Vector({
+    features: [feature]
+  })
+});
+
+var map = new ol.Map({
+  layers: [layer],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 1
+  })
+});
+
+function makeFractal(depth) {
+  var geometry = /** @type {ol.geom.LineString} */ (triangle.clone());
+  var graph = coordsToGraph(geometry.getCoordinates());
+  for (var i = 0; i < depth; ++i) {
+    var node = graph;
+    while (node.next) {
+      var next = node.next;
+      injectNodes(node);
+      node = next;
+    }
+  }
+  var coordinates = graphToCoords(graph);
+  document.getElementById('count').innerHTML = coordinates.length;
+  geometry.setCoordinates(coordinates);
+  feature.setGeometry(geometry);
+}
+
+function injectNodes(startNode) {
+  var endNode = startNode.next;
+
+  var start = startNode.point;
+  var end = startNode.next.point;
+  var dx = end[0] - start[0];
+  var dy = end[1] - start[1];
+
+  // first point at 1/3 along the segment
+  var firstNode = {
+    point: [start[0] + dx / 3, start[1] + dy / 3]
+  };
+
+  // second point at peak of _/\_
+  var r = Math.sqrt(dx * dx + dy * dy) / (2 * cos30);
+  var a = Math.atan2(dy, dx) + Math.PI / 6;
+  var secondNode = {
+    point: [start[0] + r * Math.cos(a), start[1] + r * Math.sin(a)]
+  };
+
+  // third point at 2/3 along the segment
+  var thirdNode = {
+    point: [end[0] - dx / 3, end[1] - dy / 3]
+  };
+
+  startNode.next = firstNode;
+  firstNode.next = secondNode;
+  secondNode.next = thirdNode;
+  thirdNode.next = endNode;
+}
+
+
+function coordsToGraph(coordinates) {
+  var graph = {
+    point: coordinates[0]
+  };
+  var length = coordinates.length;
+  for (var level = 0, node = graph; level < length - 1; ++level) {
+    node.next = {
+      point: coordinates[level + 1]
+    };
+    node = node.next;
+  }
+  return graph;
+}
+
+function graphToCoords(graph) {
+  var coordinates = [graph.point];
+  for (var node = graph, i = 1; node.next; node = node.next, ++i) {
+    coordinates[i] = node.next.point;
+  }
+  return coordinates;
+}
+
+var depthInput = document.getElementById('depth');
+
+function update() {
+  makeFractal(Number(depthInput.value));
+}
+
+var updateTimer;
+
+
+/**
+ * Regenerate fractal on depth change.  Change events are debounced so updates
+ * only occur every 200ms.
+ */
+depthInput.onchange = function() {
+  window.clearTimeout(updateTimer);
+  updateTimer = window.setTimeout(update, 200);
+};
+
+update();
diff --git a/examples/full-screen-drag-rotate-and-zoom.html b/examples/full-screen-drag-rotate-and-zoom.html
new file mode 100644
index 0000000..698181d
--- /dev/null
+++ b/examples/full-screen-drag-rotate-and-zoom.html
@@ -0,0 +1,64 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style>
+      .map:-moz-full-screen {
+        height: 100%;
+      }
+      .map:-webkit-full-screen {
+        height: 100%;
+      }
+      .map:full-screen {
+        height: 100%;
+      }
+    </style>
+    <title>Full screen drag rotate and zoom example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Full screen drag rotate and zoom example</h4>
+          <p id="shortdesc">Example of drag rotate and zoom control with full screen effect.</p>
+          <div id="docs">
+            <p>Hold down <code>Shift</code> + drag to rotate and zoom.  Click the button in the top right corner to go full screen.  Then do the <code>Shift</code> + drag thing again.</p>
+            <p>If there is no button on the map, your browser does not support the <a href="http://caniuse.com/#feat=fullscreen">Full Screen API</a>.</p>
+            <p>See the <a href="full-screen-drag-rotate-and-zoom.js" target="_blank">full-screen-drag-rotate-and-zoom.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">full-screen, drag, rotate, zoom, bing, bing-maps</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=full-screen-drag-rotate-and-zoom" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/full-screen-drag-rotate-and-zoom.js b/examples/full-screen-drag-rotate-and-zoom.js
new file mode 100644
index 0000000..c96130a
--- /dev/null
+++ b/examples/full-screen-drag-rotate-and-zoom.js
@@ -0,0 +1,33 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.FullScreen');
+goog.require('ol.interaction');
+goog.require('ol.interaction.DragRotateAndZoom');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.BingMaps');
+
+
+var map = new ol.Map({
+  controls: ol.control.defaults().extend([
+    new ol.control.FullScreen()
+  ]),
+  interactions: ol.interaction.defaults().extend([
+    new ol.interaction.DragRotateAndZoom()
+  ]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.BingMaps({
+        key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+        imagerySet: 'Aerial'
+      })
+    })
+  ],
+  // Use the canvas renderer because it's currently the fastest
+  target: 'map',
+  view: new ol.View({
+    center: [-33519607, 5616436],
+    rotation: -Math.PI / 8,
+    zoom: 8
+  })
+});
diff --git a/examples/full-screen.html b/examples/full-screen.html
new file mode 100644
index 0000000..da9b8e6
--- /dev/null
+++ b/examples/full-screen.html
@@ -0,0 +1,70 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style>
+      .map:-moz-full-screen {
+        height: 100%;
+      }
+      .map:-webkit-full-screen {
+        height: 100%;
+      }
+      .map:-ms-fullscreen {
+        height: 100%;
+      }
+      .map:full-screen {
+        height: 100%;
+      }
+      .ol-rotate {
+        top: 3em;
+      }
+    </style>
+    <title>Full screen control example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Full screen control example</h4>
+          <p id="shortdesc">Example of a full screen control.</p>
+          <div id="docs">
+            <p>Click the control in the top right corner to go full screen.  Click it again to exit full screen.</p>
+            <p>If there is no button on the map, your browser does not support the <a href="http://caniuse.com/#feat=fullscreen">Full Screen API</a>.</p>
+            <p>See the <a href="full-screen.js" target="_blank">full-screen.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">full-screen, bing, bing-maps</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=full-screen" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/full-screen.js b/examples/full-screen.js
new file mode 100644
index 0000000..f23b983
--- /dev/null
+++ b/examples/full-screen.js
@@ -0,0 +1,29 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.FullScreen');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.BingMaps');
+
+
+var view = new ol.View({
+  center: [-9101767, 2822912],
+  zoom: 14
+});
+
+var map = new ol.Map({
+  controls: ol.control.defaults().extend([
+    new ol.control.FullScreen()
+  ]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.BingMaps({
+        key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+        imagerySet: 'Aerial'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: view
+});
diff --git a/examples/geojson.html b/examples/geojson.html
new file mode 100644
index 0000000..54cc237
--- /dev/null
+++ b/examples/geojson.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>GeoJSON example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">GeoJSON example</h4>
+          <p id="shortdesc">Example of GeoJSON features.</p>
+          <div id="docs">
+            <p>See the <a href="geojson.js" target="_blank">geojson.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">geojson, vector, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=geojson" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/geojson.js b/examples/geojson.js
new file mode 100644
index 0000000..4674cf4
--- /dev/null
+++ b/examples/geojson.js
@@ -0,0 +1,201 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.geom.Circle');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.OSM');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var image = new ol.style.Circle({
+  radius: 5,
+  fill: null,
+  stroke: new ol.style.Stroke({color: 'red', width: 1})
+});
+
+var styles = {
+  'Point': [new ol.style.Style({
+    image: image
+  })],
+  'LineString': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'green',
+      width: 1
+    })
+  })],
+  'MultiLineString': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'green',
+      width: 1
+    })
+  })],
+  'MultiPoint': [new ol.style.Style({
+    image: image
+  })],
+  'MultiPolygon': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'yellow',
+      width: 1
+    }),
+    fill: new ol.style.Fill({
+      color: 'rgba(255, 255, 0, 0.1)'
+    })
+  })],
+  'Polygon': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'blue',
+      lineDash: [4],
+      width: 3
+    }),
+    fill: new ol.style.Fill({
+      color: 'rgba(0, 0, 255, 0.1)'
+    })
+  })],
+  'GeometryCollection': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'magenta',
+      width: 2
+    }),
+    fill: new ol.style.Fill({
+      color: 'magenta'
+    }),
+    image: new ol.style.Circle({
+      radius: 10,
+      fill: null,
+      stroke: new ol.style.Stroke({
+        color: 'magenta'
+      })
+    })
+  })],
+  'Circle': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'red',
+      width: 2
+    }),
+    fill: new ol.style.Fill({
+      color: 'rgba(255,0,0,0.2)'
+    })
+  })]
+};
+
+var styleFunction = function(feature, resolution) {
+  return styles[feature.getGeometry().getType()];
+};
+
+var vectorSource = new ol.source.GeoJSON(
+    /** @type {olx.source.GeoJSONOptions} */ ({
+      object: {
+        'type': 'FeatureCollection',
+        'crs': {
+          'type': 'name',
+          'properties': {
+            'name': 'EPSG:3857'
+          }
+        },
+        'features': [
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'Point',
+              'coordinates': [0, 0]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'LineString',
+              'coordinates': [[4e6, -2e6], [8e6, 2e6]]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'LineString',
+              'coordinates': [[4e6, 2e6], [8e6, -2e6]]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'Polygon',
+              'coordinates': [[[-5e6, -1e6], [-4e6, 1e6], [-3e6, -1e6]]]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'MultiLineString',
+              'coordinates': [
+                [[-1e6, -7.5e5], [-1e6, 7.5e5]],
+                [[1e6, -7.5e5], [1e6, 7.5e5]],
+                [[-7.5e5, -1e6], [7.5e5, -1e6]],
+                [[-7.5e5, 1e6], [7.5e5, 1e6]]
+              ]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'MultiPolygon',
+              'coordinates': [
+                [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], [-3e6, 6e6]]],
+                [[[-2e6, 6e6], [-2e6, 8e6], [0, 8e6], [0, 6e6]]],
+                [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6], [3e6, 6e6]]]
+              ]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'GeometryCollection',
+              'geometries': [
+                {
+                  'type': 'LineString',
+                  'coordinates': [[-5e6, -5e6], [0, -5e6]]
+                },
+                {
+                  'type': 'Point',
+                  'coordinates': [4e6, -5e6]
+                },
+                {
+                  'type': 'Polygon',
+                  'coordinates': [[[1e6, -6e6], [2e6, -4e6], [3e6, -6e6]]]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    }));
+
+vectorSource.addFeature(new ol.Feature(new ol.geom.Circle([5e6, 7e6], 1e6)));
+
+var vectorLayer = new ol.layer.Vector({
+  source: vectorSource,
+  style: styleFunction
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    }),
+    vectorLayer
+  ],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/geolocation-orientation.html b/examples/geolocation-orientation.html
new file mode 100644
index 0000000..5dd4fe3
--- /dev/null
+++ b/examples/geolocation-orientation.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Mobile Geolocation Tracking with Orientation</title>
+    <style type="text/css">
+      html, body, .map {
+        margin: 0;
+        padding: 0;
+        width: 100%;
+        height: 100%;
+      }
+      #info {
+          position: absolute;
+          font-size: 0.7em;
+          top: 10px;
+          right: 10px;
+          background-color: lightgrey;
+          padding: 4px;
+      }
+      .button {
+          position: absolute;
+          bottom: 40px;
+          left: 10px;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="map" class="map"></div>
+    <div id="info"></div>
+    <img id="geolocation_marker" src="data/geolocation_marker.png" />
+    <div class="button">
+        <button id="geolocate">Geolocate Me!</button>
+        <button id="simulate">Simulate</button>
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=geolocation-orientation" type="text/javascript"></script>
+
+    <div style="display: none;">
+      <div id="title">Geolocation tracking with orientation example</div>
+      <div id="shortdesc">Example of a geolocated and oriented map.</div>
+      <div id="tags">fullscreen, geolocation, orientation, mobile</div>
+    </div>
+  </body>
+</html>
diff --git a/examples/geolocation-orientation.js b/examples/geolocation-orientation.js
new file mode 100644
index 0000000..a468dc9
--- /dev/null
+++ b/examples/geolocation-orientation.js
@@ -0,0 +1,229 @@
+goog.require('ol.Geolocation');
+goog.require('ol.Map');
+goog.require('ol.Overlay');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.geom.LineString');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+
+// creating the view
+var view = new ol.View({
+  center: ol.proj.transform([5.8713, 45.6452], 'EPSG:4326', 'EPSG:3857'),
+  zoom: 19
+});
+
+// creating the map
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: view
+});
+
+// Geolocation marker
+var markerEl = document.getElementById('geolocation_marker');
+var marker = new ol.Overlay({
+  positioning: 'center-center',
+  element: markerEl,
+  stopEvent: false
+});
+map.addOverlay(marker);
+
+// LineString to store the different geolocation positions. This LineString
+// is time aware.
+// The Z dimension is actually used to store the rotation (heading).
+var positions = new ol.geom.LineString([],
+    /** @type {ol.geom.GeometryLayout} */ ('XYZM'));
+
+// Geolocation Control
+var geolocation = new ol.Geolocation(/** @type {olx.GeolocationOptions} */ ({
+  projection: view.getProjection(),
+  trackingOptions: {
+    maximumAge: 10000,
+    enableHighAccuracy: true,
+    timeout: 600000
+  }
+}));
+
+var deltaMean = 500; // the geolocation sampling period mean in ms
+
+// Listen to position changes
+geolocation.on('change', function(evt) {
+  var position = geolocation.getPosition();
+  var accuracy = geolocation.getAccuracy();
+  var heading = geolocation.getHeading() || 0;
+  var speed = geolocation.getSpeed() || 0;
+  var m = Date.now();
+
+  addPosition(position, heading, m, speed);
+
+  var coords = positions.getCoordinates();
+  var len = coords.length;
+  if (len >= 2) {
+    deltaMean = (coords[len - 1][3] - coords[0][3]) / (len - 1);
+  }
+
+  var html = [
+    'Position: ' + position[0].toFixed(2) + ', ' + position[1].toFixed(2),
+    'Accuracy: ' + accuracy,
+    'Heading: ' + Math.round(radToDeg(heading)) + '°',
+    'Speed: ' + (speed * 3.6).toFixed(1) + ' km/h',
+    'Delta: ' + Math.round(deltaMean) + 'ms'
+  ].join('<br />');
+  document.getElementById('info').innerHTML = html;
+});
+
+geolocation.on('error', function() {
+  alert('geolocation error');
+  // FIXME we should remove the coordinates in positions
+});
+
+// convert radians to degrees
+function radToDeg(rad) {
+  return rad * 360 / (Math.PI * 2);
+}
+// convert degrees to radians
+function degToRad(deg) {
+  return deg * Math.PI * 2 / 360;
+}
+// modulo for negative values
+function mod(n) {
+  return ((n % (2 * Math.PI)) + (2 * Math.PI)) % (2 * Math.PI);
+}
+
+function addPosition(position, heading, m, speed) {
+  var x = position[0];
+  var y = position[1];
+  var fCoords = positions.getCoordinates();
+  var previous = fCoords[fCoords.length - 1];
+  var prevHeading = previous && previous[2];
+  if (prevHeading) {
+    var headingDiff = heading - mod(prevHeading);
+
+    // force the rotation change to be less than 180°
+    if (Math.abs(headingDiff) > Math.PI) {
+      var sign = (headingDiff >= 0) ? 1 : -1;
+      headingDiff = - sign * (2 * Math.PI - Math.abs(headingDiff));
+    }
+    heading = prevHeading + headingDiff;
+  }
+  positions.appendCoordinate([x, y, heading, m]);
+
+  // only keep the 20 last coordinates
+  positions.setCoordinates(positions.getCoordinates().slice(-20));
+
+  // FIXME use speed instead
+  if (heading && speed) {
+    markerEl.src = 'data/geolocation_marker_heading.png';
+  } else {
+    markerEl.src = 'data/geolocation_marker.png';
+  }
+}
+
+var previousM = 0;
+// change center and rotation before render
+map.beforeRender(function(map, frameState) {
+  if (frameState !== null) {
+    // use sampling period to get a smooth transition
+    var m = frameState.time - deltaMean * 1.5;
+    m = Math.max(m, previousM);
+    previousM = m;
+    // interpolate position along positions LineString
+    var c = positions.getCoordinateAtM(m, true);
+    var view = frameState.viewState;
+    if (c) {
+      view.center = getCenterWithHeading(c, -c[2], view.resolution);
+      view.rotation = -c[2];
+      marker.setPosition(c);
+    }
+  }
+  return true; // Force animation to continue
+});
+
+// recenters the view by putting the given coordinates at 3/4 from the top or
+// the screen
+function getCenterWithHeading(position, rotation, resolution) {
+  var size = map.getSize();
+  var height = size[1];
+
+  return [
+    position[0] - Math.sin(rotation) * height * resolution * 1 / 4,
+    position[1] + Math.cos(rotation) * height * resolution * 1 / 4
+  ];
+}
+
+// postcompose callback
+function render() {
+  map.render();
+}
+
+// geolocate device
+var geolocateBtn = document.getElementById('geolocate');
+geolocateBtn.addEventListener('click', function() {
+  geolocation.setTracking(true); // Start position tracking
+
+  map.on('postcompose', render);
+  map.render();
+
+  disableButtons();
+}, false);
+
+// simulate device move
+var simulationData;
+$.getJSON('data/geolocation-orientation.json', function(data) {
+  simulationData = data.data;
+});
+var simulateBtn = document.getElementById('simulate');
+simulateBtn.addEventListener('click', function() {
+  var coordinates = simulationData;
+
+  var first = coordinates.shift();
+  simulatePositionChange(first);
+
+  var prevDate = first.timestamp;
+  function geolocate() {
+    var position = coordinates.shift();
+    if (!position) {
+      return;
+    }
+    var newDate = position.timestamp;
+    simulatePositionChange(position);
+    window.setTimeout(function() {
+      prevDate = newDate;
+      geolocate();
+    }, (newDate - prevDate) / 0.5);
+  }
+  geolocate();
+
+  map.on('postcompose', render);
+  map.render();
+
+  disableButtons();
+}, false);
+
+function simulatePositionChange(position) {
+  var coords = position.coords;
+  geolocation.set('accuracy', coords.accuracy);
+  geolocation.set('heading', degToRad(coords.heading));
+  var position_ = [coords.longitude, coords.latitude];
+  var projectedPosition = ol.proj.transform(position_, 'EPSG:4326',
+      'EPSG:3857');
+  geolocation.set('position', projectedPosition);
+  geolocation.set('speed', coords.speed);
+  geolocation.changed();
+}
+
+function disableButtons() {
+  geolocateBtn.disabled = 'disabled';
+  simulateBtn.disabled = 'disabled';
+}
diff --git a/examples/geolocation.html b/examples/geolocation.html
new file mode 100644
index 0000000..b6cff88
--- /dev/null
+++ b/examples/geolocation.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Geolocation example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span8">
+          <h4 id="title">Geolocation example</h4>
+          <label class="checkbox" for="track">
+            <input id="track" type="checkbox"/>track position
+          </label>
+          <p>position accuracy : <code id="accuracy"></code></p>
+          <p>altitude : <code id="altitude"></code></p>
+          <p>altitude accuracy : <code id="altitudeAccuracy"></code></p>
+          <p>heading : <code id="heading"></code></p>
+          <p>speed : <code id="speed"></code></p>
+
+          <p id="shortdesc">Example of a geolocation map.</p>
+          <div id="docs">
+            <p>See the <a href="geolocation.js" target="_blank">geolocation.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">geolocation, openstreetmap</div>
+        </div>
+        <div class="span4 pull-right">
+          <div id="info" class="alert alert-error" style="display: none;"></div>
+        </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=geolocation" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/geolocation.js b/examples/geolocation.js
new file mode 100644
index 0000000..069df5b
--- /dev/null
+++ b/examples/geolocation.js
@@ -0,0 +1,84 @@
+goog.require('ol.Feature');
+goog.require('ol.FeatureOverlay');
+goog.require('ol.Geolocation');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.dom.Input');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+var view = new ol.View({
+  center: [0, 0],
+  zoom: 2
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: view
+});
+
+var geolocation = new ol.Geolocation({
+  projection: view.getProjection()
+});
+
+var track = new ol.dom.Input(document.getElementById('track'));
+track.bindTo('checked', geolocation, 'tracking');
+
+// update the HTML page when the position changes.
+geolocation.on('change', function() {
+  $('#accuracy').text(geolocation.getAccuracy() + ' [m]');
+  $('#altitude').text(geolocation.getAltitude() + ' [m]');
+  $('#altitudeAccuracy').text(geolocation.getAltitudeAccuracy() + ' [m]');
+  $('#heading').text(geolocation.getHeading() + ' [rad]');
+  $('#speed').text(geolocation.getSpeed() + ' [m/s]');
+});
+
+// handle geolocation error.
+geolocation.on('error', function(error) {
+  var info = document.getElementById('info');
+  info.innerHTML = error.message;
+  info.style.display = '';
+});
+
+var accuracyFeature = new ol.Feature();
+accuracyFeature.bindTo('geometry', geolocation, 'accuracyGeometry');
+
+var positionFeature = new ol.Feature();
+positionFeature.setStyle(new ol.style.Style({
+  image: new ol.style.Circle({
+    radius: 6,
+    fill: new ol.style.Fill({
+      color: '#3399CC'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#fff',
+      width: 2
+    })
+  })
+}));
+
+positionFeature.bindTo('geometry', geolocation, 'position')
+    .transform(function() {}, function(coordinates) {
+      return coordinates ? new ol.geom.Point(coordinates) : null;
+    });
+
+var featuresOverlay = new ol.FeatureOverlay({
+  map: map,
+  features: [accuracyFeature, positionFeature]
+});
diff --git a/examples/getfeatureinfo-image.html b/examples/getfeatureinfo-image.html
new file mode 100644
index 0000000..85b3044
--- /dev/null
+++ b/examples/getfeatureinfo-image.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>GetFeatureInfo example (image layer)</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">GetFeatureInfo example (image layer)</h4>
+          <p id="shortdesc">This example shows how to trigger WMS GetFeatureInfo requests on click for a WMS image layer.</p>
+          <div id="docs">
+            <p>See the <a href="getfeatureinfo-image.js" target="_blank">getfeatureinfo-image.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">getfeatureinfo</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=getfeatureinfo-image" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/getfeatureinfo-image.js b/examples/getfeatureinfo-image.js
new file mode 100644
index 0000000..1806cae
--- /dev/null
+++ b/examples/getfeatureinfo-image.js
@@ -0,0 +1,38 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Image');
+goog.require('ol.source.ImageWMS');
+
+
+var wmsSource = new ol.source.ImageWMS({
+  url: 'http://demo.boundlessgeo.com/geoserver/wms',
+  params: {'LAYERS': 'ne:ne'},
+  serverType: 'geoserver'
+});
+
+var wmsLayer = new ol.layer.Image({
+  source: wmsSource
+});
+
+var view = new ol.View({
+  center: [0, 0],
+  zoom: 1
+});
+
+var map = new ol.Map({
+  layers: [wmsLayer],
+  target: 'map',
+  view: view
+});
+
+map.on('singleclick', function(evt) {
+  document.getElementById('info').innerHTML = '';
+  var viewResolution = /** @type {number} */ (view.getResolution());
+  var url = wmsSource.getGetFeatureInfoUrl(
+      evt.coordinate, viewResolution, 'EPSG:3857',
+      {'INFO_FORMAT': 'text/html'});
+  if (url) {
+    document.getElementById('info').innerHTML =
+        '<iframe seamless src="' + url + '"></iframe>';
+  }
+});
diff --git a/examples/getfeatureinfo-tile.html b/examples/getfeatureinfo-tile.html
new file mode 100644
index 0000000..46a5289
--- /dev/null
+++ b/examples/getfeatureinfo-tile.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>WMS GetFeatureInfo example (tile layer)</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">WMS GetFeatureInfo example (tile layer)</h4>
+          <p id="shortdesc">This example shows how to trigger WMS GetFeatureInfo requests on click for a WMS tile layer.</p>
+          <div id="docs">
+            <p>See the <a href="getfeatureinfo-tile.js" target="_blank">getfeatureinfo-tile.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">getfeatureinfo</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=getfeatureinfo-tile" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/getfeatureinfo-tile.js b/examples/getfeatureinfo-tile.js
new file mode 100644
index 0000000..70704a7
--- /dev/null
+++ b/examples/getfeatureinfo-tile.js
@@ -0,0 +1,38 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.TileWMS');
+
+
+var wmsSource = new ol.source.TileWMS({
+  url: 'http://demo.boundlessgeo.com/geoserver/wms',
+  params: {'LAYERS': 'ne:ne'},
+  serverType: 'geoserver'
+});
+
+var wmsLayer = new ol.layer.Tile({
+  source: wmsSource
+});
+
+var view = new ol.View({
+  center: [0, 0],
+  zoom: 1
+});
+
+var map = new ol.Map({
+  layers: [wmsLayer],
+  target: 'map',
+  view: view
+});
+
+map.on('singleclick', function(evt) {
+  document.getElementById('info').innerHTML = '';
+  var viewResolution = /** @type {number} */ (view.getResolution());
+  var url = wmsSource.getGetFeatureInfoUrl(
+      evt.coordinate, viewResolution, 'EPSG:3857',
+      {'INFO_FORMAT': 'text/html'});
+  if (url) {
+    document.getElementById('info').innerHTML =
+        '<iframe seamless src="' + url + '"></iframe>';
+  }
+});
diff --git a/examples/gpx.html b/examples/gpx.html
new file mode 100644
index 0000000..5c35655
--- /dev/null
+++ b/examples/gpx.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>GPX example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+          <div id="no-download" class="alert alert-error" style="display: none">
+            The "Export GPX" functionality requires a browser that supports the
+            <a href="http://caniuse.com/#feat=download">link download</a> attribute.
+          </div>
+          <a id="export-gpx" class="btn" download="map.gpx"><i class="icon-download"></i>Export GPX</a>
+        </div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">GPX example</h4>
+          <p id="shortdesc">Example of using the GPX source.</p>
+          <div id="docs">
+            <p>See the <a href="gpx.js" target="_blank">gpx.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">GPX</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=gpx" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/gpx.js b/examples/gpx.js
new file mode 100644
index 0000000..13024a6
--- /dev/null
+++ b/examples/gpx.js
@@ -0,0 +1,120 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.format.GPX');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.proj');
+goog.require('ol.source.BingMaps');
+goog.require('ol.source.GPX');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+var projection = ol.proj.get('EPSG:3857');
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.BingMaps({
+    imagerySet: 'Aerial',
+    key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'
+  })
+});
+
+var style = {
+  'Point': [new ol.style.Style({
+    image: new ol.style.Circle({
+      fill: new ol.style.Fill({
+        color: 'rgba(255,255,0,0.4)'
+      }),
+      radius: 5,
+      stroke: new ol.style.Stroke({
+        color: '#ff0',
+        width: 1
+      })
+    })
+  })],
+  'LineString': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: '#f00',
+      width: 3
+    })
+  })],
+  'MultiLineString': [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: '#0f0',
+      width: 3
+    })
+  })]
+};
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.GPX({
+    projection: projection,
+    url: 'data/gpx/fells_loop.gpx'
+  }),
+  style: function(feature, resolution) {
+    return style[feature.getGeometry().getType()];
+  }
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: document.getElementById('map'),
+  view: new ol.View({
+    center: [-7916041.528716288, 5228379.045749711],
+    zoom: 12
+  })
+});
+
+var displayFeatureInfo = function(pixel) {
+  var features = [];
+  map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    features.push(feature);
+  });
+  if (features.length > 0) {
+    var info = [];
+    var i, ii;
+    for (i = 0, ii = features.length; i < ii; ++i) {
+      info.push(features[i].get('desc'));
+    }
+    document.getElementById('info').innerHTML = info.join(', ') || '(unknown)';
+    map.getTarget().style.cursor = 'pointer';
+  } else {
+    document.getElementById('info').innerHTML = ' ';
+    map.getTarget().style.cursor = '';
+  }
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var pixel = map.getEventPixel(evt.originalEvent);
+  displayFeatureInfo(pixel);
+});
+
+map.on('click', function(evt) {
+  displayFeatureInfo(evt.pixel);
+});
+
+var exportGPXElement = document.getElementById('export-gpx');
+if ('download' in exportGPXElement) {
+  var vectorSource = vector.getSource();
+  exportGPXElement.addEventListener('click', function(e) {
+    if (!exportGPXElement.href) {
+      var features = [];
+      vectorSource.forEachFeature(function(feature) {
+        var clone = feature.clone();
+        clone.getGeometry().transform(projection, 'EPSG:4326');
+        features.push(clone);
+      });
+      var string = new ol.format.GPX().writeFeatures(features);
+      var base64 = exampleNS.strToBase64(string);
+      exportGPXElement.href =
+          'data:text/gpx+xml;base64,' + base64;
+    }
+  }, false);
+} else {
+  var info = document.getElementById('no-download');
+  /**
+   * display error message
+   */
+  info.style.display = '';
+}
diff --git a/examples/graticule.html b/examples/graticule.html
new file mode 100644
index 0000000..89c57be
--- /dev/null
+++ b/examples/graticule.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Graticule example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Graticule example</h4>
+          <p id="shortdesc">This example shows how to add a graticule overlay to a map.</p>
+          <div id="docs">
+            <p>See the <a href="graticule.js" target="_blank">graticule.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">graticule</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=graticule" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/graticule.js b/examples/graticule.js
new file mode 100644
index 0000000..c2b0524
--- /dev/null
+++ b/examples/graticule.js
@@ -0,0 +1,33 @@
+goog.require('ol.Graticule');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+goog.require('ol.style.Stroke');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: 'canvas',
+  target: 'map',
+  view: new ol.View({
+    center: ol.proj.transform([4.8, 47.75], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 5
+  })
+});
+
+// Create the graticule component
+var graticule = new ol.Graticule({
+  // the style to use for the lines, optional.
+  strokeStyle: new ol.style.Stroke({
+    color: 'rgba(255,120,0,0.9)',
+    width: 2,
+    lineDash: [0.5, 4]
+  })
+});
+graticule.setMap(map);
diff --git a/examples/heatmap-earthquakes.html b/examples/heatmap-earthquakes.html
new file mode 100644
index 0000000..1f6a294
--- /dev/null
+++ b/examples/heatmap-earthquakes.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Earthquakes heatmap</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"><div id="info"></div></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Earthquakes heatmap</h4>
+          <p id="shortdesc">Demonstrates the use of a heatmap layer.</p>
+          <div id="docs">
+            <p>
+              This example parses a KML file and renders the features as a <code>ol.layer.Heatmap</code> layer.
+            </p>
+            <p>See the <a href="heatmap-earthquakes.js" target="_blank">heatmap-earthquakes.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">heatmap, kml, vector, style</div>
+        </div>
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="loader.js?id=heatmap-earthquakes" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/heatmap-earthquakes.js b/examples/heatmap-earthquakes.js
new file mode 100644
index 0000000..e28ce92
--- /dev/null
+++ b/examples/heatmap-earthquakes.js
@@ -0,0 +1,40 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Heatmap');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.KML');
+goog.require('ol.source.Stamen');
+
+
+var vector = new ol.layer.Heatmap({
+  source: new ol.source.KML({
+    extractStyles: false,
+    projection: 'EPSG:3857',
+    url: 'data/kml/2012_Earthquakes_Mag5.kml'
+  }),
+  radius: 5
+});
+
+vector.getSource().on('addfeature', function(event) {
+  // 2012_Earthquakes_Mag5.kml stores the magnitude of each earthquake in a
+  // standards-violating <magnitude> tag in each Placemark.  We extract it from
+  // the Placemark's name instead.
+  var name = event.feature.get('name');
+  var magnitude = parseFloat(name.substr(2));
+  event.feature.set('weight', magnitude - 5);
+});
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.Stamen({
+    layer: 'toner'
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/hue-saturation.html b/examples/hue-saturation.html
new file mode 100644
index 0000000..b5f4abc
--- /dev/null
+++ b/examples/hue-saturation.html
@@ -0,0 +1,74 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Hue/saturation example</title>
+    <style>
+      #reset-hue {
+        min-width: 90px;
+      }
+      #reset-saturation {
+        min-width: 124px;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+
+          <div id="no-webgl" class="alert alert-error" style="display: none">
+            This example requires a browser that supports <a href="http://get.webgl.org/">WebGL</a>.
+          </div>
+
+          <div class="btn-group">
+            <button id="increase-hue"><i class="icon-plus"></i></button>
+            <button id="reset-hue">Hue</button>
+            <button id="decrease-hue"><i class="icon-minus"></i></button>
+          </div>
+          <div class="btn-group">
+            <button id="increase-saturation"><i class="icon-plus"></i></button>
+            <button id="reset-saturation">Saturation</button>
+            <button id="decrease-saturation"><i class="icon-minus"></i></button>
+          </div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Hue/saturation example</h4>
+          <p id="shortdesc">Example of hue/saturation control on the client (WebGL only).</p>
+          <div id="docs">
+            <p>See the <a href="hue-saturation.js" target="_blank">hue-saturation.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">hue, saturation, webgl</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=hue-saturation" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/hue-saturation.js b/examples/hue-saturation.js
new file mode 100644
index 0000000..6d163f9
--- /dev/null
+++ b/examples/hue-saturation.js
@@ -0,0 +1,79 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.has');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.BingMaps');
+
+
+function setResetHueButtonHTML() {
+  resetHue.innerHTML = 'Hue (' + layer.getHue().toFixed(2) + ')';
+}
+
+function setResetSaturationButtonHTML() {
+  resetSaturation.innerHTML = 'Saturation (' +
+      layer.getSaturation().toFixed(2) + ')';
+}
+
+if (!ol.has.WEBGL) {
+  var info = document.getElementById('no-webgl');
+  /**
+   * display error message
+   */
+  info.style.display = '';
+} else {
+  var layer = new ol.layer.Tile({
+    source: new ol.source.BingMaps({
+      key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+      imagerySet: 'Aerial'
+    })
+  });
+
+  var map = new ol.Map({
+    layers: [layer],
+    renderer: 'webgl',
+    target: 'map',
+    view: new ol.View({
+      center: ol.proj.transform([-9.375, 51.483333], 'EPSG:4326', 'EPSG:3857'),
+      zoom: 15
+    })
+  });
+
+  var increaseHue = document.getElementById('increase-hue');
+  var resetHue = document.getElementById('reset-hue');
+  var decreaseHue = document.getElementById('decrease-hue');
+
+  setResetHueButtonHTML();
+
+  increaseHue.addEventListener('click', function() {
+    layer.setHue(layer.getHue() + 0.25);
+    setResetHueButtonHTML();
+  }, false);
+  resetHue.addEventListener('click', function() {
+    layer.setHue(0);
+    setResetHueButtonHTML();
+  }, false);
+  decreaseHue.addEventListener('click', function() {
+    layer.setHue(layer.getHue() - 0.25);
+    setResetHueButtonHTML();
+  }, false);
+
+  var increaseSaturation = document.getElementById('increase-saturation');
+  var resetSaturation = document.getElementById('reset-saturation');
+  var decreaseSaturation = document.getElementById('decrease-saturation');
+
+  setResetSaturationButtonHTML();
+
+  increaseSaturation.addEventListener('click', function() {
+    layer.setSaturation(layer.getSaturation() + 0.25);
+    setResetSaturationButtonHTML();
+  }, false);
+  resetSaturation.addEventListener('click', function() {
+    layer.setSaturation(1);
+    setResetSaturationButtonHTML();
+  }, false);
+  decreaseSaturation.addEventListener('click', function() {
+    layer.setSaturation(Math.max(layer.getSaturation() - 0.25, 0));
+    setResetSaturationButtonHTML();
+  }, false);
+}
diff --git a/examples/icon-sprite-webgl.html b/examples/icon-sprite-webgl.html
new file mode 100644
index 0000000..7f07409
--- /dev/null
+++ b/examples/icon-sprite-webgl.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Icon sprites with WebGL example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Icon sprite with WebGL example</h4>
+          <p id="shortdesc">Icon sprite with WebGL.</p>
+          <div id="docs">
+            <p>See the <a href="icon-sprite-webgl.js" target="_blank">icon-sprite-webgl.js source</a> to see how this is done.</p>
+            <p>In this example a sprite image is used for the icon styles. Using a sprite is required to get good performance with WebGL.</p>
+          </div>
+          <div id="tags">webgl, icon, sprite, vector, point</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=icon-sprite-webgl" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/icon-sprite-webgl.js b/examples/icon-sprite-webgl.js
new file mode 100644
index 0000000..26933f3
--- /dev/null
+++ b/examples/icon-sprite-webgl.js
@@ -0,0 +1,111 @@
+goog.require('ol.Feature');
+goog.require('ol.FeatureOverlay');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Icon');
+goog.require('ol.style.Style');
+
+
+var iconInfo = [{
+  offset: [0, 0],
+  opacity: 1.0,
+  rotateWithView: true,
+  rotation: 0.0,
+  scale: 1.0,
+  size: [55, 55]
+}, {
+  offset: [110, 86],
+  opacity: 0.75,
+  rotateWithView: false,
+  rotation: Math.PI / 2.0,
+  scale: 1.25,
+  size: [55, 55]
+}, {
+  offset: [55, 0],
+  opacity: 0.5,
+  rotateWithView: true,
+  rotation: Math.PI / 3.0,
+  scale: 1.5,
+  size: [55, 86]
+}, {
+  offset: [212, 0],
+  opacity: 1.0,
+  rotateWithView: true,
+  rotation: 0.0,
+  scale: 1.0,
+  size: [44, 44]
+}];
+
+var i;
+
+var iconCount = iconInfo.length;
+var icons = new Array(iconCount);
+for (i = 0; i < iconCount; ++i) {
+  var info = iconInfo[i];
+  icons[i] = new ol.style.Icon({
+    offset: info.offset,
+    opacity: info.opacity,
+    rotateWithView: info.rotateWithView,
+    rotation: info.rotation,
+    scale: info.scale,
+    size: info.size,
+    src: 'data/Butterfly.png'
+  });
+}
+
+var featureCount = 50000;
+var features = new Array(featureCount);
+var feature, geometry;
+var e = 25000000;
+for (i = 0; i < featureCount; ++i) {
+  geometry = new ol.geom.Point(
+      [2 * e * Math.random() - e, 2 * e * Math.random() - e]);
+  feature = new ol.Feature(geometry);
+  feature.setStyle(
+      new ol.style.Style({
+        image: icons[i % (iconCount - 1)]
+      })
+  );
+  features[i] = feature;
+}
+
+var vectorSource = new ol.source.Vector({
+  features: features
+});
+var vector = new ol.layer.Vector({
+  source: vectorSource
+});
+
+// Use the "webgl" renderer by default.
+var renderer = exampleNS.getRendererFromQueryString();
+if (!renderer) {
+  renderer = 'webgl';
+}
+
+var map = new ol.Map({
+  renderer: renderer,
+  layers: [vector],
+  target: document.getElementById('map'),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 5
+  })
+});
+
+var overlayFeatures = [];
+for (i = 0; i < featureCount; i += 30) {
+  var clone = features[i].clone();
+  clone.setStyle(null);
+  overlayFeatures.push(clone);
+}
+
+var featureOverlay = new ol.FeatureOverlay({
+  map: map,
+  style: new ol.style.Style({
+    image: icons[iconCount - 1]
+  }),
+  features: overlayFeatures
+});
diff --git a/examples/icon.html b/examples/icon.html
new file mode 100644
index 0000000..6b1ddae
--- /dev/null
+++ b/examples/icon.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Vector Icon Example</title>
+    <style>
+      #map {
+        position: relative;
+      }
+      #popup {
+        padding-bottom: 45px;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map">
+            <div id="popup"></div>
+          </div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Icon example</h4>
+          <p id="shortdesc">Example using an icon to symbolize a point.</p>
+          <div id="docs">
+            <p>See the <a href="icon.js" target="_blank">icon.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">vector, style, icon, marker, popup</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=icon" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/icon.js b/examples/icon.js
new file mode 100644
index 0000000..d510cf1
--- /dev/null
+++ b/examples/icon.js
@@ -0,0 +1,97 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.Overlay');
+goog.require('ol.View');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.TileJSON');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Icon');
+goog.require('ol.style.Style');
+
+
+var iconFeature = new ol.Feature({
+  geometry: new ol.geom.Point([0, 0]),
+  name: 'Null Island',
+  population: 4000,
+  rainfall: 500
+});
+
+var iconStyle = new ol.style.Style({
+  image: new ol.style.Icon(/** @type {olx.style.IconOptions} */ ({
+    anchor: [0.5, 46],
+    anchorXUnits: 'fraction',
+    anchorYUnits: 'pixels',
+    opacity: 0.75,
+    src: 'data/icon.png'
+  }))
+});
+
+iconFeature.setStyle(iconStyle);
+
+var vectorSource = new ol.source.Vector({
+  features: [iconFeature]
+});
+
+var vectorLayer = new ol.layer.Vector({
+  source: vectorSource
+});
+
+var rasterLayer = new ol.layer.Tile({
+  source: new ol.source.TileJSON({
+    url: 'http://api.tiles.mapbox.com/v3/mapbox.geography-class.jsonp'
+  })
+});
+
+var map = new ol.Map({
+  layers: [rasterLayer, vectorLayer],
+  target: document.getElementById('map'),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 3
+  })
+});
+
+var element = document.getElementById('popup');
+
+var popup = new ol.Overlay({
+  element: element,
+  positioning: 'bottom-center',
+  stopEvent: false
+});
+map.addOverlay(popup);
+
+// display popup on click
+map.on('click', function(evt) {
+  var feature = map.forEachFeatureAtPixel(evt.pixel,
+      function(feature, layer) {
+        return feature;
+      });
+  if (feature) {
+    var geometry = feature.getGeometry();
+    var coord = geometry.getCoordinates();
+    popup.setPosition(coord);
+    $(element).popover({
+      'placement': 'top',
+      'html': true,
+      'content': feature.get('name')
+    });
+    $(element).popover('show');
+  } else {
+    $(element).popover('destroy');
+  }
+});
+
+// change mouse cursor when over marker
+$(map.getViewport()).on('mousemove', function(e) {
+  var pixel = map.getEventPixel(e.originalEvent);
+  var hit = map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    return true;
+  });
+  if (hit) {
+    map.getTarget().style.cursor = 'pointer';
+  } else {
+    map.getTarget().style.cursor = '';
+  }
+});
diff --git a/examples/igc.html b/examples/igc.html
new file mode 100644
index 0000000..78e6b5c
--- /dev/null
+++ b/examples/igc.html
@@ -0,0 +1,58 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>IGC example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">IGC example</h4>
+          <p id="shortdesc">Example of tracks recorded from multiple paraglider flights on the same day, read from an IGC file.</p>
+          <div id="docs">
+            <p>The five tracks contain a total of 49,707 unique coordinates. Zoom in to see more detail. The background layer is from <a href="http://www.opencyclemap.org/">OpenCycleMap</a>.</p>
+            <p>See the <a href="igc.js" target="_blank">igc.js source</a> to see how this is done.</p>
+          </div>
+          <input id="time" type="range" value="0" steps="1" />
+          <div id="tags">complex-geometry, closest-feature, igc, opencyclemap</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=igc" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/igc.js b/examples/igc.js
new file mode 100644
index 0000000..afb3e00
--- /dev/null
+++ b/examples/igc.js
@@ -0,0 +1,191 @@
+goog.require('ol.Attribution');
+goog.require('ol.Feature');
+goog.require('ol.FeatureOverlay');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.IGC');
+goog.require('ol.source.OSM');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var colors = {
+  'Clement Latour': 'rgba(0, 0, 255, 0.7)',
+  'Damien de Baesnt': 'rgba(0, 215, 255, 0.7)',
+  'Sylvain Dhonneur': 'rgba(0, 165, 255, 0.7)',
+  'Tom Payne': 'rgba(0, 255, 255, 0.7)',
+  'Ulrich Prinz': 'rgba(0, 215, 255, 0.7)'
+};
+
+var styleCache = {};
+var styleFunction = function(feature, resolution) {
+  var color = colors[feature.get('PLT')];
+  var styleArray = styleCache[color];
+  if (!styleArray) {
+    styleArray = [new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: color,
+        width: 3
+      })
+    })];
+    styleCache[color] = styleArray;
+  }
+  return styleArray;
+};
+
+var vectorSource = new ol.source.IGC({
+  projection: 'EPSG:3857',
+  urls: [
+    'data/igc/Clement-Latour.igc',
+    'data/igc/Damien-de-Baenst.igc',
+    'data/igc/Sylvain-Dhonneur.igc',
+    'data/igc/Tom-Payne.igc',
+    'data/igc/Ulrich-Prinz.igc'
+  ]
+});
+
+var time = {
+  start: Infinity,
+  stop: -Infinity,
+  duration: 0
+};
+vectorSource.on('addfeature', function(event) {
+  var geometry = event.feature.getGeometry();
+  time.start = Math.min(time.start, geometry.getFirstCoordinate()[2]);
+  time.stop = Math.max(time.stop, geometry.getLastCoordinate()[2]);
+  time.duration = time.stop - time.start;
+});
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM({
+        attributions: [
+          new ol.Attribution({
+            html: 'All maps © ' +
+                '<a href="http://www.opencyclemap.org/">OpenCycleMap</a>'
+          }),
+          ol.source.OSM.ATTRIBUTION
+        ],
+        url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png'
+      })
+    }),
+    new ol.layer.Vector({
+      source: vectorSource,
+      style: styleFunction
+    })
+  ],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [703365.7089403362, 5714629.865071137],
+    zoom: 9
+  })
+});
+
+
+var point = null;
+var line = null;
+var displaySnap = function(coordinate) {
+  var closestFeature = vectorSource.getClosestFeatureToCoordinate(coordinate);
+  var info = document.getElementById('info');
+  if (closestFeature === null) {
+    point = null;
+    line = null;
+    info.innerHTML = ' ';
+  } else {
+    var geometry = closestFeature.getGeometry();
+    var closestPoint = geometry.getClosestPoint(coordinate);
+    if (point === null) {
+      point = new ol.geom.Point(closestPoint);
+    } else {
+      point.setCoordinates(closestPoint);
+    }
+    var date = new Date(closestPoint[2] * 1000);
+    info.innerHTML =
+        closestFeature.get('PLT') + ' (' + date.toUTCString() + ')';
+    var coordinates = [coordinate, [closestPoint[0], closestPoint[1]]];
+    if (line === null) {
+      line = new ol.geom.LineString(coordinates);
+    } else {
+      line.setCoordinates(coordinates);
+    }
+  }
+  map.render();
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var coordinate = map.getEventCoordinate(evt.originalEvent);
+  displaySnap(coordinate);
+});
+
+map.on('click', function(evt) {
+  displaySnap(evt.coordinate);
+});
+
+var imageStyle = new ol.style.Circle({
+  radius: 5,
+  fill: null,
+  stroke: new ol.style.Stroke({
+    color: 'rgba(255,0,0,0.9)',
+    width: 1
+  })
+});
+var strokeStyle = new ol.style.Stroke({
+  color: 'rgba(255,0,0,0.9)',
+  width: 1
+});
+map.on('postcompose', function(evt) {
+  var vectorContext = evt.vectorContext;
+  if (point !== null) {
+    vectorContext.setImageStyle(imageStyle);
+    vectorContext.drawPointGeometry(point);
+  }
+  if (line !== null) {
+    vectorContext.setFillStrokeStyle(null, strokeStyle);
+    vectorContext.drawLineStringGeometry(line);
+  }
+});
+
+var featureOverlay = new ol.FeatureOverlay({
+  map: map,
+  style: new ol.style.Style({
+    image: new ol.style.Circle({
+      radius: 5,
+      fill: new ol.style.Fill({
+        color: 'rgba(255,0,0,0.9)'
+      }),
+      stroke: null
+    })
+  })
+});
+
+$('#time').on('input', function(event) {
+  var value = parseInt($(this).val(), 10) / 100;
+  var m = time.start + (time.duration * value);
+  vectorSource.forEachFeature(function(feature) {
+    var geometry = /** @type {ol.geom.LineString} */ (feature.getGeometry());
+    var coordinate = geometry.getCoordinateAtM(m, true);
+    var highlight = feature.get('highlight');
+    if (highlight === undefined) {
+      highlight = new ol.Feature(new ol.geom.Point(coordinate));
+      feature.set('highlight', highlight);
+      featureOverlay.addFeature(highlight);
+    } else {
+      highlight.getGeometry().setCoordinates(coordinate);
+    }
+  });
+  map.render();
+});
diff --git a/examples/image-filter.html b/examples/image-filter.html
new file mode 100644
index 0000000..1b0b2fe
--- /dev/null
+++ b/examples/image-filter.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Image Filter Example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Image filter example</h4>
+          <p id="shortdesc">Apply a filter to imagery</p>
+          <select id="kernel" name="kernel">
+            <option>none</option>
+            <option selected>sharpen</option>
+            <option value="sharpenless">sharpen less</option>
+            <option>blur</option>
+            <option>shadow</option>
+            <option>emboss</option>
+            <option value="edge">edge detect</option>
+          </select>
+          <div id="docs">
+            <p>
+              Layer rendering can be manipulated in <code>precompose</code> and <code>postcompose</code> event listeners.
+              These listeners get an event with a reference to the Canvas rendering context.
+              In this example, the <code>postcompose</code> listener applies a filter to the image data.
+            </p>
+            <p>See the <a href="image-filter.js" target="_blank">image-filter.js source</a> for details on how this is done.</p>
+          </div>
+          <div id="tags">filter, image manipulation</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=image-filter" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/image-filter.js b/examples/image-filter.js
new file mode 100644
index 0000000..a94de1f
--- /dev/null
+++ b/examples/image-filter.js
@@ -0,0 +1,146 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.BingMaps');
+
+var key = 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3';
+
+var imagery = new ol.layer.Tile({
+  source: new ol.source.BingMaps({key: key, imagerySet: 'Aerial'})
+});
+
+var map = new ol.Map({
+  layers: [imagery],
+  target: 'map',
+  view: new ol.View({
+    center: ol.proj.transform([-120, 50], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 6
+  })
+});
+
+var kernels = {
+  none: [
+    0, 0, 0,
+    0, 1, 0,
+    0, 0, 0
+  ],
+  sharpen: [
+    0, -1, 0,
+    -1, 5, -1,
+    0, -1, 0
+  ],
+  sharpenless: [
+    0, -1, 0,
+    -1, 10, -1,
+    0, -1, 0
+  ],
+  blur: [
+    1, 1, 1,
+    1, 1, 1,
+    1, 1, 1
+  ],
+  shadow: [
+    1, 2, 1,
+    0, 1, 0,
+    -1, -2, -1
+  ],
+  emboss: [
+    -2, 1, 0,
+    -1, 1, 1,
+    0, 1, 2
+  ],
+  edge: [
+    0, 1, 0,
+    1, -4, 1,
+    0, 1, 0
+  ]
+};
+
+function normalize(kernel) {
+  var len = kernel.length;
+  var normal = new Array(len);
+  var i, sum = 0;
+  for (i = 0; i < len; ++i) {
+    sum += kernel[i];
+  }
+  if (sum <= 0) {
+    normal.normalized = false;
+    sum = 1;
+  } else {
+    normal.normalized = true;
+  }
+  for (i = 0; i < len; ++i) {
+    normal[i] = kernel[i] / sum;
+  }
+  return normal;
+}
+
+var select = document.getElementById('kernel');
+var selectedKernel = normalize(kernels[select.value]);
+
+
+/**
+ * Update the kernel and re-render on change.
+ */
+select.onchange = function() {
+  selectedKernel = normalize(kernels[select.value]);
+  map.render();
+};
+
+
+/**
+ * Apply a filter on "postcompose" events.
+ * @param {ol.render.Event} event Render event.
+ */
+imagery.on('postcompose', function(event) {
+  convolve(event.context, selectedKernel);
+});
+
+
+/**
+ * Apply a convolution kernel to canvas.  This works for any size kernel, but
+ * performance starts degrading above 3 x 3.
+ * @param {CanvasRenderingContext2D} context Canvas 2d context.
+ * @param {Array.<number>} kernel Kernel.
+ */
+function convolve(context, kernel) {
+  var canvas = context.canvas;
+  var width = canvas.width;
+  var height = canvas.height;
+
+  var size = Math.sqrt(kernel.length);
+  var half = Math.floor(size / 2);
+
+  var inputData = context.getImageData(0, 0, width, height).data;
+
+  var output = context.createImageData(width, height);
+  var outputData = output.data;
+
+  for (var pixelY = 0; pixelY < height; ++pixelY) {
+    var pixelsAbove = pixelY * width;
+    for (var pixelX = 0; pixelX < width; ++pixelX) {
+      var r = 0, g = 0, b = 0, a = 0;
+      for (var kernelY = 0; kernelY < size; ++kernelY) {
+        for (var kernelX = 0; kernelX < size; ++kernelX) {
+          var weight = kernel[kernelY * size + kernelX];
+          var neighborY = Math.min(
+              height - 1, Math.max(0, pixelY + kernelY - half));
+          var neighborX = Math.min(
+              width - 1, Math.max(0, pixelX + kernelX - half));
+          var inputIndex = (neighborY * width + neighborX) * 4;
+          r += inputData[inputIndex] * weight;
+          g += inputData[inputIndex + 1] * weight;
+          b += inputData[inputIndex + 2] * weight;
+          a += inputData[inputIndex + 3] * weight;
+        }
+      }
+      var outputIndex = (pixelsAbove + pixelX) * 4;
+      outputData[outputIndex] = r;
+      outputData[outputIndex + 1] = g;
+      outputData[outputIndex + 2] = b;
+      outputData[outputIndex + 3] = kernel.normalized ? a : 255;
+    }
+  }
+  context.putImageData(output, 0, 0);
+}
diff --git a/examples/image-vector-layer.html b/examples/image-vector-layer.html
new file mode 100644
index 0000000..2de4169
--- /dev/null
+++ b/examples/image-vector-layer.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Image vector layer example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span8">
+          <h4 id="title">Image vector example</h4>
+          <p id="shortdesc">Example of an image vector layer.</p>
+          <div id="docs">
+            <p>This example uses a <code>ol.source.ImageVector</code> source. That source gets vector features from the
+            <code>ol.source.Vector</code> it's configured with, and draw these features to an HTML5 canvas element that
+            is then used as the image of an image layer.</p>
+            <p>See the <a href="image-vector-layer.js" target="_blank">image-vector-layer.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">vector, image</div>
+        </div>
+        <div class="span4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=image-vector-layer" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/image-vector-layer.js b/examples/image-vector-layer.js
new file mode 100644
index 0000000..01e79fe
--- /dev/null
+++ b/examples/image-vector-layer.js
@@ -0,0 +1,90 @@
+goog.require('ol.FeatureOverlay');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Image');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.ImageVector');
+goog.require('ol.source.MapQuest');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuest({layer: 'sat'})
+    }),
+    new ol.layer.Image({
+      source: new ol.source.ImageVector({
+        source: new ol.source.GeoJSON({
+          projection: 'EPSG:3857',
+          url: 'data/geojson/countries.geojson'
+        }),
+        style: new ol.style.Style({
+          fill: new ol.style.Fill({
+            color: 'rgba(255, 255, 255, 0.6)'
+          }),
+          stroke: new ol.style.Stroke({
+            color: '#319FD3',
+            width: 1
+          })
+        })
+      })
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 1
+  })
+});
+
+var featureOverlay = new ol.FeatureOverlay({
+  map: map,
+  style: new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: '#f00',
+      width: 1
+    }),
+    fill: new ol.style.Fill({
+      color: 'rgba(255,0,0,0.1)'
+    })
+  })
+});
+
+var highlight;
+var displayFeatureInfo = function(pixel) {
+
+  var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    return feature;
+  });
+
+  var info = document.getElementById('info');
+  if (feature) {
+    info.innerHTML = feature.getId() + ': ' + feature.get('name');
+  } else {
+    info.innerHTML = ' ';
+  }
+
+  if (feature !== highlight) {
+    if (highlight) {
+      featureOverlay.removeFeature(highlight);
+    }
+    if (feature) {
+      featureOverlay.addFeature(feature);
+    }
+    highlight = feature;
+  }
+
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var pixel = map.getEventPixel(evt.originalEvent);
+  displayFeatureInfo(pixel);
+});
+
+map.on('click', function(evt) {
+  displayFeatureInfo(evt.pixel);
+});
diff --git a/examples/index.html b/examples/index.html
new file mode 100644
index 0000000..696db39
--- /dev/null
+++ b/examples/index.html
@@ -0,0 +1,209 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style>
+      .example {
+        height: 140px;
+        padding: 3px;
+        background-color: #eee;
+        border-radius: 3px;
+        margin-bottom: 10px;
+        overflow: auto;
+      }
+      .example:hover {
+        background-color: #ddd;
+      }
+      .navbar-search.pull-left {
+        padding: 5px;
+      }
+
+      ::-webkit-scrollbar {
+        width: 8px;
+      }
+
+      ::-webkit-scrollbar-button {
+        width: 0;
+        height: 0;
+        display: none;
+      }
+
+      ::-webkit-scrollbar-thumb {
+        background-color: rgba(0, 0, 0, 0.2);
+        -webkit-box-shadow: inset 1px 1px 0 rgba(0, 0, 0, 0.10),inset 0 -1px 0 rgba(0, 0, 0, 0.07);
+      }
+
+      ::-webkit-scrollbar-thumb:hover {
+        background-color: rgba(0, 0, 0, 0.4);
+      }
+
+      ::-webkit-scrollbar-corner {
+        background-color: transparent;
+      }
+    </style>
+    <script type="text/javascript" src="Jugl.js"></script>
+    <script type="text/javascript" src="example-list.js"></script>
+    <script type="text/javascript">
+      var template, target;
+
+      function listExamples(examples) {
+        target.innerHTML = "";
+        var node = template.process({
+          context: {examples: examples},
+          clone: true,
+          parent: target
+        });
+        document.getElementById("count").innerHTML = "(" + examples.length + ")";
+      }
+
+      var timerId;
+      function inputChange() {
+        if (timerId) {
+          window.clearTimeout(timerId);
+        }
+        var text = this.value;
+        timerId = window.setTimeout(function() {
+          filterList(text);
+        }, 500);
+      }
+
+      function filterList(text) {
+        var examples;
+        if (text.length < 2) {
+          examples = info.examples;
+        } else {
+          var words = text.split(/\W+/);
+          var scores = {};
+          for(var i=0; i<words.length; ++i) {
+            var word = words[i].toLowerCase();
+            var dict = info.index[word];
+            var updateScores = function() {
+              for(exIndex in dict) {
+                var count = dict[exIndex];
+                if(scores[exIndex]) {
+                  if(scores[exIndex][word]) {
+                    scores[exIndex][word] += count;
+                  } else {
+                    scores[exIndex][word] = count;
+                  }
+                } else {
+                  scores[exIndex] = {};
+                  scores[exIndex][word] = count;
+                }
+              }
+            };
+            if (dict) {
+              updateScores();
+            } else {
+              var r;
+              for (idx in info.index) {
+                r = new RegExp(word);
+                if (r.test(idx)) {
+                  dict = info.index[idx];
+                  updateScores();
+                }
+              }
+            }
+          }
+          examples = [];
+          for (var j in scores) {
+            var ex = info.examples[j];
+            ex.score = scores[j];
+            examples.push(ex);
+          }
+          // sort examples by first by number of words matched, then
+          // by word frequency
+          examples.sort(function(a, b) {
+            var cmp;
+            var aWords = 0, bWords = 0;
+            var aScore = 0, bScore = 0;
+            for (var i in a.score) {
+              aScore += a.score[i];
+              aWords += 1;
+            }
+            for (var j in b.score) {
+              bScore += b.score[j];
+              bWords += 1;
+            }
+            if (aWords == bWords) {
+              cmp = bScore - aScore;
+            } else {
+              cmp = bWords - aWords;
+            }
+            return cmp;
+          });
+        }
+        listExamples(examples);
+      }
+
+      function parseQuery() {
+        var params = {};
+        var list = window.location.search.substring(1).split("&");
+        for (var i = 0; i < list.length; ++i) {
+          var pair = list[i].split("=");
+          if (pair.length == 2) {
+            params[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
+          }
+        }
+        if (params["q"]) {
+          var input = document.getElementById("keywords");
+          input.value = params["q"];
+          inputChange.call(input);
+        }
+      }
+
+      window.onload = function() {
+        for (var i = 0; i < info.examples.length; ++i) {
+          info.examples[i].link += window.location.search;
+        }
+        // document.getElementById('keywords').focus();
+        template = new jugl.Template("template");
+        target = document.getElementById("examples");
+        listExamples(info.examples);
+        document.getElementById("keywords").onkeyup = inputChange;
+        parseQuery();
+      };
+    </script>
+
+    <title>OpenLayers 3 Examples</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+          <form class="navbar-search pull-left">
+            <input name="q" type="text" id="keywords" class="search-query" placeholder="Search">
+            <span id="count"></span>
+          </form>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div id="examples"></div>
+
+      <div style="display: none;">
+        <div id="template">
+          <div class="span4 example" jugl:repeat="example examples">
+            <a jugl:attributes="href example.link" class="mainlink">
+              <strong><span jugl:replace="example.title">title</span></strong><br>
+              <small jugl:content="'(' + example.example + ')'"></small>
+            </a>
+            <p><div jugl:content="example.shortdesc"></div></p>
+            <p><small jugl:content="'tags: ' + example.tags"></small></p>
+          </div>
+        </div>
+      </div>
+
+    </div>
+  </body>
+</html>
diff --git a/examples/kml-earthquakes.html b/examples/kml-earthquakes.html
new file mode 100644
index 0000000..7352359
--- /dev/null
+++ b/examples/kml-earthquakes.html
@@ -0,0 +1,75 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Earthquakes in KML</title>
+    <style>
+      #map {
+        position: relative;
+      }
+      #info {
+        position: absolute;
+        height: 1px;
+        width: 1px;
+        z-index: 100;
+      }
+      .tooltip.in {
+        opacity: 1;
+        filter: alpha(opacity=100);
+      }
+      .tooltip.top .tooltip-arrow {
+        border-top-color: white;
+      }
+      .tooltip-inner {
+        border: 2px solid white;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"><div id="info"></div></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Earthquakes in KML</h4>
+          <p id="shortdesc">Demonstrates the use of a Shape symbolizer to render earthquake locations.</p>
+          <div id="docs">
+            <p>
+              This example parses a KML file and renders the features as a vector layer.  The layer is given a <code>style</code> that renders earthquake locations with a size relative to their magnitude.
+            </p>
+            <p>See the <a href="kml-earthquakes.js" target="_blank">kml-earthquakes.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">KML, vector, style, tooltip</div>
+        </div>
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=kml-earthquakes" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/kml-earthquakes.js b/examples/kml-earthquakes.js
new file mode 100644
index 0000000..793ebf4
--- /dev/null
+++ b/examples/kml-earthquakes.js
@@ -0,0 +1,94 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.KML');
+goog.require('ol.source.Stamen');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var styleCache = {};
+var styleFunction = function(feature, resolution) {
+  // 2012_Earthquakes_Mag5.kml stores the magnitude of each earthquake in a
+  // standards-violating <magnitude> tag in each Placemark.  We extract it from
+  // the Placemark's name instead.
+  var name = feature.get('name');
+  var magnitude = parseFloat(name.substr(2));
+  var radius = 5 + 20 * (magnitude - 5);
+  var style = styleCache[radius];
+  if (!style) {
+    style = [new ol.style.Style({
+      image: new ol.style.Circle({
+        radius: radius,
+        fill: new ol.style.Fill({
+          color: 'rgba(255, 153, 0, 0.4)'
+        }),
+        stroke: new ol.style.Stroke({
+          color: 'rgba(255, 204, 0, 0.2)',
+          width: 1
+        })
+      })
+    })];
+    styleCache[radius] = style;
+  }
+  return style;
+};
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.KML({
+    extractStyles: false,
+    projection: 'EPSG:3857',
+    url: 'data/kml/2012_Earthquakes_Mag5.kml'
+  }),
+  style: styleFunction
+});
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.Stamen({
+    layer: 'toner'
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var info = $('#info');
+info.tooltip({
+  animation: false,
+  trigger: 'manual'
+});
+
+var displayFeatureInfo = function(pixel) {
+  info.css({
+    left: pixel[0] + 'px',
+    top: (pixel[1] - 15) + 'px'
+  });
+  var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    return feature;
+  });
+  if (feature) {
+    info.tooltip('hide')
+        .attr('data-original-title', feature.get('name'))
+        .tooltip('fixTitle')
+        .tooltip('show');
+  } else {
+    info.tooltip('hide');
+  }
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  displayFeatureInfo(map.getEventPixel(evt.originalEvent));
+});
+
+map.on('click', function(evt) {
+  displayFeatureInfo(evt.pixel);
+});
diff --git a/examples/kml-timezones.html b/examples/kml-timezones.html
new file mode 100644
index 0000000..564c648
--- /dev/null
+++ b/examples/kml-timezones.html
@@ -0,0 +1,63 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Timezones in KML</title>
+    <style>
+      #map {
+        position: relative;
+      }
+      #info {
+        position: absolute;
+        height: 1px;
+        width: 1px;
+        z-index: 100;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"><div id="info"></div></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Timezones in KML</h4>
+          <p id="shortdesc">Demonstrates rendering timezones from KML.</p>
+          <div id="docs">
+            <p>This example parses a KML file and renders the features as a vector layer.  The layer is given a <code>ol.style.Style</code> that fills timezones yellow with an opacity calculated based on the current offset to local noon.</p>
+            <p>See the <a href="kml-timezones.js" target="_blank">kml-timezones.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">KML, vector, style</div>
+        </div>
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=kml-timezones" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/kml-timezones.js b/examples/kml-timezones.js
new file mode 100644
index 0000000..f7b5244
--- /dev/null
+++ b/examples/kml-timezones.js
@@ -0,0 +1,101 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.KML');
+goog.require('ol.source.Stamen');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+/*
+ * Compute the style of the feature.  Here we want the opacity of polygons to
+ * be based on the offset from local noon.  For example, a timezone where it is
+ * currently noon would have an opacity of 0.75.  And a timezone where it is
+ * currently midnight would have an opacity of 0.  This doesn't account for
+ * daylight savings, so don't use it to plan your vacation.
+ */
+var styleFunction = function(feature, resolution) {
+  var offset = 0;
+  var name = feature.get('name'); // e.g. GMT -08:30
+  var match = name.match(/([\-+]\d{2}):(\d{2})$/);
+  if (match) {
+    var hours = parseInt(match[1], 10);
+    var minutes = parseInt(match[2], 10);
+    offset = 60 * hours + minutes;
+  }
+  var date = new Date();
+  var local = new Date(date.getTime() +
+      (date.getTimezoneOffset() + offset) * 60000);
+  // offset from local noon (in hours)
+  var delta = Math.abs(12 - local.getHours() + (local.getMinutes() / 60));
+  if (delta > 12) {
+    delta = 24 - delta;
+  }
+  var opacity = 0.75 * (1 - delta / 12);
+  return [new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: [0xff, 0xff, 0x33, opacity]
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#ffffff'
+    })
+  })];
+};
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.KML({
+    extractStyles: false,
+    projection: 'EPSG:3857',
+    url: 'data/kml/timezones.kml'
+  }),
+  style: styleFunction
+});
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.Stamen({
+    layer: 'toner'
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var info = $('#info');
+info.tooltip({
+  animation: false,
+  trigger: 'manual'
+});
+
+var displayFeatureInfo = function(pixel) {
+  info.css({
+    left: pixel[0] + 'px',
+    top: (pixel[1] - 15) + 'px'
+  });
+  var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    return feature;
+  });
+  if (feature) {
+    info.tooltip('hide')
+        .attr('data-original-title', feature.get('name'))
+        .tooltip('fixTitle')
+        .tooltip('show');
+  } else {
+    info.tooltip('hide');
+  }
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  displayFeatureInfo(map.getEventPixel(evt.originalEvent));
+});
+
+map.on('click', function(evt) {
+  displayFeatureInfo(evt.pixel);
+});
diff --git a/examples/kml.html b/examples/kml.html
new file mode 100644
index 0000000..7a10f71
--- /dev/null
+++ b/examples/kml.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>KML example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+          <div id="no-download" class="alert alert-error" style="display: none">
+            The "Export KML" functionality requires a browser that supports the
+            <a href="http://caniuse.com/#feat=download">link download</a> attribute.
+          </div>
+          <a id="export-kml" class="btn" download="map.kml"><i class="icon-download"></i>Export KML</a>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">KML example</h4>
+          <p id="shortdesc">Example of using the KML source.</p>
+          <div id="docs">
+            <p>See the <a href="kml.js" target="_blank">kml.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">KML</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=kml" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/kml.js b/examples/kml.js
new file mode 100644
index 0000000..ac86d71
--- /dev/null
+++ b/examples/kml.js
@@ -0,0 +1,88 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.format.KML');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.proj');
+goog.require('ol.source.BingMaps');
+goog.require('ol.source.KML');
+
+var projection = ol.proj.get('EPSG:3857');
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.BingMaps({
+    imagerySet: 'Aerial',
+    key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'
+  })
+});
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.KML({
+    projection: projection,
+    url: 'data/kml/2012-02-10.kml'
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: document.getElementById('map'),
+  view: new ol.View({
+    center: [876970.8463461736, 5859807.853963373],
+    projection: projection,
+    zoom: 10
+  })
+});
+
+var displayFeatureInfo = function(pixel) {
+  var features = [];
+  map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    features.push(feature);
+  });
+  if (features.length > 0) {
+    var info = [];
+    var i, ii;
+    for (i = 0, ii = features.length; i < ii; ++i) {
+      info.push(features[i].get('name'));
+    }
+    document.getElementById('info').innerHTML = info.join(', ') || '(unknown)';
+    map.getTarget().style.cursor = 'pointer';
+  } else {
+    document.getElementById('info').innerHTML = ' ';
+    map.getTarget().style.cursor = '';
+  }
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var pixel = map.getEventPixel(evt.originalEvent);
+  displayFeatureInfo(pixel);
+});
+
+map.on('click', function(evt) {
+  displayFeatureInfo(evt.pixel);
+});
+
+var exportKMLElement = document.getElementById('export-kml');
+if ('download' in exportKMLElement) {
+  var vectorSource = vector.getSource();
+  exportKMLElement.addEventListener('click', function(e) {
+    if (!exportKMLElement.href) {
+      var features = [];
+      vectorSource.forEachFeature(function(feature) {
+        var clone = feature.clone();
+        clone.setId(feature.getId());  // clone does not set the id
+        clone.getGeometry().transform(projection, 'EPSG:4326');
+        features.push(clone);
+      });
+      var string = new ol.format.KML().writeFeatures(features);
+      var base64 = exampleNS.strToBase64(string);
+      exportKMLElement.href =
+          'data:application/vnd.google-earth.kml+xml;base64,' + base64;
+    }
+  }, false);
+} else {
+  var info = document.getElementById('no-download');
+  /**
+   * display error message
+   */
+  info.style.display = '';
+}
diff --git a/examples/layer-clipping-webgl.html b/examples/layer-clipping-webgl.html
new file mode 100644
index 0000000..f28de14
--- /dev/null
+++ b/examples/layer-clipping-webgl.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Layer WebGL clipping example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div id="no-webgl" class="alert alert-error" style="display: none">
+        This example requires a browser that supports <a href="http://get.webgl.org/">WebGL</a>.
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Layer WebGL clipping example</h4>
+          <p id="shortdesc">Layer WebGL clipping example.</p>
+          <div id="docs">
+            <p>This example shows how to use the <code>precompose</code> and <code>postcompose</code> rendering hooks to clip layers using WebGL.</p>
+            <p>See the <a href="layer-clipping-webgl.js" target="_blank">layer-clipping-webgl.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">clipping, webgl, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=layer-clipping-webgl" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/layer-clipping-webgl.js b/examples/layer-clipping-webgl.js
new file mode 100644
index 0000000..6026782
--- /dev/null
+++ b/examples/layer-clipping-webgl.js
@@ -0,0 +1,108 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.has');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+if (!ol.has.WEBGL) {
+  var info = document.getElementById('no-webgl');
+  /**
+   * display error message
+   */
+  info.style.display = '';
+} else {
+
+  var osm = new ol.layer.Tile({
+    source: new ol.source.OSM()
+  });
+
+  var map = new ol.Map({
+    layers: [osm],
+    renderer: 'webgl',
+    target: 'map',
+    controls: ol.control.defaults({
+      attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+        collapsible: false
+      })
+    }),
+    view: new ol.View({
+      center: [0, 0],
+      zoom: 2
+    })
+  });
+
+  var fragmentShaderSource = [
+    'precision mediump float;',
+    'void main() {',
+    '}'
+  ].join('');
+
+  var vertexShaderSource = [
+    'attribute vec2 a_position;',
+    'void main() {',
+    '  gl_Position = vec4(a_position, 0, 1);',
+    '}'
+  ].join('');
+
+  osm.on('precompose', function(event) {
+    var context = event.glContext;
+
+    var gl = context.getGL();
+    var program = gl.createProgram();
+
+    var vertexShader = gl.createShader(gl.VERTEX_SHADER);
+    gl.shaderSource(vertexShader, vertexShaderSource);
+    gl.compileShader(vertexShader);
+    gl.attachShader(program, vertexShader);
+
+    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
+    gl.shaderSource(fragmentShader, fragmentShaderSource);
+    gl.compileShader(fragmentShader);
+    gl.attachShader(program, fragmentShader);
+
+    gl.linkProgram(program);
+    context.useProgram(program);
+
+    var positionLocation = gl.getAttribLocation(program, 'a_position');
+
+    gl.enable(gl.STENCIL_TEST);
+    gl.colorMask(false, false, false, false);
+    gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);
+    gl.stencilFunc(gl.ALWAYS, 1, 0xff);
+
+    var buffer = gl.createBuffer();
+    gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+      // first band
+      -1.0, -1.0, -0.75, -1.0, -1.0, 1.0,
+      -1.0, 1.0, -0.75, -1.0, -0.75, 1.0,
+      // second band
+      -0.5, -1.0, -0.25, -1.0, -0.5, 1.0,
+      -0.5, 1.0, -0.25, -1.0, -0.25, 1.0,
+      // third band
+      0.0, -1.0, 0.25, -1.0, 0.0, 1.0,
+      0.0, 1.0, 0.25, -1.0, 0.25, 1.0,
+      // forth band
+      0.5, -1.0, 0.75, -1.0, 0.5, 1.0,
+      0.5, 1.0, 0.75, -1.0, 0.75, 1.0
+    ]), gl.STATIC_DRAW);
+
+    gl.enableVertexAttribArray(positionLocation);
+    gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0);
+    gl.drawArrays(gl.TRIANGLES, 0, 24);
+
+    gl.bindBuffer(gl.ARRAY_BUFFER, null);
+    gl.deleteBuffer(buffer);
+
+    gl.colorMask(true, true, true, true);
+    gl.stencilFunc(gl.NOTEQUAL, 0, 0xff);
+    gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
+  });
+
+  osm.on('postcompose', function(event) {
+    var context = event.glContext;
+    var gl = context.getGL();
+    gl.disable(gl.STENCIL_TEST);
+  });
+}
diff --git a/examples/layer-clipping.html b/examples/layer-clipping.html
new file mode 100644
index 0000000..8b70917
--- /dev/null
+++ b/examples/layer-clipping.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Layer clipping example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Layer clipping example</h4>
+          <p id="shortdesc">Layer clipping example.</p>
+          <div id="docs">
+            <p>See the <a href="layer-clipping.js" target="_blank">layer-clipping.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">clipping, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=layer-clipping" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/layer-clipping.js b/examples/layer-clipping.js
new file mode 100644
index 0000000..1a5fa76
--- /dev/null
+++ b/examples/layer-clipping.js
@@ -0,0 +1,46 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+var osm = new ol.layer.Tile({
+  source: new ol.source.OSM()
+});
+
+var map = new ol.Map({
+  layers: [osm],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+osm.on('precompose', function(event) {
+  var ctx = event.context;
+  ctx.save();
+  ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2);
+  ctx.scale(3, 3);
+  ctx.translate(-75, -80);
+  ctx.beginPath();
+  ctx.moveTo(75, 40);
+  ctx.bezierCurveTo(75, 37, 70, 25, 50, 25);
+  ctx.bezierCurveTo(20, 25, 20, 62.5, 20, 62.5);
+  ctx.bezierCurveTo(20, 80, 40, 102, 75, 120);
+  ctx.bezierCurveTo(110, 102, 130, 80, 130, 62.5);
+  ctx.bezierCurveTo(130, 62.5, 130, 25, 100, 25);
+  ctx.bezierCurveTo(85, 25, 75, 37, 75, 40);
+  ctx.clip();
+  ctx.setTransform(1, 0, 0, 1, 0, 0);
+});
+
+osm.on('postcompose', function(event) {
+  var ctx = event.context;
+  ctx.restore();
+});
diff --git a/examples/layer-extent.html b/examples/layer-extent.html
new file mode 100644
index 0000000..95bc7d0
--- /dev/null
+++ b/examples/layer-extent.html
@@ -0,0 +1,68 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Limited Layer Extent</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Limited layer extent</h4>
+          <p id="shortdesc">Restricting layer rendering to a limited extent.</p>
+          <div id="docs">
+            <p>
+              This example uses the <code>layer.setExtent()</code> method to
+              modify the extent of the overlay layer.  Use the controls below
+              to limit rendering based on an extent.
+            </p>
+            <p>
+              <div class="btn-group">
+                <button type="button" class="btn btn-default" id="northwest">northwest</button>
+                <button type="button" class="btn btn-default" id="northeast">northeast</button>
+                <button type="button" class="btn btn-default" id="southeast">southeast</button>
+                <button type="button" class="btn btn-default" id="southwest">southwest</button>
+                <button type="button" class="btn btn-default" id="world">world</button>
+              </div>
+            </p>
+            <p>
+              See the <a href="layer-extent.js" target="_blank">layer-extent.js
+              source</a> for details on how this is done.
+            </p>
+          </div>
+          <div id="tags">extent, tilejson</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=layer-extent" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/layer-extent.js b/examples/layer-extent.js
new file mode 100644
index 0000000..fca5992
--- /dev/null
+++ b/examples/layer-extent.js
@@ -0,0 +1,50 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.TileJSON');
+
+function transform(extent) {
+  return ol.proj.transformExtent(extent, 'EPSG:4326', 'EPSG:3857');
+}
+
+var extents = {
+  northwest: transform([-180, 0, 0, 85]),
+  northeast: transform([0, 0, 180, 85]),
+  southeast: transform([0, -85, 180, 0]),
+  southwest: transform([-180, -85, 0, 0]),
+  world: transform([-180, -85, 180, 85])
+};
+
+var base = new ol.layer.Tile({
+  source: new ol.source.TileJSON({
+    url: 'http://api.tiles.mapbox.com/v3/' +
+        'mapbox.world-black.jsonp',
+    crossOrigin: 'anonymous'
+  })
+});
+
+var overlay = new ol.layer.Tile({
+  extent: extents.northwest,
+  source: new ol.source.TileJSON({
+    url: 'http://api.tiles.mapbox.com/v3/' +
+        'mapbox.world-glass.jsonp',
+    crossOrigin: 'anonymous'
+  })
+});
+
+var map = new ol.Map({
+  layers: [base, overlay],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 1
+  })
+});
+
+for (var key in extents) {
+  document.getElementById(key).onclick = function(event) {
+    overlay.setExtent(extents[event.target.id]);
+  };
+}
diff --git a/examples/layer-group.html b/examples/layer-group.html
new file mode 100644
index 0000000..a86f9dc
--- /dev/null
+++ b/examples/layer-group.html
@@ -0,0 +1,126 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style>
+      #layertree li > span {
+        cursor: pointer;
+      }
+    </style>
+    <title>Layer group example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span6">
+          <div id="map" class="map"></div>
+
+          <h4 id="title">Layer group example</h4>
+          <p id="shortdesc">Example of a map with layer group.</p>
+          <div id="docs">
+            <p>See the <a href="layer-group.js" target="_blank">layer-group.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">tilejson, input, bind, group, layergroup</div>
+        </div>
+
+        <div id="layertree" class="span6">
+          <h5>Click on layer nodes below to change their properties.</h5>
+              <ul>
+                <li><span>OpenAerial layer</span>
+                  <fieldset id="layer0">
+                    <label class="checkbox" for="visible0">
+                      <input id="visible0" class="visible" type="checkbox"/>visibility
+                    </label>
+                    <label>opacity</label>
+                    <input class="opacity" type="range" min="0" max="1" step="0.01"/>
+                    <label>hue</label>
+                    <input class="hue" type="range" min="-3.141592653589793" max="3.141592653589793" step="0.01"/>
+                    <label>saturation</label>
+                    <input class="saturation" type="range" min="0" max="5" step="0.01"/>
+                    <label>contrast</label>
+                    <input class="contrast" type="range" min="0" max="2" step="0.01"/>
+                    <label>brightness</label>
+                    <input class="brightness" type="range" min="-1" max="1" step="0.01"/>
+                  </fieldset>
+                </li>
+                <li><span>Layer group</span>
+                  <fieldset id="layer1">
+                    <label class="checkbox" for="visible1">
+                      <input id="visible1" class="visible" type="checkbox"/>visibility
+                    </label>
+                    <label>opacity</label>
+                    <input class="opacity" type="range" min="0" max="1" step="0.01"/>
+                    <label>hue</label>
+                    <input class="hue" type="range" min="-3.141592653589793" max="3.141592653589793" step="0.01"/>
+                    <label>saturation</label>
+                    <input class="saturation" type="range" min="0" max="5" step="0.01"/>
+                    <label>contrast</label>
+                    <input class="contrast" type="range" min="0" max="2" step="0.01"/>
+                    <label>brightness</label>
+                    <input class="brightness" type="range" min="-1" max="1" step="0.01"/>
+                  </fieldset>
+                  <ul>
+                    <li><span>Food insecurity layer</span>
+                      <fieldset id="layer10">
+                        <label class="checkbox" for="visible10">
+                          <input id="visible10" class="visible" type="checkbox"/>visibility
+                        </label>
+                        <label>opacity</label>
+                        <input class="opacity" type="range" min="0" max="1" step="0.01"/>
+                        <label>hue</label>
+                        <input class="hue" type="range" min="-3.141592653589793" max="3.141592653589793" step="0.01"/>
+                        <label>saturation</label>
+                        <input class="saturation" type="range" min="0" max="5" step="0.01"/>
+                        <label>contrast</label>
+                        <input class="contrast" type="range" min="0" max="2" step="0.01"/>
+                        <label>brightness</label>
+                        <input class="brightness" type="range" min="-1" max="1" step="0.01"/>
+                      </fieldset>
+                    </li>
+                    <li><span>World borders layer</span>
+                      <fieldset id="layer11">
+                        <label class="checkbox" for="visible11">
+                          <input id="visible11" class="visible" type="checkbox"/>visibility
+                        </label>
+                        <label>opacity</label>
+                        <input class="opacity" type="range" min="0" max="1" step="0.01"/>
+                        <label>hue</label>
+                        <input class="hue" type="range" min="-3.141592653589793" max="3.141592653589793" step="0.01"/>
+                        <label>saturation</label>
+                        <input class="saturation" type="range" min="0" max="5" step="0.01"/>
+                        <label>contrast</label>
+                        <input class="contrast" type="range" min="0" max="2" step="0.01"/>
+                        <label>brightness</label>
+                        <input class="brightness" type="range" min="-1" max="1" step="0.01"/>
+                      </fieldset>
+                    </li>
+                  </ul>
+                </li>
+              </ul>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=layer-group" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/layer-group.js b/examples/layer-group.js
new file mode 100644
index 0000000..4ec21fc
--- /dev/null
+++ b/examples/layer-group.js
@@ -0,0 +1,63 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.dom.Input');
+goog.require('ol.layer.Group');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.MapQuest');
+goog.require('ol.source.TileJSON');
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuest({layer: 'sat'})
+    }), new ol.layer.Group({
+      layers: [
+        new ol.layer.Tile({
+          source: new ol.source.TileJSON({
+            url: 'http://api.tiles.mapbox.com/v3/' +
+                'mapbox.20110804-hoa-foodinsecurity-3month.jsonp',
+            crossOrigin: 'anonymous'
+          })
+        }),
+        new ol.layer.Tile({
+          source: new ol.source.TileJSON({
+            url: 'http://api.tiles.mapbox.com/v3/' +
+                'mapbox.world-borders-light.jsonp',
+            crossOrigin: 'anonymous'
+          })
+        })
+      ]
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: ol.proj.transform([37.40570, 8.81566], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 4
+  })
+});
+
+function bindInputs(layerid, layer) {
+  new ol.dom.Input($(layerid + ' .visible')[0])
+      .bindTo('checked', layer, 'visible');
+  $.each(['opacity', 'hue', 'saturation', 'contrast', 'brightness'],
+      function(i, v) {
+        new ol.dom.Input($(layerid + ' .' + v)[0])
+            .bindTo('value', layer, v)
+            .transform(parseFloat, String);
+      }
+  );
+}
+map.getLayers().forEach(function(layer, i) {
+  bindInputs('#layer' + i, layer);
+  if (layer instanceof ol.layer.Group) {
+    layer.getLayers().forEach(function(sublayer, j) {
+      bindInputs('#layer' + i + j, sublayer);
+    });
+  }
+});
+
+$('#layertree li > span').click(function() {
+  $(this).siblings('fieldset').toggle();
+}).siblings('fieldset').hide();
diff --git a/examples/layer-spy.html b/examples/layer-spy.html
new file mode 100644
index 0000000..1eb895c
--- /dev/null
+++ b/examples/layer-spy.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Layer Spy Example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Layer spy example</h4>
+          <p id="shortdesc">View a portion of one layer over another</p>
+          <div id="docs">
+            <p>
+              Layer rendering can be manipulated in <code>precompose</code> and <code>postcompose</code> event listeners.
+              These listeners get an event with a reference to the Canvas rendering context.
+              In this example, the <code>precompose</code> listener sets a clipping mask around the most
+              recent mouse position, giving you a spyglass effect for viewing one layer over another.
+            </p>
+            <p>
+              Move around the map to see the effect.  Use the ↑ up and ↓ down arrow keys to adjust the spyglass size.
+            </p>
+            <p>See the <a href="layer-spy.js" target="_blank">layer-spy.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">spy, image manipulation</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=layer-spy" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/layer-spy.js b/examples/layer-spy.js
new file mode 100644
index 0000000..2eea7e3
--- /dev/null
+++ b/examples/layer-spy.js
@@ -0,0 +1,68 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.BingMaps');
+
+var key = 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3';
+
+var roads = new ol.layer.Tile({
+  source: new ol.source.BingMaps({key: key, imagerySet: 'Road'})
+});
+
+var imagery = new ol.layer.Tile({
+  source: new ol.source.BingMaps({key: key, imagerySet: 'Aerial'})
+});
+
+var map = new ol.Map({
+  layers: [roads, imagery],
+  target: 'map',
+  view: new ol.View({
+    center: ol.proj.transform([-109, 46.5], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 6
+  })
+});
+
+var radius = 75;
+$(document).keydown(function(evt) {
+  if (evt.which === 38) {
+    radius = Math.min(radius + 5, 150);
+    map.render();
+  } else if (evt.which === 40) {
+    radius = Math.max(radius - 5, 25);
+    map.render();
+  }
+});
+
+// get the pixel position with every move
+var mousePosition = null;
+$(map.getViewport()).on('mousemove', function(evt) {
+  mousePosition = map.getEventPixel(evt.originalEvent);
+  map.render();
+}).on('mouseout', function() {
+  mousePosition = null;
+  map.render();
+});
+
+// before rendering the layer, do some clipping
+imagery.on('precompose', function(event) {
+  var ctx = event.context;
+  var pixelRatio = event.frameState.pixelRatio;
+  ctx.save();
+  ctx.beginPath();
+  if (mousePosition) {
+    // only show a circle around the mouse
+    ctx.arc(mousePosition[0] * pixelRatio, mousePosition[1] * pixelRatio,
+        radius * pixelRatio, 0, 2 * Math.PI);
+    ctx.lineWidth = 5 * pixelRatio;
+    ctx.strokeStyle = 'rgba(0,0,0,0.5)';
+    ctx.stroke();
+  }
+  ctx.clip();
+});
+
+// after rendering the layer, restore the canvas context
+imagery.on('postcompose', function(event) {
+  var ctx = event.context;
+  ctx.restore();
+});
diff --git a/examples/layer-swipe.html b/examples/layer-swipe.html
new file mode 100644
index 0000000..15e34dc
--- /dev/null
+++ b/examples/layer-swipe.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Layer Swipe example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+          <input id="swipe" type="range" style="width: 100%">
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Layer Swipe example</h4>
+          <p id="shortdesc">Example of a Layer swipe map.</p>
+          <div id="docs">
+            <p>See the <a href="layer-swipe.js" target="_blank">layer-swipe.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">swipe, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=layer-swipe" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/layer-swipe.js b/examples/layer-swipe.js
new file mode 100644
index 0000000..c0a83fa
--- /dev/null
+++ b/examples/layer-swipe.js
@@ -0,0 +1,51 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.BingMaps');
+goog.require('ol.source.OSM');
+
+var osm = new ol.layer.Tile({
+  source: new ol.source.OSM()
+});
+var bing = new ol.layer.Tile({
+  source: new ol.source.BingMaps({
+    key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+    imagerySet: 'Aerial'
+  })
+});
+
+var map = new ol.Map({
+  layers: [osm, bing],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var swipe = document.getElementById('swipe');
+
+bing.on('precompose', function(event) {
+  var ctx = event.context;
+  var width = ctx.canvas.width * (swipe.value / 100);
+
+  ctx.save();
+  ctx.beginPath();
+  ctx.rect(width, 0, ctx.canvas.width - width, ctx.canvas.height);
+  ctx.clip();
+});
+
+bing.on('postcompose', function(event) {
+  var ctx = event.context;
+  ctx.restore();
+});
+
+swipe.addEventListener('input', function() {
+  map.render();
+}, false);
diff --git a/examples/lazy-source.html b/examples/lazy-source.html
new file mode 100644
index 0000000..ce57a05
--- /dev/null
+++ b/examples/lazy-source.html
@@ -0,0 +1,73 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Lazy Source</title>
+    <style>
+      button.code {
+        font-family: Monaco,Menlo,Consolas,"Courier New",monospace;
+        font-size: 12px;
+        padding: 5px;
+        margin: 0 5px;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Lazy source example</h4>
+          <p id="shortdesc">Example of setting a layer source after construction.</p>
+          <div id="docs">
+            <p>
+              Typically, the source for a layer is provided to the layer constructor.
+              If you need to set a layer source after construction, this can be
+              done with the <code>layer.setSource()</code> method.
+            </p>
+            <p>
+              The layer in the map above is constructed with no source.  Use the
+              links below to set/unset the layer source.  A layer is not rendered
+              until its source is set.
+            </p>
+            <p>
+              <button id="set-source" class="code">layer.setSource(source)</button>
+              <button id="unset-source" class="code">layer.setSource(null)</button>
+            </p>
+            <p>See the <a href="lazy-source.js" target="_blank">lazy-source.js source</a> for details on how this is done.</p>
+          </div>
+          <div id="tags">source</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=lazy-source" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/lazy-source.js b/examples/lazy-source.js
new file mode 100644
index 0000000..b53347b
--- /dev/null
+++ b/examples/lazy-source.js
@@ -0,0 +1,26 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.MapQuest');
+
+var source = new ol.source.MapQuest({layer: 'sat'});
+
+var layer = new ol.layer.Tile();
+
+var map = new ol.Map({
+  layers: [layer],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+document.getElementById('set-source').onclick = function() {
+  layer.setSource(source);
+};
+
+document.getElementById('unset-source').onclick = function() {
+  layer.setSource(null);
+};
diff --git a/examples/localized-openstreetmap.html b/examples/localized-openstreetmap.html
new file mode 100644
index 0000000..aeecd23
--- /dev/null
+++ b/examples/localized-openstreetmap.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Localized OpenStreetMap example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Localized OpenStreetMap example</h4>
+          <p id="shortdesc">Example of a localized OpenStreetMap map with a custom tile server and a custom attribution.</p>
+          <div id="docs">
+            <p>The base layer is <a href="http://www.opencyclemap.org/">OpenCycleMap</a> with an overlay from <a href="http://www.openseamap.org/">OpenSeaMap</a>. The OpenSeaMap tile server does not support <a href="http://enable-cors.org/">CORS</a> headers.</p>
+            <p>See the <a href="localized-openstreetmap.js" target="_blank">localized-openstreetmap.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">cors, localized-openstreetmap, openseamap, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=localized-openstreetmap" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/localized-openstreetmap.js b/examples/localized-openstreetmap.js
new file mode 100644
index 0000000..41e41f2
--- /dev/null
+++ b/examples/localized-openstreetmap.js
@@ -0,0 +1,56 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+// tiles.openseamap.org does not set CORS headers, so we have to disable
+// crossOrigin and we cannot use WebGL.
+
+var openCycleMapLayer = new ol.layer.Tile({
+  source: new ol.source.OSM({
+    attributions: [
+      new ol.Attribution({
+        html: 'All maps © ' +
+            '<a href="http://www.opencyclemap.org/">OpenCycleMap</a>'
+      }),
+      ol.source.OSM.ATTRIBUTION
+    ],
+    url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png'
+  })
+});
+
+var openSeaMapLayer = new ol.layer.Tile({
+  source: new ol.source.OSM({
+    attributions: [
+      new ol.Attribution({
+        html: 'All maps © ' +
+            '<a href="http://www.openseamap.org/">OpenSeaMap</a>'
+      }),
+      ol.source.OSM.ATTRIBUTION
+    ],
+    crossOrigin: null,
+    url: 'http://tiles.openseamap.org/seamark/{z}/{x}/{y}.png'
+  })
+});
+
+
+var map = new ol.Map({
+  layers: [
+    openCycleMapLayer,
+    openSeaMapLayer
+  ],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    maxZoom: 18,
+    center: [-244780.24508882355, 5986452.183179816],
+    zoom: 15
+  })
+});
diff --git a/examples/mapguide-untiled.html b/examples/mapguide-untiled.html
new file mode 100644
index 0000000..3a3af56
--- /dev/null
+++ b/examples/mapguide-untiled.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>MapGuide untiled example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">MapGuide untiled example</h4>
+          <p id="shortdesc">Example of a untiled MapGuide map.</p>
+          <div id="docs">
+            <p>See the <a href="mapguide-untiled.js" target="_blank">mapguide-untiled.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">mapguide</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=mapguide-untiled" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/mapguide-untiled.js b/examples/mapguide-untiled.js
new file mode 100644
index 0000000..2270ce4
--- /dev/null
+++ b/examples/mapguide-untiled.js
@@ -0,0 +1,38 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Image');
+goog.require('ol.source.ImageMapGuide');
+
+var mdf = 'Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition';
+var agentUrl =
+    'http://data.mapguide.com/mapguide/mapagent/mapagent.fcgi?USERNAME=Anonymous';
+var bounds = [
+  -87.865114442365922,
+  43.665065564837931,
+  -87.595394059497067,
+  43.823852564430069
+];
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Image({
+      extent: bounds,
+      source: new ol.source.ImageMapGuide({
+        projection: 'EPSG:4326',
+        url: agentUrl,
+        useOverlay: false,
+        metersPerUnit: 111319.4908, //value returned from mapguide
+        params: {
+          MAPDEFINITION: mdf,
+          FORMAT: 'PNG'
+        },
+        ratio: 2
+      })
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [-87.7302542509315, 43.744459064634],
+    projection: 'EPSG:4326',
+    zoom: 12
+  })
+});
diff --git a/examples/mapquest.html b/examples/mapquest.html
new file mode 100644
index 0000000..c9ef06a
--- /dev/null
+++ b/examples/mapquest.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>MapQuest example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+          <select id="layer-select">
+            <option value="Aerial">Aerial</option>
+            <option value="AerialWithLabels">Aerial with labels</option>
+            <option value="Road" selected>Road</option>
+          </select>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">MapQuest example</h4>
+          <p id="shortdesc">Example of a MapQuest map.</p>
+          <div id="docs">
+            <p>See the <a href="mapquest.js" target="_blank">mapquest.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">mapquest</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=mapquest" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/mapquest.js b/examples/mapquest.js
new file mode 100644
index 0000000..f2bdf02
--- /dev/null
+++ b/examples/mapquest.js
@@ -0,0 +1,51 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Group');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.MapQuest');
+
+
+var layers = [
+  new ol.layer.Tile({
+    style: 'Road',
+    source: new ol.source.MapQuest({layer: 'osm'})
+  }),
+  new ol.layer.Tile({
+    style: 'Aerial',
+    visible: false,
+    source: new ol.source.MapQuest({layer: 'sat'})
+  }),
+  new ol.layer.Group({
+    style: 'AerialWithLabels',
+    visible: false,
+    layers: [
+      new ol.layer.Tile({
+        source: new ol.source.MapQuest({layer: 'sat'})
+      }),
+      new ol.layer.Tile({
+        source: new ol.source.MapQuest({layer: 'hyb'})
+      })
+    ]
+  })
+];
+
+var map = new ol.Map({
+  layers: layers,
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: ol.proj.transform(
+        [-73.979378, 40.702222], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 9
+  })
+});
+
+$('#layer-select').change(function() {
+  var style = $(this).find(':selected').val();
+  var i, ii;
+  for (i = 0, ii = layers.length; i < ii; ++i) {
+    layers[i].set('visible', (layers[i].get('style') == style));
+  }
+});
+$('#layer-select').trigger('change');
diff --git a/examples/measure.html b/examples/measure.html
new file mode 100644
index 0000000..e13c2d9
--- /dev/null
+++ b/examples/measure.html
@@ -0,0 +1,65 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Measure example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Measure example</h4>
+          <p id="shortdesc">Example of using the
+          ol.interaction.Draw interaction for creating simple
+          measuring application. </p>
+          <form class="form-inline">
+            <label>Geometry type  </label>
+              <select id="type">
+                <option value="length">Length</option>
+                <option value="area">Area</option>
+              </select>
+          </form>
+
+          <ol id="measureOutput" reversed></ol>
+
+          <div id="docs">
+              <p><i>NOTE: Measure is done in simple way on projected plane. Earth
+              curvature is not taken into account</i></p>
+            <p>See the <a href="measure.js" target="_blank">measure.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">draw, edit, measure, vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=measure" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/measure.js b/examples/measure.js
new file mode 100644
index 0000000..6f6c9f2
--- /dev/null
+++ b/examples/measure.js
@@ -0,0 +1,167 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.Polygon');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Draw');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.MapQuest');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.MapQuest({layer: 'sat'})
+});
+
+var source = new ol.source.Vector();
+
+var vector = new ol.layer.Vector({
+  source: source,
+  style: new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: 'rgba(255, 255, 255, 0.2)'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#ffcc33',
+      width: 2
+    }),
+    image: new ol.style.Circle({
+      radius: 7,
+      fill: new ol.style.Fill({
+        color: '#ffcc33'
+      })
+    })
+  })
+});
+
+
+/**
+ * Currently drawed feature
+ * @type {ol.Feature}
+ */
+var sketch;
+
+
+/**
+ * Element for currently drawed feature
+ * @type {Element}
+ */
+var sketchElement;
+
+
+/**
+ * handle pointer move
+ * @param {Event} evt
+ */
+var mouseMoveHandler = function(evt) {
+  if (sketch) {
+    var output;
+    var geom = (sketch.getGeometry());
+    if (geom instanceof ol.geom.Polygon) {
+      output = formatArea(/** @type {ol.geom.Polygon} */ (geom));
+
+    } else if (geom instanceof ol.geom.LineString) {
+      output = formatLength( /** @type {ol.geom.LineString} */ (geom));
+    }
+    sketchElement.innerHTML = output;
+  }
+};
+
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: 'map',
+  view: new ol.View({
+    center: [-11000000, 4600000],
+    zoom: 15
+  })
+});
+
+$(map.getViewport()).on('mousemove', mouseMoveHandler);
+
+var typeSelect = document.getElementById('type');
+
+var draw; // global so we can remove it later
+function addInteraction() {
+  var type = (typeSelect.value == 'area' ? 'Polygon' : 'LineString');
+  draw = new ol.interaction.Draw({
+    source: source,
+    type: /** @type {ol.geom.GeometryType} */ (type)
+  });
+  map.addInteraction(draw);
+
+  draw.on('drawstart',
+      function(evt) {
+        // set sketch
+        sketch = evt.feature;
+        sketchElement = document.createElement('li');
+        var outputList = document.getElementById('measureOutput');
+
+        if (outputList.childNodes) {
+          outputList.insertBefore(sketchElement, outputList.firstChild);
+        } else {
+          outputList.appendChild(sketchElement);
+        }
+      }, this);
+
+  draw.on('drawend',
+      function(evt) {
+        // unset sketch
+        sketch = null;
+        sketchElement = null;
+      }, this);
+}
+
+
+/**
+ * Let user change the geometry type.
+ * @param {Event} e Change event.
+ */
+typeSelect.onchange = function(e) {
+  map.removeInteraction(draw);
+  addInteraction();
+};
+
+
+/**
+ * format length output
+ * @param {ol.geom.LineString} line
+ * @return {string}
+ */
+var formatLength = function(line) {
+  var length = Math.round(line.getLength() * 100) / 100;
+  var output;
+  if (length > 100) {
+    output = (Math.round(length / 1000 * 100) / 100) +
+        ' ' + 'km';
+  } else {
+    output = (Math.round(length * 100) / 100) +
+        ' ' + 'm';
+  }
+  return output;
+};
+
+
+/**
+ * format length output
+ * @param {ol.geom.Polygon} polygon
+ * @return {string}
+ */
+var formatArea = function(polygon) {
+  var area = polygon.getArea();
+  var output;
+  if (area > 10000) {
+    output = (Math.round(area / 1000000 * 100) / 100) +
+        ' ' + 'km<sup>2</sup>';
+  } else {
+    output = (Math.round(area * 100) / 100) +
+        ' ' + 'm<sup>2</sup>';
+  }
+  return output;
+};
+
+addInteraction();
diff --git a/examples/min-max-resolution.html b/examples/min-max-resolution.html
new file mode 100644
index 0000000..0f79406
--- /dev/null
+++ b/examples/min-max-resolution.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Min/max resolution example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Min/max resolution example</h4>
+          <p id="shortdesc">Show/hide layers depending on current view resolution.</p>
+          <div id="docs">
+            <p>
+            Zoom in twice: the MapBox layer should hide whereas the OSM layer should be shown.
+            </p>
+            <p>
+            If you continue to zoom in, you'll see the OSM layer also disappear.
+            </p>
+            <p>
+            The rendering of the layers are here controlled using minResolution and maxResolution options.
+            </p>
+            <p>See the <a href="min-max-resolution.js" target="_blank">min-max-resolution.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">minResolution, maxResolution, resolution</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=min-max-resolution" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/min-max-resolution.js b/examples/min-max-resolution.js
new file mode 100644
index 0000000..6bfe03a
--- /dev/null
+++ b/examples/min-max-resolution.js
@@ -0,0 +1,40 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+goog.require('ol.source.TileJSON');
+
+
+/**
+ * Create the map.
+ */
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM(),
+      minResolution: 200,
+      maxResolution: 2000
+    }),
+    new ol.layer.Tile({
+      source: new ol.source.TileJSON({
+        url: 'http://api.tiles.mapbox.com/v3/' +
+            'mapbox.natural-earth-hypso-bathy.jsonp',
+        crossOrigin: 'anonymous'
+      }),
+      minResolution: 2000,
+      maxResolution: 20000
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [653600, 5723680],
+    zoom: 5
+  })
+});
diff --git a/examples/mobile-full-screen.html b/examples/mobile-full-screen.html
new file mode 100644
index 0000000..1afd908
--- /dev/null
+++ b/examples/mobile-full-screen.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <title>Mobile full screen example</title>
+    <style type="text/css">
+      html, body, .map {
+        margin: 0;
+        padding: 0;
+        width: 100%;
+        height: 100%;
+      }
+    </style>
+  </head>
+  <body>
+    <div id="map" class="map"></div>
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="http://cdnjs.cloudflare.com/ajax/libs/fastclick/1.0.3/fastclick.js" type="text/javascript"></script>
+    <script src="loader.js?id=mobile-full-screen" type="text/javascript"></script>
+
+    <div style="display: none;">
+      <div id="title">Mobile full screen example</div>
+      <div id="shortdesc">Example of a full screen map.</div>
+      <div id="tags">fullscreen, bing, geolocation, mobile</div>
+    </div>
+  </body>
+</html>
diff --git a/examples/mobile-full-screen.js b/examples/mobile-full-screen.js
new file mode 100644
index 0000000..22967b7
--- /dev/null
+++ b/examples/mobile-full-screen.js
@@ -0,0 +1,42 @@
+goog.require('ol.Geolocation');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.BingMaps');
+
+
+var view = new ol.View({
+  center: [0, 0],
+  zoom: 2
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.BingMaps({
+        key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+        imagerySet: 'Road'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: view
+});
+
+var geolocation = new ol.Geolocation({
+  projection: view.getProjection(),
+  tracking: true
+});
+geolocation.once('change:position', function() {
+  view.setCenter(geolocation.getPosition());
+  view.setResolution(2.388657133911758);
+});
+
+// Use FastClick to eliminate the 300ms delay between a physical tap
+// and the firing of a click event on mobile browsers.
+// See http://updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away
+// for more information.
+$(function() {
+  FastClick.attach(document.body);
+});
diff --git a/examples/modify-features.html b/examples/modify-features.html
new file mode 100644
index 0000000..1a56905
--- /dev/null
+++ b/examples/modify-features.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Modify features example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Modify features example</h4>
+          <p id="shortdesc">Editing features with the modify interaction.</p>
+          <div id="docs">
+            <p>This example demonstrates how the modify and select interactions can be used together.  Zoom in to an area of interest and select a feature for editing.  Then drag points around to modify the feature.  You can preserve topology by selecting multiple features before editing (<code>Shift</code>+click to select multiple features).</p>
+            <p>See the <a href="modify-features.js" target="_blank">modify-features.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">modify, edit, vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="loader.js?id=modify-features" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/modify-features.js b/examples/modify-features.js
new file mode 100644
index 0000000..d3b6948
--- /dev/null
+++ b/examples/modify-features.js
@@ -0,0 +1,39 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Modify');
+goog.require('ol.interaction.Select');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.MapQuest');
+
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.MapQuest({
+    layer: 'sat'
+  })
+});
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.GeoJSON({
+    projection: 'EPSG:3857',
+    url: 'data/geojson/countries.geojson'
+  })
+});
+
+var select = new ol.interaction.Select();
+
+var modify = new ol.interaction.Modify({
+  features: select.getFeatures()
+});
+
+var map = new ol.Map({
+  interactions: ol.interaction.defaults().extend([select, modify]),
+  layers: [raster, vector],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/modify-test.html b/examples/modify-test.html
new file mode 100644
index 0000000..c4b3b61
--- /dev/null
+++ b/examples/modify-test.html
@@ -0,0 +1,57 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Modify features test</title>
+    <style>
+      .map {
+        background: grey;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Modify features test</h4>
+          <p id="shortdesc">Example for testing feature modification.</p>
+          <div id="docs">
+            <p>See the <a href="modify-test.js" target="_blank">modify-test.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">modify, edit, vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="loader.js?id=modify-test" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/modify-test.js b/examples/modify-test.js
new file mode 100644
index 0000000..d0f46dd
--- /dev/null
+++ b/examples/modify-test.js
@@ -0,0 +1,250 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Modify');
+goog.require('ol.interaction.Select');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var styleFunction = (function() {
+  /* jshint -W069 */
+  var styles = {};
+  var image = new ol.style.Circle({
+    radius: 5,
+    fill: null,
+    stroke: new ol.style.Stroke({color: 'orange', width: 2})
+  });
+  styles['Point'] = [new ol.style.Style({image: image})];
+  styles['Polygon'] = [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'blue',
+      width: 3
+    }),
+    fill: new ol.style.Fill({
+      color: 'rgba(0, 0, 255, 0.1)'
+    })
+  })];
+  styles['MultiLinestring'] = [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'green',
+      width: 3
+    })
+  })];
+  styles['MultiPolygon'] = [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'yellow',
+      width: 1
+    }),
+    fill: new ol.style.Fill({
+      color: 'rgba(255, 255, 0, 0.1)'
+    })
+  })];
+  styles['default'] = [new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'red',
+      width: 3
+    }),
+    fill: new ol.style.Fill({
+      color: 'rgba(255, 0, 0, 0.1)'
+    }),
+    image: image
+  })];
+  return function(feature, resolution) {
+    return styles[feature.getGeometry().getType()] || styles['default'];
+  };
+  /* jshint +W069 */
+})();
+
+var source = new ol.source.GeoJSON(
+    /** @type {olx.source.GeoJSONOptions} */ ({
+      object: {
+        'type': 'FeatureCollection',
+        'crs': {
+          'type': 'name',
+          'properties': {
+            'name': 'EPSG:3857'
+          }
+        },
+        'features': [
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'Point',
+              'coordinates': [0, 0]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'MultiPoint',
+              'coordinates': [[-2e6, 0], [0, -2e6]]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'LineString',
+              'coordinates': [[4e6, -2e6], [8e6, 2e6], [9e6, 2e6]]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'LineString',
+              'coordinates': [[4e6, -2e6], [8e6, 2e6], [8e6, 3e6]]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'Polygon',
+              'coordinates': [[[-5e6, -1e6], [-4e6, 1e6],
+                  [-3e6, -1e6], [-5e6, -1e6]], [[-4.5e6, -0.5e6],
+                  [-3.5e6, -0.5e6], [-4e6, 0.5e6], [-4.5e6, -0.5e6]]]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'MultiLineString',
+              'coordinates': [
+                [[-1e6, -7.5e5], [-1e6, 7.5e5]],
+                [[1e6, -7.5e5], [1e6, 7.5e5]],
+                [[-7.5e5, -1e6], [7.5e5, -1e6]],
+                [[-7.5e5, 1e6], [7.5e5, 1e6]]
+              ]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'MultiPolygon',
+              'coordinates': [
+                [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6],
+                    [-3e6, 6e6], [-5e6, 6e6]]],
+                [[[-2e6, 6e6], [-2e6, 8e6], [0, 8e6],
+                    [0, 6e6], [-2e6, 6e6]]],
+                [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6],
+                    [3e6, 6e6], [1e6, 6e6]]]
+              ]
+            }
+          },
+          {
+            'type': 'Feature',
+            'geometry': {
+              'type': 'GeometryCollection',
+              'geometries': [
+                {
+                  'type': 'LineString',
+                  'coordinates': [[-5e6, -5e6], [0, -5e6]]
+                },
+                {
+                  'type': 'Point',
+                  'coordinates': [4e6, -5e6]
+                },
+                {
+                  'type': 'Polygon',
+                  'coordinates': [
+                    [[1e6, -6e6], [2e6, -4e6], [3e6, -6e6], [1e6, -6e6]]
+                  ]
+                }
+              ]
+            }
+          }
+        ]
+      }
+    }));
+
+var layer = new ol.layer.Vector({
+  source: source,
+  style: styleFunction
+});
+
+var overlayStyle = (function() {
+  /* jshint -W069 */
+  var styles = {};
+  styles['Polygon'] = [
+    new ol.style.Style({
+      fill: new ol.style.Fill({
+        color: [255, 255, 255, 0.5]
+      })
+    }),
+    new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: [255, 255, 255, 1],
+        width: 5
+      })
+    }),
+    new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: [0, 153, 255, 1],
+        width: 3
+      })
+    })
+  ];
+  styles['MultiPolygon'] = styles['Polygon'];
+
+  styles['LineString'] = [
+    new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: [255, 255, 255, 1],
+        width: 5
+      })
+    }),
+    new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: [0, 153, 255, 1],
+        width: 3
+      })
+    })
+  ];
+  styles['MultiLineString'] = styles['LineString'];
+
+  styles['Point'] = [
+    new ol.style.Style({
+      image: new ol.style.Circle({
+        radius: 7,
+        fill: new ol.style.Fill({
+          color: [0, 153, 255, 1]
+        }),
+        stroke: new ol.style.Stroke({
+          color: [255, 255, 255, 0.75],
+          width: 1.5
+        })
+      }),
+      zIndex: 100000
+    })
+  ];
+  styles['MultiPoint'] = styles['Point'];
+
+  styles['GeometryCollection'] = styles['Polygon'].concat(styles['Point']);
+
+  return function(feature, resolution) {
+    return styles[feature.getGeometry().getType()];
+  };
+  /* jshint +W069 */
+})();
+
+var select = new ol.interaction.Select({
+  style: overlayStyle
+});
+
+var modify = new ol.interaction.Modify({
+  features: select.getFeatures(),
+  style: overlayStyle
+});
+
+var map = new ol.Map({
+  interactions: ol.interaction.defaults().extend([select, modify]),
+  layers: [layer],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 1000000],
+    zoom: 2
+  })
+});
diff --git a/examples/mouse-position.html b/examples/mouse-position.html
new file mode 100644
index 0000000..de9b13e
--- /dev/null
+++ b/examples/mouse-position.html
@@ -0,0 +1,59 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Mouse position example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div class="span6">
+          <h4 id="title">Mouse position example</h4>
+          <p id="shortdesc">Example of a mouse position control, outside the map.</p>
+          <div id="docs">
+            <p>See the <a href="mouse-position.js" target="_blank">mouse-position.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">mouse-position, openstreetmap</div>
+          <form>
+            <label>Projection </label>
+            <select id="projection">
+              <option value="EPSG:4326">EPSG:4326</option>
+              <option value="EPSG:3857">EPSG:3857</option>
+            </select>
+            <label>Precision </label>
+            <input id="precision" type="number" min="0" max="12" value="4"/>
+          </form>
+        </div>
+        <div class="span6" id="mouse-position"> </div>
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=mouse-position" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/mouse-position.js b/examples/mouse-position.js
new file mode 100644
index 0000000..cdbf7ee
--- /dev/null
+++ b/examples/mouse-position.js
@@ -0,0 +1,56 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.MousePosition');
+goog.require('ol.coordinate');
+goog.require('ol.dom.Input');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+
+var mousePositionControl = new ol.control.MousePosition({
+  coordinateFormat: ol.coordinate.createStringXY(4),
+  projection: 'EPSG:4326',
+  // comment the following two lines to have the mouse position
+  // be placed within the map.
+  className: 'custom-mouse-position',
+  target: document.getElementById('mouse-position'),
+  undefinedHTML: ' '
+});
+
+var map = new ol.Map({
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }).extend([mousePositionControl]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var projectionSelect = new ol.dom.Input(document.getElementById('projection'));
+projectionSelect.bindTo('value', mousePositionControl, 'projection')
+  .transform(
+    function(code) {
+      // projectionSelect.value -> mousePositionControl.projection
+      return ol.proj.get(/** @type {string} */ (code));
+    },
+    function(projection) {
+      // mousePositionControl.projection -> projectionSelect.value
+      return projection.getCode();
+    });
+
+var precisionInput = document.getElementById('precision');
+precisionInput.addEventListener('change', function() {
+  var format = ol.coordinate.createStringXY(precisionInput.valueAsNumber);
+  mousePositionControl.setCoordinateFormat(format);
+}, false);
diff --git a/examples/moveend.html b/examples/moveend.html
new file mode 100644
index 0000000..f88b248
--- /dev/null
+++ b/examples/moveend.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Moveend Example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div class="span12">
+          <h4 id="title">Move end example</h4>
+          <p id="shortdesc">Use of the moveend event.</p>
+          <div id="docs">
+            <p>In this example, a listener is registered for the map's <code>moveend</code> event.  Whenever this listener is called, it updates the inputs below with the map extent in decimal degrees.</p>
+            <p>See the <a href="moveend.js" target="_blank">moveend.js source</a> for details on how this is done.</p>
+          </div>
+          <div id="tags">moveend, map, event</div>
+          <label>top</label><input type="text" id="top">
+          <label>right</label><input type="text" id="right">
+          <label>bottom</label><input type="text" id="bottom">
+          <label>left</label><input type="text" id="left">
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=moveend" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/moveend.js b/examples/moveend.js
new file mode 100644
index 0000000..1f2799b
--- /dev/null
+++ b/examples/moveend.js
@@ -0,0 +1,51 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.extent');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+function display(id, value) {
+  document.getElementById(id).value = value.toFixed(2);
+}
+
+function wrapLon(value) {
+  var worlds = Math.floor((value + 180) / 360);
+  return value - (worlds * 360);
+}
+
+function onMoveEnd(evt) {
+  var map = evt.map;
+  var extent = map.getView().calculateExtent(map.getSize());
+  var bottomLeft = ol.proj.transform(ol.extent.getBottomLeft(extent),
+      'EPSG:3857', 'EPSG:4326');
+  var topRight = ol.proj.transform(ol.extent.getTopRight(extent),
+      'EPSG:3857', 'EPSG:4326');
+  display('left', wrapLon(bottomLeft[0]));
+  display('bottom', bottomLeft[1]);
+  display('right', wrapLon(topRight[0]));
+  display('top', topRight[1]);
+}
+
+map.on('moveend', onMoveEnd);
diff --git a/examples/navigation-controls.html b/examples/navigation-controls.html
new file mode 100644
index 0000000..f4d3ba0
--- /dev/null
+++ b/examples/navigation-controls.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Navigation controls example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Navigation controls example</h4>
+          <p id="shortdesc">Shows how to add navigation controls.</p>
+            The following navigation controls are added to the map:
+            <ul>
+              <li><code>ol.control.Zoom</code> (added by default)</li>
+              <li><code>ol.control.ZoomToExtent</code></li>
+            </ul>
+          <div id="docs">
+            <p>See the <a href="navigation-controls.js" target="_blank">navigation-controls.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">control, navigation, extent</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=navigation-controls" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/navigation-controls.js b/examples/navigation-controls.js
new file mode 100644
index 0000000..cc9034a
--- /dev/null
+++ b/examples/navigation-controls.js
@@ -0,0 +1,33 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.ZoomToExtent');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+var map = new ol.Map({
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }).extend([
+    new ol.control.ZoomToExtent({
+      extent: [
+        813079.7791264898, 5929220.284081122,
+        848966.9639063801, 5936863.986909639
+      ]
+    })
+  ]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/overlay.html b/examples/overlay.html
new file mode 100644
index 0000000..c3351e0
--- /dev/null
+++ b/examples/overlay.html
@@ -0,0 +1,82 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style type="text/css">
+      #marker {
+        width: 20px;
+        height: 20px;
+        border: 1px solid #088;
+        border-radius: 10px;
+        background-color: #0FF;
+        opacity: 0.5;
+      }
+      #vienna {
+        text-decoration: none;
+        color: white;
+        font-size: 11pt;
+        font-weight: bold;
+        text-shadow: black 0.1em 0.1em 0.2em;
+      }
+      .popover-content {
+        min-width: 180px;
+      }
+    </style>
+    <title>Overlay example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Overlay example</h4>
+          <p id="shortdesc">Demonstrates overlays.</p>
+          <div id="docs">
+            <p>The popups are created using
+              <a href="http://twitter.github.com/bootstrap/javascript.html#popovers">Popovers</a> from Bootstrap.</p>
+            <p>See the <a href="overlay.js" target="_blank">overlay.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">overlay, popup, bootstrap, popover, mapquest, openaerial</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <div style="display: none;">
+      <!-- Clickable label for Vienna -->
+      <a class="overlay" id="vienna" target="_blank" href="http://en.wikipedia.org/wiki/Vienna">Vienna</a>
+      <div id="marker" title="Marker"></div>
+      <!-- Popup -->
+      <div id="popup" title="Welcome to ol3"></div>
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=overlay" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/overlay.js b/examples/overlay.js
new file mode 100644
index 0000000..0a3c2f8
--- /dev/null
+++ b/examples/overlay.js
@@ -0,0 +1,64 @@
+goog.require('ol.Map');
+goog.require('ol.Overlay');
+goog.require('ol.View');
+goog.require('ol.coordinate');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.MapQuest');
+
+
+var layer = new ol.layer.Tile({
+  source: new ol.source.MapQuest({layer: 'sat'})
+});
+
+var map = new ol.Map({
+  layers: [layer],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var pos = ol.proj.transform([16.3725, 48.208889], 'EPSG:4326', 'EPSG:3857');
+
+// Vienna marker
+var marker = new ol.Overlay({
+  position: pos,
+  positioning: 'center-center',
+  element: document.getElementById('marker'),
+  stopEvent: false
+});
+map.addOverlay(marker);
+
+// Vienna label
+var vienna = new ol.Overlay({
+  position: pos,
+  element: document.getElementById('vienna')
+});
+map.addOverlay(vienna);
+
+// Popup showing the position the user clicked
+var popup = new ol.Overlay({
+  element: document.getElementById('popup')
+});
+map.addOverlay(popup);
+
+map.on('click', function(evt) {
+  var element = popup.getElement();
+  var coordinate = evt.coordinate;
+  var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(
+      coordinate, 'EPSG:3857', 'EPSG:4326'));
+
+  $(element).popover('destroy');
+  popup.setPosition(coordinate);
+  // the keys are quoted to prevent renaming in ADVANCED mode.
+  $(element).popover({
+    'placement': 'top',
+    'animation': false,
+    'html': true,
+    'content': '<p>The location you clicked was:</p><code>' + hdms + '</code>'
+  });
+  $(element).popover('show');
+});
diff --git a/examples/overviewmap-custom.html b/examples/overviewmap-custom.html
new file mode 100644
index 0000000..d00be13
--- /dev/null
+++ b/examples/overviewmap-custom.html
@@ -0,0 +1,77 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style type="text/css">
+      .ol-custom-overviewmap,
+      .ol-custom-overviewmap.ol-uncollapsible {
+        bottom: auto;
+        left: auto;
+        right: 0;
+        top: 0;
+      }
+
+      .ol-custom-overviewmap:not(.ol-collapsed)  {
+        border: 1px solid black;
+      }
+
+      .ol-custom-overviewmap .ol-overviewmap-map {
+        border: none;
+        width: 300px;
+      }
+
+      .ol-custom-overviewmap .ol-overviewmap-box {
+        border: 2px solid red;
+      }
+
+      .ol-custom-overviewmap:not(.ol-collapsed) button{
+        bottom: auto;
+        left: auto;
+        right: 1px;
+        top: 1px;
+      }
+
+      .ol-rotate {
+        top: 170px;
+        right: 0;
+      }
+
+    </style>
+    <title>ol3 OverviewMap control with advanced customization example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+      <h4 id="title">OverviewMap control, advanced</h4>
+      <div id="map" class="map"></div>
+
+      <div class="row-fluid">
+        <p id="shortdesc">Example of OverviewMap control with advanced customization.</p>
+        <div id="docs">
+          <p>See the <a href="overviewmap-custom.js" target="_blank">overviewmap-custom.js source</a> to see how this is done.</p>
+          <p>This example demonstrates how you can customize the overviewmap control using its supported options as well as defining custom CSS.  You can also rotate the map using the shift key to see how the overview map reacts.</p>
+        </div>
+        <div id="tags">overview, overviewmap</div>
+      </div>
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=overviewmap-custom" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/overviewmap-custom.js b/examples/overviewmap-custom.js
new file mode 100644
index 0000000..c9aa0c1
--- /dev/null
+++ b/examples/overviewmap-custom.js
@@ -0,0 +1,43 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.OverviewMap');
+goog.require('ol.interaction');
+goog.require('ol.interaction.DragRotateAndZoom');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+var overviewMapControl = new ol.control.OverviewMap({
+  // see in overviewmap-custom.html to see the custom CSS used
+  className: 'ol-overviewmap ol-custom-overviewmap',
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM({
+        'url': '//{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png'
+      })
+    })
+  ],
+  collapseLabel: '\u00BB',
+  label: '\u00AB',
+  collapsed: false
+});
+
+var map = new ol.Map({
+  controls: ol.control.defaults().extend([
+    overviewMapControl
+  ]),
+  interactions: ol.interaction.defaults().extend([
+    new ol.interaction.DragRotateAndZoom()
+  ]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [500000, 6000000],
+    zoom: 7
+  })
+});
diff --git a/examples/overviewmap.html b/examples/overviewmap.html
new file mode 100644
index 0000000..ca0a0da
--- /dev/null
+++ b/examples/overviewmap.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>ol3 OverviewMap control example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+      <h4 id="title">OverviewMap control</h4>
+      <div id="map" class="map"></div>
+
+      <div class="row-fluid">
+        <p id="shortdesc">Example of OverviewMap control.</p>
+        <div id="docs">
+          <p>See the <a href="overviewmap.js" target="_blank">overviewmap.js source</a> to see how this is done.</p>
+        </div>
+        <div id="tags">overview, overviewmap</div>
+      </div>
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=overviewmap" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/overviewmap.js b/examples/overviewmap.js
new file mode 100644
index 0000000..96f55ad
--- /dev/null
+++ b/examples/overviewmap.js
@@ -0,0 +1,22 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.OverviewMap');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+var map = new ol.Map({
+  controls: ol.control.defaults().extend([
+    new ol.control.OverviewMap()
+  ]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [500000, 6000000],
+    zoom: 7
+  })
+});
diff --git a/examples/popup.html b/examples/popup.html
new file mode 100644
index 0000000..9cdda57
--- /dev/null
+++ b/examples/popup.html
@@ -0,0 +1,106 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style type="text/css">
+      .ol-popup {
+        display: none;
+        position: absolute;
+        background-color: white;
+        -moz-box-shadow: 0 1px 4px rgba(0,0,0,0.2);
+        -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
+        filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2));
+        padding: 15px;
+        border-radius: 10px;
+        border: 1px solid #cccccc;
+        bottom: 12px;
+        left: -50px;
+      }
+      .ol-popup:after, .ol-popup:before {
+        top: 100%;
+        border: solid transparent;
+        content: " ";
+        height: 0;
+        width: 0;
+        position: absolute;
+        pointer-events: none;
+      }
+      .ol-popup:after {
+        border-top-color: white;
+        border-width: 10px;
+        left: 48px;
+        margin-left: -10px;
+      }
+      .ol-popup:before {
+        border-top-color: #cccccc;
+        border-width: 11px;
+        left: 48px;
+        margin-left: -11px;
+      }
+      .ol-popup-closer {
+        text-decoration: none;
+        position: absolute;
+        top: 2px;
+        right: 8px;
+      }
+      .ol-popup-closer:after {
+        content: "✖";
+      }
+    </style>
+    <title>Popup example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map">
+            <div id="popup" class="ol-popup">
+                <a href="#" id="popup-closer" class="ol-popup-closer"></a>
+                <div id="popup-content"></div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Popup example</h4>
+          <p id="shortdesc">Uses an overlay to create a popup.</p>
+          <div id="docs">
+            <p>
+              Click on the map to get a popup.  The popup is composed of a few basic elements: a container, a close button, and a place for the content.  To anchor the popup to the map, an <code>ol.Overlay</code> is created with the popup container.  A listener is registered for the map's <code>click</code> event to display the popup, and another listener is set as the <code>click</code> handler for the close button to hide the popup.
+            </p>
+            <p>
+              See the <a href="popup.js" target="_blank">popup.js source</a> to see how this is done.
+            </p>
+          </div>
+          <div id="tags">overlay, popup, mapquest, openaerial</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=popup" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/popup.js b/examples/popup.js
new file mode 100644
index 0000000..3cdb5ac
--- /dev/null
+++ b/examples/popup.js
@@ -0,0 +1,73 @@
+goog.require('ol.Map');
+goog.require('ol.Overlay');
+goog.require('ol.View');
+goog.require('ol.coordinate');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.TileJSON');
+
+
+/**
+ * Elements that make up the popup.
+ */
+var container = document.getElementById('popup');
+var content = document.getElementById('popup-content');
+var closer = document.getElementById('popup-closer');
+
+
+/**
+ * Add a click handler to hide the popup.
+ * @return {boolean} Don't follow the href.
+ */
+closer.onclick = function() {
+  container.style.display = 'none';
+  closer.blur();
+  return false;
+};
+
+
+/**
+ * Create an overlay to anchor the popup to the map.
+ */
+var overlay = new ol.Overlay({
+  element: container
+});
+
+
+/**
+ * Create the map.
+ */
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.TileJSON({
+        url: 'http://api.tiles.mapbox.com/v3/' +
+            'mapbox.natural-earth-hypso-bathy.jsonp',
+        crossOrigin: 'anonymous'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  overlays: [overlay],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+
+/**
+ * Add a click handler to the map to render the popup.
+ */
+map.on('click', function(evt) {
+  var coordinate = evt.coordinate;
+  var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(
+      coordinate, 'EPSG:3857', 'EPSG:4326'));
+
+  overlay.setPosition(coordinate);
+  content.innerHTML = '<p>You clicked here:</p><code>' + hdms +
+      '</code>';
+  container.style.display = 'block';
+
+});
diff --git a/examples/preload.html b/examples/preload.html
new file mode 100644
index 0000000..b45933d
--- /dev/null
+++ b/examples/preload.html
@@ -0,0 +1,55 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Preload example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span6">
+          <div id="map1" class="map"></div>
+        </div>
+        <div class="span6">
+          <div id="map2" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Preload example</h4>
+          <p id="shortdesc">Example of tile preloading.</p>
+          <div id="docs">
+            <p>The map on the left preloads low resolution tiles.  The map on the right does not use any preloading.  Try zooming out and panning to see the difference.</p>
+            <p>See the <a href="preload.js" target="_blank">preload.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">preload, bing</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=preload" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/preload.js b/examples/preload.js
new file mode 100644
index 0000000..fea8393
--- /dev/null
+++ b/examples/preload.js
@@ -0,0 +1,38 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.BingMaps');
+
+
+var map1 = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      preload: Infinity,
+      source: new ol.source.BingMaps({
+        key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+        imagerySet: 'Aerial'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map1',
+  view: new ol.View({
+    center: [-4808600, -2620936],
+    zoom: 8
+  })
+});
+
+var map2 = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      preload: 0, // default value
+      source: new ol.source.BingMaps({
+        key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+        imagerySet: 'AerialWithLabels'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map2'
+});
+map2.bindTo('view', map1);
diff --git a/examples/readme.md b/examples/readme.md
new file mode 100644
index 0000000..bfce29d
--- /dev/null
+++ b/examples/readme.md
@@ -0,0 +1,16 @@
+# Code examples
+
+Although the main purpose of these examples is to demonstrate how to use the API, they also serve other purposes in the development cycle, and so are not exactly as they would be in normal application code:
+
+* every time the library changes, they are compiled together with the library as a basic check that they remain in sync with the library
+* they use a special loader script to enable defining at run time which build mode (raw/debug/advanced) to use
+
+To enable this, examples have the following, not needed in application code:
+
+* each html file loads `loader.js`; application code would not need this, but would instead load the appropriate library build file, either a hosted version or a custom build
+* each js file starts with `goog.require` functions, used by the compiler; application code would only have these if the code is to be compiled together with the library and/or Closure library
+* some js files use type definitions (comments with @type tags); these are also used by the compiler, and are only needed if the code is to be compiled together with the library
+* html files load `example-behaviour.js` and some js files define the Map renderer option as `exampleNS.getRendererFromQueryString()`; application code would not need these
+* in addition, examples use Twitter Bootstrap and jQuery; this is of course not a requirement - you may use whichever presentation/helper libraries you wish
+
+See [Quick Start tutorial](http://openlayers.org/en/master/doc/quickstart.html) for a simple example of how application code would use the library.
diff --git a/examples/regularshape.html b/examples/regularshape.html
new file mode 100644
index 0000000..2b1ecfc
--- /dev/null
+++ b/examples/regularshape.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Regular Shape example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Regular Shape example</h4>
+          <p id="shortdesc">Example of some Regular Shape styles.</p>
+          <div id="docs">
+            <p>See the <a href="regularshape.js" target="_blank">regularshape.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">vector, symbol, regularshape, style, square, cross, star, triangle, x</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=regularshape" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/regularshape.js b/examples/regularshape.js
new file mode 100644
index 0000000..195054b
--- /dev/null
+++ b/examples/regularshape.js
@@ -0,0 +1,101 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Fill');
+goog.require('ol.style.RegularShape');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var stroke = new ol.style.Stroke({color: 'black', width: 2});
+var fill = new ol.style.Fill({color: 'red'});
+
+var styles = {
+  'square': [new ol.style.Style({
+    image: new ol.style.RegularShape(
+        /** @type {olx.style.RegularShapeOptions} */({
+          fill: fill,
+          stroke: stroke,
+          points: 4,
+          radius: 10,
+          angle: Math.PI / 4
+        }))
+  })],
+  'triangle': [new ol.style.Style({
+    image: new ol.style.RegularShape(
+        /** @type {olx.style.RegularShapeOptions} */({
+          fill: fill,
+          stroke: stroke,
+          points: 3,
+          radius: 10,
+          rotation: Math.PI / 4,
+          angle: 0
+        }))
+  })],
+  'star': [new ol.style.Style({
+    image: new ol.style.RegularShape(
+        /** @type {olx.style.RegularShapeOptions} */({
+          fill: fill,
+          stroke: stroke,
+          points: 5,
+          radius: 10,
+          radius2: 4,
+          angle: 0
+        }))
+  })],
+  'cross': [new ol.style.Style({
+    image: new ol.style.RegularShape(
+        /** @type {olx.style.RegularShapeOptions} */({
+          fill: fill,
+          stroke: stroke,
+          points: 4,
+          radius: 10,
+          radius2: 0,
+          angle: 0
+        }))
+  })],
+  'x': [new ol.style.Style({
+    image: new ol.style.RegularShape(
+        /** @type {olx.style.RegularShapeOptions} */({
+          fill: fill,
+          stroke: stroke,
+          points: 4,
+          radius: 10,
+          radius2: 0,
+          angle: Math.PI / 4
+        }))
+  })]
+};
+
+
+var styleKeys = ['x', 'cross', 'star', 'triangle', 'square'];
+var count = 250;
+var features = new Array(count);
+var e = 4500000;
+for (var i = 0; i < count; ++i) {
+  var coordinates = [2 * e * Math.random() - e, 2 * e * Math.random() - e];
+  features[i] = new ol.Feature(new ol.geom.Point(coordinates));
+  features[i].setStyle(styles[styleKeys[Math.floor(Math.random() * 5)]]);
+}
+
+var source = new ol.source.Vector({
+  features: features
+});
+
+var vectorLayer = new ol.layer.Vector({
+  source: source
+});
+
+var map = new ol.Map({
+  layers: [
+    vectorLayer
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/rotation.html b/examples/rotation.html
new file mode 100644
index 0000000..b6e94d9
--- /dev/null
+++ b/examples/rotation.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Rotation example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Rotation example</h4>
+          <p id="shortdesc">Example of a rotated map.</p>
+          <div id="docs">
+            <p>Use <code>Alt</code>+<code>Shift</code>+drag to rotate the map.</p>
+            <p>See the <a href="rotation.js" target="_blank">rotation.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">rotation, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=rotation" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/rotation.js b/examples/rotation.js
new file mode 100644
index 0000000..4fa63b6
--- /dev/null
+++ b/examples/rotation.js
@@ -0,0 +1,26 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [-25860000, 4130000],
+    rotation: Math.PI / 6,
+    zoom: 10
+  })
+});
diff --git a/examples/scale-line.html b/examples/scale-line.html
new file mode 100644
index 0000000..2151535
--- /dev/null
+++ b/examples/scale-line.html
@@ -0,0 +1,58 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Scale line example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+          <select id="units">
+            <option value="degrees">degrees</option>
+            <option value="imperial">imperial inch</option>
+            <option value="us">us inch</option>
+            <option value="nautical">nautical mile</option>
+            <option value="metric">metric</option>
+          </select>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Scale line example</h4>
+          <p id="shortdesc">Example of a scale line.</p>
+          <div id="docs">
+            <p>See the <a href="scale-line.js" target="_blank">scale-line.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">scale-line, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=scale-line" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/scale-line.js b/examples/scale-line.js
new file mode 100644
index 0000000..b495fed
--- /dev/null
+++ b/examples/scale-line.js
@@ -0,0 +1,35 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.ScaleLine');
+goog.require('ol.dom.Input');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+var scaleLineControl = new ol.control.ScaleLine();
+
+var map = new ol.Map({
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }).extend([
+    scaleLineControl
+  ]),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+
+var unitsSelect = new ol.dom.Input(document.getElementById('units'));
+unitsSelect.bindTo('value', scaleLineControl, 'units');
diff --git a/examples/select-features.html b/examples/select-features.html
new file mode 100644
index 0000000..a6da894
--- /dev/null
+++ b/examples/select-features.html
@@ -0,0 +1,62 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Select features example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Select features example</h4>
+          <p id="shortdesc">Example of using the Select interaction. Choose between <code>Single-click</code>, <code>Click</code> and <code>Hover</code> as the event type for selection in the combobox below. When using <code>Single-click</code> or <code>Click</code> you can hold do <code>Shift</code> key to toggle the feature in the selection.</p>
+          <p>Note: when <code>Single-click</code> is used double-clicks won't select features. This in contrast to <code>Click</code>, where a double-click will both select the feature and zoom the map (because of the <code>DoubleClickZoom</code> interaction). Note that <code>Single-click</code> is less responsive than <code>Click</code> because of the delay it uses to detect double-clicks.</p>
+          <form class="form-inline">
+            <label>Action type  </label>
+              <select id="type">
+                <option value="none" selected>None</option>
+                <option value="singleclick">Single-click</option>
+                <option value="click">Click</option>
+                <option value="mousemove">Hover</option>
+              </select>
+          </form>
+          <div id="docs">
+            <p>See the <a href="select-features.js" target="_blank">select-features.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">select, vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=select-features" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/select-features.js b/examples/select-features.js
new file mode 100644
index 0000000..7386fa9
--- /dev/null
+++ b/examples/select-features.js
@@ -0,0 +1,72 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.events.condition');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Select');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.MapQuest');
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.MapQuest({layer: 'sat'})
+});
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.GeoJSON({
+    projection: 'EPSG:3857',
+    url: 'data/geojson/countries.geojson'
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var select = null;  // ref to currently selected interaction
+
+// select interaction working on "singleclick"
+var selectSingleClick = new ol.interaction.Select();
+
+// select interaction working on "click"
+var selectClick = new ol.interaction.Select({
+  condition: ol.events.condition.click
+});
+
+// select interaction working on "mousemove"
+var selectMouseMove = new ol.interaction.Select({
+  condition: ol.events.condition.mouseMove
+});
+
+var selectElement = document.getElementById('type');
+
+var changeInteraction = function() {
+  if (select !== null) {
+    map.removeInteraction(select);
+  }
+  var value = selectElement.value;
+  if (value == 'singleclick') {
+    select = selectSingleClick;
+  } else if (value == 'click') {
+    select = selectClick;
+  } else if (value == 'mousemove') {
+    select = selectMouseMove;
+  } else {
+    select = null;
+  }
+  if (select !== null) {
+    map.addInteraction(select);
+  }
+};
+
+
+/**
+ * onchange callback on the select element.
+ */
+selectElement.onchange = changeInteraction;
+changeInteraction();
diff --git a/examples/semi-transparent-layer.html b/examples/semi-transparent-layer.html
new file mode 100644
index 0000000..24f7302
--- /dev/null
+++ b/examples/semi-transparent-layer.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Semi-transparent layer example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Semi-transparent layer example</h4>
+          <p id="shortdesc">Example of a map with a semi-transparent layer.</p>
+          <div id="docs">
+            <p>See the <a href="semi-transparent-layer.js" target="_blank">semi-transparent-layer.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">transparent, mapquest, tilejson</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=semi-transparent-layer" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/semi-transparent-layer.js b/examples/semi-transparent-layer.js
new file mode 100644
index 0000000..6a3fd3c
--- /dev/null
+++ b/examples/semi-transparent-layer.js
@@ -0,0 +1,27 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.MapQuest');
+goog.require('ol.source.TileJSON');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuest({layer: 'sat'})
+    }),
+    new ol.layer.Tile({
+      source: new ol.source.TileJSON({
+        url: 'http://api.tiles.mapbox.com/v3/mapbox.va-quake-aug.jsonp',
+        crossOrigin: 'anonymous'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: ol.proj.transform([-77.93255, 37.9555], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 5
+  })
+});
diff --git a/examples/side-by-side.html b/examples/side-by-side.html
new file mode 100644
index 0000000..67bb0f8
--- /dev/null
+++ b/examples/side-by-side.html
@@ -0,0 +1,63 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Side-by-side example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span4">
+          <h4>Canvas</h4>
+          <div id="canvasMap" class="map"></div>
+        </div>
+        <div class="span4">
+          <h4>WebGL</h4>
+          <div id="webglMap" class="map"></div>
+          <div id="no-webgl" class="alert alert-error" style="display: none">
+            This map requires a browser that supports <a href="http://get.webgl.org/">WebGL</a>.
+          </div>
+        </div>
+        <div class="span4">
+          <h4>DOM</h4>
+          <div id="domMap" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Side-by-side example</h4>
+          <p id="shortdesc">The three maps, one WebGL, one Canvas, one DOM, share the same center, resolution, rotation and layers.</p>
+          <div id="docs">
+            <p>See the <a href="side-by-side.js" target="_blank">side-by-side.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">side-by-side, canvas, webgl, dom, canvas, sync, object</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=side-by-side" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/side-by-side.js b/examples/side-by-side.js
new file mode 100644
index 0000000..a58340b
--- /dev/null
+++ b/examples/side-by-side.js
@@ -0,0 +1,41 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.has');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.MapQuest');
+
+
+var domMap = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuest({layer: 'sat'})
+    })
+  ],
+  renderer: 'dom',
+  target: 'domMap',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 1
+  })
+});
+
+if (ol.has.WEBGL) {
+  var webglMap = new ol.Map({
+    renderer: 'webgl',
+    target: 'webglMap'
+  });
+  webglMap.bindTo('layergroup', domMap);
+  webglMap.bindTo('view', domMap);
+} else {
+  var info = document.getElementById('no-webgl');
+  /**
+   * display error message
+   */
+  info.style.display = '';
+}
+
+var canvasMap = new ol.Map({
+  target: 'canvasMap'
+});
+canvasMap.bindTo('layergroup', domMap);
+canvasMap.bindTo('view', domMap);
diff --git a/examples/simple.html b/examples/simple.html
new file mode 100644
index 0000000..4f76028
--- /dev/null
+++ b/examples/simple.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Simple example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Simple example</h4>
+          <p id="shortdesc">Example of a simple map.</p>
+          <div id="docs">
+            <p>See the <a href="simple.js" target="_blank">simple.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">simple, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=simple" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/simple.js b/examples/simple.js
new file mode 100644
index 0000000..accd01a
--- /dev/null
+++ b/examples/simple.js
@@ -0,0 +1,25 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/sphere-mollweide.html b/examples/sphere-mollweide.html
new file mode 100644
index 0000000..9493769
--- /dev/null
+++ b/examples/sphere-mollweide.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Sphere Mollweide example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Sphere Mollweide example</h4>
+          <p id="shortdesc">Example of a Sphere Mollweide map with a Graticule component.</p>
+          <div id="docs">
+            <p>See the <a href="sphere-mollweide.js" target="_blank">sphere-mollweide.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">graticule, Mollweide, projection, proj4js</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.1/proj4.js" type="text/javascript"></script>
+    <script src="loader.js?id=sphere-mollweide" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/sphere-mollweide.js b/examples/sphere-mollweide.js
new file mode 100644
index 0000000..a9a07f6
--- /dev/null
+++ b/examples/sphere-mollweide.js
@@ -0,0 +1,42 @@
+goog.require('ol.Graticule');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Vector');
+goog.require('ol.proj');
+goog.require('ol.source.GeoJSON');
+
+
+proj4.defs('ESRI:53009', '+proj=moll +lon_0=0 +x_0=0 +y_0=0 +a=6371000 ' +
+    '+b=6371000 +units=m +no_defs');
+
+// Configure the Sphere Mollweide projection object with an extent,
+// and a world extent. These are required for the Graticule.
+var sphereMollweideProjection = ol.proj.get('ESRI:53009');
+sphereMollweideProjection.setExtent([
+  -9009954.605703328, -9009954.605703328,
+  9009954.605703328, 9009954.605703328]);
+sphereMollweideProjection.setWorldExtent([-179, -90, 179, 90]);
+
+var map = new ol.Map({
+  keyboardEventTarget: document,
+  layers: [
+    new ol.layer.Vector({
+      source: new ol.source.GeoJSON({
+        projection: sphereMollweideProjection,
+        url: 'data/geojson/countries-110m.geojson'
+      })
+    })
+  ],
+  renderer: 'canvas',
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    projection: sphereMollweideProjection,
+    resolutions: [65536, 32768, 16384, 8192, 4096, 2048],
+    zoom: 0
+  })
+});
+
+var graticule = new ol.Graticule({
+  map: map
+});
diff --git a/examples/stamen.html b/examples/stamen.html
new file mode 100644
index 0000000..4663db3
--- /dev/null
+++ b/examples/stamen.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Stamen example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Stamen example</h4>
+          <p id="shortdesc">Example of a Stamen tile source.  Two layers are composed: the watercolor base layer with the terrain labels.</p>
+          <div id="docs">
+            <p>See the <a href="stamen.js" target="_blank">stamen.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">stamen, watercolor, terrain-labels, two-layers</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=stamen" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/stamen.js b/examples/stamen.js
new file mode 100644
index 0000000..09ef791
--- /dev/null
+++ b/examples/stamen.js
@@ -0,0 +1,28 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.Stamen');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.Stamen({
+        layer: 'watercolor'
+      })
+    }),
+    new ol.layer.Tile({
+      source: new ol.source.Stamen({
+        layer: 'terrain-labels'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: ol.proj.transform(
+        [-122.416667, 37.783333], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 12
+  })
+});
diff --git a/examples/static-image.html b/examples/static-image.html
new file mode 100644
index 0000000..4e761dc
--- /dev/null
+++ b/examples/static-image.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Static image example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Static image example</h4>
+          <p id="shortdesc">Example of a static image layer.</p>
+          <div id="docs">
+            <p>
+              This example uses a <a href="http://xkcd.com/256/">static image</a>
+              as a layer source.  The map view is configured with a custom
+              projection that translates image coordinates directly into map
+              coordinates.
+            </p>
+            <p>
+              See the <a href="static-image.js" target="_blank">static-image.js source</a>
+              for details on how this is done.
+            </p>
+          </div>
+          <div id="tags">static image, xkcd</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=static-image" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/static-image.js b/examples/static-image.js
new file mode 100644
index 0000000..747d70b
--- /dev/null
+++ b/examples/static-image.js
@@ -0,0 +1,41 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.extent');
+goog.require('ol.layer.Image');
+goog.require('ol.proj.Projection');
+goog.require('ol.source.ImageStatic');
+
+
+// Map views always need a projection.  Here we just want to map image
+// coordinates directly to map coordinates, so we create a projection that uses
+// the image extent in pixels.
+var extent = [0, 0, 1024, 968];
+var projection = new ol.proj.Projection({
+  code: 'xkcd-image',
+  units: 'pixels',
+  extent: extent
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Image({
+      source: new ol.source.ImageStatic({
+        attributions: [
+          new ol.Attribution({
+            html: '© <a href="http://xkcd.com/license.html">xkcd</a>'
+          })
+        ],
+        url: 'http://imgs.xkcd.com/comics/online_communities.png',
+        projection: projection,
+        imageExtent: extent
+      })
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    projection: projection,
+    center: ol.extent.getCenter(extent),
+    zoom: 2
+  })
+});
diff --git a/examples/symbol-atlas-webgl.html b/examples/symbol-atlas-webgl.html
new file mode 100644
index 0000000..666bc43
--- /dev/null
+++ b/examples/symbol-atlas-webgl.html
@@ -0,0 +1,58 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Symbols with WebGL example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Symbols with WebGL example</h4>
+          <p id="shortdesc">Using symbols in an atlas with WebGL.</p>
+          <div id="docs">
+            <p>When using symbol styles with WebGL, OpenLayers would render the symbol
+            on a temporary image and would create a WebGL texture for each image. For a
+            better performance, it is recommended to use atlas images (similar to
+            image sprites with CSS), so that the number of textures is reduced. OpenLayers
+            provides an <code>AtlasManager</code>, which when passed to the constructor
+            of a symbol style, will create atlases for the symbols.</p>
+            <p>See the <a href="symbol-atlas-webgl.js" target="_blank">symbol-atlas-webgl.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">webgl, symbol, atlas, vector, point</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=symbol-atlas-webgl" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/symbol-atlas-webgl.js b/examples/symbol-atlas-webgl.js
new file mode 100644
index 0000000..22423c2
--- /dev/null
+++ b/examples/symbol-atlas-webgl.js
@@ -0,0 +1,123 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Vector');
+goog.require('ol.style.AtlasManager');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.RegularShape');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+var atlasManager = new ol.style.AtlasManager({
+  // we increase the initial size so that all symbols fit into
+  // a single atlas image
+  initialSize: 512
+});
+
+var symbolInfo = [{
+  opacity: 1.0,
+  scale: 1.0,
+  fillColor: 'rgba(255, 153, 0, 0.4)',
+  strokeColor: 'rgba(255, 204, 0, 0.2)'
+}, {
+  opacity: 0.75,
+  scale: 1.25,
+  fillColor: 'rgba(70, 80, 224, 0.4)',
+  strokeColor: 'rgba(12, 21, 138, 0.2)'
+}, {
+  opacity: 0.5,
+  scale: 1.5,
+  fillColor: 'rgba(66, 150, 79, 0.4)',
+  strokeColor: 'rgba(20, 99, 32, 0.2)'
+}, {
+  opacity: 1.0,
+  scale: 1.0,
+  fillColor: 'rgba(176, 61, 35, 0.4)',
+  strokeColor: 'rgba(145, 43, 20, 0.2)'
+}];
+
+var radiuses = [3, 6, 9, 15, 19, 25];
+var symbolCount = symbolInfo.length * radiuses.length * 2;
+var symbols = [];
+var i, j;
+for (i = 0; i < symbolInfo.length; ++i) {
+  var info = symbolInfo[i];
+  for (j = 0; j < radiuses.length; ++j) {
+    // circle symbol
+    symbols.push(new ol.style.Circle({
+      opacity: info.opacity,
+      scale: info.scale,
+      radius: radiuses[j],
+      fill: new ol.style.Fill({
+        color: info.fillColor
+      }),
+      stroke: new ol.style.Stroke({
+        color: info.strokeColor,
+        width: 1
+      }),
+      // by passing the atlas manager to the symbol,
+      // the symbol will be added to an atlas
+      atlasManager: atlasManager
+    }));
+
+    // star symbol
+    symbols.push(new ol.style.RegularShape({
+      points: 8,
+      opacity: info.opacity,
+      scale: info.scale,
+      radius: radiuses[j],
+      radius2: radiuses[j] * 0.7,
+      angle: 1.4,
+      fill: new ol.style.Fill({
+        color: info.fillColor
+      }),
+      stroke: new ol.style.Stroke({
+        color: info.strokeColor,
+        width: 1
+      }),
+      atlasManager: atlasManager
+    }));
+  }
+}
+
+var featureCount = 50000;
+var features = new Array(featureCount);
+var feature, geometry;
+var e = 25000000;
+for (i = 0; i < featureCount; ++i) {
+  geometry = new ol.geom.Point(
+      [2 * e * Math.random() - e, 2 * e * Math.random() - e]);
+  feature = new ol.Feature(geometry);
+  feature.setStyle(
+      new ol.style.Style({
+        image: symbols[i % symbolCount]
+      })
+  );
+  features[i] = feature;
+}
+
+var vectorSource = new ol.source.Vector({
+  features: features
+});
+var vector = new ol.layer.Vector({
+  source: vectorSource
+});
+
+// Use the "webgl" renderer by default.
+var renderer = exampleNS.getRendererFromQueryString();
+if (!renderer) {
+  renderer = 'webgl';
+}
+
+var map = new ol.Map({
+  renderer: renderer,
+  layers: [vector],
+  target: document.getElementById('map'),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 4
+  })
+});
diff --git a/examples/synthetic-lines.html b/examples/synthetic-lines.html
new file mode 100644
index 0000000..64f497f
--- /dev/null
+++ b/examples/synthetic-lines.html
@@ -0,0 +1,110 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Synthetic lines example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Synthetic lines example</h4>
+          <p id="shortdesc">Synthetic lines example.</p>
+          <div id="docs">
+            <p>See the <a href="synthetic-lines.js" target="_blank">synthetic-lines.js source</a> to see how this is done.</p>
+            <p>Performance results:</p>
+            <table border="1">
+              <thead>
+               <tr>
+                 <th>Device/Browser</th>
+                 <th>200 lines</th>
+                 <th>500 lines</th>
+                 <th>1000 lines</th>
+                 <th>2000 lines</th>
+                 <th>5000 lines</th>
+                 <th>10000 lines</th>
+                 <th>20000 lines</th>
+               </tr>
+              </thead>
+              <tbody>
+               <tr>
+                 <td>Mac Book Air / Chrome 33 canary</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+               </tr>
+               <tr>
+                 <td>Mac Book Air / FireFox 25</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>22 fps</td>
+                 <td>6 fps</td>
+               </tr>
+               <tr>
+                 <td>Mac Book Air / Safari 7</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>60 fps</td>
+                 <td>40 fps</td>
+                 <td>10 fps</td>
+                 <td>N/A</td>
+                 <td>N/A</td>
+               </tr>
+               <tr>
+                 <td>iPhone 4S / iOS 7 / Safari</td>
+                 <td>60 fps</td>
+                 <td>33 fps</td>
+                 <td>15 fps</td>
+                 <td>5 fps</td>
+                 <td>N/A</td>
+                 <td>N/A</td>
+                 <td>N/A</td>
+               </tr>
+             </tbody>
+            </table>
+
+          </div>
+          <div id="tags">vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=synthetic-lines" type="text/javascript"></script>
+    <script src="../resources/display-frame-rate.js" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/synthetic-lines.js b/examples/synthetic-lines.js
new file mode 100644
index 0000000..78754ca
--- /dev/null
+++ b/examples/synthetic-lines.js
@@ -0,0 +1,60 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.LineString');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var count = 10000;
+var features = new Array(count);
+
+var startPoint = [0, 0];
+var endPoint;
+
+var delta, deltaX, deltaY;
+var signX = 1;
+var signY = -1;
+
+// Create a square spiral.
+var i;
+for (i = 0; i < count; ++i) {
+  delta = (i + 1) * 2500;
+  if (i % 2 === 0) {
+    signY *= -1;
+  } else {
+    signX *= -1;
+  }
+  deltaX = delta * signX;
+  deltaY = delta * signY;
+  endPoint = [startPoint[0] + deltaX, startPoint[1] + deltaY];
+  features[i] = new ol.Feature({
+    'geometry': new ol.geom.LineString([startPoint, endPoint])
+  });
+  startPoint = endPoint;
+}
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.Vector({
+    features: features
+  }),
+  style: new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: '#666666',
+      width: 1
+    })
+  })
+});
+
+var view = new ol.View({
+  center: [0, 0],
+  zoom: 0
+});
+
+var map = new ol.Map({
+  layers: [vector],
+  target: 'map',
+  view: view
+});
diff --git a/examples/synthetic-points.html b/examples/synthetic-points.html
new file mode 100644
index 0000000..45cd56d
--- /dev/null
+++ b/examples/synthetic-points.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Synthetic points example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Synthetic points example</h4>
+          <p id="shortdesc">Synthetic points  example.</p>
+          <div id="docs">
+            <p>See the <a href="synthetic-points.js" target="_blank">synthetic-points.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">vector</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/bootstrap/js/bootstrap.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=synthetic-points" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/synthetic-points.js b/examples/synthetic-points.js
new file mode 100644
index 0000000..4381fd3
--- /dev/null
+++ b/examples/synthetic-points.js
@@ -0,0 +1,131 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var count = 20000;
+var features = new Array(count);
+var e = 18000000;
+for (var i = 0; i < count; ++i) {
+  features[i] = new ol.Feature({
+    'geometry': new ol.geom.Point(
+        [2 * e * Math.random() - e, 2 * e * Math.random() - e]),
+    'i': i,
+    'size': i % 2 ? 10 : 20
+  });
+}
+
+var styles = {
+  '10': [new ol.style.Style({
+    image: new ol.style.Circle({
+      radius: 5,
+      fill: new ol.style.Fill({color: '#666666'}),
+      stroke: new ol.style.Stroke({color: '#bada55', width: 1})
+    })
+  })],
+  '20': [new ol.style.Style({
+    image: new ol.style.Circle({
+      radius: 10,
+      fill: new ol.style.Fill({color: '#666666'}),
+      stroke: new ol.style.Stroke({color: '#bada55', width: 1})
+    })
+  })]
+};
+
+var vectorSource = new ol.source.Vector({
+  features: features
+});
+var vector = new ol.layer.Vector({
+  source: vectorSource,
+  style: function(feature, resolution) {
+    return styles[feature.get('size')];
+  }
+});
+
+var map = new ol.Map({
+  layers: [vector],
+  target: document.getElementById('map'),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var point = null;
+var line = null;
+var displaySnap = function(coordinate) {
+  var closestFeature = vectorSource.getClosestFeatureToCoordinate(coordinate);
+  if (closestFeature === null) {
+    point = null;
+    line = null;
+  } else {
+    var geometry = closestFeature.getGeometry();
+    var closestPoint = geometry.getClosestPoint(coordinate);
+    if (point === null) {
+      point = new ol.geom.Point(closestPoint);
+    } else {
+      point.setCoordinates(closestPoint);
+    }
+    if (line === null) {
+      line = new ol.geom.LineString([coordinate, closestPoint]);
+    } else {
+      line.setCoordinates([coordinate, closestPoint]);
+    }
+  }
+  map.render();
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var coordinate = map.getEventCoordinate(evt.originalEvent);
+  displaySnap(coordinate);
+});
+
+map.on('click', function(evt) {
+  displaySnap(evt.coordinate);
+});
+
+var imageStyle = new ol.style.Circle({
+  radius: 10,
+  fill: null,
+  stroke: new ol.style.Stroke({
+    color: 'rgba(255,255,0,0.9)',
+    width: 3
+  })
+});
+var strokeStyle = new ol.style.Stroke({
+  color: 'rgba(255,255,0,0.9)',
+  width: 3
+});
+map.on('postcompose', function(evt) {
+  var vectorContext = evt.vectorContext;
+  if (point !== null) {
+    vectorContext.setImageStyle(imageStyle);
+    vectorContext.drawPointGeometry(point);
+  }
+  if (line !== null) {
+    vectorContext.setFillStrokeStyle(null, strokeStyle);
+    vectorContext.drawLineStringGeometry(line);
+  }
+});
+
+$(map.getViewport()).on('mousemove', function(e) {
+  var pixel = map.getEventPixel(e.originalEvent);
+
+  var hit = map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    return true;
+  });
+
+  if (hit) {
+    map.getTarget().style.cursor = 'pointer';
+  } else {
+    map.getTarget().style.cursor = '';
+  }
+});
diff --git a/examples/teleport.html b/examples/teleport.html
new file mode 100644
index 0000000..c501ff4
--- /dev/null
+++ b/examples/teleport.html
@@ -0,0 +1,61 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Teleport example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span8">
+          <div id="map1" class="map"></div>
+        </div>
+        <div class="span4">
+          <div id="map2" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+        <div class="span12">
+          <a id="teleport" href="#" class="btn">Teleport</a>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Teleport example</h4>
+          <p id="shortdesc">Example of moving a map from one target to another.</p>
+          <div id="docs">
+            <p>Click on the Teleport button below the map to move the map from one target to another.</p>
+            <p>See the <a href="teleport.js" target="_blank">teleport.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">teleport, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=teleport" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/teleport.js b/examples/teleport.js
new file mode 100644
index 0000000..3aea72d
--- /dev/null
+++ b/examples/teleport.js
@@ -0,0 +1,33 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+map.setTarget('map1');
+
+var teleportButton = document.getElementById('teleport');
+
+teleportButton.addEventListener('click', function() {
+  var target = map.getTarget() === 'map1' ? 'map2' : 'map1';
+  map.setTarget(target);
+}, false);
diff --git a/examples/tile-vector.html b/examples/tile-vector.html
new file mode 100644
index 0000000..192e786
--- /dev/null
+++ b/examples/tile-vector.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Tile vector example</title>
+    <style>
+      #map {
+        max-width: 600px;
+        margin: 0 auto;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map" style="background: white;"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Tile vector example</h4>
+          <p id="shortdesc">Example of vector tiles from openstreetmap.us.</p>
+          <div id="docs">
+            <p>See the <a href="tile-vector.js" target="_blank">tile-vector.js source</a> to see how this is done.</p>
+          </div>
+          <div class="alert">
+            <strong>Warning</strong> Map is becoming unresponsive with too many layers.
+          </div>
+          <fieldset>
+            <legend>Layers</legend>
+            <label class="checkbox"><input type="checkbox" id="landuse"/> Landuse</label>
+            <label class="checkbox"><input type="checkbox" id="buildings"/> Buildings</label>
+            <label class="checkbox"><input type="checkbox" id="water" checked/> Water</label>
+            <label class="checkbox"><input type="checkbox" id="roads" checked/> Roads</label>
+          </fieldset>
+          <div id="tags">tile-vector, openstreetmap</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=tile-vector" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/tile-vector.js b/examples/tile-vector.js
new file mode 100644
index 0000000..ad0e121
--- /dev/null
+++ b/examples/tile-vector.js
@@ -0,0 +1,169 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.format.TopoJSON');
+goog.require('ol.layer.Vector');
+goog.require('ol.proj');
+goog.require('ol.source.TileVector');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.tilegrid.XYZ');
+
+var waterLayer = new ol.layer.Vector({
+  source: new ol.source.TileVector({
+    format: new ol.format.TopoJSON(),
+    projection: 'EPSG:3857',
+    tileGrid: new ol.tilegrid.XYZ({
+      maxZoom: 19
+    }),
+    url: 'http://{a-c}.tile.openstreetmap.us/' +
+        'vectiles-water-areas/{z}/{x}/{y}.topojson'
+  }),
+  style: new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: '#9db9e8'
+    })
+  })
+});
+
+var roadStyleCache = {};
+var roadLayer = new ol.layer.Vector({
+  source: new ol.source.TileVector({
+    format: new ol.format.TopoJSON(),
+    projection: 'EPSG:3857',
+    tileGrid: new ol.tilegrid.XYZ({
+      maxZoom: 19
+    }),
+    url: 'http://{a-c}.tile.openstreetmap.us/' +
+        'vectiles-highroad/{z}/{x}/{y}.topojson'
+  }),
+  style: function(feature, resolution) {
+    var kind = feature.get('kind');
+    var railway = feature.get('railway');
+    var sort_key = feature.get('sort_key');
+    var styleKey = kind + '/' + railway + '/' + sort_key;
+    var styleArray = roadStyleCache[styleKey];
+    if (!styleArray) {
+      var color, width;
+      if (railway) {
+        color = '#7de';
+        width = 1;
+      } else {
+        color = {
+          'major_road': '#776',
+          'minor_road': '#ccb',
+          'highway': '#f39'
+        }[kind];
+        width = kind == 'highway' ? 1.5 : 1;
+      }
+      styleArray = [new ol.style.Style({
+        stroke: new ol.style.Stroke({
+          color: color,
+          width: width
+        }),
+        zIndex: sort_key
+      })];
+      roadStyleCache[styleKey] = styleArray;
+    }
+    return styleArray;
+  }
+});
+
+var buildingStyle = [
+  new ol.style.Style({
+    fill: new ol.style.Fill({
+      color: '#666',
+      opacity: 0.4
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#444',
+      width: 1
+    })
+  })
+];
+var buildingLayer = new ol.layer.Vector({
+  source: new ol.source.TileVector({
+    format: new ol.format.TopoJSON({
+      defaultProjection: 'EPSG:4326'
+    }),
+    projection: 'EPSG:3857',
+    tileGrid: new ol.tilegrid.XYZ({
+      maxZoom: 19
+    }),
+    url: 'http://{a-c}.tile.openstreetmap.us/' +
+        'vectiles-buildings/{z}/{x}/{y}.topojson'
+  }),
+  visible: false,
+  style: function(f, resolution) {
+    return (resolution < 10) ? buildingStyle : [];
+  }
+});
+
+var landuseStyleCache = {};
+var landuseLayer = new ol.layer.Vector({
+  source: new ol.source.TileVector({
+    format: new ol.format.TopoJSON({
+      defaultProjection: 'EPSG:4326'
+    }),
+    projection: 'EPSG:3857',
+    tileGrid: new ol.tilegrid.XYZ({
+      maxZoom: 19
+    }),
+    url: 'http://{a-c}.tile.openstreetmap.us/' +
+        'vectiles-land-usages/{z}/{x}/{y}.topojson'
+  }),
+  visible: false,
+  style: function(feature, resolution) {
+    var kind = feature.get('kind');
+    var styleKey = kind;
+    var styleArray = landuseStyleCache[styleKey];
+    if (!styleArray) {
+      var color, width;
+      color = {
+        'parking': '#ddd',
+        'industrial': '#aaa',
+        'urban area': '#aaa',
+        'park': '#76C759',
+        'school': '#DA10E7',
+        'garden': '#76C759',
+        'pitch': '#D58F8D',
+        'scrub': '#3E7D28',
+        'residential': '#4C9ED9'
+      }[kind];
+      width = kind == 'highway' ? 1.5 : 1;
+      styleArray = [new ol.style.Style({
+        stroke: new ol.style.Stroke({
+          color: color,
+          width: width
+        }),
+        fill: new ol.style.Fill({
+          color: color,
+          opacity: 0.5
+        })
+      })];
+      landuseStyleCache[styleKey] = styleArray;
+    }
+    return styleArray;
+  }
+});
+
+var map = new ol.Map({
+  layers: [landuseLayer, buildingLayer, waterLayer, roadLayer],
+  renderer: 'canvas',
+  target: document.getElementById('map'),
+  view: new ol.View({
+    center: ol.proj.transform([-74.0064, 40.7142], 'EPSG:4326', 'EPSG:3857'),
+    maxZoom: 19,
+    zoom: 15
+  })
+});
+
+$('input[type=checkbox]').on('change', function() {
+  var layer = {
+    landuse: landuseLayer,
+    buildings: buildingLayer,
+    water: waterLayer,
+    roads: roadLayer
+  }[$(this).attr('id')];
+  layer.setVisible(!layer.getVisible());
+});
diff --git a/examples/tilejson.html b/examples/tilejson.html
new file mode 100644
index 0000000..8a5e94a
--- /dev/null
+++ b/examples/tilejson.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>TileJSON example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">TileJSON example</h4>
+          <p id="shortdesc">Example of a TileJSON layer.</p>
+          <div id="docs">
+            <p>See the <a href="tilejson.js" target="_blank">tilejson.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">tilejson</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=tilejson" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/tilejson.js b/examples/tilejson.js
new file mode 100644
index 0000000..2c1416c
--- /dev/null
+++ b/examples/tilejson.js
@@ -0,0 +1,22 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.TileJSON');
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.TileJSON({
+        url: 'http://api.tiles.mapbox.com/v3/mapbox.geography-class.jsonp',
+        crossOrigin: 'anonymous'
+      })
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
diff --git a/examples/tileutfgrid.html b/examples/tileutfgrid.html
new file mode 100644
index 0000000..23c39c5
--- /dev/null
+++ b/examples/tileutfgrid.html
@@ -0,0 +1,69 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style type="text/css">
+      #country-name {
+        color: black;
+        font-size: 12pt;
+        font-weight: bold;
+        text-shadow: white 0.1em 0.1em 0.2em;
+      }
+    </style>
+    <title>TileUTFGrid example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">TileUTFGrid example</h4>
+          <p id="shortdesc">This example shows how to read data from a TileUTFGrid layer.</p>
+          <p>Point to a country to see its name and flag.</p>
+          <div id="docs">
+            <p>Tiles made with <a href="http://tilemill.com/">TileMill</a>. Hosting on MapBox.com or with open-source <a href="https://github.com/klokantech/tileserver-php/">TileServer</a>.</p>
+            <p>See the <a href="tileutfgrid.js" target="_blank">tileutfgrid.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">utfgrid, tileutfgrid, tilejson</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <div style="display: none;">
+      <!-- Overlay with the country info -->
+      <div id="country-info">
+        <div id="country-name"> </div>
+        <img id="country-flag" src="" />
+      </div>
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=tileutfgrid" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/tileutfgrid.js b/examples/tileutfgrid.js
new file mode 100644
index 0000000..b6462e3
--- /dev/null
+++ b/examples/tileutfgrid.js
@@ -0,0 +1,68 @@
+goog.require('ol.Map');
+goog.require('ol.Overlay');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.TileJSON');
+goog.require('ol.source.TileUTFGrid');
+
+var mapLayer = new ol.layer.Tile({
+  source: new ol.source.TileJSON({
+    url: 'http://api.tiles.mapbox.com/v3/mapbox.geography-class.json'
+  })
+});
+
+var gridSource = new ol.source.TileUTFGrid({
+  url: 'http://api.tiles.mapbox.com/v3/mapbox.geography-class.json'
+});
+
+var gridLayer = new ol.layer.Tile({source: gridSource});
+
+var view = new ol.View({
+  center: [0, 0],
+  zoom: 1
+});
+
+var mapElement = document.getElementById('map');
+var map = new ol.Map({
+  layers: [mapLayer, gridLayer],
+  target: mapElement,
+  view: view
+});
+
+var infoElement = document.getElementById('country-info');
+var flagElement = document.getElementById('country-flag');
+var nameElement = document.getElementById('country-name');
+
+var infoOverlay = new ol.Overlay({
+  element: infoElement,
+  offset: [15, 15],
+  stopEvent: false
+});
+map.addOverlay(infoOverlay);
+
+var displayCountryInfo = function(coordinate) {
+  var viewResolution = /** @type {number} */ (view.getResolution());
+  gridSource.forDataAtCoordinateAndResolution(coordinate, viewResolution,
+      function(data) {
+        // If you want to use the template from the TileJSON,
+        //  load the mustache.js library separately and call
+        //  info.innerHTML = Mustache.render(gridSource.getTemplate(), data);
+        mapElement.style.cursor = data ? 'pointer' : '';
+        if (data) {
+          /* jshint -W069 */
+          flagElement.src = 'data:image/png;base64,' + data['flag_png'];
+          nameElement.innerHTML = data['admin'];
+          /* jshint +W069 */
+        }
+        infoOverlay.setPosition(data ? coordinate : undefined);
+      });
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var coordinate = map.getEventCoordinate(evt.originalEvent);
+  displayCountryInfo(coordinate);
+});
+
+map.on('click', function(evt) {
+  displayCountryInfo(evt.coordinate);
+});
diff --git a/examples/tissot.html b/examples/tissot.html
new file mode 100644
index 0000000..23b59a6
--- /dev/null
+++ b/examples/tissot.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Tissot indicatrix example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span6">
+          <h4>EPSG:4326</h4>
+          <div id="map4326" class="map"></div>
+        </div>
+        <div class="span6">
+          <h4>EPSG:3857</h4>
+          <div id="map3857" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Tissot indicatrix example</h4>
+          <p id="shortdesc">Example of <a href="http://en.wikipedia.org/wiki/Tissot's_indicatrix">Tissot indicatrix</a> maps. The map on the left is an EPSG:4326 map. The one on the left is EPSG:3857.</p>
+          <div id="docs">
+            <p>See the <a href="tissot.js" target="_blank">tissot.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">tissot, circle</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=tissot" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/tissot.js b/examples/tissot.js
new file mode 100644
index 0000000..3aee7ce
--- /dev/null
+++ b/examples/tissot.js
@@ -0,0 +1,71 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.Sphere');
+goog.require('ol.View');
+goog.require('ol.geom.Polygon');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.TileWMS');
+goog.require('ol.source.Vector');
+
+var vectorLayer4326 = new ol.layer.Vector({
+  source: new ol.source.Vector()
+});
+
+var vectorLayer3857 = new ol.layer.Vector({
+  source: new ol.source.Vector()
+});
+
+var map4326 = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.TileWMS({
+        url: 'http://demo.boundlessgeo.com/geoserver/wms',
+        params: {
+          'LAYERS': 'ne:NE1_HR_LC_SR_W_DR'
+        }
+      })
+    }),
+    vectorLayer4326
+  ],
+  renderer: 'canvas',
+  target: 'map4326',
+  view: new ol.View({
+    projection: 'EPSG:4326',
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var map3857 = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.TileWMS({
+        url: 'http://demo.boundlessgeo.com/geoserver/wms',
+        params: {
+          'LAYERS': 'ne:NE1_HR_LC_SR_W_DR'
+        }
+      })
+    }),
+    vectorLayer3857
+  ],
+  renderer: 'canvas',
+  target: 'map3857',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 2
+  })
+});
+
+var wgs84Sphere = new ol.Sphere(6378137);
+
+var radius = 800000;
+var x, y;
+for (x = -180; x < 180; x += 30) {
+  for (y = -90; y < 90; y += 30) {
+    var circle4326 = ol.geom.Polygon.circular(wgs84Sphere, [x, y], radius, 64);
+    var circle3857 = circle4326.clone().transform('EPSG:4326', 'EPSG:3857');
+    vectorLayer4326.getSource().addFeature(new ol.Feature(circle4326));
+    vectorLayer3857.getSource().addFeature(new ol.Feature(circle3857));
+  }
+}
diff --git a/examples/topojson.html b/examples/topojson.html
new file mode 100644
index 0000000..031bc17
--- /dev/null
+++ b/examples/topojson.html
@@ -0,0 +1,53 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>TopoJSON Example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span8">
+          <h4 id="title">TopoJSON example</h4>
+          <p id="shortdesc">Demonstrates rendering of features from a TopoJSON topology.</p>
+          <div id="docs">
+            <p>See the <a href="topojson.js" target="_blank">topojson.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">vector, topojson, style</div>
+        </div>
+        <div id="info" class="span4"> </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=topojson" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/topojson.js b/examples/topojson.js
new file mode 100644
index 0000000..827fa28
--- /dev/null
+++ b/examples/topojson.js
@@ -0,0 +1,46 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.TileJSON');
+goog.require('ol.source.TopoJSON');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.TileJSON({
+    url: 'http://api.tiles.mapbox.com/v3/mapbox.world-dark.jsonp'
+  })
+});
+
+var styleArray = [new ol.style.Style({
+  fill: new ol.style.Fill({
+    color: 'rgba(255, 255, 255, 0.6)'
+  }),
+  stroke: new ol.style.Stroke({
+    color: '#319FD3',
+    width: 1
+  })
+})];
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.TopoJSON({
+    projection: 'EPSG:3857',
+    url: 'data/topojson/world-110m.json'
+  }),
+  style: function(feature, resolution) {
+    // don't want to render the full world polygon, which repeats all countries
+    return feature.getId() !== undefined ? styleArray : null;
+  }
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 1
+  })
+});
diff --git a/examples/vector-labels.html b/examples/vector-labels.html
new file mode 100644
index 0000000..881e0a1
--- /dev/null
+++ b/examples/vector-labels.html
@@ -0,0 +1,361 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style type="text/css">
+      h2 {
+        font-size: 1.5em;
+        line-height: 15px;
+      };
+
+      .scale-cnt {
+        margin: 5px;
+      }
+
+      .edit-form-ctn {
+      }
+
+      .edit-form {
+        float: left;
+        margin: 5px;
+        width: 230px;
+        padding: 4px;
+        border: 1px solid black;
+      }
+
+      .edit-form input[type="button"] {
+        float: right;
+      }
+
+      .edit-form-elem label {
+        display: block;
+        float: left;
+        width: 85px;
+      }
+
+      .edit-form-elem input[type="text"] {
+        width: 60px;
+      }
+
+      .edit-form-elem select {
+        width: 130px;
+      }
+    </style>
+    <title>Vector labels example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="edit-form">
+        <input id="refresh-points" type="button" value="Refresh" />
+        <h2>Points</h2>
+        <div class="edit-form-elem">
+          <label>Text: </label>
+          <select id="points-text">
+            <option value="hide">Hide</option>
+            <option value="normal">Normal</option>
+            <option value="shorten" selected="selected">Shorten</option>
+            <option value="wrap">Wrap</option>
+          </select>
+          <br />
+          <label title="Max Resolution Denominator">MaxReso.:</label>
+          <select id="points-maxreso">
+            <option value="38400">38,400</option>
+            <option value="19200">19,200</option>
+            <option value="9600">9,600</option>
+            <option value="4800">4,800</option>
+            <option value="2400">2,400</option>
+            <option value="1200" selected="selected">1,200</option>
+            <option value="600">600</option>
+            <option value="300">300</option>
+            <option value="150">150</option>
+            <option value="75">75</option>
+            <option value="32">32</option>
+            <option value="16">16</option>
+            <option value="8">8</option>
+          </select>
+          <br />
+          <label>Align: </label>
+          <select id="points-align">
+            <option value="center" selected="selected">Center</option>
+            <option value="end">End</option>
+            <option value="left">Left</option>
+            <option value="right">Right</option>
+            <option value="start">Start</option>
+          </select>
+          <br />
+          <label>Baseline: </label>
+          <select id="points-baseline">
+            <option value="alphabetic">Alphabetic</option>
+            <option value="bottom">Bottom</option>
+            <option value="hanging">Hanging</option>
+            <option value="ideographic">Ideographic</option>
+            <option value="middle" selected="selected">Middle</option>
+            <option value="top">Top</option>
+          </select>
+          <br />
+          <label>Rotation: </label>
+          <select id="points-rotation">
+            <option value="0">0°</option>
+            <option value="0.785398164">45°</option>
+            <option value="1.570796327">90°</option>
+          </select>
+          <br />
+          <label>Font: </label>
+          <select id="points-font">
+            <option value="Arial" selected="selected">Arial</option>
+            <option value="Courier New">Courier New</option>
+            <option value="Quattrocento Sans">Quattrocento</option>
+            <option value="Verdana">Verdana</option>
+          </select>
+          <br />
+          <label>Weight: </label>
+          <select id="points-weight">
+            <option value="bold">Bold</option>
+            <option value="normal" selected="selected">Normal</option>
+          </select>
+          <br />
+          <label>Size: </label>
+          <input type="text" value="12px" id="points-size" />
+          <br />
+          <label>Offset X:</label>
+          <input type="text" value="0" id="points-offset-x" />
+          <br />
+          <label>Offset Y:</label>
+          <input type="text" value="0" id="points-offset-y" />
+          <br />
+          <label>Color :</label>
+          <input type="text" value="#aa3300" id="points-color" />
+          <br />
+          <label title="Outline Color">O. Color:</label>
+          <input type="text" value="#ffffff" id="points-outline" />
+          <br />
+          <label title="Outline Width">O. Width :</label>
+          <input type="text" value="3" id="points-outline-width" />
+        </div>
+      </div>
+
+      <div class="edit-form">
+        <input id="refresh-lines" type="button" value="Refresh" />
+        <h2>Lines</h2>
+        <div class="edit-form-elem">
+          <label>Text: </label>
+          <select id="lines-text">
+            <option value="hide">Hide</option>
+            <option value="normal">Normal</option>
+            <option value="shorten">Shorten</option>
+            <option value="wrap" selected="selected">Wrap</option>
+          </select>
+          <br />
+          <label title="Max Resolution Denominator">MaxReso.:</label>
+          <select id="lines-maxreso">
+            <option value="38400">38,400</option>
+            <option value="19200">19,200</option>
+            <option value="9600">9,600</option>
+            <option value="4800">4,800</option>
+            <option value="2400">2,400</option>
+            <option value="1200" selected="selected">1,200</option>
+            <option value="600">600</option>
+            <option value="300">300</option>
+            <option value="150">150</option>
+            <option value="75">75</option>
+            <option value="32">32</option>
+            <option value="16">16</option>
+            <option value="8">8</option>
+          </select>
+          <br />
+          <label>Align: </label>
+          <select id="lines-align">
+            <option value="center" selected="selected">Center</option>
+            <option value="end">End</option>
+            <option value="left">Left</option>
+            <option value="right">Right</option>
+            <option value="start">Start</option>
+          </select>
+          <br />
+          <label>Baseline: </label>
+          <select id="lines-baseline">
+            <option value="alphabetic">Alphabetic</option>
+            <option value="bottom">Bottom</option>
+            <option value="hanging">Hanging</option>
+            <option value="ideographic">Ideographic</option>
+            <option value="middle" selected="selected">Middle</option>
+            <option value="top">Top</option>
+          </select>
+          <br />
+          <label>Rotation: </label>
+          <select id="lines-rotation">
+            <option value="0">0°</option>
+            <option value="0.785398164">45°</option>
+            <option value="1.570796327">90°</option>
+          </select>
+          <br />
+          <label>Font: </label>
+          <select id="lines-font">
+            <option value="Arial">Arial</option>
+            <option value="Courier New" selected="selected">Courier New</option>
+            <option value="Quattrocento Sans">Quattrocento</option>
+            <option value="Verdana">Verdana</option>
+          </select>
+          <br />
+          <label>Weight: </label>
+          <select id="lines-weight">
+            <option value="bold" selected="selected">Bold</option>
+            <option value="normal">Normal</option>
+          </select>
+          <br />
+          <label>Size: </label>
+          <input type="text" value="12px" id="lines-size" />
+          <br />
+          <label>Offset X:</label>
+          <input type="text" value="0" id="lines-offset-x" />
+          <br />
+          <label>Offset Y:</label>
+          <input type="text" value="0" id="lines-offset-y" />
+          <br />
+          <label>Color :</label>
+          <input type="text" value="green" id="lines-color" />
+          <br />
+          <label title="Outline Color">O. Color:</label>
+          <input type="text" value="#ffffff" id="lines-outline" />
+          <br />
+          <label title="Outline Width">O. Width :</label>
+          <input type="text" value="3" id="lines-outline-width" />
+        </div>
+      </div>
+
+      <div class="edit-form">
+        <input id="refresh-polygons" type="button" value="Refresh" />
+        <h2>Polygons</h2>
+        <div class="edit-form-elem">
+          <label>Text: </label>
+          <select id="polygons-text">
+            <option value="hide">Hide</option>
+            <option value="normal" selected="selected">Normal</option>
+            <option value="shorten">Shorten</option>
+            <option value="wrap">Wrap</option>
+          </select>
+          <br />
+          <label title="Max Resolution Denominator">MaxReso.:</label>
+          <select id="polygons-maxreso">
+            <option value="38400">38,400</option>
+            <option value="19200">19,200</option>
+            <option value="9600">9,600</option>
+            <option value="4800">4,800</option>
+            <option value="2400">2,400</option>
+            <option value="1200" selected="selected">1,200</option>
+            <option value="600">600</option>
+            <option value="300">300</option>
+            <option value="150">150</option>
+            <option value="75">75</option>
+            <option value="32">32</option>
+            <option value="16">16</option>
+            <option value="8">8</option>
+          </select>
+          <br />
+          <label>Align: </label>
+          <select id="polygons-align">
+            <option value="center" selected="selected">Center</option>
+            <option value="end">End</option>
+            <option value="left">Left</option>
+            <option value="right">Right</option>
+            <option value="start">Start</option>
+          </select>
+          <br />
+          <label>Baseline: </label>
+          <select id="polygons-baseline">
+            <option value="alphabetic">Alphabetic</option>
+            <option value="bottom">Bottom</option>
+            <option value="hanging">Hanging</option>
+            <option value="ideographic">Ideographic</option>
+            <option value="middle" selected="selected">Middle</option>
+            <option value="top">Top</option>
+          </select>
+          <br />
+          <label>Rotation: </label>
+          <select id="polygons-rotation">
+            <option value="0">0°</option>
+            <option value="0.785398164">45°</option>
+            <option value="1.570796327">90°</option>
+          </select>
+          <br />
+          <label>Font: </label>
+          <select id="polygons-font">
+            <option value="Arial">Arial</option>
+            <option value="Courier New">Courier New</option>
+            <option value="Quattrocento Sans">Quattrocento</option>
+            <option value="Verdana" selected="selected">Verdana</option>
+          </select>
+          <br />
+          <label>Weight: </label>
+          <select id="polygons-weight">
+            <option value="bold" selected="selected">Bold</option>
+            <option value="normal">Normal</option>
+          </select>
+          <br />
+          <label>Size: </label>
+          <input type="text" value="10px" id="polygons-size" />
+          <br />
+          <label>Offset X:</label>
+          <input type="text" value="0" id="polygons-offset-x" />
+          <br />
+          <label>Offset Y:</label>
+          <input type="text" value="0" id="polygons-offset-y" />
+          <br />
+          <label>Color :</label>
+          <input type="text" value="blue" id="polygons-color" />
+          <br />
+          <label title="Outline Color">O. Color:</label>
+          <input type="text" value="#ffffff" id="polygons-outline" />
+          <br />
+          <label title="Outline Width">O. Width :</label>
+          <input type="text" value="3" id="polygons-outline-width" />
+        </div>
+      </div>
+
+    <div style="clear:left;"></div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Vector labels example</h4>
+          <p id="shortdesc">Example of GeoJSON features with labels.</p>
+          <div id="docs">
+            <p>See the <a href="vector-labels.js" target="_blank">vector-labels.js source</a> to see how this is done.</p>
+            <p><strong>Note:</strong> The 'Text/Wrap' option is currently not working properly.  This is because ol3 uses Canvas's strokeText and fillText functions that do not support text wrapping.</p>
+          </div>
+          <div id="tags">geojson, vector, openstreetmap, label</div>
+        </div>
+
+      </div>
+
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=vector-labels" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/vector-labels.js b/examples/vector-labels.js
new file mode 100644
index 0000000..cd89a31
--- /dev/null
+++ b/examples/vector-labels.js
@@ -0,0 +1,238 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.MapQuest');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.style.Text');
+
+
+var myDom = {
+  points: {
+    text: document.getElementById('points-text'),
+    align: document.getElementById('points-align'),
+    baseline: document.getElementById('points-baseline'),
+    rotation: document.getElementById('points-rotation'),
+    font: document.getElementById('points-font'),
+    weight: document.getElementById('points-weight'),
+    size: document.getElementById('points-size'),
+    offsetX: document.getElementById('points-offset-x'),
+    offsetY: document.getElementById('points-offset-y'),
+    color: document.getElementById('points-color'),
+    outline: document.getElementById('points-outline'),
+    outlineWidth: document.getElementById('points-outline-width'),
+    maxreso: document.getElementById('points-maxreso')
+  },
+  lines: {
+    text: document.getElementById('lines-text'),
+    align: document.getElementById('lines-align'),
+    baseline: document.getElementById('lines-baseline'),
+    rotation: document.getElementById('lines-rotation'),
+    font: document.getElementById('lines-font'),
+    weight: document.getElementById('lines-weight'),
+    size: document.getElementById('lines-size'),
+    offsetX: document.getElementById('lines-offset-x'),
+    offsetY: document.getElementById('lines-offset-y'),
+    color: document.getElementById('lines-color'),
+    outline: document.getElementById('lines-outline'),
+    outlineWidth: document.getElementById('lines-outline-width'),
+    maxreso: document.getElementById('lines-maxreso')
+  },
+  polygons: {
+    text: document.getElementById('polygons-text'),
+    align: document.getElementById('polygons-align'),
+    baseline: document.getElementById('polygons-baseline'),
+    rotation: document.getElementById('polygons-rotation'),
+    font: document.getElementById('polygons-font'),
+    weight: document.getElementById('polygons-weight'),
+    size: document.getElementById('polygons-size'),
+    offsetX: document.getElementById('polygons-offset-x'),
+    offsetY: document.getElementById('polygons-offset-y'),
+    color: document.getElementById('polygons-color'),
+    outline: document.getElementById('polygons-outline'),
+    outlineWidth: document.getElementById('polygons-outline-width'),
+    maxreso: document.getElementById('polygons-maxreso')
+  }
+};
+
+var getText = function(feature, resolution, dom) {
+  var type = dom.text.value;
+  var maxResolution = dom.maxreso.value;
+  var text = feature.get('name');
+
+  if (resolution > maxResolution) {
+    text = '';
+  } else if (type == 'hide') {
+    text = '';
+  } else if (type == 'shorten') {
+    text = text.trunc(12);
+  } else if (type == 'wrap') {
+    text = stringDivider(text, 16, '\n');
+  }
+
+  return text;
+};
+
+
+var createTextStyle = function(feature, resolution, dom) {
+  var align = dom.align.value;
+  var baseline = dom.baseline.value;
+  var size = dom.size.value;
+  var offsetX = parseInt(dom.offsetX.value, 10);
+  var offsetY = parseInt(dom.offsetY.value, 10);
+  var weight = dom.weight.value;
+  var rotation = parseFloat(dom.rotation.value);
+  var font = weight + ' ' + size + ' ' + dom.font.value;
+  var fillColor = dom.color.value;
+  var outlineColor = dom.outline.value;
+  var outlineWidth = parseInt(dom.outlineWidth.value, 10);
+
+  return new ol.style.Text({
+    textAlign: align,
+    textBaseline: baseline,
+    font: font,
+    text: getText(feature, resolution, dom),
+    fill: new ol.style.Fill({color: fillColor}),
+    stroke: new ol.style.Stroke({color: outlineColor, width: outlineWidth}),
+    offsetX: offsetX,
+    offsetY: offsetY,
+    rotation: rotation
+  });
+};
+
+
+// Polygons
+var createPolygonStyleFunction = function() {
+  return function(feature, resolution) {
+    var style = new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: 'blue',
+        width: 1
+      }),
+      fill: new ol.style.Fill({
+        color: 'rgba(0, 0, 255, 0.1)'
+      }),
+      text: createTextStyle(feature, resolution, myDom.polygons)
+    });
+    return [style];
+  };
+};
+
+var vectorPolygons = new ol.layer.Vector({
+  source: new ol.source.GeoJSON({
+    projection: 'EPSG:3857',
+    url: 'data/geojson/polygon-samples.geojson'
+  }),
+  style: createPolygonStyleFunction()
+});
+
+
+// Lines
+var createLineStyleFunction = function() {
+  return function(feature, resolution) {
+    var style = new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: 'green',
+        width: 2
+      }),
+      text: createTextStyle(feature, resolution, myDom.lines)
+    });
+    return [style];
+  };
+};
+
+var vectorLines = new ol.layer.Vector({
+  source: new ol.source.GeoJSON({
+    projection: 'EPSG:3857',
+    url: 'data/geojson/line-samples.geojson'
+  }),
+  style: createLineStyleFunction()
+});
+
+
+// Points
+var createPointStyleFunction = function() {
+  return function(feature, resolution) {
+    var style = new ol.style.Style({
+      image: new ol.style.Circle({
+        radius: 10,
+        fill: new ol.style.Fill({color: 'rgba(255, 0, 0, 0.1)'}),
+        stroke: new ol.style.Stroke({color: 'red', width: 1})
+      }),
+      text: createTextStyle(feature, resolution, myDom.points)
+    });
+    return [style];
+  };
+};
+
+var vectorPoints = new ol.layer.Vector({
+  source: new ol.source.GeoJSON({
+    projection: 'EPSG:3857',
+    url: 'data/geojson/point-samples.geojson'
+  }),
+  style: createPointStyleFunction()
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuest({layer: 'osm'})
+    }),
+    vectorPolygons,
+    vectorLines,
+    vectorPoints
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [-8161939, 6095025],
+    zoom: 8
+  })
+});
+
+$('#refresh-points').click(function() {
+  vectorPoints.setStyle(createPointStyleFunction());
+});
+
+$('#refresh-lines').click(function() {
+  vectorLines.setStyle(createLineStyleFunction());
+});
+
+$('#refresh-polygons').click(function() {
+  vectorPolygons.setStyle(createPolygonStyleFunction());
+});
+
+
+/**
+ * @param {number} n The max number of characters to keep.
+ * @return {string} Truncated string.
+ */
+String.prototype.trunc = String.prototype.trunc ||
+    function(n) {
+      return this.length > n ? this.substr(0, n - 1) + '...' : this.substr(0);
+    };
+
+
+// http://stackoverflow.com/questions/14484787/wrap-text-in-javascript
+function stringDivider(str, width, spaceReplacer) {
+  if (str.length > width) {
+    var p = width;
+    for (; p > 0 && (str[p] != ' ' && str[p] != '-'); p--) {
+    }
+    if (p > 0) {
+      var left;
+      if (str.substring(p, p + 1) == '-') {
+        left = str.substring(0, p + 1);
+      } else {
+        left = str.substring(0, p);
+      }
+      var right = str.substring(p + 1);
+      return left + spaceReplacer + stringDivider(right, width, spaceReplacer);
+    }
+  }
+  return str;
+}
diff --git a/examples/vector-layer.html b/examples/vector-layer.html
new file mode 100644
index 0000000..3589342
--- /dev/null
+++ b/examples/vector-layer.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Vector layer example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">Vector layer example</h4>
+          <p id="shortdesc">Example of a countries vector layer with country information on hover and country labels at higher zoom levels.</p>
+          <div id="docs">
+            <p>See the <a href="vector-layer.js" target="_blank">vector-layer.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">vector, geojson, style, feature overlay</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=vector-layer" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/vector-layer.js b/examples/vector-layer.js
new file mode 100644
index 0000000..25f70d6
--- /dev/null
+++ b/examples/vector-layer.js
@@ -0,0 +1,124 @@
+goog.require('ol.FeatureOverlay');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.GeoJSON');
+goog.require('ol.source.MapQuest');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.style.Text');
+
+
+var style = new ol.style.Style({
+  fill: new ol.style.Fill({
+    color: 'rgba(255, 255, 255, 0.6)'
+  }),
+  stroke: new ol.style.Stroke({
+    color: '#319FD3',
+    width: 1
+  }),
+  text: new ol.style.Text({
+    font: '12px Calibri,sans-serif',
+    fill: new ol.style.Fill({
+      color: '#000'
+    }),
+    stroke: new ol.style.Stroke({
+      color: '#fff',
+      width: 3
+    })
+  })
+});
+var styles = [style];
+var vectorLayer = new ol.layer.Vector({
+  source: new ol.source.GeoJSON({
+    projection: 'EPSG:3857',
+    url: 'data/geojson/countries.geojson'
+  }),
+  style: function(feature, resolution) {
+    style.getText().setText(resolution < 5000 ? feature.get('name') : '');
+    return styles;
+  }
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.MapQuest({layer: 'sat'})
+    }),
+    vectorLayer
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [0, 0],
+    zoom: 1
+  })
+});
+
+var highlightStyleCache = {};
+
+var featureOverlay = new ol.FeatureOverlay({
+  map: map,
+  style: function(feature, resolution) {
+    var text = resolution < 5000 ? feature.get('name') : '';
+    if (!highlightStyleCache[text]) {
+      highlightStyleCache[text] = [new ol.style.Style({
+        stroke: new ol.style.Stroke({
+          color: '#f00',
+          width: 1
+        }),
+        fill: new ol.style.Fill({
+          color: 'rgba(255,0,0,0.1)'
+        }),
+        text: new ol.style.Text({
+          font: '12px Calibri,sans-serif',
+          text: text,
+          fill: new ol.style.Fill({
+            color: '#000'
+          }),
+          stroke: new ol.style.Stroke({
+            color: '#f00',
+            width: 3
+          })
+        })
+      })];
+    }
+    return highlightStyleCache[text];
+  }
+});
+
+var highlight;
+var displayFeatureInfo = function(pixel) {
+
+  var feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) {
+    return feature;
+  });
+
+  var info = document.getElementById('info');
+  if (feature) {
+    info.innerHTML = feature.getId() + ': ' + feature.get('name');
+  } else {
+    info.innerHTML = ' ';
+  }
+
+  if (feature !== highlight) {
+    if (highlight) {
+      featureOverlay.removeFeature(highlight);
+    }
+    if (feature) {
+      featureOverlay.addFeature(feature);
+    }
+    highlight = feature;
+  }
+
+};
+
+$(map.getViewport()).on('mousemove', function(evt) {
+  var pixel = map.getEventPixel(evt.originalEvent);
+  displayFeatureInfo(pixel);
+});
+
+map.on('click', function(evt) {
+  displayFeatureInfo(evt.pixel);
+});
diff --git a/examples/vector-osm.html b/examples/vector-osm.html
new file mode 100644
index 0000000..b505c59
--- /dev/null
+++ b/examples/vector-osm.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>OSM XML example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>          
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">OSM XML example</h4>
+          <p id="shortdesc">Example of using the OSM XML source.  Vector data is loaded dynamically from a server using a tiling strategy.</p>
+          <div id="docs">
+            <p>See the <a href="vector-osm.js" target="_blank">vector-osm.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">vector, osm, xml, loading, server</div>
+        </div>
+        <div class="span4 offset4">
+          <div id="info" class="alert alert-success">
+             
+          </div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=vector-osm" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/vector-osm.js b/examples/vector-osm.js
new file mode 100644
index 0000000..d724b24
--- /dev/null
+++ b/examples/vector-osm.js
@@ -0,0 +1,145 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.format.OSMXML');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.loadingstrategy');
+goog.require('ol.proj');
+goog.require('ol.source.BingMaps');
+goog.require('ol.source.ServerVector');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.tilegrid.XYZ');
+
+var styles = {
+  'amenity': {
+    'parking': [
+      new ol.style.Style({
+        stroke: new ol.style.Stroke({
+          color: 'rgba(170, 170, 170, 1.0)',
+          width: 1
+        }),
+        fill: new ol.style.Fill({
+          color: 'rgba(170, 170, 170, 0.3)'
+        })
+      })
+    ]
+  },
+  'building': {
+    '.*': [
+      new ol.style.Style({
+        zIndex: 100,
+        stroke: new ol.style.Stroke({
+          color: 'rgba(246, 99, 79, 1.0)',
+          width: 1
+        }),
+        fill: new ol.style.Fill({
+          color: 'rgba(246, 99, 79, 0.3)'
+        })
+      })
+    ]
+  },
+  'highway': {
+    'service': [
+      new ol.style.Style({
+        stroke: new ol.style.Stroke({
+          color: 'rgba(255, 255, 255, 1.0)',
+          width: 2
+        })
+      })
+    ],
+    '.*': [
+      new ol.style.Style({
+        stroke: new ol.style.Stroke({
+          color: 'rgba(255, 255, 255, 1.0)',
+          width: 3
+        })
+      })
+    ]
+  },
+  'landuse': {
+    'forest|grass|allotments': [
+      new ol.style.Style({
+        stroke: new ol.style.Stroke({
+          color: 'rgba(140, 208, 95, 1.0)',
+          width: 1
+        }),
+        fill: new ol.style.Fill({
+          color: 'rgba(140, 208, 95, 0.3)'
+        })
+      })
+    ]
+  },
+  'natural': {
+    'tree': [
+      new ol.style.Style({
+        image: new ol.style.Circle({
+          radius: 2,
+          fill: new ol.style.Fill({
+            color: 'rgba(140, 208, 95, 1.0)'
+          }),
+          stroke: null
+        })
+      })
+    ]
+  }
+};
+
+var vectorSource = new ol.source.ServerVector({
+  format: new ol.format.OSMXML(),
+  loader: function(extent, resolution, projection) {
+    var epsg4326Extent =
+        ol.proj.transformExtent(extent, projection, 'EPSG:4326');
+    var url = 'http://overpass-api.de/api/xapi?map?bbox=' +
+        epsg4326Extent.join(',');
+    $.ajax(url).then(function(response) {
+      vectorSource.addFeatures(vectorSource.readFeatures(response));
+    });
+  },
+  strategy: ol.loadingstrategy.createTile(new ol.tilegrid.XYZ({
+    maxZoom: 19
+  })),
+  projection: 'EPSG:3857'
+});
+
+var vector = new ol.layer.Vector({
+  source: vectorSource,
+  style: function(feature, resolution) {
+    for (var key in styles) {
+      var value = feature.get(key);
+      if (value !== undefined) {
+        for (var regexp in styles[key]) {
+          if (new RegExp(regexp).test(value)) {
+            return styles[key][regexp];
+          }
+        }
+      }
+    }
+    return null;
+  }
+});
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.BingMaps({
+    imagerySet: 'Aerial',
+    key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: document.getElementById('map'),
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [739218, 5906096],
+    maxZoom: 19,
+    zoom: 17
+  })
+});
diff --git a/examples/vector-wfs.html b/examples/vector-wfs.html
new file mode 100644
index 0000000..e038956
--- /dev/null
+++ b/examples/vector-wfs.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>WFS example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>          
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">WFS example</h4>
+          <p id="shortdesc">Example of using WFS with a BBOX strategy.</p>
+          <div id="docs">
+            <p>See the <a href="vector-wfs.js" target="_blank">vector-wfs.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">vector, WFS, bbox, loading, server</div>
+        </div>
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=vector-wfs" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/vector-wfs.js b/examples/vector-wfs.js
new file mode 100644
index 0000000..30c2b9d
--- /dev/null
+++ b/examples/vector-wfs.js
@@ -0,0 +1,60 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.format.GeoJSON');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.loadingstrategy');
+goog.require('ol.source.BingMaps');
+goog.require('ol.source.ServerVector');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.tilegrid.XYZ');
+
+var vectorSource = new ol.source.ServerVector({
+  format: new ol.format.GeoJSON(),
+  loader: function(extent, resolution, projection) {
+    var url = 'http://demo.boundlessgeo.com/geoserver/wfs?service=WFS&' +
+        'version=1.1.0&request=GetFeature&typename=osm:water_areas&' +
+        'outputFormat=text/javascript&format_options=callback:loadFeatures' +
+        '&srsname=EPSG:3857&bbox=' + extent.join(',') + ',EPSG:3857';
+    $.ajax({
+      url: url,
+      dataType: 'jsonp'
+    });
+  },
+  strategy: ol.loadingstrategy.createTile(new ol.tilegrid.XYZ({
+    maxZoom: 19
+  })),
+  projection: 'EPSG:3857'
+});
+
+var loadFeatures = function(response) {
+  vectorSource.addFeatures(vectorSource.readFeatures(response));
+};
+
+var vector = new ol.layer.Vector({
+  source: vectorSource,
+  style: new ol.style.Style({
+    stroke: new ol.style.Stroke({
+      color: 'rgba(0, 0, 255, 1.0)',
+      width: 2
+    })
+  })
+});
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.BingMaps({
+    imagerySet: 'Aerial',
+    key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3'
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: document.getElementById('map'),
+  view: new ol.View({
+    center: [-8908887.277395891, 5381918.072437216],
+    maxZoom: 19,
+    zoom: 12
+  })
+});
diff --git a/examples/wkt.html b/examples/wkt.html
new file mode 100644
index 0000000..a00a58f
--- /dev/null
+++ b/examples/wkt.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>WKT example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>          
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">WKT example</h4>
+          <p id="shortdesc">Example of using the WKT parser.</p>
+          <div id="docs">
+            <p>See the <a href="wkt.js" target="_blank">wkt.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">WKT Well Known Text</div>
+        </div>
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wkt" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wkt.js b/examples/wkt.js
new file mode 100644
index 0000000..65af30f
--- /dev/null
+++ b/examples/wkt.js
@@ -0,0 +1,34 @@
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.format.WKT');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.OSM');
+goog.require('ol.source.Vector');
+
+var raster = new ol.layer.Tile({
+  source: new ol.source.OSM()
+});
+
+var format = new ol.format.WKT();
+var feature = format.readFeature(
+    'POLYGON((10.689697265625 -25.0927734375, 34.595947265625 ' +
+        '-20.1708984375, 38.814697265625 -35.6396484375, 13.502197265625 ' +
+        '-39.1552734375, 10.689697265625 -25.0927734375))');
+feature.getGeometry().transform('EPSG:4326', 'EPSG:3857');
+
+var vector = new ol.layer.Vector({
+  source: new ol.source.Vector({
+    features: [feature]
+  })
+});
+
+var map = new ol.Map({
+  layers: [raster, vector],
+  target: 'map',
+  view: new ol.View({
+    center: [2952104.019976033, -3277504.823700756],
+    zoom: 4
+  })
+});
diff --git a/examples/wms-capabilities.html b/examples/wms-capabilities.html
new file mode 100644
index 0000000..c0c70a1
--- /dev/null
+++ b/examples/wms-capabilities.html
@@ -0,0 +1,49 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>WMS GetCapabilities parsing example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+
+        <div class="span4">
+          <h4 id="title">WMS GetCapabilities parsing example</h4>
+          <p id="shortdesc">Example of parsing a WMS GetCapabilities response.</p>
+          <div id="docs">
+            <p>See the <a href="wms-capabilities.js" target="_blank">wms-capabilities.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">wms, capabilities, getcapabilities</div>
+        </div>
+
+        <div class="span8">
+          <pre id="log"></pre>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wms-capabilities" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wms-capabilities.js b/examples/wms-capabilities.js
new file mode 100644
index 0000000..2e3d201
--- /dev/null
+++ b/examples/wms-capabilities.js
@@ -0,0 +1,8 @@
+goog.require('ol.format.WMSCapabilities');
+
+var parser = new ol.format.WMSCapabilities();
+
+$.ajax('data/ogcsample.xml').then(function(response) {
+  var result = parser.read(response);
+  $('#log').html(window.JSON.stringify(result, null, 2));
+});
diff --git a/examples/wms-custom-proj.html b/examples/wms-custom-proj.html
new file mode 100644
index 0000000..f87405a
--- /dev/null
+++ b/examples/wms-custom-proj.html
@@ -0,0 +1,50 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Tiled WMS with custom projection example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Tiled WMS with custom projection example</h4>
+          <p id="shortdesc">Example of two tiled WMS layers (Pixelmap 1:1'000'000 and national parks) using the projection EPSG:21781.</p>
+          <div id="docs">
+            <p>See the <a href="wms-custom-proj.js" target="_blank">wms-custom-proj.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">wms, tile, tilelayer, projection</div>
+        </div>
+
+      </div>
+
+    </div>
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wms-custom-proj" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wms-custom-proj.js b/examples/wms-custom-proj.js
new file mode 100644
index 0000000..1a34e76
--- /dev/null
+++ b/examples/wms-custom-proj.js
@@ -0,0 +1,248 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.ScaleLine');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.proj.Projection');
+goog.require('ol.source.TileWMS');
+
+
+
+// By default OpenLayers does not know about the EPSG:21781 (Swiss) projection.
+// So we create a projection instance for EPSG:21781 and pass it to
+// ol.proj.addProjection to make it available to the library.
+
+var projection = new ol.proj.Projection({
+  code: 'EPSG:21781',
+  // The extent is used to determine zoom level 0. Recommended values for a
+  // projection's validity extent can be found at http://epsg.io/.
+  extent: [485869.5728, 76443.1884, 837076.5648, 299941.7864],
+  units: 'm'
+});
+ol.proj.addProjection(projection);
+
+// We also declare EPSG:21781/EPSG:4326 transform functions. These functions
+// are necessary for the ScaleLine control and when calling ol.proj.transform
+// for setting the view's initial center (see below).
+
+ol.proj.addCoordinateTransforms('EPSG:4326', projection,
+    function(coordinate) {
+      return [
+        WGStoCHy(coordinate[1], coordinate[0]),
+        WGStoCHx(coordinate[1], coordinate[0])
+      ];
+    },
+    function(coordinate) {
+      return [
+        CHtoWGSlng(coordinate[0], coordinate[1]),
+        CHtoWGSlat(coordinate[0], coordinate[1])
+      ];
+    });
+
+var extent = [420000, 30000, 900000, 350000];
+var layers = [
+  new ol.layer.Tile({
+    extent: extent,
+    source: new ol.source.TileWMS({
+      url: 'http://wms.geo.admin.ch/',
+      crossOrigin: 'anonymous',
+      attributions: [new ol.Attribution({
+        html: '© ' +
+            '<a href="http://www.geo.admin.ch/internet/geoportal/' +
+            'en/home.html">' +
+            'Pixelmap 1:1000000 / geo.admin.ch</a>'
+      })],
+      params: {
+        'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale',
+        'FORMAT': 'image/jpeg'
+      },
+      serverType: 'mapserver'
+    })
+  }),
+  new ol.layer.Tile({
+    extent: extent,
+    source: new ol.source.TileWMS({
+      url: 'http://wms.geo.admin.ch/',
+      crossOrigin: 'anonymous',
+      attributions: [new ol.Attribution({
+        html: '© ' +
+            '<a href="http://www.geo.admin.ch/internet/geoportal/' +
+            'en/home.html">' +
+            'National parks / geo.admin.ch</a>'
+      })],
+      params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'},
+      serverType: 'mapserver'
+    })
+  })
+];
+
+var map = new ol.Map({
+  controls: ol.control.defaults().extend([
+    new ol.control.ScaleLine({
+      units: 'metric'
+    })
+  ]),
+  layers: layers,
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    projection: projection,
+    center: ol.proj.transform([8.23, 46.86], 'EPSG:4326', 'EPSG:21781'),
+    extent: extent,
+    zoom: 2
+  })
+});
+
+
+
+/*
+ * Swiss projection transform functions downloaded from
+ * http://www.swisstopo.admin.ch/internet/swisstopo/en/home/products/software/products/skripts.html
+ */
+
+// Convert WGS lat/long (° dec) to CH y
+function WGStoCHy(lat, lng) {
+
+  // Converts degrees dec to sex
+  lat = DECtoSEX(lat);
+  lng = DECtoSEX(lng);
+
+  // Converts degrees to seconds (sex)
+  lat = DEGtoSEC(lat);
+  lng = DEGtoSEC(lng);
+
+  // Axiliary values (% Bern)
+  var lat_aux = (lat - 169028.66) / 10000;
+  var lng_aux = (lng - 26782.5) / 10000;
+
+  // Process Y
+  var y = 600072.37 +
+      211455.93 * lng_aux -
+      10938.51 * lng_aux * lat_aux -
+      0.36 * lng_aux * Math.pow(lat_aux, 2) -
+      44.54 * Math.pow(lng_aux, 3);
+
+  return y;
+}
+
+// Convert WGS lat/long (° dec) to CH x
+function WGStoCHx(lat, lng) {
+
+  // Converts degrees dec to sex
+  lat = DECtoSEX(lat);
+  lng = DECtoSEX(lng);
+
+  // Converts degrees to seconds (sex)
+  lat = DEGtoSEC(lat);
+  lng = DEGtoSEC(lng);
+
+  // Axiliary values (% Bern)
+  var lat_aux = (lat - 169028.66) / 10000;
+  var lng_aux = (lng - 26782.5) / 10000;
+
+  // Process X
+  var x = 200147.07 +
+      308807.95 * lat_aux +
+      3745.25 * Math.pow(lng_aux, 2) +
+      76.63 * Math.pow(lat_aux, 2) -
+      194.56 * Math.pow(lng_aux, 2) * lat_aux +
+      119.79 * Math.pow(lat_aux, 3);
+
+  return x;
+
+}
+
+
+// Convert CH y/x to WGS lat
+function CHtoWGSlat(y, x) {
+
+  // Converts militar to civil and  to unit = 1000km
+  // Axiliary values (% Bern)
+  var y_aux = (y - 600000) / 1000000;
+  var x_aux = (x - 200000) / 1000000;
+
+  // Process lat
+  var lat = 16.9023892 +
+      3.238272 * x_aux -
+      0.270978 * Math.pow(y_aux, 2) -
+      0.002528 * Math.pow(x_aux, 2) -
+      0.0447 * Math.pow(y_aux, 2) * x_aux -
+      0.0140 * Math.pow(x_aux, 3);
+
+  // Unit 10000" to 1 " and converts seconds to degrees (dec)
+  lat = lat * 100 / 36;
+
+  return lat;
+
+}
+
+// Convert CH y/x to WGS long
+function CHtoWGSlng(y, x) {
+
+  // Converts militar to civil and  to unit = 1000km
+  // Axiliary values (% Bern)
+  var y_aux = (y - 600000) / 1000000;
+  var x_aux = (x - 200000) / 1000000;
+
+  // Process long
+  var lng = 2.6779094 +
+      4.728982 * y_aux +
+      0.791484 * y_aux * x_aux +
+      0.1306 * y_aux * Math.pow(x_aux, 2) -
+      0.0436 * Math.pow(y_aux, 3);
+
+  // Unit 10000" to 1 " and converts seconds to degrees (dec)
+  lng = lng * 100 / 36;
+
+  return lng;
+
+}
+
+
+// Convert SEX DMS angle to DEC
+function SEXtoDEC(angle) {
+
+  // Extract DMS
+  var deg = parseInt(angle, 10);
+  var min = parseInt((angle - deg) * 100, 10);
+  var sec = (((angle - deg) * 100) - min) * 100;
+
+  // Result in degrees sex (dd.mmss)
+  return deg + (sec / 60 + min) / 60;
+
+}
+
+// Convert DEC angle to SEX DMS
+function DECtoSEX(angle) {
+
+  // Extract DMS
+  var deg = parseInt(angle, 10);
+  var min = parseInt((angle - deg) * 60, 10);
+  var sec = (((angle - deg) * 60) - min) * 60;
+
+  // Result in degrees sex (dd.mmss)
+  return deg + min / 100 + sec / 10000;
+
+}
+
+// Convert Degrees angle to seconds
+function DEGtoSEC(angle) {
+
+  // Extract DMS
+  var deg = parseInt(angle, 10);
+  var min = parseInt((angle - deg) * 100, 10);
+  var sec = (((angle - deg) * 100) - min) * 100;
+
+  // Avoid rounding problems with seconds=0
+  var parts = String(angle).split('.');
+  if (parts.length == 2 && parts[1].length == 2) {
+    min = Number(parts[1]);
+    sec = 0;
+  }
+
+  // Result in degrees sex (dd.mmss)
+  return sec + min * 60 + deg * 3600;
+
+}
diff --git a/examples/wms-image-custom-proj.html b/examples/wms-image-custom-proj.html
new file mode 100644
index 0000000..59af93e
--- /dev/null
+++ b/examples/wms-image-custom-proj.html
@@ -0,0 +1,54 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Single image WMS with Proj4js projection example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Single image WMS with Proj4js projection example</h4>
+          <p id="shortdesc">Example of two single image WMS layers.</p>
+          <div id="docs">
+            <p>Pixelmap 1:1'000'000 with National Parks overlay using the projection EPSG:21781.</p>
+            <p>See the <a href="wms-image-custom-proj.js" target="_blank">wms-image-custom-proj.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">wms, single image, proj4js, projection</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/2.2.1/proj4.js" type="text/javascript"></script>
+    <script src="http://epsg.io/21781-1753.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wms-image-custom-proj" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wms-image-custom-proj.js b/examples/wms-image-custom-proj.js
new file mode 100644
index 0000000..f48c9c2
--- /dev/null
+++ b/examples/wms-image-custom-proj.js
@@ -0,0 +1,74 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.control.ScaleLine');
+goog.require('ol.layer.Image');
+goog.require('ol.proj');
+goog.require('ol.source.ImageWMS');
+
+
+// Transparent Proj4js support: ol.proj.get() creates and returns a projection
+// known to Proj4js if it is unknown to OpenLayers, and registers functions to
+// transform between all registered projections.
+// EPSG:21781 is known to Proj4js because its definition was loaded in the html.
+// Note that we are getting the projection object here to set the extent. If
+// you do not need this, you do not have to use ol.proj.get(); simply use the
+// string code in the view projection below and the transforms will be
+// registered transparently.
+var projection = ol.proj.get('EPSG:21781');
+// The extent is used to determine zoom level 0. Recommended values for a
+// projection's validity extent can be found at http://epsg.io/.
+projection.setExtent([485869.5728, 76443.1884, 837076.5648, 299941.7864]);
+
+var extent = [420000, 30000, 900000, 350000];
+var layers = [
+  new ol.layer.Image({
+    extent: extent,
+    source: new ol.source.ImageWMS({
+      url: 'http://wms.geo.admin.ch/',
+      crossOrigin: 'anonymous',
+      attributions: [new ol.Attribution({
+        html: '© ' +
+            '<a href="http://www.geo.admin.ch/internet/geoportal/' +
+            'en/home.html">' +
+            'Pixelmap 1:1000000 / geo.admin.ch</a>'
+      })],
+      params: {
+        'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale',
+        'FORMAT': 'image/jpeg'
+      },
+      serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver')
+    })
+  }),
+  new ol.layer.Image({
+    extent: extent,
+    source: new ol.source.ImageWMS({
+      url: 'http://wms.geo.admin.ch/',
+      crossOrigin: 'anonymous',
+      attributions: [new ol.Attribution({
+        html: '© ' +
+            '<a href="http://www.geo.admin.ch/internet/geoportal/' +
+            'en/home.html">' +
+            'National parks / geo.admin.ch</a>'
+      })],
+      params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'},
+      serverType: /** @type {ol.source.wms.ServerType} */ ('mapserver')
+    })
+  })
+];
+
+var map = new ol.Map({
+  controls: ol.control.defaults().extend([
+    new ol.control.ScaleLine()
+  ]),
+  layers: layers,
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    projection: projection,
+    center: ol.proj.transform([8.23, 46.86], 'EPSG:4326', 'EPSG:21781'),
+    extent: extent,
+    zoom: 2
+  })
+});
diff --git a/examples/wms-image.html b/examples/wms-image.html
new file mode 100644
index 0000000..d8a4a0a
--- /dev/null
+++ b/examples/wms-image.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Single image WMS example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Single image WMS example</h4>
+          <p id="shortdesc">Example of a single image WMS layer.</p>
+          <div id="docs">
+            <p>See the <a href="wms-image.js" target="_blank">wms-image.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">wms, image</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wms-image" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wms-image.js b/examples/wms-image.js
new file mode 100644
index 0000000..328b517
--- /dev/null
+++ b/examples/wms-image.js
@@ -0,0 +1,29 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Image');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.ImageWMS');
+goog.require('ol.source.MapQuest');
+
+
+var layers = [
+  new ol.layer.Tile({
+    source: new ol.source.MapQuest({layer: 'sat'})
+  }),
+  new ol.layer.Image({
+    extent: [-13884991, 2870341, -7455066, 6338219],
+    source: new ol.source.ImageWMS({
+      url: 'http://demo.boundlessgeo.com/geoserver/wms',
+      params: {'LAYERS': 'topp:states'},
+      serverType: 'geoserver'
+    })
+  })
+];
+var map = new ol.Map({
+  layers: layers,
+  target: 'map',
+  view: new ol.View({
+    center: [-10997148, 4569099],
+    zoom: 4
+  })
+});
diff --git a/examples/wms-no-proj.html b/examples/wms-no-proj.html
new file mode 100644
index 0000000..acd45d3
--- /dev/null
+++ b/examples/wms-no-proj.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>WMS without client projection example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">WMS without client projection example</h4>
+          <p id="shortdesc">Example of two WMS layers using the projection EPSG:21781, which is unknown to the client.</p>
+          <div id="docs">
+            <p>See the <a href="wms-no-proj.js" target="_blank">wms-no-proj.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">wms, projection</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wms-no-proj" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wms-no-proj.js b/examples/wms-no-proj.js
new file mode 100644
index 0000000..6f9bc90
--- /dev/null
+++ b/examples/wms-no-proj.js
@@ -0,0 +1,63 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Image');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj.Projection');
+goog.require('ol.source.ImageWMS');
+goog.require('ol.source.TileWMS');
+
+
+var layers = [
+  new ol.layer.Tile({
+    source: new ol.source.TileWMS({
+      attributions: [new ol.Attribution({
+        html: '© ' +
+            '<a href="http://www.geo.admin.ch/internet/geoportal/' +
+            'en/home.html">' +
+            'Pixelmap 1:1000000 / geo.admin.ch</a>'
+      })],
+      crossOrigin: 'anonymous',
+      params: {
+        'LAYERS': 'ch.swisstopo.pixelkarte-farbe-pk1000.noscale',
+        'FORMAT': 'image/jpeg'
+      },
+      url: 'http://wms.geo.admin.ch/'
+    })
+  }),
+  new ol.layer.Image({
+    source: new ol.source.ImageWMS({
+      attributions: [new ol.Attribution({
+        html: '© ' +
+            '<a href="http://www.geo.admin.ch/internet/geoportal/' +
+            'en/home.html">' +
+            'National parks / geo.admin.ch</a>'
+      })],
+      crossOrigin: 'anonymous',
+      params: {'LAYERS': 'ch.bafu.schutzgebiete-paerke_nationaler_bedeutung'},
+      serverType: 'mapserver',
+      url: 'http://wms.geo.admin.ch/'
+    })
+  })
+];
+
+// A minimal projection object is configured with only the SRS code and the map
+// units. No client-side coordinate transforms are possible with such a
+// projection object. Requesting tiles only needs the code together with a
+// tile grid of Cartesian coordinates; it does not matter how those
+// coordinates relate to latitude or longitude.
+var projection = new ol.proj.Projection({
+  code: 'EPSG:21781',
+  units: 'm'
+});
+
+var map = new ol.Map({
+  layers: layers,
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    center: [660000, 190000],
+    projection: projection,
+    zoom: 9
+  })
+});
diff --git a/examples/wms-tiled.html b/examples/wms-tiled.html
new file mode 100644
index 0000000..d16ccb7
--- /dev/null
+++ b/examples/wms-tiled.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Tiled WMS example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Tiled WMS example</h4>
+          <p id="shortdesc">Example of a tiled WMS layer.</p>
+          <div id="docs">
+            <p>See the <a href="wms-tiled.js" target="_blank">wms-tiled.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">wms, tile, tilelayer</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wms-tiled" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wms-tiled.js b/examples/wms-tiled.js
new file mode 100644
index 0000000..abd603c
--- /dev/null
+++ b/examples/wms-tiled.js
@@ -0,0 +1,28 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.MapQuest');
+goog.require('ol.source.TileWMS');
+
+
+var layers = [
+  new ol.layer.Tile({
+    source: new ol.source.MapQuest({layer: 'sat'})
+  }),
+  new ol.layer.Tile({
+    extent: [-13884991, 2870341, -7455066, 6338219],
+    source: new ol.source.TileWMS(/** @type {olx.source.TileWMSOptions} */ ({
+      url: 'http://demo.boundlessgeo.com/geoserver/wms',
+      params: {'LAYERS': 'topp:states', 'TILED': true},
+      serverType: 'geoserver'
+    }))
+  })
+];
+var map = new ol.Map({
+  layers: layers,
+  target: 'map',
+  view: new ol.View({
+    center: [-10997148, 4569099],
+    zoom: 4
+  })
+});
diff --git a/examples/wmts-hidpi.html b/examples/wmts-hidpi.html
new file mode 100644
index 0000000..8deed62
--- /dev/null
+++ b/examples/wmts-hidpi.html
@@ -0,0 +1,56 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>WMTS HiDPI example</title>
+    <style>
+      .map {
+        background: white;
+      }
+    </style>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">WMTS HiDPI example</h4>
+          <p id="shortdesc">Example of a WMTS based HiDPI layer.</p>
+          <div id="docs">
+            <p>See the <a href="wmts-hidpi.js" target="_blank">wmts-hidpi.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">hidpi, retina, wmts</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wmts-hidpi" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wmts-hidpi.js b/examples/wmts-hidpi.js
new file mode 100644
index 0000000..52a0d7b
--- /dev/null
+++ b/examples/wmts-hidpi.js
@@ -0,0 +1,75 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.has');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.WMTS');
+goog.require('ol.tilegrid.WMTS');
+
+
+var template =
+    '{Layer}/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.jpeg';
+var urls = [
+  'http://maps1.wien.gv.at/basemap/' + template,
+  'http://maps2.wien.gv.at/basemap/' + template,
+  'http://maps3.wien.gv.at/basemap/' + template,
+  'http://maps4.wien.gv.at/basemap/' + template,
+  'http://maps.wien.gv.at/basemap/' + template
+];
+
+
+// HiDPI support:
+// * Use 'bmaphidpi' layer (pixel ratio 2) for device pixel ratio > 1
+// * Use 'geolandbasemap' layer (pixel ratio 1) for device pixel ratio == 1
+var hiDPI = ol.has.DEVICE_PIXEL_RATIO > 1;
+
+var source = new ol.source.WMTS({
+  projection: 'EPSG:3857',
+  layer: hiDPI ? 'bmaphidpi' : 'geolandbasemap',
+  tilePixelRatio: hiDPI ? 2 : 1,
+  style: 'normal',
+  matrixSet: 'google3857',
+  urls: urls,
+  requestEncoding: 'REST',
+  tileGrid: new ol.tilegrid.WMTS({
+    origin: [-20037508.3428, 20037508.3428],
+    resolutions: [
+      559082264.029 * 0.28E-3,
+      279541132.015 * 0.28E-3,
+      139770566.007 * 0.28E-3,
+      69885283.0036 * 0.28E-3,
+      34942641.5018 * 0.28E-3,
+      17471320.7509 * 0.28E-3,
+      8735660.37545 * 0.28E-3,
+      4367830.18773 * 0.28E-3,
+      2183915.09386 * 0.28E-3,
+      1091957.54693 * 0.28E-3,
+      545978.773466 * 0.28E-3,
+      272989.386733 * 0.28E-3,
+      136494.693366 * 0.28E-3,
+      68247.3466832 * 0.28E-3,
+      34123.6733416 * 0.28E-3,
+      17061.8366708 * 0.28E-3,
+      8530.91833540 * 0.28E-3,
+      4265.45916770 * 0.28E-3,
+      2132.72958385 * 0.28E-3,
+      1066.36479193 * 0.28E-3
+    ],
+    matrixIds: [
+      0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
+    ]
+  })
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      extent: [977844.377599999, 5837774.6617, 1915609.8654, 6295560.8122],
+      source: source
+    })
+  ],
+  target: 'map',
+  view: new ol.View({
+    center: [1823849, 6143760],
+    zoom: 11
+  })
+});
diff --git a/examples/wmts.html b/examples/wmts.html
new file mode 100644
index 0000000..4b48f24
--- /dev/null
+++ b/examples/wmts.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>WMTS example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">WMTS example</h4>
+          <p id="shortdesc">Example of a WMTS source.</p>
+          <div id="docs">
+            <p>See the <a href="wmts.js" target="_blank">wmts.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">wmts</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=wmts" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/wmts.js b/examples/wmts.js
new file mode 100644
index 0000000..b8daeb1
--- /dev/null
+++ b/examples/wmts.js
@@ -0,0 +1,66 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.extent');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+goog.require('ol.source.WMTS');
+goog.require('ol.tilegrid.WMTS');
+
+
+var projection = ol.proj.get('EPSG:3857');
+var projectionExtent = projection.getExtent();
+var size = ol.extent.getWidth(projectionExtent) / 256;
+var resolutions = new Array(14);
+var matrixIds = new Array(14);
+for (var z = 0; z < 14; ++z) {
+  // generate resolutions and matrixIds arrays for this WMTS
+  resolutions[z] = size / Math.pow(2, z);
+  matrixIds[z] = z;
+}
+
+var attribution = new ol.Attribution({
+  html: 'Tiles © <a href="http://services.arcgisonline.com/arcgis/rest/' +
+      'services/Demographics/USA_Population_Density/MapServer/">ArcGIS</a>'
+});
+
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM(),
+      opacity: 0.7
+    }),
+    new ol.layer.Tile({
+      opacity: 0.7,
+      extent: projectionExtent,
+      source: new ol.source.WMTS({
+        attributions: [attribution],
+        url: 'http://services.arcgisonline.com/arcgis/rest/' +
+            'services/Demographics/USA_Population_Density/MapServer/WMTS/',
+        layer: '0',
+        matrixSet: 'EPSG:3857',
+        format: 'image/png',
+        projection: projection,
+        tileGrid: new ol.tilegrid.WMTS({
+          origin: ol.extent.getTopLeft(projectionExtent),
+          resolutions: resolutions,
+          matrixIds: matrixIds
+        }),
+        style: 'default'
+      })
+    })
+  ],
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  view: new ol.View({
+    center: [-11158582, 4813697],
+    zoom: 4
+  })
+});
diff --git a/examples/xyz-esri-4326-512.html b/examples/xyz-esri-4326-512.html
new file mode 100644
index 0000000..584d046
--- /dev/null
+++ b/examples/xyz-esri-4326-512.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>XYZ Esri EPSG:4326 tileSize 512 example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">XYZ Esri EPSG:4326 tileSize 512 example</h4>
+          <p id="shortdesc">Example of a XYZ source in EPSG:4326 using Esri 512x512 tiles.</p>
+          <div id="docs">
+            <p>See the <a href="xyz-esri-4326-512.js" target="_blank">xyz-esri-4326-512.js source</a> for details on how this is done.</p>
+          </div>
+          <div id="tags">xyz, esri, tilesize, custom projection</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=xyz-esri-4326-512" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/xyz-esri-4326-512.js b/examples/xyz-esri-4326-512.js
new file mode 100644
index 0000000..c10c5d2
--- /dev/null
+++ b/examples/xyz-esri-4326-512.js
@@ -0,0 +1,72 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.extent');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.TileImage');
+goog.require('ol.tilegrid.TileGrid');
+
+var attribution = new ol.Attribution({
+  html: 'Copyright:© 2013 ESRI, i-cubed, GeoEye'
+});
+
+var projection = ol.proj.get('EPSG:4326');
+var projectionExtent = projection.getExtent();
+
+// The tile size supported by the ArcGIS tile service.
+var tileSize = 512;
+
+// Calculate the resolutions supported by the ArcGIS tile service.
+// There are 16 resolutions, with a factor of 2 between successive
+// resolutions. The max resolution is such that the world (360°)
+// fits into two (512x512 px) tiles.
+var maxResolution = ol.extent.getWidth(projectionExtent) / (tileSize * 2);
+var resolutions = new Array(16);
+var z;
+for (z = 0; z < 16; ++z) {
+  resolutions[z] = maxResolution / Math.pow(2, z);
+}
+
+var urlTemplate = 'http://services.arcgisonline.com/arcgis/rest/services/' +
+    'ESRI_Imagery_World_2D/MapServer/tile/{z}/{y}/{x}';
+
+var map = new ol.Map({
+  target: 'map',
+  layers: [
+    new ol.layer.Tile({
+      /* ol.source.XYZ and ol.tilegrid.XYZ have no resolutions config */
+      source: new ol.source.TileImage({
+        attributions: [attribution],
+        tileUrlFunction: function(tileCoord, pixelRatio, projection) {
+          var z = tileCoord[0];
+          var x = tileCoord[1];
+          var y = -tileCoord[2] - 1;
+          // wrap the world on the X axis
+          var n = Math.pow(2, z + 1); // 2 tiles at z=0
+          x = x % n;
+          if (x * n < 0) {
+            // x and n differ in sign so add n to wrap the result
+            // to the correct sign
+            x = x + n;
+          }
+          return urlTemplate.replace('{z}', z.toString())
+              .replace('{y}', y.toString())
+              .replace('{x}', x.toString());
+        },
+        projection: projection,
+        tileGrid: new ol.tilegrid.TileGrid({
+          origin: ol.extent.getTopLeft(projectionExtent),
+          resolutions: resolutions,
+          tileSize: 512
+        })
+      })
+    })
+  ],
+  view: new ol.View({
+    center: [0, 0],
+    projection: projection,
+    zoom: 2,
+    minZoom: 2
+  })
+});
diff --git a/examples/xyz-esri.html b/examples/xyz-esri.html
new file mode 100644
index 0000000..31f21a0
--- /dev/null
+++ b/examples/xyz-esri.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>XYZ Esri example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">XYZ Esri example</h4>
+          <p id="shortdesc">Example of a XYZ source using Esri tiles.</p>
+          <div id="docs">
+            <p>See the <a href="xyz-esri.js" target="_blank">xyz-esri.js source</a> for details on how this is done.</p>
+          </div>
+          <div id="tags">xyz, esri</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=xyz-esri" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/xyz-esri.js b/examples/xyz-esri.js
new file mode 100644
index 0000000..78bdeb1
--- /dev/null
+++ b/examples/xyz-esri.js
@@ -0,0 +1,29 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.XYZ');
+
+
+var attribution = new ol.Attribution({
+  html: 'Tiles © <a href="http://services.arcgisonline.com/ArcGIS/' +
+      'rest/services/World_Topo_Map/MapServer">ArcGIS</a>'
+});
+
+var map = new ol.Map({
+  target: 'map',
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.XYZ({
+        attributions: [attribution],
+        url: 'http://server.arcgisonline.com/ArcGIS/rest/services/' +
+            'World_Topo_Map/MapServer/tile/{z}/{y}/{x}'
+      })
+    })
+  ],
+  view: new ol.View({
+    center: ol.proj.transform([-121.1, 47.5], 'EPSG:4326', 'EPSG:3857'),
+    zoom: 7
+  })
+});
diff --git a/examples/xyz-retina.html b/examples/xyz-retina.html
new file mode 100644
index 0000000..acc25a4
--- /dev/null
+++ b/examples/xyz-retina.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>XYZ Retina tiles example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">XYZ with Retina tiles example</h4>
+          <p id="shortdesc">Example of Retina / HiDPI mercator tiles (512x512px) available as XYZ.</p>
+          <div id="docs">
+              <p>The ol.source.XYZ must contain <code>tilePixelRatio</code> parameter. The tiles were prepared from a GeoTIFF file with <a href="http://www.maptiler.com/">MapTiler</a>.</p>
+            <p>See the <a href="xyz-retina.js" target="_blank">xyz-retina.js source</a> for details on how this is done.</p>
+          </div>
+          <div id="tags">retina, hidpi, xyz, maptiler, @2x, devicePixelRatio</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=xyz-retina" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/xyz-retina.js b/examples/xyz-retina.js
new file mode 100644
index 0000000..1eecdfe
--- /dev/null
+++ b/examples/xyz-retina.js
@@ -0,0 +1,42 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.source.OSM');
+goog.require('ol.source.XYZ');
+
+
+var attribution = new ol.Attribution({
+  html: 'Tiles © USGS, rendered with ' +
+      '<a href="http://www.maptiler.com/">MapTiler</a>'
+});
+
+var mapMinZoom = 1;
+var mapMaxZoom = 15;
+var mapExtent = [-112.261791, 35.983744, -112.113981, 36.132062];
+
+var map = new ol.Map({
+  target: 'map',
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM()
+    }),
+    new ol.layer.Tile({
+      extent: ol.proj.transformExtent(mapExtent, 'EPSG:4326', 'EPSG:3857'),
+      source: new ol.source.XYZ({
+        attributions: [attribution],
+        url: 'http://tileserver.maptiler.com/grandcanyon@2x/{z}/{x}/{y}.png',
+        tilePixelRatio: 2, // THIS IS IMPORTANT
+        minZoom: mapMinZoom,
+        maxZoom: mapMaxZoom
+      })
+    })
+  ],
+  view: new ol.View({
+    projection: 'EPSG:3857',
+    center: ol.proj.transform([-112.18688965, 36.057944835],
+        'EPSG:4326', 'EPSG:3857'),
+    zoom: 12
+  })
+});
diff --git a/examples/xyz.html b/examples/xyz.html
new file mode 100644
index 0000000..ed08aee
--- /dev/null
+++ b/examples/xyz.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>XYZ example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">XYZ example</h4>
+          <p id="shortdesc">Example of a XYZ source.</p>
+          <div id="docs">
+            <p>See the <a href="xyz.js" target="_blank">xyz.js source</a> for details on how this is done.</p>
+          </div>
+          <div id="tags">xyz</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=xyz" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/xyz.js b/examples/xyz.js
new file mode 100644
index 0000000..041e6d9
--- /dev/null
+++ b/examples/xyz.js
@@ -0,0 +1,46 @@
+goog.require('ol.Attribution');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.OSM');
+goog.require('ol.source.XYZ');
+
+
+var attribution = new ol.Attribution({
+  html: 'Tiles © <a href="http://maps.nls.uk/townplans/glasgow_1.html">' +
+      'National Library of Scotland</a>'
+});
+
+var map = new ol.Map({
+  target: 'map',
+  controls: ol.control.defaults({
+    attributionOptions: /** @type {olx.control.AttributionOptions} */ ({
+      collapsible: false
+    })
+  }),
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.OSM({
+        attributions: [
+          new ol.Attribution({
+            html: 'Tiles © <a href="http://www.opencyclemap.org/">' +
+                'OpenCycleMap</a>'
+          }),
+          ol.source.OSM.ATTRIBUTION
+        ],
+        url: 'http://{a-c}.tile.opencyclemap.org/cycle/{z}/{x}/{y}.png'
+      })
+    }),
+    new ol.layer.Tile({
+      source: new ol.source.XYZ({
+        attributions: [attribution],
+        url: 'http://geo.nls.uk/maps/towns/glasgow1857/{z}/{x}/{-y}.png'
+      })
+    })
+  ],
+  view: new ol.View({
+    center: [-472202, 7530279],
+    zoom: 12
+  })
+});
diff --git a/examples/zoom-constrained.html b/examples/zoom-constrained.html
new file mode 100644
index 0000000..e1ccbab
--- /dev/null
+++ b/examples/zoom-constrained.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Zoom Constrained Example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Zoom constrained example</h4>
+          <p id="shortdesc">Example of a zoom constrained view.</p>
+          <div id="docs">
+            <p>This map has a view that is constrained between zoom levels 9 and 13.  This is done using the <code>minZoom</code> and <code>maxZoom</code> view options.</p>
+            <p>See the <a href="zoom-constrained.js" target="_blank">zoom-constrained.js source</a> for details.</p>
+          </div>
+          <div id="tags">bing, zoom, minZoom, maxZoom</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=zoom-constrained" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/zoom-constrained.js b/examples/zoom-constrained.js
new file mode 100644
index 0000000..c76578a
--- /dev/null
+++ b/examples/zoom-constrained.js
@@ -0,0 +1,23 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.BingMaps');
+
+
+var map = new ol.Map({
+  target: 'map',
+  layers: [
+    new ol.layer.Tile({
+      source: new ol.source.BingMaps({
+        key: 'Ak-dzM4wZjSqTlzveKz5u0d4IQ4bRzVI309GxmkgSVr1ewS6iPSrOvOKhA-CJlm3',
+        imagerySet: 'Aerial'
+      })
+    })
+  ],
+  view: new ol.View({
+    center: [-13553864, 5918250],
+    zoom: 11,
+    minZoom: 9,
+    maxZoom: 13
+  })
+});
diff --git a/examples/zoomify.html b/examples/zoomify.html
new file mode 100644
index 0000000..f6be63b
--- /dev/null
+++ b/examples/zoomify.html
@@ -0,0 +1,51 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <title>Zoomify example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span12">
+          <div id="map" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">Zoomify example</h4>
+          <p id="shortdesc">Example of a Zoomify source.</p>
+          <div id="docs">
+            <p>See the <a href="zoomify.js" target="_blank">zoomify.js source</a> to see how this is done.</p>
+          </div>
+          <div id="tags">zoomify</div>
+        </div>
+
+      </div>
+
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=zoomify" type="text/javascript"></script>
+
+  </body>
+</html>
diff --git a/examples/zoomify.js b/examples/zoomify.js
new file mode 100644
index 0000000..a33547f
--- /dev/null
+++ b/examples/zoomify.js
@@ -0,0 +1,53 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.layer.Tile');
+goog.require('ol.proj');
+goog.require('ol.proj.Projection');
+goog.require('ol.source.Zoomify');
+
+// This server does not support CORS, and so is incompatible with WebGL.
+//var imgWidth = 8001;
+//var imgHeight = 6943;
+//var url = 'http://mapy.mzk.cz/AA22/0103/';
+//var crossOrigin = undefined;
+
+var imgWidth = 9911;
+var imgHeight = 6100;
+var url = 'http://vips.vtech.fr/cgi-bin/iipsrv.fcgi?zoomify=' +
+        '/mnt/MD1/AD00/plan_CHU-4HD-01/FOND.TIF/';
+var crossOrigin = 'anonymous';
+
+var imgCenter = [imgWidth / 2, - imgHeight / 2];
+
+// Maps always need a projection, but Zoomify layers are not geo-referenced, and
+// are only measured in pixels.  So, we create a fake projection that the map
+// can use to properly display the layer.
+var proj = new ol.proj.Projection({
+  code: 'ZOOMIFY',
+  units: 'pixels',
+  extent: [0, 0, imgWidth, imgHeight]
+});
+
+var source = new ol.source.Zoomify({
+  url: url,
+  size: [imgWidth, imgHeight],
+  crossOrigin: crossOrigin
+});
+
+var map = new ol.Map({
+  layers: [
+    new ol.layer.Tile({
+      source: source
+    })
+  ],
+  renderer: exampleNS.getRendererFromQueryString(),
+  target: 'map',
+  view: new ol.View({
+    projection: proj,
+    center: imgCenter,
+    zoom: 0,
+    // constrain the center: center cannot be set outside
+    // this extent
+    extent: [0, -imgHeight, imgWidth, 0]
+  })
+});
diff --git a/examples/zoomslider.html b/examples/zoomslider.html
new file mode 100644
index 0000000..f5da737
--- /dev/null
+++ b/examples/zoomslider.html
@@ -0,0 +1,126 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="chrome=1">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <link rel="stylesheet" href="../css/ol.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap.min.css" type="text/css">
+    <link rel="stylesheet" href="../resources/layout.css" type="text/css">
+    <link rel="stylesheet" href="../resources/bootstrap/css/bootstrap-responsive.min.css" type="text/css">
+    <style type="text/css">
+/**
+ * The zoomslider in the second map shall be placed between the zoom-in and
+ * zoom-out buttons.
+ */
+#map2 .ol-zoom .ol-zoom-out {
+  margin-top: 204px;
+}
+#map2 .ol-zoomslider {
+  background-color: transparent;
+  top: 2.3em;
+}
+
+#map2 .ol-touch .ol-zoom .ol-zoom-out { 
+  margin-top: 212px;
+}
+#map2 .ol-touch .ol-zoomslider {
+  top: 2.75em;
+}
+
+#map2 .ol-zoom-in.ol-has-tooltip:hover [role=tooltip],
+#map2 .ol-zoom-in.ol-has-tooltip:focus [role=tooltip] {
+  top: 3px;
+}
+
+#map2 .ol-zoom-out.ol-has-tooltip:hover [role=tooltip],
+#map2 .ol-zoom-out.ol-has-tooltip:focus [role=tooltip] {
+  top: 232px;
+}
+
+/**
+ * The zoomslider in the third map shall be horizontal, placed in the top-right
+ * corner, smaller and orange.
+ */
+#map3 .ol-zoomslider {
+  top: 8px;
+  left: auto;
+  right: 8px;
+  background-color: rgba(255,69,0,0.2);
+  width: 200px;
+  height: 15px;
+  padding: 0;
+  box-shadow: 0 0 5px rgb(255,69,0);
+  border-radius: 20px;
+}
+
+#map3 .ol-zoomslider:hover {
+  background-color: rgba(255,69,0,0.3);
+}
+
+#map3 .ol-zoomslider-thumb {
+  height: 15px;
+  width: 15px;
+  margin: 0;
+  filter: none;
+  background-color: rgba(255,69,0,0.6);
+  border-radius: 20px;
+}
+#map3 a.ol-zoomslider-handle:hover {
+  background-color: rgba(255,69,0,0.7);
+}
+    </style>
+    <title>Zoom slider example</title>
+  </head>
+  <body>
+
+    <div class="navbar navbar-inverse navbar-fixed-top">
+      <div class="navbar-inner">
+        <div class="container">
+          <a class="brand" href="./"><img src="../resources/logo.png"> OpenLayers 3 Examples</a>
+        </div>
+      </div>
+    </div>
+
+    <div class="container-fluid">
+
+      <div class="row-fluid">
+        <div class="span4">
+          <h4>Default style</h4>
+          <div id="map1" class="map"></div>
+        </div>
+        <div class="span4">
+          <h4>Placed between zoom controls</h4>
+          <div id="map2" class="map"></div>
+        </div>
+        <div class="span4">
+          <h4>Horizontal and completely re-styled</h4>
+          <div id="map3" class="map"></div>
+        </div>
+      </div>
+
+      <div class="row-fluid">
+
+        <div class="span12">
+          <h4 id="title">ZoomSlider control</h4>
+          <p id="shortdesc">Example of various ZoomSlider controls.</p>
+          <div id="docs">
+            <p>
+              See the <a href="zoomslider.js" target="_blank">zoomslider.js
+              source</a> to see how this is done.
+            </p>
+          </div>
+          <div id="tags">
+            zoom, zoomslider, slider, style, styling, css, control
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <script src="../resources/jquery.min.js" type="text/javascript"></script>
+    <script src="../resources/example-behaviour.js" type="text/javascript"></script>
+    <script src="loader.js?id=zoomslider" type="text/javascript"></script>
+
+  </body>
+
+</html>
diff --git a/examples/zoomslider.js b/examples/zoomslider.js
new file mode 100644
index 0000000..97cd838
--- /dev/null
+++ b/examples/zoomslider.js
@@ -0,0 +1,36 @@
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.control.ZoomSlider');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.MapQuest');
+
+
+/**
+ * Helper method for map-creation.
+ *
+ * @param {string} divId The id of the div for the map.
+ * @return {ol.Map} The ol.Map instance.
+ */
+var createMap = function(divId) {
+  var source, layer, map, zoomslider, resolutions;
+
+  source = new ol.source.MapQuest({layer: 'sat'});
+  layer = new ol.layer.Tile({
+    source: source
+  });
+  map = new ol.Map({
+    layers: [layer],
+    target: divId,
+    view: new ol.View({
+      center: [0, 0],
+      zoom: 2
+    })
+  });
+  zoomslider = new ol.control.ZoomSlider();
+  map.addControl(zoomslider);
+  return map;
+};
+
+var map1 = createMap('map1');
+var map2 = createMap('map2');
+var map3 = createMap('map3');
diff --git a/externs/bingmaps.js b/externs/bingmaps.js
new file mode 100644
index 0000000..d38bb4e
--- /dev/null
+++ b/externs/bingmaps.js
@@ -0,0 +1,176 @@
+/**
+ * @externs
+ */
+
+
+
+/**
+ * @constructor
+ */
+var BingMapsCoverageArea = function() {};
+
+
+/**
+ * @type {Array.<number>}
+ */
+BingMapsCoverageArea.prototype.bbox;
+
+
+/**
+ * @type {number}
+ */
+BingMapsCoverageArea.prototype.zoomMax;
+
+
+/**
+ * @type {number}
+ */
+BingMapsCoverageArea.prototype.zoomMin;
+
+
+
+/**
+ * @constructor
+ */
+var BingMapsImageryProvider = function() {};
+
+
+/**
+ * @type {string}
+ */
+BingMapsImageryProvider.prototype.attribution;
+
+
+/**
+ * @type {Array.<BingMapsCoverageArea>}
+ */
+BingMapsImageryProvider.prototype.coverageAreas;
+
+
+
+/**
+ * @constructor
+ */
+var BingMapsImageryMetadataResponse = function() {};
+
+
+/**
+ * @type {string}
+ */
+BingMapsImageryMetadataResponse.prototype.authenticationResultCode;
+
+
+/**
+ * @type {string}
+ */
+BingMapsImageryMetadataResponse.prototype.brandLogoUri;
+
+
+/**
+ * @type {string}
+ */
+BingMapsImageryMetadataResponse.prototype.copyright;
+
+
+/**
+ * @type {Array.<BingMapsResourceSet>}
+ */
+BingMapsImageryMetadataResponse.prototype.resourceSets;
+
+
+/**
+ * @type {number}
+ */
+BingMapsImageryMetadataResponse.prototype.statusCode;
+
+
+/**
+ * @type {string}
+ */
+BingMapsImageryMetadataResponse.prototype.statusDescription;
+
+
+/**
+ * @type {string}
+ */
+BingMapsImageryMetadataResponse.prototype.traceId;
+
+
+
+/**
+ * @constructor
+ */
+var BingMapsResource = function() {};
+
+
+/**
+ * @type {number}
+ */
+BingMapsResource.prototype.imageHeight;
+
+
+/**
+ * @type {string}
+ */
+BingMapsResource.prototype.imageUrl;
+
+
+/**
+ * @type {Array.<string>}
+ */
+BingMapsResource.prototype.imageUrlSubdomains;
+
+
+/**
+ * @type {number}
+ */
+BingMapsResource.prototype.imageWidth;
+
+
+/**
+ * @type {Array.<BingMapsImageryProvider>}
+ */
+BingMapsResource.prototype.imageryProviders;
+
+
+/**
+ * @type {Object}
+ */
+BingMapsResource.prototype.vintageEnd;
+
+
+/**
+ * @type {Object}
+ */
+BingMapsResource.prototype.vintageStart;
+
+
+/**
+ * @type {number}
+ */
+BingMapsResource.prototype.zoomMax;
+
+
+/**
+ * @type {number}
+ */
+BingMapsResource.prototype.zoomMin;
+
+
+
+/**
+ * @constructor
+ */
+var BingMapsResourceSet = function() {};
+
+
+/**
+ * @type {number}
+ */
+BingMapsResourceSet.prototype.estimatedTotal;
+
+
+/**
+ * @type {Array.<BingMapsResource>}
+ */
+BingMapsResourceSet.prototype.resources;
diff --git a/externs/bootstrap.js b/externs/bootstrap.js
new file mode 100644
index 0000000..7d2d429
--- /dev/null
+++ b/externs/bootstrap.js
@@ -0,0 +1,20 @@
+/**
+ * @fileoverview Externs for bootstrap.js
+ *
+ * @see http://twitter.github.com/bootstrap/javascript.html
+ * @externs
+ */
+
+
+/**
+ * @param {string|Object.<string,*>=} opt_option
+ * @return {!jQuery}
+ */
+jQuery.prototype.popover = function(opt_option) {};
+
+
+/**
+ * @param {string|Object.<string,*>=} opt_option
+ * @return {!jQuery}
+ */
+jQuery.prototype.tooltip = function(opt_option) {};
diff --git a/externs/closure-compiler.js b/externs/closure-compiler.js
new file mode 100644
index 0000000..b9c546b
--- /dev/null
+++ b/externs/closure-compiler.js
@@ -0,0 +1,32 @@
+/**
+ * @fileoverview Definitions for externs that are either missing or incorrect
+ * in the current release version of the closure compiler we use.
+ *
+ * The entries must be removed once they are available/correct in the
+ * version we use.
+ *
+ * @externs
+ */
+
+/** @type {number} */
+Touch.prototype.force;
+
+
+/** @type {number} */
+Touch.prototype.radiusX;
+
+
+/** @type {number} */
+Touch.prototype.radiusY;
+
+
+/** @type {number} */
+Touch.prototype.webkitForce;
+
+
+/** @type {number} */
+Touch.prototype.webkitRadiusX;
+
+
+/** @type {number} */
+Touch.prototype.webkitRadiusY;
diff --git a/externs/example.js b/externs/example.js
new file mode 100644
index 0000000..231fb68
--- /dev/null
+++ b/externs/example.js
@@ -0,0 +1,18 @@
+/**
+ * @type {Object}
+ */
+var exampleNS;
+
+
+
+/**
+ * @return {string} Renderer type.
+ */
+exampleNS.getRendererFromQueryString = function() {};
+
+
+/**
+ * @param {string} str String.
+ * @return {string} Base64 string.
+ */
+exampleNS.strToBase64 = function(str) {};
diff --git a/externs/fastclick.js b/externs/fastclick.js
new file mode 100644
index 0000000..676200f
--- /dev/null
+++ b/externs/fastclick.js
@@ -0,0 +1,25 @@
+/**
+ * @fileoverview Externs for FastClick 1.0.3
+ * @see https://github.com/ftlabs/fastclick
+ * @externs
+ */
+
+/**
+ * @type {Object}
+ * @const
+ */
+var FastClick = {};
+
+/**
+ * @typedef {{
+ *   touchBoundary: (number|undefined),
+ *   tapDelay: (number|undefined)
+ * }}
+ */
+FastClick.AttachOptions;
+
+/**
+ * @param {Element} layer
+ * @param {FastClick.AttachOptions=} opt_options
+ */
+FastClick.attach = function(layer, opt_options) {};
diff --git a/externs/geojson.js b/externs/geojson.js
new file mode 100644
index 0000000..4d65845
--- /dev/null
+++ b/externs/geojson.js
@@ -0,0 +1,162 @@
+
+/**
+ * @fileoverview Externs for GeoJSON.
+ * @see http://geojson.org/geojson-spec.html
+ * @externs
+ */
+
+
+
+/**
+ * @constructor
+ */
+var GeoJSONObject = function() {};
+
+
+/**
+ * @type {string}
+ */
+GeoJSONObject.prototype.type;
+
+
+/**
+ * @type {!GeoJSONCRS|undefined}
+ */
+GeoJSONObject.prototype.crs;
+
+
+
+/**
+ * @constructor
+ * @extends {GeoJSONObject}
+ */
+var GeoJSONCRS = function() {};
+
+
+/**
+ * TODO: remove GeoJSONCRSCode when http://jira.codehaus.org/browse/GEOS-5996
+ * is fixed and widely deployed.
+ * @type {!GeoJSONCRSCode|!GeoJSONCRSName|!GeoJSONLink}
+ */
+GeoJSONCRS.prototype.properties;
+
+
+
+/**
+ * `GeoJSONCRSCode` is not part of the GeoJSON specification, but is generated
+ * by GeoServer.
+ * TODO: remove GeoJSONCRSCode when http://jira.codehaus.org/browse/GEOS-5996
+ * is fixed and widely deployed.
+ * @constructor
+ */
+var GeoJSONCRSCode = function() {};
+
+
+
+/**
+ * @constructor
+ */
+var GeoJSONCRSName = function() {};
+
+
+/**
+ * TODO: remove this when http://jira.codehaus.org/browse/GEOS-5996 is fixed
+ * and widely deployed.
+ * @type {string}
+ */
+GeoJSONCRSName.prototype.code;
+
+
+/**
+ * @type {string}
+ */
+GeoJSONCRSName.prototype.name;
+
+
+
+/**
+ * @constructor
+ * @extends {GeoJSONObject}
+ */
+var GeoJSONGeometry = function() {};
+
+
+/**
+ * @type {!Array.<number>|!Array.<!Array.<number>>|
+ *        !Array.<!Array.<!Array.<number>>>}
+ */
+GeoJSONGeometry.prototype.coordinates;
+
+
+
+/**
+ * @constructor
+ * @extends {GeoJSONObject}
+ */
+var GeoJSONGeometryCollection = function() {};
+
+
+/**
+ * @type {!Array.<GeoJSONGeometry>}
+ */
+GeoJSONGeometryCollection.prototype.geometries;
+
+
+
+/**
+ * @constructor
+ * @extends {GeoJSONObject}
+ */
+var GeoJSONFeature = function() {};
+
+
+/**
+ * @type {GeoJSONGeometry}
+ */
+GeoJSONFeature.prototype.geometry;
+
+
+/**
+ * @type {number|string|undefined}
+ */
+GeoJSONFeature.prototype.id;
+
+
+/**
+ * @type {Object.<string, *>}
+ */
+GeoJSONFeature.prototype.properties;
+
+
+
+/**
+ * @constructor
+ * @extends {GeoJSONObject}
+ */
+var GeoJSONFeatureCollection = function() {};
+
+
+/**
+ * @type {!Array.<GeoJSONFeature>}
+ */
+GeoJSONFeatureCollection.prototype.features;
+
+
+/**
+ * @type {!Array.<number>|undefined}
+ */
+GeoJSONFeatureCollection.prototype.bbox;
+
+
+
+/**
+ * @constructor
+ * @extends {GeoJSONObject}
+ */
+var GeoJSONLink = function() {};
+
+
+/**
+ * @type {string}
+ */
+GeoJSONLink.prototype.href;
diff --git a/externs/jquery-1.9.js b/externs/jquery-1.9.js
new file mode 100644
index 0000000..38d21c0
--- /dev/null
+++ b/externs/jquery-1.9.js
@@ -0,0 +1,2157 @@
+/*
+ * Copyright 2011 The Closure Compiler Authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @fileoverview Externs for jQuery 1.9.1
+ *
+ * Note that some functions use different return types depending on the number
+ * of parameters passed in. In these cases, you may need to annotate the type
+ * of the result in your code, so the JSCompiler understands which type you're
+ * expecting. For example:
+ *    <code>var elt = /** @type {Element} * / (foo.get(0));</code>
+ *
+ * @see http://api.jquery.com/
+ * @externs
+ */
+
+/**
+ * @typedef {(Window|Document|Element|Array.<Element>|string|jQuery|
+ *     NodeList)}
+ */
+var jQuerySelector;
+
+/** @typedef {function(...)|Array.<function(...)>} */
+var jQueryCallback;
+
+/** @typedef {
+              {
+               accepts: (Object.<string, string>|undefined),
+               async: (?boolean|undefined),
+               beforeSend: (function(jQuery.jqXHR, (jQueryAjaxSettings|Object.<string, *>))|undefined),
+               cache: (?boolean|undefined),
+               complete: (function(jQuery.jqXHR, string)|undefined),
+               contents: (Object.<string, RegExp>|undefined),
+               contentType: (?string|undefined),
+               context: (Object.<?, ?>|jQueryAjaxSettings|undefined),
+               converters: (Object.<string, Function>|undefined),
+               crossDomain: (?boolean|undefined),
+               data: (Object.<?, ?>|?string|Array.<?>|undefined),
+               dataFilter: (function(string, string):Object.<?,?>|undefined),
+               dataType: (?string|undefined),
+               error: (function(jQuery.jqXHR, string, string)|undefined),
+               global: (?boolean|undefined),
+               headers: (Object.<?, ?>|undefined),
+               ifModified: (?boolean|undefined),
+               isLocal: (?boolean|undefined),
+               jsonp: (?string|undefined),
+               jsonpCallback: (?string|function()|undefined),
+               mimeType: (?string|undefined),
+               password: (?string|undefined),
+               processData: (?boolean|undefined),
+               scriptCharset: (?string|undefined),
+               statusCode: (Object.<number, function()>|undefined),
+               success: (function(?, string, jQuery.jqXHR)|undefined),
+               timeout: (?number|undefined),
+               traditional: (?boolean|undefined),
+               type: (?string|undefined),
+               url: (?string|undefined),
+               username: (?string|undefined),
+               xhr: (function():(ActiveXObject|XMLHttpRequest)|undefined),
+               xhrFields: (Object.<?, ?>|undefined)
+              }} */
+var jQueryAjaxSettings;
+
+/**
+ * @constructor
+ * @param {(jQuerySelector|Element|Object|Array.<Element>|jQuery|string|
+ *     function())=} arg1
+ * @param {(Element|jQuery|Document|
+ *     Object.<string, (string|function(!jQuery.event=))>)=} arg2
+ * @return {!jQuery}
+ */
+function jQuery(arg1, arg2) {}
+
+/**
+ * @constructor
+ * @extends {jQuery}
+ * @param {(jQuerySelector|Element|Object|Array.<Element>|jQuery|string|
+ *     function())=} arg1
+ * @param {(Element|jQuery|Document|
+ *     Object.<string, (string|function(!jQuery.event=))>)=} arg2
+ * @return {!jQuery}
+ */
+function $(arg1, arg2) {}
+
+/**
+ * @param {(jQuerySelector|Array.<Element>|string|jQuery)} arg1
+ * @param {Element=} context
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.add = function(arg1, context) {};
+
+/**
+ * @param {(jQuerySelector|Array.<Element>|string|jQuery)=} arg1
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.addBack = function(arg1) {};
+
+/**
+ * @param {(string|function(number,String))} arg1
+ * @return {!jQuery}
+ */
+jQuery.prototype.addClass = function(arg1) {};
+
+/**
+ * @param {(string|Element|jQuery|function(number))} arg1
+ * @param {(string|Element|Array.<Element>|jQuery)=} content
+ * @return {!jQuery}
+ */
+jQuery.prototype.after = function(arg1, content) {};
+
+/**
+ * @param {(string|jQueryAjaxSettings|Object.<string,*>)} arg1
+ * @param {(jQueryAjaxSettings|Object.<string, *>)=} settings
+ * @return {jQuery.jqXHR}
+ */
+jQuery.ajax = function(arg1, settings) {};
+
+/**
+ * @param {(string|jQueryAjaxSettings|Object.<string, *>)} arg1
+ * @param {(jQueryAjaxSettings|Object.<string, *>)=} settings
+ * @return {jQuery.jqXHR}
+ */
+$.ajax = function(arg1, settings) {};
+
+/**
+ * @param {function(!jQuery.event,XMLHttpRequest,(jQueryAjaxSettings|Object.<string, *>))} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.ajaxComplete = function(handler) {};
+
+/**
+ * @param {function(!jQuery.event,jQuery.jqXHR,(jQueryAjaxSettings|Object.<string, *>),*)} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.ajaxError = function(handler) {};
+
+/**
+ * @param {(string|function((jQueryAjaxSettings|Object.<string, *>),(jQueryAjaxSettings|Object.<string, *>),jQuery.jqXHR))} dataTypes
+ * @param {function((jQueryAjaxSettings|Object.<string, *>),(jQueryAjaxSettings|Object.<string, *>),jQuery.jqXHR)=} handler
+ */
+jQuery.ajaxPrefilter = function(dataTypes, handler) {};
+
+/**
+ * @param {(string|function((jQueryAjaxSettings|Object.<string, *>),(jQueryAjaxSettings|Object.<string, *>),jQuery.jqXHR))} dataTypes
+ * @param {function((jQueryAjaxSettings|Object.<string, *>),(jQueryAjaxSettings|Object.<string, *>),jQuery.jqXHR)=} handler
+ */
+$.ajaxPrefilter = function(dataTypes, handler) {};
+
+/**
+ * @param {function(!jQuery.event,jQuery.jqXHR,(jQueryAjaxSettings|Object.<string, *>))} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.ajaxSend = function(handler) {};
+
+/** @const {jQueryAjaxSettings|Object.<string, *>} */
+jQuery.ajaxSettings;
+
+/** @const {jQueryAjaxSettings|Object.<string, *>} */
+$.ajaxSettings = {};
+
+/** @type {Object.<string, boolean>} */
+jQuery.ajaxSettings.flatOptions = {};
+
+/** @type {Object.<string, boolean>} */
+$.ajaxSettings.flatOptions = {};
+
+/** @type {boolean} */
+jQuery.ajaxSettings.processData;
+
+/** @type {boolean} */
+$.ajaxSettings.processData;
+
+/** @type {Object.<string, string>} */
+jQuery.ajaxSettings.responseFields = {};
+
+/** @type {Object.<string, string>} */
+$.ajaxSettings.responseFields = {};
+
+/** @param {jQueryAjaxSettings|Object.<string, *>} options */
+jQuery.ajaxSetup = function(options) {};
+
+/** @param {jQueryAjaxSettings|Object.<string, *>} options */
+$.ajaxSetup = function(options) {};
+
+/**
+ * @param {function()} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.ajaxStart = function(handler) {};
+
+/**
+ * @param {function()} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.ajaxStop = function(handler) {};
+
+/**
+ * @param {function(!jQuery.event,XMLHttpRequest,(jQueryAjaxSettings|Object.<string, *>), ?)} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.ajaxSuccess = function(handler) {};
+
+/**
+ * @deprecated Please use .addBack(selector) instead.
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.andSelf = function() {};
+
+/**
+ * @param {Object.<string,*>} properties
+ * @param {(string|number|function()|Object.<string,*>)=} arg2
+ * @param {(string|function())=} easing
+ * @param {function()=} complete
+ * @return {!jQuery}
+ */
+jQuery.prototype.animate = function(properties, arg2, easing, complete) {};
+
+/**
+ * @param {(string|Element|Array.<Element>|jQuery|function(number,string))} arg1
+ * @param {...(string|Element|Array.<Element>|jQuery)} content
+ * @return {!jQuery}
+ */
+jQuery.prototype.append = function(arg1, content) {};
+
+/**
+ * @param {(jQuerySelector|Element|jQuery)} target
+ * @return {!jQuery}
+ */
+jQuery.prototype.appendTo = function(target) {};
+
+/**
+ * @param {(string|Object.<string,*>)} arg1
+ * @param {(string|number|boolean|function(number,string))=} arg2
+ * @return {(string|!jQuery)}
+ */
+jQuery.prototype.attr = function(arg1, arg2) {};
+
+/**
+ * @param {(string|Element|jQuery|function())} arg1
+ * @param {(string|Element|Array.<Element>|jQuery)=} content
+ * @return {!jQuery}
+ */
+jQuery.prototype.before = function(arg1, content) {};
+
+/**
+ * @param {(string|Object.<string, function(!jQuery.event=)>)} arg1
+ * @param {(Object.<string, *>|function(!jQuery.event=)|boolean)=} eventData
+ * @param {(function(!jQuery.event=)|boolean)=} arg3
+ * @return {!jQuery}
+ */
+jQuery.prototype.bind = function(arg1, eventData, arg3) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.blur = function(arg1, handler) {};
+
+/**
+ * @constructor
+ * @private
+ */
+jQuery.callbacks = function () {};
+
+/**
+ * @param {string=} flags
+ * @return {jQuery.callbacks}
+ */
+jQuery.Callbacks = function (flags) {};
+
+/** @param {function()} callbacks */
+jQuery.callbacks.prototype.add = function(callbacks) {};
+
+/** @return {undefined} */
+jQuery.callbacks.prototype.disable = function() {};
+
+/** @return {undefined} */
+jQuery.callbacks.prototype.empty = function() {};
+
+/** @param {...*} var_args */
+jQuery.callbacks.prototype.fire = function(var_args) {};
+
+/** @return {boolean} */
+jQuery.callbacks.prototype.fired = function() {};
+
+/** @param {...*} var_args */
+jQuery.callbacks.prototype.fireWith = function(var_args) {};
+
+/**
+ * @param {function()} callback
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.callbacks.prototype.has = function(callback) {};
+
+/** @return {undefined} */
+jQuery.callbacks.prototype.lock = function() {};
+
+/** @return {boolean} */
+jQuery.callbacks.prototype.locked = function() {};
+
+/** @param {function()} callbacks */
+jQuery.callbacks.prototype.remove = function(callbacks) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.change = function(arg1, handler) {};
+
+/**
+ * @param {jQuerySelector=} selector
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.children = function(selector) {};
+
+/**
+ * @param {string=} queueName
+ * @return {!jQuery}
+ */
+jQuery.prototype.clearQueue = function(queueName) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.click = function(arg1, handler) {};
+
+/**
+ * @param {boolean=} withDataAndEvents
+ * @param {boolean=} deepWithDataAndEvents
+ * @return {!jQuery}
+ * @suppress {checkTypes} see issue 583
+ */
+jQuery.prototype.clone = function(withDataAndEvents, deepWithDataAndEvents) {};
+
+/**
+ * @param {(jQuerySelector|jQuery|Element|string)} arg1
+ * @param {Element=} context
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.closest = function(arg1, context) {};
+
+/**
+ * @param {Element} container
+ * @param {Element} contained
+ * @return {boolean}
+ */
+jQuery.contains = function(container, contained) {};
+
+/**
+ * @param {Element} container
+ * @param {Element} contained
+ * @return {boolean}
+ */
+$.contains = function(container, contained) {};
+
+/**
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.contents = function() {};
+
+/** @type {Element|Document} */
+jQuery.prototype.context;
+
+/**
+ * @param {(string|Object.<string,*>)} arg1
+ * @param {(string|number|function(number,*))=} arg2
+ * @return {(string|!jQuery)}
+ */
+jQuery.prototype.css = function(arg1, arg2) {};
+
+/** @type {Object.<string, *>} */
+jQuery.cssHooks;
+
+/** @type {Object.<string, *>} */
+$.cssHooks;
+
+/**
+ * @param {Element} elem
+ * @param {string=} key
+ * @param {*=} value
+ * @return {*}
+ */
+jQuery.data = function(elem, key, value) {};
+
+/**
+ * @param {(string|Object.<string, *>)=} arg1
+ * @param {*=} value
+ * @return {*}
+ */
+jQuery.prototype.data = function(arg1, value) {};
+
+/**
+ * @param {Element} elem
+ * @param {string=} key
+ * @param {*=} value
+ * @return {*}
+ */
+$.data = function(elem, key, value) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.dblclick = function(arg1, handler) {};
+
+/**
+ * @constructor
+ * @implements {jQuery.Promise}
+ * @param {function()=} opt_fn
+ * @see http://api.jquery.com/category/deferred-object/
+ */
+jQuery.deferred = function(opt_fn) {};
+
+/**
+ * @constructor
+ * @extends {jQuery.deferred}
+ * @param {function()=} opt_fn
+ * @return {jQuery.Deferred}
+ */
+jQuery.Deferred = function(opt_fn) {};
+
+/**
+ * @constructor
+ * @extends {jQuery.deferred}
+ * @param {function()=} opt_fn
+ * @see http://api.jquery.com/category/deferred-object/
+ */
+$.deferred = function(opt_fn) {};
+
+/**
+ * @constructor
+ * @extends {jQuery.deferred}
+ * @param {function()=} opt_fn
+ * @return {jQuery.deferred}
+ */
+$.Deferred = function(opt_fn) {};
+
+/**
+ * @override
+ * @param {jQueryCallback} alwaysCallbacks
+ * @param {jQueryCallback=} alwaysCallbacks2
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.always
+    = function(alwaysCallbacks, alwaysCallbacks2) {};
+
+/**
+ * @override
+ * @param {jQueryCallback} doneCallbacks
+ * @param {jQueryCallback=} doneCallbacks2
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.done = function(doneCallbacks, doneCallbacks2) {};
+
+/**
+ * @override
+ * @param {jQueryCallback} failCallbacks
+ * @param {jQueryCallback=} failCallbacks2
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.fail = function(failCallbacks, failCallbacks2) {};
+
+/**
+ * @param {...*} var_args
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.notify = function(var_args) {};
+
+/**
+ * @param {Object} context
+ * @param {...*} var_args
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.notifyWith = function(context, var_args) {};
+
+/**
+ * @deprecated Please use deferred.then() instead.
+ * @override
+ * @param {function()=} doneFilter
+ * @param {function()=} failFilter
+ * @param {function()=} progressFilter
+ * @return {jQuery.Promise}
+ */
+jQuery.deferred.prototype.pipe =
+    function(doneFilter, failFilter, progressFilter) {};
+
+/**
+ * @param {jQueryCallback} progressCallbacks
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.progress = function(progressCallbacks) {};
+
+/**
+ * @param {Object=} target
+ * @return {jQuery.Promise}
+ */
+jQuery.deferred.prototype.promise = function(target) {};
+
+/**
+ * @param {...*} var_args
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.reject = function(var_args) {};
+
+/**
+ * @param {Object} context
+ * @param {Array.<*>=} args
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.rejectWith = function(context, args) {};
+
+/**
+ * @param {...*} var_args
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.resolve = function(var_args) {};
+
+/**
+ * @param {Object} context
+ * @param {Array.<*>=} args
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.resolveWith = function(context, args) {};
+
+/** @return {string} */
+jQuery.deferred.prototype.state = function() {};
+
+/**
+ * @override
+ * @param {jQueryCallback} doneCallbacks
+ * @param {jQueryCallback=} failCallbacks
+ * @param {jQueryCallback=} progressCallbacks
+ * @return {jQuery.deferred}
+ */
+jQuery.deferred.prototype.then
+    = function(doneCallbacks, failCallbacks, progressCallbacks) {};
+
+/**
+ * @param {number} duration
+ * @param {string=} queueName
+ * @return {!jQuery}
+ */
+jQuery.prototype.delay = function(duration, queueName) {};
+
+/**
+ * @param {string} selector
+ * @param {(string|Object.<string,*>)} arg2
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg3
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.delegate = function(selector, arg2, arg3, handler) {};
+
+/**
+ * @param {Element} elem
+ * @param {string=} queueName
+ */
+jQuery.dequeue = function(elem, queueName) {};
+
+/**
+ * @param {string=} queueName
+ * @return {!jQuery}
+ */
+jQuery.prototype.dequeue = function(queueName) {};
+
+/**
+ * @param {Element} elem
+ * @param {string=} queueName
+ */
+$.dequeue = function(elem, queueName) {};
+
+/**
+ * @param {jQuerySelector=} selector
+ * @return {!jQuery}
+ */
+jQuery.prototype.detach = function(selector) {};
+
+/**
+ * @param {Object} collection
+ * @param {function(number,?)} callback
+ * @return {Object}
+ */
+jQuery.each = function(collection, callback) {};
+
+/**
+ * @param {function(number,Element)} fnc
+ * @return {!jQuery}
+ */
+jQuery.prototype.each = function(fnc) {};
+
+/**
+ * @param {Object} collection
+ * @param {function(number,?)} callback
+ * @return {Object}
+ */
+$.each = function(collection, callback) {};
+
+/** @return {!jQuery} */
+jQuery.prototype.empty = function() {};
+
+/**
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.end = function() {};
+
+/**
+ * @param {number} arg1
+ * @return {!jQuery}
+ */
+jQuery.prototype.eq = function(arg1) {};
+
+/** @param {string} message */
+jQuery.error = function(message) {};
+
+/**
+ * @deprecated Please use .on( "error", handler ) instead.
+ * @param {(function(!jQuery.event=)|Object.<string, *>)} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.error = function(arg1, handler) {};
+
+/** @param {string} message */
+$.error = function(message) {};
+
+/**
+ * @constructor
+ * @param {string} eventType
+ */
+jQuery.event = function(eventType) {};
+
+/**
+ * @constructor
+ * @extends {jQuery.event}
+ * @param {string} eventType
+ * @param {Object=} properties
+ * @return {jQuery.Event}
+ */
+jQuery.Event = function(eventType, properties) {};
+
+/**
+ * @constructor
+ * @extends {jQuery.event}
+ * @param {string} eventType
+ */
+$.event = function(eventType) {};
+
+/**
+ * @constructor
+ * @extends {jQuery.event}
+ * @param {string} eventType
+ * @param {Object=} properties
+ * @return {$.Event}
+ */
+$.Event = function(eventType, properties) {};
+
+/** @type {Element} */
+jQuery.event.prototype.currentTarget;
+
+/** @type {Object.<string, *>} */
+jQuery.event.prototype.data;
+
+/** @type {Element} */
+jQuery.event.prototype.delegateTarget;
+
+/**
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.event.prototype.isDefaultPrevented = function() {};
+
+/**
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.event.prototype.isImmediatePropagationStopped = function() {};
+
+/**
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.event.prototype.isPropagationStopped = function() {};
+
+/** @type {string} */
+jQuery.event.prototype.namespace;
+
+/** @type {Event} */
+jQuery.event.prototype.originalEvent;
+
+/** @type {number} */
+jQuery.event.prototype.pageX;
+
+/** @type {number} */
+jQuery.event.prototype.pageY;
+
+/** @return {undefined} */
+jQuery.event.prototype.preventDefault = function() {};
+
+/** @type {Object.<string, *>} */
+jQuery.event.prototype.props;
+
+/** @type {Element} */
+jQuery.event.prototype.relatedTarget;
+
+/** @type {*} */
+jQuery.event.prototype.result;
+
+/** @return {undefined} */
+jQuery.event.prototype.stopImmediatePropagation = function() {};
+
+/** @return {undefined} */
+jQuery.event.prototype.stopPropagation = function() {};
+
+/** @type {Element} */
+jQuery.event.prototype.target;
+
+/** @type {number} */
+jQuery.event.prototype.timeStamp;
+
+/** @type {string} */
+jQuery.event.prototype.type;
+
+/** @type {number} */
+jQuery.event.prototype.which;
+
+/**
+ * @param {(Object|boolean)} arg1
+ * @param {...*} var_args
+ * @return {Object}
+ */
+jQuery.extend = function(arg1, var_args) {};
+
+/**
+ * @param {(Object|boolean)} arg1
+ * @param {...*} var_args
+ * @return {Object}
+ */
+jQuery.prototype.extend = function(arg1, var_args) {};
+
+/**
+ * @param {(Object|boolean)} arg1
+ * @param {...*} var_args
+ * @return {Object}
+ */
+$.extend = function(arg1, var_args) {};
+
+/**
+ * @param {(string|number|function())=} duration
+ * @param {(function()|string)=} arg2
+ * @param {function()=} callback
+ * @return {!jQuery}
+ */
+jQuery.prototype.fadeIn = function(duration, arg2, callback) {};
+
+/**
+ * @param {(string|number|function())=} duration
+ * @param {(function()|string)=} arg2
+ * @param {function()=} callback
+ * @return {!jQuery}
+ */
+jQuery.prototype.fadeOut = function(duration, arg2, callback) {};
+
+/**
+ * @param {(string|number)} duration
+ * @param {number} opacity
+ * @param {(function()|string)=} arg3
+ * @param {function()=} callback
+ * @return {!jQuery}
+ */
+jQuery.prototype.fadeTo = function(duration, opacity, arg3, callback) {};
+
+/**
+ * @param {(string|number|function())=} duration
+ * @param {(string|function())=} easing
+ * @param {function()=} callback
+ * @return {!jQuery}
+ */
+jQuery.prototype.fadeToggle = function(duration, easing, callback) {};
+
+/**
+ * @param {(jQuerySelector|function(number,Element)|Element|jQuery)} arg1
+ * @return {!jQuery}
+ * @see http://api.jquery.com/filter/
+ */
+jQuery.prototype.filter = function(arg1) {};
+
+/**
+ * @param {(jQuerySelector|jQuery|Element)} arg1
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.find = function(arg1) {};
+
+/** @return {!jQuery} */
+jQuery.prototype.first = function() {};
+
+/** @see http://docs.jquery.com/Plugins/Authoring */
+jQuery.fn = jQuery.prototype;
+
+/** @see http://docs.jquery.com/Plugins/Authoring */
+$.fn = $.prototype;
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.focus = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.focusin = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.focusout = function(arg1, handler) {};
+
+/** @const */
+jQuery.fx = {};
+
+/** @const */
+$.fx = {};
+
+/** @type {number} */
+jQuery.fx.interval;
+
+/** @type {number} */
+$.fx.interval;
+
+/** @type {boolean} */
+jQuery.fx.off;
+
+/** @type {boolean} */
+$.fx.off;
+
+/**
+ * @param {string} url
+ * @param {(Object.<string,*>|string|
+ *     function(string,string,jQuery.jqXHR))=} data
+ * @param {(function(string,string,jQuery.jqXHR)|string)=} success
+ * @param {string=} dataType
+ * @return {jQuery.jqXHR}
+ */
+jQuery.get = function(url, data, success, dataType) {};
+
+/**
+ * @param {number=} index
+ * @return {(Element|Array.<Element>)}
+ * @nosideeffects
+ */
+jQuery.prototype.get = function(index) {};
+
+/**
+ * @param {string} url
+ * @param {(Object.<string,*>|string|
+ *     function(string,string,jQuery.jqXHR))=} data
+ * @param {(function(string,string,jQuery.jqXHR)|string)=} success
+ * @param {string=} dataType
+ * @return {jQuery.jqXHR}
+ */
+$.get = function(url, data, success, dataType) {};
+
+/**
+ * @param {string} url
+ * @param {(Object.<string,*>|
+ *     function(Object.<string,*>,string,jQuery.jqXHR))=} data
+ * @param {function(Object.<string,*>,string,jQuery.jqXHR)=} success
+ * @return {jQuery.jqXHR}
+ * @see http://api.jquery.com/jquery.getjson/#jQuery-getJSON-url-data-success
+ */
+jQuery.getJSON = function(url, data, success) {};
+
+/**
+ * @param {string} url
+ * @param {(Object.<string,*>|
+ *     function(Object.<string,*>,string,jQuery.jqXHR))=} data
+ * @param {function(Object.<string,*>,string,jQuery.jqXHR)=} success
+ * @return {jQuery.jqXHR}
+ * @see http://api.jquery.com/jquery.getjson/#jQuery-getJSON-url-data-success
+ */
+$.getJSON = function(url, data, success) {};
+
+/**
+ * @param {string} url
+ * @param {function(Node,string,jQuery.jqXHR)=} success
+ * @return {jQuery.jqXHR}
+ */
+jQuery.getScript = function(url, success) {};
+
+/**
+ * @param {string} url
+ * @param {function(Node,string,jQuery.jqXHR)=} success
+ * @return {jQuery.jqXHR}
+ */
+$.getScript = function(url, success) {};
+
+/** @param {string} code */
+jQuery.globalEval = function(code) {};
+
+/** @param {string} code */
+$.globalEval = function(code) {};
+
+/**
+ * @param {Array.<*>} arr
+ * @param {function(*,number)} fnc
+ * @param {boolean=} invert
+ * @return {Array.<*>}
+ */
+jQuery.grep = function(arr, fnc, invert) {};
+
+/**
+ * @param {Array.<*>} arr
+ * @param {function(*,number)} fnc
+ * @param {boolean=} invert
+ * @return {Array.<*>}
+ */
+$.grep = function(arr, fnc, invert) {};
+
+/**
+ * @param {(string|Element)} arg1
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.has = function(arg1) {};
+
+/**
+ * @param {string} className
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.prototype.hasClass = function(className) {};
+
+/**
+ * @param {Element} elem
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.hasData = function(elem) {};
+
+/**
+ * @param {Element} elem
+ * @return {boolean}
+ * @nosideeffects
+ */
+$.hasData = function(elem) {};
+
+/**
+ * @param {(string|number|function(number,number))=} arg1
+ * @return {(number|!jQuery)}
+ */
+jQuery.prototype.height = function(arg1) {};
+
+/**
+ * @param {(string|number|function())=} duration
+ * @param {(function()|string)=} arg2
+ * @param {function()=} callback
+ * @return {!jQuery}
+ */
+jQuery.prototype.hide = function(duration, arg2, callback) {};
+
+/** @param {boolean} hold */
+jQuery.holdReady = function(hold) {};
+
+/** @param {boolean} hold */
+$.holdReady = function(hold) {};
+
+/**
+ * @param {function(!jQuery.event=)} arg1
+ * @param {function(!jQuery.event=)=} handlerOut
+ * @return {!jQuery}
+ */
+jQuery.prototype.hover = function(arg1, handlerOut) {};
+
+/**
+ * @param {(string|function(number,string))=} arg1
+ * @return {(string|!jQuery)}
+ */
+jQuery.prototype.html = function(arg1) {};
+
+/**
+ * @param {*} value
+ * @param {Array.<*>} arr
+ * @param {number=} fromIndex
+ * @return {number}
+ * @nosideeffects
+ */
+jQuery.inArray = function(value, arr, fromIndex) {};
+
+/**
+ * @param {*} value
+ * @param {Array.<*>} arr
+ * @param {number=} fromIndex
+ * @return {number}
+ * @nosideeffects
+ */
+$.inArray = function(value, arr, fromIndex) {};
+
+/**
+ * @param {(jQuerySelector|Element|jQuery)=} arg1
+ * @return {number}
+ */
+jQuery.prototype.index = function(arg1) {};
+
+/**
+ * @return {number}
+ * @nosideeffects
+ */
+jQuery.prototype.innerHeight = function() {};
+
+/**
+ * @return {number}
+ * @nosideeffects
+ */
+jQuery.prototype.innerWidth = function() {};
+
+/**
+ * @param {(jQuerySelector|Element|jQuery)} target
+ * @return {!jQuery}
+ */
+jQuery.prototype.insertAfter = function(target) {};
+
+/**
+ * @param {(jQuerySelector|Element|jQuery)} target
+ * @return {!jQuery}
+ */
+jQuery.prototype.insertBefore = function(target) {};
+
+/**
+ * @param {(jQuerySelector|function(number)|jQuery|Element)} arg1
+ * @return {boolean}
+ */
+jQuery.prototype.is = function(arg1) {};
+
+/**
+ * @param {*} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.isArray = function(obj) {};
+
+/**
+ * @param {*} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+$.isArray = function(obj) {};
+
+/**
+ * @param {Object} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.isEmptyObject = function(obj) {};
+
+/**
+ * @param {Object} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+$.isEmptyObject = function(obj) {};
+
+/**
+ * @param {*} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.isFunction = function(obj) {};
+
+/**
+ * @param {*} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+$.isFunction = function(obj) {};
+
+/**
+ * @param {*} value
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.isNumeric = function(value) {};
+
+/**
+ * @param {*} value
+ * @return {boolean}
+ * @nosideeffects
+ */
+$.isNumeric = function(value) {};
+
+/**
+ * @param {*} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.isPlainObject = function(obj) {};
+
+/**
+ * @param {*} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+$.isPlainObject = function(obj) {};
+
+/**
+ * @param {*} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.isWindow = function(obj) {};
+
+/**
+ * @param {*} obj
+ * @return {boolean}
+ * @nosideeffects
+ */
+$.isWindow = function(obj) {};
+
+/**
+ * @param {Element} node
+ * @return {boolean}
+ * @nosideeffects
+ */
+jQuery.isXMLDoc = function(node) {};
+
+/**
+ * @param {Element} node
+ * @return {boolean}
+ * @nosideeffects
+ */
+$.isXMLDoc = function(node) {};
+
+/** @type {string} */
+jQuery.prototype.jquery;
+
+/**
+ * @constructor
+ * @extends {XMLHttpRequest}
+ * @implements {jQuery.Promise}
+ * @private
+ * @see http://api.jquery.com/jQuery.ajax/#jqXHR
+ */
+jQuery.jqXHR = function () {};
+
+/**
+ * @override
+ * @param {jQueryCallback} alwaysCallbacks
+ * @param {jQueryCallback=} alwaysCallbacks2
+ * @return {jQuery.jqXHR}
+ */
+jQuery.jqXHR.prototype.always =
+    function(alwaysCallbacks, alwaysCallbacks2) {};
+
+/**
+ * @deprecated
+ * @param {function()} callback
+ * @return {jQuery.jqXHR}
+*/
+jQuery.jqXHR.prototype.complete = function (callback) {};
+
+/**
+ * @override
+ * @param {jQueryCallback} doneCallbacks
+ * @return {jQuery.jqXHR}
+ */
+jQuery.jqXHR.prototype.done = function(doneCallbacks) {};
+
+/**
+ * @deprecated
+ * @param {function()} callback
+ * @return {jQuery.jqXHR}
+*/
+jQuery.jqXHR.prototype.error = function (callback) {};
+
+/**
+ * @override
+ * @param {jQueryCallback} failCallbacks
+ * @return {jQuery.jqXHR}
+ */
+jQuery.jqXHR.prototype.fail = function(failCallbacks) {};
+
+/**
+ * @deprecated
+ * @override
+ */
+jQuery.jqXHR.prototype.onreadystatechange = function (callback) {};
+
+/**
+ * @override
+ * @param {function()=} doneFilter
+ * @param {function()=} failFilter
+ * @param {function()=} progressFilter
+ * @return {jQuery.jqXHR}
+ */
+jQuery.jqXHR.prototype.pipe =
+    function(doneFilter, failFilter, progressFilter) {};
+
+/**
+ * @deprecated
+ * @param {function()} callback
+ * @return {jQuery.jqXHR}
+*/
+jQuery.jqXHR.prototype.success = function (callback) {};
+
+/**
+ * @override
+ * @param {jQueryCallback} doneCallbacks
+ * @param {jQueryCallback=} failCallbacks
+ * @param {jQueryCallback=} progressCallbacks
+ * @return {jQuery.jqXHR}
+ */
+jQuery.jqXHR.prototype.then =
+    function(doneCallbacks, failCallbacks, progressCallbacks) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.keydown = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.keypress = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.keyup = function(arg1, handler) {};
+
+/** @return {!jQuery} */
+jQuery.prototype.last = function() {};
+
+/** @type {number} */
+jQuery.prototype.length;
+
+/**
+ * @deprecated Please avoid the document loading Event invocation of
+ *     .load() and use .on( "load", handler ) instead. (The AJAX
+ *     module invocation signature is OK.)
+ * @param {(function(!jQuery.event=)|Object.<string, *>|string)} arg1
+ * @param {(function(!jQuery.event=)|Object.<string,*>|string)=} arg2
+ * @param {function(string,string,XMLHttpRequest)=} complete
+ * @return {!jQuery}
+ */
+jQuery.prototype.load = function(arg1, arg2, complete) {};
+
+/**
+ * @param {*} obj
+ * @return {Array.<*>}
+ */
+jQuery.makeArray = function(obj) {};
+
+/**
+ * @param {*} obj
+ * @return {Array.<*>}
+ */
+$.makeArray = function(obj) {};
+
+/**
+ * @param {(Array.<*>|Object.<string, *>)} arg1
+ * @param {(function(*,number)|function(*,(string|number)))} callback
+ * @return {Array.<*>}
+ */
+jQuery.map = function(arg1, callback) {};
+
+/**
+ * @param {function(number,Element)} callback
+ * @return {!jQuery}
+ */
+jQuery.prototype.map = function(callback) {};
+
+/**
+ * @param {(Array.<*>|Object.<string, *>)} arg1
+ * @param {(function(*,number)|function(*,(string|number)))} callback
+ * @return {Array.<*>}
+ */
+$.map = function(arg1, callback) {};
+
+/**
+ * @param {Array.<*>} first
+ * @param {Array.<*>} second
+ * @return {Array.<*>}
+ */
+jQuery.merge = function(first, second) {};
+
+/**
+ * @param {Array.<*>} first
+ * @param {Array.<*>} second
+ * @return {Array.<*>}
+ */
+$.merge = function(first, second) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.mousedown = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.mouseenter = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.mouseleave = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.mousemove = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.mouseout = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.mouseover = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.mouseup = function(arg1, handler) {};
+
+/**
+ * @param {jQuerySelector=} selector
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.next = function(selector) {};
+
+/**
+ * @param {string=} selector
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.nextAll = function(selector) {};
+
+/**
+ * @param {(jQuerySelector|Element)=} arg1
+ * @param {jQuerySelector=} filter
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.nextUntil = function(arg1, filter) {};
+
+/**
+ * @param {boolean=} removeAll
+ * @return {Object}
+ */
+jQuery.noConflict = function(removeAll) {};
+
+/**
+ * @param {boolean=} removeAll
+ * @return {Object}
+ */
+$.noConflict = function(removeAll) {};
+
+/**
+ * @return {function()}
+ * @nosideeffects
+ */
+jQuery.noop = function() {};
+
+/**
+ * @return {function()}
+ * @nosideeffects
+ */
+$.noop = function() {};
+
+/**
+ * @param {(jQuerySelector|Array.<Element>|function(number)|jQuery)} arg1
+ * @return {!jQuery}
+ */
+jQuery.prototype.not = function(arg1) {};
+
+/**
+ * @return {number}
+ * @nosideeffects
+ */
+jQuery.now = function() {};
+
+/**
+ * @return {number}
+ * @nosideeffects
+ */
+$.now = function() {};
+
+/**
+ * @param {(string|Object.<string,*>)=} arg1
+ * @param {(string|function(!jQuery.event=))=} selector
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.off = function(arg1, selector, handler) {};
+
+/**
+ * @param {({left:number,top:number}|
+ *     function(number,{top:number,left:number}))=} arg1
+ * @return {({left:number,top:number}|!jQuery)}
+ */
+jQuery.prototype.offset = function(arg1) {};
+
+/**
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.offsetParent = function() {};
+
+/**
+ * @param {(string|Object.<string,*>)} arg1
+ * @param {*=} selector
+ * @param {*=} data
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.on = function(arg1, selector, data, handler) {};
+
+/**
+ * @param {(string|Object.<string,*>)} arg1
+ * @param {*=} arg2
+ * @param {*=} arg3
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.one = function(arg1, arg2, arg3, handler) {};
+
+/**
+ * @param {boolean=} includeMargin
+ * @return {number}
+ * @nosideeffects
+ */
+jQuery.prototype.outerHeight = function(includeMargin) {};
+
+/**
+ * @param {boolean=} includeMargin
+ * @return {number}
+ * @nosideeffects
+ */
+jQuery.prototype.outerWidth = function(includeMargin) {};
+
+/**
+ * @param {(Object.<string, *>|Array.<Object.<string, *>>)} obj
+ * @param {boolean=} traditional
+ * @return {string}
+ */
+jQuery.param = function(obj, traditional) {};
+
+/**
+ * @param {(Object.<string, *>|Array.<Object.<string, *>>)} obj
+ * @param {boolean=} traditional
+ * @return {string}
+ */
+$.param = function(obj, traditional) {};
+
+/**
+ * @param {jQuerySelector=} selector
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.parent = function(selector) {};
+
+/**
+ * @param {jQuerySelector=} selector
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.parents = function(selector) {};
+
+/**
+ * @param {(jQuerySelector|Element)=} arg1
+ * @param {jQuerySelector=} filter
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.parentsUntil = function(arg1, filter) {};
+
+/**
+ * @param {string} data
+ * @param {(Element|boolean)=} context
+ * @param {boolean=} keepScripts
+ * @return {Array.<Element>}
+ */
+jQuery.parseHTML = function(data, context, keepScripts) {};
+
+/**
+ * @param {string} data
+ * @param {(Element|boolean)=} context
+ * @param {boolean=} keepScripts
+ * @return {Array.<Element>}
+ */
+$.parseHTML = function(data, context, keepScripts) {};
+
+/**
+ * @param {string} json
+ * @return {Object.<string, *>}
+ */
+jQuery.parseJSON = function(json) {};
+
+/**
+ * @param {string} json
+ * @return {Object.<string, *>}
+ */
+$.parseJSON = function(json) {};
+
+/**
+ * @param {string} data
+ * @return {Document}
+ */
+jQuery.parseXML = function(data) {};
+
+/**
+ * @param {string} data
+ * @return {Document}
+ */
+$.parseXML = function(data) {};
+
+/**
+ * @return {{left:number,top:number}}
+ * @nosideeffects
+ */
+jQuery.prototype.position = function() {};
+
+/**
+ * @param {string} url
+ * @param {(Object.<string,*>|string|
+ *     function(string,string,jQuery.jqXHR))=} data
+ * @param {(function(string,string,jQuery.jqXHR)|string)=} success
+ * @param {string=} dataType
+ * @return {jQuery.jqXHR}
+ */
+jQuery.post = function(url, data, success, dataType) {};
+
+/**
+ * @param {string} url
+ * @param {(Object.<string,*>|string|
+ *     function(string,string,jQuery.jqXHR))=} data
+ * @param {(function(string,string,jQuery.jqXHR)|string)=} success
+ * @param {string=} dataType
+ * @return {jQuery.jqXHR}
+ */
+$.post = function(url, data, success, dataType) {};
+
+/**
+ * @param {(string|Element|jQuery|function(number,string))} arg1
+ * @param {(string|Element|jQuery)=} content
+ * @return {!jQuery}
+ */
+jQuery.prototype.prepend = function(arg1, content) {};
+
+/**
+ * @param {(jQuerySelector|Element|jQuery)} target
+ * @return {!jQuery}
+ */
+jQuery.prototype.prependTo = function(target) {};
+
+/**
+ * @param {jQuerySelector=} selector
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.prev = function(selector) {};
+
+/**
+ * @param {jQuerySelector=} selector
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.prevAll = function(selector) {};
+
+/**
+ * @param {(jQuerySelector|Element)=} arg1
+ * @param {jQuerySelector=} filter
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.prevUntil = function(arg1, filter) {};
+
+/**
+ * @param {(string|Object)=} type
+ * @param {Object=} target
+ * @return {jQuery.Promise}
+ */
+jQuery.prototype.promise = function(type, target) {};
+
+/**
+ * @interface
+ * @private
+ * @see http://api.jquery.com/Types/#Promise
+ */
+jQuery.Promise = function () {};
+
+/**
+ * @param {jQueryCallback} alwaysCallbacks
+ * @param {jQueryCallback=} alwaysCallbacks2
+ * @return {jQuery.Promise}
+ */
+jQuery.Promise.prototype.always =
+    function(alwaysCallbacks, alwaysCallbacks2) {};
+
+/**
+ * @param {jQueryCallback} doneCallbacks
+ * @return {jQuery.Promise}
+ */
+jQuery.Promise.prototype.done = function(doneCallbacks) {};
+
+/**
+ * @param {jQueryCallback} failCallbacks
+ * @return {jQuery.Promise}
+ */
+jQuery.Promise.prototype.fail = function(failCallbacks) {};
+
+/**
+ * @param {function()=} doneFilter
+ * @param {function()=} failFilter
+ * @param {function()=} progressFilter
+ * @return {jQuery.Promise}
+ */
+jQuery.Promise.prototype.pipe =
+    function(doneFilter, failFilter, progressFilter) {};
+
+/**
+ * @param {jQueryCallback} doneCallbacks
+ * @param {jQueryCallback=} failCallbacks
+ * @param {jQueryCallback=} progressCallbacks
+ * @return {jQuery.Promise}
+ */
+jQuery.Promise.prototype.then =
+    function(doneCallbacks, failCallbacks, progressCallbacks) {};
+
+/**
+ * @param {(string|Object.<string,*>)} arg1
+ * @param {(string|number|boolean|function(number,String))=} arg2
+ * @return {(string|boolean|!jQuery)}
+ */
+jQuery.prototype.prop = function(arg1, arg2) {};
+
+/**
+ * @param {...*} var_args
+ * @return {function()}
+ */
+jQuery.proxy = function(var_args) {};
+
+/**
+ * @param {...*} var_args
+ * @return {function()}
+ */
+$.proxy = function(var_args) {};
+
+/**
+ * @param {Array.<Element>} elements
+ * @param {string=} name
+ * @param {Array.<*>=} args
+ * @return {!jQuery}
+ */
+jQuery.prototype.pushStack = function(elements, name, args) {};
+
+/**
+ * @param {(string|Array.<function()>|function(function()))=} queueName
+ * @param {(Array.<function()>|function(function()))=} arg2
+ * @return {(Array.<Element>|!jQuery)}
+ */
+jQuery.prototype.queue = function(queueName, arg2) {};
+
+/**
+ * @param {Element} elem
+ * @param {string=} queueName
+ * @param {(Array.<function()>|function())=} arg3
+ * @return {(Array.<Element>|!jQuery)}
+ */
+jQuery.queue = function(elem, queueName, arg3) {};
+
+/**
+ * @param {Element} elem
+ * @param {string=} queueName
+ * @param {(Array.<function()>|function())=} arg3
+ * @return {(Array.<Element>|!jQuery)}
+ */
+$.queue = function(elem, queueName, arg3) {};
+
+/**
+ * @param {function()} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.ready = function(handler) {};
+
+/**
+ * @param {string=} selector
+ * @return {!jQuery}
+ */
+jQuery.prototype.remove = function(selector) {};
+
+/**
+ * @param {string} attributeName
+ * @return {!jQuery}
+ */
+jQuery.prototype.removeAttr = function(attributeName) {};
+
+/**
+ * @param {(string|function(number,string))=} arg1
+ * @return {!jQuery}
+ */
+jQuery.prototype.removeClass = function(arg1) {};
+
+/**
+ * @param {(string|Array.<string>)=} arg1
+ * @return {!jQuery}
+ */
+jQuery.prototype.removeData = function(arg1) {};
+
+/**
+ * @param {Element} elem
+ * @param {string=} name
+ * @return {!jQuery}
+ */
+jQuery.removeData = function(elem, name) {};
+
+/**
+ * @param {Element} elem
+ * @param {string=} name
+ * @return {!jQuery}
+ */
+$.removeData = function(elem, name) {};
+
+/**
+ * @param {string} propertyName
+ * @return {!jQuery}
+ */
+jQuery.prototype.removeProp = function(propertyName) {};
+
+/**
+ * @param {jQuerySelector} target
+ * @return {!jQuery}
+ */
+jQuery.prototype.replaceAll = function(target) {};
+
+/**
+ * @param {(string|Element|jQuery|function())} arg1
+ * @return {!jQuery}
+ */
+jQuery.prototype.replaceWith = function(arg1) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.resize = function(arg1, handler) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.scroll = function(arg1, handler) {};
+
+/**
+ * @param {number=} value
+ * @return {(number|!jQuery)}
+ */
+jQuery.prototype.scrollLeft = function(value) {};
+
+/**
+ * @param {number=} value
+ * @return {(number|!jQuery)}
+ */
+jQuery.prototype.scrollTop = function(value) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.select = function(arg1, handler) {};
+
+/**
+ * @return {string}
+ * @nosideeffects
+ */
+jQuery.prototype.serialize = function() {};
+
+/**
+ * @return {Array.<Object.<string, *>>}
+ * @nosideeffects
+ */
+jQuery.prototype.serializeArray = function() {};
+
+/**
+ * @param {(string|number|function())=} duration
+ * @param {(function()|string)=} arg2
+ * @param {function()=} callback
+ * @return {!jQuery}
+ */
+jQuery.prototype.show = function(duration, arg2, callback) {};
+
+/**
+ * @param {jQuerySelector=} selector
+ * @return {!jQuery}
+ * @nosideeffects
+ */
+jQuery.prototype.siblings = function(selector) {};
+
+/**
+ * @deprecated Please use the .length property instead.
+ * @return {number}
+ * @nosideeffects
+ */
+jQuery.prototype.size = function() {};
+
+/**
+ * @param {number} start
+ * @param {number=} end
+ * @return {!jQuery}
+ */
+jQuery.prototype.slice = function(start, end) {};
+
+/**
+ * @param {(Object.<string,*>|string|number)=} optionsOrDuration
+ * @param {(function()|string)=} completeOrEasing
+ * @param {function()=} complete
+ * @return {!jQuery}
+ */
+jQuery.prototype.slideDown =
+    function(optionsOrDuration, completeOrEasing, complete) {};
+
+/**
+ * @param {(Object.<string,*>|string|number)=} optionsOrDuration
+ * @param {(function()|string)=} completeOrEasing
+ * @param {function()=} complete
+ * @return {!jQuery}
+ */
+jQuery.prototype.slideToggle =
+    function(optionsOrDuration, completeOrEasing, complete) {};
+
+/**
+ * @param {(Object.<string,*>|string|number)=} optionsOrDuration
+ * @param {(function()|string)=} completeOrEasing
+ * @param {function()=} complete
+ * @return {!jQuery}
+ */
+jQuery.prototype.slideUp =
+    function(optionsOrDuration, completeOrEasing, complete) {};
+
+/**
+ * @param {(boolean|string)=} arg1
+ * @param {boolean=} arg2
+ * @param {boolean=} jumpToEnd
+ * @return {!jQuery}
+ */
+jQuery.prototype.stop = function(arg1, arg2, jumpToEnd) {};
+
+/**
+ * @param {(function(!jQuery.event=)|Object.<string, *>)=} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.submit = function(arg1, handler) {};
+
+/** @type {Object.<string, *>} */
+jQuery.support;
+
+/** @type {Object.<string, *>} */
+$.support;
+
+/**
+ * @deprecated Please try to use feature detection instead.
+ * @type {boolean}
+ */
+jQuery.support.boxModel;
+
+/**
+ * @deprecated Please try to use feature detection instead.
+ * @type {boolean}
+ */
+$.support.boxModel;
+
+/** @type {boolean} */
+jQuery.support.changeBubbles;
+
+/** @type {boolean} */
+$.support.changeBubbles;
+
+/** @type {boolean} */
+jQuery.support.cors;
+
+/** @type {boolean} */
+$.support.cors;
+
+/** @type {boolean} */
+jQuery.support.cssFloat;
+
+/** @type {boolean} */
+$.support.cssFloat;
+
+/** @type {boolean} */
+jQuery.support.hrefNormalized;
+
+/** @type {boolean} */
+$.support.hrefNormalized;
+
+/** @type {boolean} */
+jQuery.support.htmlSerialize;
+
+/** @type {boolean} */
+$.support.htmlSerialize;
+
+/** @type {boolean} */
+jQuery.support.leadingWhitespace;
+
+/** @type {boolean} */
+$.support.leadingWhitespace;
+
+/** @type {boolean} */
+jQuery.support.noCloneEvent;
+
+/** @type {boolean} */
+$.support.noCloneEvent;
+
+/** @type {boolean} */
+jQuery.support.opacity;
+
+/** @type {boolean} */
+$.support.opacity;
+
+/** @type {boolean} */
+jQuery.support.style;
+
+/** @type {boolean} */
+$.support.style;
+
+/** @type {boolean} */
+jQuery.support.submitBubbles;
+
+/** @type {boolean} */
+$.support.submitBubbles;
+
+/** @type {boolean} */
+jQuery.support.tbody;
+
+/** @type {boolean} */
+$.support.tbody;
+
+/**
+ * @param {(string|function(number,string))=} arg1
+ * @return {(string|!jQuery)}
+ */
+jQuery.prototype.text = function(arg1) {};
+
+/**
+ * @return {Array.<Element>}
+ * @nosideeffects
+ */
+jQuery.prototype.toArray = function() {};
+
+/**
+ * Refers to the method from the Effects category. There used to be a toggle
+ * method on the Events category which was removed starting version 1.9.
+ * @param {(number|string|Object.<string,*>|boolean)=} arg1
+ * @param {(function()|string)=} arg2
+ * @param {function()=} arg3
+ * @return {!jQuery}
+ */
+jQuery.prototype.toggle = function(arg1, arg2, arg3) {};
+
+/**
+ * @param {(string|boolean|function(number,string,boolean))=} arg1
+ * @param {boolean=} flag
+ * @return {!jQuery}
+ */
+jQuery.prototype.toggleClass = function(arg1, flag) {};
+
+/**
+ * @param {(string|jQuery.event)} arg1
+ * @param {...*} var_args
+ * @return {!jQuery}
+ */
+jQuery.prototype.trigger = function(arg1, var_args) {};
+
+/**
+ * @param {string|jQuery.event} eventType
+ * @param {Array.<*>=} extraParameters
+ * @return {*}
+ */
+jQuery.prototype.triggerHandler = function(eventType, extraParameters) {};
+
+/**
+ * @param {string} str
+ * @return {string}
+ * @nosideeffects
+ */
+jQuery.trim = function(str) {};
+
+/**
+ * @param {string} str
+ * @return {string}
+ * @nosideeffects
+ */
+$.trim = function(str) {};
+
+/**
+ * @param {*} obj
+ * @return {string}
+ * @nosideeffects
+ */
+jQuery.type = function(obj) {};
+
+/**
+ * @param {*} obj
+ * @return {string}
+ * @nosideeffects
+ */
+$.type = function(obj) {};
+
+/**
+ * @param {(string|function(!jQuery.event=)|jQuery.event)=} arg1
+ * @param {(function(!jQuery.event=)|boolean)=} arg2
+ * @return {!jQuery}
+ */
+jQuery.prototype.unbind = function(arg1, arg2) {};
+
+/**
+ * @param {string=} arg1
+ * @param {(string|Object.<string,*>)=} arg2
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.undelegate = function(arg1, arg2, handler) {};
+
+/**
+ * @param {Array.<Element>} arr
+ * @return {Array.<Element>}
+ */
+jQuery.unique = function(arr) {};
+
+/**
+ * @param {Array.<Element>} arr
+ * @return {Array.<Element>}
+ */
+$.unique = function(arr) {};
+
+/**
+ * @deprecated Please use .on( "unload", handler ) instead.
+ * @param {(function(!jQuery.event=)|Object.<string, *>)} arg1
+ * @param {function(!jQuery.event=)=} handler
+ * @return {!jQuery}
+ */
+jQuery.prototype.unload = function(arg1, handler) {};
+
+/** @return {!jQuery} */
+jQuery.prototype.unwrap = function() {};
+
+/**
+ * @param {(string|Array.<string>|function(number,*))=} arg1
+ * @return {(string|number|Array.<string>|!jQuery)}
+ */
+jQuery.prototype.val = function(arg1) {};
+
+/**
+ * Note: The official documentation (https://api.jquery.com/jQuery.when/) says
+ * jQuery.when accepts deferreds, but it actually accepts any type, e.g.:
+ *
+ * jQuery.when(jQuery.ready, jQuery.ajax(''), jQuery('#my-element'), 1)
+ *
+ * If an argument is not an "observable" (a promise-like object) it is wrapped
+ * into a promise.
+ * @param {*} deferred
+ * @param {...*} deferreds
+ * @return {jQuery.Promise}
+ */
+jQuery.when = function(deferred, deferreds) {};
+
+/**
+ * Note: See jQuery.when().
+ * @param {*} deferred
+ * @param {...*} deferreds
+ * @return {jQuery.Promise}
+ */
+$.when = function(deferred, deferreds) {};
+
+/**
+ * @param {(string|number|function(number,number))=} arg1
+ * @return {(number|!jQuery)}
+ */
+jQuery.prototype.width = function(arg1) {};
+
+/**
+ * @param {(string|jQuerySelector|Element|jQuery|function(number))} arg1
+ * @return {!jQuery}
+ */
+jQuery.prototype.wrap = function(arg1) {};
+
+/**
+ * @param {(string|jQuerySelector|Element|jQuery)} wrappingElement
+ * @return {!jQuery}
+ */
+jQuery.prototype.wrapAll = function(wrappingElement) {};
+
+/**
+ * @param {(string|jQuerySelector|Element|jQuery|function(number))} arg1
+ * @return {!jQuery}
+ */
+jQuery.prototype.wrapInner = function(arg1) {};
+
diff --git a/externs/oli.js b/externs/oli.js
new file mode 100644
index 0000000..903fd6e
--- /dev/null
+++ b/externs/oli.js
@@ -0,0 +1,217 @@
+/**
+ * @externs
+ */
+
+
+/**
+ * @type {Object}
+ */
+var oli;
+
+
+
+/**
+ * @interface
+ */
+oli.CollectionEvent = function() {};
+
+
+/**
+ * @type {*}
+ */
+oli.CollectionEvent.prototype.element;
+
+
+
+/**
+ * @interface
+ */
+oli.DragBoxEvent = function() {};
+
+
+/**
+ * @type {ol.Coordinate}
+ */
+oli.DragBoxEvent.prototype.coordinate;
+
+
+
+/**
+ * @interface
+ */
+oli.DrawEvent = function() {};
+
+
+/**
+ * @type {ol.Feature}
+ */
+oli.DrawEvent.prototype.feature;
+
+
+
+/**
+ * @interface
+ */
+oli.ObjectEvent = function() {};
+
+
+/**
+ * @type {string}
+ */
+oli.ObjectEvent.prototype.key;
+
+
+/**
+ * @type {*}
+ */
+oli.ObjectEvent.prototype.oldValue;
+
+
+
+/**
+ * @interface
+ */
+oli.MapBrowserEvent = function() {};
+
+
+/**
+ * @type {ol.Coordinate}
+ */
+oli.MapBrowserEvent.prototype.coordinate;
+
+
+/**
+ * @type {Event}
+ */
+oli.MapBrowserEvent.prototype.originalEvent;
+
+
+/**
+ * @type {ol.Pixel}
+ */
+oli.MapBrowserEvent.prototype.pixel;
+
+
+
+/**
+ * @interface
+ */
+oli.MapEvent = function() {};
+
+
+/**
+ * @type {ol.Map}
+ */
+oli.MapEvent.prototype.map;
+
+
+/**
+ * @type {olx.FrameState}
+ */
+oli.MapEvent.prototype.frameState;
+
+
+/**
+ * @type {Object}
+ */
+oli.control;
+
+
+/**
+ * @interface
+ */
+oli.control.Control = function() {};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @return {undefined} Undefined.
+ */
+oli.control.Control.prototype.setMap = function(map) {};
+
+
+
+/**
+ * @type {Object}
+ */
+oli.interaction;
+
+
+/**
+ * @interface
+ */
+oli.interaction.DragAndDropEvent = function() {};
+
+
+/**
+ * @type {Array.<ol.Feature>|undefined}
+ */
+oli.interaction.DragAndDropEvent.prototype.features;
+
+
+/**
+ * @type {ol.proj.Projection|undefined}
+ */
+oli.interaction.DragAndDropEvent.prototype.projection;
+
+
+/**
+ * @type {File}
+ */
+oli.interaction.DragAndDropEvent.prototype.file;
+
+
+/**
+ * @type {Object}
+ */
+oli.render;
+
+
+
+/**
+ * @interface
+ */
+oli.render.Event = function() {};
+
+
+/**
+ * @type {CanvasRenderingContext2D|null|undefined}
+ */
+oli.render.Event.prototype.context;
+
+
+/**
+ * @type {olx.FrameState|undefined}
+ */
+oli.render.Event.prototype.frameState;
+
+
+/**
+ * @type {ol.webgl.Context|null|undefined}
+ */
+oli.render.Event.prototype.glContext;
+
+
+/**
+ * @type {ol.render.IVectorContext|undefined}
+ */
+oli.render.Event.prototype.vectorContext;
+
+
+/**
+ * @type {Object}
+ */
+oli.source;
+
+
+
+/**
+ * @interface
+ */
+oli.source.VectorEvent = function() {};
+
+
+/**
+ * @type {ol.Feature}
+ */
+oli.source.VectorEvent.prototype.feature;
diff --git a/externs/olx.js b/externs/olx.js
new file mode 100644
index 0000000..c1c2a45
--- /dev/null
+++ b/externs/olx.js
@@ -0,0 +1,6557 @@
+/**
+ * @type {Object}
+ */
+var olx;
+
+
+/* typedefs for object literals provided by applications */
+
+
+/**
+ * @typedef {{html: string,
+ *     tileRanges: (Object.<string, Array.<ol.TileRange>>|undefined)}}
+ * @api
+ */
+olx.AttributionOptions;
+
+
+/**
+ * HTML markup for this attribution.
+ * @type {string}
+ * @api stable
+ */
+olx.AttributionOptions.prototype.html;
+
+
+/**
+ * @typedef {{loadTilesWhileAnimating: (boolean|undefined),
+ *     loadTilesWhileInteracting: (boolean|undefined)}}
+ * @api
+ */
+olx.DeviceOptions;
+
+
+/**
+ * When set to false, no tiles will be loaded while animating, which improves
+ * responsiveness on devices with slow memory. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.DeviceOptions.prototype.loadTilesWhileAnimating;
+
+
+/**
+ * When set to false, no tiles will be loaded while interacting, which improves
+ * responsiveness on devices with slow memory. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.DeviceOptions.prototype.loadTilesWhileInteracting;
+
+
+/**
+ * @typedef {{tracking: (boolean|undefined)}}
+ * @api
+ */
+olx.DeviceOrientationOptions;
+
+
+/**
+ * Start tracking. Default is `false`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.DeviceOrientationOptions.prototype.tracking;
+
+
+/**
+ * @typedef {{tracking: (boolean|undefined),
+ *     trackingOptions: (GeolocationPositionOptions|undefined),
+ *     projection: ol.proj.ProjectionLike}}
+ * @api
+ */
+olx.GeolocationOptions;
+
+
+/**
+ * Start Tracking. Default is `false`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.GeolocationOptions.prototype.tracking;
+
+
+/**
+ * Tracking options. See
+ * {@link http://www.w3.org/TR/geolocation-API/#position_options_interface}.
+ * @type {GeolocationPositionOptions|undefined}
+ * @api stable
+ */
+olx.GeolocationOptions.prototype.trackingOptions;
+
+
+/**
+ * The projection the position is reported in.
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.GeolocationOptions.prototype.projection;
+
+
+/**
+ * Object literal with config options for the map logo.
+ * @typedef {{href: (string), src: (string)}}
+ * @api
+ */
+olx.LogoOptions;
+
+
+/**
+ * Link url for the logo. Will be followed when the logo is clicked.
+ * @type {string}
+ * @api
+ */
+olx.LogoOptions.prototype.href;
+
+
+/**
+ * Image src for the logo
+ * @type {string}
+ * @api
+ */
+olx.LogoOptions.prototype.src;
+
+
+/**
+ * @typedef {{map: (ol.Map|undefined),
+ *     maxLines: (number|undefined),
+ *     strokeStyle: (ol.style.Stroke|undefined),
+ *     targetSize: (number|undefined)}}
+ * @api
+ */
+olx.GraticuleOptions;
+
+
+/**
+ * Reference to an `ol.Map` object.
+ * @type {ol.Map|undefined}
+ * @api
+ */
+olx.GraticuleOptions.prototype.map;
+
+
+/**
+ * The maximum number of meridians and parallels from the center of the
+ * map. The default value is 100, which means that at most 200 meridians
+ * and 200 parallels will be displayed. The default value is appropriate
+ * for conformal projections like Spherical Mercator. If you increase
+ * the value more lines will be drawn and the drawing performance will
+ * decrease.
+ * @type {number|undefined}
+ * @api
+ */
+olx.GraticuleOptions.prototype.maxLines;
+
+
+/**
+ * The stroke style to use for drawing the graticule. If not provided, the
+ * lines will be drawn with `rgba(0,0,0,0.2)`, a not fully opaque black.
+ *
+ * @type {ol.style.Stroke|undefined}
+ * @api
+ */
+olx.GraticuleOptions.prototype.strokeStyle;
+
+
+/**
+ * The target size of the graticule cells, in pixels. Default
+ * value is 100 pixels.
+ * @type {number|undefined}
+ * @api
+ */
+olx.GraticuleOptions.prototype.targetSize;
+
+
+/**
+ * Object literal with config options for interactions.
+ * @typedef {{handleEvent: function(ol.MapBrowserEvent):boolean}}
+ * @api
+ */
+olx.interaction.InteractionOptions;
+
+
+/**
+ * Method called by the map to notify the interaction that a browser event was
+ * dispatched to the map. The function may return `false` to prevent the
+ * propagation of the event to other interactions in the map's interactions
+ * chain. Required.
+ * @type {function(ol.MapBrowserEvent):boolean}
+ * @api
+ */
+olx.interaction.InteractionOptions.prototype.handleEvent;
+
+
+/**
+ * Object literal with config options for the map.
+ * @typedef {{controls: (ol.Collection.<ol.control.Control>|Array.<ol.control.Control>|undefined),
+ *     deviceOptions: (olx.DeviceOptions|undefined),
+ *     pixelRatio: (number|undefined),
+ *     interactions: (ol.Collection.<ol.interaction.Interaction>|Array.<ol.interaction.Interaction>|undefined),
+ *     keyboardEventTarget: (Element|Document|string|undefined),
+ *     layers: (Array.<ol.layer.Base>|ol.Collection.<ol.layer.Base>|undefined),
+ *     logo: (boolean|string|olx.LogoOptions|undefined),
+ *     overlays: (ol.Collection.<ol.Overlay>|Array.<ol.Overlay>|undefined),
+ *     renderer: (ol.RendererType|Array.<ol.RendererType|string>|string|undefined),
+ *     target: (Element|string|undefined),
+ *     view: (ol.View|undefined)}}
+ * @api
+ */
+olx.MapOptions;
+
+
+/**
+ * Controls initially added to the map. If not specified,
+ * {@link ol.control.defaults ol.control.defaults()} is used.
+ * @type {ol.Collection.<ol.control.Control>|Array.<ol.control.Control>|undefined}
+ * @api stable
+ */
+olx.MapOptions.prototype.controls;
+
+
+/**
+ * Device options for the map.
+ * @type {olx.DeviceOptions|undefined}
+ * @api
+ */
+olx.MapOptions.prototype.deviceOptions;
+
+
+/**
+ * The ratio between physical pixels and device-independent pixels (dips) on the
+ * device. If `undefined` then it gets set by using `window.devicePixelRatio`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.MapOptions.prototype.pixelRatio;
+
+
+/**
+ * Interactions that are initially added to the map. If not specified,
+ * {@link ol.interaction.defaults ol.interaction.defaults()} is used.
+ * @type {ol.Collection.<ol.interaction.Interaction>|Array.<ol.interaction.Interaction>|undefined}
+ * @api stable
+ */
+olx.MapOptions.prototype.interactions;
+
+
+/**
+ * The element to listen to keyboard events on. This determines when the
+ * `KeyboardPan` and `KeyboardZoom` interactions trigger. For example, if this
+ * option is set to `document` the keyboard interactions will always trigger. If
+ * this option is not specified, the element the library listens to keyboard
+ * events on is the map target (i.e. the user-provided div for the map). If this
+ * is not `document` the target element needs to be focused for key events to be
+ * emitted, requiring that the target element has a `tabindex` attribute.
+ * @type {Element|Document|string|undefined}
+ * @api
+ */
+olx.MapOptions.prototype.keyboardEventTarget;
+
+
+/**
+ * Layers. If this is not defined, a map with no layers will be rendered.
+ * @type {Array.<ol.layer.Base>|ol.Collection.<ol.layer.Base>|undefined}
+ * @api stable
+ */
+olx.MapOptions.prototype.layers;
+
+
+/**
+ * The map logo. A logo to be displayed on the map at all times. If a string is
+ * provided, it will be set as the image source of the logo. If an object is
+ * provided, the `src` property should be the URL for an image and the `href`
+ * property should be a URL for creating a link. To disable the map logo, set
+ * the option to `false`. By default, the OpenLayers 3 logo is shown.
+ * @type {boolean|string|olx.LogoOptions|undefined}
+ * @api stable
+ */
+olx.MapOptions.prototype.logo;
+
+
+/**
+ * Overlays initially added to the map. By default, no overlays are added.
+ * @type {ol.Collection.<ol.Overlay>|Array.<ol.Overlay>|undefined}
+ * @api stable
+ */
+olx.MapOptions.prototype.overlays;
+
+
+/**
+ * Renderer. By default, Canvas, DOM and WebGL renderers are tested for support
+ * in that order, and the first supported used. Specify a
+ * {@link ol.RendererType} here to use a specific renderer.
+ * Note that at present only the Canvas renderer supports vector data.
+ * @type {ol.RendererType|Array.<ol.RendererType|string>|string|undefined}
+ * @api stable
+ */
+olx.MapOptions.prototype.renderer;
+
+
+/**
+ * The container for the map, either the element itself or the `id` of the
+ * element. If not specified at construction time, {@link ol.Map#setTarget}
+ * must be called for the map to be rendered.
+ * @type {Element|string|undefined}
+ * @api stable
+ */
+olx.MapOptions.prototype.target;
+
+
+/**
+ * The map's view.  No layer sources will be fetched unless this is specified at
+ * construction time or through {@link ol.Map#setView}.
+ * @type {ol.View|undefined}
+ * @api stable
+ */
+olx.MapOptions.prototype.view;
+
+
+/**
+ * Object literal with config options for the overlay.
+ * @typedef {{element: (Element|undefined),
+ *     offset: (Array.<number>|undefined),
+ *     position: (ol.Coordinate|undefined),
+ *     positioning: (ol.OverlayPositioning|string|undefined),
+ *     stopEvent: (boolean|undefined),
+ *     insertFirst: (boolean|undefined)}}
+ * @api stable
+ */
+olx.OverlayOptions;
+
+
+/**
+ * The overlay element.
+ * @type {Element|undefined}
+ * @api stable
+ */
+olx.OverlayOptions.prototype.element;
+
+
+/**
+ * Offsets in pixels used when positioning the overlay. The fist element in the
+ * array is the horizontal offset. A positive value shifts the overlay right.
+ * The second element in the array is the vertical offset. A positive value
+ * shifts the overlay down. Default is `[0, 0]`.
+ * @type {Array.<number>|undefined}
+ * @api stable
+ */
+olx.OverlayOptions.prototype.offset;
+
+
+/**
+ * The overlay position in map projection.
+ * @type {ol.Coordinate|undefined}
+ * @api stable
+ */
+olx.OverlayOptions.prototype.position;
+
+
+/**
+ * Defines how the overlay is actually positioned with respect to its `position`
+ * property. Possible values are `'bottom-left'`, `'bottom-center'`,
+ * `'bottom-right'`, `'center-left'`, `'center-center'`, `'center-right'`,
+ * `'top-left'`, `'top-center'`, and `'top-right'`. Default is `'top-left'`.
+ * @type {ol.OverlayPositioning|string|undefined}
+ * @api stable
+ */
+olx.OverlayOptions.prototype.positioning;
+
+
+/**
+ * Whether event propagation to the map viewport should be stopped. Default is
+ * `true`. If `true` the overlay is placed in the same container as that of the
+ * controls (CSS class name `ol-overlaycontainer-stopevent`); if `false` it is
+ * placed in the container with CSS class name `ol-overlaycontainer`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.OverlayOptions.prototype.stopEvent;
+
+
+/**
+ * Whether the overlay is inserted first in the overlay container, or appended.
+ * Default is `true`. If the overlay is placed in the same container as that of
+ * the controls (see the `stopEvent` option) you will probably set `insertFirst`
+ * to `true` so the overlay is displayed below the controls.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.OverlayOptions.prototype.insertFirst;
+
+
+/**
+ * Object literal with config options for the projection.
+ * @typedef {{code: string,
+ *     units: (ol.proj.Units|string),
+ *     extent: (ol.Extent|undefined),
+ *     axisOrientation: (string|undefined),
+ *     global: (boolean|undefined),
+ *     worldExtent: (ol.Extent|undefined)}}
+ * @api
+ */
+olx.ProjectionOptions;
+
+
+/**
+ * The SRS identifier code, e.g. `EPSG:4326`.
+ * @type {string}
+ * @api stable
+ */
+olx.ProjectionOptions.prototype.code;
+
+
+/**
+ * Units.
+ * @type {ol.proj.Units|string}
+ * @api stable
+ */
+olx.ProjectionOptions.prototype.units;
+
+
+/**
+ * The validity extent for the SRS.
+ * @type {ol.Extent|undefined}
+ * @api stable
+ */
+olx.ProjectionOptions.prototype.extent;
+
+
+/**
+ * The axis orientation as specified in Proj4. The default is `enu`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.ProjectionOptions.prototype.axisOrientation;
+
+
+/**
+ * Whether the projection is valid for the whole globe. Default is `false`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.ProjectionOptions.prototype.global;
+
+
+/**
+ * The world extent for the SRS.
+ * @type {ol.Extent|undefined}
+ * @api
+ */
+olx.ProjectionOptions.prototype.worldExtent;
+
+
+/**
+ * Object literal with config options for the view.
+ * @typedef {{center: (ol.Coordinate|undefined),
+ *     constrainRotation: (boolean|number|undefined),
+ *     enableRotation: (boolean|undefined),
+ *     extent: (ol.Extent|undefined),
+ *     minResolution: (number|undefined),
+ *     maxResolution: (number|undefined),
+ *     minZoom: (number|undefined),
+ *     maxZoom: (number|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     resolution: (number|undefined),
+ *     resolutions: (Array.<number>|undefined),
+ *     rotation: (number|undefined),
+ *     zoom: (number|undefined),
+ *     zoomFactor: (number|undefined)}}
+ * @api
+ */
+olx.ViewOptions;
+
+
+/**
+ * The initial center for the view. The coordinate system for the center is
+ * specified with the `projection` option. Default is `undefined`, and layer
+ * sources will not be fetched if this is not set.
+ * @type {ol.Coordinate|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.center;
+
+
+/**
+ * Rotation constraint. `false` means no constraint. `true` means no constraint,
+ * but snap to zero near zero. A number constrains the rotation to that number
+ * of values. For example, `4` will constrain the rotation to 0, 90, 180, and
+ * 270 degrees. The default is `true`.
+ * @type {boolean|number|undefined}
+ * @api
+ */
+olx.ViewOptions.prototype.constrainRotation;
+
+
+/**
+ * Enable rotation. Default is `true`. If `false` a rotation constraint that
+ * always sets the rotation to zero is used. The `constrainRotation` option
+ * has no effect if `enableRotation` is `false`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.ViewOptions.prototype.enableRotation;
+
+
+/**
+ * The extent that constrains the center, in other words, center cannot be set
+ * outside this extent. Default is `undefined`.
+ * @type {ol.Extent|undefined}
+ * @api
+ */
+olx.ViewOptions.prototype.extent;
+
+
+/**
+ * The maximum resolution used to determine the resolution constraint. It is
+ * used together with `minResolution` (or `maxZoom`) and `zoomFactor`. If
+ * unspecified it is calculated in such a way that the projection's validity
+ * extent fits in a 256x256 px tile. If the projection is Spherical Mercator
+ * (the default) then `maxResolution` defaults to `40075016.68557849 / 256 =
+ * 156543.03392804097`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.maxResolution;
+
+
+/**
+ * The minimum resolution used to determine the resolution constraint.  It is
+ * used together with `maxResolution` (or `minZoom`) and `zoomFactor`.  If
+ * unspecified it is calculated assuming 29 zoom levels (with a factor of 2).
+ * If the projection is Spherical Mercator (the default) then `minResolution`
+ * defaults to `40075016.68557849 / 256 / Math.pow(2, 28) =
+ * 0.0005831682455839253`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.minResolution;
+
+
+/**
+ * The maximum zoom level used to determine the resolution constraint. It is
+ * used together with `minZoom` (or `maxResolution`) and `zoomFactor`. Default
+ * is `28`.  Note that if `minResolution` is also provided, it is given
+ * precedence over `maxZoom`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.maxZoom;
+
+
+/**
+ * The minimum zoom level used to determine the resolution constraint. It is
+ * used together with `maxZoom` (or `minResolution`) and `zoomFactor`. Default
+ * is `0`. Note that if `maxResolution` is also provided, it is given
+ * precedence over `minZoom`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.minZoom;
+
+
+/**
+ * The projection. Default is `EPSG:3857` (Spherical Mercator).
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.ViewOptions.prototype.projection;
+
+
+/**
+ * The initial resolution for the view. The units are `projection` units per
+ * pixel (e.g. meters per pixel). An alternative to setting this is to set
+ * `zoom`. Default is `undefined`, and layer sources will not be fetched if
+ * neither this nor `zoom` are defined.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.resolution;
+
+
+/**
+ * Resolutions to determine the resolution constraint. If set the
+ * `maxResolution`, `minResolution`, `minZoom`, `maxZoom`, and `zoomFactor`
+ * options are ignored.
+ * @type {Array.<number>|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.resolutions;
+
+
+/**
+ * The initial rotation for the view in radians (positive rotation clockwise).
+ * Default is `0`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.rotation;
+
+
+/**
+ * Only used if `resolution` is not defined. Zoom level used to calculate the
+ * initial resolution for the view. The initial resolution is determined using
+ * the `ol.View#constrainResolution` method.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.zoom;
+
+
+/**
+ * The zoom factor used to determine the resolution constraint.  Default is `2`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.ViewOptions.prototype.zoomFactor;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.animation;
+
+
+/**
+ * @typedef {{resolution: number,
+ *     start: (number|undefined),
+ *     duration: (number|undefined),
+ *     easing: (function(number):number|undefined)}}
+ * @api
+ */
+olx.animation.BounceOptions;
+
+
+/**
+ * The resolution to start the bounce from, typically
+ * `map.getView().getResolution()`.
+ * @type {number}
+ * @api
+ */
+olx.animation.BounceOptions.prototype.resolution;
+
+
+/**
+ * The start time of the animation. Default is immediately.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.BounceOptions.prototype.start;
+
+
+/**
+ * The duration of the animation in milliseconds. Default is `1000`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.BounceOptions.prototype.duration;
+
+
+/**
+ * The easing function to use. Can be an {@link ol.easing} or a custom function.
+ * Default is {@link ol.easing.upAndDown}.
+ * @type {function(number):number|undefined}
+ * @api
+ */
+olx.animation.BounceOptions.prototype.easing;
+
+
+/**
+ * @typedef {{source: ol.Coordinate,
+ *     start: (number|undefined),
+ *     duration: (number|undefined),
+ *     easing: (function(number):number|undefined)}}
+ * @api
+ */
+olx.animation.PanOptions;
+
+
+/**
+ * The location to start panning from, typically `map.getView().getCenter()`.
+ * @type {ol.Coordinate}
+ * @api
+ */
+olx.animation.PanOptions.prototype.source;
+
+
+/**
+ * The start time of the animation. Default is immediately.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.PanOptions.prototype.start;
+
+
+/**
+ * The duration of the animation in milliseconds. Default is `1000`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.PanOptions.prototype.duration;
+
+
+/**
+ * The easing function to use. Can be an {@link ol.easing} or a custom function.
+ * Default is {@link ol.easing.inAndOut}.
+ * @type {function(number):number|undefined}
+ * @api
+ */
+olx.animation.PanOptions.prototype.easing;
+
+
+/**
+ * @typedef {{rotation: (number|undefined),
+ *     anchor: (ol.Coordinate|undefined),
+ *     start: (number|undefined),
+ *     duration: (number|undefined),
+ *     easing: (function(number):number|undefined)}}
+ * @api
+ */
+olx.animation.RotateOptions;
+
+
+/**
+ * The rotation value (in radians) to begin rotating from, typically
+ * `map.getView().getRotation()`. If `undefined` then `0` is assumed.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.RotateOptions.prototype.rotation;
+
+
+/**
+ * The rotation center/anchor. The map rotates around the center of the view
+ * if unspecified.
+ * @type {ol.Coordinate|undefined}
+ * @api
+ */
+olx.animation.RotateOptions.prototype.anchor;
+
+
+/**
+ * The start time of the animation. Default is immediately.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.RotateOptions.prototype.start;
+
+
+/**
+ * The duration of the animation in milliseconds. Default is `1000`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.RotateOptions.prototype.duration;
+
+
+/**
+ * The easing function to use. Can be an {@link ol.easing} or a custom function.
+ * Default is {@link ol.easing.inAndOut}.
+ * @type {function(number):number|undefined}
+ * @api
+ */
+olx.animation.RotateOptions.prototype.easing;
+
+
+/**
+ * @typedef {{resolution: number,
+ *     start: (number|undefined),
+ *     duration: (number|undefined),
+ *     easing: (function(number):number|undefined)}}
+ * @api
+ */
+olx.animation.ZoomOptions;
+
+
+/**
+ * number The resolution to begin zooming from, typically
+ * `map.getView().getResolution()`.
+ * @type {number}
+ * @api
+ */
+olx.animation.ZoomOptions.prototype.resolution;
+
+
+/**
+ * The start time of the animation. Default is immediately.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.ZoomOptions.prototype.start;
+
+
+/**
+ * The duration of the animation in milliseconds. Default is `1000`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.animation.ZoomOptions.prototype.duration;
+
+
+/**
+ * The easing function to use. Can be an {@link ol.easing} or a custom function.
+ * Default is {@link ol.easing.inAndOut}.
+ * @type {function(number):number|undefined}
+ * @api
+ */
+olx.animation.ZoomOptions.prototype.easing;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.control;
+
+
+/**
+ * @typedef {{className: (string|undefined),
+ *     collapsible: (boolean|undefined),
+ *     collapsed: (boolean|undefined),
+ *     tipLabel: (string|undefined),
+ *     label: (string|undefined),
+ *     collapseLabel: (string|undefined),
+ *     render: (function(ol.MapEvent)|undefined),
+ *     target: (Element|undefined)}}
+ * @api
+ */
+olx.control.AttributionOptions;
+
+
+/**
+ * CSS class name. Default is `ol-attribution`.
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.AttributionOptions.prototype.className;
+
+
+/**
+ * Target.
+ * @type {Element|undefined}
+ * @api
+ */
+olx.control.AttributionOptions.prototype.target;
+
+
+/**
+ * Specify if attributions can be collapsed. If you use an OSM source,
+ * should be set to `false` — see
+ * {@link http://www.openstreetmap.org/copyright OSM Copyright} —
+ * Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.control.AttributionOptions.prototype.collapsible;
+
+
+/**
+ * Specify if attributions should be collapsed at startup. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.control.AttributionOptions.prototype.collapsed;
+
+
+/**
+ * Text label to use for the button tip. Default is `Attributions`
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.AttributionOptions.prototype.tipLabel;
+
+
+/**
+ * Text label to use for the collapsed attributions button. Default is `i`
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.AttributionOptions.prototype.label;
+
+/**
+ * Text label to use for the expanded attributions button. Default is `»`
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.AttributionOptions.prototype.collapseLabel;
+
+
+/**
+ * Function called when the control should be re-rendered. This is called
+ * in a requestAnimationFrame callback.
+ * @type {function(ol.MapEvent)|undefined}
+ * @api
+ */
+olx.control.AttributionOptions.prototype.render;
+
+
+/**
+ * @typedef {{element: (Element|undefined),
+ *     render: (function(ol.MapEvent)|undefined),
+ *     target: (Element|string|undefined)}}
+ * @api stable
+ */
+olx.control.ControlOptions;
+
+
+/**
+ * The element is the control's container element. This only needs to be
+ * specified if you're developing a custom control.
+ * @type {Element|undefined}
+ * @api stable
+ */
+olx.control.ControlOptions.prototype.element;
+
+
+/**
+ * Function called when the control should be re-rendered. This is called
+ * in a requestAnimationFrame callback.
+ * @type {function(ol.MapEvent)|undefined}
+ * @api
+ */
+olx.control.ControlOptions.prototype.render;
+
+
+/**
+ * Specify a target if you want the control to be rendered outside of the map's
+ * viewport.
+ * @type {Element|string|undefined}
+ * @api stable
+ */
+olx.control.ControlOptions.prototype.target;
+
+
+/**
+ * @typedef {{attribution: (boolean|undefined),
+ *     attributionOptions: (olx.control.AttributionOptions|undefined),
+ *     rotate: (boolean|undefined),
+ *     rotateOptions: (olx.control.RotateOptions|undefined),
+ *     zoom: (boolean|undefined),
+ *     zoomOptions: (olx.control.ZoomOptions|undefined)}}
+ * @api
+ */
+olx.control.DefaultsOptions;
+
+
+/**
+ * Attribution. Default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.control.DefaultsOptions.prototype.attribution;
+
+
+/**
+ * Attribution options.
+ * @type {olx.control.AttributionOptions|undefined}
+ * @api
+ */
+olx.control.DefaultsOptions.prototype.attributionOptions;
+
+
+/**
+ * Rotate. Default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.control.DefaultsOptions.prototype.rotate;
+
+
+/**
+ * Rotate options.
+ * @type {olx.control.RotateOptions|undefined}
+ * @api
+ */
+olx.control.DefaultsOptions.prototype.rotateOptions;
+
+
+/**
+ * Zoom. Default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.control.DefaultsOptions.prototype.zoom;
+
+
+/**
+ * Zoom options.
+ * @type {olx.control.ZoomOptions|undefined}
+ * @api
+ */
+olx.control.DefaultsOptions.prototype.zoomOptions;
+
+
+/**
+ * @typedef {{className: (string|undefined),
+ *     tipLabel: (string|undefined),
+ *     keys: (boolean|undefined),
+ *     target: (Element|undefined)}}
+ * @api
+ */
+olx.control.FullScreenOptions;
+
+
+/**
+ * CSS class name. Default is `ol-full-screen`.
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.FullScreenOptions.prototype.className;
+
+
+/**
+ * Text label to use for the button tip. Default is `Toggle full-screen`
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.FullScreenOptions.prototype.tipLabel;
+
+
+/**
+ * Full keyboard access.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.control.FullScreenOptions.prototype.keys;
+
+
+/**
+ * Target.
+ * @type {Element|undefined}
+ * @api
+ */
+olx.control.FullScreenOptions.prototype.target;
+
+
+/**
+ * @typedef {{className: (string|undefined),
+ *     coordinateFormat: (ol.CoordinateFormatType|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     render: (function(ol.MapEvent)|undefined),
+ *     target: (Element|undefined),
+ *     undefinedHTML: (string|undefined)}}
+ * @api stable
+ */
+olx.control.MousePositionOptions;
+
+
+/**
+ * CSS class name. Default is `ol-mouse-position`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.MousePositionOptions.prototype.className;
+
+
+/**
+ * Coordinate format.
+ * @type {ol.CoordinateFormatType|undefined}
+ * @api stable
+ */
+olx.control.MousePositionOptions.prototype.coordinateFormat;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.control.MousePositionOptions.prototype.projection;
+
+
+/**
+ * Function called when the control should be re-rendered. This is called
+ * in a requestAnimationFrame callback.
+ * @type {function(ol.MapEvent)|undefined}
+ * @api
+ */
+olx.control.MousePositionOptions.prototype.render;
+
+
+/**
+ * Target.
+ * @type {Element|undefined}
+ * @api stable
+ */
+olx.control.MousePositionOptions.prototype.target;
+
+
+/**
+ * Markup for undefined coordinates. Default is `` (empty string).
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.MousePositionOptions.prototype.undefinedHTML;
+
+
+/**
+ * @typedef {{collapsed: (boolean|undefined),
+ *     collapseLabel: (string|undefined),
+ *     collapsible: (boolean|undefined),
+ *     label: (string|undefined),
+ *     layers: (Array.<ol.layer.Layer>|ol.Collection|undefined),
+ *     render: (function(ol.MapEvent)|undefined),
+ *     target: (Element|undefined),
+ *     tipLabel: (string|undefined)}}
+ * @api
+ */
+olx.control.OverviewMapOptions;
+
+
+/**
+ * Whether the control should start collapsed or not (expanded).
+ * Default to `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.control.OverviewMapOptions.prototype.collapsed;
+
+
+/**
+ * Text label to use for the expanded overviewmap button. Default is `«`
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.OverviewMapOptions.prototype.collapseLabel;
+
+
+/**
+ * Whether the control can be collapsed or not. Default to `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.control.OverviewMapOptions.prototype.collapsible;
+
+
+/**
+ * Text label to use for the collapsed overviewmap button. Default is `»`
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.OverviewMapOptions.prototype.label;
+
+
+/**
+ * Layers for the overview map. If not set, then all main map layers are used
+ * instead.
+ * @type {!Array.<ol.layer.Layer>|!ol.Collection|undefined}
+ * @api
+ */
+olx.control.OverviewMapOptions.prototype.layers;
+
+
+/**
+ * Function called when the control should be re-rendered. This is called
+ * in a requestAnimationFrame callback.
+ * @type {function(ol.MapEvent)|undefined}
+ * @api
+ */
+olx.control.OverviewMapOptions.prototype.render;
+
+
+/**
+ * Specify a target if you want the control to be rendered outside of the map's
+ * viewport.
+ * @type {Element|undefined}
+ * @api
+ */
+olx.control.OverviewMapOptions.prototype.target;
+
+
+/**
+ * Text label to use for the button tip. Default is `Overview map`
+ * @type {string|undefined}
+ * @api
+ */
+olx.control.OverviewMapOptions.prototype.tipLabel;
+
+
+/**
+ * @typedef {{className: (string|undefined),
+ *     minWidth: (number|undefined),
+ *     render: (function(ol.MapEvent)|undefined),
+ *     target: (Element|undefined),
+ *     units: (ol.control.ScaleLineUnits|string|undefined)}}
+ * @api stable
+ */
+olx.control.ScaleLineOptions;
+
+
+/**
+ * CSS Class name. Default is `ol-scale-line`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ScaleLineOptions.prototype.className;
+
+
+/**
+ * Minimum width in pixels. Default is `64`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.control.ScaleLineOptions.prototype.minWidth;
+
+
+/**
+ * Function called when the control should be re-rendered. This is called
+ * in a requestAnimationFrame callback.
+ * @type {function(ol.MapEvent)|undefined}
+ * @api
+ */
+olx.control.ScaleLineOptions.prototype.render;
+
+
+/**
+ * Target.
+ * @type {Element|undefined}
+ * @api stable
+ */
+olx.control.ScaleLineOptions.prototype.target;
+
+
+/**
+ * Units. Default is `metric`.
+ * @type {ol.control.ScaleLineUnits|string|undefined}
+ * @api stable
+ */
+olx.control.ScaleLineOptions.prototype.units;
+
+
+/**
+ * @typedef {{duration: (number|undefined),
+ *     className: (string|undefined),
+ *     label: (string|undefined),
+ *     tipLabel: (string|undefined),
+ *     target: (Element|undefined),
+ *     render: (function(ol.MapEvent)|undefined),
+ *     autoHide: (boolean|undefined)}}
+ * @api stable
+ */
+olx.control.RotateOptions;
+
+
+/**
+ * CSS class name. Default is `ol-rotate`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.RotateOptions.prototype.className;
+
+
+/**
+ * Text label to use for the rotate button. Default is `⇧`
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.RotateOptions.prototype.label;
+
+
+/**
+ * Text label to use for the rotate tip. Default is `Reset rotation`
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.RotateOptions.prototype.tipLabel;
+
+
+/**
+ * Animation duration in milliseconds. Default is `250`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.control.RotateOptions.prototype.duration;
+
+
+/**
+ * Hide the control when rotation is 0. Default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.control.RotateOptions.prototype.autoHide;
+
+
+/**
+ * Function called when the control should be re-rendered. This is called
+ * in a requestAnimationFrame callback.
+ * @type {function(ol.MapEvent)|undefined}
+ * @api
+ */
+olx.control.RotateOptions.prototype.render;
+
+
+/**
+ * Target.
+ * @type {Element|undefined}
+ * @api stable
+ */
+olx.control.RotateOptions.prototype.target;
+
+
+/**
+ * @typedef {{duration: (number|undefined),
+ *     className: (string|undefined),
+ *     zoomInLabel: (string|undefined),
+ *     zoomOutLabel: (string|undefined),
+ *     zoomInTipLabel: (string|undefined),
+ *     zoomOutTipLabel: (string|undefined),
+ *     delta: (number|undefined),
+ *     target: (Element|undefined)}}
+ * @api stable
+ */
+olx.control.ZoomOptions;
+
+
+/**
+ * Animation duration in milliseconds. Default is `250`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.control.ZoomOptions.prototype.duration;
+
+
+/**
+ * CSS class name. Default is `ol-zoom`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ZoomOptions.prototype.className;
+
+
+/**
+ * Text label to use for the zoom-in button. Default is `+`
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ZoomOptions.prototype.zoomInLabel;
+
+
+/**
+ * Text label to use for the zoom-out button. Default is `-`
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ZoomOptions.prototype.zoomOutLabel;
+
+
+/**
+ * Text label to use for the button tip. Default is `Zoom in`
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ZoomOptions.prototype.zoomInTipLabel;
+
+
+/**
+ * Text label to use for the button tip. Default is `Zoom out`
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ZoomOptions.prototype.zoomOutTipLabel;
+
+
+/**
+ * The zoom delta applied on each click.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.control.ZoomOptions.prototype.delta;
+
+
+/**
+ * Target.
+ * @type {Element|undefined}
+ * @api stable
+ */
+olx.control.ZoomOptions.prototype.target;
+
+
+/**
+ * @typedef {{className: (string|undefined),
+ *     maxResolution: (number|undefined),
+ *     minResolution: (number|undefined),
+ *     render: (function(ol.MapEvent)|undefined)}}
+ * @api
+ */
+olx.control.ZoomSliderOptions;
+
+
+/**
+ * CSS class name.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ZoomSliderOptions.prototype.className;
+
+
+/**
+ * Maximum resolution.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.control.ZoomSliderOptions.prototype.maxResolution;
+
+
+/**
+ * Minimum resolution.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.control.ZoomSliderOptions.prototype.minResolution;
+
+
+/**
+ * Function called when the control should be re-rendered. This is called
+ * in a requestAnimationFrame callback.
+ * @type {function(ol.MapEvent)|undefined}
+ * @api
+ */
+olx.control.ZoomSliderOptions.prototype.render;
+
+
+/**
+ * @typedef {{className: (string|undefined),
+ *     target: (Element|undefined),
+ *     tipLabel: (string|undefined),
+ *     extent: (ol.Extent|undefined)}}
+ * @api stable
+ */
+olx.control.ZoomToExtentOptions;
+
+
+/**
+ * Class name. Default is `ol-zoom-extent`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ZoomToExtentOptions.prototype.className;
+
+
+/**
+ * Target.
+ * @type {Element|undefined}
+ * @api stable
+ */
+olx.control.ZoomToExtentOptions.prototype.target;
+
+
+/**
+ * Text label to use for the button tip. Default is `Zoom to extent`
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.control.ZoomToExtentOptions.prototype.tipLabel;
+
+
+/**
+ * The extent to zoom to. If undefined the validity extent of the view
+ * projection is used.
+ * @type {ol.Extent|undefined}
+ * @api stable
+ */
+olx.control.ZoomToExtentOptions.prototype.extent;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.format;
+
+
+/**
+ * @typedef {{dataProjection: ol.proj.ProjectionLike,
+ *     featureProjection: ol.proj.ProjectionLike}}
+ * @api
+ */
+olx.format.ReadOptions;
+
+
+/**
+ * Projection of the data we are reading. If not provided, the projection will
+ * be derived from the data (where possible) or the `defaultDataProjection` of
+ * the format is assigned (where set). If the projection can not be derived from
+ * the data and if no `defaultDataProjection` is set for a format, the features
+ * will not be reprojected.
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.format.ReadOptions.prototype.dataProjection;
+
+
+/**
+ * Projection of the feature geometries created by the format reader. If not
+ * provided, features will be returned in the `dataProjection`.
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.format.ReadOptions.prototype.featureProjection;
+
+
+/**
+ * @typedef {{dataProjection: ol.proj.ProjectionLike,
+ *     featureProjection: ol.proj.ProjectionLike}}
+ * @api
+ */
+olx.format.WriteOptions;
+
+
+/**
+ * Projection of the data we are writing. If not provided, the
+ * `defaultDataProjection` of the format is assigned (where set). If no
+ * `defaultDataProjection` is set for a format, the features will be returned
+ * in the `featureProjection`.
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.format.WriteOptions.prototype.dataProjection;
+
+
+/**
+ * Projection of the feature geometries that will be serialized by the format
+ * writer.
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.format.WriteOptions.prototype.featureProjection;
+
+
+/**
+ * @typedef {{defaultDataProjection: ol.proj.ProjectionLike,
+ *     geometryName: (string|undefined)}}
+ * @api
+ */
+olx.format.GeoJSONOptions;
+
+
+/**
+ * Default data projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.format.GeoJSONOptions.prototype.defaultDataProjection;
+
+
+/**
+ * Geometry name to use when creating features.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.format.GeoJSONOptions.prototype.geometryName;
+
+
+/**
+ * @typedef {{factor: (number|undefined)}}
+ * @api
+ */
+olx.format.PolylineOptions;
+
+
+/**
+ * The factor by which the coordinates values will be scaled.
+ * Default is `1e5`.
+ * @type {number}
+ * @api stable
+ */
+olx.format.PolylineOptions.prototype.factor;
+
+
+/**
+ * @typedef {{defaultDataProjection: ol.proj.ProjectionLike}}
+ * @api
+ */
+olx.format.TopoJSONOptions;
+
+
+/**
+ * Default data projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api stable
+ */
+olx.format.TopoJSONOptions.prototype.defaultDataProjection;
+
+
+/**
+ * @typedef {{altitudeMode: (ol.format.IGCZ|undefined)}}
+ * @api
+ */
+olx.format.IGCOptions;
+
+
+/**
+ * Altitude mode. Possible values are `barometric`, `gps`, and `none`. Default
+ * is `none`.
+ * @type {ol.format.IGCZ|undefined}
+ * @api
+ */
+olx.format.IGCOptions.prototype.altitudeMode;
+
+
+/**
+ * @typedef {{extractStyles: (boolean|undefined),
+ *     defaultStyle: (Array.<ol.style.Style>|undefined)}}
+ * @api
+ */
+olx.format.KMLOptions;
+
+
+/**
+ * Extract styles from the KML. Default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.format.KMLOptions.prototype.extractStyles;
+
+
+/**
+ * Default style. The default default style is the same as Google Earth.
+ * @type {Array.<ol.style.Style>|undefined}
+ * @api stable
+ */
+olx.format.KMLOptions.prototype.defaultStyle;
+
+
+/**
+ * @typedef {{featureNS: string,
+ *     featureType: string,
+ *     srsName: string,
+ *     surface: (boolean|undefined),
+ *     curve: (boolean|undefined),
+ *     multiCurve: (boolean|undefined),
+ *     multiSurface: (boolean|undefined),
+ *     schemaLocation: (string|undefined)}}
+ * @api
+ */
+olx.format.GMLOptions;
+
+
+/**
+ * Feature namespace.
+ * @type {string}
+ * @api stable
+ */
+olx.format.GMLOptions.prototype.featureNS;
+
+
+/**
+ * Feature type to parse.
+ * @type {string}
+ * @api stable
+ */
+olx.format.GMLOptions.prototype.featureType;
+
+
+/**
+ * srsName to use when writing geometries.
+ * @type {string}
+ * @api
+ */
+olx.format.GMLOptions.prototype.srsName;
+
+
+/**
+ * Write gml:Surface instead of gml:Polygon elements. This also affects the
+ * elements in multi-part geometries. Default is `false`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.format.GMLOptions.prototype.surface;
+
+
+/**
+ * Write gml:Curve instead of gml:LineString elements. This also affects the
+ * elements in multi-part geometries. Default is `false`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.format.GMLOptions.prototype.curve;
+
+
+/**
+ * Write gml:MultiCurve instead of gml:MultiLineString. Since the latter is
+ * deprecated in GML 3, the default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.format.GMLOptions.prototype.multiCurve;
+
+
+/**
+ * Write gml:multiSurface instead of gml:MultiPolygon. Since the latter is
+ * deprecated in GML 3, the default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.format.GMLOptions.prototype.multiSurface;
+
+
+/**
+ * Optional schemaLocation to use when writing out the GML, this will override
+ * the default provided.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.format.GMLOptions.prototype.schemaLocation;
+
+
+/**
+ * @typedef {{readExtensions: (function(ol.Feature, Node)|undefined)}}
+ * @api
+ */
+olx.format.GPXOptions;
+
+
+/**
+ * Callback function to process `extensions` nodes.
+ * To prevent memory leaks, this callback function must
+ * not store any references to the node. Note that the `extensions`
+ * node is not allowed in GPX 1.0. Moreover, only `extensions`
+ * nodes from `wpt`, `rte` and `trk` can be processed, as those are
+ * directly mapped to a feature.
+ * @type {function(ol.Feature, Node)}
+ * @api stable
+ */
+olx.format.GPXOptions.prototype.readExtensions;
+
+
+/**
+ * @typedef {{featureNS: string,
+ *     featureType: string,
+ *     gmlFormat: (ol.format.GMLBase|undefined),
+ *     schemaLocation: (string|undefined)}}
+ * @api
+ */
+olx.format.WFSOptions;
+
+
+/**
+ * The namespace URI used for features.
+ * @type {string}
+ * @api stable
+ */
+olx.format.WFSOptions.prototype.featureNS;
+
+
+/**
+ * The feature type to parse. Only used for read operations.
+ * @type {string}
+ * @api stable
+ */
+olx.format.WFSOptions.prototype.featureType;
+
+
+/**
+ * The GML format to use to parse the response. Default is `ol.format.GML3`.
+ * @type {ol.format.GMLBase|undefined}
+ * @api
+ */
+olx.format.WFSOptions.prototype.gmlFormat;
+
+
+/**
+ * Optional schemaLocation to use for serialization, this will override the
+ * default.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.format.WFSOptions.prototype.schemaLocation;
+
+
+/**
+ * @typedef {{featureNS: string,
+ *     featurePrefix: string,
+ *     featureTypes: Array.<string>,
+ *     srsName: (string|undefined),
+ *     handle: (string|undefined),
+ *     outputFormat: (string|undefined),
+ *     maxFeatures: (number|undefined),
+ *     geometryName: (string|undefined),
+ *     bbox: (ol.Extent|undefined)}}
+ * @api
+ */
+olx.format.WFSWriteGetFeatureOptions;
+
+
+/**
+ * The namespace URI used for features.
+ * @type {string}
+ * @api stable
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.featureNS;
+
+
+/**
+ * The prefix for the feature namespace.
+ * @type {string}
+ * @api stable
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.featurePrefix;
+
+
+/**
+ * The feature type names.
+ * @type {Array.<string>}
+ * @api stable
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.featureTypes;
+
+
+/**
+ * SRS name. No srsName attribute will be set on geometries when this is not
+ * provided.
+ * @type {string|undefined}
+ * @api
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.srsName;
+
+
+/**
+ * Handle.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.handle;
+
+
+/**
+ * Output format.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.outputFormat;
+
+
+/**
+ * Maximum number of features to fetch.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.maxFeatures;
+
+
+/**
+ * Geometry name to use in a BBOX filter.
+ * @type {string|undefined}
+ * @api
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.geometryName;
+
+
+/**
+ * Extent to use for the BBOX filter.
+ * @type {ol.Extent|undefined}
+ * @api
+ */
+olx.format.WFSWriteGetFeatureOptions.prototype.bbox;
+
+
+/**
+ * @typedef {{featureNS: string,
+ *     featurePrefix: string,
+ *     featureType: string,
+ *     srsName: (string|undefined),
+ *     handle: (string|undefined),
+ *     nativeElements: Array.<Object>,
+ *     gmlOptions: (olx.format.GMLOptions|undefined)}}
+ * @api stable
+ */
+olx.format.WFSWriteTransactionOptions;
+
+
+/**
+ * The namespace URI used for features.
+ * @type {string}
+ * @api stable
+ */
+olx.format.WFSWriteTransactionOptions.prototype.featureNS;
+
+
+/**
+ * The prefix for the feature namespace.
+ * @type {string}
+ * @api stable
+ */
+olx.format.WFSWriteTransactionOptions.prototype.featurePrefix;
+
+
+/**
+ * The feature type name.
+ * @type {string}
+ * @api stable
+ */
+olx.format.WFSWriteTransactionOptions.prototype.featureType;
+
+
+/**
+ * SRS name. No srsName attribute will be set on geometries when this is not
+ * provided.
+ * @type {string|undefined}
+ * @api
+ */
+olx.format.WFSWriteTransactionOptions.prototype.srsName;
+
+
+/**
+ * Handle.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.format.WFSWriteTransactionOptions.prototype.handle;
+
+
+/**
+ * Native elements. Currently not supported.
+ * @type {Array.<Object>}
+ * @api
+ */
+olx.format.WFSWriteTransactionOptions.prototype.nativeElements;
+
+
+/**
+ * GML options for the WFS transaction writer.
+ * @type {olx.format.GMLOptions|undefined}
+ * @api stable
+ */
+olx.format.WFSWriteTransactionOptions.prototype.gmlOptions;
+
+
+/**
+ * @typedef {{splitCollection: (boolean|undefined)}}
+ * @api
+ */
+olx.format.WKTOptions;
+
+
+/**
+ * Whether to split GeometryCollections into
+ * multiple features on reading. Default is `false`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.format.WKTOptions.prototype.splitCollection;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.interaction;
+
+
+/**
+ * Interactions for the map. Default is `true` for all options.
+ * @typedef {{altShiftDragRotate: (boolean|undefined),
+ *     doubleClickZoom: (boolean|undefined),
+ *     keyboard: (boolean|undefined),
+ *     mouseWheelZoom: (boolean|undefined),
+ *     shiftDragZoom: (boolean|undefined),
+ *     dragPan: (boolean|undefined),
+ *     pinchRotate: (boolean|undefined),
+ *     pinchZoom: (boolean|undefined),
+ *     zoomDelta: (number|undefined),
+ *     zoomDuration: (number|undefined)}}
+ * @api
+ */
+olx.interaction.DefaultsOptions;
+
+
+/**
+ * Whether Alt-Shift-drag rotate is desired. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.altShiftDragRotate;
+
+
+/**
+ * Whether double click zoom is desired. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.doubleClickZoom;
+
+
+/**
+ * Whether keyboard interaction is desired. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.keyboard;
+
+
+/**
+ * Whether mousewheel zoom is desired. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.mouseWheelZoom;
+
+
+/**
+ * Whether Shift-drag zoom is desired. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.shiftDragZoom;
+
+
+/**
+ * Whether drag pan is desired. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.dragPan;
+
+
+/**
+ * Whether pinch rotate is desired. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.pinchRotate;
+
+
+/**
+ * Whether pinch zoom is desired. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.pinchZoom;
+
+
+/**
+ * Zoom delta.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.zoomDelta;
+
+
+/**
+ * Zoom duration.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.DefaultsOptions.prototype.zoomDuration;
+
+
+/**
+ * @typedef {{duration: (number|undefined),
+ *     delta: (number|undefined)}}
+ * @api
+ */
+olx.interaction.DoubleClickZoomOptions;
+
+
+/**
+ * Animation duration in milliseconds. Default is `250`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.DoubleClickZoomOptions.prototype.duration;
+
+
+/**
+ * The zoom delta applied on each double click, default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.DoubleClickZoomOptions.prototype.delta;
+
+
+/**
+ * @typedef {{formatConstructors: (Array.<function(new: ol.format.Feature)>|undefined),
+ *     projection: ol.proj.ProjectionLike}}
+ * @api
+ */
+olx.interaction.DragAndDropOptions;
+
+
+/**
+ * Format constructors.
+ * @type {Array.<function(new: ol.format.Feature)>|undefined}
+ * @api
+ */
+olx.interaction.DragAndDropOptions.prototype.formatConstructors;
+
+
+/**
+ * Target projection. By default, the map's view's projection is used.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.interaction.DragAndDropOptions.prototype.projection;
+
+
+/**
+ * @typedef {{condition: (ol.events.ConditionType|undefined),
+ *     style: ol.style.Style}}
+ * @api
+ */
+olx.interaction.DragBoxOptions;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * Default is {@link ol.events.condition.always}.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.DragBoxOptions.prototype.condition;
+
+
+/**
+ * Style for the box.
+ * @type {ol.style.Style}
+ * @api
+ */
+olx.interaction.DragBoxOptions.prototype.style;
+
+
+/**
+ * @typedef {{kinetic: (ol.Kinetic|undefined)}}
+ * @api
+ */
+olx.interaction.DragPanOptions;
+
+
+/**
+ * Kinetic inertia to apply to the pan.
+ * @type {ol.Kinetic|undefined}
+ * @api
+ */
+olx.interaction.DragPanOptions.prototype.kinetic;
+
+
+/**
+ * @typedef {{condition: (ol.events.ConditionType|undefined)}}
+ * @api
+ */
+olx.interaction.DragRotateAndZoomOptions;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * Default is {@link ol.events.condition.shiftKeyOnly}.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.DragRotateAndZoomOptions.prototype.condition;
+
+
+/**
+ * @typedef {{condition: (ol.events.ConditionType|undefined)}}
+ * @api
+ */
+olx.interaction.DragRotateOptions;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * Default is {@link ol.events.condition.altShiftKeysOnly}.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.DragRotateOptions.prototype.condition;
+
+
+/**
+ * @typedef {{condition: (ol.events.ConditionType|undefined),
+ *     style: ol.style.Style}}
+ * @api
+ */
+olx.interaction.DragZoomOptions;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * Default is {@link ol.events.condition.shiftKeyOnly}.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.DragZoomOptions.prototype.condition;
+
+
+/**
+ * Style for the box.
+ * @type {ol.style.Style}
+ * @api
+ */
+olx.interaction.DragZoomOptions.prototype.style;
+
+
+/**
+ * @typedef {{features: (ol.Collection.<ol.Feature>|undefined),
+ *     source: (ol.source.Vector|undefined),
+ *     snapTolerance: (number|undefined),
+ *     type: ol.geom.GeometryType,
+ *     minPointsPerRing: (number|undefined),
+ *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
+ *     geometryName: (string|undefined),
+ *     condition: (ol.events.ConditionType|undefined)}}
+ * @api
+ */
+olx.interaction.DrawOptions;
+
+
+/**
+ * Destination collection for the drawn features.
+ * @type {ol.Collection.<ol.Feature>|undefined}
+ * @api
+ */
+olx.interaction.DrawOptions.prototype.features;
+
+
+/**
+ * Destination source for the drawn features.
+ * @type {ol.source.Vector|undefined}
+ * @api
+ */
+olx.interaction.DrawOptions.prototype.source;
+
+
+/**
+ * Pixel distance for snapping to the drawing finish. Default is `12`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.DrawOptions.prototype.snapTolerance;
+
+
+/**
+ * Drawing type ('Point', 'LineString', 'Polygon', 'MultiPoint',
+ * 'MultiLineString', or 'MultiPolygon').
+ * @type {ol.geom.GeometryType}
+ * @api
+ */
+olx.interaction.DrawOptions.prototype.type;
+
+
+/**
+ * The number of points that must be drawn before a polygon ring can be finished.
+ * Default is `3`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.DrawOptions.prototype.minPointsPerRing;
+
+
+/**
+ * Style for sketch features.
+ * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
+ * @api
+ */
+olx.interaction.DrawOptions.prototype.style;
+
+
+/**
+ * Geometry name to use for features created by the draw interaction.
+ * @type {string|undefined}
+ * @api
+ */
+olx.interaction.DrawOptions.prototype.geometryName;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * By default {@link ol.events.condition.noModifierKeys} adds a vertex.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.DrawOptions.prototype.condition;
+
+
+/**
+ * @typedef {{condition: (ol.events.ConditionType|undefined),
+ *     pixelDelta: (number|undefined)}}
+ * @api
+ */
+olx.interaction.KeyboardPanOptions;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * Default is {@link ol.events.condition.noModifierKeys} and
+ * {@link ol.events.condition.targetNotEditable}.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.KeyboardPanOptions.prototype.condition;
+
+
+/**
+ * Pixel The amount to pan on each key press. Default is `128` pixels.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.KeyboardPanOptions.prototype.pixelDelta;
+
+
+/**
+ * @typedef {{duration: (number|undefined),
+ *     condition: (ol.events.ConditionType|undefined),
+ *     delta: (number|undefined)}}
+ * @api
+ */
+olx.interaction.KeyboardZoomOptions;
+
+
+/**
+ * Animation duration in milliseconds. Default is `100`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.KeyboardZoomOptions.prototype.duration;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * Default is {@link ol.events.condition.targetNotEditable}.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.KeyboardZoomOptions.prototype.condition;
+
+
+/**
+ * The amount to zoom on each key press. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.KeyboardZoomOptions.prototype.delta;
+
+
+/**
+ * @typedef {{deleteCondition: (ol.events.ConditionType|undefined),
+ *     pixelTolerance: (number|undefined),
+ *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
+ *     features: ol.Collection.<ol.Feature>}}
+ * @api
+ */
+olx.interaction.ModifyOptions;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * By default, {@link ol.events.condition.singleClick} with
+ * {@link ol.events.condition.noModifierKeys} results in a vertex deletion.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.ModifyOptions.prototype.deleteCondition;
+
+
+/**
+ * Pixel tolerance for considering the pointer close enough to a segment or
+ * vertex for editing. Default is `10` pixels.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.ModifyOptions.prototype.pixelTolerance;
+
+
+/**
+ * FeatureOverlay style.
+ * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
+ * @api
+ */
+olx.interaction.ModifyOptions.prototype.style;
+
+
+/**
+ * The features the interaction works on.
+ * @type {ol.Collection.<ol.Feature>}
+ * @api
+ */
+olx.interaction.ModifyOptions.prototype.features;
+
+
+/**
+ * @typedef {{duration: (number|undefined)}}
+ * @api
+ */
+olx.interaction.MouseWheelZoomOptions;
+
+
+/**
+ * Animation duration in milliseconds. Default is `250`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.MouseWheelZoomOptions.prototype.duration;
+
+
+/**
+ * @typedef {{threshold: (number|undefined)}}
+ * @api
+ */
+olx.interaction.PinchRotateOptions;
+
+
+/**
+ * Minimal angle in radians to start a rotation. Default is `0.3`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.PinchRotateOptions.prototype.threshold;
+
+
+/**
+ * @typedef {{duration: (number|undefined)}}
+ * @api
+ */
+olx.interaction.PinchZoomOptions;
+
+
+/**
+ * Animation duration in milliseconds. Default is `400`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.interaction.PinchZoomOptions.prototype.duration;
+
+
+/**
+ * @typedef {{handleDownEvent: (function(ol.MapBrowserPointerEvent):boolean|undefined),
+ *     handleDragEvent: (function(ol.MapBrowserPointerEvent)|undefined),
+ *     handleEvent: (function(ol.MapBrowserEvent):boolean|undefined),
+ *     handleMoveEvent: (function(ol.MapBrowserPointerEvent)|undefined),
+ *     handleUpEvent: (function(ol.MapBrowserPointerEvent):boolean|undefined)}}
+ * @api
+ */
+olx.interaction.PointerOptions;
+
+
+/**
+ * Function handling "down" events. If the function returns `true` then a drag
+ * sequence is started.
+ * @type {(function(ol.MapBrowserPointerEvent):boolean|undefined)}
+ * @api
+ */
+olx.interaction.PointerOptions.prototype.handleDownEvent;
+
+
+/**
+ * Function handling "drag" events. This function is called on "move" events
+ * during a drag sequence.
+ * @type {(function(ol.MapBrowserPointerEvent):boolean|undefined)}
+ * @api
+ */
+olx.interaction.PointerOptions.prototype.handleDragEvent;
+
+
+/**
+ * Method called by the map to notify the interaction that a browser event was
+ * dispatched to the map. The function may return `false` to prevent the
+ * propagation of the event to other interactions in the map's interactions
+ * chain.
+ * @type {(function(ol.MapBrowserEvent):boolean|undefined)}
+ * @api
+ */
+olx.interaction.PointerOptions.prototype.handleEvent;
+
+
+/**
+ * Function handling "move" events. This function is called on "move" events,
+ * also during a drag sequence (so during a drag sequence both the
+ * `handleDragEvent` function and this function are called).
+ * @type {(function(ol.MapBrowserPointerEvent):boolean|undefined)}
+ * @api
+ */
+olx.interaction.PointerOptions.prototype.handleMoveEvent;
+
+
+/**
+ * Function handling "up" events. If the function returns `false` then the
+ * current drag sequence is stopped.
+ * @type {(function(ol.MapBrowserPointerEvent):boolean|undefined)}
+ * @api
+ */
+olx.interaction.PointerOptions.prototype.handleUpEvent;
+
+
+/**
+ * @typedef {{addCondition: (ol.events.ConditionType|undefined),
+ *     condition: (ol.events.ConditionType|undefined),
+ *     layers: (Array.<ol.layer.Layer>|function(ol.layer.Layer): boolean|undefined),
+ *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
+ *     removeCondition: (ol.events.ConditionType|undefined),
+ *     toggleCondition: (ol.events.ConditionType|undefined)}}
+ * @api
+ */
+olx.interaction.SelectOptions;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * By default, this is {@link ol.events.condition.never}. Use this if you want
+ * to use different events for add and remove instead of `toggle`.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.SelectOptions.prototype.addCondition;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * This is the event for the selected features as a whole. By default, this is
+ * {@link ol.events.condition.singleClick}. Clicking on a feature selects that
+ * feature and removes any that were in the selection. Clicking outside any
+ * feature removes all from the selection.
+ * See `toggle`, `add`, `remove` options for adding/removing extra features to/
+ * from the selection.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.SelectOptions.prototype.condition;
+
+
+/**
+ * A list of layers from which features should be
+ * selected. Alternatively, a filter function can be provided. The
+ * function will be called for each layer in the map and should return
+ * `true` for layers that you want to be selectable. If the option is
+ * absent, all visible layers will be considered selectable.
+ * @type {Array.<ol.layer.Layer>|function(ol.layer.Layer): boolean|undefined}
+ * @api
+ */
+olx.interaction.SelectOptions.prototype.layers;
+
+
+/**
+ * Style for the selected features (those in the FeatureOverlay).
+ * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
+ * @api
+ */
+olx.interaction.SelectOptions.prototype.style;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * By default, this is {@link ol.events.condition.never}. Use this if you want
+ * to use different events for add and remove instead of `toggle`.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.SelectOptions.prototype.removeCondition;
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a boolean
+ * to indicate whether that event should be handled.
+ * This is in addition to the `condition` event. By default,
+ * {@link ol.events.condition.shiftKeyOnly}, i.e. pressing `shift` as well as
+ * the `condition` event, adds that feature to the current selection if it is
+ * not currently selected, and removes it if it is.
+ * See `add` and `remove` if you want to use different events instead of a
+ * toggle.
+ * @type {ol.events.ConditionType|undefined}
+ * @api
+ */
+olx.interaction.SelectOptions.prototype.toggleCondition;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.layer;
+
+
+/**
+ * @typedef {{brightness: (number|undefined),
+ *     contrast: (number|undefined),
+ *     hue: (number|undefined),
+ *     opacity: (number|undefined),
+ *     saturation: (number|undefined),
+ *     visible: (boolean|undefined),
+ *     extent: (ol.Extent|undefined),
+ *     minResolution: (number|undefined),
+ *     maxResolution: (number|undefined)}}
+ * @api
+ */
+olx.layer.BaseOptions;
+
+
+/**
+ * Brightness. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.BaseOptions.prototype.brightness;
+
+
+/**
+ * Contrast. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.BaseOptions.prototype.contrast;
+
+
+/**
+ * Hue. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.BaseOptions.prototype.hue;
+
+
+/**
+ * Opacity (0, 1). Default is `1`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.BaseOptions.prototype.opacity;
+
+
+/**
+ * Saturation. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.BaseOptions.prototype.saturation;
+
+
+/**
+ * Visibility. Default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.layer.BaseOptions.prototype.visible;
+
+
+/**
+ * The bounding extent for layer rendering.  The layer will not be rendered
+ * outside of this extent.
+ * @type {ol.Extent|undefined}
+ * @api stable
+ */
+olx.layer.BaseOptions.prototype.extent;
+
+
+/**
+ * The minimum resolution (inclusive) at which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.BaseOptions.prototype.minResolution;
+
+
+/**
+ * The maximum resolution (exclusive) below which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.BaseOptions.prototype.maxResolution;
+
+
+/**
+ * @typedef {{brightness: (number|undefined),
+ *     contrast: (number|undefined),
+ *     hue: (number|undefined),
+ *     opacity: (number|undefined),
+ *     saturation: (number|undefined),
+ *     source: (ol.source.Source|undefined),
+ *     visible: (boolean|undefined),
+ *     extent: (ol.Extent|undefined),
+ *     minResolution: (number|undefined),
+ *     maxResolution: (number|undefined)}}
+ * @api
+ */
+olx.layer.LayerOptions;
+
+
+/**
+ * Brightness. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.LayerOptions.prototype.brightness;
+
+
+/**
+ * Contrast. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.LayerOptions.prototype.contrast;
+
+
+/**
+ * Hue. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.LayerOptions.prototype.hue;
+
+
+/**
+ * Opacity (0, 1). Default is `1`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.LayerOptions.prototype.opacity;
+
+
+/**
+ * Saturation. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.LayerOptions.prototype.saturation;
+
+
+/**
+ * Source for this layer.  If not provided to the constructor, the source can
+ * be set by calling {@link ol.layer.Layer#setSource layer.setSource(source)}
+ * after construction.
+ * @type {ol.source.Source|undefined}
+ * @api stable
+ */
+olx.layer.LayerOptions.prototype.source;
+
+
+/**
+ * Visibility. Default is `true` (visible).
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.layer.LayerOptions.prototype.visible;
+
+
+/**
+ * The bounding extent for layer rendering.  The layer will not be rendered
+ * outside of this extent.
+ * @type {ol.Extent|undefined}
+ * @api stable
+ */
+olx.layer.LayerOptions.prototype.extent;
+
+
+/**
+ * The minimum resolution (inclusive) at which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.LayerOptions.prototype.minResolution;
+
+
+/**
+ * The maximum resolution (exclusive) below which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.LayerOptions.prototype.maxResolution;
+
+
+/**
+ * @typedef {{brightness: (number|undefined),
+ *     contrast: (number|undefined),
+ *     hue: (number|undefined),
+ *     opacity: (number|undefined),
+ *     saturation: (number|undefined),
+ *     visible: (boolean|undefined),
+ *     extent: (ol.Extent|undefined),
+ *     minResolution: (number|undefined),
+ *     maxResolution: (number|undefined),
+ *     layers: (Array.<ol.layer.Base>|ol.Collection.<ol.layer.Base>|undefined)}}
+ * @api
+ */
+olx.layer.GroupOptions;
+
+
+/**
+ * Brightness. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.GroupOptions.prototype.brightness;
+
+
+/**
+ * Contrast. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.GroupOptions.prototype.contrast;
+
+
+/**
+ * Hue. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.GroupOptions.prototype.hue;
+
+
+/**
+ * Opacity (0, 1). Default is `1`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.GroupOptions.prototype.opacity;
+
+
+/**
+ * Saturation. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.GroupOptions.prototype.saturation;
+
+
+/**
+ * Visibility. Default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.layer.GroupOptions.prototype.visible;
+
+
+/**
+ * The bounding extent for layer rendering.  The layer will not be rendered
+ * outside of this extent.
+ * @type {ol.Extent|undefined}
+ * @api stable
+ */
+olx.layer.GroupOptions.prototype.extent;
+
+
+/**
+ * The minimum resolution (inclusive) at which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.GroupOptions.prototype.minResolution;
+
+
+/**
+ * The maximum resolution (exclusive) below which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.GroupOptions.prototype.maxResolution;
+
+
+/**
+ * Child layers.
+ * @type {Array.<ol.layer.Base>|ol.Collection.<ol.layer.Base>|undefined}
+ * @api stable
+ */
+olx.layer.GroupOptions.prototype.layers;
+
+
+/**
+ * @typedef {{brightness: (number|undefined),
+ *     contrast: (number|undefined),
+ *     hue: (number|undefined),
+ *     gradient: (Array.<string>|undefined),
+ *     radius: (number|undefined),
+ *     blur: (number|undefined),
+ *     shadow: (number|undefined),
+ *     weight: (string|function(ol.Feature):number|undefined),
+ *     extent: (ol.Extent|undefined),
+ *     minResolution: (number|undefined),
+ *     maxResolution: (number|undefined),
+ *     opacity: (number|undefined),
+ *     saturation: (number|undefined),
+ *     source: (ol.source.Vector|undefined),
+ *     visible: (boolean|undefined)}}
+ * @api
+ */
+olx.layer.HeatmapOptions;
+
+
+/**
+ * Brightness.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.brightness;
+
+
+/**
+ * Contrast.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.contrast;
+
+
+/**
+ * Hue.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.hue;
+
+
+/**
+ * The color gradient of the heatmap, specified as an array of CSS color
+ * strings. Default is `['#00f', '#0ff', '#0f0', '#ff0', '#f00']`.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.gradient;
+
+
+/**
+ * Radius size in pixels. Default is `8`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.radius;
+
+
+/**
+ * Blur size in pixels. Default is `15`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.blur;
+
+
+/**
+ * Shadow size in pixels. Default is `250`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.shadow;
+
+
+/**
+ * The feature attribute to use for the weight or a function that returns a
+ * weight from a feature. Weight values should range from 0 to 1 (and values
+ * outside will be clamped to that range). Default is `weight`.
+ * @type {string|function(ol.Feature):number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.weight;
+
+
+/**
+ * The bounding extent for layer rendering.  The layer will not be rendered
+ * outside of this extent.
+ * @type {ol.Extent|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.extent;
+
+
+/**
+ * The minimum resolution (inclusive) at which this layer will be visible.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.minResolution;
+
+
+/**
+ * The maximum resolution (exclusive) below which this layer will be visible.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.maxResolution;
+
+
+/**
+ * Opacity. 0-1. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.opacity;
+
+
+/**
+ * Saturation.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.saturation;
+
+
+/**
+ * Source.
+ * @type {ol.source.Vector}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.source;
+
+
+/**
+ * Visibility. Default is `true` (visible).
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.layer.HeatmapOptions.prototype.visible;
+
+
+/**
+ * @typedef {{brightness: (number|undefined),
+ *     contrast: (number|undefined),
+ *     hue: (number|undefined),
+ *     opacity: (number|undefined),
+ *     saturation: (number|undefined),
+ *     source: (ol.source.Image|undefined),
+ *     visible: (boolean|undefined),
+ *     extent: (ol.Extent|undefined),
+ *     minResolution: (number|undefined),
+ *     maxResolution: (number|undefined)}}
+ * @api
+ */
+olx.layer.ImageOptions;
+
+
+/**
+ * Brightness. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.ImageOptions.prototype.brightness;
+
+
+/**
+ * Contrast. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.ImageOptions.prototype.contrast;
+
+
+/**
+ * Hue. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.ImageOptions.prototype.hue;
+
+
+/**
+ * Opacity (0, 1). Default is `1`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.ImageOptions.prototype.opacity;
+
+
+/**
+ * Saturation. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.ImageOptions.prototype.saturation;
+
+
+/**
+ * Source for this layer.
+ * @type {ol.source.Image}
+ * @api stable
+ */
+olx.layer.ImageOptions.prototype.source;
+
+
+/**
+ * Visibility. Default is `true` (visible).
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.layer.ImageOptions.prototype.visible;
+
+
+/**
+ * The bounding extent for layer rendering.  The layer will not be rendered
+ * outside of this extent.
+ * @type {ol.Extent|undefined}
+ * @api stable
+ */
+olx.layer.ImageOptions.prototype.extent;
+
+
+/**
+ * The minimum resolution (inclusive) at which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.ImageOptions.prototype.minResolution;
+
+
+/**
+ * The maximum resolution (exclusive) below which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.ImageOptions.prototype.maxResolution;
+
+
+/**
+ * @typedef {{brightness: (number|undefined),
+ *     contrast: (number|undefined),
+ *     hue: (number|undefined),
+ *     opacity: (number|undefined),
+ *     preload: (number|undefined),
+ *     saturation: (number|undefined),
+ *     source: (ol.source.Tile|undefined),
+ *     visible: (boolean|undefined),
+ *     extent: (ol.Extent|undefined),
+ *     minResolution: (number|undefined),
+ *     maxResolution: (number|undefined),
+ *     useInterimTilesOnError: (boolean|undefined)}}
+ * @api
+ */
+olx.layer.TileOptions;
+
+
+/**
+ * Brightness. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.TileOptions.prototype.brightness;
+
+
+/**
+ * Contrast. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.TileOptions.prototype.contrast;
+
+
+/**
+ * Hue. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.TileOptions.prototype.hue;
+
+
+/**
+ * Opacity (0, 1). Default is `1`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.TileOptions.prototype.opacity;
+
+
+/**
+ * Preload. Load low-resolution tiles up to `preload` levels. By default
+ * `preload` is `0`, which means no preloading.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.TileOptions.prototype.preload;
+
+
+/**
+ * Saturation. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.TileOptions.prototype.saturation;
+
+
+/**
+ * Source for this layer.
+ * @type {ol.source.Tile}
+ * @api stable
+ */
+olx.layer.TileOptions.prototype.source;
+
+
+/**
+ * Visibility. Default is `true` (visible).
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.layer.TileOptions.prototype.visible;
+
+
+/**
+ * The bounding extent for layer rendering.  The layer will not be rendered
+ * outside of this extent.
+ * @type {ol.Extent|undefined}
+ * @api stable
+ */
+olx.layer.TileOptions.prototype.extent;
+
+
+/**
+ * The minimum resolution (inclusive) at which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.TileOptions.prototype.minResolution;
+
+
+/**
+ * The maximum resolution (exclusive) below which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.TileOptions.prototype.maxResolution;
+
+
+/**
+ * Use interim tiles on error. Default is `true`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.layer.TileOptions.prototype.useInterimTilesOnError;
+
+
+/**
+ * @typedef {{brightness: (number|undefined),
+ *     contrast: (number|undefined),
+ *     renderOrder: (function(ol.Feature, ol.Feature):number|null|undefined),
+ *     hue: (number|undefined),
+ *     minResolution: (number|undefined),
+ *     maxResolution: (number|undefined),
+ *     opacity: (number|undefined),
+ *     renderBuffer: (number|undefined),
+ *     saturation: (number|undefined),
+ *     source: (ol.source.Vector|undefined),
+ *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined),
+ *     visible: (boolean|undefined)}}
+ * @api
+ */
+olx.layer.VectorOptions;
+
+
+/**
+ * Brightness.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.VectorOptions.prototype.brightness;
+
+
+/**
+ * Contrast.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.VectorOptions.prototype.contrast;
+
+
+/**
+ * Render order. Function to be used when sorting features before rendering. By
+ * default features are drawn in the order that they are created. Use `null` to
+ * avoid the sort, but get an undefined draw order.
+ * @type {function(ol.Feature, ol.Feature):number|null|undefined}
+ * @api
+ */
+olx.layer.VectorOptions.prototype.renderOrder;
+
+
+/**
+ * Hue.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.VectorOptions.prototype.hue;
+
+
+/**
+ * The bounding extent for layer rendering.  The layer will not be rendered
+ * outside of this extent.
+ * @type {ol.Extent|undefined}
+ * @api stable
+ */
+olx.layer.VectorOptions.prototype.extent;
+
+
+/**
+ * The minimum resolution (inclusive) at which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.VectorOptions.prototype.minResolution;
+
+
+/**
+ * The maximum resolution (exclusive) below which this layer will be visible.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.VectorOptions.prototype.maxResolution;
+
+
+/**
+ * Opacity. 0-1. Default is `1`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.layer.VectorOptions.prototype.opacity;
+
+
+/**
+ * The buffer around the viewport extent used by the renderer when getting
+ * features from the vector source. Recommended value: the size of the
+ * largest symbol or line width. Default is 100 pixels.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.VectorOptions.prototype.renderBuffer;
+
+
+/**
+ * Saturation.
+ * @type {number|undefined}
+ * @api
+ */
+olx.layer.VectorOptions.prototype.saturation;
+
+
+/**
+ * Source.
+ * @type {ol.source.Vector}
+ * @api stable
+ */
+olx.layer.VectorOptions.prototype.source;
+
+
+/**
+ * Layer style. See {@link ol.style} for default style which will be used if
+ * this is not defined.
+ * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
+ * @api stable
+ */
+olx.layer.VectorOptions.prototype.style;
+
+
+/**
+ * Visibility. Default is `true` (visible).
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.layer.VectorOptions.prototype.visible;
+
+
+/**
+ * @typedef {{features: (Array.<ol.Feature>|ol.Collection.<ol.Feature>|undefined),
+ *     map: (ol.Map|undefined),
+ *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined)}}
+ * @api
+ */
+olx.FeatureOverlayOptions;
+
+
+/**
+ * Features.
+ * @type {Array.<ol.Feature>|ol.Collection.<ol.Feature>|undefined}
+ * @api
+ */
+olx.FeatureOverlayOptions.prototype.features;
+
+
+/**
+ * Map.
+ * @type {ol.Map|undefined}
+ * @api
+ */
+olx.FeatureOverlayOptions.prototype.map;
+
+
+/**
+ * Feature style.
+ * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
+ * @api
+ */
+olx.FeatureOverlayOptions.prototype.style;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.source;
+
+
+/**
+ * @typedef {{culture: (string|undefined),
+ *     key: string,
+ *     imagerySet: string,
+ *     maxZoom: (number|undefined),
+ *     tileLoadFunction: (ol.TileLoadFunctionType|undefined)}}
+ * @api
+ */
+olx.source.BingMapsOptions;
+
+
+/**
+ * Culture code. Default is `en-us`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.source.BingMapsOptions.prototype.culture;
+
+
+/**
+ * Bing Maps API key. Get yours at http://bingmapsportal.com/.
+ * @type {string}
+ * @api stable
+ */
+olx.source.BingMapsOptions.prototype.key;
+
+
+/**
+ * Type of imagery.
+ * @type {string}
+ * @api stable
+ */
+olx.source.BingMapsOptions.prototype.imagerySet;
+
+
+/**
+ * Max zoom. Default is what's advertized by the BingMaps service (`21`
+ * currently).
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.BingMapsOptions.prototype.maxZoom;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.BingMapsOptions.prototype.tileLoadFunction;
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     distance: (number|undefined),
+ *     extent: (ol.Extent|undefined),
+ *     format: (ol.format.Feature|undefined),
+ *     logo: (string|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     source: ol.source.Vector}}
+ * @api
+ */
+olx.source.ClusterOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.ClusterOptions.prototype.attributions;
+
+
+/**
+ * Minimum distance in pixels between clusters. Default is `20`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.ClusterOptions.prototype.distance;
+
+
+/**
+ * Extent.
+ * @type {ol.Extent|undefined}
+ * @api
+ */
+olx.source.ClusterOptions.prototype.extent;
+
+
+/**
+ * Format.
+ * @type {ol.format.Feature|undefined}
+ * @api
+ */
+olx.source.ClusterOptions.prototype.format;
+
+
+/**
+ * Logo.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.ClusterOptions.prototype.logo;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.ClusterOptions.prototype.projection;
+
+
+/**
+ * Source.
+ * @type {ol.source.Vector}
+ * @api
+ */
+olx.source.ClusterOptions.prototype.source;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     format: ol.format.Feature,
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     projection: ol.proj.ProjectionLike}}
+ * @api
+ */
+olx.source.FormatVectorOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.FormatVectorOptions.prototype.attributions;
+
+
+/**
+ * Format.
+ * @type {ol.format.Feature}
+ * @api
+ */
+olx.source.FormatVectorOptions.prototype.format;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.FormatVectorOptions.prototype.logo;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.FormatVectorOptions.prototype.projection;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     defaultProjection: ol.proj.ProjectionLike,
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     object: (GeoJSONObject|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     text: (string|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined)}}
+ * @api
+ */
+olx.source.GeoJSONOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.GeoJSONOptions.prototype.attributions;
+
+
+/**
+ * Default projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.GeoJSONOptions.prototype.defaultProjection;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.GeoJSONOptions.prototype.logo;
+
+
+/**
+ * Object.
+ * @type {GeoJSONObject|undefined}
+ * @api
+ */
+olx.source.GeoJSONOptions.prototype.object;
+
+
+/**
+ * Destination projection. If provided, features will be transformed to this
+ * projection. If not provided, features will not be transformed.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.GeoJSONOptions.prototype.projection;
+
+
+/**
+ * Text.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.GeoJSONOptions.prototype.text;
+
+
+/**
+ * URL.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.GeoJSONOptions.prototype.url;
+
+
+/**
+ * URLs.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.source.GeoJSONOptions.prototype.urls;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     doc: (Document|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     node: (Node|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     text: (string|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined)}}
+ * @api
+ */
+olx.source.GPXOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.GPXOptions.prototype.attributions;
+
+
+/**
+ * Document.
+ * @type {Document|undefined}
+ * @api
+ */
+olx.source.GPXOptions.prototype.doc;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.GPXOptions.prototype.logo;
+
+
+/**
+ * Node.
+ * @type {Node|undefined}
+ * @api
+ */
+olx.source.GPXOptions.prototype.node;
+
+
+/**
+ * Destination projection. If provided, features will be transformed to this
+ * projection. If not provided, features will not be transformed.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.GPXOptions.prototype.projection;
+
+
+/**
+ * Text.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.GPXOptions.prototype.text;
+
+
+/**
+ * URL.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.GPXOptions.prototype.url;
+
+
+/**
+ * URLs.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.source.GPXOptions.prototype.urls;
+
+
+/**
+ * @typedef {{preemptive: (boolean|undefined),
+ *            url: string}}
+ * @api
+ */
+olx.source.TileUTFGridOptions;
+
+
+/**
+ * If `true` the TileUTFGrid source loads the tiles based on their "visibility".
+ * This improves the speed of response, but increases traffic.
+ * Note that if set to `false`, you need to pass `true` as `opt_request`
+ * to the `forDataAtCoordinateAndResolution` method otherwise no data
+ * will ever be loaded.
+ * Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.TileUTFGridOptions.prototype.preemptive;
+
+
+/**
+ * @type {string}
+ * @api
+ */
+olx.source.TileUTFGridOptions.prototype.url;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *            crossOrigin: (null|string|undefined),
+ *            logo: (string|olx.LogoOptions|undefined),
+ *            opaque: (boolean|undefined),
+ *            projection: ol.proj.ProjectionLike,
+ *            state: (ol.source.State|string|undefined),
+ *            tileClass: (function(new: ol.ImageTile, ol.TileCoord,
+ *                                 ol.TileState, string, ?string,
+ *                                 ol.TileLoadFunctionType)|undefined),
+ *            tileGrid: (ol.tilegrid.TileGrid|undefined),
+ *            tileLoadFunction: (ol.TileLoadFunctionType|undefined),
+ *            tilePixelRatio: (number|undefined),
+ *            tileUrlFunction: (ol.TileUrlFunctionType|undefined)}}
+ * @api
+ */
+olx.source.TileImageOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.attributions;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {null|string|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.crossOrigin;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.logo;
+
+
+/**
+ * Whether the layer is opaque.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.opaque;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.projection;
+
+
+/**
+ * Source state.
+ * @type {ol.source.State|string|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.state;
+
+
+/**
+ * Class used to instantiate image tiles. Default is {@link ol.ImageTile}.
+ * @type {function(new: ol.ImageTile, ol.TileCoord,
+ *                 ol.TileState, string, ?string,
+ *                 ol.TileLoadFunctionType)|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.tileClass;
+
+
+/**
+ * Tile grid.
+ * @type {ol.tilegrid.TileGrid|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.tileGrid;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.tileLoadFunction;
+
+
+/**
+ * The pixel ratio used by the tile service. For example, if the tile
+ * service advertizes 256px by 256px tiles but actually sends 512px
+ * by 512px images (for retina/hidpi devices) then `tilePixelRatio`
+ * should be set to `2`. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.tilePixelRatio;
+
+
+/**
+ * Optional function to get tile URL given a tile coordinate and the projection.
+ * @type {ol.TileUrlFunctionType|undefined}
+ * @api
+ */
+olx.source.TileImageOptions.prototype.tileUrlFunction;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     format: ol.format.Feature,
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     tileGrid: ol.tilegrid.TileGrid,
+ *     tileUrlFunction: (ol.TileUrlFunctionType|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined)}}
+ * @api
+ */
+olx.source.TileVectorOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.TileVectorOptions.prototype.attributions;
+
+
+/**
+ * Format.
+ * @type {ol.format.Feature}
+ * @api
+ */
+olx.source.TileVectorOptions.prototype.format;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.TileVectorOptions.prototype.logo;
+
+
+/**
+ * Destination projection. If provided, features will be transformed to this
+ * projection. If not provided, features will not be transformed.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.TileVectorOptions.prototype.projection;
+
+
+/**
+ * Tile grid.
+ * @type {ol.tilegrid.TileGrid}
+ * @api
+ */
+olx.source.TileVectorOptions.prototype.tileGrid;
+
+
+/**
+ * Optional function to get tile URL given a tile coordinate and the projection.
+ * Required if url or urls are not provided.
+ * @type {ol.TileUrlFunctionType|undefined}
+ * @api
+ */
+olx.source.TileVectorOptions.prototype.tileUrlFunction;
+
+
+/**
+ * URL template. Must include `{x}`, `{y}` or `{-y}`, and `{z}` placeholders.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.TileVectorOptions.prototype.url;
+
+
+/**
+ * An array of URL templates.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.source.TileVectorOptions.prototype.urls;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     defaultProjection: ol.proj.ProjectionLike,
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     object: (GeoJSONObject|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     text: (string|undefined),
+ *     url: (string|undefined)}}
+ * @api
+ */
+olx.source.TopoJSONOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.TopoJSONOptions.prototype.attributions;
+
+
+/**
+ * Default projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.TopoJSONOptions.prototype.defaultProjection;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.TopoJSONOptions.prototype.logo;
+
+
+/**
+ * Object.
+ * @type {GeoJSONObject|undefined}
+ * @api
+ */
+olx.source.TopoJSONOptions.prototype.object;
+
+
+/**
+ * Destination projection. If provided, features will be transformed to this
+ * projection. If not provided, features will not be transformed.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.TopoJSONOptions.prototype.projection;
+
+
+/**
+ * Text.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.TopoJSONOptions.prototype.text;
+
+
+/**
+ * URL.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.TopoJSONOptions.prototype.url;
+
+
+/**
+ * @typedef {{altitudeMode: (ol.format.IGCZ|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     text: (string|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined)}}
+ * @api
+ */
+olx.source.IGCOptions;
+
+
+/**
+ * Altitude mode. Possible values are `barometric`, `gps`, and `none`. Default
+ * is `none`.
+ * @type {ol.format.IGCZ|undefined}
+ * @api
+ */
+olx.source.IGCOptions.prototype.altitudeMode;
+
+
+/**
+ * Destination projection. If provided, features will be transformed to this
+ * projection. If not provided, features will not be transformed.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.IGCOptions.prototype.projection;
+
+
+/**
+ * Text.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.IGCOptions.prototype.text;
+
+
+/**
+ * URL.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.IGCOptions.prototype.url;
+
+
+/**
+ * URLs.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.source.IGCOptions.prototype.urls;
+
+
+/**
+ * @typedef {{url: (string|undefined),
+ *     displayDpi: (number|undefined),
+ *     metersPerUnit: (number|undefined),
+ *     hidpi: (boolean|undefined),
+ *     useOverlay: (boolean|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     ratio: (number|undefined),
+ *     resolutions: (Array.<number>|undefined),
+ *     imageLoadFunction: (ol.ImageLoadFunctionType|undefined),
+ *     params: (Object|undefined)}}
+ * @api
+ */
+olx.source.ImageMapGuideOptions;
+
+
+/**
+ * The mapagent url.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.source.ImageMapGuideOptions.prototype.url;
+
+
+/**
+ * The display resolution. Default is `96`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.source.ImageMapGuideOptions.prototype.displayDpi;
+
+
+/**
+ * The meters-per-unit value. Default is `1`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.source.ImageMapGuideOptions.prototype.metersPerUnit;
+
+
+/**
+ * Use the `ol.Map#pixelRatio` value when requesting the image from the remote
+ * server. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.ImageMapGuideOptions.prototype.hidpi;
+
+
+/**
+ * If `true`, will use `GETDYNAMICMAPOVERLAYIMAGE`.
+ * @type {boolean|undefined}
+ * @api stable
+ */
+olx.source.ImageMapGuideOptions.prototype.useOverlay;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.ImageMapGuideOptions.prototype.projection;
+
+
+/**
+ * Ratio. `1` means image requests are the size of the map viewport, `2` means
+ * twice the size of the map viewport, and so on. Default is `1`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.source.ImageMapGuideOptions.prototype.ratio;
+
+
+/**
+ * Resolutions. If specified, requests will be made for these resolutions only.
+ * @type {Array.<number>|undefined}
+ * @api stable
+ */
+olx.source.ImageMapGuideOptions.prototype.resolutions;
+
+
+
+/**
+ * Optional function to load an image given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.ImageMapGuideOptions.prototype.imageLoadFunction;
+
+
+/**
+ * Additional parameters.
+ * @type {Object|undefined}
+ * @api stable
+ */
+olx.source.ImageMapGuideOptions.prototype.params;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     defaultStyle: (Array.<ol.style.Style>|undefined),
+ *     doc: (Document|undefined),
+ *     extractStyles: (boolean|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     node: (Node|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     text: (string|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined)}}
+ * @api
+ */
+olx.source.KMLOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.attributions;
+
+
+/**
+ * Default style.
+ * @type {Array.<ol.style.Style>|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.defaultStyle;
+
+
+/**
+ * Document.
+ * @type {Document|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.doc;
+
+
+/**
+ * Extract styles from the KML document. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.extractStyles;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.logo;
+
+
+/**
+ * Node.
+ * @type {Node|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.node;
+
+
+/**
+ * Destination projection. If provided, features will be transformed to this
+ * projection. If not provided, features will not be transformed.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.KMLOptions.prototype.projection;
+
+
+/**
+ * Text.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.text;
+
+
+/**
+ * URL.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.url;
+
+
+/**
+ * URLs.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.source.KMLOptions.prototype.urls;
+
+
+/**
+ * @typedef {{layer: string,
+ *     tileLoadFunction: (ol.TileLoadFunctionType|undefined)}}
+ * @api
+ */
+olx.source.MapQuestOptions;
+
+
+/**
+ * Layer. Possible values are `osm`, `sat`, and `hyb`.
+ * @type {string}
+ * @api stable
+ */
+olx.source.MapQuestOptions.prototype.layer;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.MapQuestOptions.prototype.tileLoadFunction;
+
+
+/**
+ * @typedef {{projection: ol.proj.ProjectionLike,
+ *     tileGrid: (ol.tilegrid.TileGrid|undefined)}}
+ * @api
+ */
+olx.source.TileDebugOptions;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.TileDebugOptions.prototype.projection;
+
+
+/**
+ * Tile grid.
+ * @type {ol.tilegrid.TileGrid|undefined}
+ * @api
+ */
+olx.source.TileDebugOptions.prototype.tileGrid;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     crossOrigin: (null|string|undefined),
+ *     maxZoom: (number|undefined),
+ *     tileLoadFunction: (ol.TileLoadFunctionType|undefined),
+ *     url: (string|undefined)}}
+ * @api
+ */
+olx.source.OSMOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api stable
+ */
+olx.source.OSMOptions.prototype.attributions;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ *
+ * Default is `anonymous`.
+ * @type {null|string|undefined}
+ * @api stable
+ */
+olx.source.OSMOptions.prototype.crossOrigin;
+
+
+/**
+ * Max zoom. Default is `19`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.OSMOptions.prototype.maxZoom;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.OSMOptions.prototype.tileLoadFunction;
+
+
+/**
+ * URL template. Must include `{x}`, `{y}` or `{-y}`, and `{z}` placeholders.
+ * Default is `//{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.source.OSMOptions.prototype.url;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     doc: (Document|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     node: (Node|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     text: (string|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined)}}
+ * @api
+ */
+olx.source.OSMXMLOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.OSMXMLOptions.prototype.attributions;
+
+
+/**
+ * Document.
+ * @type {Document|undefined}
+ * @api
+ */
+olx.source.OSMXMLOptions.prototype.doc;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.OSMXMLOptions.prototype.logo;
+
+
+/**
+ * Node.
+ * @type {Node|undefined}
+ * @api
+ */
+olx.source.OSMXMLOptions.prototype.node;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.OSMXMLOptions.prototype.projection;
+
+
+/**
+ * Text.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.OSMXMLOptions.prototype.text;
+
+
+/**
+ * URL.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.OSMXMLOptions.prototype.url;
+
+
+/**
+ * URLs.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.source.OSMXMLOptions.prototype.urls;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     canvasFunction: ol.CanvasFunctionType,
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     ratio: (number|undefined),
+ *     resolutions: (Array.<number>|undefined),
+ *     state: (ol.source.State|string|undefined)}}
+ * @api
+ */
+olx.source.ImageCanvasOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.ImageCanvasOptions.prototype.attributions;
+
+
+/**
+ * Canvas function. The function returning the canvas element used by the source
+ * as an image. The arguments passed to the function are: `{ol.Extent}` the
+ * image extent, `{number}` the image resolution, `{number}` the device pixel
+ * ratio, `{ol.Size}` the image size, and `{ol.proj.Projection}` the image
+ * projection. The canvas returned by this function is cached by the source. If
+ * the value returned by the function is later changed then
+ * `dispatchChangeEvent` should be called on the source for the source to
+ * invalidate the current cached image.
+ * @type {ol.CanvasFunctionType}
+ * @api
+ */
+olx.source.ImageCanvasOptions.prototype.canvasFunction;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.ImageCanvasOptions.prototype.logo;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.ImageCanvasOptions.prototype.projection;
+
+
+/**
+ * Ratio. 1 means canvases are the size of the map viewport, 2 means twice the
+ * size of the map viewport, and so on. Default is `1.5`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.ImageCanvasOptions.prototype.ratio;
+
+
+/**
+ * Resolutions. If specified, new canvases will be created for these resolutions
+ * only.
+ * @type {Array.<number>|undefined}
+ * @api
+ */
+olx.source.ImageCanvasOptions.prototype.resolutions;
+
+
+/**
+ * Source state.
+ * @type {ol.source.State|string|undefined}
+ * @api
+ */
+olx.source.ImageCanvasOptions.prototype.state;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     ratio: (number|undefined),
+ *     resolutions: (Array.<number>|undefined),
+ *     source: ol.source.Vector,
+ *     style: (ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined)}}
+ * @api
+ */
+olx.source.ImageVectorOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.ImageVectorOptions.prototype.attributions;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.ImageVectorOptions.prototype.logo;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.ImageVectorOptions.prototype.projection;
+
+
+/**
+ * Ratio. 1 means canvases are the size of the map viewport, 2 means twice the
+ * size of the map viewport, and so on. Default is `1.5`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.ImageVectorOptions.prototype.ratio;
+
+
+/**
+ * Resolutions. If specified, new canvases will be created for these resolutions
+ * only.
+ * @type {Array.<number>|undefined}
+ * @api
+ */
+olx.source.ImageVectorOptions.prototype.resolutions;
+
+
+/**
+ * The vector source from which the vector features drawn in canvas elements are
+ * read.
+ * @type {ol.source.Vector}
+ * @api
+ */
+olx.source.ImageVectorOptions.prototype.source;
+
+
+/**
+ * Style to use when rendering features to the canvas.
+ * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
+ * @api
+ */
+olx.source.ImageVectorOptions.prototype.style;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     crossOrigin: (null|string|undefined),
+ *     hidpi: (boolean|undefined),
+ *     serverType: (ol.source.wms.ServerType|string|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     imageLoadFunction: (ol.ImageLoadFunctionType|undefined),
+ *     params: Object.<string,*>,
+ *     projection: ol.proj.ProjectionLike,
+ *     ratio: (number|undefined),
+ *     resolutions: (Array.<number>|undefined),
+ *     url: (string|undefined)}}
+ * @api
+ */
+olx.source.ImageWMSOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api stable
+ */
+olx.source.ImageWMSOptions.prototype.attributions;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {null|string|undefined}
+ * @api stable
+ */
+olx.source.ImageWMSOptions.prototype.crossOrigin;
+
+
+/**
+ * Use the `ol.Map#pixelRatio` value when requesting the image from the remote
+ * server. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.ImageWMSOptions.prototype.hidpi;
+
+
+/**
+ * The type of the remote WMS server: `mapserver`, `geoserver` or `qgis`. Only
+ * needed if `hidpi` is `true`. Default is `undefined`.
+ * @type {ol.source.wms.ServerType|string|undefined}
+ * @api
+ */
+olx.source.ImageWMSOptions.prototype.serverType;
+
+
+/**
+ * Optional function to load an image given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.ImageWMSOptions.prototype.imageLoadFunction;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api stable
+ */
+olx.source.ImageWMSOptions.prototype.logo;
+
+
+/**
+ * WMS request parameters. At least a `LAYERS` param is required. `STYLES` is
+ * `''` by default. `VERSION` is `1.3.0` by default. `WIDTH`, `HEIGHT`, `BBOX`
+ * and `CRS` (`SRS` for WMS version < 1.3.0) will be set dynamically.
+ * @type {Object.<string,*>}
+ * @api stable
+ */
+olx.source.ImageWMSOptions.prototype.params;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.ImageWMSOptions.prototype.projection;
+
+
+/**
+ * Ratio. `1` means image requests are the size of the map viewport, `2` means
+ * twice the size of the map viewport, and so on. Default is `1.5`.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.source.ImageWMSOptions.prototype.ratio;
+
+
+/**
+ * Resolutions. If specified, requests will be made for these resolutions only.
+ * @type {Array.<number>|undefined}
+ * @api stable
+ */
+olx.source.ImageWMSOptions.prototype.resolutions;
+
+
+/**
+ * WMS service URL.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.source.ImageWMSOptions.prototype.url;
+
+
+/**
+ * @typedef {{layer: string,
+ *     minZoom: (number|undefined),
+ *     maxZoom: (number|undefined),
+ *     opaque: (boolean|undefined),
+ *     tileLoadFunction: (ol.TileLoadFunctionType|undefined),
+ *     url: (string|undefined)}}
+ * @api
+ */
+olx.source.StamenOptions;
+
+
+/**
+ * Layer.
+ * @type {string}
+ * @api stable
+ */
+olx.source.StamenOptions.prototype.layer;
+
+
+/**
+ * Minimum zoom.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.StamenOptions.prototype.minZoom;
+
+
+/**
+ * Maximum zoom.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.StamenOptions.prototype.maxZoom;
+
+
+/**
+ * Whether the layer is opaque.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.StamenOptions.prototype.opaque;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.StamenOptions.prototype.tileLoadFunction;
+
+
+/**
+ * URL template. Must include `{x}`, `{y}` or `{-y}`, and `{z}` placeholders.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.source.StamenOptions.prototype.url;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     crossOrigin: (null|string|undefined),
+ *     imageExtent: (ol.Extent),
+ *     imageSize: (ol.Size|undefined),
+ *     imageLoadFunction: (ol.ImageLoadFunctionType|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     url: string}}
+ * @api
+ */
+olx.source.ImageStaticOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api stable
+ */
+olx.source.ImageStaticOptions.prototype.attributions;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {null|string|undefined}
+ * @api stable
+ */
+olx.source.ImageStaticOptions.prototype.crossOrigin;
+
+
+/**
+ * Extent of the image in map coordinates.  This is the [left, bottom, right,
+ * top] map coordinates of your image.
+ * @type {ol.Extent}
+ * @api stable
+ */
+olx.source.ImageStaticOptions.prototype.imageExtent;
+
+
+/**
+ * Size of the image in pixels.
+ * @type {ol.Size|undefined}
+ * @api stable
+ */
+olx.source.ImageStaticOptions.prototype.imageSize;
+
+
+/**
+ * Optional function to load an image given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.ImageStaticOptions.prototype.imageLoadFunction;
+
+
+/**
+ * Optional logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api stable
+ */
+olx.source.ImageStaticOptions.prototype.logo;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.ImageStaticOptions.prototype.projection;
+
+
+/**
+ * Image URL.
+ * @type {string}
+ * @api stable
+ */
+olx.source.ImageStaticOptions.prototype.url;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     format: ol.format.Feature,
+ *     loader: function(this: ol.source.ServerVector, ol.Extent, number, ol.proj.Projection),
+ *     strategy: (function(ol.Extent, number): Array.<ol.Extent>|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     projection: ol.proj.ProjectionLike}}
+ * @api
+ */
+olx.source.ServerVectorOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.ServerVectorOptions.prototype.attributions;
+
+
+/**
+ * Format.
+ * @type {ol.format.Feature}
+ * @api
+ */
+olx.source.ServerVectorOptions.prototype.format;
+
+
+/**
+ * Loading function.
+ * @type {function(this: ol.source.ServerVector, ol.Extent, number, ol.proj.Projection)}
+ * @api
+ */
+olx.source.ServerVectorOptions.prototype.loader;
+
+
+/**
+ * Loading strategy. An {@link ol.loadingstrategy} or a custom function.
+ * Default is {@link ol.loadingstrategy.bbox}.
+ * @type {function(ol.Extent, number): Array.<ol.Extent>|undefined}
+ * @api
+ */
+olx.source.ServerVectorOptions.prototype.strategy;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.ServerVectorOptions.prototype.logo;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.ServerVectorOptions.prototype.projection;
+
+
+/**
+ * @typedef {{crossOrigin: (null|string|undefined),
+ *     tileLoadFunction: (ol.TileLoadFunctionType|undefined),
+ *     url: string,
+ *     wrapX: (boolean|undefined)}}
+ * @api
+ */
+olx.source.TileJSONOptions;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {null|string|undefined}
+ * @api stable
+ */
+olx.source.TileJSONOptions.prototype.crossOrigin;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.TileJSONOptions.prototype.tileLoadFunction;
+
+
+/**
+ * URL to the TileJSON file.
+ * @type {string}
+ * @api stable
+ */
+olx.source.TileJSONOptions.prototype.url;
+
+
+/**
+ * Whether to wrap the world horizontally. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.TileJSONOptions.prototype.wrapX;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     params: Object.<string,*>,
+ *     crossOrigin: (null|string|undefined),
+ *     gutter: (number|undefined),
+ *     hidpi: (boolean|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     tileGrid: (ol.tilegrid.TileGrid|undefined),
+ *     maxZoom: (number|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     serverType: (ol.source.wms.ServerType|string|undefined),
+ *     tileLoadFunction: (ol.TileLoadFunctionType|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined)}}
+ * @api
+ */
+olx.source.TileWMSOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api stable
+ */
+olx.source.TileWMSOptions.prototype.attributions;
+
+
+/**
+ * WMS request parameters. At least a `LAYERS` param is required. `STYLES` is
+ * `''` by default. `VERSION` is `1.3.0` by default. `WIDTH`, `HEIGHT`, `BBOX`
+ * and `CRS` (`SRS` for WMS version < 1.3.0) will be set dynamically.
+ * @type {Object.<string,*>}
+ * @api stable
+ */
+olx.source.TileWMSOptions.prototype.params;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {null|string|undefined}
+ * @api stable
+ */
+olx.source.TileWMSOptions.prototype.crossOrigin;
+
+
+/**
+ * The size in pixels of the gutter around image tiles to ignore. By setting
+ * this property to a non-zero value, images will be requested that are wider
+ * and taller than the tile size by a value of `2 x gutter`. Defaults to zero.
+ * Using a non-zero value allows artifacts of rendering at tile edges to be
+ * ignored. If you control the WMS service it is recommended to address
+ * "artifacts at tile edges" issues by properly configuring the WMS service. For
+ * example, MapServer has a `tile_map_edge_buffer` configuration parameter for
+ * this. See http://mapserver.org/output/tile_mode.html.
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.source.TileWMSOptions.prototype.gutter;
+
+
+/**
+ * Use the `ol.Map#pixelRatio` value when requesting the image from the remote
+ * server. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.TileWMSOptions.prototype.hidpi;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api stable
+ */
+olx.source.TileWMSOptions.prototype.logo;
+
+
+/**
+ * Tile grid. Base this on the resolutions, tilesize and extent supported by the
+ * server.
+ * If this is not defined, a default grid will be used: if there is a projection
+ * extent, the grid will be based on that; if not, a grid based on a global
+ * extent with origin at 0,0 will be used.
+ * @type {ol.tilegrid.TileGrid|undefined}
+ * @api stable
+ */
+olx.source.TileWMSOptions.prototype.tileGrid;
+
+
+/**
+ * Maximum zoom.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.TileWMSOptions.prototype.maxZoom;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.TileWMSOptions.prototype.projection;
+
+
+/**
+ * The type of the remote WMS server. Currently only used when `hidpi` is
+ * `true`. Default is `undefined`.
+ * @type {ol.source.wms.ServerType|string|undefined}
+ * @api
+ */
+olx.source.TileWMSOptions.prototype.serverType;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.TileWMSOptions.prototype.tileLoadFunction;
+
+
+/**
+ * WMS service URL.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.source.TileWMSOptions.prototype.url;
+
+
+/**
+ * WMS service urls. Use this instead of `url` when the WMS supports multiple
+ * urls for GetMap requests.
+ * @type {Array.<string>|undefined}
+ * @api stable
+ */
+olx.source.TileWMSOptions.prototype.urls;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     features: (Array.<ol.Feature>|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     state: (ol.source.State|string|undefined)}}
+ * @api
+ */
+olx.source.VectorOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api stable
+ */
+olx.source.VectorOptions.prototype.attributions;
+
+
+/**
+ * Features.
+ * @type {Array.<ol.Feature>|undefined}
+ * @api stable
+ */
+olx.source.VectorOptions.prototype.features;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api stable
+ */
+olx.source.VectorOptions.prototype.logo;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.VectorOptions.prototype.projection;
+
+
+/**
+ * State.
+ * @type {ol.source.State|string|undefined}
+ * @api
+ */
+olx.source.VectorOptions.prototype.state;
+
+
+/**
+ * @typedef {{arrayBuffer: (ArrayBuffer|undefined),
+ *     attributions: (Array.<ol.Attribution>|undefined),
+ *     doc: (Document|undefined),
+ *     format: ol.format.Feature,
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     node: (Node|undefined),
+ *     object: (Object|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     text: (string|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined)}}
+ * @api
+ */
+olx.source.StaticVectorOptions;
+
+
+/**
+ * Array buffer.
+ * @type {ArrayBuffer|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.arrayBuffer;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.attributions;
+
+
+/**
+ * Document.
+ * @type {Document|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.doc;
+
+
+/**
+ * Format.
+ * @type {ol.format.Feature}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.format;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.logo;
+
+
+/**
+ * Node.
+ * @type {Node|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.node;
+
+
+/**
+ * Object.
+ * @type {Object|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.object;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.projection;
+
+
+/**
+ * Text.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.text;
+
+
+/**
+ * URL.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.url;
+
+
+/**
+ * URLs.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.source.StaticVectorOptions.prototype.urls;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     crossOrigin: (string|null|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     tileGrid: ol.tilegrid.WMTS,
+ *     projection: ol.proj.ProjectionLike,
+ *     requestEncoding: (ol.source.WMTSRequestEncoding|string|undefined),
+ *     layer: string,
+ *     style: string,
+ *     tilePixelRatio: (number|undefined),
+ *     version: (string|undefined),
+ *     format: (string|undefined),
+ *     matrixSet: string,
+ *     dimensions: (Object|undefined),
+ *     url: (string|undefined),
+ *     maxZoom: (number|undefined),
+ *     tileLoadFunction: (ol.TileLoadFunctionType|undefined),
+ *     urls: (Array.<string>|undefined),
+ *     tileClass: (function(new: ol.ImageTile, ol.TileCoord,
+ *                          ol.TileState, string, ?string,
+ *                          ol.TileLoadFunctionType)|undefined)}}
+ * @api
+ */
+olx.source.WMTSOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.attributions;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {string|null|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.crossOrigin;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.logo;
+
+
+/**
+ * Tile grid.
+ * @type {ol.tilegrid.WMTS}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.tileGrid;
+
+
+/**
+ * Projection.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.projection;
+
+
+/**
+ * Request encoding. Default is `KVP`.
+ * @type {ol.source.WMTSRequestEncoding|string|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.requestEncoding;
+
+
+/**
+ * Layer.
+ * @type {string}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.layer;
+
+
+/**
+ * Style.
+ * @type {string}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.style;
+
+
+/**
+ * Class used to instantiate image tiles. Default is {@link ol.ImageTile}.
+ * @type {function(new: ol.ImageTile, ol.TileCoord,
+ *                 ol.TileState, string, ?string,
+ *                 ol.TileLoadFunctionType)|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.tileClass;
+
+
+/**
+ * The pixel ratio used by the tile service. For example, if the tile
+ * service advertizes 256px by 256px tiles but actually sends 512px
+ * by 512px images (for retina/hidpi devices) then `tilePixelRatio`
+ * should be set to `2`. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.tilePixelRatio;
+
+
+/**
+ * WMTS version. Default is `1.0.0`.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.version;
+
+
+/**
+ * Image format. Default is `image/jpeg`.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.format;
+
+
+/**
+ * Matrix set.
+ * @type {string}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.matrixSet;
+
+
+/**
+ * Dimensions.
+ * @type {Object|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.dimensions;
+
+
+/**
+ * URL.
+ * @type {string|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.url;
+
+
+/**
+ * Maximum zoom.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.maxZoom;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.tileLoadFunction;
+
+
+/**
+ * Urls.
+ * @type {Array.<string>|undefined}
+ * @api
+ */
+olx.source.WMTSOptions.prototype.urls;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     crossOrigin: (null|string|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     projection: ol.proj.ProjectionLike,
+ *     maxZoom: (number|undefined),
+ *     minZoom: (number|undefined),
+ *     tileLoadFunction: (ol.TileLoadFunctionType|undefined),
+ *     tilePixelRatio: (number|undefined),
+ *     tileSize: (number|undefined),
+ *     tileUrlFunction: (ol.TileUrlFunctionType|undefined),
+ *     url: (string|undefined),
+ *     urls: (Array.<string>|undefined),
+ *     wrapX: (boolean|undefined)}}
+ * @api
+ */
+olx.source.XYZOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api stable
+ */
+olx.source.XYZOptions.prototype.attributions;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {null|string|undefined}
+ * @api stable
+ */
+olx.source.XYZOptions.prototype.crossOrigin;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api stable
+ */
+olx.source.XYZOptions.prototype.logo;
+
+
+/**
+ * Projection. Default is `EPSG:3857`.
+ * @type {ol.proj.ProjectionLike}
+ * @api
+ */
+olx.source.XYZOptions.prototype.projection;
+
+
+/**
+ * Optional max zoom level. Default is `18`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.XYZOptions.prototype.maxZoom;
+
+
+/**
+ * Unsupported (TODO: remove this).
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.XYZOptions.prototype.minZoom;
+
+
+/**
+ * Optional function to load a tile given a URL.
+ * @type {ol.TileLoadFunctionType|undefined}
+ * @api
+ */
+olx.source.XYZOptions.prototype.tileLoadFunction;
+
+
+/**
+ * The pixel ratio used by the tile service. For example, if the tile
+ * service advertizes 256px by 256px tiles but actually sends 512px
+ * by 512px images (for retina/hidpi devices) then `tilePixelRatio`
+ * should be set to `2`. Default is `1`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.XYZOptions.prototype.tilePixelRatio;
+
+
+/**
+ * The tile size used by the tile service. Default is `256` pixels.
+ * @type {number|undefined}
+ * @api
+ */
+olx.source.XYZOptions.prototype.tileSize;
+
+
+/**
+ * Optional function to get tile URL given a tile coordinate and the projection.
+ * Required if url or urls are not provided.
+ * @type {ol.TileUrlFunctionType|undefined}
+ * @api
+ */
+olx.source.XYZOptions.prototype.tileUrlFunction;
+
+
+/**
+ * URL template. Must include `{x}`, `{y}` or `{-y}`, and `{z}` placeholders.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.source.XYZOptions.prototype.url;
+
+
+/**
+ * An array of URL templates.
+ * @type {Array.<string>|undefined}
+ * @api stable
+ */
+olx.source.XYZOptions.prototype.urls;
+
+
+/**
+ * Whether to wrap the world horizontally. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.source.XYZOptions.prototype.wrapX;
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *     crossOrigin: (null|string|undefined),
+ *     logo: (string|olx.LogoOptions|undefined),
+ *     url: !string,
+ *     tierSizeCalculation: (string|undefined),
+ *     size: ol.Size}}
+ * @api
+ */
+olx.source.ZoomifyOptions;
+
+
+/**
+ * Attributions.
+ * @type {Array.<ol.Attribution>|undefined}
+ * @api stable
+ */
+olx.source.ZoomifyOptions.prototype.attributions;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {null|string|undefined}
+ * @api stable
+ */
+olx.source.ZoomifyOptions.prototype.crossOrigin;
+
+
+/**
+ * Logo.
+ * @type {string|olx.LogoOptions|undefined}
+ * @api stable
+ */
+olx.source.ZoomifyOptions.prototype.logo;
+
+
+/**
+ * Prefix of URL template.
+ * @type {!string}
+ * @api stable
+ */
+olx.source.ZoomifyOptions.prototype.url;
+
+
+/**
+ * Tier size calculation method: `default` or `truncated`.
+ * @type {string|undefined}
+ * @api stable
+ */
+olx.source.ZoomifyOptions.prototype.tierSizeCalculation;
+
+
+/**
+ * Size of the image.
+ * @type {ol.Size}
+ * @api stable
+ */
+olx.source.ZoomifyOptions.prototype.size;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.style;
+
+
+/**
+ * @typedef {{fill: (ol.style.Fill|undefined),
+ *     radius: number,
+ *     snapToPixel: (boolean|undefined),
+ *     stroke: (ol.style.Stroke|undefined),
+ *     atlasManager: (ol.style.AtlasManager|undefined)}}
+ * @api
+ */
+olx.style.CircleOptions;
+
+
+/**
+ * Fill style.
+ * @type {ol.style.Fill|undefined}
+ * @api
+ */
+olx.style.CircleOptions.prototype.fill;
+
+
+/**
+ * Circle radius.
+ * @type {number}
+ * @api
+ */
+olx.style.CircleOptions.prototype.radius;
+
+
+/**
+ * If `true` integral numbers of pixels are used as the X and Y pixel
+ * coordinate when drawing the circle in the output canvas. If `false`
+ * fractional numbers may be used. Using `true` allows for "sharp"
+ * rendering (no blur), while using `false` allows for "accurate"
+ * rendering. Note that accuracy is important if the circle's
+ * position is animated. Without it, the circle may jitter noticeably.
+ * Default value is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.style.CircleOptions.prototype.snapToPixel;
+
+
+/**
+ * Stroke style.
+ * @type {ol.style.Stroke|undefined}
+ * @api
+ */
+olx.style.CircleOptions.prototype.stroke;
+
+
+/**
+ * The atlas manager to use for this circle. When using WebGL it is
+ * recommended to use an atlas manager to avoid texture switching.
+ * If an atlas manager is given, the circle is added to an atlas.
+ * By default no atlas manager is used.
+ * @type {ol.style.AtlasManager|undefined}
+ */
+olx.style.CircleOptions.prototype.atlasManager;
+
+
+/**
+ * @typedef {{color: (ol.Color|string|undefined)}}
+ * @api
+ */
+olx.style.FillOptions;
+
+
+/**
+ * Color. See {@link ol.color} for possible formats. Default null; if null,
+ * the Canvas/renderer default black will be used.
+ * @type {ol.Color|string|undefined}
+ * @api
+ */
+olx.style.FillOptions.prototype.color;
+
+
+/**
+ * @typedef {{anchor: (Array.<number>|undefined),
+ *     anchorOrigin: (ol.style.IconOrigin|undefined),
+ *     anchorXUnits: (ol.style.IconAnchorUnits|undefined),
+ *     anchorYUnits: (ol.style.IconAnchorUnits|undefined),
+ *     crossOrigin: (null|string|undefined),
+ *     img: (Image|undefined),
+ *     offset: (Array.<number>|undefined),
+ *     offsetOrigin: (ol.style.IconOrigin|undefined),
+ *     scale: (number|undefined),
+ *     snapToPixel: (boolean|undefined),
+ *     rotateWithView: (boolean|undefined),
+ *     rotation: (number|undefined),
+ *     size: (ol.Size|undefined),
+ *     src: (string|undefined)}}
+ * @api
+ */
+olx.style.IconOptions;
+
+
+/**
+ * Anchor. Default value is `[0.5, 0.5]` (icon center).
+ * @type {Array.<number>|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.anchor;
+
+
+/**
+ * Origin of the anchor: `bottom-left`, `bottom-right`, `top-left` or
+ * `top-right`. Default is `top-left`.
+ * @type {ol.style.IconOrigin|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.anchorOrigin;
+
+
+/**
+ * Units in which the anchor x value is specified. A value of `'fraction'`
+ * indicates the x value is a fraction of the icon. A value of `'pixels'`
+ * indicates the x value in pixels. Default is `'fraction'`.
+ * @type {ol.style.IconAnchorUnits|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.anchorXUnits;
+
+
+/**
+ * Units in which the anchor y value is specified. A value of `'fraction'`
+ * indicates the y value is a fraction of the icon. A value of `'pixels'`
+ * indicates the y value in pixels. Default is `'fraction'`.
+ * @type {ol.style.IconAnchorUnits|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.anchorYUnits;
+
+
+/**
+ * The `crossOrigin` attribute for loaded images.  Note that you must provide a
+ * `crossOrigin` value if you are using the WebGL renderer or if you want to
+ * access pixel data with the Canvas renderer.  See
+ * {@link https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image}
+ * for more detail.
+ * @type {null|string|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.crossOrigin;
+
+
+/**
+ * Image object for the icon. If the `src` option is not provided then the
+ * provided image must already be loaded. And in that case, it is required
+ * to provide the size of the image, with the `size` option.
+ * @type {Image|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.img;
+
+
+/**
+ * Offset, which, together with the size and the offset origin,
+ * define the sub-rectangle to use from the original icon image. Default value
+ * is `[0, 0]`.
+ * @type {Array.<number>|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.offset;
+
+
+/**
+ * Origin of the offset: `bottom-left`, `bottom-right`, `top-left` or
+ * `top-right`. Default is `top-left`.
+ * @type {ol.style.IconOrigin|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.offsetOrigin;
+
+
+/**
+ * Scale.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.scale;
+
+
+/**
+ * If `true` integral numbers of pixels are used as the X and Y pixel
+ * coordinate when drawing the icon in the output canvas. If `false`
+ * fractional numbers may be used. Using `true` allows for "sharp"
+ * rendering (no blur), while using `false` allows for "accurate"
+ * rendering. Note that accuracy is important if the icon's position
+ * is animated. Without it, the icon may jitter noticeably. Default
+ * value is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.snapToPixel;
+
+
+/**
+ * Whether to rotate the icon with the view. Default is `false`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.rotateWithView;
+
+
+/**
+ * Rotation.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.rotation;
+
+
+/**
+ * Icon size in pixel. Can be used together with `offset` to define the
+ * sub-rectangle to use from the origin (sprite) icon image. Also, setting
+ * the `size` is required if `img` is set and `src` is not.
+ * @type {ol.Size|undefined}
+ * @api
+ */
+olx.style.IconOptions.prototype.size;
+
+
+/**
+ * Image source URI.
+ * @type {string}
+ * @api
+ */
+olx.style.IconOptions.prototype.src;
+
+
+/**
+ * Specify radius for regular polygons, or radius1 and radius2 for stars.
+ * @typedef {{fill: (ol.style.Fill|undefined),
+ *     points: number,
+ *     radius: (number|undefined),
+ *     radius1: (number|undefined),
+ *     radius2: (number|undefined),
+ *     angle: (number|undefined),
+ *     snapToPixel: (boolean|undefined),
+ *     stroke: (ol.style.Stroke|undefined),
+ *     rotation: (number|undefined),
+ *     atlasManager: (ol.style.AtlasManager|undefined)}}
+ * @api
+ */
+olx.style.RegularShapeOptions;
+
+
+/**
+ * Fill style.
+ * @type {ol.style.Fill|undefined}
+ * @api
+ */
+olx.style.RegularShapeOptions.prototype.fill;
+
+
+/**
+ * Number of points for stars and regular polygons. In case of a polygon, the
+ * number of points is the number of sides.
+ * @type {number}
+ * @api
+ */
+olx.style.RegularShapeOptions.prototype.points;
+
+
+/**
+ * Radius of a regular polygon.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.RegularShapeOptions.prototype.radius;
+
+
+/**
+* Inner radius of a star.
+* @type {number|undefined}
+* @api
+*/
+olx.style.RegularShapeOptions.prototype.radius1;
+
+
+/**
+ * Outer radius of a star.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.RegularShapeOptions.prototype.radius2;
+
+
+/**
+ * Shape's angle in radians. A value of 0 will have one of the shape's point
+ * facing up.
+ * Default value is 0.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.RegularShapeOptions.prototype.angle;
+
+
+/**
+ * If `true` integral numbers of pixels are used as the X and Y pixel
+ * coordinate when drawing the shape in the output canvas. If `false`
+ * fractional numbers may be used. Using `true` allows for "sharp"
+ * rendering (no blur), while using `false` allows for "accurate"
+ * rendering. Note that accuracy is important if the shape's
+ * position is animated. Without it, the shape may jitter noticeably.
+ * Default value is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.style.RegularShapeOptions.prototype.snapToPixel;
+
+
+/**
+ * Stroke style.
+ * @type {ol.style.Stroke|undefined}
+ * @api
+ */
+olx.style.RegularShapeOptions.prototype.stroke;
+
+
+/**
+ * Rotation in radians (positive rotation clockwise). Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.RegularShapeOptions.prototype.rotation;
+
+
+/**
+ * The atlas manager to use for this symbol. When using WebGL it is
+ * recommended to use an atlas manager to avoid texture switching.
+ * If an atlas manager is given, the symbol is added to an atlas.
+ * By default no atlas manager is used.
+ * @type {ol.style.AtlasManager|undefined}
+ */
+olx.style.RegularShapeOptions.prototype.atlasManager;
+
+
+/**
+ * @typedef {{color: (ol.Color|string|undefined),
+ *     lineCap: (string|undefined),
+ *     lineJoin: (string|undefined),
+ *     lineDash: (Array.<number>|undefined),
+ *     miterLimit: (number|undefined),
+ *     width: (number|undefined)}}
+ * @api
+ */
+olx.style.StrokeOptions;
+
+
+/**
+ * Color. See {@link ol.color} for possible formats. Default null; if null,
+ * the Canvas/renderer default black will be used.
+ * @type {ol.Color|string|undefined}
+ * @api
+ */
+olx.style.StrokeOptions.prototype.color;
+
+
+/**
+ * Line cap style: `butt`, `round`, or `square`. Default is `round`.
+ * @type {string|undefined}
+ * @api
+ */
+olx.style.StrokeOptions.prototype.lineCap;
+
+
+/**
+ * Line join style: `bevel`, `round`, or `miter`. Default is `round`.
+ * @type {string|undefined}
+ * @api
+ */
+olx.style.StrokeOptions.prototype.lineJoin;
+
+
+/**
+ * Line dash pattern. Default is `undefined` (no dash).
+ * @type {Array.<number>|undefined}
+ * @api
+ */
+olx.style.StrokeOptions.prototype.lineDash;
+
+
+/**
+ * Miter limit. Default is `10`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.StrokeOptions.prototype.miterLimit;
+
+
+/**
+ * Width.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.StrokeOptions.prototype.width;
+
+
+/**
+ * @typedef {{font: (string|undefined),
+ *     offsetX: (number|undefined),
+ *     offsetY: (number|undefined),
+ *     scale: (number|undefined),
+ *     rotation: (number|undefined),
+ *     text: (string|undefined),
+ *     textAlign: (string|undefined),
+ *     textBaseline: (string|undefined),
+ *     fill: (ol.style.Fill|undefined),
+ *     stroke: (ol.style.Stroke|undefined)}}
+ * @api
+ */
+olx.style.TextOptions;
+
+
+/**
+ * Font.
+ * @type {string|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.font;
+
+
+/**
+ * Horizontal text offset in pixels. A positive will shift the text right.
+ * Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.offsetX;
+
+
+/**
+ * Vertical text offset in pixels. A positive will shift the text down. Default
+ * is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.offsetY;
+
+
+/**
+ * Scale.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.scale;
+
+
+/**
+ * Rotation.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.rotation;
+
+
+/**
+ * Text.
+ * @type {string|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.text;
+
+
+/**
+ * Text alignment.
+ * @type {string|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.textAlign;
+
+
+/**
+ * Text base line.
+ * @type {string|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.textBaseline;
+
+
+/**
+ * Fill style.
+ * @type {ol.style.Fill|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.fill;
+
+
+/**
+ * Stroke style.
+ * @type {ol.style.Stroke|undefined}
+ * @api
+ */
+olx.style.TextOptions.prototype.stroke;
+
+
+/**
+ * @typedef {{geometry: (undefined|string|ol.geom.Geometry|ol.style.GeometryFunction),
+ *     fill: (ol.style.Fill|undefined),
+ *     image: (ol.style.Image|undefined),
+ *     stroke: (ol.style.Stroke|undefined),
+ *     text: (ol.style.Text|undefined),
+ *     zIndex: (number|undefined)}}
+ * @api
+ */
+olx.style.StyleOptions;
+
+
+/**
+ * Feature property or geometry or function returning a geometry to render for
+ * this style.
+ * @type {undefined|string|ol.geom.Geometry|ol.style.GeometryFunction}
+ * @api
+ */
+olx.style.StyleOptions.prototype.geometry;
+
+
+/**
+ * Fill style.
+ * @type {ol.style.Fill|undefined}
+ * @api
+ */
+olx.style.StyleOptions.prototype.fill;
+
+
+/**
+ * Image style.
+ * @type {ol.style.Image|undefined}
+ * @api
+ */
+olx.style.StyleOptions.prototype.image;
+
+
+/**
+ * Stroke style.
+ * @type {ol.style.Stroke|undefined}
+ * @api
+ */
+olx.style.StyleOptions.prototype.stroke;
+
+
+/**
+ * Text style.
+ * @type {ol.style.Text|undefined}
+ * @api
+ */
+olx.style.StyleOptions.prototype.text;
+
+
+/**
+ * Z index.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.StyleOptions.prototype.zIndex;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.tilegrid;
+
+
+/**
+ * @typedef {{minZoom: (number|undefined),
+ *     origin: (ol.Coordinate|undefined),
+ *     origins: (Array.<ol.Coordinate>|undefined),
+ *     resolutions: !Array.<number>,
+ *     tileSize: (number|undefined),
+ *     tileSizes: (Array.<number>|undefined)}}
+ * @api
+ */
+olx.tilegrid.TileGridOptions;
+
+
+/**
+ * Minimum zoom. Default is 0.
+ * @type {number|undefined}
+ * @api
+ */
+olx.tilegrid.TileGridOptions.prototype.minZoom;
+
+
+/**
+ * Origin. Default is null.
+ * @type {ol.Coordinate|undefined}
+ * @api stable
+ */
+olx.tilegrid.TileGridOptions.prototype.origin;
+
+
+/**
+ * Origins. If given, the array should match the `resolutions` array, i.e.
+ * each resolution can have a different origin.
+ * @type {Array.<ol.Coordinate>|undefined}
+ * @api stable
+ */
+olx.tilegrid.TileGridOptions.prototype.origins;
+
+
+/**
+ * Resolutions.
+ * @type {!Array.<number>}
+ * @api stable
+ */
+olx.tilegrid.TileGridOptions.prototype.resolutions;
+
+
+/**
+ * Tile size. Default is 256. (Only square tiles are supported.)
+ * @type {number|undefined}
+ * @api stable
+ */
+olx.tilegrid.TileGridOptions.prototype.tileSize;
+
+
+/**
+ * Tile sizes. If given, the array should match the `resolutions` array, i.e.
+ * each resolution can have a different tile size.
+ * @type {Array.<number>|undefined}
+ * @api stable
+ */
+olx.tilegrid.TileGridOptions.prototype.tileSizes;
+
+
+/**
+ * @typedef {{origin: (ol.Coordinate|undefined),
+ *     origins: (Array.<ol.Coordinate>|undefined),
+ *     resolutions: !Array.<number>,
+ *     matrixIds: !Array.<string>,
+ *     tileSize: (number|undefined),
+ *     tileSizes: (Array.<number>|undefined)}}
+ * @api
+ */
+olx.tilegrid.WMTSOptions;
+
+
+/**
+ * Origin.
+ * @type {ol.Coordinate|undefined}
+ * @api
+ */
+olx.tilegrid.WMTSOptions.prototype.origin;
+
+
+/**
+ * Origins.
+ * @type {Array.<ol.Coordinate>|undefined}
+ * @api
+ */
+olx.tilegrid.WMTSOptions.prototype.origins;
+
+
+/**
+ * Resolutions.
+ * @type {!Array.<number>}
+ * @api
+ */
+olx.tilegrid.WMTSOptions.prototype.resolutions;
+
+
+/**
+ * matrix IDs.
+ * @type {!Array.<string>}
+ * @api
+ */
+olx.tilegrid.WMTSOptions.prototype.matrixIds;
+
+
+/**
+ * Tile size.
+ * @type {number|undefined}
+ * @api
+ */
+olx.tilegrid.WMTSOptions.prototype.tileSize;
+
+
+/**
+ * Tile sizes.
+ * @type {Array.<number>|undefined}
+ * @api
+ */
+olx.tilegrid.WMTSOptions.prototype.tileSizes;
+
+
+/**
+ * @typedef {{extent: (ol.Extent|undefined),
+ *     maxZoom: (number|undefined),
+ *     minZoom: (number|undefined),
+ *     tileSize: (number|undefined)}}
+ * @api
+ */
+olx.tilegrid.XYZOptions;
+
+
+/**
+ * Extent for the tile grid.  The origin for an XYZ tile grid is the top-left
+ * corner of the extent.  The zero level of the grid is defined by the
+ * resolution at which one tile fits in the provided extent.  If not provided,
+ * the extent of the EPSG:3857 projection is used.
+ * @type {ol.Extent|undefined}
+ * @api
+ */
+olx.tilegrid.XYZOptions.prototype.extent;
+
+
+/**
+ * Maximum zoom.  The default is `ol.DEFAULT_MAX_ZOOM`.  This determines the
+ * number of levels in the grid set.  For example, a `maxZoom` of 21 means there
+ * are 22 levels in the grid set.
+ * @type {number|undefined}
+ * @api
+ */
+olx.tilegrid.XYZOptions.prototype.maxZoom;
+
+
+/**
+ * Minimum zoom. Default is 0.
+ * @type {number|undefined}
+ * @api
+ */
+olx.tilegrid.XYZOptions.prototype.minZoom;
+
+
+/**
+ * Tile size in pixels. Default is 256. (Only square tiles are supported.)
+ * @type {number|undefined}
+ * @api
+ */
+olx.tilegrid.XYZOptions.prototype.tileSize;
+
+
+/**
+ * @typedef {{resolutions: !Array.<number>}}
+ * @api
+ */
+olx.tilegrid.ZoomifyOptions;
+
+
+/**
+ * Resolutions.
+ * @type {!Array.<number>}
+ * @api
+ */
+olx.tilegrid.ZoomifyOptions.prototype.resolutions;
+
+
+/**
+ * Namespace.
+ * @type {Object}
+ */
+olx.view;
+
+
+/**
+ * @typedef {{padding: !Array.<number>,
+ *     constrainResolution: (boolean|undefined),
+ *     nearest: (boolean|undefined),
+ *     maxZoom: (number|undefined),
+ *     minResolution: (number|undefined)}}
+ * @api
+ */
+olx.view.FitGeometryOptions;
+
+
+/**
+ * Padding (in pixels) to be cleared inside the view. Values in the array are
+ * top, right, bottom and left padding. Default is `[0, 0, 0, 0]`.
+ * @type {!Array.<number>}
+ * @api
+ */
+olx.view.FitGeometryOptions.prototype.padding;
+
+
+/**
+ * Constrain the resolution. Default is `true`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.view.FitGeometryOptions.prototype.constrainResolution;
+
+
+/**
+ * Get the nearest extent. Default is `false`.
+ * @type {boolean|undefined}
+ * @api
+ */
+olx.view.FitGeometryOptions.prototype.nearest;
+
+
+/**
+ * Minimum resolution that we zoom to. Default is `0`.
+ * @type {number|undefined}
+ * @api
+ */
+olx.view.FitGeometryOptions.prototype.minResolution;
+
+
+/**
+ * Maximum zoom level that we zoom to. If `minResolution` is given,
+ * this property is ignored.
+ * @type {number|undefined}
+ * @api
+ */
+olx.view.FitGeometryOptions.prototype.maxZoom;
+
+
+/* typedefs for object literals exposed by the library */
+
+
+/**
+ * @typedef {{animate: boolean,
+ *     attributions: Object.<string, ol.Attribution>,
+ *     coordinateToPixelMatrix: goog.vec.Mat4.Number,
+ *     extent: (null|ol.Extent),
+ *     focus: ol.Coordinate,
+ *     index: number,
+ *     layerStates: Object.<number, ol.layer.LayerState>,
+ *     layerStatesArray: Array.<ol.layer.LayerState>,
+ *     logos: Object.<string, string>,
+ *     pixelRatio: number,
+ *     pixelToCoordinateMatrix: goog.vec.Mat4.Number,
+ *     postRenderFunctions: Array.<ol.PostRenderFunction>,
+ *     size: ol.Size,
+ *     skippedFeatureUids: Object.<string, boolean>,
+ *     tileQueue: ol.TileQueue,
+ *     time: number,
+ *     usedTiles: Object.<string, Object.<string, ol.TileRange>>,
+ *     viewState: olx.ViewState,
+ *     viewHints: Array.<number>,
+ *     wantedTiles: Object.<string, Object.<string, boolean>>}}
+ * @api
+ */
+olx.FrameState;
+
+
+/**
+ * @type {number}
+ * @api
+ */
+olx.FrameState.prototype.pixelRatio;
+
+
+/**
+ * @type {number}
+ * @api
+ */
+olx.FrameState.prototype.time;
+
+
+/**
+ * @type {olx.ViewState}
+ * @api
+ */
+olx.FrameState.prototype.viewState;
+
+
+/**
+ * @typedef {{center: ol.Coordinate,
+ *     projection: ol.proj.Projection,
+ *     resolution: number,
+ *     rotation: number}}
+ * @api
+ */
+olx.ViewState;
+
+
+/**
+ * @type {ol.Coordinate}
+ * @api
+ */
+olx.ViewState.prototype.center;
+
+
+/**
+ * @type {number}
+ * @api
+ */
+olx.ViewState.prototype.resolution;
+
+
+/**
+ * @type {number}
+ * @api
+ */
+olx.ViewState.prototype.rotation;
+
+
+/**
+ * @typedef {{initialSize: (number|undefined),
+ *     maxSize: (number|undefined),
+ *     space: (number|undefined)}}
+ * @api
+ */
+olx.style.AtlasManagerOptions;
+
+
+/**
+ * The size in pixels of the first atlas image. If no value is given the
+ * `ol.INITIAL_ATLAS_SIZE` compile-time constant will be used.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.AtlasManagerOptions.prototype.initialSize;
+
+
+/**
+ * The maximum size in pixels of atlas images. If no value is given then
+ * the `ol.MAX_ATLAS_SIZE` compile-time constant will be used. And if
+ * `ol.MAX_ATLAS_SIZE` is set to `-1` (the default) then
+ * `ol.WEBGL_MAX_TEXTURE_SIZE` will used if WebGL is supported. Otherwise
+ * 2048 is used.
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.AtlasManagerOptions.prototype.maxSize;
+
+
+/**
+ * The space in pixels between images (default: 1).
+ * @type {number|undefined}
+ * @api
+ */
+olx.style.AtlasManagerOptions.prototype.space;
diff --git a/externs/proj4js.js b/externs/proj4js.js
new file mode 100644
index 0000000..aca6cfd
--- /dev/null
+++ b/externs/proj4js.js
@@ -0,0 +1,22 @@
+/**
+ * @externs
+ * @see http://proj4js.org/
+ */
+
+
+/**
+ * @param {...*} var_args
+ * @return {undefined|Array.<number>|Object.<{
+ *     forward: function(Array.<number>): Array.<number>,
+ *     inverse: function(Array.<number>): Array.<number>}>}
+ */
+var proj4 = function(var_args) {};
+
+
+/**
+ * @param {string} name
+ * @param {(string|Object)=} opt_def
+ * @return {undefined|Object.<string, Object.<{axis: string, units: string,
+ *     to_meter: number}>>}
+ */
+proj4.defs = function(name, opt_def) {};
diff --git a/externs/readme.md b/externs/readme.md
new file mode 100644
index 0000000..992c354
--- /dev/null
+++ b/externs/readme.md
@@ -0,0 +1,120 @@
+# Externs
+
+This directory contains externs files, which tell the Closure compiler about symbols and properties that it should not rename.
+
+## oli.js and olx.js
+
+These two files are special externs that belong to ol3, and this document explains their purpose and how they are used.
+
+### Prevent class properties from being renamed
+
+For events, we make properties available to the application. Methods can be made available by just marking them with the `@api` annotation directly where they are defined; properties should also be added to `oli.js`:
+
+```js
+/**
+ * @interface
+ */
+oli.MapBrowserEvent = function() {};
+
+/**
+ * @type {ol.Coordinate}
+ */
+oli.MapBrowserEvent.prototype.coordinate;
+```
+In the source file (`src/ol/MapBrowserEvent.js`), the class needs to implement this interface:
+```js
+/**
+ * ...
+ * @constructor
+ * @implements {oli.MapBrowserEvent}
+ */
+ol.MapBrowserEvent = function(type, map, browserEvent, opt_frameState) {
+
+  // ...
+
+  /**
+   * @type {ol.Coordinate}
+   * @api
+   */
+  this.coordinate = map.getEventCoordinate(this.originalEvent);
+
+  // ...
+
+};
+```
+
+### Override methods in custom classes
+
+For custom subclasses in applications, which can be created using `ol.inherits`, the API may want to make certain methods available to override. In addition to marking such methods as `@api`, they should also be added to an interface in `oli.js`:
+```js
+/**
+ * @interface
+ */
+oli.control.Control = function() {};
+
+/**
+ * @param {ol.Map} map Map.
+ * @return {undefined} Undefined.
+ */
+oli.control.Control.prototype.setMap = function(map) {};
+
+```
+This interface must be implemented by the class in the source file (`src/ol/control/control.js`):
+```js
+/**
+ * ...
+ * @constructor
+ * @implements {oli.control.Control}
+ */
+ol.control.Control = function(options) {
+  // ...
+};
+
+// ...
+
+/**
+ * Application subclasses may override this.
+ * @param {ol.Map} map Map.
+ * @api
+ */
+ol.control.Control.prototype.setMap = function(map) {
+  // ...
+};
+```
+See Custom controls example for an example of how this can be used.
+
+### Export object literals
+
+Object literals cannot be exported like classes. To make sure that their properties do not get renamed, they go in `olx.js`:
+```js
+/**
+ * @typedef {{element: (Element|undefined),
+ *     target: (Element|string|undefined)}}
+ * @api
+ */
+olx.control.ControlOptions;
+
+/**
+ * The element is the control's container element. This only needs to be
+ * specified if you're developing a custom control.
+ * @type {Element|undefined}
+ */
+olx.control.ControlOptions.prototype.element;
+
+/**
+ * Specify a target if you want the control to be rendered outside of the map's
+ * viewport.
+ * @type {Element|string|undefined}
+ */
+olx.control.ControlOptions.prototype.target;
+```
+In the source code, the name used for the typedef is used as type whenever this object literal is expected:
+```js
+/**
+ * ...
+ * @param {olx.control.ControlOptions} options Control options.
+ */
+ol.control.Control = function(options) {
+  // ...
+};
+```
diff --git a/externs/tilejson.js b/externs/tilejson.js
new file mode 100644
index 0000000..00ca83a
--- /dev/null
+++ b/externs/tilejson.js
@@ -0,0 +1,121 @@
+/**
+ * @externs
+ * @see https://github.com/mapbox/tilejson-spec
+ * @see https://github.com/mapbox/utfgrid-spec
+ */
+
+
+
+/**
+ * @constructor
+ */
+var TileJSON = function() {};
+
+
+/**
+ * @type {string}
+ */
+TileJSON.prototype.tilejson;
+
+
+/**
+ * @type {string|undefined}
+ */
+TileJSON.prototype.name;
+
+
+/**
+ * @type {string|undefined}
+ */
+TileJSON.prototype.description;
+
+
+/**
+ * @type {string|undefined}
+ */
+TileJSON.prototype.version;
+
+
+/**
+ * @type {string|undefined}
+ */
+TileJSON.prototype.attribution;
+
+
+/**
+ * @type {string|undefined}
+ */
+TileJSON.prototype.template;
+
+
+/**
+ * @type {string|undefined}
+ */
+TileJSON.prototype.legend;
+
+
+/**
+ * @type {string|undefined}
+ */
+TileJSON.prototype.scheme;
+
+
+/**
+ * @type {!Array.<string>}
+ */
+TileJSON.prototype.tiles;
+
+
+/**
+ * @type {!Array.<string>|undefined}
+ */
+TileJSON.prototype.grids;
+
+
+/**
+ * @type {number|undefined}
+ */
+TileJSON.prototype.minzoom;
+
+
+/**
+ * @type {number|undefined}
+ */
+TileJSON.prototype.maxzoom;
+
+
+/**
+ * @type {!Array.<number>|undefined}
+ */
+TileJSON.prototype.bounds;
+
+
+/**
+ * @type {!Array.<number>|undefined}
+ */
+TileJSON.prototype.center;
+
+
+
+/**
+ * @constructor
+ */
+var UTFGridJSON = function() {};
+
+
+/**
+ * @type {!Array.<string>}
+ */
+UTFGridJSON.prototype.grid;
+
+
+/**
+ * @type {!Array.<string>}
+ */
+UTFGridJSON.prototype.keys;
+
+
+/**
+ * @type {!Object.<string, Object>|undefined}
+ */
+UTFGridJSON.prototype.data;
diff --git a/externs/topojson.js b/externs/topojson.js
new file mode 100644
index 0000000..3a60650
--- /dev/null
+++ b/externs/topojson.js
@@ -0,0 +1,172 @@
+
+/**
+ * @fileoverview Externs for TopoJSON.
+ * @see https://github.com/mbostock/topojson/wiki/Specification
+ * @externs
+ */
+
+
+
+/**
+ * @constructor
+ */
+var TopoJSONTopology = function() {};
+
+
+/**
+ * @type {string}
+ */
+TopoJSONTopology.prototype.type;
+
+
+/**
+ * @type {TopoJSONTransform|undefined}
+ */
+TopoJSONTopology.prototype.transform;
+
+
+/**
+ * @type {Object.<string, (TopoJSONGeometry|TopoJSONGeometryCollection)>}
+ */
+TopoJSONTopology.prototype.objects;
+
+
+/**
+ * @type {!Array.<Array.<Array.<number>>>}
+ */
+TopoJSONTopology.prototype.arcs;
+
+
+
+/**
+ * @constructor
+ */
+var TopoJSONTransform = function() {};
+
+
+/**
+ * @type {!Array.<number>}
+ */
+TopoJSONTransform.prototype.scale;
+
+
+/**
+ * @type {!Array.<number>}
+ */
+TopoJSONTransform.prototype.translate;
+
+
+
+/**
+ * @constructor
+ */
+var TopoJSONGeometry = function() {};
+
+
+/**
+ * @type {string}
+ */
+TopoJSONGeometry.prototype.type;
+
+
+/**
+ * @type {string|number|undefined}
+ */
+TopoJSONGeometry.prototype.id;
+
+
+
+/**
+ * @constructor
+ */
+var TopoJSONGeometryCollection = function() {};
+
+
+/**
+ * @type {Array.<TopoJSONGeometry>}
+ */
+TopoJSONGeometryCollection.prototype.geometries;
+
+
+
+/**
+ * @constructor
+ * @extends {TopoJSONGeometry}
+ */
+var TopoJSONPoint = function() {};
+
+
+/**
+ * @type {!Array.<number>}
+ */
+TopoJSONPoint.prototype.coordinates;
+
+
+
+/**
+ * @constructor
+ * @extends {TopoJSONGeometry}
+ */
+var TopoJSONLineString = function() {};
+
+
+/**
+ * @type {!Array.<number>}
+ */
+TopoJSONLineString.prototype.arcs;
+
+
+
+/**
+ * @constructor
+ * @extends {TopoJSONGeometry}
+ */
+var TopoJSONPolygon = function() {};
+
+
+/**
+ * @type {!Array.<Array.<number>>}
+ */
+TopoJSONPolygon.prototype.arcs;
+
+
+
+/**
+ * @constructor
+ * @extends {TopoJSONGeometry}
+ */
+var TopoJSONMultiPoint = function() {};
+
+
+/**
+ * @type {!Array.<Array.<number>>}
+ */
+TopoJSONMultiPoint.prototype.coordinates;
+
+
+
+/**
+ * @constructor
+ * @extends {TopoJSONGeometry}
+ */
+var TopoJSONMultiLineString = function() {};
+
+
+/**
+ * @type {!Array.<Array.<number>>}
+ */
+TopoJSONMultiLineString.prototype.arcs;
+
+
+
+/**
+ * @constructor
+ * @extends {TopoJSONGeometry}
+ */
+var TopoJSONMultiPolygon = function() {};
+
+
+/**
+ * @type {!Array.<Array.<Array.<number>>>}
+ */
+TopoJSONMultiPolygon.prototype.arcs;
diff --git a/externs/vbarray.js b/externs/vbarray.js
new file mode 100644
index 0000000..187817f
--- /dev/null
+++ b/externs/vbarray.js
@@ -0,0 +1,46 @@
+/**
+ * @externs
+ * @see http://msdn.microsoft.com/en-us/library/y39d47w8(v=vs.94).aspx
+ */
+
+
+
+/**
+ * FIXME check argument type
+ * @constructor
+ * @param {VBArray|string} safeArray
+ */
+var VBArray = function(safeArray) {};
+
+
+/**
+ * @return {number}
+ */
+VBArray.prototype.dimensions = function() {};
+
+
+/**
+ * @param {...number} var_args
+ * @return {*}
+ */
+VBArray.prototype.getItem = function(var_args) {};
+
+
+/**
+ * @param {number=} opt_dimension
+ * @return {*}
+ */
+VBArray.prototype.lbound = function(opt_dimension) {};
+
+
+/**
+ * @return {Array.<number>}
+ */
+VBArray.prototype.toArray = function() {};
+
+
+/**
+ * @param {number=} opt_dimension
+ * @return {*}
+ */
+VBArray.prototype.ubound = function(opt_dimension) {};
diff --git a/externs/webgl-debug.js b/externs/webgl-debug.js
new file mode 100644
index 0000000..9f58038
--- /dev/null
+++ b/externs/webgl-debug.js
@@ -0,0 +1,98 @@
+/**
+ * @externs
+ * @see http://www.khronos.org/webgl/wiki/Debugging
+ * @see http://www.khronos.org/webgl/wiki/HandlingContextLost
+ */
+
+
+
+/**
+ * @constructor
+ * @extends {WebGLRenderingContext}
+ */
+var WebGLDebugRenderingContext = function() {};
+
+
+
+/**
+ * @constructor
+ * @extends {HTMLCanvasElement}
+ */
+var WebGLDebugLostContextSimulatingCanvas = function() {};
+
+
+/**
+ * @nosideeffects
+ * @return {number}
+ */
+WebGLDebugLostContextSimulatingCanvas.prototype.getNumCalls = function() {};
+
+
+/**
+ */
+WebGLDebugLostContextSimulatingCanvas.prototype.loseContext = function() {};
+
+
+/**
+ * @param {number} numCalls
+ */
+WebGLDebugLostContextSimulatingCanvas.prototype.loseContextInNCalls =
+    function(numCalls) {};
+
+
+/**
+ */
+WebGLDebugLostContextSimulatingCanvas.prototype.restoreContext = function() {};
+
+
+/**
+ * @param {number} timeout
+ */
+WebGLDebugLostContextSimulatingCanvas.prototype.setRestoreTimeout =
+    function(timeout) {};
+
+
+/**
+ * @type {Object}
+ */
+var WebGLDebugUtils = {};
+
+
+/**
+ * @nosideeffects
+ * @param {number} value
+ * @return {string}
+ */
+WebGLDebugUtils.glEnumToString = function(value) {};
+
+
+/**
+ * @nosideeffects
+ * @param {string} functionName
+ * @param {Array} args Args.
+ * @return {string} String.
+ */
+WebGLDebugUtils.glFunctionArgsToString = function(functionName, args) {};
+
+
+/**
+ * @param {WebGLRenderingContext} ctx
+ */
+WebGLDebugUtils.init = function(ctx) {};
+
+
+/**
+ * @param {HTMLCanvasElement} canvas
+ * @return {WebGLDebugLostContextSimulatingCanvas}
+ */
+WebGLDebugUtils.makeLostContextSimulatingCanvas = function(canvas) {};
+
+
+/**
+ * @param {WebGLRenderingContext} context
+ * @param {Function=} opt_onErrorFunc
+ * @param {Function=} opt_onFunc
+ * @return {WebGLDebugRenderingContext}
+ */
+WebGLDebugUtils.makeDebugContext =
+    function(context, opt_onErrorFunc, opt_onFunc) {};
diff --git a/licenses/APACHE-2.0.txt b/licenses/APACHE-2.0.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/licenses/APACHE-2.0.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/licenses/BSD-LICENSE.txt b/licenses/BSD-LICENSE.txt
new file mode 100644
index 0000000..aa321e6
--- /dev/null
+++ b/licenses/BSD-LICENSE.txt
@@ -0,0 +1,28 @@
+Redistribution and use of this software in source and binary forms, with or
+without modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above
+  copyright notice, this list of conditions and the
+  following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+  copyright notice, this list of conditions and the
+  following disclaimer in the documentation and/or other
+  materials provided with the distribution.
+
+* Neither the name of Yahoo! Inc. nor the names of its
+  contributors may be used to endorse or promote products
+  derived from this software without specific prior
+  written permission of Yahoo! Inc.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/licenses/MIT-LICENSE.txt b/licenses/MIT-LICENSE.txt
new file mode 100644
index 0000000..c9b44cb
--- /dev/null
+++ b/licenses/MIT-LICENSE.txt
@@ -0,0 +1,18 @@
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..278c0a5
--- /dev/null
+++ b/package.json
@@ -0,0 +1,52 @@
+{
+  "name": "openlayers",
+  "version": "3.1.1",
+  "description": "Build tools and sources for developing OpenLayers based mapping applications",
+  "keywords": [
+    "map",
+    "mapping",
+    "ol3"
+  ],
+  "homepage": "http://openlayers.org/",
+  "scripts": {
+    "install": "node tasks/install.js",
+    "postinstall": "closure-util update",
+    "start": "node tasks/serve.js",
+    "test": "node tasks/test.js"
+  },
+  "main": "dist/ol.js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/openlayers/ol3.git"
+  },
+  "license": "BSD",
+  "bugs": {
+    "url": "https://github.com/openlayers/ol3/issues"
+  },
+  "dependencies": {
+    "async": "0.9.0",
+    "closure-util": "1.2.0",
+    "fs-extra": "0.12.0",
+    "graceful-fs": "3.0.2",
+    "htmlparser2": "3.7.3",
+    "jsdoc": "3.3.0-alpha9",
+    "nomnom": "1.8.0",
+    "rbush": "1.3.4",
+    "temp": "0.8.1",
+    "walk": "2.3.4"
+  },
+  "devDependencies": {
+    "clean-css": "2.2.16",
+    "expect.js": "0.3.1",
+    "jquery": "2.1.1",
+    "jshint": "2.5.6",
+    "mocha": "1.21.5",
+    "mocha-phantomjs": "3.5.1",
+    "phantomjs": "1.9.10",
+    "proj4": "2.3.3",
+    "sinon": "1.10.3"
+  },
+  "ext": [
+    "rbush"
+  ]
+}
diff --git a/pake.py b/pake.py
new file mode 100644
index 0000000..25d9c98
--- /dev/null
+++ b/pake.py
@@ -0,0 +1,509 @@
+#!/usr/bin/env python
+
+import collections
+import contextlib
+import hashlib
+import logging
+import optparse
+import os
+import re
+import shutil
+import subprocess
+import tempfile
+import sys
+import time
+import urllib2
+
+
+logger = logging.getLogger(__name__)
+
+
+if hasattr(subprocess, 'check_output'):
+    check_output = subprocess.check_output
+else:
+    # Copied with minor modifications from the Python source code
+    # http://hg.python.org/cpython/file/9cb1366b251b/Lib/subprocess.py#l549
+    def check_output(*popenargs, **kwargs):
+        if 'stdout' in kwargs:
+            raise ValueError(
+                'stdout argument not allowed, it will be overridden.')
+        process = subprocess.Popen(stdout=subprocess.PIPE,
+                                   *popenargs, **kwargs)
+        output, unused_err = process.communicate()
+        retcode = process.poll()
+        if retcode:
+            cmd = kwargs.get("args")
+            if cmd is None:
+                cmd = popenargs[0]
+            raise subprocess.CalledProcessError(retcode, cmd, output=output)
+        return output
+
+
+class PakeError(RuntimeError):
+    pass
+
+
+class AmbiguousRuleError(PakeError):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __str__(self):
+        return '%r matches multiple rules' % (self.name,)
+
+
+class BuildError(PakeError):
+
+    def __init__(self, target, message):
+        self.target = target
+        self.message = message
+
+    def __str__(self):
+        return '%s: %s' % (self.target.name, self.message)
+
+
+class DuplicateTargetError(PakeError):
+
+    def __init__(self, target):
+        self.target = target
+
+    def __str__(self):
+        return 'duplicate target %r' % (self.target.name,)
+
+
+class UnknownTargetError(PakeError):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __str__(self):
+        return 'unknown target %r' % (self.name,)
+
+
+class Target(object):
+    """Target is the core object of pake.  It includes all of the target's name
+    (which may or may not correspond to a real file in the filesystem, see the
+    comments in virtual and TargetCollection below), the action to be performed
+    when this target is to be rebuilt, its dependencies, and various other
+    metadata."""
+
+    def __init__(self, name, action=None, clean=True, dependencies=(),
+                 help=None, help_group=None, makedirs=True, phony=False,
+                 precious=False):
+        self.name = name
+        self.action = action
+        self._clean = clean
+        self.dependencies = list(flatten(dependencies))
+        self.help = help
+        self.help_group = help_group
+        self._makedirs = makedirs
+        self.phony = phony
+        self.precious = precious
+        self.logger = logging.getLogger(self.name)
+        self.timestamp = None
+
+    def build(self, dry_run=False):
+        timestamp = 0
+        for dependency in self.dependencies:
+            target = targets.get(dependency)
+            timestamp = max(timestamp, target.build(dry_run=dry_run))
+        self.debug('build')
+        if self.timestamp is None:
+            if not self.phony and os.path.exists(self.name):
+                self.timestamp = os.stat(self.name).st_mtime
+            else:
+                self.timestamp = -1
+        if self.timestamp < timestamp:
+            self.debug('action')
+            if self._makedirs and not dry_run:
+                self.makedirs(os.path.dirname(self.name))
+            if self.action:
+                if self.action.__doc__:
+                    self.info(self.action.__doc__)
+                if not dry_run:
+                    self.action(self)
+            self.timestamp = timestamp or time.time()
+        return self.timestamp
+
+    @contextlib.contextmanager
+    def chdir(self, dir):
+        cwd = os.getcwd()
+        dir = dir % vars(variables)
+        self.info('cd %s', dir)
+        os.chdir(dir)
+        try:
+            yield dir
+        finally:
+            self.info('cd %s', cwd)
+            os.chdir(cwd)
+
+    def cp(self, *args):
+        args = flatten_expand_list(args)
+        dest = args.pop()
+        for arg in args:
+            self.info('cp %s %s', arg, dest)
+            shutil.copy(arg, dest)
+
+    def cp_r(self, *args):
+        args = flatten_expand_list(args)
+        dest = args.pop()
+        for arg in args:
+            self.info('cp -r %s %s', arg, dest)
+            shutil.copytree(arg, dest)
+
+    def clean(self, really=False, recurse=True):
+        if (self._clean or really) and not self.precious:
+            self.info('clean')
+            try:
+                os.remove(self.name)
+            except OSError:
+                pass
+        if recurse:
+            for dependency in self.dependencies:
+                targets.get(dependency).clean(really=really, recurse=recurse)
+
+    def debug(self, *args, **kwargs):
+        self.logger.debug(*args, **kwargs)
+
+    def download(self, url, md5=None, sha1=None):
+        content = urllib2.urlopen(url).read()
+        if md5 and hashlib.md5(content).hexdigest() != md5:
+            raise BuildError(self, 'corrupt download')
+        if sha1 and hashlib.sha1(content).hexdigest() != sha1:
+            raise BuildError(self, 'corrupt download')
+        with open(self.name, 'wb') as f:
+            f.write(content)
+
+    def error(self, message):
+        raise BuildError(self, message)
+
+    def graph(self, f, visited):
+        if self in visited:
+            return
+        visited.add(self)
+        for dependency in self.dependencies:
+            target = targets.get(dependency)
+            f.write('\t"%s" -> "%s";\n' % (self.name, target.name))
+            target.graph(f, visited)
+
+    def info(self, *args, **kwargs):
+        self.logger.info(*args, **kwargs)
+
+    def makedirs(self, path):
+        path = path % vars(variables)
+        if path and not os.path.exists(path):
+            self.info('mkdir -p %s', path)
+            os.makedirs(path)
+
+    def newer(self, *args):
+        args = flatten_expand_list(args)
+        return [arg for arg in args
+                if targets.get(arg).timestamp > self.timestamp]
+
+    def output(self, *args, **kwargs):
+        """output runs the command passed to it, saving the output of the
+        command to the contents of the target.  For example:
+            @target('ofile')
+            def ofile(t):
+                t.output('echo', '123')
+        After this target's action is executed, ofile will contain the string
+        "123"."""
+        args = flatten_expand_list(args)
+        self.info(' '.join(args))
+        try:
+            output = check_output(args, **kwargs)
+            with open(self.name, 'wb') as f:
+                f.write(output)
+        except subprocess.CalledProcessError as e:
+            self.clean(recurse=False)
+            self.error(e)
+
+    def rm_rf(self, *args):
+        """rm_rf recursively deletes the files and/or directories passed to
+        it."""
+        args = flatten_expand_list(args)
+        for arg in args:
+            self.info('rm -rf %s', arg)
+            shutil.rmtree(arg, ignore_errors=True)
+
+    def run(self, *args, **kwargs):
+        args = flatten_expand_list(args)
+        self.info(' '.join(args))
+        try:
+            subprocess.check_call(args, **kwargs)
+        except subprocess.CalledProcessError as e:
+            self.clean(recurse=False)
+            self.error(e)
+
+    @contextlib.contextmanager
+    def tempdir(self):
+        """tempdir creates a temporary directory, changes to it, and runs the
+        nested block of code.  However the nested block of code exits, tempdir
+        will delete the temporary directory permanently, before pake exits. For
+        example:
+            with t.tempdir():
+                # copy various files to $PWD (the temporary directory)
+                # zip up the contents of $PWD, or copy them somewhere else
+        However the above code exits (e.g. copy error or zip error), the
+        temporary directory will be cleaned up."""
+        tempdir = tempfile.mkdtemp()
+        self.info('mkdir -p %s', tempdir)
+        try:
+            yield tempdir
+        finally:
+            self.info('rm -rf %s', tempdir)
+            shutil.rmtree(tempdir, ignore_errors=True)
+
+    def touch(self):
+        """touch updates the timestamp of the target.  If the target already
+        exists as a file in the filesystem its timestamp is updated, otherwise
+        a new file is created with the current timestamp."""
+        if os.path.exists(self.name):
+            os.utime(self.name, None)
+        else:
+            with open(self.name, 'wb'):
+                pass
+
+
+class TargetCollection(object):
+    """TargetCollection implements a namespace for looking up build targets.
+    TargetCollection will first look for rules that match exactly, and then
+    - if no match is found - search through a list of regular expression-based
+    rules.  As soon as a regular expression match is found, that rule is added
+    to the list of rules that match exactly.  Typically, an invocation of pake
+    will only create a single TargetCollection."""
+
+    def __init__(self):
+        self.default = None
+        self.targets = {}
+
+    def add(self, target):
+        """add adds a concrete target to self, raising an error if the target
+        already exists.  If target is the first target to be added, it becomes
+        the default for this TargetCollection."""
+        if target.name in self.targets:
+            raise DuplicateTargetError(target)
+        self.targets[target.name] = target
+        if self.default is None:
+            self.default = target
+
+    def get(self, name):
+        """get searches for a target.  If it already exists, it is returned.
+        Otherwise, get searches through the defined rules, trying to find a
+        rule that matches.  If it finds a matching rule, a concrete target is
+        instantiated, cached, and returned.  If no match is found, a virtual
+        precious target is instantiated and returned."""
+        if name in self.targets:
+            return self.targets[name]
+        target = None
+        for regexp, f in rules.iteritems():
+            match = regexp.search(name)
+            if not match:
+                continue
+            if target is not None:
+                raise AmbiguousRuleError(name)
+            target = f(name, match)
+        if target is None:
+            if os.path.exists(name):
+                target = Target(name, precious=True)
+            else:
+                raise UnknownTargetError(name)
+        self.targets[name] = target
+        return target
+
+    def format_epilog(self, formatter):
+        helps_by_help_group = collections.defaultdict(dict)
+        max_name_len = 0
+        for name in sorted(self.targets):
+            target = self.targets[name]
+            if target.help is not None:
+                helps_by_help_group[target.help_group][name] = target.help
+                max_name_len = max(max_name_len, len(name))
+        lines = []
+        lines.append('Targets:\n')
+        format = '  %%-%ds  %%s\n' % (max_name_len,)
+        for help_group in sorted(helps_by_help_group.keys()):
+            helps = helps_by_help_group[help_group]
+            if help_group is not None:
+                lines.append('%s targets:\n' % (help_group,))
+            for name in sorted(helps.keys()):
+                lines.append(format % (name, helps[name]))
+        return ''.join(lines)
+
+
+class VariableCollection(object):
+    """VariableCollection implements an object with properties where the first
+    set of a property wins, and all further sets are ignored. For example:
+        vc = VariableCollection()
+        vc.FOO = 1    # First set of the property FOO
+        vc.FOO = 2    # Further sets of the property FOO are ignored, and do
+                      # not raise an error.  After this statement, vc.FOO is
+                      # still 1.
+        print vc.FOO  # Prints "1" """
+
+    def __init__(self, **kwargs):
+        for key, value in kwargs.iteritems():
+            setattr(self, key, value)
+
+    def __setattr__(self, key, value):
+        """Only set an attribute if it has not already been set.  First to set
+        the value is the winner."""
+        if not hasattr(self, key):
+            object.__setattr__(self, key, value)
+
+
+# targets is the single TargetCollection instance created for this invokation
+# of pake
+targets = TargetCollection()
+# rules is a dict of regular expressions to @rules where dynamically created
+# rules are registered.
+rules = {}
+# variables is the global set of substitution variables, where the first setter
+# takes priority.  The priority order is:
+# 1. Environment variables
+# 2. Command line arguments
+# 3. Internal Python settings in build.py
+variables = VariableCollection(**os.environ)
+
+
+def flatten(*args):
+    """flatten takes a variable number of arguments, each of which may or may
+    be not be a collection.Iterable, and yields the elements of each in
+    depth-first order.  In short, it flattens nested iterables into a single
+    collection.  For example, flatten(1, [2, (3, 4), 5], 6) yields 1, 2, 3, 4,
+    5, 6."""
+    for arg in args:
+        if (isinstance(arg, collections.Iterable) and
+                not isinstance(arg, basestring)):
+            for element in flatten(*arg):
+                yield element
+        else:
+            yield arg
+
+
+def flatten_expand_list(*args):
+    """flatten_expand_list applies flatten, treats each element as a string,
+    and formats each string according to the global value of variables."""
+    return list(arg % vars(variables) for arg in flatten(args))
+
+
+def ifind(*paths):
+    """ifind is an iterative version of os.walk, yielding all walked paths and
+    normalizing paths to use forward slashes."""
+    for path in paths:
+        for dirpath, dirnames, names in os.walk(path):
+            for name in names:
+                if os.sep == '/':
+                    yield os.path.join(dirpath, name)
+                else:
+                    yield '/'.join(dirpath.split(os.sep) + [name])
+
+
+def main(argv=sys.argv):
+    option_parser = optparse.OptionParser()
+    option_parser.add_option('-c', '--clean',
+                             action='store_true')
+    option_parser.add_option('-g', '--graph',
+                             action='store_true')
+    option_parser.add_option('-n', '--dry-run', '--just-print', '--recon',
+                             action='store_true')
+    option_parser.add_option('-r', '--really',
+                             action='store_true')
+    option_parser.add_option('-v', '--verbose',
+                             action='count', dest='logging_level')
+    option_parser.set_defaults(logging_level=0)
+    option_parser.format_epilog = targets.format_epilog
+    options, args = option_parser.parse_args(argv[1:])
+    logging.basicConfig(format='%(asctime)s %(name)s: %(message)s',
+                        level=logging.INFO - 10 * options.logging_level)
+    targets_ = []
+    for arg in args:
+        match = re.match(r'(?P<key>\w+)=(?P<value>.*)\Z', arg)
+        if match:
+            key, value = match.group('key', 'value')
+            if not hasattr(variables, key):
+                logger.error('%s is not a variable', key)
+            logger.debug('%s=%r', key, value)
+            object.__setattr__(variables, key, value)
+            continue
+        targets_.append(arg)
+    if not targets_:
+        targets_ = (targets.default.name,)
+    try:
+        for target in targets_:
+            target = targets.get(target)
+            if options.clean:
+                target.clean(really=options.really, recurse=True)
+            elif options.graph:
+                sys.stdout.write('digraph "%s" {\n' % (target.name,))
+                target.graph(sys.stdout, set())
+                sys.stdout.write('}\n')
+            else:
+                target.build(dry_run=options.dry_run)
+    except BuildError as e:
+        logger.error(e)
+        sys.exit(1)
+
+
+def output(*args):
+    """output captures the output of a single command.  It is typically used to
+    set variables that only need to be set once.  For example:
+        UNAME_A = output('uname', '-a')
+    If you need to capture the output of a command in a target, you should use
+    t.output."""
+    args = flatten_expand_list(args)
+    logger.debug(' '.join(args))
+    return check_output(args)
+
+
+def rule(pattern):
+    def f(targetmaker):
+        rules[re.compile(pattern)] = targetmaker
+    return f
+
+
+def target(name, *dependencies, **kwargs):
+    """The @target decorator describes the action needed to build a single
+    target file when its dependencies are out of date.  For example:
+        @target('hello', 'hello.c')
+        def hello(t):
+            t.run('gcc', '-o', t.name, t.dependencies)
+            # the above line will run gcc -o hello hello.c
+    See the documentation for Target to see the properties provide by the
+    target t."""
+    def f(action):
+        target = Target(name, action=action, dependencies=dependencies,
+                        **kwargs)
+        targets.add(target)
+    return f
+
+
+def virtual(name, *dependencies, **kwargs):
+    """virtual targets are metatargets.  They do not correspond to any real
+    file in the filesystem, even if a file with the same name already exists.
+    Virtual targets can be thought of as only existing for the duration of the
+    build.   Their up-to-dateness or otherwise is independent of any existence
+    or up-to-dateness of any actual file in the filesystem.  Typically they are
+    used to group actions such as "all", "build", or "test"."""
+    target = Target(name, dependencies=dependencies, clean=False, phony=True,
+                    **kwargs)
+    targets.add(target)
+
+
+def which(program):
+    """Returns the full path of a given argument or `None`.
+    See:
+    http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python"""
+    def is_exe(fpath):
+        return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
+    fpath, fname = os.path.split(program)
+    if fpath:
+        if is_exe(program):
+            return program
+    else:
+        for path in os.environ["PATH"].split(os.pathsep):
+            path = path.strip('"')
+            exe_file = os.path.join(path, program)
+            if is_exe(exe_file):
+                return exe_file
+    return None
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..6c244f7
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,2 @@
+http://closure-linter.googlecode.com/files/closure_linter-latest.tar.gz
+pystache
diff --git a/resources/bootstrap/css/bootstrap-responsive.css b/resources/bootstrap/css/bootstrap-responsive.css
new file mode 100644
index 0000000..fcd72f7
--- /dev/null
+++ b/resources/bootstrap/css/bootstrap-responsive.css
@@ -0,0 +1,1109 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+ at -ms-viewport {
+  width: device-width;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.visible-phone {
+  display: none !important;
+}
+
+.visible-tablet {
+  display: none !important;
+}
+
+.hidden-desktop {
+  display: none !important;
+}
+
+.visible-desktop {
+  display: inherit !important;
+}
+
+ at media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+
+ at media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+
+.visible-print {
+  display: none !important;
+}
+
+ at media print {
+  .visible-print {
+    display: inherit !important;
+  }
+  .hidden-print {
+    display: none !important;
+  }
+}
+
+ at media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 2.564102564102564%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+
+ at media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    min-height: 1px;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 2.7624309392265194%;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+
+ at media (max-width: 767px) {
+  body {
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom,
+  .navbar-static-top {
+    margin-right: -20px;
+    margin-left: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    width: auto;
+    clear: none;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .uneditable-input[class*="span"],
+  .row-fluid [class*="span"] {
+    display: block;
+    float: none;
+    width: 100%;
+    margin-left: 0;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="offset"]:first-child {
+    margin-left: 0;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 0;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    left: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade {
+    top: -100px;
+  }
+  .modal.fade.in {
+    top: 20px;
+  }
+}
+
+ at media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+  .media .pull-left,
+  .media .pull-right {
+    display: block;
+    float: none;
+    margin-bottom: 10px;
+  }
+  .media-object {
+    margin-right: 0;
+    margin-left: 0;
+  }
+  .modal {
+    top: 10px;
+    right: 10px;
+    left: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+
+ at media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-right: 10px;
+    padding-left: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #777777;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #777777;
+    -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+            border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .nav > li > a:focus,
+  .nav-collapse .dropdown-menu a:hover,
+  .nav-collapse .dropdown-menu a:focus {
+    background-color: #f2f2f2;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a,
+  .navbar-inverse .nav-collapse .dropdown-menu a {
+    color: #999999;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .nav > li > a:focus,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    padding: 0;
+    margin-top: 5px;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    display: none;
+    float: none;
+    max-width: none;
+    padding: 0;
+    margin: 0 15px;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .nav-collapse .open > .dropdown-menu {
+    display: block;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .nav > li > .dropdown-menu:before,
+  .nav-collapse .nav > li > .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #f2f2f2;
+    border-bottom: 1px solid #f2f2f2;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  }
+  .navbar-inverse .nav-collapse .navbar-form,
+  .navbar-inverse .nav-collapse .navbar-search {
+    border-top-color: #111111;
+    border-bottom-color: #111111;
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    height: 0;
+    overflow: hidden;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+}
+
+ at media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
diff --git a/resources/bootstrap/css/bootstrap-responsive.min.css b/resources/bootstrap/css/bootstrap-responsive.min.css
new file mode 100644
index 0000000..d1b7f4b
--- /dev/null
+++ b/resources/bootstrap/css/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none [...]
diff --git a/resources/bootstrap/css/bootstrap.css b/resources/bootstrap/css/bootstrap.css
new file mode 100644
index 0000000..2f56af3
--- /dev/null
+++ b/resources/bootstrap/css/bootstrap.css
@@ -0,0 +1,6158 @@
+/*!
+ * Bootstrap v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+audio:not([controls]) {
+  display: none;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+a:hover,
+a:active {
+  outline: 0;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+img {
+  width: auto\9;
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img,
+.google-maps img {
+  max-width: none;
+}
+
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button,
+html input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+
+label,
+select,
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+input[type="radio"],
+input[type="checkbox"] {
+  cursor: pointer;
+}
+
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+
+ at media print {
+  * {
+    color: #000 !important;
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !important;
+  }
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+  .ir a:after,
+  a[href^="javascript:"]:after,
+  a[href^="#"]:after {
+    content: "";
+  }
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+  thead {
+    display: table-header-group;
+  }
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+  img {
+    max-width: 100% !important;
+  }
+  @page  {
+    margin: 0.5cm;
+  }
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+}
+
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  background-color: #ffffff;
+}
+
+a {
+  color: #0088cc;
+  text-decoration: none;
+}
+
+a:hover,
+a:focus {
+  color: #005580;
+  text-decoration: underline;
+}
+
+.img-rounded {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.img-circle {
+  -webkit-border-radius: 500px;
+     -moz-border-radius: 500px;
+          border-radius: 500px;
+}
+
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row:after {
+  clear: both;
+}
+
+[class*="span"] {
+  float: left;
+  min-height: 1px;
+  margin-left: 20px;
+}
+
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.span12 {
+  width: 940px;
+}
+
+.span11 {
+  width: 860px;
+}
+
+.span10 {
+  width: 780px;
+}
+
+.span9 {
+  width: 700px;
+}
+
+.span8 {
+  width: 620px;
+}
+
+.span7 {
+  width: 540px;
+}
+
+.span6 {
+  width: 460px;
+}
+
+.span5 {
+  width: 380px;
+}
+
+.span4 {
+  width: 300px;
+}
+
+.span3 {
+  width: 220px;
+}
+
+.span2 {
+  width: 140px;
+}
+
+.span1 {
+  width: 60px;
+}
+
+.offset12 {
+  margin-left: 980px;
+}
+
+.offset11 {
+  margin-left: 900px;
+}
+
+.offset10 {
+  margin-left: 820px;
+}
+
+.offset9 {
+  margin-left: 740px;
+}
+
+.offset8 {
+  margin-left: 660px;
+}
+
+.offset7 {
+  margin-left: 580px;
+}
+
+.offset6 {
+  margin-left: 500px;
+}
+
+.offset5 {
+  margin-left: 420px;
+}
+
+.offset4 {
+  margin-left: 340px;
+}
+
+.offset3 {
+  margin-left: 260px;
+}
+
+.offset2 {
+  margin-left: 180px;
+}
+
+.offset1 {
+  margin-left: 100px;
+}
+
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row-fluid:after {
+  clear: both;
+}
+
+.row-fluid [class*="span"] {
+  display: block;
+  float: left;
+  width: 100%;
+  min-height: 30px;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+
+.row-fluid .controls-row [class*="span"] + [class*="span"] {
+  margin-left: 2.127659574468085%;
+}
+
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+
+.container:before,
+.container:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container:after {
+  clear: both;
+}
+
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container-fluid:after {
+  clear: both;
+}
+
+p {
+  margin: 0 0 10px;
+}
+
+.lead {
+  margin-bottom: 20px;
+  font-size: 21px;
+  font-weight: 200;
+  line-height: 30px;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong {
+  font-weight: bold;
+}
+
+em {
+  font-style: italic;
+}
+
+cite {
+  font-style: normal;
+}
+
+.muted {
+  color: #999999;
+}
+
+a.muted:hover,
+a.muted:focus {
+  color: #808080;
+}
+
+.text-warning {
+  color: #c09853;
+}
+
+a.text-warning:hover,
+a.text-warning:focus {
+  color: #a47e3c;
+}
+
+.text-error {
+  color: #b94a48;
+}
+
+a.text-error:hover,
+a.text-error:focus {
+  color: #953b39;
+}
+
+.text-info {
+  color: #3a87ad;
+}
+
+a.text-info:hover,
+a.text-info:focus {
+  color: #2d6987;
+}
+
+.text-success {
+  color: #468847;
+}
+
+a.text-success:hover,
+a.text-success:focus {
+  color: #356635;
+}
+
+.text-left {
+  text-align: left;
+}
+
+.text-right {
+  text-align: right;
+}
+
+.text-center {
+  text-align: center;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: bold;
+  line-height: 20px;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+
+h1,
+h2,
+h3 {
+  line-height: 40px;
+}
+
+h1 {
+  font-size: 38.5px;
+}
+
+h2 {
+  font-size: 31.5px;
+}
+
+h3 {
+  font-size: 24.5px;
+}
+
+h4 {
+  font-size: 17.5px;
+}
+
+h5 {
+  font-size: 14px;
+}
+
+h6 {
+  font-size: 11.9px;
+}
+
+h1 small {
+  font-size: 24.5px;
+}
+
+h2 small {
+  font-size: 17.5px;
+}
+
+h3 small {
+  font-size: 14px;
+}
+
+h4 small {
+  font-size: 14px;
+}
+
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+
+li {
+  line-height: 20px;
+}
+
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline,
+ol.inline {
+  margin-left: 0;
+  list-style: none;
+}
+
+ul.inline > li,
+ol.inline > li {
+  display: inline-block;
+  *display: inline;
+  padding-right: 5px;
+  padding-left: 5px;
+  *zoom: 1;
+}
+
+dl {
+  margin-bottom: 20px;
+}
+
+dt,
+dd {
+  line-height: 20px;
+}
+
+dt {
+  font-weight: bold;
+}
+
+dd {
+  margin-left: 10px;
+}
+
+.dl-horizontal {
+  *zoom: 1;
+}
+
+.dl-horizontal:before,
+.dl-horizontal:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.dl-horizontal:after {
+  clear: both;
+}
+
+.dl-horizontal dt {
+  float: left;
+  width: 160px;
+  overflow: hidden;
+  clear: left;
+  text-align: right;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.dl-horizontal dd {
+  margin-left: 180px;
+}
+
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+  margin-bottom: 0;
+  font-size: 17.5px;
+  font-weight: 300;
+  line-height: 1.25;
+}
+
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+
+blockquote.pull-right small:before {
+  content: '';
+}
+
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+code {
+  padding: 2px 4px;
+  color: #d14;
+  white-space: nowrap;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+
+pre code {
+  padding: 0;
+  color: inherit;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: transparent;
+  border: 0;
+}
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+form {
+  margin: 0 0 20px;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 10px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  vertical-align: middle;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+input,
+textarea,
+.uneditable-input {
+  width: 206px;
+}
+
+textarea {
+  height: auto;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+          transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  *margin-top: 0;
+  line-height: normal;
+}
+
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+
+select {
+  width: 220px;
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+}
+
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  cursor: not-allowed;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+
+.radio,
+.checkbox {
+  min-height: 20px;
+  padding-left: 20px;
+}
+
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -20px;
+}
+
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+
+.input-mini {
+  width: 60px;
+}
+
+.input-small {
+  width: 90px;
+}
+
+.input-medium {
+  width: 150px;
+}
+
+.input-large {
+  width: 210px;
+}
+
+.input-xlarge {
+  width: 270px;
+}
+
+.input-xxlarge {
+  width: 530px;
+}
+
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 926px;
+}
+
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 846px;
+}
+
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 766px;
+}
+
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 686px;
+}
+
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 606px;
+}
+
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 526px;
+}
+
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 446px;
+}
+
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 366px;
+}
+
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 286px;
+}
+
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 206px;
+}
+
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 126px;
+}
+
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 46px;
+}
+
+.controls-row {
+  *zoom: 1;
+}
+
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.controls-row:after {
+  clear: both;
+}
+
+.controls-row [class*="span"],
+.row-fluid .controls-row [class*="span"] {
+  float: left;
+}
+
+.controls-row .checkbox[class*="span"],
+.controls-row .radio[class*="span"] {
+  padding-top: 5px;
+}
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+
+.control-group.warning .control-label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+}
+
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+
+.control-group.error .control-label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+}
+
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+
+.control-group.success .control-label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+}
+
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+
+.control-group.info .control-label,
+.control-group.info .help-block,
+.control-group.info .help-inline {
+  color: #3a87ad;
+}
+
+.control-group.info .checkbox,
+.control-group.info .radio,
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  color: #3a87ad;
+}
+
+.control-group.info input,
+.control-group.info select,
+.control-group.info textarea {
+  border-color: #3a87ad;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.info input:focus,
+.control-group.info select:focus,
+.control-group.info textarea:focus {
+  border-color: #2d6987;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
+}
+
+.control-group.info .input-prepend .add-on,
+.control-group.info .input-append .add-on {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #3a87ad;
+}
+
+input:focus:invalid,
+textarea:focus:invalid,
+select:focus:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+
+input:focus:invalid:focus,
+textarea:focus:invalid:focus,
+select:focus:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+     -moz-box-shadow: 0 0 6px #f8b9b7;
+          box-shadow: 0 0 6px #f8b9b7;
+}
+
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-actions:after {
+  clear: both;
+}
+
+.help-block,
+.help-inline {
+  color: #595959;
+}
+
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  padding-left: 5px;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.input-append,
+.input-prepend {
+  display: inline-block;
+  margin-bottom: 10px;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input,
+.input-append .dropdown-menu,
+.input-prepend .dropdown-menu,
+.input-append .popover,
+.input-prepend .popover {
+  font-size: 14px;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  vertical-align: top;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn,
+.input-append .btn-group > .dropdown-toggle,
+.input-prepend .btn-group > .dropdown-toggle {
+  vertical-align: top;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-append input + .btn-group .btn:last-child,
+.input-append select + .btn-group .btn:last-child,
+.input-append .uneditable-input + .btn-group .btn:last-child {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-append .add-on,
+.input-append .btn,
+.input-append .btn-group {
+  margin-left: -1px;
+}
+
+.input-append .add-on:last-child,
+.input-append .btn:last-child,
+.input-append .btn-group:last-child > .dropdown-toggle {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-prepend.input-append input + .btn-group .btn,
+.input-prepend.input-append select + .btn-group .btn,
+.input-prepend.input-append .uneditable-input + .btn-group .btn {
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.input-prepend.input-append .btn-group:first-child {
+  margin-left: 0;
+}
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+/* Allow for input prepend/append in search forms */
+
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+.control-group {
+  margin-bottom: 10px;
+}
+
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-horizontal .control-group:after {
+  clear: both;
+}
+
+.form-horizontal .control-label {
+  float: left;
+  width: 160px;
+  padding-top: 5px;
+  text-align: right;
+}
+
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 180px;
+  *margin-left: 0;
+}
+
+.form-horizontal .controls:first-child {
+  *padding-left: 180px;
+}
+
+.form-horizontal .help-block {
+  margin-bottom: 0;
+}
+
+.form-horizontal input + .help-block,
+.form-horizontal select + .help-block,
+.form-horizontal textarea + .help-block,
+.form-horizontal .uneditable-input + .help-block,
+.form-horizontal .input-prepend + .help-block,
+.form-horizontal .input-append + .help-block {
+  margin-top: 10px;
+}
+
+.form-horizontal .form-actions {
+  padding-left: 180px;
+}
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+
+.table th {
+  font-weight: bold;
+}
+
+.table thead th {
+  vertical-align: bottom;
+}
+
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+
+.table .table {
+  background-color: #ffffff;
+}
+
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table-bordered thead:first-child tr:first-child > th:first-child,
+.table-bordered tbody:first-child tr:first-child > td:first-child,
+.table-bordered tbody:first-child tr:first-child > th:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered thead:first-child tr:first-child > th:last-child,
+.table-bordered tbody:first-child tr:first-child > td:last-child,
+.table-bordered tbody:first-child tr:first-child > th:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:first-child,
+.table-bordered tbody:last-child tr:last-child > td:first-child,
+.table-bordered tbody:last-child tr:last-child > th:first-child,
+.table-bordered tfoot:last-child tr:last-child > td:first-child,
+.table-bordered tfoot:last-child tr:last-child > th:first-child {
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child > th:last-child,
+.table-bordered tbody:last-child tr:last-child > td:last-child,
+.table-bordered tbody:last-child tr:last-child > th:last-child,
+.table-bordered tfoot:last-child tr:last-child > td:last-child,
+.table-bordered tfoot:last-child tr:last-child > th:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {
+  -webkit-border-bottom-left-radius: 0;
+          border-bottom-left-radius: 0;
+  -moz-border-radius-bottomleft: 0;
+}
+
+.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 0;
+          border-bottom-right-radius: 0;
+  -moz-border-radius-bottomright: 0;
+}
+
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-striped tbody > tr:nth-child(odd) > td,
+.table-striped tbody > tr:nth-child(odd) > th {
+  background-color: #f9f9f9;
+}
+
+.table-hover tbody tr:hover > td,
+.table-hover tbody tr:hover > th {
+  background-color: #f5f5f5;
+}
+
+table td[class*="span"],
+table th[class*="span"],
+.row-fluid table td[class*="span"],
+.row-fluid table th[class*="span"] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+
+.table td.span1,
+.table th.span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+
+.table td.span2,
+.table th.span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+
+.table td.span3,
+.table th.span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+
+.table td.span4,
+.table th.span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+
+.table td.span5,
+.table th.span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+
+.table td.span6,
+.table th.span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+
+.table td.span7,
+.table th.span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+
+.table td.span8,
+.table th.span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+
+.table td.span9,
+.table th.span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+
+.table td.span10,
+.table th.span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+
+.table td.span11,
+.table th.span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+
+.table td.span12,
+.table th.span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+
+.table tbody tr.success > td {
+  background-color: #dff0d8;
+}
+
+.table tbody tr.error > td {
+  background-color: #f2dede;
+}
+
+.table tbody tr.warning > td {
+  background-color: #fcf8e3;
+}
+
+.table tbody tr.info > td {
+  background-color: #d9edf7;
+}
+
+.table-hover tbody tr.success:hover > td {
+  background-color: #d0e9c6;
+}
+
+.table-hover tbody tr.error:hover > td {
+  background-color: #ebcccc;
+}
+
+.table-hover tbody tr.warning:hover > td {
+  background-color: #faf2cc;
+}
+
+.table-hover tbody tr.info:hover > td {
+  background-color: #c4e3f3;
+}
+
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  margin-top: 1px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+}
+
+/* White icons with optional class, or on hover/focus/active states of certain elements */
+
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:focus > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > li > a:focus > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:focus > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"],
+.dropdown-submenu:focus > a > [class*=" icon-"] {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+
+.icon-glass {
+  background-position: 0      0;
+}
+
+.icon-music {
+  background-position: -24px 0;
+}
+
+.icon-search {
+  background-position: -48px 0;
+}
+
+.icon-envelope {
+  background-position: -72px 0;
+}
+
+.icon-heart {
+  background-position: -96px 0;
+}
+
+.icon-star {
+  background-position: -120px 0;
+}
+
+.icon-star-empty {
+  background-position: -144px 0;
+}
+
+.icon-user {
+  background-position: -168px 0;
+}
+
+.icon-film {
+  background-position: -192px 0;
+}
+
+.icon-th-large {
+  background-position: -216px 0;
+}
+
+.icon-th {
+  background-position: -240px 0;
+}
+
+.icon-th-list {
+  background-position: -264px 0;
+}
+
+.icon-ok {
+  background-position: -288px 0;
+}
+
+.icon-remove {
+  background-position: -312px 0;
+}
+
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+
+.icon-off {
+  background-position: -384px 0;
+}
+
+.icon-signal {
+  background-position: -408px 0;
+}
+
+.icon-cog {
+  background-position: -432px 0;
+}
+
+.icon-trash {
+  background-position: -456px 0;
+}
+
+.icon-home {
+  background-position: 0 -24px;
+}
+
+.icon-file {
+  background-position: -24px -24px;
+}
+
+.icon-time {
+  background-position: -48px -24px;
+}
+
+.icon-road {
+  background-position: -72px -24px;
+}
+
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+
+.icon-download {
+  background-position: -120px -24px;
+}
+
+.icon-upload {
+  background-position: -144px -24px;
+}
+
+.icon-inbox {
+  background-position: -168px -24px;
+}
+
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+
+.icon-repeat {
+  background-position: -216px -24px;
+}
+
+.icon-refresh {
+  background-position: -240px -24px;
+}
+
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+
+.icon-lock {
+  background-position: -287px -24px;
+}
+
+.icon-flag {
+  background-position: -312px -24px;
+}
+
+.icon-headphones {
+  background-position: -336px -24px;
+}
+
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+
+.icon-barcode {
+  background-position: -456px -24px;
+}
+
+.icon-tag {
+  background-position: 0 -48px;
+}
+
+.icon-tags {
+  background-position: -25px -48px;
+}
+
+.icon-book {
+  background-position: -48px -48px;
+}
+
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+
+.icon-print {
+  background-position: -96px -48px;
+}
+
+.icon-camera {
+  background-position: -120px -48px;
+}
+
+.icon-font {
+  background-position: -144px -48px;
+}
+
+.icon-bold {
+  background-position: -167px -48px;
+}
+
+.icon-italic {
+  background-position: -192px -48px;
+}
+
+.icon-text-height {
+  background-position: -216px -48px;
+}
+
+.icon-text-width {
+  background-position: -240px -48px;
+}
+
+.icon-align-left {
+  background-position: -264px -48px;
+}
+
+.icon-align-center {
+  background-position: -288px -48px;
+}
+
+.icon-align-right {
+  background-position: -312px -48px;
+}
+
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+
+.icon-list {
+  background-position: -360px -48px;
+}
+
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+
+.icon-picture {
+  background-position: -456px -48px;
+}
+
+.icon-pencil {
+  background-position: 0 -72px;
+}
+
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+
+.icon-adjust {
+  background-position: -48px -72px;
+}
+
+.icon-tint {
+  background-position: -72px -72px;
+}
+
+.icon-edit {
+  background-position: -96px -72px;
+}
+
+.icon-share {
+  background-position: -120px -72px;
+}
+
+.icon-check {
+  background-position: -144px -72px;
+}
+
+.icon-move {
+  background-position: -168px -72px;
+}
+
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+
+.icon-backward {
+  background-position: -240px -72px;
+}
+
+.icon-play {
+  background-position: -264px -72px;
+}
+
+.icon-pause {
+  background-position: -288px -72px;
+}
+
+.icon-stop {
+  background-position: -312px -72px;
+}
+
+.icon-forward {
+  background-position: -336px -72px;
+}
+
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+
+.icon-eject {
+  background-position: -408px -72px;
+}
+
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+
+.icon-plus {
+  background-position: -408px -96px;
+}
+
+.icon-minus {
+  background-position: -433px -96px;
+}
+
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+
+.icon-gift {
+  background-position: -24px -120px;
+}
+
+.icon-leaf {
+  background-position: -48px -120px;
+}
+
+.icon-fire {
+  background-position: -72px -120px;
+}
+
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+
+.icon-plane {
+  background-position: -168px -120px;
+}
+
+.icon-calendar {
+  background-position: -192px -120px;
+}
+
+.icon-random {
+  width: 16px;
+  background-position: -216px -120px;
+}
+
+.icon-comment {
+  background-position: -240px -120px;
+}
+
+.icon-magnet {
+  background-position: -264px -120px;
+}
+
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+
+.icon-retweet {
+  background-position: -336px -120px;
+}
+
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+
+.icon-folder-close {
+  width: 16px;
+  background-position: -384px -120px;
+}
+
+.icon-folder-open {
+  width: 16px;
+  background-position: -408px -120px;
+}
+
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+
+.icon-hdd {
+  background-position: 0 -144px;
+}
+
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+
+.icon-bell {
+  background-position: -48px -144px;
+}
+
+.icon-certificate {
+  background-position: -72px -144px;
+}
+
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+
+.icon-globe {
+  background-position: -336px -144px;
+}
+
+.icon-wrench {
+  background-position: -360px -144px;
+}
+
+.icon-tasks {
+  background-position: -384px -144px;
+}
+
+.icon-filter {
+  background-position: -408px -144px;
+}
+
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.dropdown-menu > li > a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus,
+.dropdown-submenu:hover > a,
+.dropdown-submenu:focus > a {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  outline: 0;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  color: #999999;
+}
+
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+  background-image: none;
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.open {
+  *z-index: 1000;
+}
+
+.open > .dropdown-menu {
+  display: block;
+}
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+
+.dropdown-submenu {
+  position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+     -moz-border-radius: 0 6px 6px 6px;
+          border-radius: 0 6px 6px 6px;
+}
+
+.dropdown-submenu:hover > .dropdown-menu {
+  display: block;
+}
+
+.dropup .dropdown-submenu > .dropdown-menu {
+  top: auto;
+  bottom: 0;
+  margin-top: 0;
+  margin-bottom: -2px;
+  -webkit-border-radius: 5px 5px 5px 0;
+     -moz-border-radius: 5px 5px 5px 0;
+          border-radius: 5px 5px 5px 0;
+}
+
+.dropdown-submenu > a:after {
+  display: block;
+  float: right;
+  width: 0;
+  height: 0;
+  margin-top: 5px;
+  margin-right: -10px;
+  border-color: transparent;
+  border-left-color: #cccccc;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  content: " ";
+}
+
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+
+.dropdown-submenu.pull-left {
+  float: none;
+}
+
+.dropdown-submenu.pull-left > .dropdown-menu {
+  left: -100%;
+  margin-left: 10px;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.dropdown .dropdown-menu .nav-header {
+  padding-right: 20px;
+  padding-left: 20px;
+}
+
+.typeahead {
+  z-index: 1051;
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+     -moz-transition: opacity 0.15s linear;
+       -o-transition: opacity 0.15s linear;
+          transition: opacity 0.15s linear;
+}
+
+.fade.in {
+  opacity: 1;
+}
+
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  -webkit-transition: height 0.35s ease;
+     -moz-transition: height 0.35s ease;
+       -o-transition: height 0.35s ease;
+          transition: height 0.35s ease;
+}
+
+.collapse.in {
+  height: auto;
+}
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+
+.close:hover,
+.close:focus {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+
+.btn {
+  display: inline-block;
+  *display: inline;
+  padding: 4px 12px;
+  margin-bottom: 0;
+  *margin-left: .3em;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  cursor: pointer;
+  background-color: #f5f5f5;
+  *background-color: #e6e6e6;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  border: 1px solid #cccccc;
+  *border: 0;
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border-bottom-color: #b3b3b3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn:hover,
+.btn:focus,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+
+.btn:first-child {
+  *margin-left: 0;
+}
+
+.btn:hover,
+.btn:focus {
+  color: #333333;
+  text-decoration: none;
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+     -moz-transition: background-position 0.1s linear;
+       -o-transition: background-position 0.1s linear;
+          transition: background-position 0.1s linear;
+}
+
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.btn.active,
+.btn:active {
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-large {
+  padding: 11px 19px;
+  font-size: 17.5px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.btn-large [class^="icon-"],
+.btn-large [class*=" icon-"] {
+  margin-top: 4px;
+}
+
+.btn-small {
+  padding: 2px 10px;
+  font-size: 11.9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.btn-small [class^="icon-"],
+.btn-small [class*=" icon-"] {
+  margin-top: 0;
+}
+
+.btn-mini [class^="icon-"],
+.btn-mini [class*=" icon-"] {
+  margin-top: -1px;
+}
+
+.btn-mini {
+  padding: 0 6px;
+  font-size: 10.5px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+  width: 100%;
+}
+
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #006dcc;
+  *background-color: #0044cc;
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #0044cc;
+  *background-color: #003bb3;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #003399 \9;
+}
+
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  *background-color: #f89406;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  *background-color: #bd362f;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  *background-color: #51a351;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-repeat: repeat-x;
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  *background-color: #2f96b4;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  *background-color: #222222;
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-repeat: repeat-x;
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.btn-inverse:hover,
+.btn-inverse:focus,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+
+.btn-link,
+.btn-link:active,
+.btn-link[disabled] {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-link {
+  color: #0088cc;
+  cursor: pointer;
+  border-color: transparent;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-link:hover,
+.btn-link:focus {
+  color: #005580;
+  text-decoration: underline;
+  background-color: transparent;
+}
+
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus {
+  color: #333333;
+  text-decoration: none;
+}
+
+.btn-group {
+  position: relative;
+  display: inline-block;
+  *display: inline;
+  *margin-left: .3em;
+  font-size: 0;
+  white-space: nowrap;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.btn-group:first-child {
+  *margin-left: 0;
+}
+
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-toolbar {
+  margin-top: 10px;
+  margin-bottom: 10px;
+  font-size: 0;
+}
+
+.btn-toolbar > .btn + .btn,
+.btn-toolbar > .btn-group + .btn,
+.btn-toolbar > .btn + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+
+.btn-group > .btn,
+.btn-group > .dropdown-menu,
+.btn-group > .popover {
+  font-size: 14px;
+}
+
+.btn-group > .btn-mini {
+  font-size: 10.5px;
+}
+
+.btn-group > .btn-small {
+  font-size: 11.9px;
+}
+
+.btn-group > .btn-large {
+  font-size: 17.5px;
+}
+
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+  *padding-top: 5px;
+  padding-right: 8px;
+  *padding-bottom: 5px;
+  padding-left: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group > .btn-mini + .dropdown-toggle {
+  *padding-top: 2px;
+  padding-right: 5px;
+  *padding-bottom: 2px;
+  padding-left: 5px;
+}
+
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+
+.btn-group > .btn-large + .dropdown-toggle {
+  *padding-top: 7px;
+  padding-right: 12px;
+  *padding-bottom: 7px;
+  padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #0044cc;
+}
+
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+
+.btn-large .caret {
+  margin-top: 6px;
+}
+
+.btn-large .caret {
+  border-top-width: 5px;
+  border-right-width: 5px;
+  border-left-width: 5px;
+}
+
+.btn-mini .caret,
+.btn-small .caret {
+  margin-top: 8px;
+}
+
+.dropup .btn-large .caret {
+  border-bottom-width: 5px;
+}
+
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-group-vertical > .btn {
+  display: block;
+  float: none;
+  max-width: 100%;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group-vertical > .btn + .btn {
+  margin-top: -1px;
+  margin-left: 0;
+}
+
+.btn-group-vertical > .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.btn-group-vertical > .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.btn-group-vertical > .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+     -moz-border-radius: 6px 6px 0 0;
+          border-radius: 6px 6px 0 0;
+}
+
+.btn-group-vertical > .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.alert,
+.alert h4 {
+  color: #c09853;
+}
+
+.alert h4 {
+  margin: 0;
+}
+
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+
+.alert-success {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+
+.alert-success h4 {
+  color: #468847;
+}
+
+.alert-danger,
+.alert-error {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+
+.alert-danger h4,
+.alert-error h4 {
+  color: #b94a48;
+}
+
+.alert-info {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+
+.alert-info h4 {
+  color: #3a87ad;
+}
+
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+
+.alert-block p + p {
+  margin-top: 5px;
+}
+
+.nav {
+  margin-bottom: 20px;
+  margin-left: 0;
+  list-style: none;
+}
+
+.nav > li > a {
+  display: block;
+}
+
+.nav > li > a:hover,
+.nav > li > a:focus {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+
+.nav > li > a > img {
+  max-width: none;
+}
+
+.nav > .pull-right {
+  float: right;
+}
+
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+.nav-list {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-bottom: 0;
+}
+
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-right: -15px;
+  margin-left: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+
+.nav-list > .active > a,
+.nav-list > .active > a:hover,
+.nav-list > .active > a:focus {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0088cc;
+}
+
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+  margin-right: 2px;
+}
+
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover,
+.nav-tabs > li > a:focus {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover,
+.nav-tabs > .active > a:focus {
+  color: #555555;
+  cursor: default;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover,
+.nav-pills > .active > a:focus {
+  color: #ffffff;
+  background-color: #0088cc;
+}
+
+.nav-stacked > li {
+  float: none;
+}
+
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li > a:hover,
+.nav-tabs.nav-stacked > li > a:focus {
+  z-index: 2;
+  border-color: #ddd;
+}
+
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.nav .dropdown-toggle .caret {
+  margin-top: 6px;
+  border-top-color: #0088cc;
+  border-bottom-color: #0088cc;
+}
+
+.nav .dropdown-toggle:hover .caret,
+.nav .dropdown-toggle:focus .caret {
+  border-top-color: #005580;
+  border-bottom-color: #005580;
+}
+
+/* move down carets for tabs */
+
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.nav > .dropdown.active > a:hover,
+.nav > .dropdown.active > a:focus {
+  cursor: pointer;
+}
+
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover,
+.nav > li.dropdown.open.active > a:focus {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret,
+.nav li.dropdown.open a:focus .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+
+.tabs-stacked .open > a:hover,
+.tabs-stacked .open > a:focus {
+  border-color: #999999;
+}
+
+.tabbable {
+  *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.tabbable:after {
+  clear: both;
+}
+
+.tab-content {
+  overflow: auto;
+}
+
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.tabs-below > .nav-tabs > li > a:hover,
+.tabs-below > .nav-tabs > li > a:focus {
+  border-top-color: #ddd;
+  border-bottom-color: transparent;
+}
+
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover,
+.tabs-below > .nav-tabs > .active > a:focus {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.tabs-left > .nav-tabs > li > a:hover,
+.tabs-left > .nav-tabs > li > a:focus {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover,
+.tabs-left > .nav-tabs .active > a:focus {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.tabs-right > .nav-tabs > li > a:hover,
+.tabs-right > .nav-tabs > li > a:focus {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover,
+.tabs-right > .nav-tabs .active > a:focus {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+
+.nav > .disabled > a {
+  color: #999999;
+}
+
+.nav > .disabled > a:hover,
+.nav > .disabled > a:focus {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.navbar {
+  *position: relative;
+  *z-index: 2;
+  margin-bottom: 20px;
+  overflow: visible;
+}
+
+.navbar-inner {
+  min-height: 40px;
+  padding-right: 20px;
+  padding-left: 20px;
+  background-color: #fafafa;
+  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  border: 1px solid #d4d4d4;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+
+.navbar-inner:before,
+.navbar-inner:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-inner:after {
+  clear: both;
+}
+
+.navbar .container {
+  width: auto;
+}
+
+.nav-collapse.collapse {
+  height: auto;
+  overflow: visible;
+}
+
+.navbar .brand {
+  display: block;
+  float: left;
+  padding: 10px 20px 10px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #777777;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .brand:hover,
+.navbar .brand:focus {
+  text-decoration: none;
+}
+
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+  color: #777777;
+}
+
+.navbar-link {
+  color: #777777;
+}
+
+.navbar-link:hover,
+.navbar-link:focus {
+  color: #333333;
+}
+
+.navbar .divider-vertical {
+  height: 40px;
+  margin: 0 9px;
+  border-right: 1px solid #ffffff;
+  border-left: 1px solid #f2f2f2;
+}
+
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 5px;
+}
+
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn,
+.navbar .input-prepend .btn-group,
+.navbar .input-append .btn-group {
+  margin-top: 0;
+}
+
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-form:after {
+  clear: both;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 5px;
+  white-space: nowrap;
+}
+
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.navbar-static-top {
+  position: static;
+  margin-bottom: 0;
+}
+
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border-width: 0 0 1px;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  border-width: 1px 0 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.navbar-fixed-top {
+  top: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+
+.navbar .nav.pull-right {
+  float: right;
+  margin-right: 0;
+}
+
+.navbar .nav > li {
+  float: left;
+}
+
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 15px 10px;
+  color: #777777;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: transparent;
+}
+
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #555555;
+  text-decoration: none;
+  background-color: #e5e5e5;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-right: 5px;
+  margin-left: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #ededed;
+  *background-color: #e5e5e5;
+  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
+  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
+  background-repeat: repeat-x;
+  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:focus,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #e5e5e5;
+  *background-color: #d9d9d9;
+}
+
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #cccccc \9;
+}
+
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+     -moz-border-radius: 1px;
+          border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+  position: absolute;
+  top: -7px;
+  left: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+  position: absolute;
+  top: -6px;
+  left: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  top: auto;
+  bottom: -7px;
+  border-top: 7px solid #ccc;
+  border-bottom: 0;
+  border-top-color: rgba(0, 0, 0, 0.2);
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  top: auto;
+  bottom: -6px;
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+}
+
+.navbar .nav li.dropdown > a:hover .caret,
+.navbar .nav li.dropdown > a:focus .caret {
+  border-top-color: #333333;
+  border-bottom-color: #333333;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #555555;
+  background-color: #e5e5e5;
+}
+
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #777777;
+  border-bottom-color: #777777;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  right: 12px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  right: 13px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  right: 100%;
+  left: auto;
+  margin-right: -1px;
+  margin-left: 0;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  border-color: #252525;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+}
+
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover,
+.navbar-inverse .brand:focus,
+.navbar-inverse .nav > li > a:focus {
+  color: #ffffff;
+}
+
+.navbar-inverse .brand {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-text {
+  color: #999999;
+}
+
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover,
+.navbar-inverse .navbar-link:focus {
+  color: #ffffff;
+}
+
+.navbar-inverse .divider-vertical {
+  border-right-color: #222222;
+  border-left-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown > a:hover .caret,
+.navbar-inverse .nav li.dropdown > a:focus .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+     -moz-transition: none;
+       -o-transition: none;
+          transition: none;
+}
+
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  outline: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  *background-color: #040404;
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-repeat: repeat-x;
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:focus,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.breadcrumb > li {
+  display: inline-block;
+  *display: inline;
+  text-shadow: 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+
+.breadcrumb > li > .divider {
+  padding: 0 5px;
+  color: #ccc;
+}
+
+.breadcrumb > .active {
+  color: #999999;
+}
+
+.pagination {
+  margin: 20px 0;
+}
+
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  margin-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination ul > li {
+  display: inline;
+}
+
+.pagination ul > li > a,
+.pagination ul > li > span {
+  float: left;
+  padding: 4px 12px;
+  line-height: 20px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+
+.pagination ul > li > a:hover,
+.pagination ul > li > a:focus,
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  background-color: #f5f5f5;
+}
+
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+  color: #999999;
+  cursor: default;
+}
+
+.pagination ul > .disabled > span,
+.pagination ul > .disabled > a,
+.pagination ul > .disabled > a:hover,
+.pagination ul > .disabled > a:focus {
+  color: #999999;
+  cursor: default;
+  background-color: transparent;
+}
+
+.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > span {
+  border-left-width: 1px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > span {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.pagination-centered {
+  text-align: center;
+}
+
+.pagination-right {
+  text-align: right;
+}
+
+.pagination-large ul > li > a,
+.pagination-large ul > li > span {
+  padding: 11px 19px;
+  font-size: 17.5px;
+}
+
+.pagination-large ul > li:first-child > a,
+.pagination-large ul > li:first-child > span {
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.pagination-large ul > li:last-child > a,
+.pagination-large ul > li:last-child > span {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.pagination-mini ul > li:first-child > a,
+.pagination-small ul > li:first-child > a,
+.pagination-mini ul > li:first-child > span,
+.pagination-small ul > li:first-child > span {
+  -webkit-border-bottom-left-radius: 3px;
+          border-bottom-left-radius: 3px;
+  -webkit-border-top-left-radius: 3px;
+          border-top-left-radius: 3px;
+  -moz-border-radius-bottomleft: 3px;
+  -moz-border-radius-topleft: 3px;
+}
+
+.pagination-mini ul > li:last-child > a,
+.pagination-small ul > li:last-child > a,
+.pagination-mini ul > li:last-child > span,
+.pagination-small ul > li:last-child > span {
+  -webkit-border-top-right-radius: 3px;
+          border-top-right-radius: 3px;
+  -webkit-border-bottom-right-radius: 3px;
+          border-bottom-right-radius: 3px;
+  -moz-border-radius-topright: 3px;
+  -moz-border-radius-bottomright: 3px;
+}
+
+.pagination-small ul > li > a,
+.pagination-small ul > li > span {
+  padding: 2px 10px;
+  font-size: 11.9px;
+}
+
+.pagination-mini ul > li > a,
+.pagination-mini ul > li > span {
+  padding: 0 6px;
+  font-size: 10.5px;
+}
+
+.pager {
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+  *zoom: 1;
+}
+
+.pager:before,
+.pager:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.pager:after {
+  clear: both;
+}
+
+.pager li {
+  display: inline;
+}
+
+.pager li > a,
+.pager li > span {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.pager li > a:hover,
+.pager li > a:focus {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+
+.pager .next > a,
+.pager .next > span {
+  float: right;
+}
+
+.pager .previous > a,
+.pager .previous > span {
+  float: left;
+}
+
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+  color: #999999;
+  cursor: default;
+  background-color: #fff;
+}
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+
+.modal-backdrop.fade {
+  opacity: 0;
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.modal {
+  position: fixed;
+  top: 10%;
+  left: 50%;
+  z-index: 1050;
+  width: 560px;
+  margin-left: -280px;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  outline: none;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding-box;
+          background-clip: padding-box;
+}
+
+.modal.fade {
+  top: -25%;
+  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
+     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
+       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
+          transition: opacity 0.3s linear, top 0.3s ease-out;
+}
+
+.modal.fade.in {
+  top: 10%;
+}
+
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+
+.modal-header .close {
+  margin-top: 2px;
+}
+
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+
+.modal-body {
+  position: relative;
+  max-height: 400px;
+  padding: 15px;
+  overflow-y: auto;
+}
+
+.modal-form {
+  margin-bottom: 0;
+}
+
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+     -moz-box-shadow: inset 0 1px 0 #ffffff;
+          box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.modal-footer:after {
+  clear: both;
+}
+
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+
+.modal-footer .btn-block + .btn-block {
+  margin-left: 0;
+}
+
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  font-size: 11px;
+  line-height: 1.4;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  visibility: visible;
+}
+
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.tooltip.top {
+  padding: 5px 0;
+  margin-top: -3px;
+}
+
+.tooltip.right {
+  padding: 0 5px;
+  margin-left: 3px;
+}
+
+.tooltip.bottom {
+  padding: 5px 0;
+  margin-top: 3px;
+}
+
+.tooltip.left {
+  padding: 0 5px;
+  margin-left: -3px;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: #000000;
+  border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-right-color: #000000;
+  border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-left-color: #000000;
+  border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: #000000;
+  border-width: 0 5px 5px;
+}
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  max-width: 276px;
+  padding: 1px;
+  text-align: left;
+  white-space: normal;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.popover.top {
+  margin-top: -10px;
+}
+
+.popover.right {
+  margin-left: 10px;
+}
+
+.popover.bottom {
+  margin-top: 10px;
+}
+
+.popover.left {
+  margin-left: -10px;
+}
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  -webkit-border-radius: 5px 5px 0 0;
+     -moz-border-radius: 5px 5px 0 0;
+          border-radius: 5px 5px 0 0;
+}
+
+.popover-title:empty {
+  display: none;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
+
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.popover .arrow {
+  border-width: 11px;
+}
+
+.popover .arrow:after {
+  border-width: 10px;
+  content: "";
+}
+
+.popover.top .arrow {
+  bottom: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-top-color: #999;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  border-bottom-width: 0;
+}
+
+.popover.top .arrow:after {
+  bottom: 1px;
+  margin-left: -10px;
+  border-top-color: #ffffff;
+  border-bottom-width: 0;
+}
+
+.popover.right .arrow {
+  top: 50%;
+  left: -11px;
+  margin-top: -11px;
+  border-right-color: #999;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  border-left-width: 0;
+}
+
+.popover.right .arrow:after {
+  bottom: -10px;
+  left: 1px;
+  border-right-color: #ffffff;
+  border-left-width: 0;
+}
+
+.popover.bottom .arrow {
+  top: -11px;
+  left: 50%;
+  margin-left: -11px;
+  border-bottom-color: #999;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  border-top-width: 0;
+}
+
+.popover.bottom .arrow:after {
+  top: 1px;
+  margin-left: -10px;
+  border-bottom-color: #ffffff;
+  border-top-width: 0;
+}
+
+.popover.left .arrow {
+  top: 50%;
+  right: -11px;
+  margin-top: -11px;
+  border-left-color: #999;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  border-right-width: 0;
+}
+
+.popover.left .arrow:after {
+  right: 1px;
+  bottom: -10px;
+  border-left-color: #ffffff;
+  border-right-width: 0;
+}
+
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.thumbnails:after {
+  clear: both;
+}
+
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+     -moz-transition: all 0.2s ease-in-out;
+       -o-transition: all 0.2s ease-in-out;
+          transition: all 0.2s ease-in-out;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus {
+  border-color: #0088cc;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+
+.media,
+.media-body {
+  overflow: hidden;
+  *overflow: visible;
+  zoom: 1;
+}
+
+.media,
+.media .media {
+  margin-top: 15px;
+}
+
+.media:first-child {
+  margin-top: 0;
+}
+
+.media-object {
+  display: block;
+}
+
+.media-heading {
+  margin: 0 0 5px;
+}
+
+.media > .pull-left {
+  margin-right: 10px;
+}
+
+.media > .pull-right {
+  margin-left: 10px;
+}
+
+.media-list {
+  margin-left: 0;
+  list-style: none;
+}
+
+.label,
+.badge {
+  display: inline-block;
+  padding: 2px 4px;
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #999999;
+}
+
+.label {
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.badge {
+  padding-right: 9px;
+  padding-left: 9px;
+  -webkit-border-radius: 9px;
+     -moz-border-radius: 9px;
+          border-radius: 9px;
+}
+
+.label:empty,
+.badge:empty {
+  display: none;
+}
+
+a.label:hover,
+a.label:focus,
+a.badge:hover,
+a.badge:focus {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+
+ at -webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+ at -moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+ at -ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+ at -o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+
+ at keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress .bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+     -moz-transition: width 0.6s ease;
+       -o-transition: width 0.6s ease;
+          transition: width 0.6s ease;
+}
+
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+}
+
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+     -moz-background-size: 40px 40px;
+       -o-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+     -moz-animation: progress-bar-stripes 2s linear infinite;
+      -ms-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.accordion {
+  margin-bottom: 20px;
+}
+
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.accordion-heading {
+  border-bottom: 0;
+}
+
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+
+.accordion-toggle {
+  cursor: pointer;
+}
+
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel-inner > .item {
+  position: relative;
+  display: none;
+  -webkit-transition: 0.6s ease-in-out left;
+     -moz-transition: 0.6s ease-in-out left;
+       -o-transition: 0.6s ease-in-out left;
+          transition: 0.6s ease-in-out left;
+}
+
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+  display: block;
+  line-height: 1;
+}
+
+.carousel-inner > .active,
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  display: block;
+}
+
+.carousel-inner > .active {
+  left: 0;
+}
+
+.carousel-inner > .next,
+.carousel-inner > .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.carousel-inner > .next {
+  left: 100%;
+}
+
+.carousel-inner > .prev {
+  left: -100%;
+}
+
+.carousel-inner > .next.left,
+.carousel-inner > .prev.right {
+  left: 0;
+}
+
+.carousel-inner > .active.left {
+  left: -100%;
+}
+
+.carousel-inner > .active.right {
+  left: 100%;
+}
+
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+  background: #222222;
+  border: 3px solid #ffffff;
+  -webkit-border-radius: 23px;
+     -moz-border-radius: 23px;
+          border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+
+.carousel-control.right {
+  right: 15px;
+  left: auto;
+}
+
+.carousel-control:hover,
+.carousel-control:focus {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+
+.carousel-indicators {
+  position: absolute;
+  top: 15px;
+  right: 15px;
+  z-index: 5;
+  margin: 0;
+  list-style: none;
+}
+
+.carousel-indicators li {
+  display: block;
+  float: left;
+  width: 10px;
+  height: 10px;
+  margin-left: 5px;
+  text-indent: -999px;
+  background-color: #ccc;
+  background-color: rgba(255, 255, 255, 0.25);
+  border-radius: 5px;
+}
+
+.carousel-indicators .active {
+  background-color: #fff;
+}
+
+.carousel-caption {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 15px;
+  background: #333333;
+  background: rgba(0, 0, 0, 0.75);
+}
+
+.carousel-caption h4,
+.carousel-caption p {
+  line-height: 20px;
+  color: #ffffff;
+}
+
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+
+.carousel-caption p {
+  margin-bottom: 0;
+}
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  letter-spacing: -1px;
+  color: inherit;
+}
+
+.hero-unit li {
+  line-height: 30px;
+}
+
+.pull-right {
+  float: right;
+}
+
+.pull-left {
+  float: left;
+}
+
+.hide {
+  display: none;
+}
+
+.show {
+  display: block;
+}
+
+.invisible {
+  visibility: hidden;
+}
+
+.affix {
+  position: fixed;
+}
diff --git a/resources/bootstrap/css/bootstrap.min.css b/resources/bootstrap/css/bootstrap.min.css
new file mode 100644
index 0000000..c10c7f4
--- /dev/null
+++ b/resources/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.3.1
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:in [...]
diff --git a/resources/bootstrap/img/glyphicons-halflings-white.png b/resources/bootstrap/img/glyphicons-halflings-white.png
new file mode 100644
index 0000000..3bf6484
Binary files /dev/null and b/resources/bootstrap/img/glyphicons-halflings-white.png differ
diff --git a/resources/bootstrap/img/glyphicons-halflings.png b/resources/bootstrap/img/glyphicons-halflings.png
new file mode 100644
index 0000000..a996999
Binary files /dev/null and b/resources/bootstrap/img/glyphicons-halflings.png differ
diff --git a/resources/bootstrap/js/bootstrap.js b/resources/bootstrap/js/bootstrap.js
new file mode 100644
index 0000000..c298ee4
--- /dev/null
+++ b/resources/bootstrap/js/bootstrap.js
@@ -0,0 +1,2276 @@
+/* ===================================================
+ * bootstrap-transition.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
+ * ===================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
+   * ======================================================= */
+
+  $(function () {
+
+    $.support.transition = (function () {
+
+      var transitionEnd = (function () {
+
+        var el = document.createElement('bootstrap')
+          , transEndEventNames = {
+               'WebkitTransition' : 'webkitTransitionEnd'
+            ,  'MozTransition'    : 'transitionend'
+            ,  'OTransition'      : 'oTransitionEnd otransitionend'
+            ,  'transition'       : 'transitionend'
+            }
+          , name
+
+        for (name in transEndEventNames){
+          if (el.style[name] !== undefined) {
+            return transEndEventNames[name]
+          }
+        }
+
+      }())
+
+      return transitionEnd && {
+        end: transitionEnd
+      }
+
+    })()
+
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-alert.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* ALERT CLASS DEFINITION
+  * ====================== */
+
+  var dismiss = '[data-dismiss="alert"]'
+    , Alert = function (el) {
+        $(el).on('click', dismiss, this.close)
+      }
+
+  Alert.prototype.close = function (e) {
+    var $this = $(this)
+      , selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = $(selector)
+
+    e && e.preventDefault()
+
+    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
+
+    $parent.trigger(e = $.Event('close'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      $parent
+        .trigger('closed')
+        .remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent.on($.support.transition.end, removeElement) :
+      removeElement()
+  }
+
+
+ /* ALERT PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.alert
+
+  $.fn.alert = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('alert')
+      if (!data) $this.data('alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.alert.Constructor = Alert
+
+
+ /* ALERT NO CONFLICT
+  * ================= */
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+ /* ALERT DATA-API
+  * ============== */
+
+  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-button.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* BUTTON PUBLIC CLASS DEFINITION
+  * ============================== */
+
+  var Button = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.button.defaults, options)
+  }
+
+  Button.prototype.setState = function (state) {
+    var d = 'disabled'
+      , $el = this.$element
+      , data = $el.data()
+      , val = $el.is('input') ? 'val' : 'html'
+
+    state = state + 'Text'
+    data.resetText || $el.data('resetText', $el[val]())
+
+    $el[val](data[state] || this.options[state])
+
+    // push to event loop to allow forms to submit
+    setTimeout(function () {
+      state == 'loadingText' ?
+        $el.addClass(d).attr(d, d) :
+        $el.removeClass(d).removeAttr(d)
+    }, 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var $parent = this.$element.closest('[data-toggle="buttons-radio"]')
+
+    $parent && $parent
+      .find('.active')
+      .removeClass('active')
+
+    this.$element.toggleClass('active')
+  }
+
+
+ /* BUTTON PLUGIN DEFINITION
+  * ======================== */
+
+  var old = $.fn.button
+
+  $.fn.button = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('button')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('button', (data = new Button(this, options)))
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  $.fn.button.defaults = {
+    loadingText: 'loading...'
+  }
+
+  $.fn.button.Constructor = Button
+
+
+ /* BUTTON NO CONFLICT
+  * ================== */
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+ /* BUTTON DATA-API
+  * =============== */
+
+  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {
+    var $btn = $(e.target)
+    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+    $btn.button('toggle')
+  })
+
+}(window.jQuery);/* ==========================================================
+ * bootstrap-carousel.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* CAROUSEL CLASS DEFINITION
+  * ========================= */
+
+  var Carousel = function (element, options) {
+    this.$element = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options = options
+    this.options.pause == 'hover' && this.$element
+      .on('mouseenter', $.proxy(this.pause, this))
+      .on('mouseleave', $.proxy(this.cycle, this))
+  }
+
+  Carousel.prototype = {
+
+    cycle: function (e) {
+      if (!e) this.paused = false
+      if (this.interval) clearInterval(this.interval);
+      this.options.interval
+        && !this.paused
+        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+      return this
+    }
+
+  , getActiveIndex: function () {
+      this.$active = this.$element.find('.item.active')
+      this.$items = this.$active.parent().children()
+      return this.$items.index(this.$active)
+    }
+
+  , to: function (pos) {
+      var activeIndex = this.getActiveIndex()
+        , that = this
+
+      if (pos > (this.$items.length - 1) || pos < 0) return
+
+      if (this.sliding) {
+        return this.$element.one('slid', function () {
+          that.to(pos)
+        })
+      }
+
+      if (activeIndex == pos) {
+        return this.pause().cycle()
+      }
+
+      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+    }
+
+  , pause: function (e) {
+      if (!e) this.paused = true
+      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+        this.$element.trigger($.support.transition.end)
+        this.cycle(true)
+      }
+      clearInterval(this.interval)
+      this.interval = null
+      return this
+    }
+
+  , next: function () {
+      if (this.sliding) return
+      return this.slide('next')
+    }
+
+  , prev: function () {
+      if (this.sliding) return
+      return this.slide('prev')
+    }
+
+  , slide: function (type, next) {
+      var $active = this.$element.find('.item.active')
+        , $next = next || $active[type]()
+        , isCycling = this.interval
+        , direction = type == 'next' ? 'left' : 'right'
+        , fallback  = type == 'next' ? 'first' : 'last'
+        , that = this
+        , e
+
+      this.sliding = true
+
+      isCycling && this.pause()
+
+      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+
+      e = $.Event('slide', {
+        relatedTarget: $next[0]
+      , direction: direction
+      })
+
+      if ($next.hasClass('active')) return
+
+      if (this.$indicators.length) {
+        this.$indicators.find('.active').removeClass('active')
+        this.$element.one('slid', function () {
+          var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+          $nextIndicator && $nextIndicator.addClass('active')
+        })
+      }
+
+      if ($.support.transition && this.$element.hasClass('slide')) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $next.addClass(type)
+        $next[0].offsetWidth // force reflow
+        $active.addClass(direction)
+        $next.addClass(direction)
+        this.$element.one($.support.transition.end, function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () { that.$element.trigger('slid') }, 0)
+        })
+      } else {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $active.removeClass('active')
+        $next.addClass('active')
+        this.sliding = false
+        this.$element.trigger('slid')
+      }
+
+      isCycling && this.cycle()
+
+      return this
+    }
+
+  }
+
+
+ /* CAROUSEL PLUGIN DEFINITION
+  * ========================== */
+
+  var old = $.fn.carousel
+
+  $.fn.carousel = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('carousel')
+        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
+        , action = typeof option == 'string' ? option : options.slide
+      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  $.fn.carousel.defaults = {
+    interval: 5000
+  , pause: 'hover'
+  }
+
+  $.fn.carousel.Constructor = Carousel
+
+
+ /* CAROUSEL NO CONFLICT
+  * ==================== */
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+ /* CAROUSEL DATA-API
+  * ================= */
+
+  $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+    var $this = $(this), href
+      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      , options = $.extend({}, $target.data(), $this.data())
+      , slideIndex
+
+    $target.carousel(options)
+
+    if (slideIndex = $this.attr('data-slide-to')) {
+      $target.data('carousel').pause().to(slideIndex).cycle()
+    }
+
+    e.preventDefault()
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-collapse.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* COLLAPSE PUBLIC CLASS DEFINITION
+  * ================================ */
+
+  var Collapse = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.collapse.defaults, options)
+
+    if (this.options.parent) {
+      this.$parent = $(this.options.parent)
+    }
+
+    this.options.toggle && this.toggle()
+  }
+
+  Collapse.prototype = {
+
+    constructor: Collapse
+
+  , dimension: function () {
+      var hasWidth = this.$element.hasClass('width')
+      return hasWidth ? 'width' : 'height'
+    }
+
+  , show: function () {
+      var dimension
+        , scroll
+        , actives
+        , hasData
+
+      if (this.transitioning || this.$element.hasClass('in')) return
+
+      dimension = this.dimension()
+      scroll = $.camelCase(['scroll', dimension].join('-'))
+      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
+
+      if (actives && actives.length) {
+        hasData = actives.data('collapse')
+        if (hasData && hasData.transitioning) return
+        actives.collapse('hide')
+        hasData || actives.data('collapse', null)
+      }
+
+      this.$element[dimension](0)
+      this.transition('addClass', $.Event('show'), 'shown')
+      $.support.transition && this.$element[dimension](this.$element[0][scroll])
+    }
+
+  , hide: function () {
+      var dimension
+      if (this.transitioning || !this.$element.hasClass('in')) return
+      dimension = this.dimension()
+      this.reset(this.$element[dimension]())
+      this.transition('removeClass', $.Event('hide'), 'hidden')
+      this.$element[dimension](0)
+    }
+
+  , reset: function (size) {
+      var dimension = this.dimension()
+
+      this.$element
+        .removeClass('collapse')
+        [dimension](size || 'auto')
+        [0].offsetWidth
+
+      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
+
+      return this
+    }
+
+  , transition: function (method, startEvent, completeEvent) {
+      var that = this
+        , complete = function () {
+            if (startEvent.type == 'show') that.reset()
+            that.transitioning = 0
+            that.$element.trigger(completeEvent)
+          }
+
+      this.$element.trigger(startEvent)
+
+      if (startEvent.isDefaultPrevented()) return
+
+      this.transitioning = 1
+
+      this.$element[method]('in')
+
+      $.support.transition && this.$element.hasClass('collapse') ?
+        this.$element.one($.support.transition.end, complete) :
+        complete()
+    }
+
+  , toggle: function () {
+      this[this.$element.hasClass('in') ? 'hide' : 'show']()
+    }
+
+  }
+
+
+ /* COLLAPSE PLUGIN DEFINITION
+  * ========================== */
+
+  var old = $.fn.collapse
+
+  $.fn.collapse = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('collapse')
+        , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.collapse.defaults = {
+    toggle: true
+  }
+
+  $.fn.collapse.Constructor = Collapse
+
+
+ /* COLLAPSE NO CONFLICT
+  * ==================== */
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+ /* COLLAPSE DATA-API
+  * ================= */
+
+  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
+    var $this = $(this), href
+      , target = $this.attr('data-target')
+        || e.preventDefault()
+        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+      , option = $(target).data('collapse') ? 'toggle' : $this.data()
+    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+    $(target).collapse(option)
+  })
+
+}(window.jQuery);/* ============================================================
+ * bootstrap-dropdown.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+  * ========================= */
+
+  var toggle = '[data-toggle=dropdown]'
+    , Dropdown = function (element) {
+        var $el = $(element).on('click.dropdown.data-api', this.toggle)
+        $('html').on('click.dropdown.data-api', function () {
+          $el.parent().removeClass('open')
+        })
+      }
+
+  Dropdown.prototype = {
+
+    constructor: Dropdown
+
+  , toggle: function (e) {
+      var $this = $(this)
+        , $parent
+        , isActive
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      clearMenus()
+
+      if (!isActive) {
+        $parent.toggleClass('open')
+      }
+
+      $this.focus()
+
+      return false
+    }
+
+  , keydown: function (e) {
+      var $this
+        , $items
+        , $active
+        , $parent
+        , isActive
+        , index
+
+      if (!/(38|40|27)/.test(e.keyCode)) return
+
+      $this = $(this)
+
+      e.preventDefault()
+      e.stopPropagation()
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      if (!isActive || (isActive && e.keyCode == 27)) {
+        if (e.which == 27) $parent.find(toggle).focus()
+        return $this.click()
+      }
+
+      $items = $('[role=menu] li:not(.divider):visible a', $parent)
+
+      if (!$items.length) return
+
+      index = $items.index($items.filter(':focus'))
+
+      if (e.keyCode == 38 && index > 0) index--                                        // up
+      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+      if (!~index) index = 0
+
+      $items
+        .eq(index)
+        .focus()
+    }
+
+  }
+
+  function clearMenus() {
+    $(toggle).each(function () {
+      getParent($(this)).removeClass('open')
+    })
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = selector && $(selector)
+
+    if (!$parent || !$parent.length) $parent = $this.parent()
+
+    return $parent
+  }
+
+
+  /* DROPDOWN PLUGIN DEFINITION
+   * ========================== */
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('dropdown')
+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+ /* DROPDOWN NO CONFLICT
+  * ==================== */
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  /* APPLY TO STANDARD DROPDOWN ELEMENTS
+   * =================================== */
+
+  $(document)
+    .on('click.dropdown.data-api', clearMenus)
+    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.dropdown-menu', function (e) { e.stopPropagation() })
+    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
+    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+
+}(window.jQuery);
+/* =========================================================
+ * bootstrap-modal.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#modals
+ * =========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================= */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* MODAL CLASS DEFINITION
+  * ====================== */
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$element = $(element)
+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
+  }
+
+  Modal.prototype = {
+
+      constructor: Modal
+
+    , toggle: function () {
+        return this[!this.isShown ? 'show' : 'hide']()
+      }
+
+    , show: function () {
+        var that = this
+          , e = $.Event('show')
+
+        this.$element.trigger(e)
+
+        if (this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = true
+
+        this.escape()
+
+        this.backdrop(function () {
+          var transition = $.support.transition && that.$element.hasClass('fade')
+
+          if (!that.$element.parent().length) {
+            that.$element.appendTo(document.body) //don't move modals dom position
+          }
+
+          that.$element.show()
+
+          if (transition) {
+            that.$element[0].offsetWidth // force reflow
+          }
+
+          that.$element
+            .addClass('in')
+            .attr('aria-hidden', false)
+
+          that.enforceFocus()
+
+          transition ?
+            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
+            that.$element.focus().trigger('shown')
+
+        })
+      }
+
+    , hide: function (e) {
+        e && e.preventDefault()
+
+        var that = this
+
+        e = $.Event('hide')
+
+        this.$element.trigger(e)
+
+        if (!this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = false
+
+        this.escape()
+
+        $(document).off('focusin.modal')
+
+        this.$element
+          .removeClass('in')
+          .attr('aria-hidden', true)
+
+        $.support.transition && this.$element.hasClass('fade') ?
+          this.hideWithTransition() :
+          this.hideModal()
+      }
+
+    , enforceFocus: function () {
+        var that = this
+        $(document).on('focusin.modal', function (e) {
+          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
+            that.$element.focus()
+          }
+        })
+      }
+
+    , escape: function () {
+        var that = this
+        if (this.isShown && this.options.keyboard) {
+          this.$element.on('keyup.dismiss.modal', function ( e ) {
+            e.which == 27 && that.hide()
+          })
+        } else if (!this.isShown) {
+          this.$element.off('keyup.dismiss.modal')
+        }
+      }
+
+    , hideWithTransition: function () {
+        var that = this
+          , timeout = setTimeout(function () {
+              that.$element.off($.support.transition.end)
+              that.hideModal()
+            }, 500)
+
+        this.$element.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          that.hideModal()
+        })
+      }
+
+    , hideModal: function () {
+        var that = this
+        this.$element.hide()
+        this.backdrop(function () {
+          that.removeBackdrop()
+          that.$element.trigger('hidden')
+        })
+      }
+
+    , removeBackdrop: function () {
+        this.$backdrop && this.$backdrop.remove()
+        this.$backdrop = null
+      }
+
+    , backdrop: function (callback) {
+        var that = this
+          , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+        if (this.isShown && this.options.backdrop) {
+          var doAnimate = $.support.transition && animate
+
+          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+            .appendTo(document.body)
+
+          this.$backdrop.click(
+            this.options.backdrop == 'static' ?
+              $.proxy(this.$element[0].focus, this.$element[0])
+            : $.proxy(this.hide, this)
+          )
+
+          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+          this.$backdrop.addClass('in')
+
+          if (!callback) return
+
+          doAnimate ?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (!this.isShown && this.$backdrop) {
+          this.$backdrop.removeClass('in')
+
+          $.support.transition && this.$element.hasClass('fade')?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (callback) {
+          callback()
+        }
+      }
+  }
+
+
+ /* MODAL PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.modal
+
+  $.fn.modal = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('modal')
+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option]()
+      else if (options.show) data.show()
+    })
+  }
+
+  $.fn.modal.defaults = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+ /* MODAL NO CONFLICT
+  * ================= */
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+ /* MODAL DATA-API
+  * ============== */
+
+  $(document).on('click.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this = $(this)
+      , href = $this.attr('href')
+      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())
+
+    e.preventDefault()
+
+    $target
+      .modal(option)
+      .one('hide', function () {
+        $this.focus()
+      })
+  })
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-tooltip.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TOOLTIP PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Tooltip = function (element, options) {
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.prototype = {
+
+    constructor: Tooltip
+
+  , init: function (type, element, options) {
+      var eventIn
+        , eventOut
+        , triggers
+        , trigger
+        , i
+
+      this.type = type
+      this.$element = $(element)
+      this.options = this.getOptions(options)
+      this.enabled = true
+
+      triggers = this.options.trigger.split(' ')
+
+      for (i = triggers.length; i--;) {
+        trigger = triggers[i]
+        if (trigger == 'click') {
+          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+        } else if (trigger != 'manual') {
+          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'
+          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'
+          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+        }
+      }
+
+      this.options.selector ?
+        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+        this.fixTitle()
+    }
+
+  , getOptions: function (options) {
+      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)
+
+      if (options.delay && typeof options.delay == 'number') {
+        options.delay = {
+          show: options.delay
+        , hide: options.delay
+        }
+      }
+
+      return options
+    }
+
+  , enter: function (e) {
+      var defaults = $.fn[this.type].defaults
+        , options = {}
+        , self
+
+      this._options && $.each(this._options, function (key, value) {
+        if (defaults[key] != value) options[key] = value
+      }, this)
+
+      self = $(e.currentTarget)[this.type](options).data(this.type)
+
+      if (!self.options.delay || !self.options.delay.show) return self.show()
+
+      clearTimeout(this.timeout)
+      self.hoverState = 'in'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'in') self.show()
+      }, self.options.delay.show)
+    }
+
+  , leave: function (e) {
+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+      if (this.timeout) clearTimeout(this.timeout)
+      if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+      self.hoverState = 'out'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'out') self.hide()
+      }, self.options.delay.hide)
+    }
+
+  , show: function () {
+      var $tip
+        , pos
+        , actualWidth
+        , actualHeight
+        , placement
+        , tp
+        , e = $.Event('show')
+
+      if (this.hasContent() && this.enabled) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $tip = this.tip()
+        this.setContent()
+
+        if (this.options.animation) {
+          $tip.addClass('fade')
+        }
+
+        placement = typeof this.options.placement == 'function' ?
+          this.options.placement.call(this, $tip[0], this.$element[0]) :
+          this.options.placement
+
+        $tip
+          .detach()
+          .css({ top: 0, left: 0, display: 'block' })
+
+        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+        pos = this.getPosition()
+
+        actualWidth = $tip[0].offsetWidth
+        actualHeight = $tip[0].offsetHeight
+
+        switch (placement) {
+          case 'bottom':
+            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'top':
+            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'left':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
+            break
+          case 'right':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
+            break
+        }
+
+        this.applyPlacement(tp, placement)
+        this.$element.trigger('shown')
+      }
+    }
+
+  , applyPlacement: function(offset, placement){
+      var $tip = this.tip()
+        , width = $tip[0].offsetWidth
+        , height = $tip[0].offsetHeight
+        , actualWidth
+        , actualHeight
+        , delta
+        , replace
+
+      $tip
+        .offset(offset)
+        .addClass(placement)
+        .addClass('in')
+
+      actualWidth = $tip[0].offsetWidth
+      actualHeight = $tip[0].offsetHeight
+
+      if (placement == 'top' && actualHeight != height) {
+        offset.top = offset.top + height - actualHeight
+        replace = true
+      }
+
+      if (placement == 'bottom' || placement == 'top') {
+        delta = 0
+
+        if (offset.left < 0){
+          delta = offset.left * -2
+          offset.left = 0
+          $tip.offset(offset)
+          actualWidth = $tip[0].offsetWidth
+          actualHeight = $tip[0].offsetHeight
+        }
+
+        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+      } else {
+        this.replaceArrow(actualHeight - height, actualHeight, 'top')
+      }
+
+      if (replace) $tip.offset(offset)
+    }
+
+  , replaceArrow: function(delta, dimension, position){
+      this
+        .arrow()
+        .css(position, delta ? (50 * (1 - delta / dimension) + "%") : '')
+    }
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+
+      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+      $tip.removeClass('fade in top bottom left right')
+    }
+
+  , hide: function () {
+      var that = this
+        , $tip = this.tip()
+        , e = $.Event('hide')
+
+      this.$element.trigger(e)
+      if (e.isDefaultPrevented()) return
+
+      $tip.removeClass('in')
+
+      function removeWithAnimation() {
+        var timeout = setTimeout(function () {
+          $tip.off($.support.transition.end).detach()
+        }, 500)
+
+        $tip.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          $tip.detach()
+        })
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        removeWithAnimation() :
+        $tip.detach()
+
+      this.$element.trigger('hidden')
+
+      return this
+    }
+
+  , fixTitle: function () {
+      var $e = this.$element
+      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+      }
+    }
+
+  , hasContent: function () {
+      return this.getTitle()
+    }
+
+  , getPosition: function () {
+      var el = this.$element[0]
+      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+        width: el.offsetWidth
+      , height: el.offsetHeight
+      }, this.$element.offset())
+    }
+
+  , getTitle: function () {
+      var title
+        , $e = this.$element
+        , o = this.options
+
+      title = $e.attr('data-original-title')
+        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+      return title
+    }
+
+  , tip: function () {
+      return this.$tip = this.$tip || $(this.options.template)
+    }
+
+  , arrow: function(){
+      return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
+    }
+
+  , validate: function () {
+      if (!this.$element[0].parentNode) {
+        this.hide()
+        this.$element = null
+        this.options = null
+      }
+    }
+
+  , enable: function () {
+      this.enabled = true
+    }
+
+  , disable: function () {
+      this.enabled = false
+    }
+
+  , toggleEnabled: function () {
+      this.enabled = !this.enabled
+    }
+
+  , toggle: function (e) {
+      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this
+      self.tip().hasClass('in') ? self.hide() : self.show()
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  }
+
+
+ /* TOOLTIP PLUGIN DEFINITION
+  * ========================= */
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tooltip')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tooltip.Constructor = Tooltip
+
+  $.fn.tooltip.defaults = {
+    animation: true
+  , placement: 'top'
+  , selector: false
+  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+  , trigger: 'hover focus'
+  , title: ''
+  , delay: 0
+  , html: false
+  , container: false
+  }
+
+
+ /* TOOLTIP NO CONFLICT
+  * =================== */
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-popover.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* POPOVER PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+
+  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
+     ========================================== */
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
+
+    constructor: Popover
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+        , content = this.getContent()
+
+      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)
+
+      $tip.removeClass('fade top bottom left right in')
+    }
+
+  , hasContent: function () {
+      return this.getTitle() || this.getContent()
+    }
+
+  , getContent: function () {
+      var content
+        , $e = this.$element
+        , o = this.options
+
+      content = (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
+        || $e.attr('data-content')
+
+      return content
+    }
+
+  , tip: function () {
+      if (!this.$tip) {
+        this.$tip = $(this.options.template)
+      }
+      return this.$tip
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  })
+
+
+ /* POPOVER PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.popover
+
+  $.fn.popover = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('popover')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.popover.Constructor = Popover
+
+  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
+    placement: 'right'
+  , trigger: 'click'
+  , content: ''
+  , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+ /* POPOVER NO CONFLICT
+  * =================== */
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(window.jQuery);
+/* =============================================================
+ * bootstrap-scrollspy.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* SCROLLSPY CLASS DEFINITION
+  * ========================== */
+
+  function ScrollSpy(element, options) {
+    var process = $.proxy(this.process, this)
+      , $element = $(element).is('body') ? $(window) : $(element)
+      , href
+    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
+    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
+    this.selector = (this.options.target
+      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      || '') + ' .nav li > a'
+    this.$body = $('body')
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.prototype = {
+
+      constructor: ScrollSpy
+
+    , refresh: function () {
+        var self = this
+          , $targets
+
+        this.offsets = $([])
+        this.targets = $([])
+
+        $targets = this.$body
+          .find(this.selector)
+          .map(function () {
+            var $el = $(this)
+              , href = $el.data('target') || $el.attr('href')
+              , $href = /^#\w/.test(href) && $(href)
+            return ( $href
+              && $href.length
+              && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null
+          })
+          .sort(function (a, b) { return a[0] - b[0] })
+          .each(function () {
+            self.offsets.push(this[0])
+            self.targets.push(this[1])
+          })
+      }
+
+    , process: function () {
+        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+          , maxScroll = scrollHeight - this.$scrollElement.height()
+          , offsets = this.offsets
+          , targets = this.targets
+          , activeTarget = this.activeTarget
+          , i
+
+        if (scrollTop >= maxScroll) {
+          return activeTarget != (i = targets.last()[0])
+            && this.activate ( i )
+        }
+
+        for (i = offsets.length; i--;) {
+          activeTarget != targets[i]
+            && scrollTop >= offsets[i]
+            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+            && this.activate( targets[i] )
+        }
+      }
+
+    , activate: function (target) {
+        var active
+          , selector
+
+        this.activeTarget = target
+
+        $(this.selector)
+          .parent('.active')
+          .removeClass('active')
+
+        selector = this.selector
+          + '[data-target="' + target + '"],'
+          + this.selector + '[href="' + target + '"]'
+
+        active = $(selector)
+          .parent('li')
+          .addClass('active')
+
+        if (active.parent('.dropdown-menu').length)  {
+          active = active.closest('li.dropdown').addClass('active')
+        }
+
+        active.trigger('activate')
+      }
+
+  }
+
+
+ /* SCROLLSPY PLUGIN DEFINITION
+  * =========================== */
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('scrollspy')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+  $.fn.scrollspy.defaults = {
+    offset: 10
+  }
+
+
+ /* SCROLLSPY NO CONFLICT
+  * ===================== */
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+ /* SCROLLSPY DATA-API
+  * ================== */
+
+  $(window).on('load', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      $spy.scrollspy($spy.data())
+    })
+  })
+
+}(window.jQuery);/* ========================================================
+ * bootstrap-tab.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
+ * ========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ======================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TAB CLASS DEFINITION
+  * ==================== */
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.prototype = {
+
+    constructor: Tab
+
+  , show: function () {
+      var $this = this.element
+        , $ul = $this.closest('ul:not(.dropdown-menu)')
+        , selector = $this.attr('data-target')
+        , previous
+        , $target
+        , e
+
+      if (!selector) {
+        selector = $this.attr('href')
+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+      }
+
+      if ( $this.parent('li').hasClass('active') ) return
+
+      previous = $ul.find('.active:last a')[0]
+
+      e = $.Event('show', {
+        relatedTarget: previous
+      })
+
+      $this.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      $target = $(selector)
+
+      this.activate($this.parent('li'), $ul)
+      this.activate($target, $target.parent(), function () {
+        $this.trigger({
+          type: 'shown'
+        , relatedTarget: previous
+        })
+      })
+    }
+
+  , activate: function ( element, container, callback) {
+      var $active = container.find('> .active')
+        , transition = callback
+            && $.support.transition
+            && $active.hasClass('fade')
+
+      function next() {
+        $active
+          .removeClass('active')
+          .find('> .dropdown-menu > .active')
+          .removeClass('active')
+
+        element.addClass('active')
+
+        if (transition) {
+          element[0].offsetWidth // reflow for transition
+          element.addClass('in')
+        } else {
+          element.removeClass('fade')
+        }
+
+        if ( element.parent('.dropdown-menu') ) {
+          element.closest('li.dropdown').addClass('active')
+        }
+
+        callback && callback()
+      }
+
+      transition ?
+        $active.one($.support.transition.end, next) :
+        next()
+
+      $active.removeClass('in')
+    }
+  }
+
+
+ /* TAB PLUGIN DEFINITION
+  * ===================== */
+
+  var old = $.fn.tab
+
+  $.fn.tab = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tab')
+      if (!data) $this.data('tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tab.Constructor = Tab
+
+
+ /* TAB NO CONFLICT
+  * =============== */
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+ /* TAB DATA-API
+  * ============ */
+
+  $(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+    e.preventDefault()
+    $(this).tab('show')
+  })
+
+}(window.jQuery);/* =============================================================
+ * bootstrap-typeahead.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============================================================ */
+
+
+!function($){
+
+  "use strict"; // jshint ;_;
+
+
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
+  * ================================= */
+
+  var Typeahead = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.typeahead.defaults, options)
+    this.matcher = this.options.matcher || this.matcher
+    this.sorter = this.options.sorter || this.sorter
+    this.highlighter = this.options.highlighter || this.highlighter
+    this.updater = this.options.updater || this.updater
+    this.source = this.options.source
+    this.$menu = $(this.options.menu)
+    this.shown = false
+    this.listen()
+  }
+
+  Typeahead.prototype = {
+
+    constructor: Typeahead
+
+  , select: function () {
+      var val = this.$menu.find('.active').attr('data-value')
+      this.$element
+        .val(this.updater(val))
+        .change()
+      return this.hide()
+    }
+
+  , updater: function (item) {
+      return item
+    }
+
+  , show: function () {
+      var pos = $.extend({}, this.$element.position(), {
+        height: this.$element[0].offsetHeight
+      })
+
+      this.$menu
+        .insertAfter(this.$element)
+        .css({
+          top: pos.top + pos.height
+        , left: pos.left
+        })
+        .show()
+
+      this.shown = true
+      return this
+    }
+
+  , hide: function () {
+      this.$menu.hide()
+      this.shown = false
+      return this
+    }
+
+  , lookup: function (event) {
+      var items
+
+      this.query = this.$element.val()
+
+      if (!this.query || this.query.length < this.options.minLength) {
+        return this.shown ? this.hide() : this
+      }
+
+      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
+
+      return items ? this.process(items) : this
+    }
+
+  , process: function (items) {
+      var that = this
+
+      items = $.grep(items, function (item) {
+        return that.matcher(item)
+      })
+
+      items = this.sorter(items)
+
+      if (!items.length) {
+        return this.shown ? this.hide() : this
+      }
+
+      return this.render(items.slice(0, this.options.items)).show()
+    }
+
+  , matcher: function (item) {
+      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
+    }
+
+  , sorter: function (items) {
+      var beginswith = []
+        , caseSensitive = []
+        , caseInsensitive = []
+        , item
+
+      while (item = items.shift()) {
+        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
+        else if (~item.indexOf(this.query)) caseSensitive.push(item)
+        else caseInsensitive.push(item)
+      }
+
+      return beginswith.concat(caseSensitive, caseInsensitive)
+    }
+
+  , highlighter: function (item) {
+      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
+      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
+        return '<strong>' + match + '</strong>'
+      })
+    }
+
+  , render: function (items) {
+      var that = this
+
+      items = $(items).map(function (i, item) {
+        i = $(that.options.item).attr('data-value', item)
+        i.find('a').html(that.highlighter(item))
+        return i[0]
+      })
+
+      items.first().addClass('active')
+      this.$menu.html(items)
+      return this
+    }
+
+  , next: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , next = active.next()
+
+      if (!next.length) {
+        next = $(this.$menu.find('li')[0])
+      }
+
+      next.addClass('active')
+    }
+
+  , prev: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , prev = active.prev()
+
+      if (!prev.length) {
+        prev = this.$menu.find('li').last()
+      }
+
+      prev.addClass('active')
+    }
+
+  , listen: function () {
+      this.$element
+        .on('focus',    $.proxy(this.focus, this))
+        .on('blur',     $.proxy(this.blur, this))
+        .on('keypress', $.proxy(this.keypress, this))
+        .on('keyup',    $.proxy(this.keyup, this))
+
+      if (this.eventSupported('keydown')) {
+        this.$element.on('keydown', $.proxy(this.keydown, this))
+      }
+
+      this.$menu
+        .on('click', $.proxy(this.click, this))
+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))
+    }
+
+  , eventSupported: function(eventName) {
+      var isSupported = eventName in this.$element
+      if (!isSupported) {
+        this.$element.setAttribute(eventName, 'return;')
+        isSupported = typeof this.$element[eventName] === 'function'
+      }
+      return isSupported
+    }
+
+  , move: function (e) {
+      if (!this.shown) return
+
+      switch(e.keyCode) {
+        case 9: // tab
+        case 13: // enter
+        case 27: // escape
+          e.preventDefault()
+          break
+
+        case 38: // up arrow
+          e.preventDefault()
+          this.prev()
+          break
+
+        case 40: // down arrow
+          e.preventDefault()
+          this.next()
+          break
+      }
+
+      e.stopPropagation()
+    }
+
+  , keydown: function (e) {
+      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])
+      this.move(e)
+    }
+
+  , keypress: function (e) {
+      if (this.suppressKeyPressRepeat) return
+      this.move(e)
+    }
+
+  , keyup: function (e) {
+      switch(e.keyCode) {
+        case 40: // down arrow
+        case 38: // up arrow
+        case 16: // shift
+        case 17: // ctrl
+        case 18: // alt
+          break
+
+        case 9: // tab
+        case 13: // enter
+          if (!this.shown) return
+          this.select()
+          break
+
+        case 27: // escape
+          if (!this.shown) return
+          this.hide()
+          break
+
+        default:
+          this.lookup()
+      }
+
+      e.stopPropagation()
+      e.preventDefault()
+  }
+
+  , focus: function (e) {
+      this.focused = true
+    }
+
+  , blur: function (e) {
+      this.focused = false
+      if (!this.mousedover && this.shown) this.hide()
+    }
+
+  , click: function (e) {
+      e.stopPropagation()
+      e.preventDefault()
+      this.select()
+      this.$element.focus()
+    }
+
+  , mouseenter: function (e) {
+      this.mousedover = true
+      this.$menu.find('.active').removeClass('active')
+      $(e.currentTarget).addClass('active')
+    }
+
+  , mouseleave: function (e) {
+      this.mousedover = false
+      if (!this.focused && this.shown) this.hide()
+    }
+
+  }
+
+
+  /* TYPEAHEAD PLUGIN DEFINITION
+   * =========================== */
+
+  var old = $.fn.typeahead
+
+  $.fn.typeahead = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('typeahead')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.typeahead.defaults = {
+    source: []
+  , items: 8
+  , menu: '<ul class="typeahead dropdown-menu"></ul>'
+  , item: '<li><a href="#"></a></li>'
+  , minLength: 1
+  }
+
+  $.fn.typeahead.Constructor = Typeahead
+
+
+ /* TYPEAHEAD NO CONFLICT
+  * =================== */
+
+  $.fn.typeahead.noConflict = function () {
+    $.fn.typeahead = old
+    return this
+  }
+
+
+ /* TYPEAHEAD DATA-API
+  * ================== */
+
+  $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
+    var $this = $(this)
+    if ($this.data('typeahead')) return
+    $this.typeahead($this.data())
+  })
+
+}(window.jQuery);
+/* ==========================================================
+ * bootstrap-affix.js v2.3.1
+ * http://twitter.github.com/bootstrap/javascript.html#affix
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* AFFIX CLASS DEFINITION
+  * ====================== */
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, $.fn.affix.defaults, options)
+    this.$window = $(window)
+      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))
+    this.$element = $(element)
+    this.checkPosition()
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+      , scrollTop = this.$window.scrollTop()
+      , position = this.$element.offset()
+      , offset = this.options.offset
+      , offsetBottom = offset.bottom
+      , offsetTop = offset.top
+      , reset = 'affix affix-top affix-bottom'
+      , affix
+
+    if (typeof offset != 'object') offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function') offsetTop = offset.top()
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
+      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
+      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
+      'top'    : false
+
+    if (this.affixed === affix) return
+
+    this.affixed = affix
+    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
+  }
+
+
+ /* AFFIX PLUGIN DEFINITION
+  * ======================= */
+
+  var old = $.fn.affix
+
+  $.fn.affix = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('affix')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.affix.Constructor = Affix
+
+  $.fn.affix.defaults = {
+    offset: 0
+  }
+
+
+ /* AFFIX NO CONFLICT
+  * ================= */
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+ /* AFFIX DATA-API
+  * ============== */
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+        , data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
+      data.offsetTop && (data.offset.top = data.offsetTop)
+
+      $spy.affix(data)
+    })
+  })
+
+
+}(window.jQuery);
\ No newline at end of file
diff --git a/resources/bootstrap/js/bootstrap.min.js b/resources/bootstrap/js/bootstrap.min.js
new file mode 100644
index 0000000..95c5ac5
--- /dev/null
+++ b/resources/bootstrap/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=funct [...]
\ No newline at end of file
diff --git a/resources/display-frame-rate.js b/resources/display-frame-rate.js
new file mode 100644
index 0000000..241e0af
--- /dev/null
+++ b/resources/display-frame-rate.js
@@ -0,0 +1,39 @@
+/**
+ * Display frame rate in a span element added to the navigation bar.
+ */
+(function() {
+
+  var container = document.querySelector('.navbar .navbar-inner .container');
+  if (!container) {
+    return;
+  }
+
+  if (!window.requestAnimationFrame) {
+    return;
+  }
+
+  var fpsElement = document.createElement('span');
+  fpsElement.style.color = 'white';
+
+  container.appendChild(fpsElement);
+
+  var frameCount = 0;
+  var begin = +new Date();
+
+  window.setInterval(function() {
+    var end = +new Date();
+    var milliseconds = end - begin;
+    var seconds = milliseconds / 1000.0;
+    var frameRate = frameCount / seconds;
+    fpsElement.innerHTML = frameRate.toPrecision(4) + ' fps';
+    frameCount = 0;
+    begin = end;
+  }, 500);
+
+  var go = function() {
+    frameCount++;
+    window.requestAnimationFrame(go);
+  };
+  go();
+
+})();
diff --git a/resources/example-behaviour.js b/resources/example-behaviour.js
new file mode 100644
index 0000000..2d54501
--- /dev/null
+++ b/resources/example-behaviour.js
@@ -0,0 +1,261 @@
+;(function() {
+  if (window.location.host === 'localhost:3000') {
+    return;
+  }
+  var container = $('.navbar .navbar-inner .container')[0],
+      form = document.createElement('form'),
+      select = document.createElement('select'),
+      possibleModes = {
+        'raw' : 'Development',
+        'advanced': 'Production'
+      },
+      urlMode = window.location.href.match(/mode=([a-z0-9\-]+)\&?/i),
+      curMode = urlMode ? urlMode[1] : 'advanced',
+      option,
+      modeIdx,
+      mode,
+      modeTxt,
+      modeChangedMethod;
+
+  if (!container) {
+    return;
+  }
+
+  modeChangedMethod = function() {
+    var newMode = this.value,
+        search = window.location.search.substring(1),
+        baseUrl = window.location.href.split('?')[0],
+        chunks = search ? search.split('&') : [],
+        pairs = [],
+        i,
+        pair,
+        adjusted;
+    for (i = chunks.length - 1; i >= 0; --i) {
+      pair = chunks[i].split('=');
+      if (pair[0].toLowerCase() === 'mode') {
+        pair[1] = newMode;
+      }
+      adjusted = encodeURIComponent(pair[0]);
+      if (typeof pair[1] !== undefined) {
+        adjusted += '=' + encodeURIComponent(pair[1] || '');
+      }
+      pairs.push(adjusted);
+    }
+    if (pairs.length === 0) {
+      pairs[0] = 'mode=' + encodeURIComponent(newMode);
+    }
+    location.href = baseUrl + '?' + pairs.join('&');
+  };
+
+  for (mode in possibleModes) {
+    if ( possibleModes.hasOwnProperty(mode) ) {
+      option = document.createElement('option');
+      modeTxt = possibleModes[mode];
+      option.value = mode;
+      option.innerHTML = modeTxt;
+      option.selected = curMode === mode;
+      select.appendChild(option);
+    }
+  }
+
+  $(select).change(modeChangedMethod);
+  select.className = 'input-medium';
+
+  form.className = 'navbar-form pull-right';
+  form.appendChild(select);
+
+  container.appendChild(form);
+})();
+
+var exampleNS = {};
+
+exampleNS.getRendererFromQueryString = function() {
+  var obj = {}, queryString = location.search.slice(1),
+      re = /([^&=]+)=([^&]*)/g, m;
+
+  while (m = re.exec(queryString)) {
+    obj[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
+  }
+  if ('renderers' in obj) {
+    return obj['renderers'].split(',');
+  } else if ('renderer' in obj) {
+    return [obj['renderer']];
+  } else {
+    return undefined;
+  }
+};
+
+/*\
+|*|
+|*|  Base64 / binary data / UTF-8 strings utilities
+|*|
+|*|  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding
+|*|
+\*/
+
+/* Array of bytes to base64 string decoding */
+
+function b64ToUint6 (nChr) {
+
+  return nChr > 64 && nChr < 91 ?
+      nChr - 65
+    : nChr > 96 && nChr < 123 ?
+      nChr - 71
+    : nChr > 47 && nChr < 58 ?
+      nChr + 4
+    : nChr === 43 ?
+      62
+    : nChr === 47 ?
+      63
+    :
+      0;
+
+}
+
+function base64DecToArr (sBase64, nBlocksSize) {
+
+  var
+    sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length,
+    nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2) / nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2, taBytes = new Uint8Array(nOutLen);
+
+  for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {
+    nMod4 = nInIdx & 3;
+    nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
+    if (nMod4 === 3 || nInLen - nInIdx === 1) {
+      for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
+        taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
+      }
+      nUint24 = 0;
+
+    }
+  }
+
+  return taBytes;
+}
+
+/* Base64 string to array encoding */
+
+function uint6ToB64 (nUint6) {
+
+  return nUint6 < 26 ?
+      nUint6 + 65
+    : nUint6 < 52 ?
+      nUint6 + 71
+    : nUint6 < 62 ?
+      nUint6 - 4
+    : nUint6 === 62 ?
+      43
+    : nUint6 === 63 ?
+      47
+    :
+      65;
+
+}
+
+function base64EncArr (aBytes) {
+
+  var nMod3 = 2, sB64Enc = "";
+
+  for (var nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
+    nMod3 = nIdx % 3;
+    if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += "\r\n"; }
+    nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
+    if (nMod3 === 2 || aBytes.length - nIdx === 1) {
+      sB64Enc += String.fromCharCode(uint6ToB64(nUint24 >>> 18 & 63), uint6ToB64(nUint24 >>> 12 & 63), uint6ToB64(nUint24 >>> 6 & 63), uint6ToB64(nUint24 & 63));
+      nUint24 = 0;
+    }
+  }
+
+  return sB64Enc.substr(0, sB64Enc.length - 2 + nMod3) + (nMod3 === 2 ? '' : nMod3 === 1 ? '=' : '==');
+
+}
+
+/* UTF-8 array to DOMString and vice versa */
+
+function UTF8ArrToStr (aBytes) {
+
+  var sView = "";
+
+  for (var nPart, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) {
+    nPart = aBytes[nIdx];
+    sView += String.fromCharCode(
+      nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */
+        /* (nPart - 252 << 32) is not possible in ECMAScript! So...: */
+        (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+      : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */
+        (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+      : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */
+        (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+      : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */
+        (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+      : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */
+        (nPart - 192 << 6) + aBytes[++nIdx] - 128
+      : /* nPart < 127 ? */ /* one byte */
+        nPart
+    );
+  }
+
+  return sView;
+
+}
+
+function strToUTF8Arr (sDOMStr) {
+
+  var aBytes, nChr, nStrLen = sDOMStr.length, nArrLen = 0;
+
+  /* mapping... */
+
+  for (var nMapIdx = 0; nMapIdx < nStrLen; nMapIdx++) {
+    nChr = sDOMStr.charCodeAt(nMapIdx);
+    nArrLen += nChr < 0x80 ? 1 : nChr < 0x800 ? 2 : nChr < 0x10000 ? 3 : nChr < 0x200000 ? 4 : nChr < 0x4000000 ? 5 : 6;
+  }
+
+  aBytes = new Uint8Array(nArrLen);
+
+  /* transcription... */
+
+  for (var nIdx = 0, nChrIdx = 0; nIdx < nArrLen; nChrIdx++) {
+    nChr = sDOMStr.charCodeAt(nChrIdx);
+    if (nChr < 128) {
+      /* one byte */
+      aBytes[nIdx++] = nChr;
+    } else if (nChr < 0x800) {
+      /* two bytes */
+      aBytes[nIdx++] = 192 + (nChr >>> 6);
+      aBytes[nIdx++] = 128 + (nChr & 63);
+    } else if (nChr < 0x10000) {
+      /* three bytes */
+      aBytes[nIdx++] = 224 + (nChr >>> 12);
+      aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+      aBytes[nIdx++] = 128 + (nChr & 63);
+    } else if (nChr < 0x200000) {
+      /* four bytes */
+      aBytes[nIdx++] = 240 + (nChr >>> 18);
+      aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+      aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+      aBytes[nIdx++] = 128 + (nChr & 63);
+    } else if (nChr < 0x4000000) {
+      /* five bytes */
+      aBytes[nIdx++] = 248 + (nChr >>> 24);
+      aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
+      aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+      aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+      aBytes[nIdx++] = 128 + (nChr & 63);
+    } else /* if (nChr <= 0x7fffffff) */ {
+      /* six bytes */
+      aBytes[nIdx++] = 252 + /* (nChr >>> 32) is not possible in ECMAScript! So...: */ (nChr / 1073741824);
+      aBytes[nIdx++] = 128 + (nChr >>> 24 & 63);
+      aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
+      aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+      aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+      aBytes[nIdx++] = 128 + (nChr & 63);
+    }
+  }
+
+  return aBytes;
+
+}
+
+exampleNS.strToBase64 = function(str) {
+  return base64EncArr(strToUTF8Arr(str));
+};
diff --git a/resources/jquery.min.js b/resources/jquery.min.js
new file mode 100644
index 0000000..686ae4b
--- /dev/null
+++ b/resources/jquery.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
+*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|tru [...]
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:fu [...]
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b. [...]
diff --git a/resources/layout.css b/resources/layout.css
new file mode 100644
index 0000000..f4d25d5
--- /dev/null
+++ b/resources/layout.css
@@ -0,0 +1,31 @@
+ at import url(http://fonts.googleapis.com/css?family=Quattrocento+Sans:400,400italic,700);
+
+body {
+  padding-top: 60px;
+}
+.map {
+  height: 400px;
+  width: 100%;
+  background: url(textured_paper.jpeg) repeat;
+}
+.ol-attribution {
+  max-width: calc(100% - 3em);
+}
+.ol-control button, .ol-attribution, .ol-scale-line-inner {
+  font-family: 'Lucida Grande',Verdana,Geneva,Lucida,Arial,Helvetica,sans-serif;
+}
+
+#tags {
+  display: none;
+}
+
+body, h1, h2, h3, h4, p, li, td, th {
+  font-family: Quattrocento Sans;
+}
+.navbar-inverse .navbar-inner {
+  background: #1F6B75;
+}
+.navbar-inverse .brand {
+  color: white;
+  padding: 5px;
+}
diff --git a/resources/logo-32x32-optimized.png b/resources/logo-32x32-optimized.png
new file mode 100644
index 0000000..b9ae907
Binary files /dev/null and b/resources/logo-32x32-optimized.png differ
diff --git a/resources/logo-32x32.png b/resources/logo-32x32.png
new file mode 100644
index 0000000..1238283
Binary files /dev/null and b/resources/logo-32x32.png differ
diff --git a/resources/logo.png b/resources/logo.png
new file mode 100644
index 0000000..3d9702e
Binary files /dev/null and b/resources/logo.png differ
diff --git a/resources/textured_paper.jpeg b/resources/textured_paper.jpeg
new file mode 100644
index 0000000..b0bfa66
Binary files /dev/null and b/resources/textured_paper.jpeg differ
diff --git a/src/ol.jsdoc b/src/ol.jsdoc
new file mode 100644
index 0000000..47c6db5
--- /dev/null
+++ b/src/ol.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol
+ */
diff --git a/src/ol/animation.js b/src/ol/animation.js
new file mode 100644
index 0000000..d04c2d3
--- /dev/null
+++ b/src/ol/animation.js
@@ -0,0 +1,161 @@
+goog.provide('ol.animation');
+
+goog.require('ol.PreRenderFunction');
+goog.require('ol.ViewHint');
+goog.require('ol.coordinate');
+goog.require('ol.easing');
+
+
+/**
+ * @param {olx.animation.BounceOptions} options Bounce options.
+ * @return {ol.PreRenderFunction} Pre-render function.
+ * @api
+ */
+ol.animation.bounce = function(options) {
+  var resolution = options.resolution;
+  var start = goog.isDef(options.start) ? options.start : goog.now();
+  var duration = goog.isDef(options.duration) ? options.duration : 1000;
+  var easing = goog.isDef(options.easing) ?
+      options.easing : ol.easing.upAndDown;
+  return (
+      /**
+       * @param {ol.Map} map Map.
+       * @param {?olx.FrameState} frameState Frame state.
+       */
+      function(map, frameState) {
+        if (frameState.time < start) {
+          frameState.animate = true;
+          frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
+          return true;
+        } else if (frameState.time < start + duration) {
+          var delta = easing((frameState.time - start) / duration);
+          var deltaResolution = resolution - frameState.viewState.resolution;
+          frameState.animate = true;
+          frameState.viewState.resolution += delta * deltaResolution;
+          frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
+          return true;
+        } else {
+          return false;
+        }
+      });
+};
+
+
+/**
+ * @param {olx.animation.PanOptions} options Pan options.
+ * @return {ol.PreRenderFunction} Pre-render function.
+ * @api
+ */
+ol.animation.pan = function(options) {
+  var source = options.source;
+  var start = goog.isDef(options.start) ? options.start : goog.now();
+  var sourceX = source[0];
+  var sourceY = source[1];
+  var duration = goog.isDef(options.duration) ? options.duration : 1000;
+  var easing = goog.isDef(options.easing) ?
+      options.easing : ol.easing.inAndOut;
+  return (
+      /**
+       * @param {ol.Map} map Map.
+       * @param {?olx.FrameState} frameState Frame state.
+       */
+      function(map, frameState) {
+        if (frameState.time < start) {
+          frameState.animate = true;
+          frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
+          return true;
+        } else if (frameState.time < start + duration) {
+          var delta = 1 - easing((frameState.time - start) / duration);
+          var deltaX = sourceX - frameState.viewState.center[0];
+          var deltaY = sourceY - frameState.viewState.center[1];
+          frameState.animate = true;
+          frameState.viewState.center[0] += delta * deltaX;
+          frameState.viewState.center[1] += delta * deltaY;
+          frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
+          return true;
+        } else {
+          return false;
+        }
+      });
+};
+
+
+/**
+ * @param {olx.animation.RotateOptions} options Rotate options.
+ * @return {ol.PreRenderFunction} Pre-render function.
+ * @api
+ */
+ol.animation.rotate = function(options) {
+  var sourceRotation = goog.isDef(options.rotation) ? options.rotation : 0;
+  var start = goog.isDef(options.start) ? options.start : goog.now();
+  var duration = goog.isDef(options.duration) ? options.duration : 1000;
+  var easing = goog.isDef(options.easing) ?
+      options.easing : ol.easing.inAndOut;
+  var anchor = goog.isDef(options.anchor) ?
+      options.anchor : null;
+
+  return (
+      /**
+       * @param {ol.Map} map Map.
+       * @param {?olx.FrameState} frameState Frame state.
+       */
+      function(map, frameState) {
+        if (frameState.time < start) {
+          frameState.animate = true;
+          frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
+          return true;
+        } else if (frameState.time < start + duration) {
+          var delta = 1 - easing((frameState.time - start) / duration);
+          var deltaRotation =
+              (sourceRotation - frameState.viewState.rotation) * delta;
+          frameState.animate = true;
+          frameState.viewState.rotation += deltaRotation;
+          if (!goog.isNull(anchor)) {
+            var center = frameState.viewState.center;
+            ol.coordinate.sub(center, anchor);
+            ol.coordinate.rotate(center, deltaRotation);
+            ol.coordinate.add(center, anchor);
+          }
+          frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
+          return true;
+        } else {
+          return false;
+        }
+      });
+};
+
+
+/**
+ * @param {olx.animation.ZoomOptions} options Zoom options.
+ * @return {ol.PreRenderFunction} Pre-render function.
+ * @api
+ */
+ol.animation.zoom = function(options) {
+  var sourceResolution = options.resolution;
+  var start = goog.isDef(options.start) ? options.start : goog.now();
+  var duration = goog.isDef(options.duration) ? options.duration : 1000;
+  var easing = goog.isDef(options.easing) ?
+      options.easing : ol.easing.inAndOut;
+  return (
+      /**
+       * @param {ol.Map} map Map.
+       * @param {?olx.FrameState} frameState Frame state.
+       */
+      function(map, frameState) {
+        if (frameState.time < start) {
+          frameState.animate = true;
+          frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
+          return true;
+        } else if (frameState.time < start + duration) {
+          var delta = 1 - easing((frameState.time - start) / duration);
+          var deltaResolution =
+              sourceResolution - frameState.viewState.resolution;
+          frameState.animate = true;
+          frameState.viewState.resolution += delta * deltaResolution;
+          frameState.viewHints[ol.ViewHint.ANIMATING] += 1;
+          return true;
+        } else {
+          return false;
+        }
+      });
+};
diff --git a/src/ol/animation.jsdoc b/src/ol/animation.jsdoc
new file mode 100644
index 0000000..3c56f28
--- /dev/null
+++ b/src/ol/animation.jsdoc
@@ -0,0 +1,13 @@
+/**
+ * The animation static methods are designed to be used with the
+ * {@link ol.Map#beforeRender} method.  For example:
+ *
+ *     var map = new ol.Map({ ... });
+ *     var zoom = ol.animation.zoom({
+ *       resolution: map.getView().getResolution()
+ *     });
+ *     map.beforeRender(zoom);
+ *     map.getView().setResolution(map.getView().getResolution() * 2);
+ *
+ * @namespace ol.animation
+ */
diff --git a/src/ol/array.js b/src/ol/array.js
new file mode 100644
index 0000000..882a501
--- /dev/null
+++ b/src/ol/array.js
@@ -0,0 +1,104 @@
+goog.provide('ol.array');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+
+
+/**
+ * @param {Array.<number>} arr Array.
+ * @param {number} target Target.
+ * @return {number} Index.
+ */
+ol.array.binaryFindNearest = function(arr, target) {
+  var index = goog.array.binarySearch(arr, target,
+      /**
+       * @param {number} a A.
+       * @param {number} b B.
+       * @return {number} b minus a.
+       */
+      function(a, b) {
+        return b - a;
+      });
+  if (index >= 0) {
+    return index;
+  } else if (index == -1) {
+    return 0;
+  } else if (index == -arr.length - 1) {
+    return arr.length - 1;
+  } else {
+    var left = -index - 2;
+    var right = -index - 1;
+    if (arr[left] - target < target - arr[right]) {
+      return left;
+    } else {
+      return right;
+    }
+  }
+};
+
+
+/**
+ * @param {Array.<number>} arr Array.
+ * @param {number} target Target.
+ * @param {number} direction 0 means return the nearest, > 0
+ *    means return the largest nearest, < 0 means return the
+ *    smallest nearest.
+ * @return {number} Index.
+ */
+ol.array.linearFindNearest = function(arr, target, direction) {
+  var n = arr.length;
+  if (arr[0] <= target) {
+    return 0;
+  } else if (target <= arr[n - 1]) {
+    return n - 1;
+  } else {
+    var i;
+    if (direction > 0) {
+      for (i = 1; i < n; ++i) {
+        if (arr[i] < target) {
+          return i - 1;
+        }
+      }
+    } else if (direction < 0) {
+      for (i = 1; i < n; ++i) {
+        if (arr[i] <= target) {
+          return i;
+        }
+      }
+    } else {
+      for (i = 1; i < n; ++i) {
+        if (arr[i] == target) {
+          return i;
+        } else if (arr[i] < target) {
+          if (arr[i - 1] - target < target - arr[i]) {
+            return i - 1;
+          } else {
+            return i;
+          }
+        }
+      }
+    }
+    // We should never get here, but the compiler complains
+    // if it finds a path for which no number is returned.
+    goog.asserts.fail();
+    return n - 1;
+  }
+};
+
+
+/**
+ * @param {Array.<*>} arr Array.
+ * @param {number} begin Begin index.
+ * @param {number} end End index.
+ */
+ol.array.reverseSubArray = function(arr, begin, end) {
+  goog.asserts.assert(begin >= 0);
+  goog.asserts.assert(end < arr.length);
+  while (begin < end) {
+    var tmp = arr[begin];
+    arr[begin] = arr[end];
+    arr[end] = tmp;
+    ++begin;
+    --end;
+  }
+};
diff --git a/src/ol/attribution.js b/src/ol/attribution.js
new file mode 100644
index 0000000..da38e4a
--- /dev/null
+++ b/src/ol/attribution.js
@@ -0,0 +1,76 @@
+goog.provide('ol.Attribution');
+
+goog.require('ol.TileRange');
+
+
+
+/**
+ * @classdesc
+ * An attribution for a layer source.
+ *
+ * Example:
+ *
+ *     source: new ol.source.OSM({
+ *       attributions: [
+ *         new ol.Attribution({
+ *           html: 'All maps © ' +
+ *               '<a href="http://www.opencyclemap.org/">OpenCycleMap</a>'
+ *         }),
+ *         ol.source.OSM.ATTRIBUTION
+ *       ],
+ *     ..
+ *
+ * @constructor
+ * @param {olx.AttributionOptions} options Attribution options.
+ * @struct
+ * @api stable
+ */
+ol.Attribution = function(options) {
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.html_ = options.html;
+
+  /**
+   * @private
+   * @type {Object.<string, Array.<ol.TileRange>>}
+   */
+  this.tileRanges_ = goog.isDef(options.tileRanges) ?
+      options.tileRanges : null;
+
+};
+
+
+/**
+ * @return {string} HTML.
+ * @api stable
+ */
+ol.Attribution.prototype.getHTML = function() {
+  return this.html_;
+};
+
+
+/**
+ * @param {Object.<string, ol.TileRange>} tileRanges Tile ranges.
+ * @return {boolean} Intersects any tile range.
+ */
+ol.Attribution.prototype.intersectsAnyTileRange = function(tileRanges) {
+  if (goog.isNull(this.tileRanges_)) {
+    return true;
+  }
+  var i, ii, tileRange, z;
+  for (z in tileRanges) {
+    if (!(z in this.tileRanges_)) {
+      continue;
+    }
+    tileRange = tileRanges[z];
+    for (i = 0, ii = this.tileRanges_[z].length; i < ii; ++i) {
+      if (this.tileRanges_[z][i].intersects(tileRange)) {
+        return true;
+      }
+    }
+  }
+  return false;
+};
diff --git a/src/ol/binary.js b/src/ol/binary.js
new file mode 100644
index 0000000..05e0086
--- /dev/null
+++ b/src/ol/binary.js
@@ -0,0 +1,174 @@
+// FIXME Test on Internet Explorer with VBArray
+
+goog.provide('ol.binary.Buffer');
+goog.provide('ol.binary.IReader');
+
+goog.require('goog.asserts');
+goog.require('goog.userAgent');
+goog.require('ol.has');
+
+
+
+/**
+ * @constructor
+ * @param {ArrayBuffer|string} data Data.
+ */
+ol.binary.Buffer = function(data) {
+
+  /**
+   * @private
+   * @type {ArrayBuffer|string}
+   */
+  this.data_ = data;
+
+};
+
+
+/**
+ * @return {ol.binary.IReader} Reader.
+ */
+ol.binary.Buffer.prototype.getReader = function() {
+  var data = this.data_;
+  if (ol.has.ARRAY_BUFFER) {
+    var arrayBuffer;
+    if (data instanceof ArrayBuffer) {
+      arrayBuffer = data;
+    } else if (goog.isString(data)) {
+      // FIXME check what happens with Unicode
+      arrayBuffer = new ArrayBuffer(data.length);
+      var uint8View = new Uint8Array(arrayBuffer);
+      var i, ii;
+      for (i = 0, ii = data.length; i < ii; ++i) {
+        uint8View[i] = data.charCodeAt(i);
+      }
+    } else {
+      goog.asserts.fail();
+      return null;
+    }
+    return new ol.binary.ArrayBufferReader(arrayBuffer);
+  } else {
+    goog.asserts.assert(goog.isString(data));
+    goog.asserts.assert(
+        goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10.0'));
+    return new ol.binary.ArrayReader(new VBArray(data).toArray());
+  }
+};
+
+
+
+/**
+ * @interface
+ */
+ol.binary.IReader = function() {};
+
+
+/**
+ * @return {boolean} At EOF.
+ */
+ol.binary.IReader.prototype.atEOF = function() {};
+
+
+/**
+ * @return {number} Byte.
+ */
+ol.binary.IReader.prototype.readByte = function() {};
+
+
+
+/**
+ * @constructor
+ * @param {ArrayBuffer} arrayBuffer Array buffer.
+ * @implements {ol.binary.IReader}
+ */
+ol.binary.ArrayBufferReader = function(arrayBuffer) {
+
+  /**
+   * @private
+   * @type {Uint8Array}
+   */
+  this.uint8View_ = new Uint8Array(arrayBuffer);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.length_ = this.uint8View_.length;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.offset_ = 0;
+
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.binary.ArrayBufferReader.prototype.atEOF = function() {
+  return this.offset_ == this.length_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.binary.ArrayBufferReader.prototype.readByte = function() {
+  if (this.offset_ < this.length_) {
+    return this.uint8View_[this.offset_++];
+  } else {
+    goog.asserts.fail();
+    return 0;
+  }
+};
+
+
+
+/**
+ * @constructor
+ * @implements {ol.binary.IReader}
+ * @param {Array.<number>} array Array.
+ */
+ol.binary.ArrayReader = function(array) {
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.array_ = array;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.length_ = array.length;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.offset_ = 0;
+
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.binary.ArrayReader.prototype.atEOF = function() {
+  return this.offset_ == this.length_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.binary.ArrayReader.prototype.readByte = function() {
+  if (this.offset_ < this.length_) {
+    return this.array_[this.offset_++];
+  } else {
+    goog.asserts.fail();
+    return 0;
+  }
+};
diff --git a/src/ol/canvasfunction.js b/src/ol/canvasfunction.js
new file mode 100644
index 0000000..db4820f
--- /dev/null
+++ b/src/ol/canvasfunction.js
@@ -0,0 +1,17 @@
+goog.provide('ol.CanvasFunctionType');
+
+
+/**
+ * A function returning the canvas element (`{HTMLCanvasElement}`)
+ * used by the source as an image. The arguments passed to the function are:
+ * {@link ol.Extent} the image extent, `{number}` the image resolution,
+ * `{number}` the device pixel ratio, {@link ol.Size} the image size, and
+ * {@link ol.proj.Projection} the image projection. The canvas returned by
+ * this function is cached by the source. The this keyword inside the function
+ * references the {@link ol.source.ImageCanvas}.
+ *
+ * @typedef {function(this:ol.source.ImageCanvas, ol.Extent, number,
+ *     number, ol.Size, ol.proj.Projection): HTMLCanvasElement}
+ * @api
+ */
+ol.CanvasFunctionType;
diff --git a/src/ol/centerconstraint.js b/src/ol/centerconstraint.js
new file mode 100644
index 0000000..2cc4db9
--- /dev/null
+++ b/src/ol/centerconstraint.js
@@ -0,0 +1,42 @@
+goog.provide('ol.CenterConstraint');
+goog.provide('ol.CenterConstraintType');
+
+goog.require('goog.math');
+
+
+/**
+ * @typedef {function((ol.Coordinate|undefined)): (ol.Coordinate|undefined)}
+ */
+ol.CenterConstraintType;
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {ol.CenterConstraintType}
+ */
+ol.CenterConstraint.createExtent = function(extent) {
+  return (
+      /**
+       * @param {ol.Coordinate|undefined} center Center.
+       * @return {ol.Coordinate|undefined} Center.
+       */
+      function(center) {
+        if (goog.isDef(center)) {
+          return [
+            goog.math.clamp(center[0], extent[0], extent[2]),
+            goog.math.clamp(center[1], extent[1], extent[3])
+          ];
+        } else {
+          return undefined;
+        }
+      });
+};
+
+
+/**
+ * @param {ol.Coordinate|undefined} center Center.
+ * @return {ol.Coordinate|undefined} Center.
+ */
+ol.CenterConstraint.none = function(center) {
+  return center;
+};
diff --git a/src/ol/collection.js b/src/ol/collection.js
new file mode 100644
index 0000000..77acfc6
--- /dev/null
+++ b/src/ol/collection.js
@@ -0,0 +1,283 @@
+/**
+ * An implementation of Google Maps' MVCArray.
+ * @see https://developers.google.com/maps/documentation/javascript/reference
+ */
+
+goog.provide('ol.Collection');
+goog.provide('ol.CollectionEvent');
+goog.provide('ol.CollectionEventType');
+
+goog.require('goog.array');
+goog.require('goog.events.Event');
+goog.require('ol.Object');
+
+
+/**
+ * @enum {string}
+ */
+ol.CollectionEventType = {
+  /**
+   * Triggered when an item is added to the collection.
+   * @event ol.CollectionEvent#add
+   * @api stable
+   */
+  ADD: 'add',
+  /**
+   * Triggered when an item is removed from the collection.
+   * @event ol.CollectionEvent#remove
+   * @api stable
+   */
+  REMOVE: 'remove'
+};
+
+
+
+/**
+ * @classdesc
+ * Events emitted by {@link ol.Collection} instances are instances of this
+ * type.
+ *
+ * @constructor
+ * @extends {goog.events.Event}
+ * @implements {oli.CollectionEvent}
+ * @param {ol.CollectionEventType} type Type.
+ * @param {*=} opt_element Element.
+ * @param {Object=} opt_target Target.
+ */
+ol.CollectionEvent = function(type, opt_element, opt_target) {
+
+  goog.base(this, type, opt_target);
+
+  /**
+   * The element that is added to or removed from the collection.
+   * @type {*}
+   * @api stable
+   */
+  this.element = opt_element;
+
+};
+goog.inherits(ol.CollectionEvent, goog.events.Event);
+
+
+/**
+ * @enum {string}
+ */
+ol.CollectionProperty = {
+  LENGTH: 'length'
+};
+
+
+
+/**
+ * @classdesc
+ * An expanded version of standard JS Array, adding convenience methods for
+ * manipulation. Add and remove changes to the Collection trigger a Collection
+ * event. Note that this does not cover changes to the objects _within_ the
+ * Collection; they trigger events on the appropriate object, not on the
+ * Collection as a whole.
+ *
+ * Because a Collection is itself an {@link ol.Object}, it can be bound to any
+ * other Object or Collection such that a change in one will automatically be
+ * reflected in the other.
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @fires ol.CollectionEvent
+ * @param {Array.<T>=} opt_array Array.
+ * @template T
+ * @api stable
+ */
+ol.Collection = function(opt_array) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {Array.<T>}
+   */
+  this.array_ = opt_array || [];
+
+  this.updateLength_();
+
+};
+goog.inherits(ol.Collection, ol.Object);
+
+
+/**
+ * Remove all elements from the collection.
+ * @api stable
+ */
+ol.Collection.prototype.clear = function() {
+  while (this.getLength() > 0) {
+    this.pop();
+  }
+};
+
+
+/**
+ * @param {Array.<T>} arr Array.
+ * @return {ol.Collection.<T>} This collection.
+ * @api stable
+ */
+ol.Collection.prototype.extend = function(arr) {
+  var i, ii;
+  for (i = 0, ii = arr.length; i < ii; ++i) {
+    this.push(arr[i]);
+  }
+  return this;
+};
+
+
+/**
+ * Iterate over each element, calling the provided callback.
+ * @param {function(this: S, T, number, Array.<T>): *} f The function to call
+ *     for every element. This function takes 3 arguments (the element, the
+ *     index and the array). The return value is ignored.
+ * @param {S=} opt_this The object to use as `this` in `f`.
+ * @template S
+ * @api stable
+ */
+ol.Collection.prototype.forEach = function(f, opt_this) {
+  goog.array.forEach(this.array_, f, opt_this);
+};
+
+
+/**
+ * Get a reference to the underlying Array object. Warning: if the array
+ * is mutated, no events will be dispatched by the collection, and the
+ * collection's "length" property won't be in sync with the actual length
+ * of the array.
+ * @return {Array.<T>} Array.
+ * @api stable
+ */
+ol.Collection.prototype.getArray = function() {
+  return this.array_;
+};
+
+
+/**
+ * Get the element at the provided index.
+ * @param {number} index Index.
+ * @return {T} Element.
+ * @api stable
+ */
+ol.Collection.prototype.item = function(index) {
+  return this.array_[index];
+};
+
+
+/**
+ * Get the length of this collection.
+ * @return {number} The length of the array.
+ * @observable
+ * @api stable
+ */
+ol.Collection.prototype.getLength = function() {
+  return /** @type {number} */ (this.get(ol.CollectionProperty.LENGTH));
+};
+
+
+/**
+ * Insert an element at the provided index.
+ * @param {number} index Index.
+ * @param {T} elem Element.
+ * @api stable
+ */
+ol.Collection.prototype.insertAt = function(index, elem) {
+  goog.array.insertAt(this.array_, elem, index);
+  this.updateLength_();
+  this.dispatchEvent(
+      new ol.CollectionEvent(ol.CollectionEventType.ADD, elem, this));
+};
+
+
+/**
+ * Remove the last element of the collection and return it.
+ * Return `undefined` if the collection is empty.
+ * @return {T|undefined} Element.
+ * @api stable
+ */
+ol.Collection.prototype.pop = function() {
+  return this.removeAt(this.getLength() - 1);
+};
+
+
+/**
+ * Insert the provided element at the end of the collection.
+ * @param {T} elem Element.
+ * @return {number} Length.
+ * @api stable
+ */
+ol.Collection.prototype.push = function(elem) {
+  var n = this.array_.length;
+  this.insertAt(n, elem);
+  return n;
+};
+
+
+/**
+ * Removes the first occurence of elem from the collection.
+ * @param {T} elem Element.
+ * @return {T|undefined} The removed element or undefined if elem was not found.
+ * @api stable
+ */
+ol.Collection.prototype.remove = function(elem) {
+  var arr = this.array_;
+  var i, ii;
+  for (i = 0, ii = arr.length; i < ii; ++i) {
+    if (arr[i] === elem) {
+      return this.removeAt(i);
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * Remove the element at the provided index and return it.
+ * Return `undefined` if the collection does not contain this index.
+ * @param {number} index Index.
+ * @return {T|undefined} Value.
+ * @api stable
+ */
+ol.Collection.prototype.removeAt = function(index) {
+  var prev = this.array_[index];
+  goog.array.removeAt(this.array_, index);
+  this.updateLength_();
+  this.dispatchEvent(
+      new ol.CollectionEvent(ol.CollectionEventType.REMOVE, prev, this));
+  return prev;
+};
+
+
+/**
+ * Set the element at the provided index.
+ * @param {number} index Index.
+ * @param {T} elem Element.
+ * @api stable
+ */
+ol.Collection.prototype.setAt = function(index, elem) {
+  var n = this.getLength();
+  if (index < n) {
+    var prev = this.array_[index];
+    this.array_[index] = elem;
+    this.dispatchEvent(
+        new ol.CollectionEvent(ol.CollectionEventType.REMOVE, prev, this));
+    this.dispatchEvent(
+        new ol.CollectionEvent(ol.CollectionEventType.ADD, elem, this));
+  } else {
+    var j;
+    for (j = n; j < index; ++j) {
+      this.insertAt(j, undefined);
+    }
+    this.insertAt(index, elem);
+  }
+};
+
+
+/**
+ * @private
+ */
+ol.Collection.prototype.updateLength_ = function() {
+  this.set(ol.CollectionProperty.LENGTH, this.array_.length);
+};
diff --git a/src/ol/color/color.js b/src/ol/color/color.js
new file mode 100644
index 0000000..a857308
--- /dev/null
+++ b/src/ol/color/color.js
@@ -0,0 +1,332 @@
+// We can't use goog.color or goog.color.alpha because they interally use a hex
+// string representation that encodes each channel in a single byte.  This
+// causes occasional loss of precision and rounding errors, especially in the
+// alpha channel.
+
+goog.provide('ol.color');
+
+goog.require('goog.asserts');
+goog.require('goog.color');
+goog.require('goog.color.names');
+goog.require('goog.math');
+goog.require('goog.vec.Mat4');
+goog.require('ol');
+
+
+/**
+ * A color represented as a short array [red, green, blue, alpha].
+ * red, green, and blue should be integers in the range 0..255 inclusive.
+ * alpha should be a float in the range 0..1 inclusive.
+ * @typedef {Array.<number>}
+ * @api
+ */
+ol.Color;
+
+
+/**
+ * This RegExp matches # followed by 3 or 6 hex digits.
+ * @const
+ * @type {RegExp}
+ * @private
+ */
+ol.color.hexColorRe_ = /^#(?:[0-9a-f]{3}){1,2}$/i;
+
+
+/**
+ * @see goog.color.rgbColorRe_
+ * @const
+ * @type {RegExp}
+ * @private
+ */
+ol.color.rgbColorRe_ =
+    /^(?:rgb)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2})\)$/i;
+
+
+/**
+ * @see goog.color.alpha.rgbaColorRe_
+ * @const
+ * @type {RegExp}
+ * @private
+ */
+ol.color.rgbaColorRe_ =
+    /^(?:rgba)?\((0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|[1-9]\d{0,2}),\s?(0|1|0\.\d{0,10})\)$/i;
+
+
+/**
+ * @param {ol.Color} dst Destination.
+ * @param {ol.Color} src Source.
+ * @param {ol.Color=} opt_color Color.
+ * @return {ol.Color} Color.
+ */
+ol.color.blend = function(dst, src, opt_color) {
+  // http://en.wikipedia.org/wiki/Alpha_compositing
+  // FIXME do we need to scale by 255?
+  var out = goog.isDef(opt_color) ? opt_color : [];
+  var dstA = dst[3];
+  var srcA = dst[3];
+  if (dstA == 1) {
+    out[0] = (src[0] * srcA + dst[0] * (1 - srcA) + 0.5) | 0;
+    out[1] = (src[1] * srcA + dst[1] * (1 - srcA) + 0.5) | 0;
+    out[2] = (src[2] * srcA + dst[2] * (1 - srcA) + 0.5) | 0;
+    out[4] = 1;
+  } else if (srcA === 0) {
+    out[0] = dst[0];
+    out[1] = dst[1];
+    out[2] = dst[2];
+    out[3] = dstA;
+  } else {
+    var outA = srcA + dstA * (1 - srcA);
+    if (outA === 0) {
+      out[0] = 0;
+      out[1] = 0;
+      out[2] = 0;
+      out[3] = 0;
+    } else {
+      out[0] = ((src[0] * srcA + dst[0] * dstA * (1 - srcA)) / outA + 0.5) | 0;
+      out[1] = ((src[1] * srcA + dst[1] * dstA * (1 - srcA)) / outA + 0.5) | 0;
+      out[2] = ((src[2] * srcA + dst[2] * dstA * (1 - srcA)) / outA + 0.5) | 0;
+      out[3] = outA;
+    }
+  }
+  goog.asserts.assert(ol.color.isValid(out));
+  return out;
+};
+
+
+/**
+ * Return the color as an array. This function maintains a cache of calculated
+ * arrays which means the result should not be modified.
+ * @param {ol.Color|string} color Color.
+ * @return {ol.Color} Color.
+ * @api
+ */
+ol.color.asArray = function(color) {
+  if (goog.isArray(color)) {
+    return color;
+  } else {
+    goog.asserts.assert(goog.isString(color));
+    return ol.color.fromString(color);
+  }
+};
+
+
+/**
+ * Return the color as an rgba string.
+ * @param {ol.Color|string} color Color.
+ * @return {string} Rgba string.
+ * @api
+ */
+ol.color.asString = function(color) {
+  if (goog.isString(color)) {
+    return color;
+  } else {
+    goog.asserts.assert(goog.isArray(color));
+    return ol.color.toString(color);
+  }
+};
+
+
+/**
+ * @param {ol.Color} color1 Color1.
+ * @param {ol.Color} color2 Color2.
+ * @return {boolean} Equals.
+ */
+ol.color.equals = function(color1, color2) {
+  return color1 === color2 || (
+      color1[0] == color2[0] && color1[1] == color2[1] &&
+      color1[2] == color2[2] && color1[3] == color2[3]);
+};
+
+
+/**
+ * @param {string} s String.
+ * @return {ol.Color} Color.
+ */
+ol.color.fromString = (
+    /**
+     * @return {function(string): ol.Color}
+     */
+    function() {
+
+      // We maintain a small cache of parsed strings.  To provide cheap LRU-like
+      // semantics, whenever the cache grows too large we simply delete an
+      // arbitrary 25% of the entries.
+
+      /**
+       * @const
+       * @type {number}
+       */
+      var MAX_CACHE_SIZE = 1024;
+
+      /**
+       * @type {Object.<string, ol.Color>}
+       */
+      var cache = {};
+
+      /**
+       * @type {number}
+       */
+      var cacheSize = 0;
+
+      return (
+          /**
+           * @param {string} s String.
+           * @return {ol.Color} Color.
+           */
+          function(s) {
+            var color;
+            if (cache.hasOwnProperty(s)) {
+              color = cache[s];
+            } else {
+              if (cacheSize >= MAX_CACHE_SIZE) {
+                var i = 0;
+                var key;
+                for (key in cache) {
+                  if ((i++ & 3) === 0) {
+                    delete cache[key];
+                    --cacheSize;
+                  }
+                }
+              }
+              color = ol.color.fromStringInternal_(s);
+              cache[s] = color;
+              ++cacheSize;
+            }
+            return color;
+          });
+
+    })();
+
+
+/**
+ * @param {string} s String.
+ * @private
+ * @return {ol.Color} Color.
+ */
+ol.color.fromStringInternal_ = function(s) {
+
+  var isHex = false;
+  if (ol.ENABLE_NAMED_COLORS && goog.color.names.hasOwnProperty(s)) {
+    // goog.color.names does not have a type declaration, so add a typecast
+    s = /** @type {string} */ (goog.color.names[s]);
+    isHex = true;
+  }
+
+  var r, g, b, a, color, match;
+  if (isHex || (match = ol.color.hexColorRe_.exec(s))) { // hex
+    var n = s.length - 1; // number of hex digits
+    goog.asserts.assert(n == 3 || n == 6);
+    var d = n == 3 ? 1 : 2; // number of digits per channel
+    r = parseInt(s.substr(1 + 0 * d, d), 16);
+    g = parseInt(s.substr(1 + 1 * d, d), 16);
+    b = parseInt(s.substr(1 + 2 * d, d), 16);
+    if (d == 1) {
+      r = (r << 4) + r;
+      g = (g << 4) + g;
+      b = (b << 4) + b;
+    }
+    a = 1;
+    color = [r, g, b, a];
+    goog.asserts.assert(ol.color.isValid(color));
+    return color;
+  } else if ((match = ol.color.rgbaColorRe_.exec(s))) { // rgba()
+    r = Number(match[1]);
+    g = Number(match[2]);
+    b = Number(match[3]);
+    a = Number(match[4]);
+    color = [r, g, b, a];
+    return ol.color.normalize(color, color);
+  } else if ((match = ol.color.rgbColorRe_.exec(s))) { // rgb()
+    r = Number(match[1]);
+    g = Number(match[2]);
+    b = Number(match[3]);
+    color = [r, g, b, 1];
+    return ol.color.normalize(color, color);
+  } else {
+    goog.asserts.fail(s + ' is not a valid color');
+  }
+
+};
+
+
+/**
+ * @param {ol.Color} color Color.
+ * @return {boolean} Is valid.
+ */
+ol.color.isValid = function(color) {
+  return 0 <= color[0] && color[0] < 256 &&
+      0 <= color[1] && color[1] < 256 &&
+      0 <= color[2] && color[2] < 256 &&
+      0 <= color[3] && color[3] <= 1;
+};
+
+
+/**
+ * @param {ol.Color} color Color.
+ * @param {ol.Color=} opt_color Color.
+ * @return {ol.Color} Clamped color.
+ */
+ol.color.normalize = function(color, opt_color) {
+  var result = goog.isDef(opt_color) ? opt_color : [];
+  result[0] = goog.math.clamp((color[0] + 0.5) | 0, 0, 255);
+  result[1] = goog.math.clamp((color[1] + 0.5) | 0, 0, 255);
+  result[2] = goog.math.clamp((color[2] + 0.5) | 0, 0, 255);
+  result[3] = goog.math.clamp(color[3], 0, 1);
+  return result;
+};
+
+
+/**
+ * @param {ol.Color} color Color.
+ * @return {string} String.
+ */
+ol.color.toString = function(color) {
+  var r = color[0];
+  if (r != (r | 0)) {
+    r = (r + 0.5) | 0;
+  }
+  var g = color[1];
+  if (g != (g | 0)) {
+    g = (g + 0.5) | 0;
+  }
+  var b = color[2];
+  if (b != (b | 0)) {
+    b = (b + 0.5) | 0;
+  }
+  var a = color[3];
+  return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';
+};
+
+
+/**
+ * @param {!ol.Color} color Color.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {!ol.Color=} opt_color Color.
+ * @return {ol.Color} Transformed color.
+ */
+ol.color.transform = function(color, transform, opt_color) {
+  var result = goog.isDef(opt_color) ? opt_color : [];
+  result = goog.vec.Mat4.multVec3(transform, color, result);
+  goog.asserts.assert(goog.isArray(result));
+  result[3] = color[3];
+  return ol.color.normalize(result, result);
+};
+
+
+/**
+ * @param {ol.Color|string} color1 Color2.
+ * @param {ol.Color|string} color2 Color2.
+ * @return {boolean} Equals.
+ */
+ol.color.stringOrColorEquals = function(color1, color2) {
+  if (color1 === color2 || color1 == color2) {
+    return true;
+  }
+  if (goog.isString(color1)) {
+    color1 = ol.color.fromString(color1);
+  }
+  if (goog.isString(color2)) {
+    color2 = ol.color.fromString(color2);
+  }
+  return ol.color.equals(color1, color2);
+};
diff --git a/src/ol/color/color.jsdoc b/src/ol/color/color.jsdoc
new file mode 100644
index 0000000..5690339
--- /dev/null
+++ b/src/ol/color/color.jsdoc
@@ -0,0 +1,8 @@
+/**
+ * Colors can be defined as a {@link ol.Color} array, or as strings in
+ * `rgb(r,g,b)` or `rgba(r,g,b,a)` format, or in hex `#rrggbb` or `#rgb` format.
+ * Color names, like 'red', 'blue' or 'green', may also be used with the
+ * Canvas renderer.
+ *
+ * @namespace ol.color
+ */
diff --git a/src/ol/color/colormatrix.js b/src/ol/color/colormatrix.js
new file mode 100644
index 0000000..ac94726
--- /dev/null
+++ b/src/ol/color/colormatrix.js
@@ -0,0 +1,205 @@
+goog.provide('ol.color.Matrix');
+
+goog.require('goog.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ */
+ol.color.Matrix = function() {
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.colorMatrix_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.brightness_ = undefined;
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.brightnessMatrix_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.contrast_ = undefined;
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.contrastMatrix_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.hue_ = undefined;
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.hueMatrix_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.saturation_ = undefined;
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.saturationMatrix_ = goog.vec.Mat4.createNumber();
+
+};
+
+
+/**
+ * @param {!goog.vec.Mat4.Number} matrix Matrix.
+ * @param {number} value Brightness value.
+ * @return {!goog.vec.Mat4.Number} Matrix.
+ */
+ol.color.Matrix.makeBrightness = function(matrix, value) {
+  goog.vec.Mat4.makeTranslate(matrix, value, value, value);
+  return matrix;
+};
+
+
+/**
+ * @param {!goog.vec.Mat4.Number} matrix Matrix.
+ * @param {number} value Contrast value.
+ * @return {!goog.vec.Mat4.Number} Matrix.
+ */
+ol.color.Matrix.makeContrast = function(matrix, value) {
+  goog.vec.Mat4.makeScale(matrix, value, value, value);
+  var translateValue = (-0.5 * value + 0.5);
+  goog.vec.Mat4.setColumnValues(matrix, 3,
+      translateValue, translateValue, translateValue, 1);
+  return matrix;
+};
+
+
+/**
+ * @param {!goog.vec.Mat4.Number} matrix Matrix.
+ * @param {number} value Hue value.
+ * @return {!goog.vec.Mat4.Number} Matrix.
+ */
+ol.color.Matrix.makeHue = function(matrix, value) {
+  var cosHue = Math.cos(value);
+  var sinHue = Math.sin(value);
+  var v00 = 0.213 + cosHue * 0.787 - sinHue * 0.213;
+  var v01 = 0.715 - cosHue * 0.715 - sinHue * 0.715;
+  var v02 = 0.072 - cosHue * 0.072 + sinHue * 0.928;
+  var v03 = 0;
+  var v10 = 0.213 - cosHue * 0.213 + sinHue * 0.143;
+  var v11 = 0.715 + cosHue * 0.285 + sinHue * 0.140;
+  var v12 = 0.072 - cosHue * 0.072 - sinHue * 0.283;
+  var v13 = 0;
+  var v20 = 0.213 - cosHue * 0.213 - sinHue * 0.787;
+  var v21 = 0.715 - cosHue * 0.715 + sinHue * 0.715;
+  var v22 = 0.072 + cosHue * 0.928 + sinHue * 0.072;
+  var v23 = 0;
+  var v30 = 0;
+  var v31 = 0;
+  var v32 = 0;
+  var v33 = 1;
+  goog.vec.Mat4.setFromValues(matrix,
+      v00, v10, v20, v30,
+      v01, v11, v21, v31,
+      v02, v12, v22, v32,
+      v03, v13, v23, v33);
+  return matrix;
+};
+
+
+/**
+ * @param {!goog.vec.Mat4.Number} matrix Matrix.
+ * @param {number} value Saturation value.
+ * @return {!goog.vec.Mat4.Number} Matrix.
+ */
+ol.color.Matrix.makeSaturation = function(matrix, value) {
+  var v00 = 0.213 + 0.787 * value;
+  var v01 = 0.715 - 0.715 * value;
+  var v02 = 0.072 - 0.072 * value;
+  var v03 = 0;
+  var v10 = 0.213 - 0.213 * value;
+  var v11 = 0.715 + 0.285 * value;
+  var v12 = 0.072 - 0.072 * value;
+  var v13 = 0;
+  var v20 = 0.213 - 0.213 * value;
+  var v21 = 0.715 - 0.715 * value;
+  var v22 = 0.072 + 0.928 * value;
+  var v23 = 0;
+  var v30 = 0;
+  var v31 = 0;
+  var v32 = 0;
+  var v33 = 1;
+  goog.vec.Mat4.setFromValues(matrix,
+      v00, v10, v20, v30,
+      v01, v11, v21, v31,
+      v02, v12, v22, v32,
+      v03, v13, v23, v33);
+  return matrix;
+};
+
+
+/**
+ * @param {number|undefined} brightness Brightness.
+ * @param {number|undefined} contrast Contrast.
+ * @param {number|undefined} hue Hue.
+ * @param {number|undefined} saturation Saturation.
+ * @return {!goog.vec.Mat4.Number} Matrix.
+ */
+ol.color.Matrix.prototype.getMatrix = function(
+    brightness, contrast, hue, saturation) {
+  var colorMatrixDirty = false;
+  if (goog.isDef(brightness) && brightness !== this.brightness_) {
+    ol.color.Matrix.makeBrightness(this.brightnessMatrix_, brightness);
+    this.brightness_ = brightness;
+    colorMatrixDirty = true;
+  }
+  if (goog.isDef(contrast) && contrast !== this.contrast_) {
+    ol.color.Matrix.makeContrast(this.contrastMatrix_, contrast);
+    this.contrast_ = contrast;
+    colorMatrixDirty = true;
+  }
+  if (goog.isDef(hue) && hue !== this.hue_) {
+    ol.color.Matrix.makeHue(this.hueMatrix_, hue);
+    this.hue_ = hue;
+    colorMatrixDirty = true;
+  }
+  if (goog.isDef(saturation) && saturation !== this.saturation_) {
+    ol.color.Matrix.makeSaturation(this.saturationMatrix_, saturation);
+    this.saturation_ = saturation;
+    colorMatrixDirty = true;
+  }
+  if (colorMatrixDirty) {
+    var colorMatrix = this.colorMatrix_;
+    goog.vec.Mat4.makeIdentity(colorMatrix);
+    if (goog.isDef(contrast)) {
+      goog.vec.Mat4.multMat(colorMatrix, this.contrastMatrix_, colorMatrix);
+    }
+    if (goog.isDef(brightness)) {
+      goog.vec.Mat4.multMat(colorMatrix, this.brightnessMatrix_, colorMatrix);
+    }
+    if (goog.isDef(saturation)) {
+      goog.vec.Mat4.multMat(colorMatrix, this.saturationMatrix_, colorMatrix);
+    }
+    if (goog.isDef(hue)) {
+      goog.vec.Mat4.multMat(colorMatrix, this.hueMatrix_, colorMatrix);
+    }
+  }
+  return this.colorMatrix_;
+};
diff --git a/src/ol/constraints.js b/src/ol/constraints.js
new file mode 100644
index 0000000..84fc289
--- /dev/null
+++ b/src/ol/constraints.js
@@ -0,0 +1,35 @@
+goog.provide('ol.Constraints');
+
+goog.require('ol.CenterConstraintType');
+goog.require('ol.ResolutionConstraintType');
+goog.require('ol.RotationConstraintType');
+
+
+
+/**
+ * @constructor
+ * @param {ol.CenterConstraintType} centerConstraint Center constraint.
+ * @param {ol.ResolutionConstraintType} resolutionConstraint
+ *     Resolution constraint.
+ * @param {ol.RotationConstraintType} rotationConstraint
+ *     Rotation constraint.
+ */
+ol.Constraints =
+    function(centerConstraint, resolutionConstraint, rotationConstraint) {
+
+  /**
+   * @type {ol.CenterConstraintType}
+   */
+  this.center = centerConstraint;
+
+  /**
+   * @type {ol.ResolutionConstraintType}
+   */
+  this.resolution = resolutionConstraint;
+
+  /**
+   * @type {ol.RotationConstraintType}
+   */
+  this.rotation = rotationConstraint;
+
+};
diff --git a/src/ol/control.jsdoc b/src/ol/control.jsdoc
new file mode 100644
index 0000000..bd09e4c
--- /dev/null
+++ b/src/ol/control.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.control
+ */
diff --git a/src/ol/control/attributioncontrol.js b/src/ol/control/attributioncontrol.js
new file mode 100644
index 0000000..224f4dc
--- /dev/null
+++ b/src/ol/control/attributioncontrol.js
@@ -0,0 +1,393 @@
+// FIXME handle date line wrap
+
+goog.provide('ol.control.Attribution');
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.classlist');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('goog.style');
+goog.require('ol.Attribution');
+goog.require('ol.control.Control');
+goog.require('ol.css');
+
+
+
+/**
+ * @classdesc
+ * Control to show all the attributions associated with the layer sources
+ * in the map. This control is one of the default controls included in maps.
+ * By default it will show in the bottom right portion of the map, but this can
+ * be changed by using a css selector for `.ol-attribution`.
+ *
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.AttributionOptions=} opt_options Attribution options.
+ * @api stable
+ */
+ol.control.Attribution = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.ulElement_ = goog.dom.createElement(goog.dom.TagName.UL);
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.logoLi_ = goog.dom.createElement(goog.dom.TagName.LI);
+
+  goog.dom.appendChild(this.ulElement_, this.logoLi_);
+  goog.style.setElementShown(this.logoLi_, false);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.collapsed_ = goog.isDef(options.collapsed) ? options.collapsed : true;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.collapsible_ = goog.isDef(options.collapsible) ?
+      options.collapsible : true;
+
+  if (!this.collapsible_) {
+    this.collapsed_ = false;
+  }
+
+  var className = goog.isDef(options.className) ?
+      options.className : 'ol-attribution';
+
+  var tipLabel = goog.isDef(options.tipLabel) ?
+      options.tipLabel : 'Attributions';
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.collapseLabel_ = goog.isDef(options.collapseLabel) ?
+      options.collapseLabel : '\u00BB';
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.label_ = goog.isDef(options.label) ? options.label : 'i';
+  var label = goog.dom.createDom(goog.dom.TagName.SPAN, {},
+      (this.collapsible_ && !this.collapsed_) ?
+      this.collapseLabel_ : this.label_);
+
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.labelSpan_ = label;
+  var button = goog.dom.createDom(goog.dom.TagName.BUTTON, {
+    'type': 'button',
+    'title': tipLabel
+  }, this.labelSpan_);
+
+  goog.events.listen(button, goog.events.EventType.CLICK,
+      this.handleClick_, false, this);
+
+  goog.events.listen(button, [
+    goog.events.EventType.MOUSEOUT,
+    goog.events.EventType.FOCUSOUT
+  ], function() {
+    this.blur();
+  }, false);
+
+  var cssClasses = className + ' ' + ol.css.CLASS_UNSELECTABLE + ' ' +
+      ol.css.CLASS_CONTROL +
+      (this.collapsed_ && this.collapsible_ ? ' ol-collapsed' : '') +
+      (this.collapsible_ ? '' : ' ol-uncollapsible');
+  var element = goog.dom.createDom(goog.dom.TagName.DIV,
+      cssClasses, this.ulElement_, button);
+
+  var render = goog.isDef(options.render) ?
+      options.render : ol.control.Attribution.render;
+
+  goog.base(this, {
+    element: element,
+    render: render,
+    target: options.target
+  });
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.renderedVisible_ = true;
+
+  /**
+   * @private
+   * @type {Object.<string, Element>}
+   */
+  this.attributionElements_ = {};
+
+  /**
+   * @private
+   * @type {Object.<string, boolean>}
+   */
+  this.attributionElementRenderedVisible_ = {};
+
+  /**
+   * @private
+   * @type {Object.<string, Element>}
+   */
+  this.logoElements_ = {};
+
+};
+goog.inherits(ol.control.Attribution, ol.control.Control);
+
+
+/**
+ * @param {?olx.FrameState} frameState Frame state.
+ * @return {Array.<Object.<string, ol.Attribution>>} Attributions.
+ */
+ol.control.Attribution.prototype.getSourceAttributions = function(frameState) {
+  var i, ii, j, jj, tileRanges, source, sourceAttribution,
+      sourceAttributionKey, sourceAttributions, sourceKey;
+  var layerStatesArray = frameState.layerStatesArray;
+  /** @type {Object.<string, ol.Attribution>} */
+  var attributions = goog.object.clone(frameState.attributions);
+  /** @type {Object.<string, ol.Attribution>} */
+  var hiddenAttributions = {};
+  for (i = 0, ii = layerStatesArray.length; i < ii; i++) {
+    source = layerStatesArray[i].layer.getSource();
+    if (goog.isNull(source)) {
+      continue;
+    }
+    sourceKey = goog.getUid(source).toString();
+    sourceAttributions = source.getAttributions();
+    if (goog.isNull(sourceAttributions)) {
+      continue;
+    }
+    for (j = 0, jj = sourceAttributions.length; j < jj; j++) {
+      sourceAttribution = sourceAttributions[j];
+      sourceAttributionKey = goog.getUid(sourceAttribution).toString();
+      if (sourceAttributionKey in attributions) {
+        continue;
+      }
+      tileRanges = frameState.usedTiles[sourceKey];
+      if (goog.isDef(tileRanges) &&
+          sourceAttribution.intersectsAnyTileRange(tileRanges)) {
+        if (sourceAttributionKey in hiddenAttributions) {
+          delete hiddenAttributions[sourceAttributionKey];
+        }
+        attributions[sourceAttributionKey] = sourceAttribution;
+      }
+      else {
+        hiddenAttributions[sourceAttributionKey] = sourceAttribution;
+      }
+    }
+  }
+  return [attributions, hiddenAttributions];
+};
+
+
+/**
+ * @param {ol.MapEvent} mapEvent Map event.
+ * @this {ol.control.Attribution}
+ * @api
+ */
+ol.control.Attribution.render = function(mapEvent) {
+  this.updateElement_(mapEvent.frameState);
+};
+
+
+/**
+ * @private
+ * @param {?olx.FrameState} frameState Frame state.
+ */
+ol.control.Attribution.prototype.updateElement_ = function(frameState) {
+
+  if (goog.isNull(frameState)) {
+    if (this.renderedVisible_) {
+      goog.style.setElementShown(this.element, false);
+      this.renderedVisible_ = false;
+    }
+    return;
+  }
+
+  var attributions = this.getSourceAttributions(frameState);
+  /** @type {Object.<string, ol.Attribution>} */
+  var visibleAttributions = attributions[0];
+  /** @type {Object.<string, ol.Attribution>} */
+  var hiddenAttributions = attributions[1];
+
+  var attributionElement, attributionKey;
+  for (attributionKey in this.attributionElements_) {
+    if (attributionKey in visibleAttributions) {
+      if (!this.attributionElementRenderedVisible_[attributionKey]) {
+        goog.style.setElementShown(
+            this.attributionElements_[attributionKey], true);
+        this.attributionElementRenderedVisible_[attributionKey] = true;
+      }
+      delete visibleAttributions[attributionKey];
+    }
+    else if (attributionKey in hiddenAttributions) {
+      if (this.attributionElementRenderedVisible_[attributionKey]) {
+        goog.style.setElementShown(
+            this.attributionElements_[attributionKey], false);
+        delete this.attributionElementRenderedVisible_[attributionKey];
+      }
+      delete hiddenAttributions[attributionKey];
+    }
+    else {
+      goog.dom.removeNode(this.attributionElements_[attributionKey]);
+      delete this.attributionElements_[attributionKey];
+      delete this.attributionElementRenderedVisible_[attributionKey];
+    }
+  }
+  for (attributionKey in visibleAttributions) {
+    attributionElement = goog.dom.createElement(goog.dom.TagName.LI);
+    attributionElement.innerHTML =
+        visibleAttributions[attributionKey].getHTML();
+    goog.dom.appendChild(this.ulElement_, attributionElement);
+    this.attributionElements_[attributionKey] = attributionElement;
+    this.attributionElementRenderedVisible_[attributionKey] = true;
+  }
+  for (attributionKey in hiddenAttributions) {
+    attributionElement = goog.dom.createElement(goog.dom.TagName.LI);
+    attributionElement.innerHTML =
+        hiddenAttributions[attributionKey].getHTML();
+    goog.style.setElementShown(attributionElement, false);
+    goog.dom.appendChild(this.ulElement_, attributionElement);
+    this.attributionElements_[attributionKey] = attributionElement;
+  }
+
+  var renderVisible =
+      !goog.object.isEmpty(this.attributionElementRenderedVisible_) ||
+      !goog.object.isEmpty(frameState.logos);
+  if (this.renderedVisible_ != renderVisible) {
+    goog.style.setElementShown(this.element, renderVisible);
+    this.renderedVisible_ = renderVisible;
+  }
+  if (renderVisible &&
+      goog.object.isEmpty(this.attributionElementRenderedVisible_)) {
+    goog.dom.classlist.add(this.element, 'ol-logo-only');
+  } else {
+    goog.dom.classlist.remove(this.element, 'ol-logo-only');
+  }
+
+  this.insertLogos_(frameState);
+
+};
+
+
+/**
+ * @param {?olx.FrameState} frameState Frame state.
+ * @private
+ */
+ol.control.Attribution.prototype.insertLogos_ = function(frameState) {
+
+  var logo;
+  var logos = frameState.logos;
+  var logoElements = this.logoElements_;
+
+  for (logo in logoElements) {
+    if (!(logo in logos)) {
+      goog.dom.removeNode(logoElements[logo]);
+      delete logoElements[logo];
+    }
+  }
+
+  var image, logoElement, logoKey;
+  for (logoKey in logos) {
+    if (!(logoKey in logoElements)) {
+      image = new Image();
+      image.src = logoKey;
+      var logoValue = logos[logoKey];
+      if (logoValue === '') {
+        logoElement = image;
+      } else {
+        logoElement = goog.dom.createDom(goog.dom.TagName.A, {
+          'href': logoValue
+        });
+        logoElement.appendChild(image);
+      }
+      goog.dom.appendChild(this.logoLi_, logoElement);
+      logoElements[logoKey] = logoElement;
+    }
+  }
+
+  goog.style.setElementShown(this.logoLi_, !goog.object.isEmpty(logos));
+
+};
+
+
+/**
+ * @param {goog.events.BrowserEvent} event The event to handle
+ * @private
+ */
+ol.control.Attribution.prototype.handleClick_ = function(event) {
+  event.preventDefault();
+  this.handleToggle_();
+};
+
+
+/**
+ * @private
+ */
+ol.control.Attribution.prototype.handleToggle_ = function() {
+  goog.dom.classlist.toggle(this.element, 'ol-collapsed');
+  goog.dom.setTextContent(this.labelSpan_,
+      (this.collapsed_) ? this.collapseLabel_ : this.label_);
+  this.collapsed_ = !this.collapsed_;
+};
+
+
+/**
+ * @return {boolean} True if the widget is collapsible.
+ * @api stable
+ */
+ol.control.Attribution.prototype.getCollapsible = function() {
+  return this.collapsible_;
+};
+
+
+/**
+ * @param {boolean} collapsible True if the widget is collapsible.
+ * @api stable
+ */
+ol.control.Attribution.prototype.setCollapsible = function(collapsible) {
+  if (this.collapsible_ === collapsible) {
+    return;
+  }
+  this.collapsible_ = collapsible;
+  goog.dom.classlist.toggle(this.element, 'ol-uncollapsible');
+  if (!collapsible && this.collapsed_) {
+    this.handleToggle_();
+  }
+};
+
+
+/**
+ * @param {boolean} collapsed True if the widget is collapsed.
+ * @api stable
+ */
+ol.control.Attribution.prototype.setCollapsed = function(collapsed) {
+  if (!this.collapsible_ || this.collapsed_ === collapsed) {
+    return;
+  }
+  this.handleToggle_();
+};
+
+
+/**
+ * @return {boolean} True if the widget is collapsed.
+ * @api stable
+ */
+ol.control.Attribution.prototype.getCollapsed = function() {
+  return this.collapsed_;
+};
diff --git a/src/ol/control/control.js b/src/ol/control/control.js
new file mode 100644
index 0000000..73ce0e1
--- /dev/null
+++ b/src/ol/control/control.js
@@ -0,0 +1,123 @@
+goog.provide('ol.control.Control');
+
+goog.require('goog.array');
+goog.require('goog.dom');
+goog.require('goog.events');
+goog.require('ol.MapEventType');
+goog.require('ol.Object');
+
+
+
+/**
+ * @classdesc
+ * A control is a visible widget with a DOM element in a fixed position on the
+ * screen. They can involve user input (buttons), or be informational only;
+ * the position is determined using CSS. By default these are placed in the
+ * container with CSS class name `ol-overlaycontainer-stopevent`, but can use
+ * any outside DOM element.
+ *
+ * This is the base class for controls. You can use it for simple custom
+ * controls by creating the element with listeners, creating an instance:
+ * ```js
+ * var myControl = new ol.control.Control({element: myElement});
+ * ```
+ * and then adding this to the map.
+ *
+ * The main advantage of having this as a control rather than a simple separate
+ * DOM element is that preventing propagation is handled for you. Controls
+ * will also be `ol.Object`s in a `ol.Collection`, so you can use their
+ * methods.
+ *
+ * You can also extend this base for your own control class. See
+ * examples/custom-controls for an example of how to do this.
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @implements {oli.control.Control}
+ * @param {olx.control.ControlOptions} options Control options.
+ * @api stable
+ */
+ol.control.Control = function(options) {
+
+  goog.base(this);
+
+  /**
+   * @protected
+   * @type {Element}
+   */
+  this.element = goog.isDef(options.element) ? options.element : null;
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.target_ = goog.isDef(options.target) ?
+      goog.dom.getElement(options.target) : null;
+
+  /**
+   * @private
+   * @type {ol.Map}
+   */
+  this.map_ = null;
+
+  /**
+   * @protected
+   * @type {!Array.<?number>}
+   */
+  this.listenerKeys = [];
+
+  /**
+   * @type {function(ol.MapEvent)}
+   */
+  this.render = goog.isDef(options.render) ? options.render : goog.nullFunction;
+
+};
+goog.inherits(ol.control.Control, ol.Object);
+
+
+/**
+ * @inheritDoc
+ */
+ol.control.Control.prototype.disposeInternal = function() {
+  goog.dom.removeNode(this.element);
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * Get the map associated with this control.
+ * @return {ol.Map} Map.
+ * @api stable
+ */
+ol.control.Control.prototype.getMap = function() {
+  return this.map_;
+};
+
+
+/**
+ * Remove the control from its current map and attach it to the new map.
+ * Subclasses may set up event handlers to get notified about changes to
+ * the map here.
+ * @param {ol.Map} map Map.
+ * @api stable
+ */
+ol.control.Control.prototype.setMap = function(map) {
+  if (!goog.isNull(this.map_)) {
+    goog.dom.removeNode(this.element);
+  }
+  if (!goog.array.isEmpty(this.listenerKeys)) {
+    goog.array.forEach(this.listenerKeys, goog.events.unlistenByKey);
+    this.listenerKeys.length = 0;
+  }
+  this.map_ = map;
+  if (!goog.isNull(this.map_)) {
+    var target = !goog.isNull(this.target_) ?
+        this.target_ : map.getOverlayContainerStopEvent();
+    goog.dom.appendChild(target, this.element);
+    if (this.render !== goog.nullFunction) {
+      this.listenerKeys.push(goog.events.listen(map,
+          ol.MapEventType.POSTRENDER, this.render, false, this));
+    }
+    map.render();
+  }
+};
diff --git a/src/ol/control/controldefaults.js b/src/ol/control/controldefaults.js
new file mode 100644
index 0000000..c9c6170
--- /dev/null
+++ b/src/ol/control/controldefaults.js
@@ -0,0 +1,47 @@
+goog.provide('ol.control');
+
+goog.require('ol.Collection');
+goog.require('ol.control.Attribution');
+goog.require('ol.control.Rotate');
+goog.require('ol.control.Zoom');
+
+
+/**
+ * Set of controls included in maps by default. Unless configured otherwise,
+ * this returns a collection containing an instance of each of the following
+ * controls:
+ * * {@link ol.control.Zoom}
+ * * {@link ol.control.Rotate}
+ * * {@link ol.control.Attribution}
+ *
+ * @param {olx.control.DefaultsOptions=} opt_options Defaults options.
+ * @return {ol.Collection.<ol.control.Control>} Controls.
+ * @api stable
+ */
+ol.control.defaults = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var controls = new ol.Collection();
+
+  var zoomControl = goog.isDef(options.zoom) ?
+      options.zoom : true;
+  if (zoomControl) {
+    controls.push(new ol.control.Zoom(options.zoomOptions));
+  }
+
+  var rotateControl = goog.isDef(options.rotate) ?
+      options.rotate : true;
+  if (rotateControl) {
+    controls.push(new ol.control.Rotate(options.rotateOptions));
+  }
+
+  var attributionControl = goog.isDef(options.attribution) ?
+      options.attribution : true;
+  if (attributionControl) {
+    controls.push(new ol.control.Attribution(options.attributionOptions));
+  }
+
+  return controls;
+
+};
diff --git a/src/ol/control/fullscreencontrol.js b/src/ol/control/fullscreencontrol.js
new file mode 100644
index 0000000..8b688e3
--- /dev/null
+++ b/src/ol/control/fullscreencontrol.js
@@ -0,0 +1,135 @@
+goog.provide('ol.control.FullScreen');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.classlist');
+goog.require('goog.dom.fullscreen');
+goog.require('goog.dom.fullscreen.EventType');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('ol.control.Control');
+goog.require('ol.css');
+
+
+
+/**
+ * @classdesc
+ * Provides a button that when clicked fills up the full screen with the map.
+ * When in full screen mode, a close button is shown to exit full screen mode.
+ * The [Fullscreen API](http://www.w3.org/TR/fullscreen/) is used to
+ * toggle the map in full screen mode.
+ *
+ *
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.FullScreenOptions=} opt_options Options.
+ * @api stable
+ */
+ol.control.FullScreen = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.cssClassName_ = goog.isDef(options.className) ?
+      options.className : 'ol-full-screen';
+
+  var tipLabel = goog.isDef(options.tipLabel) ?
+      options.tipLabel : 'Toggle full-screen';
+  var button = goog.dom.createDom(goog.dom.TagName.BUTTON, {
+    'class': this.cssClassName_ + '-' + goog.dom.fullscreen.isFullScreen(),
+    'type': 'button',
+    'title': tipLabel
+  });
+
+  goog.events.listen(button, goog.events.EventType.CLICK,
+      this.handleClick_, false, this);
+
+  goog.events.listen(button, [
+    goog.events.EventType.MOUSEOUT,
+    goog.events.EventType.FOCUSOUT
+  ], function() {
+    this.blur();
+  }, false);
+
+  goog.events.listen(goog.global.document,
+      goog.dom.fullscreen.EventType.CHANGE,
+      this.handleFullScreenChange_, false, this);
+
+  var cssClasses = this.cssClassName_ + ' ' + ol.css.CLASS_UNSELECTABLE +
+      ' ' + ol.css.CLASS_CONTROL + ' ' +
+      (!goog.dom.fullscreen.isSupported() ? ol.css.CLASS_UNSUPPORTED : '');
+  var element = goog.dom.createDom(goog.dom.TagName.DIV, cssClasses, button);
+
+  goog.base(this, {
+    element: element,
+    target: options.target
+  });
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.keys_ = goog.isDef(options.keys) ? options.keys : false;
+
+};
+goog.inherits(ol.control.FullScreen, ol.control.Control);
+
+
+/**
+ * @param {goog.events.BrowserEvent} event The event to handle
+ * @private
+ */
+ol.control.FullScreen.prototype.handleClick_ = function(event) {
+  event.preventDefault();
+  this.handleFullScreen_();
+};
+
+
+/**
+ * @private
+ */
+ol.control.FullScreen.prototype.handleFullScreen_ = function() {
+  if (!goog.dom.fullscreen.isSupported()) {
+    return;
+  }
+  var map = this.getMap();
+  if (goog.isNull(map)) {
+    return;
+  }
+  if (goog.dom.fullscreen.isFullScreen()) {
+    goog.dom.fullscreen.exitFullScreen();
+  } else {
+    var target = map.getTarget();
+    goog.asserts.assert(goog.isDefAndNotNull(target));
+    var element = goog.dom.getElement(target);
+    goog.asserts.assert(goog.isDefAndNotNull(element));
+    if (this.keys_) {
+      goog.dom.fullscreen.requestFullScreenWithKeys(element);
+    } else {
+      goog.dom.fullscreen.requestFullScreen(element);
+    }
+  }
+};
+
+
+/**
+ * @private
+ */
+ol.control.FullScreen.prototype.handleFullScreenChange_ = function() {
+  var opened = this.cssClassName_ + '-true';
+  var closed = this.cssClassName_ + '-false';
+  var anchor = goog.dom.getFirstElementChild(this.element);
+  var map = this.getMap();
+  if (goog.dom.fullscreen.isFullScreen()) {
+    goog.dom.classlist.swap(anchor, closed, opened);
+  } else {
+    goog.dom.classlist.swap(anchor, opened, closed);
+  }
+  if (!goog.isNull(map)) {
+    map.updateSize();
+  }
+};
diff --git a/src/ol/control/mousepositioncontrol.js b/src/ol/control/mousepositioncontrol.js
new file mode 100644
index 0000000..ef55834
--- /dev/null
+++ b/src/ol/control/mousepositioncontrol.js
@@ -0,0 +1,265 @@
+// FIXME should listen on appropriate pane, once it is defined
+
+goog.provide('ol.control.MousePosition');
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('ol.CoordinateFormatType');
+goog.require('ol.Object');
+goog.require('ol.Pixel');
+goog.require('ol.TransformFunction');
+goog.require('ol.control.Control');
+goog.require('ol.proj');
+goog.require('ol.proj.Projection');
+
+
+/**
+ * @enum {string}
+ */
+ol.control.MousePositionProperty = {
+  PROJECTION: 'projection',
+  COORDINATE_FORMAT: 'coordinateFormat'
+};
+
+
+
+/**
+ * @classdesc
+ * A control to show the 2D coordinates of the mouse cursor. By default, these
+ * are in the view projection, but can be in any supported projection.
+ * By default the control is shown in the top right corner of the map, but this
+ * can be changed by using the css selector `.ol-mouse-position`.
+ *
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.MousePositionOptions=} opt_options Mouse position
+ *     options.
+ * @api stable
+ */
+ol.control.MousePosition = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var className = goog.isDef(options.className) ?
+      options.className : 'ol-mouse-position';
+
+  var element = goog.dom.createDom(goog.dom.TagName.DIV, className);
+
+  var render = goog.isDef(options.render) ?
+      options.render : ol.control.MousePosition.render;
+
+  goog.base(this, {
+    element: element,
+    render: render,
+    target: options.target
+  });
+
+  goog.events.listen(this,
+      ol.Object.getChangeEventType(ol.control.MousePositionProperty.PROJECTION),
+      this.handleProjectionChanged_, false, this);
+
+  if (goog.isDef(options.coordinateFormat)) {
+    this.setCoordinateFormat(options.coordinateFormat);
+  }
+  if (goog.isDef(options.projection)) {
+    this.setProjection(ol.proj.get(options.projection));
+  }
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.undefinedHTML_ = goog.isDef(options.undefinedHTML) ?
+      options.undefinedHTML : '';
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.renderedHTML_ = element.innerHTML;
+
+  /**
+   * @private
+   * @type {ol.proj.Projection}
+   */
+  this.mapProjection_ = null;
+
+  /**
+   * @private
+   * @type {?ol.TransformFunction}
+   */
+  this.transform_ = null;
+
+  /**
+   * @private
+   * @type {ol.Pixel}
+   */
+  this.lastMouseMovePixel_ = null;
+
+};
+goog.inherits(ol.control.MousePosition, ol.control.Control);
+
+
+/**
+ * @param {ol.MapEvent} mapEvent Map event.
+ * @this {ol.control.MousePosition}
+ * @api
+ */
+ol.control.MousePosition.render = function(mapEvent) {
+  var frameState = mapEvent.frameState;
+  if (goog.isNull(frameState)) {
+    this.mapProjection_ = null;
+  } else {
+    if (this.mapProjection_ != frameState.viewState.projection) {
+      this.mapProjection_ = frameState.viewState.projection;
+      this.transform_ = null;
+    }
+  }
+  this.updateHTML_(this.lastMouseMovePixel_);
+};
+
+
+/**
+ * @private
+ */
+ol.control.MousePosition.prototype.handleProjectionChanged_ = function() {
+  this.transform_ = null;
+};
+
+
+/**
+ * @return {ol.CoordinateFormatType|undefined} The format to render the current
+ *     position in.
+ * @observable
+ * @api stable
+ */
+ol.control.MousePosition.prototype.getCoordinateFormat = function() {
+  return /** @type {ol.CoordinateFormatType|undefined} */ (
+      this.get(ol.control.MousePositionProperty.COORDINATE_FORMAT));
+};
+goog.exportProperty(
+    ol.control.MousePosition.prototype,
+    'getCoordinateFormat',
+    ol.control.MousePosition.prototype.getCoordinateFormat);
+
+
+/**
+ * @return {ol.proj.Projection|undefined} The projection to report mouse
+ *     position in.
+ * @observable
+ * @api stable
+ */
+ol.control.MousePosition.prototype.getProjection = function() {
+  return /** @type {ol.proj.Projection|undefined} */ (
+      this.get(ol.control.MousePositionProperty.PROJECTION));
+};
+goog.exportProperty(
+    ol.control.MousePosition.prototype,
+    'getProjection',
+    ol.control.MousePosition.prototype.getProjection);
+
+
+/**
+ * @param {goog.events.BrowserEvent} browserEvent Browser event.
+ * @protected
+ */
+ol.control.MousePosition.prototype.handleMouseMove = function(browserEvent) {
+  var map = this.getMap();
+  this.lastMouseMovePixel_ = map.getEventPixel(browserEvent.getBrowserEvent());
+  this.updateHTML_(this.lastMouseMovePixel_);
+};
+
+
+/**
+ * @param {goog.events.BrowserEvent} browserEvent Browser event.
+ * @protected
+ */
+ol.control.MousePosition.prototype.handleMouseOut = function(browserEvent) {
+  this.updateHTML_(null);
+  this.lastMouseMovePixel_ = null;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.control.MousePosition.prototype.setMap = function(map) {
+  goog.base(this, 'setMap', map);
+  if (!goog.isNull(map)) {
+    var viewport = map.getViewport();
+    this.listenerKeys.push(
+        goog.events.listen(viewport, goog.events.EventType.MOUSEMOVE,
+            this.handleMouseMove, false, this),
+        goog.events.listen(viewport, goog.events.EventType.MOUSEOUT,
+            this.handleMouseOut, false, this)
+    );
+  }
+};
+
+
+/**
+ * @param {ol.CoordinateFormatType} format The format to render the current
+ *     position in.
+ * @observable
+ * @api stable
+ */
+ol.control.MousePosition.prototype.setCoordinateFormat = function(format) {
+  this.set(ol.control.MousePositionProperty.COORDINATE_FORMAT, format);
+};
+goog.exportProperty(
+    ol.control.MousePosition.prototype,
+    'setCoordinateFormat',
+    ol.control.MousePosition.prototype.setCoordinateFormat);
+
+
+/**
+ * @param {ol.proj.Projection} projection The projection to report mouse
+ *     position in.
+ * @observable
+ * @api stable
+ */
+ol.control.MousePosition.prototype.setProjection = function(projection) {
+  this.set(ol.control.MousePositionProperty.PROJECTION, projection);
+};
+goog.exportProperty(
+    ol.control.MousePosition.prototype,
+    'setProjection',
+    ol.control.MousePosition.prototype.setProjection);
+
+
+/**
+ * @param {?ol.Pixel} pixel Pixel.
+ * @private
+ */
+ol.control.MousePosition.prototype.updateHTML_ = function(pixel) {
+  var html = this.undefinedHTML_;
+  if (!goog.isNull(pixel) && !goog.isNull(this.mapProjection_)) {
+    if (goog.isNull(this.transform_)) {
+      var projection = this.getProjection();
+      if (goog.isDef(projection)) {
+        this.transform_ = ol.proj.getTransformFromProjections(
+            this.mapProjection_, projection);
+      } else {
+        this.transform_ = ol.proj.identityTransform;
+      }
+    }
+    var map = this.getMap();
+    var coordinate = map.getCoordinateFromPixel(pixel);
+    if (!goog.isNull(coordinate)) {
+      this.transform_(coordinate, coordinate);
+      var coordinateFormat = this.getCoordinateFormat();
+      if (goog.isDef(coordinateFormat)) {
+        html = coordinateFormat(coordinate);
+      } else {
+        html = coordinate.toString();
+      }
+    }
+  }
+  if (!goog.isDef(this.renderedHTML_) || html != this.renderedHTML_) {
+    this.element.innerHTML = html;
+    this.renderedHTML_ = html;
+  }
+};
diff --git a/src/ol/control/overviewmapcontrol.js b/src/ol/control/overviewmapcontrol.js
new file mode 100644
index 0000000..628bdc7
--- /dev/null
+++ b/src/ol/control/overviewmapcontrol.js
@@ -0,0 +1,492 @@
+goog.provide('ol.control.OverviewMap');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.classlist');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.math.Size');
+goog.require('goog.style');
+goog.require('ol.Collection');
+goog.require('ol.Map');
+goog.require('ol.MapEventType');
+goog.require('ol.Object');
+goog.require('ol.Overlay');
+goog.require('ol.OverlayPositioning');
+goog.require('ol.View');
+goog.require('ol.control.Control');
+goog.require('ol.coordinate');
+goog.require('ol.css');
+goog.require('ol.extent');
+
+
+
+/**
+ * Create a new control with a map acting as an overview map for an other
+ * defined map.
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.OverviewMapOptions=} opt_options OverviewMap options.
+ * @api
+ */
+ol.control.OverviewMap = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @type {boolean}
+   * @private
+   */
+  this.collapsed_ = goog.isDef(options.collapsed) ? options.collapsed : true;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.collapsible_ = goog.isDef(options.collapsible) ?
+      options.collapsible : true;
+
+  if (!this.collapsible_) {
+    this.collapsed_ = false;
+  }
+
+  var className = goog.isDef(options.className) ?
+      options.className : 'ol-overviewmap';
+
+  var tipLabel = goog.isDef(options.tipLabel) ?
+      options.tipLabel : 'Overview map';
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.collapseLabel_ = goog.isDef(options.collapseLabel) ?
+      options.collapseLabel : '\u00AB';
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.label_ = goog.isDef(options.label) ? options.label : '\u00BB';
+  var label = goog.dom.createDom(goog.dom.TagName.SPAN, {},
+      (this.collapsible_ && !this.collapsed_) ?
+      this.collapseLabel_ : this.label_);
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.labelSpan_ = label;
+  var button = goog.dom.createDom(goog.dom.TagName.BUTTON, {
+    'type': 'button',
+    'title': tipLabel
+  }, this.labelSpan_);
+
+  goog.events.listen(button, goog.events.EventType.CLICK,
+      this.handleClick_, false, this);
+
+  goog.events.listen(button, [
+    goog.events.EventType.MOUSEOUT,
+    goog.events.EventType.FOCUSOUT
+  ], function() {
+    this.blur();
+  }, false);
+
+  var ovmapDiv = goog.dom.createDom(goog.dom.TagName.DIV, 'ol-overviewmap-map');
+
+  /**
+   * @type {ol.Map}
+   * @private
+   */
+  this.ovmap_ = new ol.Map({
+    controls: new ol.Collection(),
+    interactions: new ol.Collection(),
+    target: ovmapDiv
+  });
+  var ovmap = this.ovmap_;
+
+  if (goog.isDef(options.layers)) {
+    options.layers.forEach(
+        /**
+       * @param {ol.layer.Layer} layer Layer.
+       */
+        function(layer) {
+          ovmap.addLayer(layer);
+        }, this);
+  }
+
+  var box = goog.dom.createDom(goog.dom.TagName.DIV, 'ol-overviewmap-box');
+
+  /**
+   * @type {ol.Overlay}
+   * @private
+   */
+  this.boxOverlay_ = new ol.Overlay({
+    position: [0, 0],
+    positioning: ol.OverlayPositioning.BOTTOM_LEFT,
+    element: box
+  });
+  this.ovmap_.addOverlay(this.boxOverlay_);
+
+  var cssClasses = className + ' ' + ol.css.CLASS_UNSELECTABLE + ' ' +
+      ol.css.CLASS_CONTROL +
+      (this.collapsed_ && this.collapsible_ ? ' ol-collapsed' : '') +
+      (this.collapsible_ ? '' : ' ol-uncollapsible');
+  var element = goog.dom.createDom(goog.dom.TagName.DIV,
+      cssClasses, ovmapDiv, button);
+
+  var render = goog.isDef(options.render) ?
+      options.render : ol.control.OverviewMap.render;
+
+  goog.base(this, {
+    element: element,
+    render: render,
+    target: options.target
+  });
+};
+goog.inherits(ol.control.OverviewMap, ol.control.Control);
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.control.OverviewMap.prototype.setMap = function(map) {
+  var currentMap = this.getMap();
+
+  if (goog.isNull(map) && !goog.isNull(currentMap)) {
+    goog.events.unlisten(
+        currentMap, ol.Object.getChangeEventType(ol.MapProperty.VIEW),
+        this.handleViewChanged_, false, this);
+  }
+
+  goog.base(this, 'setMap', map);
+
+  if (!goog.isNull(map)) {
+
+    // if no layers were set for the overviewmap map, then bind with
+    // those in the main map
+    if (this.ovmap_.getLayers().getLength() === 0) {
+      this.ovmap_.bindTo(ol.MapProperty.LAYERGROUP, map);
+    }
+
+    // bind current map view, or any new one
+    this.bindView_();
+
+    goog.events.listen(
+        map, ol.Object.getChangeEventType(ol.MapProperty.VIEW),
+        this.handleViewChanged_, false, this);
+
+    this.ovmap_.updateSize();
+    this.resetExtent_();
+  }
+};
+
+
+/**
+ * Bind some actions to the main map view.
+ * @private
+ */
+ol.control.OverviewMap.prototype.bindView_ = function() {
+  var map = this.getMap();
+  var view = map.getView();
+
+  // if the map does not have a view, we can't act upon it
+  if (goog.isNull(view)) {
+    return;
+  }
+
+  // FIXME - the overviewmap view rotation currently follows the one used
+  // by the main map view.  We could support box rotation instead.  The choice
+  // between the 2 modes would be made in a single option
+  this.ovmap_.getView().bindTo(ol.ViewProperty.ROTATION, view);
+};
+
+
+/**
+ * @param {ol.MapEvent} mapEvent Map event.
+ * @this {ol.control.OverviewMap}
+ * @api
+ */
+ol.control.OverviewMap.render = function(mapEvent) {
+  this.validateExtent_();
+  this.updateBox_();
+};
+
+
+/**
+ * Called on main map view changed.
+ * @param {goog.events.Event} event Event.
+ * @private
+ */
+ol.control.OverviewMap.prototype.handleViewChanged_ = function(event) {
+  this.bindView_();
+};
+
+
+/**
+ * Reset the overview map extent if the box size (width or
+ * height) is less than the size of the overview map size times minRatio
+ * or is greater than the size of the overview size times maxRatio.
+ *
+ * If the map extent was not reset, the box size can fits in the defined
+ * ratio sizes. This method then checks if is contained inside the overview
+ * map current extent. If not, recenter the overview map to the current
+ * main map center location.
+ * @private
+ */
+ol.control.OverviewMap.prototype.validateExtent_ = function() {
+  var map = this.getMap();
+  var ovmap = this.ovmap_;
+
+  if (!map.isRendered() || !ovmap.isRendered()) {
+    return;
+  }
+
+  var mapSize = map.getSize();
+  goog.asserts.assertArray(mapSize);
+
+  var view = map.getView();
+  goog.asserts.assert(goog.isDef(view));
+  var extent = view.calculateExtent(mapSize);
+
+  var ovmapSize = ovmap.getSize();
+  goog.asserts.assertArray(ovmapSize);
+
+  var ovview = ovmap.getView();
+  goog.asserts.assert(goog.isDef(ovview));
+  var ovextent = ovview.calculateExtent(ovmapSize);
+
+  var topLeftPixel =
+      ovmap.getPixelFromCoordinate(ol.extent.getTopLeft(extent));
+  var bottomRightPixel =
+      ovmap.getPixelFromCoordinate(ol.extent.getBottomRight(extent));
+  var boxSize = new goog.math.Size(
+      Math.abs(topLeftPixel[0] - bottomRightPixel[0]),
+      Math.abs(topLeftPixel[1] - bottomRightPixel[1]));
+
+  var ovmapWidth = ovmapSize[0];
+  var ovmapHeight = ovmapSize[1];
+
+  if (boxSize.width < ovmapWidth * ol.OVERVIEWMAP_MIN_RATIO ||
+      boxSize.height < ovmapHeight * ol.OVERVIEWMAP_MIN_RATIO ||
+      boxSize.width > ovmapWidth * ol.OVERVIEWMAP_MAX_RATIO ||
+      boxSize.height > ovmapHeight * ol.OVERVIEWMAP_MAX_RATIO) {
+    this.resetExtent_();
+  } else if (!ol.extent.containsExtent(ovextent, extent)) {
+    this.recenter_();
+  }
+};
+
+
+/**
+ * Reset the overview map extent to half calculated min and max ratio times
+ * the extent of the main map.
+ * @private
+ */
+ol.control.OverviewMap.prototype.resetExtent_ = function() {
+  if (ol.OVERVIEWMAP_MAX_RATIO === 0 || ol.OVERVIEWMAP_MIN_RATIO === 0) {
+    return;
+  }
+
+  var map = this.getMap();
+  var ovmap = this.ovmap_;
+
+  var mapSize = map.getSize();
+  goog.asserts.assertArray(mapSize);
+
+  var view = map.getView();
+  goog.asserts.assert(goog.isDef(view));
+  var extent = view.calculateExtent(mapSize);
+
+  var ovmapSize = ovmap.getSize();
+  goog.asserts.assertArray(ovmapSize);
+
+  var ovview = ovmap.getView();
+  goog.asserts.assert(goog.isDef(ovview));
+
+  // get how many times the current map overview could hold different
+  // box sizes using the min and max ratio, pick the step in the middle used
+  // to calculate the extent from the main map to set it to the overview map,
+  var steps = Math.log(
+      ol.OVERVIEWMAP_MAX_RATIO / ol.OVERVIEWMAP_MIN_RATIO) / Math.LN2;
+  var ratio = 1 / (Math.pow(2, steps / 2) * ol.OVERVIEWMAP_MIN_RATIO);
+  ol.extent.scaleFromCenter(extent, ratio);
+  ovview.fitExtent(extent, ovmapSize);
+};
+
+
+/**
+ * Set the center of the overview map to the map center without changing its
+ * resolution.
+ * @private
+ */
+ol.control.OverviewMap.prototype.recenter_ = function() {
+  var map = this.getMap();
+  var ovmap = this.ovmap_;
+
+  var view = map.getView();
+  goog.asserts.assert(goog.isDef(view));
+
+  var ovview = ovmap.getView();
+  goog.asserts.assert(goog.isDef(ovview));
+
+  ovview.setCenter(view.getCenter());
+};
+
+
+/**
+ * Update the box using the main map extent
+ * @private
+ */
+ol.control.OverviewMap.prototype.updateBox_ = function() {
+  var map = this.getMap();
+  var ovmap = this.ovmap_;
+
+  if (!map.isRendered() || !ovmap.isRendered()) {
+    return;
+  }
+
+  var mapSize = map.getSize();
+  goog.asserts.assertArray(mapSize);
+
+  var view = map.getView();
+  goog.asserts.assert(goog.isDef(view));
+
+  var ovview = ovmap.getView();
+  goog.asserts.assert(goog.isDef(ovview));
+
+  var ovmapSize = ovmap.getSize();
+  goog.asserts.assertArray(ovmapSize);
+
+  var rotation = view.getRotation();
+  goog.asserts.assert(goog.isDef(rotation));
+
+  var overlay = this.boxOverlay_;
+  var box = this.boxOverlay_.getElement();
+  var extent = view.calculateExtent(mapSize);
+  var ovresolution = ovview.getResolution();
+  var bottomLeft = ol.extent.getBottomLeft(extent);
+  var topRight = ol.extent.getTopRight(extent);
+
+  // set position using bottom left coordinates
+  var rotateBottomLeft = this.calculateCoordinateRotate_(rotation, bottomLeft);
+  overlay.setPosition(rotateBottomLeft);
+
+  // set box size calculated from map extent size and overview map resolution
+  if (goog.isDefAndNotNull(box)) {
+    var boxWidth = Math.abs((bottomLeft[0] - topRight[0]) / ovresolution);
+    var boxHeight = Math.abs((topRight[1] - bottomLeft[1]) / ovresolution);
+    goog.style.setBorderBoxSize(box, new goog.math.Size(
+        boxWidth, boxHeight));
+  }
+};
+
+
+/**
+ * @param {number} rotation Target rotation.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @return {ol.Coordinate|undefined} Coordinate for rotation and center anchor.
+ * @private
+ */
+ol.control.OverviewMap.prototype.calculateCoordinateRotate_ = function(
+    rotation, coordinate) {
+  var coordinateRotate;
+
+  var map = this.getMap();
+  var view = map.getView();
+  goog.asserts.assert(goog.isDef(view));
+
+  var currentCenter = view.getCenter();
+
+  if (goog.isDef(currentCenter)) {
+    coordinateRotate = [
+      coordinate[0] - currentCenter[0],
+      coordinate[1] - currentCenter[1]
+    ];
+    ol.coordinate.rotate(coordinateRotate, rotation);
+    ol.coordinate.add(coordinateRotate, currentCenter);
+  }
+  return coordinateRotate;
+};
+
+
+/**
+ * @param {goog.events.BrowserEvent} event The event to handle
+ * @private
+ */
+ol.control.OverviewMap.prototype.handleClick_ = function(event) {
+  event.preventDefault();
+  this.handleToggle_();
+};
+
+
+/**
+ * @private
+ */
+ol.control.OverviewMap.prototype.handleToggle_ = function() {
+  goog.dom.classlist.toggle(this.element, 'ol-collapsed');
+  goog.dom.setTextContent(this.labelSpan_,
+      (this.collapsed_) ? this.collapseLabel_ : this.label_);
+  this.collapsed_ = !this.collapsed_;
+
+  // manage overview map if it had not been rendered before and control
+  // is expanded
+  var ovmap = this.ovmap_;
+  if (!this.collapsed_ && !ovmap.isRendered()) {
+    ovmap.updateSize();
+    this.resetExtent_();
+    goog.events.listenOnce(ovmap, ol.MapEventType.POSTRENDER,
+        function(event) {
+          this.updateBox_();
+        },
+        false, this);
+  }
+};
+
+
+/**
+ * @return {boolean} True if the widget is collapsible.
+ * @api stable
+ */
+ol.control.OverviewMap.prototype.getCollapsible = function() {
+  return this.collapsible_;
+};
+
+
+/**
+ * @param {boolean} collapsible True if the widget is collapsible.
+ * @api stable
+ */
+ol.control.OverviewMap.prototype.setCollapsible = function(collapsible) {
+  if (this.collapsible_ === collapsible) {
+    return;
+  }
+  this.collapsible_ = collapsible;
+  goog.dom.classlist.toggle(this.element, 'ol-uncollapsible');
+  if (!collapsible && this.collapsed_) {
+    this.handleToggle_();
+  }
+};
+
+
+/**
+ * @param {boolean} collapsed True if the widget is collapsed.
+ * @api stable
+ */
+ol.control.OverviewMap.prototype.setCollapsed = function(collapsed) {
+  if (!this.collapsible_ || this.collapsed_ === collapsed) {
+    return;
+  }
+  this.handleToggle_();
+};
+
+
+/**
+ * @return {boolean} True if the widget is collapsed.
+ * @api stable
+ */
+ol.control.OverviewMap.prototype.getCollapsed = function() {
+  return this.collapsed_;
+};
diff --git a/src/ol/control/rotatecontrol.js b/src/ol/control/rotatecontrol.js
new file mode 100644
index 0000000..4073063
--- /dev/null
+++ b/src/ol/control/rotatecontrol.js
@@ -0,0 +1,163 @@
+goog.provide('ol.control.Rotate');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.classlist');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.math');
+goog.require('ol.animation');
+goog.require('ol.control.Control');
+goog.require('ol.css');
+goog.require('ol.easing');
+
+
+
+/**
+ * @classdesc
+ * A button control to reset rotation to 0.
+ * To style this control use css selector `.ol-rotate`. A `.ol-hidden` css
+ * selector is added to the button when the rotation is 0.
+ *
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.RotateOptions=} opt_options Rotate options.
+ * @api stable
+ */
+ol.control.Rotate = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var className = goog.isDef(options.className) ?
+      options.className : 'ol-rotate';
+
+  /**
+   * @type {Element}
+   * @private
+   */
+  this.label_ = goog.dom.createDom(goog.dom.TagName.SPAN,
+      'ol-compass', goog.isDef(options.label) ? options.label : '\u21E7');
+
+  var tipLabel = goog.isDef(options.tipLabel) ?
+      options.tipLabel : 'Reset rotation';
+
+  var button = goog.dom.createDom(goog.dom.TagName.BUTTON, {
+    'class': className + '-reset',
+    'type' : 'button',
+    'title': tipLabel
+  }, this.label_);
+
+  goog.events.listen(button, goog.events.EventType.CLICK,
+      ol.control.Rotate.prototype.handleClick_, false, this);
+
+  goog.events.listen(button, [
+    goog.events.EventType.MOUSEOUT,
+    goog.events.EventType.FOCUSOUT
+  ], function() {
+    this.blur();
+  }, false);
+
+  var cssClasses = className + ' ' + ol.css.CLASS_UNSELECTABLE + ' ' +
+      ol.css.CLASS_CONTROL;
+  var element = goog.dom.createDom(goog.dom.TagName.DIV, cssClasses, button);
+
+  var render = goog.isDef(options.render) ?
+      options.render : ol.control.Rotate.render;
+
+  goog.base(this, {
+    element: element,
+    render: render,
+    target: options.target
+  });
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.duration_ = goog.isDef(options.duration) ? options.duration : 250;
+
+  /**
+   * @type {boolean}
+   * @private
+   */
+  this.autoHide_ = goog.isDef(options.autoHide) ? options.autoHide : true;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.rotation_ = undefined;
+
+  if (this.autoHide_) {
+    goog.dom.classlist.add(this.element, ol.css.CLASS_HIDDEN);
+  }
+
+};
+goog.inherits(ol.control.Rotate, ol.control.Control);
+
+
+/**
+ * @param {goog.events.BrowserEvent} event The event to handle
+ * @private
+ */
+ol.control.Rotate.prototype.handleClick_ = function(event) {
+  event.preventDefault();
+  this.resetNorth_();
+};
+
+
+/**
+ * @private
+ */
+ol.control.Rotate.prototype.resetNorth_ = function() {
+  var map = this.getMap();
+  var view = map.getView();
+  if (goog.isNull(view)) {
+    // the map does not have a view, so we can't act
+    // upon it
+    return;
+  }
+  var currentRotation = view.getRotation();
+  while (currentRotation < -Math.PI) {
+    currentRotation += 2 * Math.PI;
+  }
+  while (currentRotation > Math.PI) {
+    currentRotation -= 2 * Math.PI;
+  }
+  if (goog.isDef(currentRotation)) {
+    if (this.duration_ > 0) {
+      map.beforeRender(ol.animation.rotate({
+        rotation: currentRotation,
+        duration: this.duration_,
+        easing: ol.easing.easeOut
+      }));
+    }
+    view.setRotation(0);
+  }
+};
+
+
+/**
+ * @param {ol.MapEvent} mapEvent Map event.
+ * @this {ol.control.Rotate}
+ * @api
+ */
+ol.control.Rotate.render = function(mapEvent) {
+  var frameState = mapEvent.frameState;
+  if (goog.isNull(frameState)) {
+    return;
+  }
+  var rotation = frameState.viewState.rotation;
+  if (rotation != this.rotation_) {
+    var transform = 'rotate(' + goog.math.toDegrees(rotation) + 'deg)';
+    if (this.autoHide_) {
+      goog.dom.classlist.enable(
+          this.element, ol.css.CLASS_HIDDEN, rotation === 0);
+    }
+    this.label_.style.msTransform = transform;
+    this.label_.style.webkitTransform = transform;
+    this.label_.style.transform = transform;
+  }
+  this.rotation_ = rotation;
+};
diff --git a/src/ol/control/scalelinecontrol.js b/src/ol/control/scalelinecontrol.js
new file mode 100644
index 0000000..6ef6e4c
--- /dev/null
+++ b/src/ol/control/scalelinecontrol.js
@@ -0,0 +1,344 @@
+goog.provide('ol.control.ScaleLine');
+goog.provide('ol.control.ScaleLineProperty');
+goog.provide('ol.control.ScaleLineUnits');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.math');
+goog.require('goog.style');
+goog.require('ol.Object');
+goog.require('ol.TransformFunction');
+goog.require('ol.control.Control');
+goog.require('ol.css');
+goog.require('ol.proj');
+goog.require('ol.proj.Units');
+goog.require('ol.sphere.NORMAL');
+
+
+/**
+ * @enum {string}
+ */
+ol.control.ScaleLineProperty = {
+  UNITS: 'units'
+};
+
+
+/**
+ * Units for the scale line. Supported values are `'degrees'`, `'imperial'`,
+ * `'nautical'`, `'metric'`, `'us'`.
+ * @enum {string}
+ * @api stable
+ */
+ol.control.ScaleLineUnits = {
+  DEGREES: 'degrees',
+  IMPERIAL: 'imperial',
+  NAUTICAL: 'nautical',
+  METRIC: 'metric',
+  US: 'us'
+};
+
+
+
+/**
+ * @classdesc
+ * A control displaying rough x-axis distances, calculated for the center of the
+ * viewport.
+ * No scale line will be shown when the x-axis distance cannot be calculated in
+ * the view projection (e.g. at or beyond the poles in EPSG:4326).
+ * By default the scale line will show in the bottom left portion of the map,
+ * but this can be changed by using the css selector `.ol-scale-line`.
+ *
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.ScaleLineOptions=} opt_options Scale line options.
+ * @api stable
+ */
+ol.control.ScaleLine = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var className = goog.isDef(options.className) ?
+      options.className : 'ol-scale-line';
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.innerElement_ = goog.dom.createDom(goog.dom.TagName.DIV,
+      className + '-inner');
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.element_ = goog.dom.createDom(goog.dom.TagName.DIV,
+      className + ' ' + ol.css.CLASS_UNSELECTABLE, this.innerElement_);
+
+  /**
+   * @private
+   * @type {?olx.ViewState}
+   */
+  this.viewState_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.minWidth_ = goog.isDef(options.minWidth) ? options.minWidth : 64;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.renderedVisible_ = false;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.renderedWidth_ = undefined;
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.renderedHTML_ = '';
+
+  /**
+   * @private
+   * @type {?ol.TransformFunction}
+   */
+  this.toEPSG4326_ = null;
+
+  var render = goog.isDef(options.render) ?
+      options.render : ol.control.ScaleLine.render;
+
+  goog.base(this, {
+    element: this.element_,
+    render: render,
+    target: options.target
+  });
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.control.ScaleLineProperty.UNITS),
+      this.handleUnitsChanged_, false, this);
+
+  this.setUnits(/** @type {ol.control.ScaleLineUnits} */ (options.units) ||
+      ol.control.ScaleLineUnits.METRIC);
+
+};
+goog.inherits(ol.control.ScaleLine, ol.control.Control);
+
+
+/**
+ * @const
+ * @type {Array.<number>}
+ */
+ol.control.ScaleLine.LEADING_DIGITS = [1, 2, 5];
+
+
+/**
+ * @return {ol.control.ScaleLineUnits|undefined} The units to use in the scale
+ *     line.
+ * @observable
+ * @api stable
+ */
+ol.control.ScaleLine.prototype.getUnits = function() {
+  return /** @type {ol.control.ScaleLineUnits|undefined} */ (
+      this.get(ol.control.ScaleLineProperty.UNITS));
+};
+goog.exportProperty(
+    ol.control.ScaleLine.prototype,
+    'getUnits',
+    ol.control.ScaleLine.prototype.getUnits);
+
+
+/**
+ * @param {ol.MapEvent} mapEvent Map event.
+ * @this {ol.control.ScaleLine}
+ * @api
+ */
+ol.control.ScaleLine.render = function(mapEvent) {
+  var frameState = mapEvent.frameState;
+  if (goog.isNull(frameState)) {
+    this.viewState_ = null;
+  } else {
+    this.viewState_ = frameState.viewState;
+  }
+  this.updateElement_();
+};
+
+
+/**
+ * @private
+ */
+ol.control.ScaleLine.prototype.handleUnitsChanged_ = function() {
+  this.updateElement_();
+};
+
+
+/**
+ * @param {ol.control.ScaleLineUnits} units The units to use in the scale line.
+ * @observable
+ * @api stable
+ */
+ol.control.ScaleLine.prototype.setUnits = function(units) {
+  this.set(ol.control.ScaleLineProperty.UNITS, units);
+};
+goog.exportProperty(
+    ol.control.ScaleLine.prototype,
+    'setUnits',
+    ol.control.ScaleLine.prototype.setUnits);
+
+
+/**
+ * @private
+ */
+ol.control.ScaleLine.prototype.updateElement_ = function() {
+  var viewState = this.viewState_;
+
+  if (goog.isNull(viewState)) {
+    if (this.renderedVisible_) {
+      goog.style.setElementShown(this.element_, false);
+      this.renderedVisible_ = false;
+    }
+    return;
+  }
+
+  var center = viewState.center;
+  var projection = viewState.projection;
+  var pointResolution =
+      projection.getPointResolution(viewState.resolution, center);
+  var projectionUnits = projection.getUnits();
+
+  var cosLatitude;
+  var units = this.getUnits();
+  if (projectionUnits == ol.proj.Units.DEGREES &&
+      (units == ol.control.ScaleLineUnits.METRIC ||
+       units == ol.control.ScaleLineUnits.IMPERIAL ||
+       units == ol.control.ScaleLineUnits.US ||
+       units == ol.control.ScaleLineUnits.NAUTICAL)) {
+
+    // Convert pointResolution from degrees to meters
+    this.toEPSG4326_ = null;
+    cosLatitude = Math.cos(goog.math.toRadians(center[1]));
+    pointResolution *= Math.PI * cosLatitude * ol.sphere.NORMAL.radius / 180;
+    projectionUnits = ol.proj.Units.METERS;
+
+  } else if ((projectionUnits == ol.proj.Units.FEET ||
+      projectionUnits == ol.proj.Units.METERS) &&
+      units == ol.control.ScaleLineUnits.DEGREES) {
+
+    // Convert pointResolution from meters or feet to degrees
+    if (goog.isNull(this.toEPSG4326_)) {
+      this.toEPSG4326_ = ol.proj.getTransformFromProjections(
+          projection, ol.proj.get('EPSG:4326'));
+    }
+    cosLatitude = Math.cos(goog.math.toRadians(this.toEPSG4326_(center)[1]));
+    var radius = ol.sphere.NORMAL.radius;
+    if (projectionUnits == ol.proj.Units.FEET) {
+      radius /= 0.3048;
+    }
+    pointResolution *= 180 / (Math.PI * cosLatitude * radius);
+    projectionUnits = ol.proj.Units.DEGREES;
+
+  } else {
+    this.toEPSG4326_ = null;
+  }
+
+  goog.asserts.assert(
+      ((units == ol.control.ScaleLineUnits.METRIC ||
+        units == ol.control.ScaleLineUnits.IMPERIAL ||
+        units == ol.control.ScaleLineUnits.US ||
+        units == ol.control.ScaleLineUnits.NAUTICAL) &&
+       projectionUnits == ol.proj.Units.METERS) ||
+      (units == ol.control.ScaleLineUnits.DEGREES &&
+       projectionUnits == ol.proj.Units.DEGREES));
+
+  var nominalCount = this.minWidth_ * pointResolution;
+  var suffix = '';
+  if (units == ol.control.ScaleLineUnits.DEGREES) {
+    if (nominalCount < 1 / 60) {
+      suffix = '\u2033'; // seconds
+      pointResolution *= 3600;
+    } else if (nominalCount < 1) {
+      suffix = '\u2032'; // minutes
+      pointResolution *= 60;
+    } else {
+      suffix = '\u00b0'; // degrees
+    }
+  } else if (units == ol.control.ScaleLineUnits.IMPERIAL) {
+    if (nominalCount < 0.9144) {
+      suffix = 'in';
+      pointResolution /= 0.0254;
+    } else if (nominalCount < 1609.344) {
+      suffix = 'ft';
+      pointResolution /= 0.3048;
+    } else {
+      suffix = 'mi';
+      pointResolution /= 1609.344;
+    }
+  } else if (units == ol.control.ScaleLineUnits.NAUTICAL) {
+    pointResolution /= 1852;
+    suffix = 'nm';
+  } else if (units == ol.control.ScaleLineUnits.METRIC) {
+    if (nominalCount < 1) {
+      suffix = 'mm';
+      pointResolution *= 1000;
+    } else if (nominalCount < 1000) {
+      suffix = 'm';
+    } else {
+      suffix = 'km';
+      pointResolution /= 1000;
+    }
+  } else if (units == ol.control.ScaleLineUnits.US) {
+    if (nominalCount < 0.9144) {
+      suffix = 'in';
+      pointResolution *= 39.37;
+    } else if (nominalCount < 1609.344) {
+      suffix = 'ft';
+      pointResolution /= 0.30480061;
+    } else {
+      suffix = 'mi';
+      pointResolution /= 1609.3472;
+    }
+  } else {
+    goog.asserts.fail();
+  }
+
+  var i = 3 * Math.floor(
+      Math.log(this.minWidth_ * pointResolution) / Math.log(10));
+  var count, width;
+  while (true) {
+    count = ol.control.ScaleLine.LEADING_DIGITS[i % 3] *
+        Math.pow(10, Math.floor(i / 3));
+    width = Math.round(count / pointResolution);
+    if (isNaN(width)) {
+      goog.style.setElementShown(this.element_, false);
+      this.renderedVisible_ = false;
+      return;
+    } else if (width >= this.minWidth_) {
+      break;
+    }
+    ++i;
+  }
+
+  var html = count + suffix;
+  if (this.renderedHTML_ != html) {
+    this.innerElement_.innerHTML = html;
+    this.renderedHTML_ = html;
+  }
+
+  if (this.renderedWidth_ != width) {
+    this.innerElement_.style.width = width + 'px';
+    this.renderedWidth_ = width;
+  }
+
+  if (!this.renderedVisible_) {
+    goog.style.setElementShown(this.element_, true);
+    this.renderedVisible_ = true;
+  }
+
+};
diff --git a/src/ol/control/zoomcontrol.js b/src/ol/control/zoomcontrol.js
new file mode 100644
index 0000000..d9ec25b
--- /dev/null
+++ b/src/ol/control/zoomcontrol.js
@@ -0,0 +1,132 @@
+goog.provide('ol.control.Zoom');
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('ol.animation');
+goog.require('ol.control.Control');
+goog.require('ol.css');
+goog.require('ol.easing');
+
+
+
+/**
+ * @classdesc
+ * A control with 2 buttons, one for zoom in and one for zoom out.
+ * This control is one of the default controls of a map. To style this control
+ * use css selectors `.ol-zoom-in` and `.ol-zoom-out`.
+ *
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.ZoomOptions=} opt_options Zoom options.
+ * @api stable
+ */
+ol.control.Zoom = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var className = goog.isDef(options.className) ? options.className : 'ol-zoom';
+
+  var delta = goog.isDef(options.delta) ? options.delta : 1;
+
+  var zoomInLabel = goog.isDef(options.zoomInLabel) ?
+      options.zoomInLabel : '+';
+  var zoomOutLabel = goog.isDef(options.zoomOutLabel) ?
+      options.zoomOutLabel : '\u2212';
+
+  var zoomInTipLabel = goog.isDef(options.zoomInTipLabel) ?
+      options.zoomInTipLabel : 'Zoom in';
+  var zoomOutTipLabel = goog.isDef(options.zoomOutTipLabel) ?
+      options.zoomOutTipLabel : 'Zoom out';
+
+  var inElement = goog.dom.createDom(goog.dom.TagName.BUTTON, {
+    'class': className + '-in',
+    'type' : 'button',
+    'title': zoomInTipLabel
+  }, zoomInLabel);
+
+  goog.events.listen(inElement,
+      goog.events.EventType.CLICK, goog.partial(
+          ol.control.Zoom.prototype.handleClick_, delta), false, this);
+
+  goog.events.listen(inElement, [
+    goog.events.EventType.MOUSEOUT,
+    goog.events.EventType.FOCUSOUT
+  ], function() {
+    this.blur();
+  }, false);
+
+  var outElement = goog.dom.createDom(goog.dom.TagName.BUTTON, {
+    'class': className + '-out',
+    'type' : 'button',
+    'title': zoomOutTipLabel
+  }, zoomOutLabel);
+
+  goog.events.listen(outElement,
+      goog.events.EventType.CLICK, goog.partial(
+          ol.control.Zoom.prototype.handleClick_, -delta), false, this);
+
+  goog.events.listen(outElement, [
+    goog.events.EventType.MOUSEOUT,
+    goog.events.EventType.FOCUSOUT
+  ], function() {
+    this.blur();
+  }, false);
+
+  var cssClasses = className + ' ' + ol.css.CLASS_UNSELECTABLE + ' ' +
+      ol.css.CLASS_CONTROL;
+  var element = goog.dom.createDom(goog.dom.TagName.DIV, cssClasses, inElement,
+      outElement);
+
+  goog.base(this, {
+    element: element,
+    target: options.target
+  });
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.duration_ = goog.isDef(options.duration) ? options.duration : 250;
+
+};
+goog.inherits(ol.control.Zoom, ol.control.Control);
+
+
+/**
+ * @param {number} delta Zoom delta.
+ * @param {goog.events.BrowserEvent} event The event to handle
+ * @private
+ */
+ol.control.Zoom.prototype.handleClick_ = function(delta, event) {
+  event.preventDefault();
+  this.zoomByDelta_(delta);
+};
+
+
+/**
+ * @param {number} delta Zoom delta.
+ * @private
+ */
+ol.control.Zoom.prototype.zoomByDelta_ = function(delta) {
+  var map = this.getMap();
+  var view = map.getView();
+  if (goog.isNull(view)) {
+    // the map does not have a view, so we can't act
+    // upon it
+    return;
+  }
+  var currentResolution = view.getResolution();
+  if (goog.isDef(currentResolution)) {
+    if (this.duration_ > 0) {
+      map.beforeRender(ol.animation.zoom({
+        resolution: currentResolution,
+        duration: this.duration_,
+        easing: ol.easing.easeOut
+      }));
+    }
+    var newResolution = view.constrainResolution(currentResolution, delta);
+    view.setResolution(newResolution);
+  }
+};
diff --git a/src/ol/control/zoomslidercontrol.js b/src/ol/control/zoomslidercontrol.js
new file mode 100644
index 0000000..a2fb216
--- /dev/null
+++ b/src/ol/control/zoomslidercontrol.js
@@ -0,0 +1,327 @@
+// FIXME should possibly show tooltip when dragging?
+
+goog.provide('ol.control.ZoomSlider');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.Event');
+goog.require('goog.events.EventType');
+goog.require('goog.fx.DragDropEvent');
+goog.require('goog.fx.Dragger');
+goog.require('goog.fx.Dragger.EventType');
+goog.require('goog.math');
+goog.require('goog.math.Rect');
+goog.require('goog.style');
+goog.require('ol');
+goog.require('ol.Size');
+goog.require('ol.ViewHint');
+goog.require('ol.animation');
+goog.require('ol.control.Control');
+goog.require('ol.css');
+goog.require('ol.easing');
+
+
+
+/**
+ * @classdesc
+ * A slider type of control for zooming.
+ *
+ * Example:
+ *
+ *     map.addControl(new ol.control.ZoomSlider());
+ *
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.ZoomSliderOptions=} opt_options Zoom slider options.
+ * @api stable
+ */
+ol.control.ZoomSlider = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * Will hold the current resolution of the view.
+   *
+   * @type {number|undefined}
+   * @private
+   */
+  this.currentResolution_ = undefined;
+
+  /**
+   * The direction of the slider. Will be determined from actual display of the
+   * container and defaults to ol.control.ZoomSlider.direction.VERTICAL.
+   *
+   * @type {ol.control.ZoomSlider.direction}
+   * @private
+   */
+  this.direction_ = ol.control.ZoomSlider.direction.VERTICAL;
+
+  /**
+   * The calculated thumb size (border box plus margins).  Set when initSlider_
+   * is called.
+   * @type {ol.Size}
+   * @private
+   */
+  this.thumbSize_ = null;
+
+  /**
+   * Whether the slider is initialized.
+   * @type {boolean}
+   * @private
+   */
+  this.sliderInitialized_ = false;
+
+  var className = goog.isDef(options.className) ?
+      options.className : 'ol-zoomslider';
+  var thumbElement = goog.dom.createDom(goog.dom.TagName.DIV,
+      [className + '-thumb', ol.css.CLASS_UNSELECTABLE]);
+  var containerElement = goog.dom.createDom(goog.dom.TagName.DIV,
+      [className, ol.css.CLASS_UNSELECTABLE, ol.css.CLASS_CONTROL],
+      thumbElement);
+
+  /**
+   * @type {goog.fx.Dragger}
+   * @private
+   */
+  this.dragger_ = new goog.fx.Dragger(thumbElement);
+  this.registerDisposable(this.dragger_);
+
+  goog.events.listen(this.dragger_, goog.fx.Dragger.EventType.START,
+      this.handleDraggerStart_, false, this);
+  goog.events.listen(this.dragger_, goog.fx.Dragger.EventType.DRAG,
+      this.handleDraggerDrag_, false, this);
+  goog.events.listen(this.dragger_, goog.fx.Dragger.EventType.END,
+      this.handleDraggerEnd_, false, this);
+
+  goog.events.listen(containerElement, goog.events.EventType.CLICK,
+      this.handleContainerClick_, false, this);
+  goog.events.listen(thumbElement, goog.events.EventType.CLICK,
+      goog.events.Event.stopPropagation);
+
+  var render = goog.isDef(options.render) ?
+      options.render : ol.control.ZoomSlider.render;
+
+  goog.base(this, {
+    element: containerElement,
+    render: render
+  });
+};
+goog.inherits(ol.control.ZoomSlider, ol.control.Control);
+
+
+/**
+ * The enum for available directions.
+ *
+ * @enum {number}
+ */
+ol.control.ZoomSlider.direction = {
+  VERTICAL: 0,
+  HORIZONTAL: 1
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.control.ZoomSlider.prototype.setMap = function(map) {
+  goog.base(this, 'setMap', map);
+  if (!goog.isNull(map)) {
+    map.render();
+  }
+};
+
+
+/**
+ * Initializes the slider element. This will determine and set this controls
+ * direction_ and also constrain the dragging of the thumb to always be within
+ * the bounds of the container.
+ *
+ * @private
+ */
+ol.control.ZoomSlider.prototype.initSlider_ = function() {
+  var container = this.element;
+  var containerSize = goog.style.getSize(container);
+
+  var thumb = goog.dom.getFirstElementChild(container);
+  var thumbMargins = goog.style.getMarginBox(thumb);
+  var thumbBorderBoxSize = goog.style.getBorderBoxSize(thumb);
+  var thumbWidth = thumbBorderBoxSize.width +
+      thumbMargins.right + thumbMargins.left;
+  var thumbHeight = thumbBorderBoxSize.height +
+      thumbMargins.top + thumbMargins.bottom;
+  this.thumbSize_ = [thumbWidth, thumbHeight];
+
+  var width = containerSize.width - thumbWidth;
+  var height = containerSize.height - thumbHeight;
+
+  var limits;
+  if (containerSize.width > containerSize.height) {
+    this.direction_ = ol.control.ZoomSlider.direction.HORIZONTAL;
+    limits = new goog.math.Rect(0, 0, width, 0);
+  } else {
+    this.direction_ = ol.control.ZoomSlider.direction.VERTICAL;
+    limits = new goog.math.Rect(0, 0, 0, height);
+  }
+  this.dragger_.setLimits(limits);
+  this.sliderInitialized_ = true;
+};
+
+
+/**
+ * @param {ol.MapEvent} mapEvent Map event.
+ * @this {ol.control.ZoomSlider}
+ * @api
+ */
+ol.control.ZoomSlider.render = function(mapEvent) {
+  if (goog.isNull(mapEvent.frameState)) {
+    return;
+  }
+  goog.asserts.assert(goog.isDefAndNotNull(mapEvent.frameState.viewState));
+  if (!this.sliderInitialized_) {
+    this.initSlider_();
+  }
+  var res = mapEvent.frameState.viewState.resolution;
+  if (res !== this.currentResolution_) {
+    this.currentResolution_ = res;
+    this.setThumbPosition_(res);
+  }
+};
+
+
+/**
+ * @param {goog.events.BrowserEvent} browserEvent The browser event to handle.
+ * @private
+ */
+ol.control.ZoomSlider.prototype.handleContainerClick_ = function(browserEvent) {
+  var map = this.getMap();
+  var view = map.getView();
+  var currentResolution = view.getResolution();
+  goog.asserts.assert(goog.isDef(currentResolution));
+  map.beforeRender(ol.animation.zoom({
+    resolution: currentResolution,
+    duration: ol.ZOOMSLIDER_ANIMATION_DURATION,
+    easing: ol.easing.easeOut
+  }));
+  var relativePosition = this.getRelativePosition_(
+      browserEvent.offsetX - this.thumbSize_[0] / 2,
+      browserEvent.offsetY - this.thumbSize_[1] / 2);
+  var resolution = this.getResolutionForPosition_(relativePosition);
+  view.setResolution(view.constrainResolution(resolution));
+};
+
+
+/**
+ * Handle dragger start events.
+ * @param {goog.fx.DragDropEvent} event The dragdropevent.
+ * @private
+ */
+ol.control.ZoomSlider.prototype.handleDraggerStart_ = function(event) {
+  this.getMap().getView().setHint(ol.ViewHint.INTERACTING, 1);
+};
+
+
+/**
+ * Handle dragger drag events.
+ *
+ * @param {goog.fx.DragDropEvent} event The dragdropevent.
+ * @private
+ */
+ol.control.ZoomSlider.prototype.handleDraggerDrag_ = function(event) {
+  var relativePosition = this.getRelativePosition_(event.left, event.top);
+  this.currentResolution_ = this.getResolutionForPosition_(relativePosition);
+  this.getMap().getView().setResolution(this.currentResolution_);
+};
+
+
+/**
+ * Handle dragger end events.
+ * @param {goog.fx.DragDropEvent} event The dragdropevent.
+ * @private
+ */
+ol.control.ZoomSlider.prototype.handleDraggerEnd_ = function(event) {
+  var map = this.getMap();
+  var view = map.getView();
+  view.setHint(ol.ViewHint.INTERACTING, -1);
+  goog.asserts.assert(goog.isDef(this.currentResolution_));
+  map.beforeRender(ol.animation.zoom({
+    resolution: this.currentResolution_,
+    duration: ol.ZOOMSLIDER_ANIMATION_DURATION,
+    easing: ol.easing.easeOut
+  }));
+  var resolution = view.constrainResolution(this.currentResolution_);
+  view.setResolution(resolution);
+};
+
+
+/**
+ * Positions the thumb inside its container according to the given resolution.
+ *
+ * @param {number} res The res.
+ * @private
+ */
+ol.control.ZoomSlider.prototype.setThumbPosition_ = function(res) {
+  var position = this.getPositionForResolution_(res);
+  var dragger = this.dragger_;
+  var thumb = goog.dom.getFirstElementChild(this.element);
+
+  if (this.direction_ == ol.control.ZoomSlider.direction.HORIZONTAL) {
+    var left = dragger.limits.left + dragger.limits.width * position;
+    goog.style.setPosition(thumb, left);
+  } else {
+    var top = dragger.limits.top + dragger.limits.height * position;
+    goog.style.setPosition(thumb, dragger.limits.left, top);
+  }
+};
+
+
+/**
+ * Calculates the relative position of the thumb given x and y offsets.  The
+ * relative position scales from 0 to 1.  The x and y offsets are assumed to be
+ * in pixel units within the dragger limits.
+ *
+ * @param {number} x Pixel position relative to the left of the slider.
+ * @param {number} y Pixel position relative to the top of the slider.
+ * @return {number} The relative position of the thumb.
+ * @private
+ */
+ol.control.ZoomSlider.prototype.getRelativePosition_ = function(x, y) {
+  var draggerLimits = this.dragger_.limits;
+  var amount;
+  if (this.direction_ === ol.control.ZoomSlider.direction.HORIZONTAL) {
+    amount = (x - draggerLimits.left) / draggerLimits.width;
+  } else {
+    amount = (y - draggerLimits.top) / draggerLimits.height;
+  }
+  return goog.math.clamp(amount, 0, 1);
+};
+
+
+/**
+ * Calculates the corresponding resolution of the thumb given its relative
+ * position (where 0 is the minimum and 1 is the maximum).
+ *
+ * @param {number} position The relative position of the thumb.
+ * @return {number} The corresponding resolution.
+ * @private
+ */
+ol.control.ZoomSlider.prototype.getResolutionForPosition_ = function(position) {
+  var fn = this.getMap().getView().getResolutionForValueFunction();
+  return fn(1 - position);
+};
+
+
+/**
+ * Determines the relative position of the slider for the given resolution.  A
+ * relative position of 0 corresponds to the minimum view resolution.  A
+ * relative position of 1 corresponds to the maximum view resolution.
+ *
+ * @param {number} res The resolution.
+ * @return {number} The relative position value (between 0 and 1).
+ * @private
+ */
+ol.control.ZoomSlider.prototype.getPositionForResolution_ = function(res) {
+  var fn = this.getMap().getView().getValueForResolutionFunction();
+  return 1 - fn(res);
+};
diff --git a/src/ol/control/zoomtoextentcontrol.js b/src/ol/control/zoomtoextentcontrol.js
new file mode 100644
index 0000000..0af7824
--- /dev/null
+++ b/src/ol/control/zoomtoextentcontrol.js
@@ -0,0 +1,85 @@
+goog.provide('ol.control.ZoomToExtent');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('ol.control.Control');
+goog.require('ol.css');
+
+
+
+/**
+ * @classdesc
+ * A button control which, when pressed, changes the map view to a specific
+ * extent. To style this control use the css selector `.ol-zoom-extent`.
+ *
+ * @constructor
+ * @extends {ol.control.Control}
+ * @param {olx.control.ZoomToExtentOptions=} opt_options Options.
+ * @api stable
+ */
+ol.control.ZoomToExtent = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @type {ol.Extent}
+   * @private
+   */
+  this.extent_ = goog.isDef(options.extent) ? options.extent : null;
+
+  var className = goog.isDef(options.className) ? options.className :
+      'ol-zoom-extent';
+
+  var tipLabel = goog.isDef(options.tipLabel) ?
+      options.tipLabel : 'Fit to extent';
+  var button = goog.dom.createDom(goog.dom.TagName.BUTTON, {
+    'type': 'button',
+    'title': tipLabel
+  });
+
+  goog.events.listen(button, goog.events.EventType.CLICK,
+      this.handleClick_, false, this);
+
+  goog.events.listen(button, [
+    goog.events.EventType.MOUSEOUT,
+    goog.events.EventType.FOCUSOUT
+  ], function() {
+    this.blur();
+  }, false);
+
+  var cssClasses = className + ' ' + ol.css.CLASS_UNSELECTABLE + ' ' +
+      ol.css.CLASS_CONTROL;
+  var element = goog.dom.createDom(goog.dom.TagName.DIV, cssClasses, button);
+
+  goog.base(this, {
+    element: element,
+    target: options.target
+  });
+};
+goog.inherits(ol.control.ZoomToExtent, ol.control.Control);
+
+
+/**
+ * @param {goog.events.BrowserEvent} event The event to handle
+ * @private
+ */
+ol.control.ZoomToExtent.prototype.handleClick_ = function(event) {
+  event.preventDefault();
+  this.handleZoomToExtent_();
+};
+
+
+/**
+ * @private
+ */
+ol.control.ZoomToExtent.prototype.handleZoomToExtent_ = function() {
+  var map = this.getMap();
+  var view = map.getView();
+  var extent = goog.isNull(this.extent_) ?
+      view.getProjection().getExtent() : this.extent_;
+  var size = map.getSize();
+  goog.asserts.assert(goog.isDef(size));
+  view.fitExtent(extent, size);
+};
diff --git a/src/ol/coordinate.js b/src/ol/coordinate.js
new file mode 100644
index 0000000..4d8c75d
--- /dev/null
+++ b/src/ol/coordinate.js
@@ -0,0 +1,349 @@
+goog.provide('ol.Coordinate');
+goog.provide('ol.CoordinateFormatType');
+goog.provide('ol.coordinate');
+
+goog.require('goog.math');
+
+
+/**
+ * A function that takes a {@link ol.Coordinate} and transforms it into a
+ * `{string}`.
+ *
+ * @typedef {function((ol.Coordinate|undefined)): string}
+ * @api stable
+ */
+ol.CoordinateFormatType;
+
+
+/**
+ * An array of numbers representing an xy coordinate. Example: `[16, 48]`.
+ * @typedef {Array.<number>} ol.Coordinate
+ * @api stable
+ */
+ol.Coordinate;
+
+
+/**
+ * Add `delta` to `coordinate`. `coordinate` is modified in place and returned
+ * by the function.
+ *
+ * Example:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     ol.coordinate.add(coord, [-2, 4]);
+ *     // coord is now [5.85, 51.983333]
+ *
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {ol.Coordinate} delta Delta.
+ * @return {ol.Coordinate} The input coordinate adjusted by the given delta.
+ * @api stable
+ */
+ol.coordinate.add = function(coordinate, delta) {
+  coordinate[0] += delta[0];
+  coordinate[1] += delta[1];
+  return coordinate;
+};
+
+
+/**
+ * Calculates the point closest to the passed coordinate on the passed segment.
+ * This is the foot of the perpendicular of the coordinate to the segment when
+ * the foot is on the segment, or the closest segment coordinate when the foot
+ * is outside the segment.
+ *
+ * @param {ol.Coordinate} coordinate The coordinate.
+ * @param {Array.<ol.Coordinate>} segment The two coordinates of the segment.
+ * @return {ol.Coordinate} The foot of the perpendicular of the coordinate to
+ *     the segment.
+ */
+ol.coordinate.closestOnSegment = function(coordinate, segment) {
+  var x0 = coordinate[0];
+  var y0 = coordinate[1];
+  var start = segment[0];
+  var end = segment[1];
+  var x1 = start[0];
+  var y1 = start[1];
+  var x2 = end[0];
+  var y2 = end[1];
+  var dx = x2 - x1;
+  var dy = y2 - y1;
+  var along = (dx === 0 && dy === 0) ? 0 :
+      ((dx * (x0 - x1)) + (dy * (y0 - y1))) / ((dx * dx + dy * dy) || 0);
+  var x, y;
+  if (along <= 0) {
+    x = x1;
+    y = y1;
+  } else if (along >= 1) {
+    x = x2;
+    y = y2;
+  } else {
+    x = x1 + along * dx;
+    y = y1 + along * dy;
+  }
+  return [x, y];
+};
+
+
+/**
+ * Returns a {@link ol.CoordinateFormatType} function that can be used to format
+ * a {ol.Coordinate} to a string.
+ *
+ * Example without specifying the fractional digits:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var stringifyFunc = ol.coordinate.createStringXY();
+ *     var out = stringifyFunc(coord);
+ *     // out is now '8, 48'
+ *
+ * Example with explicitly specifying 2 fractional digits:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var stringifyFunc = ol.coordinate.createStringXY(2);
+ *     var out = stringifyFunc(coord);
+ *     // out is now '7.85, 47.98'
+ *
+ * @param {number=} opt_fractionDigits The number of digits to include
+ *    after the decimal point. Default is `0`.
+ * @return {ol.CoordinateFormatType} Coordinate format.
+ * @api stable
+ */
+ol.coordinate.createStringXY = function(opt_fractionDigits) {
+  return (
+      /**
+       * @param {ol.Coordinate|undefined} coordinate Coordinate.
+       * @return {string} String XY.
+       */
+      function(coordinate) {
+        return ol.coordinate.toStringXY(coordinate, opt_fractionDigits);
+      });
+};
+
+
+/**
+ * @private
+ * @param {number} degrees Degrees.
+ * @param {string} hemispheres Hemispheres.
+ * @return {string} String.
+ */
+ol.coordinate.degreesToStringHDMS_ = function(degrees, hemispheres) {
+  var normalizedDegrees = goog.math.modulo(degrees + 180, 360) - 180;
+  var x = Math.abs(Math.round(3600 * normalizedDegrees));
+  return Math.floor(x / 3600) + '\u00b0 ' +
+      Math.floor((x / 60) % 60) + '\u2032 ' +
+      Math.floor(x % 60) + '\u2033 ' +
+      hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0);
+};
+
+
+/**
+ * Transforms the given {@link ol.Coordinate} to a string using the given string
+ * template. The strings `{x}` and `{y}` in the template will be replaced with
+ * the first and second coordinate values respectively.
+ *
+ * Example without specifying the fractional digits:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var template = 'Coordinate is ({x}|{y}).';
+ *     var out = ol.coordinate.format(coord, template);
+ *     // out is now 'Coordinate is (8|48).'
+ *
+ * Example explicitly specifying the fractional digits:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var template = 'Coordinate is ({x}|{y}).';
+ *     var out = ol.coordinate.format(coord, template, 2);
+ *     // out is now 'Coordinate is (7.85|47.98).'
+ *
+ * @param {ol.Coordinate|undefined} coordinate Coordinate.
+ * @param {string} template A template string with `{x}` and `{y}` placeholders
+ *     that will be replaced by first and second coordinate values.
+ * @param {number=} opt_fractionDigits The number of digits to include
+ *    after the decimal point. Default is `0`.
+ * @return {string} Formated coordinate.
+ * @api stable
+ */
+ol.coordinate.format = function(coordinate, template, opt_fractionDigits) {
+  if (goog.isDef(coordinate)) {
+    return template
+      .replace('{x}', coordinate[0].toFixed(opt_fractionDigits))
+      .replace('{y}', coordinate[1].toFixed(opt_fractionDigits));
+  } else {
+    return '';
+  }
+};
+
+
+/**
+ * @param {ol.Coordinate} coordinate1 First coordinate.
+ * @param {ol.Coordinate} coordinate2 Second coordinate.
+ * @return {boolean} Whether the passed coordinates are equal.
+ */
+ol.coordinate.equals = function(coordinate1, coordinate2) {
+  var equals = true;
+  for (var i = coordinate1.length - 1; i >= 0; --i) {
+    if (coordinate1[i] != coordinate2[i]) {
+      equals = false;
+      break;
+    }
+  }
+  return equals;
+};
+
+
+/**
+ * Rotate `coordinate` by `angle`. `coordinate` is modified in place and
+ * returned by the function.
+ *
+ * Example:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var rotateRadians = Math.PI / 2; // 90 degrees
+ *     ol.coordinate.rotate(coord, rotateRadians);
+ *     // coord is now [-47.983333, 7.85]
+ *
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} angle Angle in radian.
+ * @return {ol.Coordinate} Coordinate.
+ * @api stable
+ */
+ol.coordinate.rotate = function(coordinate, angle) {
+  var cosAngle = Math.cos(angle);
+  var sinAngle = Math.sin(angle);
+  var x = coordinate[0] * cosAngle - coordinate[1] * sinAngle;
+  var y = coordinate[1] * cosAngle + coordinate[0] * sinAngle;
+  coordinate[0] = x;
+  coordinate[1] = y;
+  return coordinate;
+};
+
+
+/**
+ * Scale `coordinate` by `scale`. `coordinate` is modified in place and returned
+ * by the function.
+ *
+ * Example:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var scale = 1.2;
+ *     ol.coordinate.scale(coord, scale);
+ *     // coord is now [9.42, 57.5799996]
+ *
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} scale Scale factor.
+ * @return {ol.Coordinate} Coordinate.
+ */
+ol.coordinate.scale = function(coordinate, scale) {
+  coordinate[0] *= scale;
+  coordinate[1] *= scale;
+  return coordinate;
+};
+
+
+/**
+ * Subtract `delta` to `coordinate`. `coordinate` is modified in place and
+ * returned by the function.
+ *
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {ol.Coordinate} delta Delta.
+ * @return {ol.Coordinate} Coordinate.
+ */
+ol.coordinate.sub = function(coordinate, delta) {
+  coordinate[0] -= delta[0];
+  coordinate[1] -= delta[1];
+  return coordinate;
+};
+
+
+/**
+ * @param {ol.Coordinate} coord1 First coordinate.
+ * @param {ol.Coordinate} coord2 Second coordinate.
+ * @return {number} Squared distance between coord1 and coord2.
+ */
+ol.coordinate.squaredDistance = function(coord1, coord2) {
+  var dx = coord1[0] - coord2[0];
+  var dy = coord1[1] - coord2[1];
+  return dx * dx + dy * dy;
+};
+
+
+/**
+ * Calculate the squared distance from a coordinate to a line segment.
+ *
+ * @param {ol.Coordinate} coordinate Coordinate of the point.
+ * @param {Array.<ol.Coordinate>} segment Line segment (2 coordinates).
+ * @return {number} Squared distance from the point to the line segment.
+ */
+ol.coordinate.squaredDistanceToSegment = function(coordinate, segment) {
+  return ol.coordinate.squaredDistance(coordinate,
+      ol.coordinate.closestOnSegment(coordinate, segment));
+};
+
+
+/**
+ * Example:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var out = ol.coordinate.toStringHDMS(coord);
+ *     // out is now '47° 59′ 0″ N 7° 51′ 0″ E'
+ *
+ * @param {ol.Coordinate|undefined} coordinate Coordinate.
+ * @return {string} Hemisphere, degrees, minutes and seconds.
+ * @api stable
+ */
+ol.coordinate.toStringHDMS = function(coordinate) {
+  if (goog.isDef(coordinate)) {
+    return ol.coordinate.degreesToStringHDMS_(coordinate[1], 'NS') + ' ' +
+        ol.coordinate.degreesToStringHDMS_(coordinate[0], 'EW');
+  } else {
+    return '';
+  }
+};
+
+
+/**
+ * Example without specifying fractional digits:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var out = ol.coordinate.toStringXY(coord);
+ *     // out is now '8, 48'
+ *
+ * Example explicitly specifying 1 fractional digit:
+ *
+ *     var coord = [7.85, 47.983333];
+ *     var out = ol.coordinate.toStringXY(coord, 1);
+ *     // out is now '7.8, 48.0'
+ *
+ * @param {ol.Coordinate|undefined} coordinate Coordinate.
+ * @param {number=} opt_fractionDigits The number of digits to include
+ *    after the decimal point. Default is `0`.
+ * @return {string} XY.
+ * @api stable
+ */
+ol.coordinate.toStringXY = function(coordinate, opt_fractionDigits) {
+  return ol.coordinate.format(coordinate, '{x}, {y}', opt_fractionDigits);
+};
+
+
+/**
+ * Create an ol.Coordinate from an Array and take into account axis order.
+ *
+ * Examples:
+ *
+ *     var northCoord = ol.coordinate.fromProjectedArray([1, 2], 'n');
+ *     // northCoord is now [2, 1]
+ *
+ *     var eastCoord = ol.coordinate.fromProjectedArray([1, 2], 'e');
+ *     // eastCoord is now [1, 2]
+ *
+ * @param {Array} array The array with coordinates.
+ * @param {string} axis the axis info.
+ * @return {ol.Coordinate} The coordinate created.
+ */
+ol.coordinate.fromProjectedArray = function(array, axis) {
+  var firstAxis = axis.charAt(0);
+  if (firstAxis === 'n' || firstAxis === 's') {
+    return [array[1], array[0]];
+  } else {
+    return array;
+  }
+};
diff --git a/src/ol/coordinate.jsdoc b/src/ol/coordinate.jsdoc
new file mode 100644
index 0000000..282f35a
--- /dev/null
+++ b/src/ol/coordinate.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.coordinate
+ */
diff --git a/src/ol/css.js b/src/ol/css.js
new file mode 100644
index 0000000..2d4247b
--- /dev/null
+++ b/src/ol/css.js
@@ -0,0 +1,37 @@
+goog.provide('ol.css');
+
+
+/**
+ * The CSS class for hidden feature.
+ *
+ * @const
+ * @type {string}
+ */
+ol.css.CLASS_HIDDEN = 'ol-hidden';
+
+
+/**
+ * The CSS class that we'll give the DOM elements to have them unselectable.
+ *
+ * @const
+ * @type {string}
+ */
+ol.css.CLASS_UNSELECTABLE = 'ol-unselectable';
+
+
+/**
+ * The CSS class for unsupported feature.
+ *
+ * @const
+ * @type {string}
+ */
+ol.css.CLASS_UNSUPPORTED = 'ol-unsupported';
+
+
+/**
+ * The CSS class for controls.
+ *
+ * @const
+ * @type {string}
+ */
+ol.css.CLASS_CONTROL = 'ol-control';
diff --git a/src/ol/deviceorientation.js b/src/ol/deviceorientation.js
new file mode 100644
index 0000000..a8b9ddf
--- /dev/null
+++ b/src/ol/deviceorientation.js
@@ -0,0 +1,250 @@
+goog.provide('ol.DeviceOrientation');
+goog.provide('ol.DeviceOrientationProperty');
+
+goog.require('goog.events');
+goog.require('goog.math');
+goog.require('ol.Object');
+goog.require('ol.has');
+
+
+/**
+ * @enum {string}
+ */
+ol.DeviceOrientationProperty = {
+  ALPHA: 'alpha',
+  BETA: 'beta',
+  GAMMA: 'gamma',
+  HEADING: 'heading',
+  TRACKING: 'tracking'
+};
+
+
+
+/**
+ * @classdesc
+ * The ol.DeviceOrientation class provides access to DeviceOrientation
+ * information and events, see the [HTML 5 DeviceOrientation Specification](
+ * http://www.w3.org/TR/orientation-event/) for more details.
+ *
+ * Many new computers, and especially mobile phones
+ * and tablets, provide hardware support for device orientation. Web
+ * developers targetting mobile devices will be especially interested in this
+ * class.
+ *
+ * Device orientation data are relative to a common starting point. For mobile
+ * devices, the starting point is to lay your phone face up on a table with the
+ * top of the phone pointing north. This represents the zero state. All
+ * angles are then relative to this state. For computers, it is the same except
+ * the screen is open at 90 degrees.
+ *
+ * Device orientation is reported as three angles - `alpha`, `beta`, and
+ * `gamma` - relative to the starting position along the three planar axes X, Y
+ * and Z. The X axis runs from the left edge to the right edge through the
+ * middle of the device. Similarly, the Y axis runs from the bottom to the top
+ * of the device through the middle. The Z axis runs from the back to the front
+ * through the middle. In the starting position, the X axis points to the
+ * right, the Y axis points away from you and the Z axis points straight up
+ * from the device lying flat.
+ *
+ * The three angles representing the device orientation are relative to the
+ * three axes. `alpha` indicates how much the device has been rotated around the
+ * Z axis, which is commonly interpreted as the compass heading (see note
+ * below). `beta` indicates how much the device has been rotated around the X
+ * axis, or how much it is tilted from front to back.  `gamma` indicates how
+ * much the device has been rotated around the Y axis, or how much it is tilted
+ * from left to right.
+ *
+ * For most browsers, the `alpha` value returns the compass heading so if the
+ * device points north, it will be 0.  With Safari on iOS, the 0 value of
+ * `alpha` is calculated from when device orientation was first requested.
+ * ol.DeviceOrientation provides the `heading` property which normalizes this
+ * behavior across all browsers for you.
+ *
+ * It is important to note that the HTML 5 DeviceOrientation specification
+ * indicates that `alpha`, `beta` and `gamma` are in degrees while the
+ * equivalent properties in ol.DeviceOrientation are in radians for consistency
+ * with all other uses of angles throughout OpenLayers.
+ *
+ * @see http://www.w3.org/TR/orientation-event/
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @fires change Triggered when the device orientation changes.
+ * @param {olx.DeviceOrientationOptions=} opt_options Options.
+ * @api
+ */
+ol.DeviceOrientation = function(opt_options) {
+
+  goog.base(this);
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {goog.events.Key}
+   */
+  this.listenerKey_ = null;
+
+  goog.events.listen(this,
+      ol.Object.getChangeEventType(ol.DeviceOrientationProperty.TRACKING),
+      this.handleTrackingChanged_, false, this);
+
+  this.setTracking(goog.isDef(options.tracking) ? options.tracking : false);
+
+};
+goog.inherits(ol.DeviceOrientation, ol.Object);
+
+
+/**
+ * @inheritDoc
+ */
+ol.DeviceOrientation.prototype.disposeInternal = function() {
+  this.setTracking(false);
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * @private
+ * @param {goog.events.BrowserEvent} browserEvent Event.
+ */
+ol.DeviceOrientation.prototype.orientationChange_ = function(browserEvent) {
+  var event = /** @type {DeviceOrientationEvent} */
+      (browserEvent.getBrowserEvent());
+  if (goog.isDefAndNotNull(event.alpha)) {
+    var alpha = goog.math.toRadians(event.alpha);
+    this.set(ol.DeviceOrientationProperty.ALPHA, alpha);
+    // event.absolute is undefined in iOS.
+    if (goog.isBoolean(event.absolute) && event.absolute) {
+      this.set(ol.DeviceOrientationProperty.HEADING, alpha);
+    } else if (goog.isDefAndNotNull(event.webkitCompassHeading) &&
+               goog.isDefAndNotNull(event.webkitCompassAccuracy) &&
+               event.webkitCompassAccuracy != -1) {
+      var heading = goog.math.toRadians(event.webkitCompassHeading);
+      this.set(ol.DeviceOrientationProperty.HEADING, heading);
+    }
+  }
+  if (goog.isDefAndNotNull(event.beta)) {
+    this.set(ol.DeviceOrientationProperty.BETA,
+        goog.math.toRadians(event.beta));
+  }
+  if (goog.isDefAndNotNull(event.gamma)) {
+    this.set(ol.DeviceOrientationProperty.GAMMA,
+        goog.math.toRadians(event.gamma));
+  }
+  this.changed();
+};
+
+
+/**
+ * @return {number|undefined} The euler angle in radians of the device from the
+ *     standard Z axis.
+ * @observable
+ * @api
+ */
+ol.DeviceOrientation.prototype.getAlpha = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.DeviceOrientationProperty.ALPHA));
+};
+goog.exportProperty(
+    ol.DeviceOrientation.prototype,
+    'getAlpha',
+    ol.DeviceOrientation.prototype.getAlpha);
+
+
+/**
+ * @return {number|undefined} The euler angle in radians of the device from the
+ *     planar X axis.
+ * @observable
+ * @api
+ */
+ol.DeviceOrientation.prototype.getBeta = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.DeviceOrientationProperty.BETA));
+};
+goog.exportProperty(
+    ol.DeviceOrientation.prototype,
+    'getBeta',
+    ol.DeviceOrientation.prototype.getBeta);
+
+
+/**
+ * @return {number|undefined} The euler angle in radians of the device from the
+ *     planar Y axis.
+ * @observable
+ * @api
+ */
+ol.DeviceOrientation.prototype.getGamma = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.DeviceOrientationProperty.GAMMA));
+};
+goog.exportProperty(
+    ol.DeviceOrientation.prototype,
+    'getGamma',
+    ol.DeviceOrientation.prototype.getGamma);
+
+
+/**
+ * @return {number|undefined} The heading of the device relative to north, in
+ *     radians, normalizing for different browser behavior.
+ * @observable
+ * @api
+ */
+ol.DeviceOrientation.prototype.getHeading = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.DeviceOrientationProperty.HEADING));
+};
+goog.exportProperty(
+    ol.DeviceOrientation.prototype,
+    'getHeading',
+    ol.DeviceOrientation.prototype.getHeading);
+
+
+/**
+ * Are we tracking the device's orientation?
+ * @return {boolean} The status of tracking changes to alpha, beta and gamma.
+ *     If true, changes are tracked and reported immediately.
+ * @observable
+ * @api
+ */
+ol.DeviceOrientation.prototype.getTracking = function() {
+  return /** @type {boolean} */ (
+      this.get(ol.DeviceOrientationProperty.TRACKING));
+};
+goog.exportProperty(
+    ol.DeviceOrientation.prototype,
+    'getTracking',
+    ol.DeviceOrientation.prototype.getTracking);
+
+
+/**
+ * @private
+ */
+ol.DeviceOrientation.prototype.handleTrackingChanged_ = function() {
+  if (ol.has.DEVICE_ORIENTATION) {
+    var tracking = this.getTracking();
+    if (tracking && goog.isNull(this.listenerKey_)) {
+      this.listenerKey_ = goog.events.listen(goog.global, 'deviceorientation',
+          this.orientationChange_, false, this);
+    } else if (!tracking && !goog.isNull(this.listenerKey_)) {
+      goog.events.unlistenByKey(this.listenerKey_);
+      this.listenerKey_ = null;
+    }
+  }
+};
+
+
+/**
+ * Enable or disable tracking of DeviceOrientation events.
+ * @param {boolean} tracking The status of tracking changes to alpha, beta and
+ *     gamma. If true, changes are tracked and reported immediately.
+ * @observable
+ * @api
+ */
+ol.DeviceOrientation.prototype.setTracking = function(tracking) {
+  this.set(ol.DeviceOrientationProperty.TRACKING, tracking);
+};
+goog.exportProperty(
+    ol.DeviceOrientation.prototype,
+    'setTracking',
+    ol.DeviceOrientation.prototype.setTracking);
diff --git a/src/ol/dom/dom.js b/src/ol/dom/dom.js
new file mode 100644
index 0000000..62942b3
--- /dev/null
+++ b/src/ol/dom/dom.js
@@ -0,0 +1,300 @@
+// FIXME add tests for browser features (Modernizr?)
+
+goog.provide('ol.dom');
+goog.provide('ol.dom.BrowserFeature');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.userAgent');
+goog.require('goog.vec.Mat4');
+goog.require('ol');
+
+
+/**
+ * Create an html canvas element and returns its 2d context.
+ * @param {number=} opt_width Canvas width.
+ * @param {number=} opt_height Canvas height.
+ * @return {CanvasRenderingContext2D}
+ */
+ol.dom.createCanvasContext2D = function(opt_width, opt_height) {
+  var canvas = goog.dom.createElement(goog.dom.TagName.CANVAS);
+  if (goog.isDef(opt_width)) {
+    canvas.width = opt_width;
+  }
+  if (goog.isDef(opt_height)) {
+    canvas.height = opt_height;
+  }
+  return canvas.getContext('2d');
+};
+
+
+/**
+ * @enum {boolean}
+ */
+ol.dom.BrowserFeature = {
+  USE_MS_MATRIX_TRANSFORM: ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE,
+  USE_MS_ALPHA_FILTER: ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE
+};
+
+
+/**
+ * Detect 2d transform.
+ * Adapted from http://stackoverflow.com/q/5661671/130442
+ * http://caniuse.com/#feat=transforms2d
+ * @return {boolean}
+ */
+ol.dom.canUseCssTransform = (function() {
+  var canUseCssTransform;
+  return function() {
+    if (!goog.isDef(canUseCssTransform)) {
+      goog.asserts.assert(!goog.isNull(document.body));
+      if (!goog.global.getComputedStyle) {
+        // this browser is ancient
+        canUseCssTransform = false;
+      } else {
+        var el = goog.dom.createElement(goog.dom.TagName.P),
+            has2d,
+            transforms = {
+              'webkitTransform': '-webkit-transform',
+              'OTransform': '-o-transform',
+              'msTransform': '-ms-transform',
+              'MozTransform': '-moz-transform',
+              'transform': 'transform'
+            };
+        goog.dom.appendChild(document.body, el);
+        for (var t in transforms) {
+          if (t in el.style) {
+            el.style[t] = 'translate(1px,1px)';
+            has2d = goog.global.getComputedStyle(el).getPropertyValue(
+                transforms[t]);
+          }
+        }
+        goog.dom.removeNode(el);
+
+        canUseCssTransform = (has2d && has2d !== 'none');
+      }
+    }
+    return canUseCssTransform;
+  };
+}());
+
+
+/**
+ * Detect 3d transform.
+ * Adapted from http://stackoverflow.com/q/5661671/130442
+ * http://caniuse.com/#feat=transforms3d
+ * @return {boolean}
+ */
+ol.dom.canUseCssTransform3D = (function() {
+  var canUseCssTransform3D;
+  return function() {
+    if (!goog.isDef(canUseCssTransform3D)) {
+      goog.asserts.assert(!goog.isNull(document.body));
+      if (!goog.global.getComputedStyle) {
+        // this browser is ancient
+        canUseCssTransform3D = false;
+      } else {
+        var el = goog.dom.createElement(goog.dom.TagName.P),
+            has3d,
+            transforms = {
+              'webkitTransform': '-webkit-transform',
+              'OTransform': '-o-transform',
+              'msTransform': '-ms-transform',
+              'MozTransform': '-moz-transform',
+              'transform': 'transform'
+            };
+        goog.dom.appendChild(document.body, el);
+        for (var t in transforms) {
+          if (t in el.style) {
+            el.style[t] = 'translate3d(1px,1px,1px)';
+            has3d = goog.global.getComputedStyle(el).getPropertyValue(
+                transforms[t]);
+          }
+        }
+        goog.dom.removeNode(el);
+
+        canUseCssTransform3D = (has3d && has3d !== 'none');
+      }
+    }
+    return canUseCssTransform3D;
+  };
+}());
+
+
+/**
+ * @param {Element} element Element.
+ * @param {string} value Value.
+ */
+ol.dom.setTransform = function(element, value) {
+  var style = element.style;
+  style.WebkitTransform = value;
+  style.MozTransform = value;
+  style.OTransform = value;
+  style.msTransform = value;
+  style.transform = value;
+
+  // IE 9+ seems to assume transform-origin: 100% 100%; for some unknown reason
+  if (goog.userAgent.IE && !ol.IS_LEGACY_IE) {
+    element.style.transformOrigin = '0 0';
+  }
+};
+
+
+/**
+ * Sets the opacity of an element, in an IE-compatible way
+ * @param {!Element} element Element
+ * @param {number} value Opacity, [0..1]
+ */
+ol.dom.setOpacity = function(element, value) {
+  if (ol.dom.BrowserFeature.USE_MS_ALPHA_FILTER) {
+    /** @type {string} */
+    var filter = element.currentStyle.filter;
+
+    /** @type {RegExp} */
+    var regex;
+
+    /** @type {string} */
+    var alpha;
+
+    if (goog.userAgent.VERSION == '8.0') {
+      regex = /progid:DXImageTransform\.Microsoft\.Alpha\(.*?\)/i,
+      alpha = 'progid:DXImageTransform.Microsoft.Alpha(Opacity=' +
+          (value * 100) + ')';
+    } else {
+      regex = /alpha\(.*?\)/i;
+      alpha = 'alpha(opacity=' + (value * 100) + ')';
+    }
+
+    var newFilter = filter.replace(regex, alpha);
+    if (newFilter === filter) {
+      // no replace was made? just append the new alpha filter instead
+      newFilter += ' ' + alpha;
+    }
+
+    element.style.filter = newFilter;
+
+    // Fix to apply filter to absolutely-positioned children element
+    if (element.currentStyle.zIndex === 'auto') {
+      element.style.zIndex = 0;
+    }
+  } else {
+    element.style.opacity = value;
+  }
+};
+
+
+/**
+ * Sets the IE matrix transform without replacing other filters
+ * @private
+ * @param {!Element} element Element
+ * @param {string} value The new progid string
+ */
+ol.dom.setIEMatrix_ = function(element, value) {
+  var filter = element.currentStyle.filter;
+  var newFilter =
+      filter.replace(/progid:DXImageTransform.Microsoft.Matrix\(.*?\)/i, value);
+
+  if (newFilter === filter) {
+    newFilter = ' ' + value;
+  }
+
+  element.style.filter = newFilter;
+
+  // Fix to apply filter to absolutely-positioned children element
+  if (element.currentStyle.zIndex === 'auto') {
+    element.style.zIndex = 0;
+  }
+};
+
+
+/**
+ * @param {!Element} element Element.
+ * @param {goog.vec.Mat4.Number} transform Matrix.
+ * @param {number=} opt_precision Precision.
+ * @param {Element=} opt_translationElement Required for IE7-8
+ */
+ol.dom.transformElement2D =
+    function(element, transform, opt_precision, opt_translationElement) {
+  // using matrix() causes gaps in Chrome and Firefox on Mac OS X, so prefer
+  // matrix3d()
+  var i;
+  if (ol.dom.canUseCssTransform3D()) {
+    var value3D;
+
+    if (goog.isDef(opt_precision)) {
+      /** @type {Array.<string>} */
+      var strings3D = new Array(16);
+      for (i = 0; i < 16; ++i) {
+        strings3D[i] = transform[i].toFixed(opt_precision);
+      }
+      value3D = strings3D.join(',');
+    } else {
+      value3D = transform.join(',');
+    }
+    ol.dom.setTransform(element, 'matrix3d(' + value3D + ')');
+  } else if (ol.dom.canUseCssTransform()) {
+    /** @type {Array.<number>} */
+    var transform2D = [
+      goog.vec.Mat4.getElement(transform, 0, 0),
+      goog.vec.Mat4.getElement(transform, 1, 0),
+      goog.vec.Mat4.getElement(transform, 0, 1),
+      goog.vec.Mat4.getElement(transform, 1, 1),
+      goog.vec.Mat4.getElement(transform, 0, 3),
+      goog.vec.Mat4.getElement(transform, 1, 3)
+    ];
+    var value2D;
+    if (goog.isDef(opt_precision)) {
+      /** @type {Array.<string>} */
+      var strings2D = new Array(6);
+      for (i = 0; i < 6; ++i) {
+        strings2D[i] = transform2D[i].toFixed(opt_precision);
+      }
+      value2D = strings2D.join(',');
+    } else {
+      value2D = transform2D.join(',');
+    }
+    ol.dom.setTransform(element, 'matrix(' + value2D + ')');
+  } else if (ol.dom.BrowserFeature.USE_MS_MATRIX_TRANSFORM) {
+    var m11 = goog.vec.Mat4.getElement(transform, 0, 0),
+        m12 = goog.vec.Mat4.getElement(transform, 0, 1),
+        m21 = goog.vec.Mat4.getElement(transform, 1, 0),
+        m22 = goog.vec.Mat4.getElement(transform, 1, 1),
+        dx = goog.vec.Mat4.getElement(transform, 0, 3),
+        dy = goog.vec.Mat4.getElement(transform, 1, 3);
+
+    // See: http://msdn.microsoft.com/en-us/library/ms533014(v=vs.85).aspx
+    // and: http://extremelysatisfactorytotalitarianism.com/blog/?p=1002
+    // @TODO: fix terrible IE bbox rotation issue.
+    var s = 'progid:DXImageTransform.Microsoft.Matrix(';
+    s += 'sizingMethod="auto expand"';
+    s += ',M11=' + m11.toFixed(opt_precision || 20);
+    s += ',M12=' + m12.toFixed(opt_precision || 20);
+    s += ',M21=' + m21.toFixed(opt_precision || 20);
+    s += ',M22=' + m22.toFixed(opt_precision || 20);
+    s += ')';
+    ol.dom.setIEMatrix_(element, s);
+
+    // scale = m11 = m22 = target resolution [m/px] / current res [m/px]
+    // dx = (viewport width [px] / 2) * scale
+    //      + (layer.x [m] - view.x [m]) / target resolution [m / px]
+    // except that we're positioning the child element relative to the
+    // viewport, not the map.
+    // dividing by the scale factor isn't the exact correction, but it's
+    // close enough that you can barely tell unless you're looking for it
+    dx /= m11;
+    dy /= m22;
+
+    opt_translationElement.style.left = Math.round(dx) + 'px';
+    opt_translationElement.style.top = Math.round(dy) + 'px';
+  } else {
+    element.style.left =
+        Math.round(goog.vec.Mat4.getElement(transform, 0, 3)) + 'px';
+    element.style.top =
+        Math.round(goog.vec.Mat4.getElement(transform, 1, 3)) + 'px';
+
+    // TODO: Add scaling here. This isn't quite as simple as multiplying
+    // width/height, because that only changes the container size, not the
+    // content size.
+  }
+};
diff --git a/src/ol/dom/input.js b/src/ol/dom/input.js
new file mode 100644
index 0000000..bb3a61f
--- /dev/null
+++ b/src/ol/dom/input.js
@@ -0,0 +1,148 @@
+goog.provide('ol.dom.Input');
+goog.provide('ol.dom.InputProperty');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('ol.Object');
+
+
+/**
+ * @enum {string}
+ */
+ol.dom.InputProperty = {
+  VALUE: 'value',
+  CHECKED: 'checked'
+};
+
+
+
+/**
+ * @classdesc
+ * Helper class for binding HTML input to an {@link ol.Object}.
+ *
+ * Example:
+ *
+ *     // bind a checkbox with id 'visible' to a layer's visibility
+ *     var visible = new ol.dom.Input(document.getElementById('visible'));
+ *     visible.bindTo('checked', layer, 'visible');
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @param {Element} target Target element.
+ * @api
+ */
+ol.dom.Input = function(target) {
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {HTMLInputElement}
+   */
+  this.target_ = /** @type {HTMLInputElement} */ (target);
+
+  goog.events.listen(this.target_,
+      [goog.events.EventType.CHANGE, goog.events.EventType.INPUT],
+      this.handleInputChanged_, false, this);
+
+  goog.events.listen(this,
+      ol.Object.getChangeEventType(ol.dom.InputProperty.VALUE),
+      this.handleValueChanged_, false, this);
+  goog.events.listen(this,
+      ol.Object.getChangeEventType(ol.dom.InputProperty.CHECKED),
+      this.handleCheckedChanged_, false, this);
+};
+goog.inherits(ol.dom.Input, ol.Object);
+
+
+/**
+ * If the input is a checkbox, return whether or not the checkbox is checked.
+ * @return {boolean|undefined} The checked state of the Input.
+ * @observable
+ * @api
+ */
+ol.dom.Input.prototype.getChecked = function() {
+  return /** @type {boolean} */ (this.get(ol.dom.InputProperty.CHECKED));
+};
+goog.exportProperty(
+    ol.dom.Input.prototype,
+    'getChecked',
+    ol.dom.Input.prototype.getChecked);
+
+
+/**
+ * Get the value of the input.
+ * @return {string|undefined} The value of the Input.
+ * @observable
+ * @api
+ */
+ol.dom.Input.prototype.getValue = function() {
+  return /** @type {string} */ (this.get(ol.dom.InputProperty.VALUE));
+};
+goog.exportProperty(
+    ol.dom.Input.prototype,
+    'getValue',
+    ol.dom.Input.prototype.getValue);
+
+
+/**
+ * Sets the value of the input.
+ * @param {string} value The value of the Input.
+ * @observable
+ * @api
+ */
+ol.dom.Input.prototype.setValue = function(value) {
+  this.set(ol.dom.InputProperty.VALUE, value);
+};
+goog.exportProperty(
+    ol.dom.Input.prototype,
+    'setValue',
+    ol.dom.Input.prototype.setValue);
+
+
+/**
+ * Set whether or not a checkbox is checked.
+ * @param {boolean} checked The checked state of the Input.
+ * @observable
+ * @api
+ */
+ol.dom.Input.prototype.setChecked = function(checked) {
+  this.set(ol.dom.InputProperty.CHECKED, checked);
+};
+goog.exportProperty(
+    ol.dom.Input.prototype,
+    'setChecked',
+    ol.dom.Input.prototype.setChecked);
+
+
+/**
+ * @param {goog.events.BrowserEvent} browserEvent Browser event.
+ * @private
+ */
+ol.dom.Input.prototype.handleInputChanged_ = function(browserEvent) {
+  goog.asserts.assert(browserEvent.currentTarget == this.target_);
+  var target = this.target_;
+  if (target.type === 'checkbox' || target.type === 'radio') {
+    this.setChecked(target.checked);
+  } else {
+    this.setValue(target.value);
+  }
+};
+
+
+/**
+ * @param {goog.events.Event} event Change event.
+ * @private
+ */
+ol.dom.Input.prototype.handleCheckedChanged_ = function(event) {
+  this.target_.checked = /** @type {boolean} */ (this.getChecked());
+};
+
+
+/**
+ * @param {goog.events.Event} event Change event.
+ * @private
+ */
+ol.dom.Input.prototype.handleValueChanged_ = function(event) {
+  this.target_.value =  /** @type {string} */ (this.getValue());
+};
diff --git a/src/ol/easing.js b/src/ol/easing.js
new file mode 100644
index 0000000..328bffe
--- /dev/null
+++ b/src/ol/easing.js
@@ -0,0 +1,54 @@
+goog.provide('ol.easing');
+
+goog.require('goog.fx.easing');
+
+
+/**
+ * @function
+ * @param {number} t Input between 0 and 1.
+ * @return {number} Output between 0 and 1.
+ * @api
+ */
+ol.easing.easeIn = goog.fx.easing.easeIn;
+
+
+/**
+ * @function
+ * @param {number} t Input between 0 and 1.
+ * @return {number} Output between 0 and 1.
+ * @api
+ */
+ol.easing.easeOut = goog.fx.easing.easeOut;
+
+
+/**
+ * @function
+ * @param {number} t Input between 0 and 1.
+ * @return {number} Output between 0 and 1.
+ * @api
+ */
+ol.easing.inAndOut = goog.fx.easing.inAndOut;
+
+
+/**
+ * @param {number} t Input between 0 and 1.
+ * @return {number} Output between 0 and 1.
+ * @api
+ */
+ol.easing.linear = function(t) {
+  return t;
+};
+
+
+/**
+ * @param {number} t Input between 0 and 1.
+ * @return {number} Output between 0 and 1.
+ * @api
+ */
+ol.easing.upAndDown = function(t) {
+  if (t < 0.5) {
+    return ol.easing.inAndOut(2 * t);
+  } else {
+    return 1 - ol.easing.inAndOut(2 * (t - 0.5));
+  }
+};
diff --git a/src/ol/easing.jsdoc b/src/ol/easing.jsdoc
new file mode 100644
index 0000000..2d63bec
--- /dev/null
+++ b/src/ol/easing.jsdoc
@@ -0,0 +1,4 @@
+/**
+ * Easing functions for {@link ol.animation}.
+ * @namespace ol.easing
+ */
diff --git a/src/ol/ellipsoid/ellipsoid.js b/src/ol/ellipsoid/ellipsoid.js
new file mode 100644
index 0000000..88ef013
--- /dev/null
+++ b/src/ol/ellipsoid/ellipsoid.js
@@ -0,0 +1,185 @@
+goog.provide('ol.Ellipsoid');
+
+goog.require('goog.math');
+goog.require('ol.Coordinate');
+
+
+
+/**
+ * @constructor
+ * @param {number} a Major radius.
+ * @param {number} flattening Flattening.
+ */
+ol.Ellipsoid = function(a, flattening) {
+
+  /**
+   * @const
+   * @type {number}
+   */
+  this.a = a;
+
+  /**
+   * @const
+   * @type {number}
+   */
+  this.flattening = flattening;
+
+  /**
+   * @const
+   * @type {number}
+   */
+  this.b = this.a * (1 - this.flattening);
+
+  /**
+   * @const
+   * @type {number}
+   */
+  this.eSquared = 2 * flattening - flattening * flattening;
+
+  /**
+   * @const
+   * @type {number}
+   */
+  this.e = Math.sqrt(this.eSquared);
+
+};
+
+
+/**
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 1.
+ * @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence.
+ * @param {number=} opt_maxIterations Maximum iterations.
+ * @return {{distance: number, initialBearing: number, finalBearing: number}}
+ *     Vincenty.
+ */
+ol.Ellipsoid.prototype.vincenty =
+    function(c1, c2, opt_minDeltaLambda, opt_maxIterations) {
+  var minDeltaLambda = goog.isDef(opt_minDeltaLambda) ?
+      opt_minDeltaLambda : 1e-12;
+  var maxIterations = goog.isDef(opt_maxIterations) ?
+      opt_maxIterations : 100;
+  var f = this.flattening;
+  var lat1 = goog.math.toRadians(c1[1]);
+  var lat2 = goog.math.toRadians(c2[1]);
+  var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
+  var U1 = Math.atan((1 - f) * Math.tan(lat1));
+  var cosU1 = Math.cos(U1);
+  var sinU1 = Math.sin(U1);
+  var U2 = Math.atan((1 - f) * Math.tan(lat2));
+  var cosU2 = Math.cos(U2);
+  var sinU2 = Math.sin(U2);
+  var lambda = deltaLon;
+  var cosSquaredAlpha, sinAlpha;
+  var cosLambda, deltaLambda = Infinity, sinLambda;
+  var cos2SigmaM, cosSigma, sigma, sinSigma;
+  var i;
+  for (i = maxIterations; i > 0; --i) {
+    cosLambda = Math.cos(lambda);
+    sinLambda = Math.sin(lambda);
+    var x = cosU2 * sinLambda;
+    var y = cosU1 * sinU2 - sinU1 * cosU2 * cosLambda;
+    sinSigma = Math.sqrt(x * x + y * y);
+    if (sinSigma === 0) {
+      return {
+        distance: 0,
+        initialBearing: 0,
+        finalBearing: 0
+      };
+    }
+    cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;
+    sigma = Math.atan2(sinSigma, cosSigma);
+    sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;
+    cosSquaredAlpha = 1 - sinAlpha * sinAlpha;
+    cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSquaredAlpha;
+    if (isNaN(cos2SigmaM)) {
+      cos2SigmaM = 0;
+    }
+    var C = f / 16 * cosSquaredAlpha * (4 + f * (4 - 3 * cosSquaredAlpha));
+    var lambdaPrime = deltaLon + (1 - C) * f * sinAlpha * (sigma +
+        C * sinSigma * (cos2SigmaM +
+        C * cosSigma * (2 * cos2SigmaM * cos2SigmaM - 1)));
+    deltaLambda = Math.abs(lambdaPrime - lambda);
+    lambda = lambdaPrime;
+    if (deltaLambda < minDeltaLambda) {
+      break;
+    }
+  }
+  if (i === 0) {
+    return {
+      distance: NaN,
+      finalBearing: NaN,
+      initialBearing: NaN
+    };
+  }
+  var aSquared = this.a * this.a;
+  var bSquared = this.b * this.b;
+  var uSquared = cosSquaredAlpha * (aSquared - bSquared) / bSquared;
+  var A = 1 + uSquared / 16384 *
+      (4096 + uSquared * (uSquared * (320 - 175 * uSquared) - 768));
+  var B = uSquared / 1024 *
+      (256 + uSquared * (uSquared * (74 - 47 * uSquared) - 128));
+  var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 *
+      (cosSigma * (2 * cos2SigmaM * cos2SigmaM - 1) -
+       B / 6 * cos2SigmaM * (4 * sinSigma * sinSigma - 3) *
+       (4 * cos2SigmaM * cos2SigmaM - 3)));
+  cosLambda = Math.cos(lambda);
+  sinLambda = Math.sin(lambda);
+  var alpha1 = Math.atan2(cosU2 * sinLambda,
+                          cosU1 * sinU2 - sinU1 * cosU2 * cosLambda);
+  var alpha2 = Math.atan2(cosU1 * sinLambda,
+                          cosU1 * sinU2 * cosLambda - sinU1 * cosU2);
+  return {
+    distance: this.b * A * (sigma - deltaSigma),
+    initialBearing: goog.math.toDegrees(alpha1),
+    finalBearing: goog.math.toDegrees(alpha2)
+  };
+};
+
+
+/**
+ * Returns the distance from c1 to c2 using Vincenty.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 1.
+ * @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence.
+ * @param {number=} opt_maxIterations Maximum iterations.
+ * @return {number} Vincenty distance.
+ */
+ol.Ellipsoid.prototype.vincentyDistance =
+    function(c1, c2, opt_minDeltaLambda, opt_maxIterations) {
+  var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations);
+  return vincenty.distance;
+};
+
+
+/**
+ * Returns the final bearing from c1 to c2 using Vincenty.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 1.
+ * @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence.
+ * @param {number=} opt_maxIterations Maximum iterations.
+ * @return {number} Initial bearing.
+ */
+ol.Ellipsoid.prototype.vincentyFinalBearing =
+    function(c1, c2, opt_minDeltaLambda, opt_maxIterations) {
+  var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations);
+  return vincenty.finalBearing;
+};
+
+
+/**
+ * Returns the initial bearing from c1 to c2 using Vincenty.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 1.
+ * @param {number=} opt_minDeltaLambda Minimum delta lambda for convergence.
+ * @param {number=} opt_maxIterations Maximum iterations.
+ * @return {number} Initial bearing.
+ */
+ol.Ellipsoid.prototype.vincentyInitialBearing =
+    function(c1, c2, opt_minDeltaLambda, opt_maxIterations) {
+  var vincenty = this.vincenty(c1, c2, opt_minDeltaLambda, opt_maxIterations);
+  return vincenty.initialBearing;
+};
diff --git a/src/ol/ellipsoid/wgs84ellipsoid.js b/src/ol/ellipsoid/wgs84ellipsoid.js
new file mode 100644
index 0000000..e5244b8
--- /dev/null
+++ b/src/ol/ellipsoid/wgs84ellipsoid.js
@@ -0,0 +1,10 @@
+goog.provide('ol.ellipsoid.WGS84');
+
+goog.require('ol.Ellipsoid');
+
+
+/**
+ * @const
+ * @type {ol.Ellipsoid}
+ */
+ol.ellipsoid.WGS84 = new ol.Ellipsoid(6378137, 1 / 298.257223563);
diff --git a/src/ol/events/condition.js b/src/ol/events/condition.js
new file mode 100644
index 0000000..b6f4a61
--- /dev/null
+++ b/src/ol/events/condition.js
@@ -0,0 +1,168 @@
+goog.provide('ol.events.ConditionType');
+goog.provide('ol.events.condition');
+
+goog.require('goog.asserts');
+goog.require('goog.dom.TagName');
+goog.require('goog.functions');
+goog.require('ol.MapBrowserEvent.EventType');
+goog.require('ol.MapBrowserPointerEvent');
+
+
+/**
+ * A function that takes an {@link ol.MapBrowserEvent} and returns a
+ * `{boolean}`. If the condition is met, true should be returned.
+ *
+ * @typedef {function(ol.MapBrowserEvent): boolean}
+ * @api stable
+ */
+ol.events.ConditionType;
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True if only the alt key is pressed.
+ * @api stable
+ */
+ol.events.condition.altKeyOnly = function(mapBrowserEvent) {
+  var browserEvent = mapBrowserEvent.browserEvent;
+  return (
+      browserEvent.altKey &&
+      !browserEvent.platformModifierKey &&
+      !browserEvent.shiftKey);
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True if only the alt and shift keys are pressed.
+ * @api stable
+ */
+ol.events.condition.altShiftKeysOnly = function(mapBrowserEvent) {
+  var browserEvent = mapBrowserEvent.browserEvent;
+  return (
+      browserEvent.altKey &&
+      !browserEvent.platformModifierKey &&
+      browserEvent.shiftKey);
+};
+
+
+/**
+ * Always true.
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True.
+ * @function
+ * @api stable
+ */
+ol.events.condition.always = goog.functions.TRUE;
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True if the event is a map `click` event.
+ * @api stable
+ */
+ol.events.condition.click = function(mapBrowserEvent) {
+  return mapBrowserEvent.type == ol.MapBrowserEvent.EventType.CLICK;
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True if the browser event is a `mousemove` event.
+ * @api
+ */
+ol.events.condition.mouseMove = function(mapBrowserEvent) {
+  return mapBrowserEvent.originalEvent.type == 'mousemove';
+};
+
+
+/**
+ * Always false.
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} False.
+ * @function
+ * @api stable
+ */
+ol.events.condition.never = goog.functions.FALSE;
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True if the event is a map `singleclick` event.
+ * @api stable
+ */
+ol.events.condition.singleClick = function(mapBrowserEvent) {
+  return mapBrowserEvent.type == ol.MapBrowserEvent.EventType.SINGLECLICK;
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True only if there no modifier keys are pressed.
+ * @api stable
+ */
+ol.events.condition.noModifierKeys = function(mapBrowserEvent) {
+  var browserEvent = mapBrowserEvent.browserEvent;
+  return (
+      !browserEvent.altKey &&
+      !browserEvent.platformModifierKey &&
+      !browserEvent.shiftKey);
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True if only the platform modifier key is pressed.
+ * @api stable
+ */
+ol.events.condition.platformModifierKeyOnly = function(mapBrowserEvent) {
+  var browserEvent = mapBrowserEvent.browserEvent;
+  return (
+      !browserEvent.altKey &&
+      browserEvent.platformModifierKey &&
+      !browserEvent.shiftKey);
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True if only the shift key is pressed.
+ * @api stable
+ */
+ol.events.condition.shiftKeyOnly = function(mapBrowserEvent) {
+  var browserEvent = mapBrowserEvent.browserEvent;
+  return (
+      !browserEvent.altKey &&
+      !browserEvent.platformModifierKey &&
+      browserEvent.shiftKey);
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True only if the target element is not editable.
+ * @api
+ */
+ol.events.condition.targetNotEditable = function(mapBrowserEvent) {
+  var target = mapBrowserEvent.browserEvent.target;
+  goog.asserts.assertInstanceof(target, Element);
+  var tagName = target.tagName;
+  return (
+      tagName !== goog.dom.TagName.INPUT &&
+      tagName !== goog.dom.TagName.SELECT &&
+      tagName !== goog.dom.TagName.TEXTAREA);
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} True if the event originates from a mouse device.
+ * @api stable
+ */
+ol.events.condition.mouseOnly = function(mapBrowserEvent) {
+  goog.asserts.assertInstanceof(mapBrowserEvent, ol.MapBrowserPointerEvent);
+  /* pointerId must be 1 for mouse devices,
+   * see: http://www.w3.org/Submission/pointer-events/#pointerevent-interface
+   */
+  return mapBrowserEvent.pointerEvent.pointerId == 1;
+};
diff --git a/src/ol/events/condition.jsdoc b/src/ol/events/condition.jsdoc
new file mode 100644
index 0000000..e7cefa8
--- /dev/null
+++ b/src/ol/events/condition.jsdoc
@@ -0,0 +1,18 @@
+/**
+ * Applications do not normally create event instances. They register (and
+ * unregister) event listener functions, which, when called by the library as
+ * the result of an event being dispatched, are passed event instances as their
+ * first argument. Listeners can be registered and unregistered on all objects
+ * descending from {@link ol.Observable}. All event instances have a `target`
+ * property, which corresponds to the object on which the event was dispatched.
+ * By default, `this` within the listener also refers to the target, though
+ * this can be configured in the listener registration function.
+ * Some classes have their own event type, which return additional
+ * properties; see the specific event class page for details.
+ *
+ * @namespace ol.events
+ */
+
+/**
+ * @namespace ol.events.condition
+ */
diff --git a/src/ol/extent.js b/src/ol/extent.js
new file mode 100644
index 0000000..ae16a97
--- /dev/null
+++ b/src/ol/extent.js
@@ -0,0 +1,890 @@
+goog.provide('ol.Extent');
+goog.provide('ol.extent');
+goog.provide('ol.extent.Corner');
+goog.provide('ol.extent.Relationship');
+
+goog.require('goog.asserts');
+goog.require('goog.vec.Mat4');
+goog.require('ol.Coordinate');
+goog.require('ol.Size');
+goog.require('ol.TransformFunction');
+
+
+/**
+ * An array of numbers representing an extent: `[minx, miny, maxx, maxy]`.
+ * @typedef {Array.<number>}
+ * @api stable
+ */
+ol.Extent;
+
+
+/**
+ * Extent corner.
+ * @enum {string}
+ */
+ol.extent.Corner = {
+  BOTTOM_LEFT: 'bottom-left',
+  BOTTOM_RIGHT: 'bottom-right',
+  TOP_LEFT: 'top-left',
+  TOP_RIGHT: 'top-right'
+};
+
+
+/**
+ * Relationship to an extent.
+ * @enum {number}
+ */
+ol.extent.Relationship = {
+  UNKNOWN: 0,
+  INTERSECTING: 1,
+  ABOVE: 2,
+  RIGHT: 4,
+  BELOW: 8,
+  LEFT: 16
+};
+
+
+/**
+ * Builds an extent that includes all given coordinates.
+ *
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @return {ol.Extent} Bounding extent.
+ * @api stable
+ */
+ol.extent.boundingExtent = function(coordinates) {
+  var extent = ol.extent.createEmpty();
+  for (var i = 0, ii = coordinates.length; i < ii; ++i) {
+    ol.extent.extendCoordinate(extent, coordinates[i]);
+  }
+  return extent;
+};
+
+
+/**
+ * @param {Array.<number>} xs Xs.
+ * @param {Array.<number>} ys Ys.
+ * @param {ol.Extent=} opt_extent Destination extent.
+ * @private
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.boundingExtentXYs_ = function(xs, ys, opt_extent) {
+  goog.asserts.assert(xs.length > 0);
+  goog.asserts.assert(ys.length > 0);
+  var minX = Math.min.apply(null, xs);
+  var minY = Math.min.apply(null, ys);
+  var maxX = Math.max.apply(null, xs);
+  var maxY = Math.max.apply(null, ys);
+  return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent);
+};
+
+
+/**
+ * Return extent increased by the provided value.
+ * @param {ol.Extent} extent Extent.
+ * @param {number} value The amount by which the extent should be buffered.
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} Extent.
+ * @api stable
+ */
+ol.extent.buffer = function(extent, value, opt_extent) {
+  if (goog.isDef(opt_extent)) {
+    opt_extent[0] = extent[0] - value;
+    opt_extent[1] = extent[1] - value;
+    opt_extent[2] = extent[2] + value;
+    opt_extent[3] = extent[3] + value;
+    return opt_extent;
+  } else {
+    return [
+      extent[0] - value,
+      extent[1] - value,
+      extent[2] + value,
+      extent[3] + value
+    ];
+  }
+};
+
+
+/**
+ * Creates a clone of an extent.
+ *
+ * @param {ol.Extent} extent Extent to clone.
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} The clone.
+ */
+ol.extent.clone = function(extent, opt_extent) {
+  if (goog.isDef(opt_extent)) {
+    opt_extent[0] = extent[0];
+    opt_extent[1] = extent[1];
+    opt_extent[2] = extent[2];
+    opt_extent[3] = extent[3];
+    return opt_extent;
+  } else {
+    return extent.slice();
+  }
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @return {number} Closest squared distance.
+ */
+ol.extent.closestSquaredDistanceXY = function(extent, x, y) {
+  var dx, dy;
+  if (x < extent[0]) {
+    dx = extent[0] - x;
+  } else if (extent[2] < x) {
+    dx = x - extent[2];
+  } else {
+    dx = 0;
+  }
+  if (y < extent[1]) {
+    dy = extent[1] - y;
+  } else if (extent[3] < y) {
+    dy = y - extent[3];
+  } else {
+    dy = 0;
+  }
+  return dx * dx + dy * dy;
+};
+
+
+/**
+ * Checks if the passed coordinate is contained or on the edge of the extent.
+ *
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @return {boolean} Contains.
+ * @api stable
+ */
+ol.extent.containsCoordinate = function(extent, coordinate) {
+  return ol.extent.containsXY(extent, coordinate[0], coordinate[1]);
+};
+
+
+/**
+ * Checks if `extent2` is contained by or on the edge of `extent1`.
+ *
+ * @param {ol.Extent} extent1 Extent 1.
+ * @param {ol.Extent} extent2 Extent 2.
+ * @return {boolean} Contains.
+ * @api stable
+ */
+ol.extent.containsExtent = function(extent1, extent2) {
+  return extent1[0] <= extent2[0] && extent2[2] <= extent1[2] &&
+      extent1[1] <= extent2[1] && extent2[3] <= extent1[3];
+};
+
+
+/**
+ * Checks if the passed coordinate is contained or on the edge of the extent.
+ *
+ * @param {ol.Extent} extent Extent.
+ * @param {number} x X coordinate.
+ * @param {number} y Y coordinate.
+ * @return {boolean} Contains.
+ * @api stable
+ */
+ol.extent.containsXY = function(extent, x, y) {
+  return extent[0] <= x && x <= extent[2] && extent[1] <= y && y <= extent[3];
+};
+
+
+/**
+ * Get the relationship between a coordinate and extent.
+ * @param {ol.Extent} extent The extent.
+ * @param {ol.Coordinate} coordinate The coordinate.
+ * @return {number} The relationship (bitwise compare with
+ *     ol.extent.Relationship).
+ */
+ol.extent.coordinateRelationship = function(extent, coordinate) {
+  var minX = extent[0];
+  var minY = extent[1];
+  var maxX = extent[2];
+  var maxY = extent[3];
+  var x = coordinate[0];
+  var y = coordinate[1];
+  var relationship = ol.extent.Relationship.UNKNOWN;
+  if (x < minX) {
+    relationship = relationship | ol.extent.Relationship.LEFT;
+  } else if (x > maxX) {
+    relationship = relationship | ol.extent.Relationship.RIGHT;
+  }
+  if (y < minY) {
+    relationship = relationship | ol.extent.Relationship.BELOW;
+  } else if (y > maxY) {
+    relationship = relationship | ol.extent.Relationship.ABOVE;
+  }
+  if (relationship === ol.extent.Relationship.UNKNOWN) {
+    relationship = ol.extent.Relationship.INTERSECTING;
+  }
+  return relationship;
+};
+
+
+/**
+ * @return {ol.Extent} Empty extent.
+ * @api stable
+ */
+ol.extent.createEmpty = function() {
+  return [Infinity, Infinity, -Infinity, -Infinity];
+};
+
+
+/**
+ * @param {number} minX Minimum X.
+ * @param {number} minY Minimum Y.
+ * @param {number} maxX Maximum X.
+ * @param {number} maxY Maximum Y.
+ * @param {ol.Extent=} opt_extent Destination extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.createOrUpdate = function(minX, minY, maxX, maxY, opt_extent) {
+  if (goog.isDef(opt_extent)) {
+    opt_extent[0] = minX;
+    opt_extent[1] = minY;
+    opt_extent[2] = maxX;
+    opt_extent[3] = maxY;
+    return opt_extent;
+  } else {
+    return [minX, minY, maxX, maxY];
+  }
+};
+
+
+/**
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.createOrUpdateEmpty = function(opt_extent) {
+  return ol.extent.createOrUpdate(
+      Infinity, Infinity, -Infinity, -Infinity, opt_extent);
+};
+
+
+/**
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.createOrUpdateFromCoordinate = function(coordinate, opt_extent) {
+  var x = coordinate[0];
+  var y = coordinate[1];
+  return ol.extent.createOrUpdate(x, y, x, y, opt_extent);
+};
+
+
+/**
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.createOrUpdateFromCoordinates = function(coordinates, opt_extent) {
+  var extent = ol.extent.createOrUpdateEmpty(opt_extent);
+  return ol.extent.extendCoordinates(extent, coordinates);
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.createOrUpdateFromFlatCoordinates =
+    function(flatCoordinates, offset, end, stride, opt_extent) {
+  var extent = ol.extent.createOrUpdateEmpty(opt_extent);
+  return ol.extent.extendFlatCoordinates(
+      extent, flatCoordinates, offset, end, stride);
+};
+
+
+/**
+ * @param {Array.<Array.<ol.Coordinate>>} rings Rings.
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.createOrUpdateFromRings = function(rings, opt_extent) {
+  var extent = ol.extent.createOrUpdateEmpty(opt_extent);
+  return ol.extent.extendRings(extent, rings);
+};
+
+
+/**
+ * Empties extent in place.
+ * @param {ol.Extent} extent Extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.empty = function(extent) {
+  extent[0] = extent[1] = Infinity;
+  extent[2] = extent[3] = -Infinity;
+  return extent;
+};
+
+
+/**
+ * @param {ol.Extent} extent1 Extent 1.
+ * @param {ol.Extent} extent2 Extent 2.
+ * @return {boolean} Equals.
+ * @api stable
+ */
+ol.extent.equals = function(extent1, extent2) {
+  return extent1[0] == extent2[0] && extent1[2] == extent2[2] &&
+      extent1[1] == extent2[1] && extent1[3] == extent2[3];
+};
+
+
+/**
+ * @param {ol.Extent} extent1 Extent 1.
+ * @param {ol.Extent} extent2 Extent 2.
+ * @return {ol.Extent} Extent.
+ * @api stable
+ */
+ol.extent.extend = function(extent1, extent2) {
+  if (extent2[0] < extent1[0]) {
+    extent1[0] = extent2[0];
+  }
+  if (extent2[2] > extent1[2]) {
+    extent1[2] = extent2[2];
+  }
+  if (extent2[1] < extent1[1]) {
+    extent1[1] = extent2[1];
+  }
+  if (extent2[3] > extent1[3]) {
+    extent1[3] = extent2[3];
+  }
+  return extent1;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ */
+ol.extent.extendCoordinate = function(extent, coordinate) {
+  if (coordinate[0] < extent[0]) {
+    extent[0] = coordinate[0];
+  }
+  if (coordinate[0] > extent[2]) {
+    extent[2] = coordinate[0];
+  }
+  if (coordinate[1] < extent[1]) {
+    extent[1] = coordinate[1];
+  }
+  if (coordinate[1] > extent[3]) {
+    extent[3] = coordinate[1];
+  }
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.extendCoordinates = function(extent, coordinates) {
+  var i, ii;
+  for (i = 0, ii = coordinates.length; i < ii; ++i) {
+    ol.extent.extendCoordinate(extent, coordinates[i]);
+  }
+  return extent;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.extendFlatCoordinates =
+    function(extent, flatCoordinates, offset, end, stride) {
+  for (; offset < end; offset += stride) {
+    ol.extent.extendXY(
+        extent, flatCoordinates[offset], flatCoordinates[offset + 1]);
+  }
+  return extent;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {Array.<Array.<ol.Coordinate>>} rings Rings.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.extendRings = function(extent, rings) {
+  var i, ii;
+  for (i = 0, ii = rings.length; i < ii; ++i) {
+    ol.extent.extendCoordinates(extent, rings[i]);
+  }
+  return extent;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} x X.
+ * @param {number} y Y.
+ */
+ol.extent.extendXY = function(extent, x, y) {
+  extent[0] = Math.min(extent[0], x);
+  extent[1] = Math.min(extent[1], y);
+  extent[2] = Math.max(extent[2], x);
+  extent[3] = Math.max(extent[3], y);
+};
+
+
+/**
+ * This function calls `callback` for each corner of the extent. If the
+ * callback returns a truthy value the function returns that value
+ * immediately. Otherwise the function returns `false`.
+ * @param {ol.Extent} extent Extent.
+ * @param {function(this:T, ol.Coordinate): S} callback Callback.
+ * @param {T=} opt_this Value to use as `this` when executing `callback`.
+ * @return {S|boolean} Value.
+ * @template S, T
+ */
+ol.extent.forEachCorner = function(extent, callback, opt_this) {
+  var val;
+  val = callback.call(opt_this, ol.extent.getBottomLeft(extent));
+  if (val) {
+    return val;
+  }
+  val = callback.call(opt_this, ol.extent.getBottomRight(extent));
+  if (val) {
+    return val;
+  }
+  val = callback.call(opt_this, ol.extent.getTopRight(extent));
+  if (val) {
+    return val;
+  }
+  val = callback.call(opt_this, ol.extent.getBottomRight(extent));
+  if (val) {
+    return val;
+  }
+  return false;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {number} Area.
+ */
+ol.extent.getArea = function(extent) {
+  var area = 0;
+  if (!ol.extent.isEmpty(extent)) {
+    area = ol.extent.getWidth(extent) * ol.extent.getHeight(extent);
+  }
+  return area;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {ol.Coordinate} Bottom left coordinate.
+ * @api stable
+ */
+ol.extent.getBottomLeft = function(extent) {
+  return [extent[0], extent[1]];
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {ol.Coordinate} Bottom right coordinate.
+ * @api stable
+ */
+ol.extent.getBottomRight = function(extent) {
+  return [extent[2], extent[1]];
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {ol.Coordinate} Center.
+ * @api stable
+ */
+ol.extent.getCenter = function(extent) {
+  return [(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2];
+};
+
+
+/**
+ * Get a corner coordinate of an extent.
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.extent.Corner} corner Corner.
+ * @return {ol.Coordinate} Corner coordinate.
+ */
+ol.extent.getCorner = function(extent, corner) {
+  var coordinate;
+  if (corner === ol.extent.Corner.BOTTOM_LEFT) {
+    coordinate = ol.extent.getBottomLeft(extent);
+  } else if (corner === ol.extent.Corner.BOTTOM_RIGHT) {
+    coordinate = ol.extent.getBottomRight(extent);
+  } else if (corner === ol.extent.Corner.TOP_LEFT) {
+    coordinate = ol.extent.getTopLeft(extent);
+  } else if (corner === ol.extent.Corner.TOP_RIGHT) {
+    coordinate = ol.extent.getTopRight(extent);
+  } else {
+    goog.asserts.fail('Invalid corner: %s', corner);
+  }
+  goog.asserts.assert(goog.isDef(coordinate));
+  return coordinate;
+};
+
+
+/**
+ * @param {ol.Extent} extent1 Extent 1.
+ * @param {ol.Extent} extent2 Extent 2.
+ * @return {number} Enlarged area.
+ */
+ol.extent.getEnlargedArea = function(extent1, extent2) {
+  var minX = Math.min(extent1[0], extent2[0]);
+  var minY = Math.min(extent1[1], extent2[1]);
+  var maxX = Math.max(extent1[2], extent2[2]);
+  var maxY = Math.max(extent1[3], extent2[3]);
+  return (maxX - minX) * (maxY - minY);
+};
+
+
+/**
+ * @param {ol.Coordinate} center Center.
+ * @param {number} resolution Resolution.
+ * @param {number} rotation Rotation.
+ * @param {ol.Size} size Size.
+ * @param {ol.Extent=} opt_extent Destination extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.getForViewAndSize =
+    function(center, resolution, rotation, size, opt_extent) {
+  var dx = resolution * size[0] / 2;
+  var dy = resolution * size[1] / 2;
+  var cosRotation = Math.cos(rotation);
+  var sinRotation = Math.sin(rotation);
+  /** @type {Array.<number>} */
+  var xs = [-dx, -dx, dx, dx];
+  /** @type {Array.<number>} */
+  var ys = [-dy, dy, -dy, dy];
+  var i, x, y;
+  for (i = 0; i < 4; ++i) {
+    x = xs[i];
+    y = ys[i];
+    xs[i] = center[0] + x * cosRotation - y * sinRotation;
+    ys[i] = center[1] + x * sinRotation + y * cosRotation;
+  }
+  return ol.extent.boundingExtentXYs_(xs, ys, opt_extent);
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {number} Height.
+ * @api stable
+ */
+ol.extent.getHeight = function(extent) {
+  return extent[3] - extent[1];
+};
+
+
+/**
+ * @param {ol.Extent} extent1 Extent 1.
+ * @param {ol.Extent} extent2 Extent 2.
+ * @return {number} Intersection area.
+ */
+ol.extent.getIntersectionArea = function(extent1, extent2) {
+  var intersection = ol.extent.getIntersection(extent1, extent2);
+  return ol.extent.getArea(intersection);
+};
+
+
+/**
+ * Get the intersection of two extents.
+ * @param {ol.Extent} extent1 Extent 1.
+ * @param {ol.Extent} extent2 Extent 2.
+ * @param {ol.Extent=} opt_extent Optional extent to populate with intersection.
+ * @return {ol.Extent} Intersecting extent.
+ * @api stable
+ */
+ol.extent.getIntersection = function(extent1, extent2, opt_extent) {
+  var intersection = goog.isDef(opt_extent) ?
+      opt_extent : ol.extent.createEmpty();
+  if (ol.extent.intersects(extent1, extent2)) {
+    if (extent1[0] > extent2[0]) {
+      intersection[0] = extent1[0];
+    } else {
+      intersection[0] = extent2[0];
+    }
+    if (extent1[1] > extent2[1]) {
+      intersection[1] = extent1[1];
+    } else {
+      intersection[1] = extent2[1];
+    }
+    if (extent1[2] < extent2[2]) {
+      intersection[2] = extent1[2];
+    } else {
+      intersection[2] = extent2[2];
+    }
+    if (extent1[3] < extent2[3]) {
+      intersection[3] = extent1[3];
+    } else {
+      intersection[3] = extent2[3];
+    }
+  }
+  return intersection;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {number} Margin.
+ */
+ol.extent.getMargin = function(extent) {
+  return ol.extent.getWidth(extent) + ol.extent.getHeight(extent);
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {ol.Size} Size.
+ * @api stable
+ */
+ol.extent.getSize = function(extent) {
+  return [extent[2] - extent[0], extent[3] - extent[1]];
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {ol.Coordinate} Top left coordinate.
+ * @api stable
+ */
+ol.extent.getTopLeft = function(extent) {
+  return [extent[0], extent[3]];
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {ol.Coordinate} Top right coordinate.
+ * @api stable
+ */
+ol.extent.getTopRight = function(extent) {
+  return [extent[2], extent[3]];
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {number} Width.
+ * @api stable
+ */
+ol.extent.getWidth = function(extent) {
+  return extent[2] - extent[0];
+};
+
+
+/**
+ * @param {ol.Extent} extent1 Extent 1.
+ * @param {ol.Extent} extent2 Extent.
+ * @return {boolean} Intersects.
+ * @api stable
+ */
+ol.extent.intersects = function(extent1, extent2) {
+  return extent1[0] <= extent2[2] &&
+      extent1[2] >= extent2[0] &&
+      extent1[1] <= extent2[3] &&
+      extent1[3] >= extent2[1];
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} Is empty.
+ * @api stable
+ */
+ol.extent.isEmpty = function(extent) {
+  return extent[2] < extent[0] || extent[3] < extent[1];
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} Is infinite.
+ */
+ol.extent.isInfinite = function(extent) {
+  return extent[0] == -Infinity || extent[1] == -Infinity ||
+      extent[2] == Infinity || extent[3] == Infinity;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @return {ol.Coordinate} Coordinate.
+ */
+ol.extent.normalize = function(extent, coordinate) {
+  return [
+    (coordinate[0] - extent[0]) / (extent[2] - extent[0]),
+    (coordinate[1] - extent[1]) / (extent[3] - extent[1])
+  ];
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.extent.returnOrUpdate = function(extent, opt_extent) {
+  if (goog.isDef(opt_extent)) {
+    opt_extent[0] = extent[0];
+    opt_extent[1] = extent[1];
+    opt_extent[2] = extent[2];
+    opt_extent[3] = extent[3];
+    return opt_extent;
+  } else {
+    return extent;
+  }
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} value Value.
+ */
+ol.extent.scaleFromCenter = function(extent, value) {
+  var deltaX = ((extent[2] - extent[0]) / 2) * (value - 1);
+  var deltaY = ((extent[3] - extent[1]) / 2) * (value - 1);
+  extent[0] -= deltaX;
+  extent[2] += deltaX;
+  extent[1] -= deltaY;
+  extent[3] += deltaY;
+};
+
+
+/**
+ * Determine if the segment between two coordinates intersects (crosses,
+ * touches, or is contained by) the provided extent.
+ * @param {ol.Extent} extent The extent.
+ * @param {ol.Coordinate} start Segment start coordinate.
+ * @param {ol.Coordinate} end Segment end coordinate.
+ * @return {boolean} The segment intersects the extent.
+ */
+ol.extent.intersectsSegment = function(extent, start, end) {
+  var intersects = false;
+  var startRel = ol.extent.coordinateRelationship(extent, start);
+  var endRel = ol.extent.coordinateRelationship(extent, end);
+  if (startRel === ol.extent.Relationship.INTERSECTING ||
+      endRel === ol.extent.Relationship.INTERSECTING) {
+    intersects = true;
+  } else {
+    var minX = extent[0];
+    var minY = extent[1];
+    var maxX = extent[2];
+    var maxY = extent[3];
+    var startX = start[0];
+    var startY = start[1];
+    var endX = end[0];
+    var endY = end[1];
+    var slope = (endY - startY) / (endX - startX);
+    var x, y;
+    if (!!(endRel & ol.extent.Relationship.ABOVE) &&
+        !(startRel & ol.extent.Relationship.ABOVE)) {
+      // potentially intersects top
+      x = endX - ((endY - maxY) / slope);
+      intersects = x >= minX && x <= maxX;
+    } else if (!!(endRel & ol.extent.Relationship.RIGHT) &&
+        !(startRel & ol.extent.Relationship.RIGHT)) {
+      // potentially intersects right
+      y = endY - ((endX - maxX) * slope);
+      intersects = y >= minY && y <= maxY;
+    } else if (!!(endRel & ol.extent.Relationship.BELOW) &&
+        !(startRel & ol.extent.Relationship.BELOW)) {
+      // potentially intersects bottom
+      x = endX - ((endY - minY) / slope);
+      intersects = x >= minX && x <= maxX;
+    } else if (!!(endRel & ol.extent.Relationship.LEFT) &&
+        !(startRel & ol.extent.Relationship.LEFT)) {
+      // potentially intersects left
+      y = endY - ((endX - minX) * slope);
+      intersects = y >= minY && y <= maxY;
+    }
+
+  }
+  return intersects;
+};
+
+
+/**
+ * @param {ol.Extent} extent1 Extent 1.
+ * @param {ol.Extent} extent2 Extent 2.
+ * @return {boolean} Touches.
+ */
+ol.extent.touches = function(extent1, extent2) {
+  var intersects = ol.extent.intersects(extent1, extent2);
+  return intersects &&
+      (extent1[0] == extent2[2] || extent1[2] == extent2[0] ||
+       extent1[1] == extent2[3] || extent1[3] == extent2[1]);
+};
+
+
+/**
+ * Apply a transform function to the extent.
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.TransformFunction} transformFn Transform function.  Called with
+ * [minX, minY, maxX, maxY] extent coordinates.
+ * @param {ol.Extent=} opt_extent Destination extent.
+ * @return {ol.Extent} Extent.
+ * @api stable
+ */
+ol.extent.applyTransform = function(extent, transformFn, opt_extent) {
+  var coordinates = [
+    extent[0], extent[1],
+    extent[0], extent[3],
+    extent[2], extent[1],
+    extent[2], extent[3]
+  ];
+  transformFn(coordinates, coordinates, 2);
+  var xs = [coordinates[0], coordinates[2], coordinates[4], coordinates[6]];
+  var ys = [coordinates[1], coordinates[3], coordinates[5], coordinates[7]];
+  return ol.extent.boundingExtentXYs_(xs, ys, opt_extent);
+};
+
+
+/**
+ * Apply a 2d transform to an extent.
+ * @param {ol.Extent} extent Input extent.
+ * @param {goog.vec.Mat4.Number} transform The transform matrix.
+ * @param {ol.Extent=} opt_extent Optional extent for return values.
+ * @return {ol.Extent} The transformed extent.
+ */
+ol.extent.transform2D = function(extent, transform, opt_extent) {
+  var dest = goog.isDef(opt_extent) ? opt_extent : [];
+  var m00 = goog.vec.Mat4.getElement(transform, 0, 0);
+  var m10 = goog.vec.Mat4.getElement(transform, 1, 0);
+  var m01 = goog.vec.Mat4.getElement(transform, 0, 1);
+  var m11 = goog.vec.Mat4.getElement(transform, 1, 1);
+  var m03 = goog.vec.Mat4.getElement(transform, 0, 3);
+  var m13 = goog.vec.Mat4.getElement(transform, 1, 3);
+  var xi = [0, 2, 0, 2];
+  var yi = [1, 1, 3, 3];
+  var xs = [];
+  var ys = [];
+  var i, x, y;
+  for (i = 0; i < 4; ++i) {
+    x = extent[xi[i]];
+    y = extent[yi[i]];
+    xs[i] = m00 * x + m01 * y + m03;
+    ys[i] = m10 * x + m11 * y + m13;
+  }
+  dest[0] = Math.min.apply(null, xs);
+  dest[1] = Math.min.apply(null, ys);
+  dest[2] = Math.max.apply(null, xs);
+  dest[3] = Math.max.apply(null, ys);
+  return dest;
+};
diff --git a/src/ol/extent.jsdoc b/src/ol/extent.jsdoc
new file mode 100644
index 0000000..4af9963
--- /dev/null
+++ b/src/ol/extent.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.extent
+ */
diff --git a/src/ol/feature.js b/src/ol/feature.js
new file mode 100644
index 0000000..947a685
--- /dev/null
+++ b/src/ol/feature.js
@@ -0,0 +1,329 @@
+goog.provide('ol.Feature');
+goog.provide('ol.feature');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.functions');
+goog.require('ol.Object');
+goog.require('ol.geom.Geometry');
+goog.require('ol.style.Style');
+
+
+
+/**
+ * @classdesc
+ * A vector object for geographic features with a geometry and other
+ * attribute properties, similar to the features in vector file formats like
+ * GeoJSON.
+ *
+ * Features can be styled individually with `setStyle`; otherwise they use the
+ * style of their vector layer or feature overlay.
+ *
+ * Note that attribute properties are set as {@link ol.Object} properties on
+ * the feature object, so they are observable, and have get/set accessors.
+ *
+ * Typically, a feature has a single geometry property. You can set the
+ * geometry using the `setGeometry` method and get it with `getGeometry`.
+ * It is possible to store more than one geometry on a feature using attribute
+ * properties. By default, the geometry used for rendering is identified by
+ * the property name `geometry`. If you want to use another geometry property
+ * for rendering, use the `setGeometryName` method to change the attribute
+ * property associated with the geometry for the feature.  For example:
+ *
+ * ```js
+ * var feature = new ol.Feature({
+ *   geometry: new ol.geom.Polygon(polyCoords),
+ *   labelPoint: new ol.geom.Point(labelCoords),
+ *   name: 'My Polygon'
+ * });
+ *
+ * // get the polygon geometry
+ * var poly = feature.getGeometry();
+ *
+ * // Render the feature as a point using the coordinates from labelPoint
+ * feature.setGeometryName('labelPoint');
+ *
+ * // get the point geometry
+ * var point = feature.getGeometry();
+ * ```
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @fires change Triggered when the id, the geometry or the style of the
+ *     feature changes.
+ * @param {ol.geom.Geometry|Object.<string, *>=} opt_geometryOrProperties
+ *     You may pass a Geometry object directly, or an object literal
+ *     containing properties.  If you pass an object literal, you may
+ *     include a Geometry associated with a `geometry` key.
+ * @api stable
+ */
+ol.Feature = function(opt_geometryOrProperties) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {number|string|undefined}
+   */
+  this.id_ = undefined;
+
+  /**
+   * @type {string}
+   * @private
+   */
+  this.geometryName_ = 'geometry';
+
+  /**
+   * User provided style.
+   * @private
+   * @type {ol.style.Style|Array.<ol.style.Style>|
+   *     ol.feature.FeatureStyleFunction}
+   */
+  this.style_ = null;
+
+  /**
+   * @private
+   * @type {ol.feature.FeatureStyleFunction|undefined}
+   */
+  this.styleFunction_ = undefined;
+
+  /**
+   * @private
+   * @type {goog.events.Key}
+   */
+  this.geometryChangeKey_ = null;
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(this.geometryName_),
+      this.handleGeometryChanged_, false, this);
+
+  if (goog.isDef(opt_geometryOrProperties)) {
+    if (opt_geometryOrProperties instanceof ol.geom.Geometry ||
+        goog.isNull(opt_geometryOrProperties)) {
+      var geometry = /** @type {ol.geom.Geometry} */ (opt_geometryOrProperties);
+      this.setGeometry(geometry);
+    } else {
+      goog.asserts.assert(goog.isObject(opt_geometryOrProperties));
+      var properties = /** @type {Object.<string, *>} */
+          (opt_geometryOrProperties);
+      this.setProperties(properties);
+    }
+  }
+};
+goog.inherits(ol.Feature, ol.Object);
+
+
+/**
+ * Clone this feature. If the original feature has a geometry it
+ * is also cloned. The feature id is not set in the clone.
+ * @return {ol.Feature} The clone.
+ * @api stable
+ */
+ol.Feature.prototype.clone = function() {
+  var clone = new ol.Feature(this.getProperties());
+  clone.setGeometryName(this.getGeometryName());
+  var geometry = this.getGeometry();
+  if (goog.isDefAndNotNull(geometry)) {
+    clone.setGeometry(geometry.clone());
+  }
+  var style = this.getStyle();
+  if (!goog.isNull(style)) {
+    clone.setStyle(style);
+  }
+  return clone;
+};
+
+
+/**
+ * @return {ol.geom.Geometry|undefined} Returns the Geometry associated
+ *     with this feature using the current geometry name property.  By
+ *     default, this is `geometry` but it may be changed by calling
+ *     `setGeometryName`.
+ * @api stable
+ * @observable
+ */
+ol.Feature.prototype.getGeometry = function() {
+  return /** @type {ol.geom.Geometry|undefined} */ (
+      this.get(this.geometryName_));
+};
+goog.exportProperty(
+    ol.Feature.prototype,
+    'getGeometry',
+    ol.Feature.prototype.getGeometry);
+
+
+/**
+ * @return {number|string|undefined} Id.
+ * @api stable
+ */
+ol.Feature.prototype.getId = function() {
+  return this.id_;
+};
+
+
+/**
+ * @return {string} Get the property name associated with the geometry for
+ *     this feature.  By default, this is `geometry` but it may be changed by
+ *     calling `setGeometryName`.
+ * @api stable
+ */
+ol.Feature.prototype.getGeometryName = function() {
+  return this.geometryName_;
+};
+
+
+/**
+ * @return {ol.style.Style|Array.<ol.style.Style>|
+ *     ol.feature.FeatureStyleFunction} Return the style as set by `setStyle`
+ * in the same format that it was provided in. If `setStyle` has not been
+ * called, or if it was called with `null`, then `getStyle()` will return
+ * `null`.
+ * @api stable
+ */
+ol.Feature.prototype.getStyle = function() {
+  return this.style_;
+};
+
+
+/**
+ * @return {ol.feature.FeatureStyleFunction|undefined} Return a function
+ * representing the current style of this feature.
+ * @api stable
+ */
+ol.Feature.prototype.getStyleFunction = function() {
+  return this.styleFunction_;
+};
+
+
+/**
+ * @private
+ */
+ol.Feature.prototype.handleGeometryChange_ = function() {
+  this.changed();
+};
+
+
+/**
+ * @private
+ */
+ol.Feature.prototype.handleGeometryChanged_ = function() {
+  if (!goog.isNull(this.geometryChangeKey_)) {
+    goog.events.unlistenByKey(this.geometryChangeKey_);
+    this.geometryChangeKey_ = null;
+  }
+  var geometry = this.getGeometry();
+  if (goog.isDefAndNotNull(geometry)) {
+    this.geometryChangeKey_ = goog.events.listen(geometry,
+        goog.events.EventType.CHANGE, this.handleGeometryChange_, false, this);
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.Geometry|undefined} geometry Set the geometry for this
+ * feature. This will update the property associated with the current
+ * geometry property name.  By default, this is `geometry` but it can be
+ * changed by calling `setGeometryName`.
+ * @api stable
+ * @observable
+ */
+ol.Feature.prototype.setGeometry = function(geometry) {
+  this.set(this.geometryName_, geometry);
+};
+goog.exportProperty(
+    ol.Feature.prototype,
+    'setGeometry',
+    ol.Feature.prototype.setGeometry);
+
+
+/**
+ * Set the style for the feature.  This can be a single style object, an array
+ * of styles, or a function that takes a resolution and returns an array of
+ * styles. If it is `null` the feature has no style (a `null` style).
+ * @param {ol.style.Style|Array.<ol.style.Style>|
+ *     ol.feature.FeatureStyleFunction} style Style for this feature.
+ * @api stable
+ */
+ol.Feature.prototype.setStyle = function(style) {
+  this.style_ = style;
+  this.styleFunction_ = goog.isNull(style) ?
+      undefined : ol.feature.createFeatureStyleFunction(style);
+  this.changed();
+};
+
+
+/**
+ * @param {number|string|undefined} id Set a unique id for this feature.
+ * The id may be used to retrieve a feature from a vector source with the
+ * {@link ol.source.Vector#getFeatureById} method.
+ * @api stable
+ */
+ol.Feature.prototype.setId = function(id) {
+  this.id_ = id;
+  this.changed();
+};
+
+
+/**
+ * @param {string} name Set the property name from which this feature's
+ *     geometry will be fetched when calling `getGeometry`.
+ * @api stable
+ */
+ol.Feature.prototype.setGeometryName = function(name) {
+  goog.events.unlisten(
+      this, ol.Object.getChangeEventType(this.geometryName_),
+      this.handleGeometryChanged_, false, this);
+  this.geometryName_ = name;
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(this.geometryName_),
+      this.handleGeometryChanged_, false, this);
+  this.handleGeometryChanged_();
+};
+
+
+/**
+ * A function that takes a `{number}` representing the view's resolution. It
+ * returns an Array of {@link ol.style.Style}. This way individual features
+ * can be styled. The this keyword inside the function references the
+ * {@link ol.Feature} to be styled.
+ *
+ * @typedef {function(this: ol.Feature, number): Array.<ol.style.Style>}
+ * @api stable
+ */
+ol.feature.FeatureStyleFunction;
+
+
+/**
+ * Convert the provided object into a feature style function.  Functions passed
+ * through unchanged.  Arrays of ol.style.Style or single style objects wrapped
+ * in a new feature style function.
+ * @param {ol.feature.FeatureStyleFunction|!Array.<ol.style.Style>|
+ *     !ol.style.Style} obj A feature style function, a single style, or an
+ *     array of styles.
+ * @return {ol.feature.FeatureStyleFunction} A style function.
+ */
+ol.feature.createFeatureStyleFunction = function(obj) {
+  /**
+   * @type {ol.feature.FeatureStyleFunction}
+   */
+  var styleFunction;
+
+  if (goog.isFunction(obj)) {
+    styleFunction = /** @type {ol.feature.FeatureStyleFunction} */ (obj);
+  } else {
+    /**
+     * @type {Array.<ol.style.Style>}
+     */
+    var styles;
+    if (goog.isArray(obj)) {
+      styles = obj;
+    } else {
+      goog.asserts.assertInstanceof(obj, ol.style.Style);
+      styles = [obj];
+    }
+    styleFunction = goog.functions.constant(styles);
+  }
+  return styleFunction;
+};
diff --git a/src/ol/feature.jsdoc b/src/ol/feature.jsdoc
new file mode 100644
index 0000000..7eeb59f
--- /dev/null
+++ b/src/ol/feature.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.feature
+ */
diff --git a/src/ol/featureoverlay.js b/src/ol/featureoverlay.js
new file mode 100644
index 0000000..12e6c7a
--- /dev/null
+++ b/src/ol/featureoverlay.js
@@ -0,0 +1,307 @@
+goog.provide('ol.FeatureOverlay');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol.Collection');
+goog.require('ol.CollectionEventType');
+goog.require('ol.Feature');
+goog.require('ol.render.EventType');
+goog.require('ol.renderer.vector');
+goog.require('ol.style.Style');
+
+
+
+/**
+ * @classdesc
+ * A mechanism for changing the style of a small number of features on a
+ * temporary basis, for example highlighting. This is necessary with the Canvas
+ * renderer, where, unlike in SVG, features cannot be individually referenced.
+ * See examples/vector-layers for an example: create a FeatureOverlay with a
+ * different style, copy the feature(s) you want rendered in this different
+ * style into it, and then remove them again when you're finished.
+ *
+ * @constructor
+ * @param {olx.FeatureOverlayOptions=} opt_options Options.
+ * @api
+ */
+ol.FeatureOverlay = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.Collection.<ol.Feature>}
+   */
+  this.features_ = null;
+
+  /**
+   * @private
+   * @type {Array.<goog.events.Key>}
+   */
+  this.featuresListenerKeys_ = null;
+
+  /**
+   * @private
+   * @type {Object.<string, goog.events.Key>}
+   */
+  this.featureChangeListenerKeys_ = null;
+
+  /**
+   * @private
+   * @type {ol.Map}
+   */
+  this.map_ = null;
+
+  /**
+   * @private
+   * @type {goog.events.Key}
+   */
+  this.postComposeListenerKey_ = null;
+
+  /**
+   * @private
+   * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction}
+   */
+  this.style_ = null;
+
+  /**
+   * @private
+   * @type {ol.style.StyleFunction|undefined}
+   */
+  this.styleFunction_ = undefined;
+
+  this.setStyle(goog.isDef(options.style) ?
+      options.style : ol.style.defaultStyleFunction);
+
+  if (goog.isDef(options.features)) {
+    if (goog.isArray(options.features)) {
+      this.setFeatures(new ol.Collection(goog.array.clone(options.features)));
+    } else {
+      goog.asserts.assertInstanceof(options.features, ol.Collection);
+      this.setFeatures(options.features);
+    }
+  } else {
+    this.setFeatures(new ol.Collection());
+  }
+
+  if (goog.isDef(options.map)) {
+    this.setMap(options.map);
+  }
+
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @api
+ */
+ol.FeatureOverlay.prototype.addFeature = function(feature) {
+  this.features_.push(feature);
+};
+
+
+/**
+ * @return {ol.Collection.<ol.Feature>} Features collection.
+ * @api
+ */
+ol.FeatureOverlay.prototype.getFeatures = function() {
+  return this.features_;
+};
+
+
+/**
+ * @private
+ */
+ol.FeatureOverlay.prototype.handleFeatureChange_ = function() {
+  this.render_();
+};
+
+
+/**
+ * @private
+ * @param {ol.CollectionEvent} collectionEvent Collection event.
+ */
+ol.FeatureOverlay.prototype.handleFeaturesAdd_ = function(collectionEvent) {
+  goog.asserts.assert(!goog.isNull(this.featureChangeListenerKeys_));
+  var feature = /** @type {ol.Feature} */ (collectionEvent.element);
+  this.featureChangeListenerKeys_[goog.getUid(feature).toString()] =
+      goog.events.listen(feature, goog.events.EventType.CHANGE,
+      this.handleFeatureChange_, false, this);
+  this.render_();
+};
+
+
+/**
+ * @private
+ * @param {ol.CollectionEvent} collectionEvent Collection event.
+ */
+ol.FeatureOverlay.prototype.handleFeaturesRemove_ = function(collectionEvent) {
+  goog.asserts.assert(!goog.isNull(this.featureChangeListenerKeys_));
+  var feature = /** @type {ol.Feature} */ (collectionEvent.element);
+  var key = goog.getUid(feature).toString();
+  goog.events.unlistenByKey(this.featureChangeListenerKeys_[key]);
+  delete this.featureChangeListenerKeys_[key];
+  this.render_();
+};
+
+
+/**
+ * Handle changes in image style state.
+ * @param {goog.events.Event} event Image style change event.
+ * @private
+ */
+ol.FeatureOverlay.prototype.handleImageChange_ = function(event) {
+  this.render_();
+};
+
+
+/**
+ * @param {ol.render.Event} event Event.
+ * @private
+ */
+ol.FeatureOverlay.prototype.handleMapPostCompose_ = function(event) {
+  if (goog.isNull(this.features_)) {
+    return;
+  }
+  var styleFunction = this.styleFunction_;
+  if (!goog.isDef(styleFunction)) {
+    styleFunction = ol.style.defaultStyleFunction;
+  }
+  var replayGroup = /** @type {ol.render.IReplayGroup} */
+      (event.replayGroup);
+  goog.asserts.assert(goog.isDef(replayGroup));
+  var frameState = event.frameState;
+  var pixelRatio = frameState.pixelRatio;
+  var resolution = frameState.viewState.resolution;
+  var squaredTolerance = ol.renderer.vector.getSquaredTolerance(resolution,
+      pixelRatio);
+  var i, ii, styles, featureStyleFunction;
+  this.features_.forEach(function(feature) {
+    featureStyleFunction = feature.getStyleFunction();
+    styles = goog.isDef(featureStyleFunction) ?
+        featureStyleFunction.call(feature, resolution) :
+        styleFunction(feature, resolution);
+
+    if (!goog.isDefAndNotNull(styles)) {
+      return;
+    }
+    ii = styles.length;
+    for (i = 0; i < ii; ++i) {
+      ol.renderer.vector.renderFeature(replayGroup, feature, styles[i],
+          squaredTolerance, this.handleImageChange_, this);
+    }
+  }, this);
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @api
+ */
+ol.FeatureOverlay.prototype.removeFeature = function(feature) {
+  this.features_.remove(feature);
+};
+
+
+/**
+ * @private
+ */
+ol.FeatureOverlay.prototype.render_ = function() {
+  if (!goog.isNull(this.map_)) {
+    this.map_.render();
+  }
+};
+
+
+/**
+ * @param {ol.Collection.<ol.Feature>} features Features collection.
+ * @api
+ */
+ol.FeatureOverlay.prototype.setFeatures = function(features) {
+  if (!goog.isNull(this.featuresListenerKeys_)) {
+    goog.array.forEach(this.featuresListenerKeys_, goog.events.unlistenByKey);
+    this.featuresListenerKeys_ = null;
+  }
+  if (!goog.isNull(this.featureChangeListenerKeys_)) {
+    goog.array.forEach(
+        goog.object.getValues(this.featureChangeListenerKeys_),
+        goog.events.unlistenByKey);
+    this.featureChangeListenerKeys_ = null;
+  }
+  this.features_ = features;
+  if (!goog.isNull(features)) {
+    this.featuresListenerKeys_ = [
+      goog.events.listen(features, ol.CollectionEventType.ADD,
+          this.handleFeaturesAdd_, false, this),
+      goog.events.listen(features, ol.CollectionEventType.REMOVE,
+          this.handleFeaturesRemove_, false, this)
+    ];
+    this.featureChangeListenerKeys_ = {};
+    features.forEach(function(feature) {
+      this.featureChangeListenerKeys_[goog.getUid(feature).toString()] =
+          goog.events.listen(feature, goog.events.EventType.CHANGE,
+          this.handleFeatureChange_, false, this);
+    }, this);
+  }
+  this.render_();
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @api
+ */
+ol.FeatureOverlay.prototype.setMap = function(map) {
+  if (!goog.isNull(this.postComposeListenerKey_)) {
+    goog.events.unlistenByKey(this.postComposeListenerKey_);
+    this.postComposeListenerKey_ = null;
+  }
+  this.render_();
+  this.map_ = map;
+  if (!goog.isNull(map)) {
+    this.postComposeListenerKey_ = goog.events.listen(
+        map, ol.render.EventType.POSTCOMPOSE, this.handleMapPostCompose_, false,
+        this);
+    map.render();
+  }
+};
+
+
+/**
+ * Set the style for features.  This can be a single style object, an array
+ * of styles, or a function that takes a feature and resolution and returns
+ * an array of styles.
+ * @param {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction} style
+ *     Overlay style.
+ * @api
+ */
+ol.FeatureOverlay.prototype.setStyle = function(style) {
+  this.style_ = style;
+  this.styleFunction_ = ol.style.createStyleFunction(style);
+  this.render_();
+};
+
+
+/**
+ * Get the style for features.  This returns whatever was passed to the `style`
+ * option at construction or to the `setStyle` method.
+ * @return {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction}
+ *     Overlay style.
+ * @api
+ */
+ol.FeatureOverlay.prototype.getStyle = function() {
+  return this.style_;
+};
+
+
+/**
+ * Get the style function.
+ * @return {ol.style.StyleFunction|undefined} Style function.
+ * @api
+ */
+ol.FeatureOverlay.prototype.getStyleFunction = function() {
+  return this.styleFunction_;
+};
diff --git a/src/ol/format.jsdoc b/src/ol/format.jsdoc
new file mode 100644
index 0000000..d70dd02
--- /dev/null
+++ b/src/ol/format.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.format
+ */
diff --git a/src/ol/format/binaryfeatureformat.js b/src/ol/format/binaryfeatureformat.js
new file mode 100644
index 0000000..ff84c4d
--- /dev/null
+++ b/src/ol/format/binaryfeatureformat.js
@@ -0,0 +1,111 @@
+goog.provide('ol.format.BinaryFeature');
+
+goog.require('goog.asserts');
+goog.require('ol.binary.Buffer');
+goog.require('ol.format.Feature');
+goog.require('ol.format.FormatType');
+goog.require('ol.has');
+goog.require('ol.proj');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.format.Feature}
+ */
+ol.format.BinaryFeature = function() {
+  goog.base(this);
+};
+goog.inherits(ol.format.BinaryFeature, ol.format.Feature);
+
+
+/**
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @private
+ * @return {ol.binary.Buffer} Buffer.
+ */
+ol.format.BinaryFeature.getBuffer_ = function(source) {
+  if (ol.has.ARRAY_BUFFER && source instanceof ArrayBuffer) {
+    return new ol.binary.Buffer(source);
+  } else if (goog.isString(source)) {
+    return new ol.binary.Buffer(source);
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.BinaryFeature.prototype.getType = function() {
+  return ol.format.FormatType.BINARY;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.BinaryFeature.prototype.readFeature = function(source) {
+  return this.readFeatureFromBuffer(ol.format.BinaryFeature.getBuffer_(source));
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.BinaryFeature.prototype.readFeatures = function(source) {
+  return this.readFeaturesFromBuffer(
+      ol.format.BinaryFeature.getBuffer_(source));
+};
+
+
+/**
+ * @param {ol.binary.Buffer} buffer Buffer.
+ * @protected
+ * @return {ol.Feature} Feature.
+ */
+ol.format.BinaryFeature.prototype.readFeatureFromBuffer = goog.abstractMethod;
+
+
+/**
+ * @param {ol.binary.Buffer} buffer Buffer.
+ * @protected
+ * @return {Array.<ol.Feature>} Feature.
+ */
+ol.format.BinaryFeature.prototype.readFeaturesFromBuffer = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.BinaryFeature.prototype.readGeometry = function(source) {
+  return this.readGeometryFromBuffer(
+      ol.format.BinaryFeature.getBuffer_(source));
+};
+
+
+/**
+ * @param {ol.binary.Buffer} buffer Buffer.
+ * @protected
+ * @return {ol.geom.Geometry} Geometry.
+ */
+ol.format.BinaryFeature.prototype.readGeometryFromBuffer = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.BinaryFeature.prototype.readProjection = function(source) {
+  return this.readProjectionFromBuffer(
+      ol.format.BinaryFeature.getBuffer_(source));
+};
+
+
+/**
+ * @param {ol.binary.Buffer} buffer Buffer.
+ * @return {ol.proj.Projection} Projection.
+ */
+ol.format.BinaryFeature.prototype.readProjectionFromBuffer =
+    goog.abstractMethod;
diff --git a/src/ol/format/featureformat.js b/src/ol/format/featureformat.js
new file mode 100644
index 0000000..363428e
--- /dev/null
+++ b/src/ol/format/featureformat.js
@@ -0,0 +1,187 @@
+goog.provide('ol.format.Feature');
+
+goog.require('goog.array');
+goog.require('ol.geom.Geometry');
+goog.require('ol.proj');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for feature formats.
+ * {ol.format.Feature} subclasses provide the ability to decode and encode
+ * {@link ol.Feature} objects from a variety of commonly used geospatial
+ * file formats.  See the documentation for each format for more details.
+ *
+ * @constructor
+ * @api stable
+ */
+ol.format.Feature = function() {
+
+  /**
+   * @protected
+   * @type {ol.proj.Projection}
+   */
+  this.defaultDataProjection = null;
+};
+
+
+/**
+ * @return {Array.<string>} Extensions.
+ */
+ol.format.Feature.prototype.getExtensions = goog.abstractMethod;
+
+
+/**
+ * Adds the data projection to the read options.
+ * @param {Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @return {olx.format.ReadOptions|undefined} Options.
+ * @protected
+ */
+ol.format.Feature.prototype.getReadOptions = function(
+    source, opt_options) {
+  var options;
+  if (goog.isDef(opt_options)) {
+    options = {
+      dataProjection: goog.isDef(opt_options.dataProjection) ?
+          opt_options.dataProjection : this.readProjection(source),
+      featureProjection: opt_options.featureProjection
+    };
+  }
+  return this.adaptOptions(options);
+};
+
+
+/**
+ * Sets the `defaultDataProjection` on the options, if no `dataProjection`
+ * is set.
+ * @param {olx.format.WriteOptions|olx.format.ReadOptions|undefined} options
+ *     Options.
+ * @protected
+ * @return {olx.format.WriteOptions|olx.format.ReadOptions|undefined}
+ *     Updated options.
+ */
+ol.format.Feature.prototype.adaptOptions = function(
+    options) {
+  var updatedOptions;
+  if (goog.isDef(options)) {
+    updatedOptions = {
+      featureProjection: options.featureProjection,
+      dataProjection: goog.isDefAndNotNull(options.dataProjection) ?
+          options.dataProjection : this.defaultDataProjection
+    };
+  }
+  return updatedOptions;
+};
+
+
+/**
+ * @return {ol.format.FormatType} Format.
+ */
+ol.format.Feature.prototype.getType = goog.abstractMethod;
+
+
+/**
+ * Read a single feature from a source.
+ *
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.Feature} Feature.
+ */
+ol.format.Feature.prototype.readFeature = goog.abstractMethod;
+
+
+/**
+ * Read all features from a source.
+ *
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ */
+ol.format.Feature.prototype.readFeatures = goog.abstractMethod;
+
+
+/**
+ * Read a single geometry from a source.
+ *
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.geom.Geometry} Geometry.
+ */
+ol.format.Feature.prototype.readGeometry = goog.abstractMethod;
+
+
+/**
+ * Read the projection from a source.
+ *
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.proj.Projection} Projection.
+ */
+ol.format.Feature.prototype.readProjection = goog.abstractMethod;
+
+
+/**
+ * Encode a feature in this format.
+ *
+ * @param {ol.Feature} feature Feature.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {string} Result.
+ */
+ol.format.Feature.prototype.writeFeature = goog.abstractMethod;
+
+
+/**
+ * Encode an array of features in this format.
+ *
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {string} Result.
+ */
+ol.format.Feature.prototype.writeFeatures = goog.abstractMethod;
+
+
+/**
+ * Write a single geometry in this format.
+ *
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {string} Result.
+ */
+ol.format.Feature.prototype.writeGeometry = goog.abstractMethod;
+
+
+/**
+ * @param {ol.geom.Geometry|ol.Extent} geometry Geometry.
+ * @param {boolean} write Set to true for writing, false for reading.
+ * @param {(olx.format.WriteOptions|olx.format.ReadOptions)=} opt_options
+ *     Options.
+ * @return {ol.geom.Geometry|ol.Extent} Transformed geometry.
+ * @protected
+ */
+ol.format.Feature.transformWithOptions = function(
+    geometry, write, opt_options) {
+  var featureProjection = goog.isDef(opt_options) ?
+      ol.proj.get(opt_options.featureProjection) : null;
+  var dataProjection = goog.isDef(opt_options) ?
+      ol.proj.get(opt_options.dataProjection) : null;
+  if (!goog.isNull(featureProjection) && !goog.isNull(dataProjection) &&
+      !ol.proj.equivalent(featureProjection, dataProjection)) {
+    if (geometry instanceof ol.geom.Geometry) {
+      return (write ? geometry.clone() : geometry).transform(
+          write ? featureProjection : dataProjection,
+          write ? dataProjection : featureProjection);
+    } else {
+      // FIXME this is necessary because ol.format.GML treats extents
+      // as geometries
+      return ol.proj.transformExtent(
+          write ? goog.array.clone(geometry) : geometry,
+          write ? featureProjection : dataProjection,
+          write ? dataProjection : featureProjection);
+    }
+  } else {
+    return geometry;
+  }
+};
diff --git a/src/ol/format/format.js b/src/ol/format/format.js
new file mode 100644
index 0000000..bdedb91
--- /dev/null
+++ b/src/ol/format/format.js
@@ -0,0 +1,12 @@
+goog.provide('ol.format.FormatType');
+
+
+/**
+ * @enum {string}
+ */
+ol.format.FormatType = {
+  BINARY: 'binary',
+  JSON: 'json',
+  TEXT: 'text',
+  XML: 'xml'
+};
diff --git a/src/ol/format/geojsonformat.js b/src/ol/format/geojsonformat.js
new file mode 100644
index 0000000..01ebe4f
--- /dev/null
+++ b/src/ol/format/geojsonformat.js
@@ -0,0 +1,584 @@
+// FIXME coordinate order
+// FIXME reprojection
+
+goog.provide('ol.format.GeoJSON');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('ol.Feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.JSONFeature');
+goog.require('ol.geom.GeometryCollection');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.proj');
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the GeoJSON format.
+ *
+ * @constructor
+ * @extends {ol.format.JSONFeature}
+ * @param {olx.format.GeoJSONOptions=} opt_options Options.
+ * @api stable
+ */
+ol.format.GeoJSON = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this);
+
+  /**
+   * @inheritDoc
+   */
+  this.defaultDataProjection = ol.proj.get(
+      goog.isDefAndNotNull(options.defaultDataProjection) ?
+          options.defaultDataProjection : 'EPSG:4326');
+
+
+  /**
+   * Name of the geometry attribute for features.
+   * @type {string|undefined}
+   * @private
+   */
+  this.geometryName_ = options.geometryName;
+
+};
+goog.inherits(ol.format.GeoJSON, ol.format.JSONFeature);
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ * @private
+ */
+ol.format.GeoJSON.EXTENSIONS_ = ['.geojson'];
+
+
+/**
+ * @param {GeoJSONObject} object Object.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @private
+ * @return {ol.geom.Geometry} Geometry.
+ */
+ol.format.GeoJSON.readGeometry_ = function(object, opt_options) {
+  if (goog.isNull(object)) {
+    return null;
+  }
+  var geometryReader = ol.format.GeoJSON.GEOMETRY_READERS_[object.type];
+  goog.asserts.assert(goog.isDef(geometryReader));
+  return /** @type {ol.geom.Geometry} */ (
+      ol.format.Feature.transformWithOptions(
+          geometryReader(object), false, opt_options));
+};
+
+
+/**
+ * @param {GeoJSONGeometryCollection} object Object.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @private
+ * @return {ol.geom.GeometryCollection} Geometry collection.
+ */
+ol.format.GeoJSON.readGeometryCollectionGeometry_ = function(
+    object, opt_options) {
+  goog.asserts.assert(object.type == 'GeometryCollection');
+  var geometries = goog.array.map(object.geometries,
+      /**
+       * @param {GeoJSONObject} geometry Geometry.
+       * @return {ol.geom.Geometry} geometry Geometry.
+       */
+      function(geometry) {
+        return ol.format.GeoJSON.readGeometry_(geometry, opt_options);
+      });
+  return new ol.geom.GeometryCollection(geometries);
+};
+
+
+/**
+ * @param {GeoJSONGeometry} object Object.
+ * @private
+ * @return {ol.geom.Point} Point.
+ */
+ol.format.GeoJSON.readPointGeometry_ = function(object) {
+  goog.asserts.assert(object.type == 'Point');
+  return new ol.geom.Point(object.coordinates);
+};
+
+
+/**
+ * @param {GeoJSONGeometry} object Object.
+ * @private
+ * @return {ol.geom.LineString} LineString.
+ */
+ol.format.GeoJSON.readLineStringGeometry_ = function(object) {
+  goog.asserts.assert(object.type == 'LineString');
+  return new ol.geom.LineString(object.coordinates);
+};
+
+
+/**
+ * @param {GeoJSONGeometry} object Object.
+ * @private
+ * @return {ol.geom.MultiLineString} MultiLineString.
+ */
+ol.format.GeoJSON.readMultiLineStringGeometry_ = function(object) {
+  goog.asserts.assert(object.type == 'MultiLineString');
+  return new ol.geom.MultiLineString(object.coordinates);
+};
+
+
+/**
+ * @param {GeoJSONGeometry} object Object.
+ * @private
+ * @return {ol.geom.MultiPoint} MultiPoint.
+ */
+ol.format.GeoJSON.readMultiPointGeometry_ = function(object) {
+  goog.asserts.assert(object.type == 'MultiPoint');
+  return new ol.geom.MultiPoint(object.coordinates);
+};
+
+
+/**
+ * @param {GeoJSONGeometry} object Object.
+ * @private
+ * @return {ol.geom.MultiPolygon} MultiPolygon.
+ */
+ol.format.GeoJSON.readMultiPolygonGeometry_ = function(object) {
+  goog.asserts.assert(object.type == 'MultiPolygon');
+  return new ol.geom.MultiPolygon(object.coordinates);
+};
+
+
+/**
+ * @param {GeoJSONGeometry} object Object.
+ * @private
+ * @return {ol.geom.Polygon} Polygon.
+ */
+ol.format.GeoJSON.readPolygonGeometry_ = function(object) {
+  goog.asserts.assert(object.type == 'Polygon');
+  return new ol.geom.Polygon(object.coordinates);
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @private
+ * @return {GeoJSONGeometry|GeoJSONGeometryCollection} GeoJSON geometry.
+ */
+ol.format.GeoJSON.writeGeometry_ = function(geometry, opt_options) {
+  var geometryWriter = ol.format.GeoJSON.GEOMETRY_WRITERS_[geometry.getType()];
+  goog.asserts.assert(goog.isDef(geometryWriter));
+  return geometryWriter(/** @type {ol.geom.Geometry} */ (
+      ol.format.Feature.transformWithOptions(geometry, true, opt_options)));
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @private
+ * @return {GeoJSONGeometryCollection} Empty GeoJSON geometry collection.
+ */
+ol.format.GeoJSON.writeEmptyGeometryCollectionGeometry_ = function(geometry) {
+  return /** @type {GeoJSONGeometryCollection} */ ({
+    'type': 'GeometryCollection',
+    'geometries': []
+  });
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @private
+ * @return {GeoJSONGeometryCollection} GeoJSON geometry collection.
+ */
+ol.format.GeoJSON.writeGeometryCollectionGeometry_ = function(
+    geometry, opt_options) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.GeometryCollection);
+  var geometries = goog.array.map(
+      geometry.getGeometriesArray(), function(geometry) {
+        return ol.format.GeoJSON.writeGeometry_(geometry, opt_options);
+      });
+  return /** @type {GeoJSONGeometryCollection} */ ({
+    'type': 'GeometryCollection',
+    'geometries': geometries
+  });
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @private
+ * @return {GeoJSONGeometry} GeoJSON geometry.
+ */
+ol.format.GeoJSON.writeLineStringGeometry_ = function(geometry) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+  return /** @type {GeoJSONGeometry} */ ({
+    'type': 'LineString',
+    'coordinates': geometry.getCoordinates()
+  });
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @private
+ * @return {GeoJSONGeometry} GeoJSON geometry.
+ */
+ol.format.GeoJSON.writeMultiLineStringGeometry_ = function(geometry) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString);
+  goog.asserts.assert(
+      geometry.getType() == ol.geom.GeometryType.MULTI_LINE_STRING);
+  return /** @type {GeoJSONGeometry} */ ({
+    'type': 'MultiLineString',
+    'coordinates': geometry.getCoordinates()
+  });
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @private
+ * @return {GeoJSONGeometry} GeoJSON geometry.
+ */
+ol.format.GeoJSON.writeMultiPointGeometry_ = function(geometry) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.MultiPoint);
+  return /** @type {GeoJSONGeometry} */ ({
+    'type': 'MultiPoint',
+    'coordinates': geometry.getCoordinates()
+  });
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @private
+ * @return {GeoJSONGeometry} GeoJSON geometry.
+ */
+ol.format.GeoJSON.writeMultiPolygonGeometry_ = function(geometry) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon);
+  return /** @type {GeoJSONGeometry} */ ({
+    'type': 'MultiPolygon',
+    'coordinates': geometry.getCoordinates()
+  });
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @private
+ * @return {GeoJSONGeometry} GeoJSON geometry.
+ */
+ol.format.GeoJSON.writePointGeometry_ = function(geometry) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.Point);
+  return /** @type {GeoJSONGeometry} */ ({
+    'type': 'Point',
+    'coordinates': geometry.getCoordinates()
+  });
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @private
+ * @return {GeoJSONGeometry} GeoJSON geometry.
+ */
+ol.format.GeoJSON.writePolygonGeometry_ = function(geometry) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
+  return /** @type {GeoJSONGeometry} */ ({
+    'type': 'Polygon',
+    'coordinates': geometry.getCoordinates()
+  });
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Object.<string, function(GeoJSONObject): ol.geom.Geometry>}
+ */
+ol.format.GeoJSON.GEOMETRY_READERS_ = {
+  'Point': ol.format.GeoJSON.readPointGeometry_,
+  'LineString': ol.format.GeoJSON.readLineStringGeometry_,
+  'Polygon': ol.format.GeoJSON.readPolygonGeometry_,
+  'MultiPoint': ol.format.GeoJSON.readMultiPointGeometry_,
+  'MultiLineString': ol.format.GeoJSON.readMultiLineStringGeometry_,
+  'MultiPolygon': ol.format.GeoJSON.readMultiPolygonGeometry_,
+  'GeometryCollection': ol.format.GeoJSON.readGeometryCollectionGeometry_
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Object.<string, function(ol.geom.Geometry): (GeoJSONGeometry|GeoJSONGeometryCollection)>}
+ */
+ol.format.GeoJSON.GEOMETRY_WRITERS_ = {
+  'Point': ol.format.GeoJSON.writePointGeometry_,
+  'LineString': ol.format.GeoJSON.writeLineStringGeometry_,
+  'Polygon': ol.format.GeoJSON.writePolygonGeometry_,
+  'MultiPoint': ol.format.GeoJSON.writeMultiPointGeometry_,
+  'MultiLineString': ol.format.GeoJSON.writeMultiLineStringGeometry_,
+  'MultiPolygon': ol.format.GeoJSON.writeMultiPolygonGeometry_,
+  'GeometryCollection': ol.format.GeoJSON.writeGeometryCollectionGeometry_,
+  'Circle': ol.format.GeoJSON.writeEmptyGeometryCollectionGeometry_
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GeoJSON.prototype.getExtensions = function() {
+  return ol.format.GeoJSON.EXTENSIONS_;
+};
+
+
+/**
+ * Read a feature from a GeoJSON Feature source.  Only works for Feature,
+ * use `readFeatures` to read FeatureCollection source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.Feature} Feature.
+ * @api stable
+ */
+ol.format.GeoJSON.prototype.readFeature;
+
+
+/**
+ * Read all features from a GeoJSON source.  Works with both Feature and
+ * FeatureCollection sources.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.GeoJSON.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GeoJSON.prototype.readFeatureFromObject = function(
+    object, opt_options) {
+  var geoJSONFeature = /** @type {GeoJSONFeature} */ (object);
+  goog.asserts.assert(geoJSONFeature.type == 'Feature');
+  var geometry = ol.format.GeoJSON.readGeometry_(geoJSONFeature.geometry,
+      opt_options);
+  var feature = new ol.Feature();
+  if (goog.isDef(this.geometryName_)) {
+    feature.setGeometryName(this.geometryName_);
+  }
+  feature.setGeometry(geometry);
+  if (goog.isDef(geoJSONFeature.id)) {
+    feature.setId(geoJSONFeature.id);
+  }
+  if (goog.isDef(geoJSONFeature.properties)) {
+    feature.setProperties(geoJSONFeature.properties);
+  }
+  return feature;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GeoJSON.prototype.readFeaturesFromObject = function(
+    object, opt_options) {
+  var geoJSONObject = /** @type {GeoJSONObject} */ (object);
+  if (geoJSONObject.type == 'Feature') {
+    return [this.readFeatureFromObject(object, opt_options)];
+  } else if (geoJSONObject.type == 'FeatureCollection') {
+    var geoJSONFeatureCollection = /** @type {GeoJSONFeatureCollection} */
+        (object);
+    /** @type {Array.<ol.Feature>} */
+    var features = [];
+    var geoJSONFeatures = geoJSONFeatureCollection.features;
+    var i, ii;
+    for (i = 0, ii = geoJSONFeatures.length; i < ii; ++i) {
+      features.push(this.readFeatureFromObject(geoJSONFeatures[i],
+          opt_options));
+    }
+    return features;
+  } else {
+    goog.asserts.fail();
+    return [];
+  }
+};
+
+
+/**
+ * Read a geometry from a GeoJSON source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.geom.Geometry} Geometry.
+ * @api stable
+ */
+ol.format.GeoJSON.prototype.readGeometry;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GeoJSON.prototype.readGeometryFromObject = function(
+    object, opt_options) {
+  return ol.format.GeoJSON.readGeometry_(
+      /** @type {GeoJSONGeometry} */ (object), opt_options);
+};
+
+
+/**
+ * Read the projection from a GeoJSON source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.proj.Projection} Projection.
+ * @api stable
+ */
+ol.format.GeoJSON.prototype.readProjection;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GeoJSON.prototype.readProjectionFromObject = function(object) {
+  var geoJSONObject = /** @type {GeoJSONObject} */ (object);
+  var crs = geoJSONObject.crs;
+  if (goog.isDefAndNotNull(crs)) {
+    if (crs.type == 'name') {
+      return ol.proj.get(crs.properties.name);
+    } else if (crs.type == 'EPSG') {
+      // 'EPSG' is not part of the GeoJSON specification, but is generated by
+      // GeoServer.
+      // TODO: remove this when http://jira.codehaus.org/browse/GEOS-5996
+      // is fixed and widely deployed.
+      return ol.proj.get('EPSG:' + crs.properties.code);
+    } else {
+      goog.asserts.fail();
+      return null;
+    }
+  } else {
+    return this.defaultDataProjection;
+  }
+};
+
+
+/**
+ * Encode a feature as a GeoJSON Feature string.
+ *
+ * @function
+ * @param {ol.Feature} feature Feature.
+ * @param {olx.format.WriteOptions} options Write options.
+ * @return {string} GeoJSON.
+ * @api stable
+ */
+ol.format.GeoJSON.prototype.writeFeature;
+
+
+/**
+ * Encode a feature as a GeoJSON Feature object.
+ *
+ * @param {ol.Feature} feature Feature.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @api
+ * @return {Object} Object.
+ */
+ol.format.GeoJSON.prototype.writeFeatureObject = function(
+    feature, opt_options) {
+  opt_options = this.adaptOptions(opt_options);
+  var object = {
+    'type': 'Feature'
+  };
+  var id = feature.getId();
+  if (goog.isDefAndNotNull(id)) {
+    goog.object.set(object, 'id', id);
+  }
+  var geometry = feature.getGeometry();
+  if (goog.isDefAndNotNull(geometry)) {
+    goog.object.set(
+        object, 'geometry',
+        ol.format.GeoJSON.writeGeometry_(geometry, opt_options));
+  }
+  var properties = feature.getProperties();
+  goog.object.remove(properties, feature.getGeometryName());
+  if (!goog.object.isEmpty(properties)) {
+    goog.object.set(object, 'properties', properties);
+  }
+  return object;
+};
+
+
+/**
+ * Encode an array of features as GeoJSON.
+ *
+ * @function
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions} options Write options.
+ * @return {string} GeoJSON.
+ * @api stable
+ */
+ol.format.GeoJSON.prototype.writeFeatures;
+
+
+/**
+ * Encode an array of features as a GeoJSON object.
+ *
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {Object} GeoJSON Object.
+ * @api
+ */
+ol.format.GeoJSON.prototype.writeFeaturesObject =
+    function(features, opt_options) {
+  opt_options = this.adaptOptions(opt_options);
+  var objects = [];
+  var i, ii;
+  for (i = 0, ii = features.length; i < ii; ++i) {
+    objects.push(this.writeFeatureObject(features[i], opt_options));
+  }
+  return /** @type {GeoJSONFeatureCollection} */ ({
+    'type': 'FeatureCollection',
+    'features': objects
+  });
+};
+
+
+/**
+ * Encode a geometry as a GeoJSON string.
+ *
+ * @function
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions} options Write options.
+ * @return {string} GeoJSON.
+ * @api stable
+ */
+ol.format.GeoJSON.prototype.writeGeometry;
+
+
+/**
+ * Encode a geometry as a GeoJSON object.
+ *
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {GeoJSONGeometry|GeoJSONGeometryCollection} Object.
+ * @api
+ */
+ol.format.GeoJSON.prototype.writeGeometryObject = function(geometry,
+    opt_options) {
+  return ol.format.GeoJSON.writeGeometry_(geometry,
+      this.adaptOptions(opt_options));
+};
diff --git a/src/ol/format/gml/gml2format.js b/src/ol/format/gml/gml2format.js
new file mode 100644
index 0000000..f1564bc
--- /dev/null
+++ b/src/ol/format/gml/gml2format.js
@@ -0,0 +1,218 @@
+goog.provide('ol.format.GML2');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('ol.extent');
+goog.require('ol.format.GML');
+goog.require('ol.format.GMLBase');
+goog.require('ol.format.XSD');
+goog.require('ol.proj');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the GML format,
+ * version 2.1.2.
+ *
+ * @constructor
+ * @param {olx.format.GMLOptions=} opt_options Optional configuration object.
+ * @extends {ol.format.GMLBase}
+ * @api
+ */
+ol.format.GML2 = function(opt_options) {
+  var options = /** @type {olx.format.GMLOptions} */
+      (goog.isDef(opt_options) ? opt_options : {});
+
+  goog.base(this, options);
+
+  /**
+   * @inheritDoc
+   */
+  this.schemaLocation = goog.isDef(options.schemaLocation) ?
+      options.schemaLocation : ol.format.GML2.schemaLocation_;
+
+};
+goog.inherits(ol.format.GML2, ol.format.GMLBase);
+
+
+/**
+ * @const
+ * @type {string}
+ * @private
+ */
+ol.format.GML2.schemaLocation_ = 'http://www.opengis.net/gml ' +
+    'http://schemas.opengis.net/gml/2.1.2/feature.xsd';
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>|undefined} Flat coordinates.
+ */
+ol.format.GML2.prototype.readFlatCoordinates_ = function(node, objectStack) {
+  var s = ol.xml.getAllTextContent(node, false).replace(/^\s*|\s*$/g, '');
+  var context = objectStack[0];
+  goog.asserts.assert(goog.isObject(context));
+  var containerSrs = goog.object.get(context, 'srsName');
+  var containerDimension = node.parentNode.getAttribute('srsDimension');
+  var axisOrientation = 'enu';
+  if (!goog.isNull(containerSrs)) {
+    var proj = ol.proj.get(containerSrs);
+    axisOrientation = proj.getAxisOrientation();
+  }
+  var coords = s.split(/[\s,]+/);
+  // The "dimension" attribute is from the GML 3.0.1 spec.
+  var dim = 2;
+  if (!goog.isNull(node.getAttribute('srsDimension'))) {
+    dim = ol.format.XSD.readNonNegativeIntegerString(
+        node.getAttribute('srsDimension'));
+  } else if (!goog.isNull(node.getAttribute('dimension'))) {
+    dim = ol.format.XSD.readNonNegativeIntegerString(
+        node.getAttribute('dimension'));
+  } else if (!goog.isNull(containerDimension)) {
+    dim = ol.format.XSD.readNonNegativeIntegerString(containerDimension);
+  }
+  var x, y, z;
+  var flatCoordinates = [];
+  for (var i = 0, ii = coords.length; i < ii; i += dim) {
+    x = parseFloat(coords[i]);
+    y = parseFloat(coords[i + 1]);
+    z = (dim === 3) ? parseFloat(coords[i + 2]) : 0;
+    if (axisOrientation.substr(0, 2) === 'en') {
+      flatCoordinates.push(x, y, z);
+    } else {
+      flatCoordinates.push(y, x, z);
+    }
+  }
+  return flatCoordinates;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.Extent|undefined} Envelope.
+ */
+ol.format.GML2.prototype.readBox_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Box');
+  var flatCoordinates = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>} */ ([null]),
+      this.BOX_PARSERS_, node, objectStack, this);
+  return ol.extent.createOrUpdate(flatCoordinates[1][0],
+      flatCoordinates[1][1], flatCoordinates[1][3],
+      flatCoordinates[1][4]);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GML2.prototype.innerBoundaryIsParser_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'innerBoundaryIs');
+  var flatLinearRing = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>|undefined} */ (undefined),
+      this.RING_PARSERS, node, objectStack, this);
+  if (goog.isDef(flatLinearRing)) {
+    var flatLinearRings = /** @type {Array.<Array.<number>>} */
+        (objectStack[objectStack.length - 1]);
+    goog.asserts.assert(goog.isArray(flatLinearRings));
+    goog.asserts.assert(flatLinearRings.length > 0);
+    flatLinearRings.push(flatLinearRing);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GML2.prototype.outerBoundaryIsParser_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'outerBoundaryIs');
+  var flatLinearRing = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>|undefined} */ (undefined),
+      this.RING_PARSERS, node, objectStack, this);
+  if (goog.isDef(flatLinearRing)) {
+    var flatLinearRings = /** @type {Array.<Array.<number>>} */
+        (objectStack[objectStack.length - 1]);
+    goog.asserts.assert(goog.isArray(flatLinearRings));
+    goog.asserts.assert(flatLinearRings.length > 0);
+    flatLinearRings[0] = flatLinearRing;
+  }
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML2.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'coordinates': ol.xml.makeReplacer(
+        ol.format.GML2.prototype.readFlatCoordinates_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML2.prototype.FLAT_LINEAR_RINGS_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'innerBoundaryIs': ol.format.GML2.prototype.innerBoundaryIsParser_,
+    'outerBoundaryIs': ol.format.GML2.prototype.outerBoundaryIsParser_
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML2.prototype.BOX_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'coordinates': ol.xml.makeArrayPusher(
+        ol.format.GML2.prototype.readFlatCoordinates_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML2.prototype.GEOMETRY_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'Point': ol.xml.makeReplacer(ol.format.GMLBase.prototype.readPoint),
+    'MultiPoint': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readMultiPoint),
+    'LineString': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readLineString),
+    'MultiLineString': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readMultiLineString),
+    'LinearRing' : ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readLinearRing),
+    'Polygon': ol.xml.makeReplacer(ol.format.GMLBase.prototype.readPolygon),
+    'MultiPolygon': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readMultiPolygon),
+    'Box': ol.xml.makeReplacer(ol.format.GML2.prototype.readBox_)
+  }
+});
diff --git a/src/ol/format/gml/gml3format.js b/src/ol/format/gml/gml3format.js
new file mode 100644
index 0000000..d0d879b
--- /dev/null
+++ b/src/ol/format/gml/gml3format.js
@@ -0,0 +1,1351 @@
+goog.provide('ol.format.GML');
+goog.provide('ol.format.GML3');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('ol.Feature');
+goog.require('ol.extent');
+goog.require('ol.format.Feature');
+goog.require('ol.format.GMLBase');
+goog.require('ol.format.XSD');
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.LinearRing');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.proj');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the GML format
+ * version 3.1.1.
+ * Currently only supports GML 3.1.1 Simple Features profile.
+ *
+ * @constructor
+ * @param {olx.format.GMLOptions=} opt_options
+ *     Optional configuration object.
+ * @extends {ol.format.GMLBase}
+ * @api
+ */
+ol.format.GML3 = function(opt_options) {
+  var options = /** @type {olx.format.GMLOptions} */
+      (goog.isDef(opt_options) ? opt_options : {});
+
+  goog.base(this, options);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.surface_ = goog.isDef(options.surface) ?
+      options.surface : false;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.curve_ = goog.isDef(options.curve) ?
+      options.curve : false;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.multiCurve_ = goog.isDef(options.multiCurve) ?
+      options.multiCurve : true;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.multiSurface_ = goog.isDef(options.multiSurface) ?
+      options.multiSurface : true;
+
+  /**
+   * @inheritDoc
+   */
+  this.schemaLocation = goog.isDef(options.schemaLocation) ?
+      options.schemaLocation : ol.format.GML3.schemaLocation_;
+
+};
+goog.inherits(ol.format.GML3, ol.format.GMLBase);
+
+
+/**
+ * @const
+ * @type {string}
+ * @private
+ */
+ol.format.GML3.schemaLocation_ = 'http://www.opengis.net/gml ' +
+    'http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/' +
+    '1.0.0/gmlsf.xsd';
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.MultiLineString|undefined} MultiLineString.
+ */
+ol.format.GML3.prototype.readMultiCurve_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'MultiCurve');
+  var lineStrings = ol.xml.pushParseAndPop(
+      /** @type {Array.<ol.geom.LineString>} */ ([]),
+      this.MULTICURVE_PARSERS_, node, objectStack, this);
+  if (goog.isDef(lineStrings)) {
+    var multiLineString = new ol.geom.MultiLineString(null);
+    multiLineString.setLineStrings(lineStrings);
+    return multiLineString;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.MultiPolygon|undefined} MultiPolygon.
+ */
+ol.format.GML3.prototype.readMultiSurface_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'MultiSurface');
+  var polygons = ol.xml.pushParseAndPop(
+      /** @type {Array.<ol.geom.Polygon>} */ ([]),
+      this.MULTISURFACE_PARSERS_, node, objectStack, this);
+  if (goog.isDef(polygons)) {
+    var multiPolygon = new ol.geom.MultiPolygon(null);
+    multiPolygon.setPolygons(polygons);
+    return multiPolygon;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GML3.prototype.curveMemberParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'curveMember' ||
+      node.localName == 'curveMembers');
+  ol.xml.parseNode(this.CURVEMEMBER_PARSERS_, node, objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GML3.prototype.surfaceMemberParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'surfaceMember' ||
+      node.localName == 'surfaceMembers');
+  ol.xml.parseNode(this.SURFACEMEMBER_PARSERS_,
+      node, objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<(Array.<number>)>|undefined} flat coordinates.
+ */
+ol.format.GML3.prototype.readPatch_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'patches');
+  return ol.xml.pushParseAndPop(
+      /** @type {Array.<Array.<number>>} */ ([null]),
+      this.PATCHES_PARSERS_, node, objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>|undefined} flat coordinates.
+ */
+ol.format.GML3.prototype.readSegment_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'segments');
+  return ol.xml.pushParseAndPop(
+      /** @type {Array.<number>} */ ([null]),
+      this.SEGMENTS_PARSERS_, node, objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<(Array.<number>)>|undefined} flat coordinates.
+ */
+ol.format.GML3.prototype.readPolygonPatch_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'PolygonPatch');
+  return ol.xml.pushParseAndPop(
+      /** @type {Array.<Array.<number>>} */ ([null]),
+      this.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>|undefined} flat coordinates.
+ */
+ol.format.GML3.prototype.readLineStringSegment_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LineStringSegment');
+  return ol.xml.pushParseAndPop(
+      /** @type {Array.<number>} */ ([null]),
+      this.GEOMETRY_FLAT_COORDINATES_PARSERS_,
+      node, objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GML3.prototype.interiorParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'interior');
+  var flatLinearRing = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>|undefined} */ (undefined),
+      this.RING_PARSERS, node, objectStack, this);
+  if (goog.isDef(flatLinearRing)) {
+    var flatLinearRings = /** @type {Array.<Array.<number>>} */
+        (objectStack[objectStack.length - 1]);
+    goog.asserts.assert(goog.isArray(flatLinearRings));
+    goog.asserts.assert(flatLinearRings.length > 0);
+    flatLinearRings.push(flatLinearRing);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GML3.prototype.exteriorParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'exterior');
+  var flatLinearRing = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>|undefined} */ (undefined),
+      this.RING_PARSERS, node, objectStack, this);
+  if (goog.isDef(flatLinearRing)) {
+    var flatLinearRings = /** @type {Array.<Array.<number>>} */
+        (objectStack[objectStack.length - 1]);
+    goog.asserts.assert(goog.isArray(flatLinearRings));
+    goog.asserts.assert(flatLinearRings.length > 0);
+    flatLinearRings[0] = flatLinearRing;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.Polygon|undefined} Polygon.
+ */
+ol.format.GML3.prototype.readSurface_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Surface');
+  var flatLinearRings = ol.xml.pushParseAndPop(
+      /** @type {Array.<Array.<number>>} */ ([null]),
+      this.SURFACE_PARSERS_, node, objectStack, this);
+  if (goog.isDef(flatLinearRings) &&
+      !goog.isNull(flatLinearRings[0])) {
+    var polygon = new ol.geom.Polygon(null);
+    var flatCoordinates = flatLinearRings[0];
+    var ends = [flatCoordinates.length];
+    var i, ii;
+    for (i = 1, ii = flatLinearRings.length; i < ii; ++i) {
+      goog.array.extend(flatCoordinates, flatLinearRings[i]);
+      ends.push(flatCoordinates.length);
+    }
+    polygon.setFlatCoordinates(
+        ol.geom.GeometryLayout.XYZ, flatCoordinates, ends);
+    return polygon;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.LineString|undefined} LineString.
+ */
+ol.format.GML3.prototype.readCurve_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Curve');
+  var flatCoordinates = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>} */ ([null]),
+      this.CURVE_PARSERS_, node, objectStack, this);
+  if (goog.isDef(flatCoordinates)) {
+    var lineString = new ol.geom.LineString(null);
+    lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates);
+    return lineString;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.Extent|undefined} Envelope.
+ */
+ol.format.GML3.prototype.readEnvelope_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Envelope');
+  var flatCoordinates = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>} */ ([null]),
+      this.ENVELOPE_PARSERS_, node, objectStack, this);
+  return ol.extent.createOrUpdate(flatCoordinates[1][0],
+      flatCoordinates[1][1], flatCoordinates[2][0],
+      flatCoordinates[2][1]);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>|undefined} Flat coordinates.
+ */
+ol.format.GML3.prototype.readFlatPos_ = function(node, objectStack) {
+  var s = ol.xml.getAllTextContent(node, false);
+  var re = /^\s*([+\-]?\d*\.?\d+(?:[eE][+\-]?\d+)?)\s*/;
+  /** @type {Array.<number>} */
+  var flatCoordinates = [];
+  var m;
+  while ((m = re.exec(s))) {
+    flatCoordinates.push(parseFloat(m[1]));
+    s = s.substr(m[0].length);
+  }
+  if (s !== '') {
+    return undefined;
+  }
+  var context = objectStack[0];
+  goog.asserts.assert(goog.isObject(context));
+  var containerSrs = goog.object.get(context, 'srsName');
+  var axisOrientation = 'enu';
+  if (!goog.isNull(containerSrs)) {
+    var proj = ol.proj.get(containerSrs);
+    axisOrientation = proj.getAxisOrientation();
+  }
+  if (axisOrientation === 'neu') {
+    var i, ii;
+    for (i = 0, ii = flatCoordinates.length; i < ii; i += 3) {
+      var y = flatCoordinates[i];
+      var x = flatCoordinates[i + 1];
+      flatCoordinates[i] = x;
+      flatCoordinates[i + 1] = y;
+    }
+  }
+  var len = flatCoordinates.length;
+  if (len == 2) {
+    flatCoordinates.push(0);
+  }
+  if (len === 0) {
+    return undefined;
+  }
+  return flatCoordinates;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>|undefined} Flat coordinates.
+ */
+ol.format.GML3.prototype.readFlatPosList_ = function(node, objectStack) {
+  var s = ol.xml.getAllTextContent(node, false).replace(/^\s*|\s*$/g, '');
+  var context = objectStack[0];
+  goog.asserts.assert(goog.isObject(context));
+  var containerSrs = goog.object.get(context, 'srsName');
+  var containerDimension = node.parentNode.getAttribute('srsDimension');
+  var axisOrientation = 'enu';
+  if (!goog.isNull(containerSrs)) {
+    var proj = ol.proj.get(containerSrs);
+    axisOrientation = proj.getAxisOrientation();
+  }
+  var coords = s.split(/\s+/);
+  // The "dimension" attribute is from the GML 3.0.1 spec.
+  var dim = 2;
+  if (!goog.isNull(node.getAttribute('srsDimension'))) {
+    dim = ol.format.XSD.readNonNegativeIntegerString(
+        node.getAttribute('srsDimension'));
+  } else if (!goog.isNull(node.getAttribute('dimension'))) {
+    dim = ol.format.XSD.readNonNegativeIntegerString(
+        node.getAttribute('dimension'));
+  } else if (!goog.isNull(containerDimension)) {
+    dim = ol.format.XSD.readNonNegativeIntegerString(containerDimension);
+  }
+  var x, y, z;
+  var flatCoordinates = [];
+  for (var i = 0, ii = coords.length; i < ii; i += dim) {
+    x = parseFloat(coords[i]);
+    y = parseFloat(coords[i + 1]);
+    z = (dim === 3) ? parseFloat(coords[i + 2]) : 0;
+    if (axisOrientation.substr(0, 2) === 'en') {
+      flatCoordinates.push(x, y, z);
+    } else {
+      flatCoordinates.push(y, x, z);
+    }
+  }
+  return flatCoordinates;
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.GEOMETRY_FLAT_COORDINATES_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'pos': ol.xml.makeReplacer(ol.format.GML3.prototype.readFlatPos_),
+    'posList': ol.xml.makeReplacer(ol.format.GML3.prototype.readFlatPosList_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.FLAT_LINEAR_RINGS_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'interior': ol.format.GML3.prototype.interiorParser_,
+    'exterior': ol.format.GML3.prototype.exteriorParser_
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.GEOMETRY_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'Point': ol.xml.makeReplacer(ol.format.GMLBase.prototype.readPoint),
+    'MultiPoint': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readMultiPoint),
+    'LineString': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readLineString),
+    'MultiLineString': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readMultiLineString),
+    'LinearRing' : ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readLinearRing),
+    'Polygon': ol.xml.makeReplacer(ol.format.GMLBase.prototype.readPolygon),
+    'MultiPolygon': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readMultiPolygon),
+    'Surface': ol.xml.makeReplacer(ol.format.GML3.prototype.readSurface_),
+    'MultiSurface': ol.xml.makeReplacer(
+        ol.format.GML3.prototype.readMultiSurface_),
+    'Curve': ol.xml.makeReplacer(ol.format.GML3.prototype.readCurve_),
+    'MultiCurve': ol.xml.makeReplacer(
+        ol.format.GML3.prototype.readMultiCurve_),
+    'Envelope': ol.xml.makeReplacer(ol.format.GML3.prototype.readEnvelope_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.MULTICURVE_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'curveMember': ol.xml.makeArrayPusher(
+        ol.format.GML3.prototype.curveMemberParser_),
+    'curveMembers': ol.xml.makeArrayPusher(
+        ol.format.GML3.prototype.curveMemberParser_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.MULTISURFACE_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'surfaceMember': ol.xml.makeArrayPusher(
+        ol.format.GML3.prototype.surfaceMemberParser_),
+    'surfaceMembers': ol.xml.makeArrayPusher(
+        ol.format.GML3.prototype.surfaceMemberParser_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.CURVEMEMBER_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'LineString': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.readLineString),
+    'Curve': ol.xml.makeArrayPusher(ol.format.GML3.prototype.readCurve_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.SURFACEMEMBER_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'Polygon': ol.xml.makeArrayPusher(ol.format.GMLBase.prototype.readPolygon),
+    'Surface': ol.xml.makeArrayPusher(ol.format.GML3.prototype.readSurface_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.SURFACE_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'patches': ol.xml.makeReplacer(ol.format.GML3.prototype.readPatch_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.CURVE_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'segments': ol.xml.makeReplacer(ol.format.GML3.prototype.readSegment_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.ENVELOPE_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'lowerCorner': ol.xml.makeArrayPusher(
+        ol.format.GML3.prototype.readFlatPosList_),
+    'upperCorner': ol.xml.makeArrayPusher(
+        ol.format.GML3.prototype.readFlatPosList_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.PATCHES_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'PolygonPatch': ol.xml.makeReplacer(
+        ol.format.GML3.prototype.readPolygonPatch_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GML3.prototype.SEGMENTS_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'LineStringSegment': ol.xml.makeReplacer(
+        ol.format.GML3.prototype.readLineStringSegment_)
+  }
+});
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Point} value Point geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writePos_ = function(node, value, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  var axisOrientation = 'enu';
+  if (goog.isDefAndNotNull(srsName)) {
+    axisOrientation = ol.proj.get(srsName).getAxisOrientation();
+  }
+  var point = value.getCoordinates();
+  var coords;
+  // only 2d for simple features profile
+  if (axisOrientation.substr(0, 2) === 'en') {
+    coords = (point[0] + ' ' + point[1]);
+  } else {
+    coords = (point[1] + ' ' + point[0]);
+  }
+  ol.format.XSD.writeStringTextNode(node, coords);
+};
+
+
+/**
+ * @param {Array.<number>} point Point geometry.
+ * @param {string=} opt_srsName Optional srsName
+ * @return {string}
+ * @private
+ */
+ol.format.GML3.prototype.getCoords_ = function(point, opt_srsName) {
+  var axisOrientation = 'enu';
+  if (goog.isDefAndNotNull(opt_srsName)) {
+    axisOrientation = ol.proj.get(opt_srsName).getAxisOrientation();
+  }
+  return ((axisOrientation.substr(0, 2) === 'en') ?
+      point[0] + ' ' + point[1] :
+      point[1] + ' ' + point[0]);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.LineString|ol.geom.LinearRing} value Geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writePosList_ = function(node, value, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  // only 2d for simple features profile
+  var points = value.getCoordinates();
+  var len = points.length;
+  var parts = new Array(len);
+  var point;
+  for (var i = 0; i < len; ++i) {
+    point = points[i];
+    parts[i] = this.getCoords_(point, srsName);
+  }
+  ol.format.XSD.writeStringTextNode(node, parts.join(' '));
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Point} geometry Point geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writePoint_ = function(node, geometry, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  if (goog.isDefAndNotNull(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  var pos = ol.xml.createElementNS(node.namespaceURI, 'pos');
+  node.appendChild(pos);
+  this.writePos_(pos, geometry, objectStack);
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GML3.ENVELOPE_SERIALIZERS_ = {
+  'http://www.opengis.net/gml': {
+    'lowerCorner': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+    'upperCorner': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode)
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Extent} extent Extent.
+ * @param {Array.<*>} objectStack Node stack.
+ */
+ol.format.GML3.prototype.writeEnvelope = function(node, extent, objectStack) {
+  goog.asserts.assert(extent.length == 4);
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  if (goog.isDef(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  var keys = ['lowerCorner', 'upperCorner'];
+  var values = [extent[0] + ' ' + extent[1], extent[2] + ' ' + extent[3]];
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
+      ({node: node}), ol.format.GML3.ENVELOPE_SERIALIZERS_,
+      ol.xml.OBJECT_PROPERTY_NODE_FACTORY,
+      values,
+      objectStack, keys, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.LinearRing} geometry LinearRing geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeLinearRing_ =
+    function(node, geometry, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  if (goog.isDefAndNotNull(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  var posList = ol.xml.createElementNS(node.namespaceURI, 'posList');
+  node.appendChild(posList);
+  this.writePosList_(posList, geometry, objectStack);
+};
+
+
+/**
+ * @param {*} value Value.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {string=} opt_nodeName Node name.
+ * @return {Node} Node.
+ * @private
+ */
+ol.format.GML3.prototype.RING_NODE_FACTORY_ =
+    function(value, objectStack, opt_nodeName) {
+  var context = objectStack[objectStack.length - 1];
+  var parentNode = context.node;
+  goog.asserts.assert(goog.isObject(context));
+  var exteriorWritten = goog.object.get(context, 'exteriorWritten');
+  if (!goog.isDef(exteriorWritten)) {
+    goog.object.set(context, 'exteriorWritten', true);
+  }
+  return ol.xml.createElementNS(parentNode.namespaceURI,
+      goog.isDef(exteriorWritten) ? 'interior' : 'exterior');
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Polygon} geometry Polygon geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeSurfaceOrPolygon_ =
+    function(node, geometry, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  if (node.nodeName !== 'PolygonPatch' && goog.isDefAndNotNull(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  if (node.nodeName === 'Polygon' || node.nodeName === 'PolygonPatch') {
+    var rings = geometry.getLinearRings();
+    ol.xml.pushSerializeAndPop(
+        {node: node, srsName: srsName},
+        ol.format.GML3.RING_SERIALIZERS_,
+        this.RING_NODE_FACTORY_,
+        rings, objectStack, undefined, this);
+  } else if (node.nodeName === 'Surface') {
+    var patches = ol.xml.createElementNS(node.namespaceURI, 'patches');
+    node.appendChild(patches);
+    this.writeSurfacePatches_(
+        patches, geometry, objectStack);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.LineString} geometry LineString geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeCurveOrLineString_ =
+    function(node, geometry, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  if (node.nodeName !== 'LineStringSegment' &&
+      goog.isDefAndNotNull(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  if (node.nodeName === 'LineString' ||
+      node.nodeName === 'LineStringSegment') {
+    var posList = ol.xml.createElementNS(node.namespaceURI, 'posList');
+    node.appendChild(posList);
+    this.writePosList_(posList, geometry, objectStack);
+  } else if (node.nodeName === 'Curve') {
+    var segments = ol.xml.createElementNS(node.namespaceURI, 'segments');
+    node.appendChild(segments);
+    this.writeCurveSegments_(segments,
+        geometry, objectStack);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.MultiPolygon} geometry MultiPolygon geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeMultiSurfaceOrPolygon_ =
+    function(node, geometry, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  var surface = goog.object.get(context, 'surface');
+  if (goog.isDefAndNotNull(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  var polygons = geometry.getPolygons();
+  ol.xml.pushSerializeAndPop({node: node, srsName: srsName, surface: surface},
+      ol.format.GML3.SURFACEORPOLYGONMEMBER_SERIALIZERS_,
+      this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, polygons,
+      objectStack, undefined, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.MultiPoint} geometry MultiPoint geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeMultiPoint_ = function(node, geometry,
+    objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  if (goog.isDefAndNotNull(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  var points = geometry.getPoints();
+  ol.xml.pushSerializeAndPop({node: node, srsName: srsName},
+      ol.format.GML3.POINTMEMBER_SERIALIZERS_,
+      ol.xml.makeSimpleNodeFactory('pointMember'), points,
+      objectStack, undefined, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.MultiLineString} geometry MultiLineString geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeMultiCurveOrLineString_ =
+    function(node, geometry, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var srsName = goog.object.get(context, 'srsName');
+  var curve = goog.object.get(context, 'curve');
+  if (goog.isDefAndNotNull(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  var lines = geometry.getLineStrings();
+  ol.xml.pushSerializeAndPop({node: node, srsName: srsName, curve: curve},
+      ol.format.GML3.LINESTRINGORCURVEMEMBER_SERIALIZERS_,
+      this.MULTIGEOMETRY_MEMBER_NODE_FACTORY_, lines,
+      objectStack, undefined, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.LinearRing} ring LinearRing geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeRing_ = function(node, ring, objectStack) {
+  var linearRing = ol.xml.createElementNS(node.namespaceURI, 'LinearRing');
+  node.appendChild(linearRing);
+  this.writeLinearRing_(linearRing, ring, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Polygon} polygon Polygon geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeSurfaceOrPolygonMember_ =
+    function(node, polygon, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var child = this.GEOMETRY_NODE_FACTORY_(
+      polygon, objectStack);
+  if (goog.isDef(child)) {
+    node.appendChild(child);
+    this.writeSurfaceOrPolygon_(child, polygon, objectStack);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Point} point Point geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writePointMember_ =
+    function(node, point, objectStack) {
+  var child = ol.xml.createElementNS(node.namespaceURI, 'Point');
+  node.appendChild(child);
+  this.writePoint_(child, point, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.LineString} line LineString geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeLineStringOrCurveMember_ =
+    function(node, line, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var child = this.GEOMETRY_NODE_FACTORY_(line, objectStack);
+  if (goog.isDef(child)) {
+    node.appendChild(child);
+    this.writeCurveOrLineString_(child, line, objectStack);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Polygon} polygon Polygon geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeSurfacePatches_ =
+    function(node, polygon, objectStack) {
+  var child = ol.xml.createElementNS(node.namespaceURI, 'PolygonPatch');
+  node.appendChild(child);
+  this.writeSurfaceOrPolygon_(child, polygon, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.LineString} line LineString geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeCurveSegments_ =
+    function(node, line, objectStack) {
+  var child = ol.xml.createElementNS(node.namespaceURI,
+      'LineStringSegment');
+  node.appendChild(child);
+  this.writeCurveOrLineString_(child, line, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Geometry|ol.Extent} geometry Geometry.
+ * @param {Array.<*>} objectStack Node stack.
+ */
+ol.format.GML3.prototype.writeGeometryElement =
+    function(node, geometry, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var item = goog.object.clone(context);
+  item.node = node;
+  var value;
+  if (goog.isArray(geometry)) {
+    if (goog.isDef(context.dataProjection)) {
+      value = ol.proj.transformExtent(
+          geometry, context.featureProjection, context.dataProjection);
+    } else {
+      value = geometry;
+    }
+  } else {
+    goog.asserts.assertInstanceof(geometry, ol.geom.Geometry);
+    value =
+        ol.format.Feature.transformWithOptions(geometry, true, context);
+  }
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
+      (item), ol.format.GML3.GEOMETRY_SERIALIZERS_,
+      this.GEOMETRY_NODE_FACTORY_, [value],
+      objectStack, undefined, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Feature} feature Feature.
+ * @param {Array.<*>} objectStack Node stack.
+ */
+ol.format.GML3.prototype.writeFeatureElement =
+    function(node, feature, objectStack) {
+  var fid = feature.getId();
+  if (goog.isDef(fid)) {
+    node.setAttribute('fid', fid);
+  }
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var featureNS = goog.object.get(context, 'featureNS');
+  var geometryName = feature.getGeometryName();
+  if (!goog.isDef(context.serializers)) {
+    context.serializers = {};
+    context.serializers[featureNS] = {};
+  }
+  var properties = feature.getProperties();
+  var keys = [], values = [];
+  for (var key in properties) {
+    var value = properties[key];
+    if (!goog.isNull(value)) {
+      keys.push(key);
+      values.push(value);
+      if (key == geometryName) {
+        if (!(key in context.serializers[featureNS])) {
+          context.serializers[featureNS][key] = ol.xml.makeChildAppender(
+              this.writeGeometryElement, this);
+        }
+      } else {
+        if (!(key in context.serializers[featureNS])) {
+          context.serializers[featureNS][key] = ol.xml.makeChildAppender(
+              ol.format.XSD.writeStringTextNode);
+        }
+      }
+    }
+  }
+  var item = goog.object.clone(context);
+  item.node = node;
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
+      (item), context.serializers,
+      ol.xml.makeSimpleNodeFactory(undefined, featureNS),
+      values,
+      objectStack, keys);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GML3.prototype.writeFeatureMembers_ =
+    function(node, features, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var featureType = goog.object.get(context, 'featureType');
+  var featureNS = goog.object.get(context, 'featureNS');
+  var serializers = {};
+  serializers[featureNS] = {};
+  serializers[featureNS][featureType] = ol.xml.makeChildAppender(
+      this.writeFeatureElement, this);
+  var item = goog.object.clone(context);
+  item.node = node;
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
+      (item),
+      serializers,
+      ol.xml.makeSimpleNodeFactory(featureType, featureNS), features,
+      objectStack);
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GML3.SURFACEORPOLYGONMEMBER_SERIALIZERS_ = {
+  'http://www.opengis.net/gml': {
+    'surfaceMember': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeSurfaceOrPolygonMember_),
+    'polygonMember': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeSurfaceOrPolygonMember_)
+  }
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GML3.POINTMEMBER_SERIALIZERS_ = {
+  'http://www.opengis.net/gml': {
+    'pointMember': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writePointMember_)
+  }
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GML3.LINESTRINGORCURVEMEMBER_SERIALIZERS_ = {
+  'http://www.opengis.net/gml': {
+    'lineStringMember': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeLineStringOrCurveMember_),
+    'curveMember': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeLineStringOrCurveMember_)
+  }
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GML3.RING_SERIALIZERS_ = {
+  'http://www.opengis.net/gml': {
+    'exterior': ol.xml.makeChildAppender(ol.format.GML3.prototype.writeRing_),
+    'interior': ol.xml.makeChildAppender(ol.format.GML3.prototype.writeRing_)
+  }
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GML3.GEOMETRY_SERIALIZERS_ = {
+  'http://www.opengis.net/gml': {
+    'Curve': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeCurveOrLineString_),
+    'MultiCurve': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeMultiCurveOrLineString_),
+    'Point': ol.xml.makeChildAppender(ol.format.GML3.prototype.writePoint_),
+    'MultiPoint': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeMultiPoint_),
+    'LineString': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeCurveOrLineString_),
+    'MultiLineString': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeMultiCurveOrLineString_),
+    'LinearRing': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeLinearRing_),
+    'Polygon': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeSurfaceOrPolygon_),
+    'MultiPolygon': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeMultiSurfaceOrPolygon_),
+    'Surface': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeSurfaceOrPolygon_),
+    'MultiSurface': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeMultiSurfaceOrPolygon_),
+    'Envelope': ol.xml.makeChildAppender(
+        ol.format.GML3.prototype.writeEnvelope)
+  }
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, string>}
+ * @private
+ */
+ol.format.GML3.MULTIGEOMETRY_TO_MEMBER_NODENAME_ = {
+  'MultiLineString': 'lineStringMember',
+  'MultiCurve': 'curveMember',
+  'MultiPolygon': 'polygonMember',
+  'MultiSurface': 'surfaceMember'
+};
+
+
+/**
+ * @const
+ * @param {*} value Value.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {string=} opt_nodeName Node name.
+ * @return {Node|undefined} Node.
+ * @private
+ */
+ol.format.GML3.prototype.MULTIGEOMETRY_MEMBER_NODE_FACTORY_ =
+    function(value, objectStack, opt_nodeName) {
+  var parentNode = objectStack[objectStack.length - 1].node;
+  goog.asserts.assert(ol.xml.isNode(parentNode));
+  return ol.xml.createElementNS('http://www.opengis.net/gml',
+      ol.format.GML3.MULTIGEOMETRY_TO_MEMBER_NODENAME_[parentNode.nodeName]);
+};
+
+
+/**
+ * @const
+ * @param {*} value Value.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {string=} opt_nodeName Node name.
+ * @return {Node|undefined} Node.
+ * @private
+ */
+ol.format.GML3.prototype.GEOMETRY_NODE_FACTORY_ =
+    function(value, objectStack, opt_nodeName) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var multiSurface = goog.object.get(context, 'multiSurface');
+  var surface = goog.object.get(context, 'surface');
+  var curve = goog.object.get(context, 'curve');
+  var multiCurve = goog.object.get(context, 'multiCurve');
+  var parentNode = objectStack[objectStack.length - 1].node;
+  goog.asserts.assert(ol.xml.isNode(parentNode));
+  var nodeName;
+  if (!goog.isArray(value)) {
+    goog.asserts.assertInstanceof(value, ol.geom.Geometry);
+    nodeName = value.getType();
+    if (nodeName === 'MultiPolygon' && multiSurface === true) {
+      nodeName = 'MultiSurface';
+    } else if (nodeName === 'Polygon' && surface === true) {
+      nodeName = 'Surface';
+    } else if (nodeName === 'LineString' && curve === true) {
+      nodeName = 'Curve';
+    } else if (nodeName === 'MultiLineString' && multiCurve === true) {
+      nodeName = 'MultiCurve';
+    }
+  } else {
+    nodeName = 'Envelope';
+  }
+  return ol.xml.createElementNS('http://www.opengis.net/gml',
+      nodeName);
+};
+
+
+/**
+ * Encode a geometry in GML 3.1.1 Simple Features.
+ *
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {Node} Node.
+ * @api
+ */
+ol.format.GML3.prototype.writeGeometryNode = function(geometry, opt_options) {
+  opt_options = this.adaptOptions(opt_options);
+  var geom = ol.xml.createElementNS('http://www.opengis.net/gml', 'geom');
+  var context = {node: geom, srsName: this.srsName,
+    curve: this.curve_, surface: this.surface_,
+    multiSurface: this.multiSurface_, multiCurve: this.multiCurve_};
+  if (goog.isDef(opt_options)) {
+    goog.object.extend(context, opt_options);
+  }
+  this.writeGeometryElement(geom, geometry, [context]);
+  return geom;
+};
+
+
+/**
+ * Encode an array of features in GML 3.1.1 Simple Features.
+ *
+ * @function
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {string} Result.
+ * @api stable
+ */
+ol.format.GML3.prototype.writeFeatures;
+
+
+/**
+ * Encode an array of features in the GML 3.1.1 format as an XML node.
+ *
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {Node} Node.
+ * @api
+ */
+ol.format.GML3.prototype.writeFeaturesNode = function(features, opt_options) {
+  opt_options = this.adaptOptions(opt_options);
+  var node = ol.xml.createElementNS('http://www.opengis.net/gml',
+      'featureMembers');
+  ol.xml.setAttributeNS(node, 'http://www.w3.org/2001/XMLSchema-instance',
+      'xsi:schemaLocation', this.schemaLocation);
+  var context = {
+    srsName: this.srsName,
+    curve: this.curve_,
+    surface: this.surface_,
+    multiSurface: this.multiSurface_,
+    multiCurve: this.multiCurve_,
+    featureNS: this.featureNS,
+    featureType: this.featureType
+  };
+  if (goog.isDef(opt_options)) {
+    goog.object.extend(context, opt_options);
+  }
+  this.writeFeatureMembers_(node, features, [context]);
+  return node;
+};
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the GML format
+ * version 3.1.1.
+ * Currently only supports GML 3.1.1 Simple Features profile.
+ *
+ * @constructor
+ * @param {olx.format.GMLOptions=} opt_options
+ *     Optional configuration object.
+ * @extends {ol.format.GMLBase}
+ * @api stable
+ */
+ol.format.GML = ol.format.GML3;
+
+
+/**
+ * Encode an array of features in GML 3.1.1 Simple Features.
+ *
+ * @function
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {string} Result.
+ * @api stable
+ */
+ol.format.GML.prototype.writeFeatures;
+
+
+/**
+ * Encode an array of features in the GML 3.1.1 format as an XML node.
+ *
+ * @function
+ * @param {ol.Feature} feature Feature.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {Node} Node.
+ * @api
+ */
+ol.format.GML.prototype.writeFeaturesNode;
diff --git a/src/ol/format/gml/gmlbaseformat.js b/src/ol/format/gml/gmlbaseformat.js
new file mode 100644
index 0000000..415fe1c
--- /dev/null
+++ b/src/ol/format/gml/gmlbaseformat.js
@@ -0,0 +1,563 @@
+// FIXME Envelopes should not be treated as geometries! readEnvelope_ is part
+// of GEOMETRY_PARSERS_ and methods using GEOMETRY_PARSERS_ do not expect
+// envelopes/extents, only geometries!
+goog.provide('ol.format.GMLBase');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('ol.Feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.XMLFeature');
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.LinearRing');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.proj');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Feature base format for reading and writing data in the GML format.
+ * This class cannot be instantiate, it contains only base content that
+ * is shared with versioned format classes ol.format.GML2 and
+ * ol.format.GML3.
+ *
+ * @constructor
+ * @param {olx.format.GMLOptions=} opt_options
+ *     Optional configuration object.
+ * @extends {ol.format.XMLFeature}
+ * @api
+ */
+ol.format.GMLBase = function(opt_options) {
+  var options = /** @type {olx.format.GMLOptions} */
+      (goog.isDef(opt_options) ? opt_options : {});
+
+  /**
+   * @protected
+   * @type {string}
+   */
+  this.featureType = options.featureType;
+
+  /**
+   * @protected
+   * @type {string}
+   */
+  this.featureNS = options.featureNS;
+
+  /**
+   * @protected
+   * @type {string}
+   */
+  this.srsName = options.srsName;
+
+  /**
+   * @protected
+   * @type {string}
+   */
+  this.schemaLocation = '';
+
+  goog.base(this);
+};
+goog.inherits(ol.format.GMLBase, ol.format.XMLFeature);
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Array.<ol.Feature>} Features.
+ * @private
+ */
+ol.format.GMLBase.prototype.readFeatures_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  var localName = ol.xml.getLocalName(node);
+  var features;
+  if (localName == 'FeatureCollection') {
+    features = ol.xml.pushParseAndPop(null,
+        this.FEATURE_COLLECTION_PARSERS, node,
+        objectStack, this);
+  } else if (localName == 'featureMembers' || localName == 'featureMember') {
+    var context = objectStack[0];
+    goog.asserts.assert(goog.isObject(context));
+    var featureType = goog.object.get(context, 'featureType');
+    if (!goog.isDef(featureType) && !goog.isNull(node.firstElementChild)) {
+      var member = node.firstElementChild;
+      featureType = member.nodeName.split(':').pop();
+      goog.object.set(context, 'featureType', featureType);
+      goog.object.set(context, 'featureNS', member.namespaceURI);
+    }
+    var parsers = {};
+    var parsersNS = {};
+    parsers[featureType] = (localName == 'featureMembers') ?
+        ol.xml.makeArrayPusher(this.readFeatureElement, this) :
+        ol.xml.makeReplacer(this.readFeatureElement, this);
+    parsersNS[goog.object.get(context, 'featureNS')] = parsers;
+    features = ol.xml.pushParseAndPop([], parsersNS, node, objectStack);
+  }
+  if (!goog.isDef(features)) {
+    features = [];
+  }
+  return features;
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, Object>>}
+ */
+ol.format.GMLBase.prototype.FEATURE_COLLECTION_PARSERS = Object({
+  'http://www.opengis.net/gml': {
+    'featureMember': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.readFeatures_),
+    'featureMembers': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readFeatures_)
+  }
+});
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.geom.Geometry|undefined} Geometry.
+ */
+ol.format.GMLBase.prototype.readGeometryElement = function(node, objectStack) {
+  var context = objectStack[0];
+  goog.asserts.assert(goog.isObject(context));
+  goog.object.set(context, 'srsName',
+      node.firstElementChild.getAttribute('srsName'));
+  var geometry = ol.xml.pushParseAndPop(/** @type {ol.geom.Geometry} */(null),
+      this.GEOMETRY_PARSERS_, node, objectStack, this);
+  if (goog.isDefAndNotNull(geometry)) {
+    return /** @type {ol.geom.Geometry} */ (
+        ol.format.Feature.transformWithOptions(geometry, false, context));
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.Feature} Feature.
+ */
+ol.format.GMLBase.prototype.readFeatureElement = function(node, objectStack) {
+  var n;
+  var fid = node.getAttribute('fid') ||
+      ol.xml.getAttributeNS(node, 'http://www.opengis.net/gml', 'id');
+  var values = {}, geometryName;
+  for (n = node.firstElementChild; !goog.isNull(n);
+      n = n.nextElementSibling) {
+    var localName = ol.xml.getLocalName(n);
+    // Assume attribute elements have one child node and that the child
+    // is a text node.  Otherwise assume it is a geometry node.
+    if (n.childNodes.length === 0 ||
+        (n.childNodes.length === 1 &&
+        n.firstChild.nodeType === 3)) {
+      var value = ol.xml.getAllTextContent(n, false);
+      if (goog.string.isEmpty(value)) {
+        value = undefined;
+      }
+      values[localName] = value;
+    } else {
+      // boundedBy is an extent and must not be considered as a geometry
+      if (localName !== 'boundedBy') {
+        geometryName = localName;
+      }
+      values[localName] = this.readGeometryElement(n, objectStack);
+    }
+  }
+  var feature = new ol.Feature(values);
+  if (goog.isDef(geometryName)) {
+    feature.setGeometryName(geometryName);
+  }
+  if (fid) {
+    feature.setId(fid);
+  }
+  return feature;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.geom.Point|undefined} Point.
+ */
+ol.format.GMLBase.prototype.readPoint = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Point');
+  var flatCoordinates =
+      this.readFlatCoordinatesFromNode_(node, objectStack);
+  if (goog.isDefAndNotNull(flatCoordinates)) {
+    var point = new ol.geom.Point(null);
+    goog.asserts.assert(flatCoordinates.length == 3);
+    point.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates);
+    return point;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.geom.MultiPoint|undefined} MultiPoint.
+ */
+ol.format.GMLBase.prototype.readMultiPoint = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'MultiPoint');
+  var coordinates = ol.xml.pushParseAndPop(
+      /** @type {Array.<Array.<number>>} */ ([]),
+      this.MULTIPOINT_PARSERS_, node, objectStack, this);
+  if (goog.isDef(coordinates)) {
+    return new ol.geom.MultiPoint(coordinates);
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.geom.MultiLineString|undefined} MultiLineString.
+ */
+ol.format.GMLBase.prototype.readMultiLineString = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'MultiLineString');
+  var lineStrings = ol.xml.pushParseAndPop(
+      /** @type {Array.<ol.geom.LineString>} */ ([]),
+      this.MULTILINESTRING_PARSERS_, node, objectStack, this);
+  if (goog.isDef(lineStrings)) {
+    var multiLineString = new ol.geom.MultiLineString(null);
+    multiLineString.setLineStrings(lineStrings);
+    return multiLineString;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.geom.MultiPolygon|undefined} MultiPolygon.
+ */
+ol.format.GMLBase.prototype.readMultiPolygon = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'MultiPolygon');
+  var polygons = ol.xml.pushParseAndPop(
+      /** @type {Array.<ol.geom.Polygon>} */ ([]),
+      this.MULTIPOLYGON_PARSERS_, node, objectStack, this);
+  if (goog.isDef(polygons)) {
+    var multiPolygon = new ol.geom.MultiPolygon(null);
+    multiPolygon.setPolygons(polygons);
+    return multiPolygon;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GMLBase.prototype.pointMemberParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'pointMember' ||
+      node.localName == 'pointMembers');
+  ol.xml.parseNode(this.POINTMEMBER_PARSERS_,
+      node, objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GMLBase.prototype.lineStringMemberParser_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'lineStringMember' ||
+      node.localName == 'lineStringMembers');
+  ol.xml.parseNode(this.LINESTRINGMEMBER_PARSERS_,
+      node, objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GMLBase.prototype.polygonMemberParser_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'polygonMember' ||
+      node.localName == 'polygonMembers');
+  ol.xml.parseNode(this.POLYGONMEMBER_PARSERS_, node,
+      objectStack, this);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.geom.LineString|undefined} LineString.
+ */
+ol.format.GMLBase.prototype.readLineString = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LineString');
+  var flatCoordinates =
+      this.readFlatCoordinatesFromNode_(node, objectStack);
+  if (goog.isDefAndNotNull(flatCoordinates)) {
+    var lineString = new ol.geom.LineString(null);
+    lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates);
+    return lineString;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>|undefined} LinearRing flat coordinates.
+ */
+ol.format.GMLBase.prototype.readFlatLinearRing_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LinearRing');
+  var ring = ol.xml.pushParseAndPop(/** @type {Array.<number>} */(null),
+      this.GEOMETRY_FLAT_COORDINATES_PARSERS_, node,
+      objectStack, this);
+  if (goog.isDefAndNotNull(ring)) {
+    return ring;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.geom.LinearRing|undefined} LinearRing.
+ */
+ol.format.GMLBase.prototype.readLinearRing = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LinearRing');
+  var flatCoordinates =
+      this.readFlatCoordinatesFromNode_(node, objectStack);
+  if (goog.isDef(flatCoordinates)) {
+    var ring = new ol.geom.LinearRing(null);
+    ring.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates);
+    return ring;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.geom.Polygon|undefined} Polygon.
+ */
+ol.format.GMLBase.prototype.readPolygon = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Polygon');
+  var flatLinearRings = ol.xml.pushParseAndPop(
+      /** @type {Array.<Array.<number>>} */ ([null]),
+      this.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack, this);
+  if (goog.isDef(flatLinearRings) &&
+      !goog.isNull(flatLinearRings[0])) {
+    var polygon = new ol.geom.Polygon(null);
+    var flatCoordinates = flatLinearRings[0];
+    var ends = [flatCoordinates.length];
+    var i, ii;
+    for (i = 1, ii = flatLinearRings.length; i < ii; ++i) {
+      goog.array.extend(flatCoordinates, flatLinearRings[i]);
+      ends.push(flatCoordinates.length);
+    }
+    polygon.setFlatCoordinates(
+        ol.geom.GeometryLayout.XYZ, flatCoordinates, ends);
+    return polygon;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>} Flat coordinates.
+ */
+ol.format.GMLBase.prototype.readFlatCoordinatesFromNode_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  return /** @type {Array.<number>} */ (ol.xml.pushParseAndPop(
+      null,
+      this.GEOMETRY_FLAT_COORDINATES_PARSERS_, node,
+      objectStack, this));
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GMLBase.prototype.MULTIPOINT_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'pointMember': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.pointMemberParser_),
+    'pointMembers': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.pointMemberParser_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GMLBase.prototype.MULTILINESTRING_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'lineStringMember': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.lineStringMemberParser_),
+    'lineStringMembers': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.lineStringMemberParser_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GMLBase.prototype.MULTIPOLYGON_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'polygonMember': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.polygonMemberParser_),
+    'polygonMembers': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.polygonMemberParser_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GMLBase.prototype.POINTMEMBER_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'Point': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.readFlatCoordinatesFromNode_)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GMLBase.prototype.LINESTRINGMEMBER_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'LineString': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.readLineString)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GMLBase.prototype.POLYGONMEMBER_PARSERS_ = Object({
+  'http://www.opengis.net/gml' : {
+    'Polygon': ol.xml.makeArrayPusher(
+        ol.format.GMLBase.prototype.readPolygon)
+  }
+});
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @protected
+ */
+ol.format.GMLBase.prototype.RING_PARSERS = Object({
+  'http://www.opengis.net/gml' : {
+    'LinearRing': ol.xml.makeReplacer(
+        ol.format.GMLBase.prototype.readFlatLinearRing_)
+  }
+});
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GMLBase.prototype.readGeometryFromNode =
+    function(node, opt_options) {
+  var geometry = this.readGeometryElement(node,
+      [this.getReadOptions(node, goog.isDef(opt_options) ? opt_options : {})]);
+  return goog.isDef(geometry) ? geometry : null;
+};
+
+
+/**
+ * Read all features from a GML FeatureCollection.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.GMLBase.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GMLBase.prototype.readFeaturesFromNode =
+    function(node, opt_options) {
+  var options = {
+    featureType: this.featureType,
+    featureNS: this.featureNS
+  };
+  if (goog.isDef(opt_options)) {
+    goog.object.extend(options, this.getReadOptions(node, opt_options));
+  }
+  return this.readFeatures_(node, [options]);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GMLBase.prototype.readProjectionFromNode = function(node) {
+  return ol.proj.get(goog.isDef(this.srsName_) ? this.srsName_ :
+      node.firstElementChild.getAttribute('srsName'));
+};
diff --git a/src/ol/format/gpxformat.js b/src/ol/format/gpxformat.js
new file mode 100644
index 0000000..e37220b
--- /dev/null
+++ b/src/ol/format/gpxformat.js
@@ -0,0 +1,895 @@
+goog.provide('ol.format.GPX');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('ol.Feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.XMLFeature');
+goog.require('ol.format.XSD');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.Point');
+goog.require('ol.proj');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the GPX format.
+ *
+ * @constructor
+ * @extends {ol.format.XMLFeature}
+ * @param {olx.format.GPXOptions=} opt_options Options.
+ * @api stable
+ */
+ol.format.GPX = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this);
+
+  /**
+   * @inheritDoc
+   */
+  this.defaultDataProjection = ol.proj.get('EPSG:4326');
+
+  /**
+   * @type {function(ol.Feature, Node)|undefined}
+   * @private
+   */
+  this.readExtensions_ = options.readExtensions;
+};
+goog.inherits(ol.format.GPX, ol.format.XMLFeature);
+
+
+/**
+ * @const
+ * @private
+ * @type {Array.<string>}
+ */
+ol.format.GPX.NAMESPACE_URIS_ = [
+  null,
+  'http://www.topografix.com/GPX/1/0',
+  'http://www.topografix.com/GPX/1/1'
+];
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {Node} node Node.
+ * @param {Object} values Values.
+ * @private
+ * @return {Array.<number>} Flat coordinates.
+ */
+ol.format.GPX.appendCoordinate_ = function(flatCoordinates, node, values) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  flatCoordinates.push(
+      parseFloat(node.getAttribute('lon')),
+      parseFloat(node.getAttribute('lat')));
+  if (goog.object.containsKey(values, 'ele')) {
+    flatCoordinates.push(
+        /** @type {number} */ (goog.object.get(values, 'ele')));
+    goog.object.remove(values, 'ele');
+  } else {
+    flatCoordinates.push(0);
+  }
+  if (goog.object.containsKey(values, 'time')) {
+    flatCoordinates.push(
+        /** @type {number} */ (goog.object.get(values, 'time')));
+    goog.object.remove(values, 'time');
+  } else {
+    flatCoordinates.push(0);
+  }
+  return flatCoordinates;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.parseLink_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'link');
+  var values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+  var href = node.getAttribute('href');
+  if (!goog.isNull(href)) {
+    goog.object.set(values, 'link', href);
+  }
+  ol.xml.parseNode(ol.format.GPX.LINK_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.parseExtensions_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'extensions');
+  var values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+  goog.object.set(values, 'extensionsNode_', node);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.parseRtePt_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'rtept');
+  var values = ol.xml.pushParseAndPop(
+      {}, ol.format.GPX.RTEPT_PARSERS_, node, objectStack);
+  if (goog.isDef(values)) {
+    var rteValues = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+    var flatCoordinates = /** @type {Array.<number>} */
+        (goog.object.get(rteValues, 'flatCoordinates'));
+    ol.format.GPX.appendCoordinate_(flatCoordinates, node, values);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.parseTrkPt_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'trkpt');
+  var values = ol.xml.pushParseAndPop(
+      {}, ol.format.GPX.TRKPT_PARSERS_, node, objectStack);
+  if (goog.isDef(values)) {
+    var trkValues = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+    var flatCoordinates = /** @type {Array.<number>} */
+        (goog.object.get(trkValues, 'flatCoordinates'));
+    ol.format.GPX.appendCoordinate_(flatCoordinates, node, values);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.parseTrkSeg_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'trkseg');
+  var values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+  ol.xml.parseNode(ol.format.GPX.TRKSEG_PARSERS_, node, objectStack);
+  var flatCoordinates = /** @type {Array.<number>} */
+      (goog.object.get(values, 'flatCoordinates'));
+  var ends = /** @type {Array.<number>} */ (goog.object.get(values, 'ends'));
+  ends.push(flatCoordinates.length);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.Feature|undefined} Track.
+ */
+ol.format.GPX.readRte_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'rte');
+  var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
+  var values = ol.xml.pushParseAndPop({
+    'flatCoordinates': []
+  }, ol.format.GPX.RTE_PARSERS_, node, objectStack);
+  if (!goog.isDef(values)) {
+    return undefined;
+  }
+  var flatCoordinates = /** @type {Array.<number>} */
+      (goog.object.get(values, 'flatCoordinates'));
+  goog.object.remove(values, 'flatCoordinates');
+  var geometry = new ol.geom.LineString(null);
+  geometry.setFlatCoordinates(ol.geom.GeometryLayout.XYZM, flatCoordinates);
+  ol.format.Feature.transformWithOptions(geometry, false, options);
+  var feature = new ol.Feature(geometry);
+  feature.setProperties(values);
+  return feature;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.Feature|undefined} Track.
+ */
+ol.format.GPX.readTrk_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'trk');
+  var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
+  var values = ol.xml.pushParseAndPop({
+    'flatCoordinates': [],
+    'ends': []
+  }, ol.format.GPX.TRK_PARSERS_, node, objectStack);
+  if (!goog.isDef(values)) {
+    return undefined;
+  }
+  var flatCoordinates = /** @type {Array.<number>} */
+      (goog.object.get(values, 'flatCoordinates'));
+  goog.object.remove(values, 'flatCoordinates');
+  var ends = /** @type {Array.<number>} */ (goog.object.get(values, 'ends'));
+  goog.object.remove(values, 'ends');
+  var geometry = new ol.geom.MultiLineString(null);
+  geometry.setFlatCoordinates(
+      ol.geom.GeometryLayout.XYZM, flatCoordinates, ends);
+  ol.format.Feature.transformWithOptions(geometry, false, options);
+  var feature = new ol.Feature(geometry);
+  feature.setProperties(values);
+  return feature;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.Feature|undefined} Waypoint.
+ */
+ol.format.GPX.readWpt_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'wpt');
+  var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
+  var values = ol.xml.pushParseAndPop(
+      {}, ol.format.GPX.WPT_PARSERS_, node, objectStack);
+  if (!goog.isDef(values)) {
+    return undefined;
+  }
+  var coordinates = ol.format.GPX.appendCoordinate_([], node, values);
+  var geometry = new ol.geom.Point(
+      coordinates, ol.geom.GeometryLayout.XYZM);
+  ol.format.Feature.transformWithOptions(geometry, false, options);
+  var feature = new ol.Feature(geometry);
+  feature.setProperties(values);
+  return feature;
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, function(Node, Array.<*>): (ol.Feature|undefined)>}
+ * @private
+ */
+ol.format.GPX.FEATURE_READER_ = {
+  'rte': ol.format.GPX.readRte_,
+  'trk': ol.format.GPX.readTrk_,
+  'wpt': ol.format.GPX.readWpt_
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GPX.GPX_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'rte': ol.xml.makeArrayPusher(ol.format.GPX.readRte_),
+      'trk': ol.xml.makeArrayPusher(ol.format.GPX.readTrk_),
+      'wpt': ol.xml.makeArrayPusher(ol.format.GPX.readWpt_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GPX.LINK_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'text':
+          ol.xml.makeObjectPropertySetter(ol.format.XSD.readString, 'linkText'),
+      'type':
+          ol.xml.makeObjectPropertySetter(ol.format.XSD.readString, 'linkType')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GPX.RTE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'cmt': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'desc': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'src': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'link': ol.format.GPX.parseLink_,
+      'number':
+          ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger),
+      'extensions': ol.format.GPX.parseExtensions_,
+      'type': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'rtept': ol.format.GPX.parseRtePt_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GPX.RTEPT_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GPX.TRK_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'cmt': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'desc': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'src': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'link': ol.format.GPX.parseLink_,
+      'number':
+          ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger),
+      'type': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'extensions': ol.format.GPX.parseExtensions_,
+      'trkseg': ol.format.GPX.parseTrkSeg_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GPX.TRKSEG_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'trkpt': ol.format.GPX.parseTrkPt_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GPX.TRKPT_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.GPX.WPT_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'ele': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'time': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDateTime),
+      'magvar': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'geoidheight': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'cmt': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'desc': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'src': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'link': ol.format.GPX.parseLink_,
+      'sym': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'type': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'fix': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'sat': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readNonNegativeInteger),
+      'hdop': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'vdop': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'pdop': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'ageofdgpsdata':
+          ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'dgpsid':
+          ol.xml.makeObjectPropertySetter(ol.format.XSD.readNonNegativeInteger),
+      'extensions': ol.format.GPX.parseExtensions_
+    });
+
+
+/**
+ * @param {Array.<ol.Feature>} features
+ * @private
+ */
+ol.format.GPX.prototype.handleReadExtensions_ = function(features) {
+  if (goog.isNull(features)) {
+    features = [];
+  }
+  for (var i = 0, ii = features.length; i < ii; ++i) {
+    var feature = features[i];
+    if (goog.isDef(this.readExtensions_)) {
+      var extensionsNode = feature.get('extensionsNode_') || null;
+      this.readExtensions_(feature, extensionsNode);
+    }
+    feature.set('extensionsNode_', undefined);
+  }
+};
+
+
+/**
+ * Read the first feature from a GPX source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.Feature} Feature.
+ * @api stable
+ */
+ol.format.GPX.prototype.readFeature;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GPX.prototype.readFeatureFromNode = function(node, opt_options) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  if (!goog.array.contains(ol.format.GPX.NAMESPACE_URIS_, node.namespaceURI)) {
+    return null;
+  }
+  var featureReader = ol.format.GPX.FEATURE_READER_[node.localName];
+  if (!goog.isDef(featureReader)) {
+    return null;
+  }
+  var feature = featureReader(node, [this.getReadOptions(node, opt_options)]);
+  if (!goog.isDef(feature)) {
+    return null;
+  }
+  this.handleReadExtensions_([feature]);
+  return feature;
+};
+
+
+/**
+ * Read all features from a GPX source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.GPX.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GPX.prototype.readFeaturesFromNode = function(node, opt_options) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  if (!goog.array.contains(ol.format.GPX.NAMESPACE_URIS_, node.namespaceURI)) {
+    return [];
+  }
+  if (node.localName == 'gpx') {
+    var features = ol.xml.pushParseAndPop(
+        /** @type {Array.<ol.Feature>} */ ([]), ol.format.GPX.GPX_PARSERS_,
+        node, [this.getReadOptions(node, opt_options)]);
+    if (goog.isDef(features)) {
+      this.handleReadExtensions_(features);
+      return features;
+    } else {
+      return [];
+    }
+  }
+  return [];
+};
+
+
+/**
+ * Read the projection from a GPX source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.proj.Projection} Projection.
+ * @api stable
+ */
+ol.format.GPX.prototype.readProjection;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GPX.prototype.readProjectionFromDocument = function(doc) {
+  return this.defaultDataProjection;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.GPX.prototype.readProjectionFromNode = function(node) {
+  return this.defaultDataProjection;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {string} value Value for the link's `href` attribute.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.GPX.writeLink_ = function(node, value, objectStack) {
+  node.setAttribute('href', value);
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var properties = goog.object.get(context, 'properties');
+  var link = [
+    goog.object.get(properties, 'linkText'),
+    goog.object.get(properties, 'linkType')
+  ];
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ ({node: node}),
+      ol.format.GPX.LINK_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY,
+      link, objectStack, ol.format.GPX.LINK_SEQUENCE_);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.writeWptType_ = function(node, coordinate, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var parentNode = context.node;
+  goog.asserts.assert(ol.xml.isNode(parentNode));
+  var namespaceURI = parentNode.namespaceURI;
+  var properties = goog.object.get(context, 'properties');
+  //FIXME Projection handling
+  ol.xml.setAttributeNS(node, null, 'lat', coordinate[1]);
+  ol.xml.setAttributeNS(node, null, 'lon', coordinate[0]);
+  var geometryLayout = goog.object.get(context, 'geometryLayout');
+  /* jshint -W086 */
+  switch (geometryLayout) {
+    case ol.geom.GeometryLayout.XYZM:
+      if (coordinate[3] !== 0) {
+        goog.object.set(properties, 'time', coordinate[3]);
+      }
+    case ol.geom.GeometryLayout.XYZ:
+      if (coordinate[2] !== 0) {
+        goog.object.set(properties, 'ele', coordinate[2]);
+      }
+      break;
+    case ol.geom.GeometryLayout.XYM:
+      if (coordinate[2] !== 0) {
+        goog.object.set(properties, 'time', coordinate[2]);
+      }
+  }
+  /* jshint +W086 */
+  var orderedKeys = ol.format.GPX.WPT_TYPE_SEQUENCE_[namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
+      ({node: node, 'properties': properties}),
+      ol.format.GPX.WPT_TYPE_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY,
+      values, objectStack, orderedKeys);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Feature} feature Feature.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.writeRte_ = function(node, feature, objectStack) {
+  var options = /** @type {olx.format.WriteOptions} */ (objectStack[0]);
+  var properties = feature.getProperties();
+  var context = {node: node, 'properties': properties};
+  var geometry = feature.getGeometry();
+  if (goog.isDef(geometry)) {
+    goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+    geometry = /** @type {ol.geom.LineString} */
+        (ol.format.Feature.transformWithOptions(geometry, true, options));
+    goog.object.set(context, 'geometryLayout', geometry.getLayout());
+    goog.object.set(properties, 'rtept', geometry.getCoordinates());
+  }
+  var parentNode = objectStack[objectStack.length - 1].node;
+  var orderedKeys = ol.format.GPX.RTE_SEQUENCE_[parentNode.namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ (context),
+      ol.format.GPX.RTE_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY,
+      values, objectStack, orderedKeys);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Feature} feature Feature.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.writeTrk_ = function(node, feature, objectStack) {
+  var options = /** @type {olx.format.WriteOptions} */ (objectStack[0]);
+  var properties = feature.getProperties();
+  var context = {node: node, 'properties': properties};
+  var geometry = feature.getGeometry();
+  if (goog.isDef(geometry)) {
+    goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString);
+    geometry = /** @type {ol.geom.MultiLineString} */
+        (ol.format.Feature.transformWithOptions(geometry, true, options));
+    goog.object.set(properties, 'trkseg', geometry.getLineStrings());
+  }
+  var parentNode = objectStack[objectStack.length - 1].node;
+  var orderedKeys = ol.format.GPX.TRK_SEQUENCE_[parentNode.namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ (context),
+      ol.format.GPX.TRK_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY,
+      values, objectStack, orderedKeys);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.LineString} lineString LineString.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.writeTrkSeg_ = function(node, lineString, objectStack) {
+  var context = {node: node, 'geometryLayout': lineString.getLayout(),
+    'properties': {}};
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */ (context),
+      ol.format.GPX.TRKSEG_SERIALIZERS_, ol.format.GPX.TRKSEG_NODE_FACTORY_,
+      lineString.getCoordinates(), objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Feature} feature Feature.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.GPX.writeWpt_ = function(node, feature, objectStack) {
+  var options = /** @type {olx.format.WriteOptions} */ (objectStack[0]);
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  goog.object.set(context, 'properties', feature.getProperties());
+  var geometry = feature.getGeometry();
+  if (goog.isDef(geometry)) {
+    goog.asserts.assertInstanceof(geometry, ol.geom.Point);
+    geometry = /** @type {ol.geom.Point} */
+        (ol.format.Feature.transformWithOptions(geometry, true, options));
+    goog.object.set(context, 'geometryLayout', geometry.getLayout());
+    ol.format.GPX.writeWptType_(node, geometry.getCoordinates(), objectStack);
+  }
+};
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ * @private
+ */
+ol.format.GPX.LINK_SEQUENCE_ = ['text', 'type'];
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GPX.LINK_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'text': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'type': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.GPX.RTE_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, [
+      'name', 'cmt', 'desc', 'src', 'link', 'number', 'type', 'rtept'
+    ]);
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GPX.RTE_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'name': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'cmt': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'desc': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'src': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'link': ol.xml.makeChildAppender(ol.format.GPX.writeLink_),
+      'number': ol.xml.makeChildAppender(
+          ol.format.XSD.writeNonNegativeIntegerTextNode),
+      'type': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'rtept': ol.xml.makeArraySerializer(ol.xml.makeChildAppender(
+          ol.format.GPX.writeWptType_))
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.GPX.TRK_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, [
+      'name', 'cmt', 'desc', 'src', 'link', 'number', 'type', 'trkseg'
+    ]);
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GPX.TRK_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'name': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'cmt': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'desc': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'src': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'link': ol.xml.makeChildAppender(ol.format.GPX.writeLink_),
+      'number': ol.xml.makeChildAppender(
+          ol.format.XSD.writeNonNegativeIntegerTextNode),
+      'type': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'trkseg': ol.xml.makeArraySerializer(ol.xml.makeChildAppender(
+          ol.format.GPX.writeTrkSeg_))
+    });
+
+
+/**
+ * @const
+ * @param {*} value Value.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {string=} opt_nodeName Node name.
+ * @return {Node|undefined} Node.
+ * @private
+ */
+ol.format.GPX.TRKSEG_NODE_FACTORY_ = ol.xml.makeSimpleNodeFactory('trkpt');
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GPX.TRKSEG_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'trkpt': ol.xml.makeChildAppender(ol.format.GPX.writeWptType_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.GPX.WPT_TYPE_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, [
+      'ele', 'time', 'magvar', 'geoidheight', 'name', 'cmt', 'desc', 'src',
+      'link', 'sym', 'type', 'fix', 'sat', 'hdop', 'vdop', 'pdop',
+      'ageofdgpsdata', 'dgpsid'
+    ]);
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GPX.WPT_TYPE_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'ele': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+      'time': ol.xml.makeChildAppender(ol.format.XSD.writeDateTimeTextNode),
+      'magvar': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+      'geoidheight': ol.xml.makeChildAppender(
+          ol.format.XSD.writeDecimalTextNode),
+      'name': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'cmt': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'desc': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'src': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'link': ol.xml.makeChildAppender(ol.format.GPX.writeLink_),
+      'sym': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'type': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'fix': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'sat': ol.xml.makeChildAppender(
+          ol.format.XSD.writeNonNegativeIntegerTextNode),
+      'hdop': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+      'vdop': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+      'pdop': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+      'ageofdgpsdata': ol.xml.makeChildAppender(
+          ol.format.XSD.writeDecimalTextNode),
+      'dgpsid': ol.xml.makeChildAppender(
+          ol.format.XSD.writeNonNegativeIntegerTextNode)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, string>}
+ * @private
+ */
+ol.format.GPX.GEOMETRY_TYPE_TO_NODENAME_ = {
+  'Point': 'wpt',
+  'LineString': 'rte',
+  'MultiLineString': 'trk'
+};
+
+
+/**
+ * @const
+ * @param {*} value Value.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {string=} opt_nodeName Node name.
+ * @return {Node|undefined} Node.
+ * @private
+ */
+ol.format.GPX.GPX_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) {
+  goog.asserts.assertInstanceof(value, ol.Feature);
+  var geometry = value.getGeometry();
+  if (goog.isDef(geometry)) {
+    var parentNode = objectStack[objectStack.length - 1].node;
+    goog.asserts.assert(ol.xml.isNode(parentNode));
+    return ol.xml.createElementNS(parentNode.namespaceURI,
+        ol.format.GPX.GEOMETRY_TYPE_TO_NODENAME_[geometry.getType()]);
+  }
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.GPX.GPX_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.GPX.NAMESPACE_URIS_, {
+      'rte': ol.xml.makeChildAppender(ol.format.GPX.writeRte_),
+      'trk': ol.xml.makeChildAppender(ol.format.GPX.writeTrk_),
+      'wpt': ol.xml.makeChildAppender(ol.format.GPX.writeWpt_)
+    });
+
+
+/**
+ * Encode an array of features in the GPX format.
+ *
+ * @function
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {string} Result.
+ * @api stable
+ */
+ol.format.GPX.prototype.writeFeatures;
+
+
+/**
+ * Encode an array of features in the GPX format as an XML node.
+ *
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {Node} Node.
+ * @api
+ */
+ol.format.GPX.prototype.writeFeaturesNode = function(features, opt_options) {
+  opt_options = this.adaptOptions(opt_options);
+  //FIXME Serialize metadata
+  var gpx = ol.xml.createElementNS('http://www.topografix.com/GPX/1/1', 'gpx');
+
+  ol.xml.pushSerializeAndPop(/** @type {ol.xml.NodeStackItem} */
+      ({node: gpx}), ol.format.GPX.GPX_SERIALIZERS_,
+      ol.format.GPX.GPX_NODE_FACTORY_, features, [opt_options]);
+  return gpx;
+};
diff --git a/src/ol/format/igcformat.js b/src/ol/format/igcformat.js
new file mode 100644
index 0000000..c6d9a98
--- /dev/null
+++ b/src/ol/format/igcformat.js
@@ -0,0 +1,228 @@
+goog.provide('ol.format.IGC');
+goog.provide('ol.format.IGCZ');
+
+goog.require('goog.asserts');
+goog.require('goog.string');
+goog.require('goog.string.newlines');
+goog.require('ol.Feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.TextFeature');
+goog.require('ol.geom.LineString');
+goog.require('ol.proj');
+
+
+/**
+ * IGC altitude/z. One of 'barometric', 'gps', 'none'.
+ * @enum {string}
+ * @api
+ */
+ol.format.IGCZ = {
+  BAROMETRIC: 'barometric',
+  GPS: 'gps',
+  NONE: 'none'
+};
+
+
+
+/**
+ * @classdesc
+ * Feature format for `*.igc` flight recording files.
+ *
+ * @constructor
+ * @extends {ol.format.TextFeature}
+ * @param {olx.format.IGCOptions=} opt_options Options.
+ * @api
+ */
+ol.format.IGC = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this);
+
+  /**
+   * @inheritDoc
+   */
+  this.defaultDataProjection = ol.proj.get('EPSG:4326');
+
+  /**
+   * @private
+   * @type {ol.format.IGCZ}
+   */
+  this.altitudeMode_ = goog.isDef(options.altitudeMode) ?
+      options.altitudeMode : ol.format.IGCZ.NONE;
+
+};
+goog.inherits(ol.format.IGC, ol.format.TextFeature);
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ * @private
+ */
+ol.format.IGC.EXTENSIONS_ = ['.igc'];
+
+
+/**
+ * @const
+ * @type {RegExp}
+ * @private
+ */
+ol.format.IGC.B_RECORD_RE_ =
+    /^B(\d{2})(\d{2})(\d{2})(\d{2})(\d{5})([NS])(\d{3})(\d{5})([EW])([AV])(\d{5})(\d{5})/;
+
+
+/**
+ * @const
+ * @type {RegExp}
+ * @private
+ */
+ol.format.IGC.H_RECORD_RE_ = /^H.([A-Z]{3}).*?:(.*)/;
+
+
+/**
+ * @const
+ * @type {RegExp}
+ * @private
+ */
+ol.format.IGC.HFDTE_RECORD_RE_ = /^HFDTE(\d{2})(\d{2})(\d{2})/;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.IGC.prototype.getExtensions = function() {
+  return ol.format.IGC.EXTENSIONS_;
+};
+
+
+/**
+ * Read the feature from the IGC source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.Feature} Feature.
+ * @api
+ */
+ol.format.IGC.prototype.readFeature;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.IGC.prototype.readFeatureFromText = function(text, opt_options) {
+  var altitudeMode = this.altitudeMode_;
+  var lines = goog.string.newlines.splitLines(text);
+  /** @type {Object.<string, string>} */
+  var properties = {};
+  var flatCoordinates = [];
+  var year = 2000;
+  var month = 0;
+  var day = 1;
+  var i, ii;
+  for (i = 0, ii = lines.length; i < ii; ++i) {
+    var line = lines[i];
+    var m;
+    if (line.charAt(0) == 'B') {
+      m = ol.format.IGC.B_RECORD_RE_.exec(line);
+      if (m) {
+        var hour = parseInt(m[1], 10);
+        var minute = parseInt(m[2], 10);
+        var second = parseInt(m[3], 10);
+        var y = parseInt(m[4], 10) + parseInt(m[5], 10) / 60000;
+        if (m[6] == 'S') {
+          y = -y;
+        }
+        var x = parseInt(m[7], 10) + parseInt(m[8], 10) / 60000;
+        if (m[9] == 'W') {
+          x = -x;
+        }
+        flatCoordinates.push(x, y);
+        if (altitudeMode != ol.format.IGCZ.NONE) {
+          var z;
+          if (altitudeMode == ol.format.IGCZ.GPS) {
+            z = parseInt(m[11], 10);
+          } else if (altitudeMode == ol.format.IGCZ.BAROMETRIC) {
+            z = parseInt(m[12], 10);
+          } else {
+            goog.asserts.fail();
+            z = 0;
+          }
+          flatCoordinates.push(z);
+        }
+        var dateTime = Date.UTC(year, month, day, hour, minute, second);
+        flatCoordinates.push(dateTime / 1000);
+      }
+    } else if (line.charAt(0) == 'H') {
+      m = ol.format.IGC.HFDTE_RECORD_RE_.exec(line);
+      if (m) {
+        day = parseInt(m[1], 10);
+        month = parseInt(m[2], 10) - 1;
+        year = 2000 + parseInt(m[3], 10);
+      } else {
+        m = ol.format.IGC.H_RECORD_RE_.exec(line);
+        if (m) {
+          properties[m[1]] = goog.string.trim(m[2]);
+          m = ol.format.IGC.HFDTE_RECORD_RE_.exec(line);
+        }
+      }
+    }
+  }
+  if (flatCoordinates.length === 0) {
+    return null;
+  }
+  var lineString = new ol.geom.LineString(null);
+  var layout = altitudeMode == ol.format.IGCZ.NONE ?
+      ol.geom.GeometryLayout.XYM : ol.geom.GeometryLayout.XYZM;
+  lineString.setFlatCoordinates(layout, flatCoordinates);
+  var feature = new ol.Feature(ol.format.Feature.transformWithOptions(
+      lineString, false, opt_options));
+  feature.setProperties(properties);
+  return feature;
+};
+
+
+/**
+ * Read the feature from the source. As IGC sources contain a single
+ * feature, this will return the feature in an array.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api
+ */
+ol.format.IGC.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.IGC.prototype.readFeaturesFromText = function(text, opt_options) {
+  var feature = this.readFeatureFromText(text, opt_options);
+  if (!goog.isNull(feature)) {
+    return [feature];
+  } else {
+    return [];
+  }
+};
+
+
+/**
+ * Read the projection from the IGC source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.proj.Projection} Projection.
+ * @api
+ */
+ol.format.IGC.prototype.readProjection;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.IGC.prototype.readProjectionFromText = function(text) {
+  return this.defaultDataProjection;
+};
diff --git a/src/ol/format/jsonfeatureformat.js b/src/ol/format/jsonfeatureformat.js
new file mode 100644
index 0000000..0ef66bc
--- /dev/null
+++ b/src/ol/format/jsonfeatureformat.js
@@ -0,0 +1,168 @@
+goog.provide('ol.format.JSONFeature');
+
+goog.require('goog.asserts');
+goog.require('goog.json');
+goog.require('ol.format.Feature');
+goog.require('ol.format.FormatType');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for JSON feature formats.
+ *
+ * @constructor
+ * @extends {ol.format.Feature}
+ */
+ol.format.JSONFeature = function() {
+  goog.base(this);
+};
+goog.inherits(ol.format.JSONFeature, ol.format.Feature);
+
+
+/**
+ * @param {Document|Node|Object|string} source Source.
+ * @private
+ * @return {Object} Object.
+ */
+ol.format.JSONFeature.prototype.getObject_ = function(source) {
+  if (goog.isObject(source)) {
+    return source;
+  } else if (goog.isString(source)) {
+    var object = goog.json.parse(source);
+    return goog.isDef(object) ? object : null;
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.JSONFeature.prototype.getType = function() {
+  return ol.format.FormatType.JSON;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.JSONFeature.prototype.readFeature = function(source, opt_options) {
+  return this.readFeatureFromObject(
+      this.getObject_(source), this.getReadOptions(source, opt_options));
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.JSONFeature.prototype.readFeatures = function(source, opt_options) {
+  return this.readFeaturesFromObject(
+      this.getObject_(source), this.getReadOptions(source, opt_options));
+};
+
+
+/**
+ * @param {Object} object Object.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @protected
+ * @return {ol.Feature} Feature.
+ */
+ol.format.JSONFeature.prototype.readFeatureFromObject = goog.abstractMethod;
+
+
+/**
+ * @param {Object} object Object.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @protected
+ * @return {Array.<ol.Feature>} Features.
+ */
+ol.format.JSONFeature.prototype.readFeaturesFromObject = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.JSONFeature.prototype.readGeometry = function(source, opt_options) {
+  return this.readGeometryFromObject(
+      this.getObject_(source), this.getReadOptions(source, opt_options));
+};
+
+
+/**
+ * @param {Object} object Object.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @protected
+ * @return {ol.geom.Geometry} Geometry.
+ */
+ol.format.JSONFeature.prototype.readGeometryFromObject = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.JSONFeature.prototype.readProjection = function(source) {
+  return this.readProjectionFromObject(this.getObject_(source));
+};
+
+
+/**
+ * @param {Object} object Object.
+ * @protected
+ * @return {ol.proj.Projection} Projection.
+ */
+ol.format.JSONFeature.prototype.readProjectionFromObject = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.JSONFeature.prototype.writeFeature = function(feature, opt_options) {
+  return goog.json.serialize(this.writeFeatureObject(feature, opt_options));
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {Object} Object.
+ */
+ol.format.JSONFeature.prototype.writeFeatureObject = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.JSONFeature.prototype.writeFeatures = function(
+    features, opt_options) {
+  return goog.json.serialize(this.writeFeaturesObject(features, opt_options));
+};
+
+
+/**
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {Object} Object.
+ */
+ol.format.JSONFeature.prototype.writeFeaturesObject = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.JSONFeature.prototype.writeGeometry = function(
+    geometry, opt_options) {
+  return goog.json.serialize(this.writeGeometryObject(geometry, opt_options));
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {Object} Object.
+ */
+ol.format.JSONFeature.prototype.writeGeometryObject = goog.abstractMethod;
diff --git a/src/ol/format/kmlformat.js b/src/ol/format/kmlformat.js
new file mode 100644
index 0000000..36114a3
--- /dev/null
+++ b/src/ol/format/kmlformat.js
@@ -0,0 +1,2620 @@
+// FIXME http://earth.google.com/kml/1.0 namespace?
+// FIXME why does node.getAttribute return an unknown type?
+// FIXME text
+// FIXME serialize arbitrary feature properties
+// FIXME don't parse style if extractStyles is false
+
+goog.provide('ol.format.KML');
+
+goog.require('goog.Uri');
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.NodeType');
+goog.require('goog.math');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('ol.Feature');
+goog.require('ol.color');
+goog.require('ol.feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.XMLFeature');
+goog.require('ol.format.XSD');
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.GeometryCollection');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.LinearRing');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.proj');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Icon');
+goog.require('ol.style.IconAnchorUnits');
+goog.require('ol.style.IconOrigin');
+goog.require('ol.style.Image');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.style.Text');
+goog.require('ol.xml');
+
+
+/**
+ * @typedef {{x: number, xunits: (ol.style.IconAnchorUnits|undefined),
+ *            y: number, yunits: (ol.style.IconAnchorUnits|undefined)}}
+ */
+ol.format.KMLVec2_;
+
+
+/**
+ * @typedef {{flatCoordinates: Array.<number>,
+ *            whens: Array.<number>}}
+ */
+ol.format.KMLGxTrackObject_;
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the KML format.
+ *
+ * @constructor
+ * @extends {ol.format.XMLFeature}
+ * @param {olx.format.KMLOptions=} opt_options Options.
+ * @api stable
+ */
+ol.format.KML = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this);
+
+  /**
+   * @inheritDoc
+   */
+  this.defaultDataProjection = ol.proj.get('EPSG:4326');
+
+  var defaultStyle = goog.isDef(options.defaultStyle) ?
+      options.defaultStyle : ol.format.KML.DEFAULT_STYLE_ARRAY_;
+
+  /** @type {Object.<string, (Array.<ol.style.Style>|string)>} */
+  var sharedStyles = {};
+
+  var findStyle =
+      /**
+       * @param {Array.<ol.style.Style>|string|undefined} styleValue Style
+       *     value.
+       * @return {Array.<ol.style.Style>} Style.
+       */
+      function(styleValue) {
+    if (goog.isArray(styleValue)) {
+      return styleValue;
+    } else if (goog.isString(styleValue)) {
+      // KML files in the wild occasionally forget the leading `#` on styleUrls
+      // defined in the same document.  Add a leading `#` if it enables to find
+      // a style.
+      if (!(styleValue in sharedStyles) && ('#' + styleValue in sharedStyles)) {
+        styleValue = '#' + styleValue;
+      }
+      return findStyle(sharedStyles[styleValue]);
+    } else {
+      return defaultStyle;
+    }
+  };
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.extractStyles_ = goog.isDef(options.extractStyles) ?
+      options.extractStyles : true;
+
+  /**
+   * @private
+   * @type {Object.<string, (Array.<ol.style.Style>|string)>}
+   */
+  this.sharedStyles_ = sharedStyles;
+
+  /**
+   * @private
+   * @type {ol.feature.FeatureStyleFunction}
+   */
+  this.featureStyleFunction_ =
+      /**
+       * @param {number} resolution Resolution.
+       * @return {Array.<ol.style.Style>} Style.
+       * @this {ol.Feature}
+       */
+      function(resolution) {
+    var style = /** @type {Array.<ol.style.Style>|undefined} */
+        (this.get('Style'));
+    if (goog.isDef(style)) {
+      return style;
+    }
+    var styleUrl = /** @type {string|undefined} */ (this.get('styleUrl'));
+    if (goog.isDef(styleUrl)) {
+      return findStyle(styleUrl);
+    }
+    return defaultStyle;
+  };
+
+};
+goog.inherits(ol.format.KML, ol.format.XMLFeature);
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ * @private
+ */
+ol.format.KML.EXTENSIONS_ = ['.kml'];
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ * @private
+ */
+ol.format.KML.GX_NAMESPACE_URIS_ = [
+  'http://www.google.com/kml/ext/2.2'
+];
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ * @private
+ */
+ol.format.KML.NAMESPACE_URIS_ = [
+  null,
+  'http://earth.google.com/kml/2.0',
+  'http://earth.google.com/kml/2.1',
+  'http://earth.google.com/kml/2.2',
+  'http://www.opengis.net/kml/2.2'
+];
+
+
+/**
+ * @const
+ * @type {string}
+ * @private
+ */
+ol.format.KML.SCHEMA_LOCATION_ = 'http://www.opengis.net/kml/2.2 ' +
+    'https://developers.google.com/kml/schema/kml22gx.xsd';
+
+
+/**
+ * @const
+ * @type {ol.Color}
+ * @private
+ */
+ol.format.KML.DEFAULT_COLOR_ = [255, 255, 255, 1];
+
+
+/**
+ * @const
+ * @type {ol.style.Fill}
+ * @private
+ */
+ol.format.KML.DEFAULT_FILL_STYLE_ = new ol.style.Fill({
+  color: ol.format.KML.DEFAULT_COLOR_
+});
+
+
+/**
+ * @const
+ * @type {ol.Size}
+ * @private
+ */
+ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_ = [2, 20]; // FIXME maybe [8, 32] ?
+
+
+/**
+ * @const
+ * @type {ol.style.IconAnchorUnits}
+ * @private
+ */
+ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_ =
+    ol.style.IconAnchorUnits.PIXELS;
+
+
+/**
+ * @const
+ * @type {ol.style.IconAnchorUnits}
+ * @private
+ */
+ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_ =
+    ol.style.IconAnchorUnits.PIXELS;
+
+
+/**
+ * @const
+ * @type {ol.Size}
+ * @private
+ */
+ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_ = [32, 32];
+
+
+/**
+ * @const
+ * @type {string}
+ * @private
+ */
+ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_ =
+    'https://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png';
+
+
+/**
+ * @const
+ * @type {ol.style.Image}
+ * @private
+ */
+ol.format.KML.DEFAULT_IMAGE_STYLE_ = new ol.style.Icon({
+  anchor: ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_,
+  anchorXUnits: ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_,
+  anchorYUnits: ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_,
+  crossOrigin: 'anonymous',
+  rotation: 0,
+  scale: 1,
+  size: ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_,
+  src: ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_
+});
+
+
+/**
+ * @const
+ * @type {ol.style.Stroke}
+ * @private
+ */
+ol.format.KML.DEFAULT_STROKE_STYLE_ = new ol.style.Stroke({
+  color: ol.format.KML.DEFAULT_COLOR_,
+  width: 1
+});
+
+
+/**
+ * @const
+ * @type {ol.style.Text}
+ * @private
+ */
+ol.format.KML.DEFAULT_TEXT_STYLE_ = new ol.style.Text({
+  font: 'normal 16px Helvetica',
+  fill: ol.format.KML.DEFAULT_FILL_STYLE_,
+  stroke: ol.format.KML.DEFAULT_STROKE_STYLE_,
+  scale: 1
+});
+
+
+/**
+ * @const
+ * @type {ol.style.Style}
+ * @private
+ */
+ol.format.KML.DEFAULT_STYLE_ = new ol.style.Style({
+  fill: ol.format.KML.DEFAULT_FILL_STYLE_,
+  image: ol.format.KML.DEFAULT_IMAGE_STYLE_,
+  text: ol.format.KML.DEFAULT_TEXT_STYLE_,
+  stroke: ol.format.KML.DEFAULT_STROKE_STYLE_,
+  zIndex: 0
+});
+
+
+/**
+ * @const
+ * @type {Array.<ol.style.Style>}
+ * @private
+ */
+ol.format.KML.DEFAULT_STYLE_ARRAY_ = [ol.format.KML.DEFAULT_STYLE_];
+
+
+/**
+ * @const
+ * @type {Object.<string, ol.style.IconAnchorUnits>}
+ * @private
+ */
+ol.format.KML.ICON_ANCHOR_UNITS_MAP_ = {
+  'fraction': ol.style.IconAnchorUnits.FRACTION,
+  'pixels': ol.style.IconAnchorUnits.PIXELS
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @private
+ * @return {ol.Color|undefined} Color.
+ */
+ol.format.KML.readColor_ = function(node) {
+  var s = ol.xml.getAllTextContent(node, false);
+  // The KML specification states that colors should not include a leading `#`
+  // but we tolerate them.
+  var m = /^\s*#?\s*([0-9A-Fa-f]{8})\s*$/.exec(s);
+  if (m) {
+    var hexColor = m[1];
+    return [
+      parseInt(hexColor.substr(6, 2), 16),
+      parseInt(hexColor.substr(4, 2), 16),
+      parseInt(hexColor.substr(2, 2), 16),
+      parseInt(hexColor.substr(0, 2), 16) / 255
+    ];
+
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @private
+ * @return {Array.<number>|undefined} Flat coordinates.
+ */
+ol.format.KML.readFlatCoordinates_ = function(node) {
+  var s = ol.xml.getAllTextContent(node, false);
+  var flatCoordinates = [];
+  // The KML specification states that coordinate tuples should not include
+  // spaces, but we tolerate them.
+  var re =
+      /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*,\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)(?:\s*,\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?))?\s*/i;
+  var m;
+  while ((m = re.exec(s))) {
+    var x = parseFloat(m[1]);
+    var y = parseFloat(m[2]);
+    var z = m[3] ? parseFloat(m[3]) : 0;
+    flatCoordinates.push(x, y, z);
+    s = s.substr(m[0].length);
+  }
+  if (s !== '') {
+    return undefined;
+  }
+  return flatCoordinates;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @private
+ * @return {string|undefined} Style URL.
+ */
+ol.format.KML.readStyleUrl_ = function(node) {
+  var s = goog.string.trim(ol.xml.getAllTextContent(node, false));
+  if (goog.isDefAndNotNull(node.baseURI)) {
+    return goog.Uri.resolve(node.baseURI, s).toString();
+  } else {
+    return s;
+  }
+
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @private
+ * @return {string} URI.
+ */
+ol.format.KML.readURI_ = function(node) {
+  var s = ol.xml.getAllTextContent(node, false);
+  if (goog.isDefAndNotNull(node.baseURI)) {
+    return goog.Uri.resolve(node.baseURI, goog.string.trim(s)).toString();
+  } else {
+    return goog.string.trim(s);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @private
+ * @return {ol.format.KMLVec2_} Vec2.
+ */
+ol.format.KML.readVec2_ = function(node) {
+  var xunits = node.getAttribute('xunits');
+  var yunits = node.getAttribute('yunits');
+  return {
+    x: parseFloat(node.getAttribute('x')),
+    xunits: ol.format.KML.ICON_ANCHOR_UNITS_MAP_[xunits],
+    y: parseFloat(node.getAttribute('y')),
+    yunits: ol.format.KML.ICON_ANCHOR_UNITS_MAP_[yunits]
+  };
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @private
+ * @return {number|undefined} Scale.
+ */
+ol.format.KML.readScale_ = function(node) {
+  var number = ol.format.XSD.readDecimal(node);
+  if (goog.isDef(number)) {
+    return Math.sqrt(number);
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<ol.style.Style>|string|undefined} StyleMap.
+ */
+ol.format.KML.readStyleMapValue_ = function(node, objectStack) {
+  return ol.xml.pushParseAndPop(
+      /** @type {Array.<ol.style.Style>|string|undefined} */ (undefined),
+      ol.format.KML.STYLE_MAP_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.IconStyleParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'IconStyle');
+  // FIXME refreshMode
+  // FIXME refreshInterval
+  // FIXME viewRefreshTime
+  // FIXME viewBoundScale
+  // FIXME viewFormat
+  // FIXME httpQuery
+  var object = ol.xml.pushParseAndPop(
+      {}, ol.format.KML.ICON_STYLE_PARSERS_, node, objectStack);
+  if (!goog.isDef(object)) {
+    return;
+  }
+  var styleObject = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+  goog.asserts.assert(goog.isObject(styleObject));
+  var IconObject = /** @type {Object} */ (goog.object.get(object, 'Icon', {}));
+  var src;
+  var href = /** @type {string|undefined} */
+      (goog.object.get(IconObject, 'href'));
+  if (goog.isDef(href)) {
+    src = href;
+  } else {
+    src = ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_;
+  }
+  var anchor, anchorXUnits, anchorYUnits;
+  var hotSpot = /** @type {ol.format.KMLVec2_|undefined} */
+      (goog.object.get(object, 'hotSpot'));
+  if (goog.isDef(hotSpot)) {
+    anchor = [hotSpot.x, hotSpot.y];
+    anchorXUnits = hotSpot.xunits;
+    anchorYUnits = hotSpot.yunits;
+  } else if (src === ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_) {
+    anchor = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_;
+    anchorXUnits = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_X_UNITS_;
+    anchorYUnits = ol.format.KML.DEFAULT_IMAGE_STYLE_ANCHOR_Y_UNITS_;
+  } else if (/^http:\/\/maps\.(?:google|gstatic)\.com\//.test(src)) {
+    anchor = [0.5, 0];
+    anchorXUnits = ol.style.IconAnchorUnits.FRACTION;
+    anchorYUnits = ol.style.IconAnchorUnits.FRACTION;
+  }
+
+  var offset;
+  var x = /** @type {number|undefined} */
+      (goog.object.get(IconObject, 'x'));
+  var y = /** @type {number|undefined} */
+      (goog.object.get(IconObject, 'y'));
+  if (goog.isDef(x) && goog.isDef(y)) {
+    offset = [x, y];
+  }
+
+  var size;
+  var w = /** @type {number|undefined} */
+      (goog.object.get(IconObject, 'w'));
+  var h = /** @type {number|undefined} */
+      (goog.object.get(IconObject, 'h'));
+  if (goog.isDef(w) && goog.isDef(h)) {
+    size = [w, h];
+  }
+
+  var rotation;
+  var heading = /** @type {number|undefined} */
+      (goog.object.get(object, 'heading'));
+  if (goog.isDef(heading)) {
+    rotation = goog.math.toRadians(heading);
+  }
+
+  var scale = /** @type {number|undefined} */
+      (goog.object.get(object, 'scale'));
+  if (src == ol.format.KML.DEFAULT_IMAGE_STYLE_SRC_) {
+    size = ol.format.KML.DEFAULT_IMAGE_STYLE_SIZE_;
+  }
+
+  var imageStyle = new ol.style.Icon({
+    anchor: anchor,
+    anchorOrigin: ol.style.IconOrigin.BOTTOM_LEFT,
+    anchorXUnits: anchorXUnits,
+    anchorYUnits: anchorYUnits,
+    crossOrigin: 'anonymous', // FIXME should this be configurable?
+    offset: offset,
+    offsetOrigin: ol.style.IconOrigin.BOTTOM_LEFT,
+    rotation: rotation,
+    scale: scale,
+    size: size,
+    src: src
+  });
+  goog.object.set(styleObject, 'imageStyle', imageStyle);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.LabelStyleParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LabelStyle');
+  // FIXME colorMode
+  var object = ol.xml.pushParseAndPop(
+      {}, ol.format.KML.LABEL_STYLE_PARSERS_, node, objectStack);
+  if (!goog.isDef(object)) {
+    return;
+  }
+  var styleObject = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(styleObject));
+  var textStyle = new ol.style.Text({
+    fill: new ol.style.Fill({
+      color: /** @type {ol.Color} */
+          (goog.object.get(object, 'color', ol.format.KML.DEFAULT_COLOR_))
+    }),
+    scale: /** @type {number|undefined} */
+        (goog.object.get(object, 'scale'))
+  });
+  goog.object.set(styleObject, 'textStyle', textStyle);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.LineStyleParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LineStyle');
+  // FIXME colorMode
+  // FIXME gx:outerColor
+  // FIXME gx:outerWidth
+  // FIXME gx:physicalWidth
+  // FIXME gx:labelVisibility
+  var object = ol.xml.pushParseAndPop(
+      {}, ol.format.KML.LINE_STYLE_PARSERS_, node, objectStack);
+  if (!goog.isDef(object)) {
+    return;
+  }
+  var styleObject = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(styleObject));
+  var strokeStyle = new ol.style.Stroke({
+    color: /** @type {ol.Color} */
+        (goog.object.get(object, 'color', ol.format.KML.DEFAULT_COLOR_)),
+    width: /** @type {number} */ (goog.object.get(object, 'width', 1))
+  });
+  goog.object.set(styleObject, 'strokeStyle', strokeStyle);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.PolyStyleParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'PolyStyle');
+  // FIXME colorMode
+  var object = ol.xml.pushParseAndPop(
+      {}, ol.format.KML.POLY_STYLE_PARSERS_, node, objectStack);
+  if (!goog.isDef(object)) {
+    return;
+  }
+  var styleObject = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(styleObject));
+  var fillStyle = new ol.style.Fill({
+    color: /** @type {ol.Color} */
+        (goog.object.get(object, 'color', ol.format.KML.DEFAULT_COLOR_))
+  });
+  goog.object.set(styleObject, 'fillStyle', fillStyle);
+  var fill = /** @type {boolean|undefined} */ (goog.object.get(object, 'fill'));
+  if (goog.isDef(fill)) {
+    goog.object.set(styleObject, 'fill', fill);
+  }
+  var outline =
+      /** @type {boolean|undefined} */ (goog.object.get(object, 'outline'));
+  if (goog.isDef(outline)) {
+    goog.object.set(styleObject, 'outline', outline);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>} LinearRing flat coordinates.
+ */
+ol.format.KML.readFlatLinearRing_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LinearRing');
+  return /** @type {Array.<number>} */ (ol.xml.pushParseAndPop(
+      null, ol.format.KML.FLAT_LINEAR_RING_PARSERS_, node, objectStack));
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.gxCoordParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(goog.array.contains(
+      ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI));
+  goog.asserts.assert(node.localName == 'coord');
+  var gxTrackObject = /** @type {ol.format.KMLGxTrackObject_} */
+      (objectStack[objectStack.length - 1]);
+  goog.asserts.assert(goog.isObject(gxTrackObject));
+  var flatCoordinates = gxTrackObject.flatCoordinates;
+  var s = ol.xml.getAllTextContent(node, false);
+  var re =
+      /^\s*([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s+([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s+([+\-]?\d+(?:\.\d*)?(?:e[+\-]?\d*)?)\s*$/i;
+  var m = re.exec(s);
+  if (m) {
+    var x = parseFloat(m[1]);
+    var y = parseFloat(m[2]);
+    var z = parseFloat(m[3]);
+    flatCoordinates.push(x, y, z, 0);
+  } else {
+    flatCoordinates.push(0, 0, 0, 0);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.MultiLineString|undefined} MultiLineString.
+ */
+ol.format.KML.readGxMultiTrack_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(goog.array.contains(
+      ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI));
+  goog.asserts.assert(node.localName == 'MultiTrack');
+  var lineStrings = ol.xml.pushParseAndPop(
+      /** @type {Array.<ol.geom.LineString>} */ ([]),
+      ol.format.KML.GX_MULTITRACK_GEOMETRY_PARSERS_, node, objectStack);
+  if (!goog.isDef(lineStrings)) {
+    return undefined;
+  }
+  var multiLineString = new ol.geom.MultiLineString(null);
+  multiLineString.setLineStrings(lineStrings);
+  return multiLineString;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.LineString|undefined} LineString.
+ */
+ol.format.KML.readGxTrack_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(goog.array.contains(
+      ol.format.KML.GX_NAMESPACE_URIS_, node.namespaceURI));
+  goog.asserts.assert(node.localName == 'Track');
+  var gxTrackObject = ol.xml.pushParseAndPop(
+      /** @type {ol.format.KMLGxTrackObject_} */ ({
+        flatCoordinates: [],
+        whens: []
+      }), ol.format.KML.GX_TRACK_PARSERS_, node, objectStack);
+  if (!goog.isDef(gxTrackObject)) {
+    return undefined;
+  }
+  var flatCoordinates = gxTrackObject.flatCoordinates;
+  var whens = gxTrackObject.whens;
+  goog.asserts.assert(flatCoordinates.length / 4 == whens.length);
+  var i, ii;
+  for (i = 0, ii = Math.min(flatCoordinates.length, whens.length); i < ii;
+       ++i) {
+    flatCoordinates[4 * i + 3] = whens[i];
+  }
+  var lineString = new ol.geom.LineString(null);
+  lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZM, flatCoordinates);
+  return lineString;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object} Icon object.
+ */
+ol.format.KML.readIcon_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Icon');
+  var iconObject = ol.xml.pushParseAndPop(
+      {}, ol.format.KML.ICON_PARSERS_, node, objectStack);
+  if (goog.isDef(iconObject)) {
+    return iconObject;
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<number>} Flat coordinates.
+ */
+ol.format.KML.readFlatCoordinatesFromNode_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  return /** @type {Array.<number>} */ (ol.xml.pushParseAndPop(null,
+      ol.format.KML.GEOMETRY_FLAT_COORDINATES_PARSERS_, node, objectStack));
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.LineString|undefined} LineString.
+ */
+ol.format.KML.readLineString_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LineString');
+  var flatCoordinates =
+      ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack);
+  if (goog.isDef(flatCoordinates)) {
+    var lineString = new ol.geom.LineString(null);
+    lineString.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates);
+    return lineString;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.Polygon|undefined} Polygon.
+ */
+ol.format.KML.readLinearRing_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'LinearRing');
+  var flatCoordinates =
+      ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack);
+  if (goog.isDef(flatCoordinates)) {
+    var polygon = new ol.geom.Polygon(null);
+    polygon.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates,
+        [flatCoordinates.length]);
+    return polygon;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.Geometry} Geometry.
+ */
+ol.format.KML.readMultiGeometry_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'MultiGeometry');
+  var geometries = ol.xml.pushParseAndPop(
+      /** @type {Array.<ol.geom.Geometry>} */ ([]),
+      ol.format.KML.MULTI_GEOMETRY_PARSERS_, node, objectStack);
+  if (!goog.isDef(geometries)) {
+    return null;
+  }
+  if (geometries.length === 0) {
+    return new ol.geom.GeometryCollection(geometries);
+  }
+  var homogeneous = true;
+  var type = geometries[0].getType();
+  var geometry, i, ii;
+  for (i = 1, ii = geometries.length; i < ii; ++i) {
+    geometry = geometries[i];
+    if (geometry.getType() != type) {
+      homogeneous = false;
+      break;
+    }
+  }
+  if (homogeneous) {
+    /** @type {ol.geom.GeometryLayout} */
+    var layout;
+    /** @type {Array.<number>} */
+    var flatCoordinates;
+    if (type == ol.geom.GeometryType.POINT) {
+      var point = geometries[0];
+      goog.asserts.assertInstanceof(point, ol.geom.Point);
+      layout = point.getLayout();
+      flatCoordinates = point.getFlatCoordinates();
+      for (i = 1, ii = geometries.length; i < ii; ++i) {
+        geometry = geometries[i];
+        goog.asserts.assertInstanceof(geometry, ol.geom.Point);
+        goog.asserts.assert(geometry.getLayout() == layout);
+        goog.array.extend(flatCoordinates, geometry.getFlatCoordinates());
+      }
+      var multiPoint = new ol.geom.MultiPoint(null);
+      multiPoint.setFlatCoordinates(layout, flatCoordinates);
+      return multiPoint;
+    } else if (type == ol.geom.GeometryType.LINE_STRING) {
+      var multiLineString = new ol.geom.MultiLineString(null);
+      multiLineString.setLineStrings(geometries);
+      return multiLineString;
+    } else if (type == ol.geom.GeometryType.POLYGON) {
+      var multiPolygon = new ol.geom.MultiPolygon(null);
+      multiPolygon.setPolygons(geometries);
+      return multiPolygon;
+    } else if (type == ol.geom.GeometryType.GEOMETRY_COLLECTION) {
+      return new ol.geom.GeometryCollection(geometries);
+    } else {
+      goog.asserts.fail();
+      return null;
+    }
+  } else {
+    return new ol.geom.GeometryCollection(geometries);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.Point|undefined} Point.
+ */
+ol.format.KML.readPoint_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Point');
+  var flatCoordinates =
+      ol.format.KML.readFlatCoordinatesFromNode_(node, objectStack);
+  if (goog.isDefAndNotNull(flatCoordinates)) {
+    var point = new ol.geom.Point(null);
+    goog.asserts.assert(flatCoordinates.length == 3);
+    point.setFlatCoordinates(ol.geom.GeometryLayout.XYZ, flatCoordinates);
+    return point;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.geom.Polygon|undefined} Polygon.
+ */
+ol.format.KML.readPolygon_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Polygon');
+  var flatLinearRings = ol.xml.pushParseAndPop(
+      /** @type {Array.<Array.<number>>} */ ([null]),
+      ol.format.KML.FLAT_LINEAR_RINGS_PARSERS_, node, objectStack);
+  if (goog.isDefAndNotNull(flatLinearRings) &&
+      !goog.isNull(flatLinearRings[0])) {
+    var polygon = new ol.geom.Polygon(null);
+    var flatCoordinates = flatLinearRings[0];
+    var ends = [flatCoordinates.length];
+    var i, ii;
+    for (i = 1, ii = flatLinearRings.length; i < ii; ++i) {
+      goog.array.extend(flatCoordinates, flatLinearRings[i]);
+      ends.push(flatCoordinates.length);
+    }
+    polygon.setFlatCoordinates(
+        ol.geom.GeometryLayout.XYZ, flatCoordinates, ends);
+    return polygon;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<ol.style.Style>} Style.
+ */
+ol.format.KML.readStyle_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Style');
+  var styleObject = ol.xml.pushParseAndPop(
+      {}, ol.format.KML.STYLE_PARSERS_, node, objectStack);
+  if (!goog.isDef(styleObject)) {
+    return null;
+  }
+  var fillStyle = /** @type {ol.style.Fill} */ (goog.object.get(
+      styleObject, 'fillStyle', ol.format.KML.DEFAULT_FILL_STYLE_));
+  var fill = /** @type {boolean|undefined} */
+      (goog.object.get(styleObject, 'fill'));
+  if (goog.isDef(fill) && !fill) {
+    fillStyle = null;
+  }
+  var imageStyle = /** @type {ol.style.Image} */ (goog.object.get(
+      styleObject, 'imageStyle', ol.format.KML.DEFAULT_IMAGE_STYLE_));
+  var textStyle = /** @type {ol.style.Text} */ (goog.object.get(
+      styleObject, 'textStyle', ol.format.KML.DEFAULT_TEXT_STYLE_));
+  var strokeStyle = /** @type {ol.style.Stroke} */ (goog.object.get(
+      styleObject, 'strokeStyle', ol.format.KML.DEFAULT_STROKE_STYLE_));
+  var outline = /** @type {boolean|undefined} */
+      (goog.object.get(styleObject, 'outline'));
+  if (goog.isDef(outline) && !outline) {
+    strokeStyle = null;
+  }
+  return [new ol.style.Style({
+    fill: fillStyle,
+    image: imageStyle,
+    stroke: strokeStyle,
+    text: textStyle,
+    zIndex: undefined // FIXME
+  })];
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.DataParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Data');
+  var name = node.getAttribute('name');
+  if (!goog.isNull(name)) {
+    var data = ol.xml.pushParseAndPop(
+        undefined, ol.format.KML.DATA_PARSERS_, node, objectStack);
+    if (goog.isDef(data)) {
+      var featureObject =
+          /** @type {Object} */ (objectStack[objectStack.length - 1]);
+      goog.asserts.assert(goog.isObject(featureObject));
+      goog.object.set(featureObject, name, data);
+    }
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.ExtendedDataParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'ExtendedData');
+  ol.xml.parseNode(ol.format.KML.EXTENDED_DATA_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.PairDataParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Pair');
+  var pairObject = ol.xml.pushParseAndPop(
+      {}, ol.format.KML.PAIR_PARSERS_, node, objectStack);
+  if (!goog.isDef(pairObject)) {
+    return;
+  }
+  var key = /** @type {string|undefined} */
+      (goog.object.get(pairObject, 'key'));
+  if (goog.isDef(key) && key == 'normal') {
+    var styleUrl = /** @type {string|undefined} */
+        (goog.object.get(pairObject, 'styleUrl'));
+    if (goog.isDef(styleUrl)) {
+      objectStack[objectStack.length - 1] = styleUrl;
+    }
+    var Style = /** @type {ol.style.Style} */
+        (goog.object.get(pairObject, 'Style'));
+    if (goog.isDef(Style)) {
+      objectStack[objectStack.length - 1] = Style;
+    }
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.PlacemarkStyleMapParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'StyleMap');
+  var styleMapValue = ol.format.KML.readStyleMapValue_(node, objectStack);
+  if (!goog.isDef(styleMapValue)) {
+    return;
+  }
+  var placemarkObject = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(placemarkObject));
+  if (goog.isArray(styleMapValue)) {
+    goog.object.set(placemarkObject, 'Style', styleMapValue);
+  } else if (goog.isString(styleMapValue)) {
+    goog.object.set(placemarkObject, 'styleUrl', styleMapValue);
+  } else {
+    goog.asserts.fail();
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.SchemaDataParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'SchemaData');
+  ol.xml.parseNode(ol.format.KML.SCHEMA_DATA_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.SimpleDataParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'SimpleData');
+  var name = node.getAttribute('name');
+  if (!goog.isNull(name)) {
+    var data = ol.format.XSD.readString(node);
+    var featureObject =
+        /** @type {Object} */ (objectStack[objectStack.length - 1]);
+    goog.object.set(featureObject, name, data);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.innerBoundaryIsParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'innerBoundaryIs');
+  var flatLinearRing = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>|undefined} */ (undefined),
+      ol.format.KML.INNER_BOUNDARY_IS_PARSERS_, node, objectStack);
+  if (goog.isDef(flatLinearRing)) {
+    var flatLinearRings = /** @type {Array.<Array.<number>>} */
+        (objectStack[objectStack.length - 1]);
+    goog.asserts.assert(goog.isArray(flatLinearRings));
+    goog.asserts.assert(flatLinearRings.length > 0);
+    flatLinearRings.push(flatLinearRing);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.outerBoundaryIsParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'outerBoundaryIs');
+  var flatLinearRing = ol.xml.pushParseAndPop(
+      /** @type {Array.<number>|undefined} */ (undefined),
+      ol.format.KML.OUTER_BOUNDARY_IS_PARSERS_, node, objectStack);
+  if (goog.isDef(flatLinearRing)) {
+    var flatLinearRings = /** @type {Array.<Array.<number>>} */
+        (objectStack[objectStack.length - 1]);
+    goog.asserts.assert(goog.isArray(flatLinearRings));
+    goog.asserts.assert(flatLinearRings.length > 0);
+    flatLinearRings[0] = flatLinearRing;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.whenParser_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'when');
+  var gxTrackObject = /** @type {ol.format.KMLGxTrackObject_} */
+      (objectStack[objectStack.length - 1]);
+  goog.asserts.assert(goog.isObject(gxTrackObject));
+  var whens = gxTrackObject.whens;
+  var s = ol.xml.getAllTextContent(node, false);
+  var re =
+      /^\s*(\d{4})($|-(\d{2})($|-(\d{2})($|T(\d{2}):(\d{2}):(\d{2})(Z|(?:([+\-])(\d{2})(?::(\d{2}))?)))))\s*$/;
+  var m = re.exec(s);
+  if (m) {
+    var year = parseInt(m[1], 10);
+    var month = goog.isDef(m[3]) ? parseInt(m[3], 10) - 1 : 0;
+    var day = goog.isDef(m[5]) ? parseInt(m[5], 10) : 1;
+    var hour = goog.isDef(m[7]) ? parseInt(m[7], 10) : 0;
+    var minute = goog.isDef(m[8]) ? parseInt(m[8], 10) : 0;
+    var second = goog.isDef(m[9]) ? parseInt(m[9], 10) : 0;
+    var when = Date.UTC(year, month, day, hour, minute, second);
+    if (goog.isDef(m[10]) && m[10] != 'Z') {
+      var sign = m[11] == '-' ? -1 : 1;
+      when += sign * 60 * parseInt(m[12], 10);
+      if (goog.isDef(m[13])) {
+        when += sign * 60 * 60 * parseInt(m[13], 10);
+      }
+    }
+    whens.push(when);
+  } else {
+    whens.push(0);
+  }
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.DATA_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'value': ol.xml.makeReplacer(ol.format.XSD.readString)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.EXTENDED_DATA_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'Data': ol.format.KML.DataParser_,
+      'SchemaData': ol.format.KML.SchemaDataParser_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.FLAT_LINEAR_RING_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'coordinates': ol.xml.makeReplacer(ol.format.KML.readFlatCoordinates_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.FLAT_LINEAR_RINGS_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'innerBoundaryIs': ol.format.KML.innerBoundaryIsParser_,
+      'outerBoundaryIs': ol.format.KML.outerBoundaryIsParser_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.GX_TRACK_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'when': ol.format.KML.whenParser_
+    }, ol.xml.makeParsersNS(
+        ol.format.KML.GX_NAMESPACE_URIS_, {
+          'coord': ol.format.KML.gxCoordParser_
+        }));
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.GEOMETRY_FLAT_COORDINATES_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'coordinates': ol.xml.makeReplacer(ol.format.KML.readFlatCoordinates_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.ICON_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'href': ol.xml.makeObjectPropertySetter(ol.format.KML.readURI_)
+    }, ol.xml.makeParsersNS(
+        ol.format.KML.GX_NAMESPACE_URIS_, {
+          'x': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+          'y': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+          'w': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+          'h': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal)
+        }));
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.ICON_STYLE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'Icon': ol.xml.makeObjectPropertySetter(ol.format.KML.readIcon_),
+      'heading': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal),
+      'hotSpot': ol.xml.makeObjectPropertySetter(ol.format.KML.readVec2_),
+      'scale': ol.xml.makeObjectPropertySetter(ol.format.KML.readScale_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.INNER_BOUNDARY_IS_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'LinearRing': ol.xml.makeReplacer(ol.format.KML.readFlatLinearRing_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.LABEL_STYLE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'color': ol.xml.makeObjectPropertySetter(ol.format.KML.readColor_),
+      'scale': ol.xml.makeObjectPropertySetter(ol.format.KML.readScale_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.LINE_STYLE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'color': ol.xml.makeObjectPropertySetter(ol.format.KML.readColor_),
+      'width': ol.xml.makeObjectPropertySetter(ol.format.XSD.readDecimal)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.MULTI_GEOMETRY_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'LineString': ol.xml.makeArrayPusher(ol.format.KML.readLineString_),
+      'LinearRing': ol.xml.makeArrayPusher(ol.format.KML.readLinearRing_),
+      'MultiGeometry': ol.xml.makeArrayPusher(ol.format.KML.readMultiGeometry_),
+      'Point': ol.xml.makeArrayPusher(ol.format.KML.readPoint_),
+      'Polygon': ol.xml.makeArrayPusher(ol.format.KML.readPolygon_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.GX_MULTITRACK_GEOMETRY_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.GX_NAMESPACE_URIS_, {
+      'Track': ol.xml.makeArrayPusher(ol.format.KML.readGxTrack_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.OUTER_BOUNDARY_IS_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'LinearRing': ol.xml.makeReplacer(ol.format.KML.readFlatLinearRing_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.PAIR_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'Style': ol.xml.makeObjectPropertySetter(ol.format.KML.readStyle_),
+      'key': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'styleUrl': ol.xml.makeObjectPropertySetter(ol.format.KML.readStyleUrl_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.PLACEMARK_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'ExtendedData': ol.format.KML.ExtendedDataParser_,
+      'MultiGeometry': ol.xml.makeObjectPropertySetter(
+          ol.format.KML.readMultiGeometry_, 'geometry'),
+      'LineString': ol.xml.makeObjectPropertySetter(
+          ol.format.KML.readLineString_, 'geometry'),
+      'LinearRing': ol.xml.makeObjectPropertySetter(
+          ol.format.KML.readLinearRing_, 'geometry'),
+      'Point': ol.xml.makeObjectPropertySetter(
+          ol.format.KML.readPoint_, 'geometry'),
+      'Polygon': ol.xml.makeObjectPropertySetter(
+          ol.format.KML.readPolygon_, 'geometry'),
+      'Style': ol.xml.makeObjectPropertySetter(ol.format.KML.readStyle_),
+      'StyleMap': ol.format.KML.PlacemarkStyleMapParser_,
+      'address': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'description': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'open': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean),
+      'phoneNumber': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'styleUrl': ol.xml.makeObjectPropertySetter(ol.format.KML.readURI_),
+      'visibility': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean)
+    }, ol.xml.makeParsersNS(
+        ol.format.KML.GX_NAMESPACE_URIS_, {
+          'MultiTrack': ol.xml.makeObjectPropertySetter(
+              ol.format.KML.readGxMultiTrack_, 'geometry'),
+          'Track': ol.xml.makeObjectPropertySetter(
+              ol.format.KML.readGxTrack_, 'geometry')
+        }
+    ));
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.POLY_STYLE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'color': ol.xml.makeObjectPropertySetter(ol.format.KML.readColor_),
+      'fill': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean),
+      'outline': ol.xml.makeObjectPropertySetter(ol.format.XSD.readBoolean)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.SCHEMA_DATA_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'SimpleData': ol.format.KML.SimpleDataParser_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.STYLE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'IconStyle': ol.format.KML.IconStyleParser_,
+      'LabelStyle': ol.format.KML.LabelStyleParser_,
+      'LineStyle': ol.format.KML.LineStyleParser_,
+      'PolyStyle': ol.format.KML.PolyStyleParser_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.KML.STYLE_MAP_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'Pair': ol.format.KML.PairDataParser_
+    });
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.KML.prototype.getExtensions = function() {
+  return ol.format.KML.EXTENSIONS_;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<ol.Feature>|undefined} Features.
+ */
+ol.format.KML.prototype.readDocumentOrFolder_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  var localName = ol.xml.getLocalName(node);
+  goog.asserts.assert(localName == 'Document' || localName == 'Folder');
+  // FIXME use scope somehow
+  var parsersNS = ol.xml.makeParsersNS(
+      ol.format.KML.NAMESPACE_URIS_, {
+        'Folder': ol.xml.makeArrayExtender(this.readDocumentOrFolder_, this),
+        'Placemark': ol.xml.makeArrayPusher(this.readPlacemark_, this),
+        'Style': goog.bind(this.readSharedStyle_, this),
+        'StyleMap': goog.bind(this.readSharedStyleMap_, this)
+      });
+  var features = ol.xml.pushParseAndPop(/** @type {Array.<ol.Feature>} */ ([]),
+      parsersNS, node, objectStack, this);
+  if (goog.isDef(features)) {
+    return features;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.Feature|undefined} Feature.
+ */
+ol.format.KML.prototype.readPlacemark_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Placemark');
+  var object = ol.xml.pushParseAndPop({'geometry': null},
+      ol.format.KML.PLACEMARK_PARSERS_, node, objectStack);
+  if (!goog.isDef(object)) {
+    return undefined;
+  }
+  var feature = new ol.Feature();
+  var id = node.getAttribute('id');
+  if (!goog.isNull(id)) {
+    feature.setId(id);
+  }
+  var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
+  if (goog.isDefAndNotNull(object.geometry)) {
+    ol.format.Feature.transformWithOptions(object.geometry, false, options);
+  }
+  feature.setProperties(object);
+  if (this.extractStyles_) {
+    feature.setStyle(this.featureStyleFunction_);
+  }
+  return feature;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.prototype.readSharedStyle_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Style');
+  var id = node.getAttribute('id');
+  if (!goog.isNull(id)) {
+    var style = ol.format.KML.readStyle_(node, objectStack);
+    if (goog.isDef(style)) {
+      var styleUri;
+      if (goog.isDefAndNotNull(node.baseURI)) {
+        styleUri = goog.Uri.resolve(node.baseURI, '#' + id).toString();
+      } else {
+        styleUri = '#' + id;
+      }
+      this.sharedStyles_[styleUri] = style;
+    }
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.prototype.readSharedStyleMap_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'StyleMap');
+  var id = node.getAttribute('id');
+  if (goog.isNull(id)) {
+    return;
+  }
+  var styleMapValue = ol.format.KML.readStyleMapValue_(node, objectStack);
+  if (!goog.isDef(styleMapValue)) {
+    return;
+  }
+  var styleUri;
+  if (goog.isDefAndNotNull(node.baseURI)) {
+    styleUri = goog.Uri.resolve(node.baseURI, '#' + id).toString();
+  } else {
+    styleUri = '#' + id;
+  }
+  this.sharedStyles_[styleUri] = styleMapValue;
+};
+
+
+/**
+ * Read the first feature from a KML source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.Feature} Feature.
+ * @api stable
+ */
+ol.format.KML.prototype.readFeature;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.KML.prototype.readFeatureFromNode = function(node, opt_options) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  if (!goog.array.contains(ol.format.KML.NAMESPACE_URIS_, node.namespaceURI)) {
+    return null;
+  }
+  goog.asserts.assert(node.localName == 'Placemark');
+  var feature = this.readPlacemark_(
+      node, [this.getReadOptions(node, opt_options)]);
+  if (goog.isDef(feature)) {
+    return feature;
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * Read all features from a KML source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.KML.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.KML.prototype.readFeaturesFromNode = function(node, opt_options) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  if (!goog.array.contains(ol.format.KML.NAMESPACE_URIS_, node.namespaceURI)) {
+    return [];
+  }
+  var features;
+  var localName = ol.xml.getLocalName(node);
+  if (localName == 'Document' || localName == 'Folder') {
+    features = this.readDocumentOrFolder_(
+        node, [this.getReadOptions(node, opt_options)]);
+    if (goog.isDef(features)) {
+      return features;
+    } else {
+      return [];
+    }
+  } else if (localName == 'Placemark') {
+    var feature = this.readPlacemark_(
+        node, [this.getReadOptions(node, opt_options)]);
+    if (goog.isDef(feature)) {
+      return [feature];
+    } else {
+      return [];
+    }
+  } else if (localName == 'kml') {
+    features = [];
+    var n;
+    for (n = node.firstElementChild; !goog.isNull(n);
+         n = n.nextElementSibling) {
+      var fs = this.readFeaturesFromNode(n, opt_options);
+      if (goog.isDef(fs)) {
+        goog.array.extend(features, fs);
+      }
+    }
+    return features;
+  } else {
+    return [];
+  }
+};
+
+
+/**
+ * @param {Document|Node|string} source Souce.
+ * @return {string|undefined} Name.
+ * @api stable
+ */
+ol.format.KML.prototype.readName = function(source) {
+  if (ol.xml.isDocument(source)) {
+    return this.readNameFromDocument(/** @type {Document} */ (source));
+  } else if (ol.xml.isNode(source)) {
+    return this.readNameFromNode(/** @type {Node} */ (source));
+  } else if (goog.isString(source)) {
+    var doc = ol.xml.parse(source);
+    return this.readNameFromDocument(doc);
+  } else {
+    goog.asserts.fail();
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Document} doc Document.
+ * @return {string|undefined} Name.
+ */
+ol.format.KML.prototype.readNameFromDocument = function(doc) {
+  var n;
+  for (n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) {
+    if (n.nodeType == goog.dom.NodeType.ELEMENT) {
+      var name = this.readNameFromNode(n);
+      if (goog.isDef(name)) {
+        return name;
+      }
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {string|undefined} Name.
+ */
+ol.format.KML.prototype.readNameFromNode = function(node) {
+  var n;
+  for (n = node.firstElementChild; !goog.isNull(n); n = n.nextElementSibling) {
+    if (goog.array.contains(ol.format.KML.NAMESPACE_URIS_, n.namespaceURI) &&
+        n.localName == 'name') {
+      return ol.format.XSD.readString(n);
+    }
+  }
+  for (n = node.firstElementChild; !goog.isNull(n); n = n.nextElementSibling) {
+    var localName = ol.xml.getLocalName(n);
+    if (goog.array.contains(ol.format.KML.NAMESPACE_URIS_, n.namespaceURI) &&
+        (localName == 'Document' ||
+         localName == 'Folder' ||
+         localName == 'Placemark' ||
+         localName == 'kml')) {
+      var name = this.readNameFromNode(n);
+      if (goog.isDef(name)) {
+        return name;
+      }
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * Read the projection from a KML source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.proj.Projection} Projection.
+ * @api stable
+ */
+ol.format.KML.prototype.readProjection;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.KML.prototype.readProjectionFromDocument = function(doc) {
+  return this.defaultDataProjection;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.KML.prototype.readProjectionFromNode = function(node) {
+  return this.defaultDataProjection;
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the color to.
+ * @param {ol.Color|string} color Color.
+ * @private
+ */
+ol.format.KML.writeColorTextNode_ = function(node, color) {
+  var rgba = ol.color.asArray(color);
+  var opacity = (rgba.length == 4) ? rgba[3] : 1;
+  var abgr = [opacity * 255, rgba[2], rgba[1], rgba[0]];
+  var i;
+  for (i = 0; i < 4; ++i) {
+    var hex = parseInt(abgr[i], 10).toString(16);
+    abgr[i] = (hex.length == 1) ? '0' + hex : hex;
+  }
+  ol.format.XSD.writeStringTextNode(node, abgr.join(''));
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the coordinates to.
+ * @param {Array.<number>} coordinates Coordinates.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeCoordinatesTextNode_ =
+    function(node, coordinates, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+
+  var layout = goog.object.get(context, 'layout');
+  var stride = goog.object.get(context, 'stride');
+
+  var dimension;
+  if (layout == ol.geom.GeometryLayout.XY ||
+      layout == ol.geom.GeometryLayout.XYM) {
+    dimension = 2;
+  } else if (layout == ol.geom.GeometryLayout.XYZ ||
+      layout == ol.geom.GeometryLayout.XYZM) {
+    dimension = 3;
+  } else {
+    goog.asserts.fail();
+  }
+
+  var d, i;
+  var ii = coordinates.length;
+  var text = '';
+  if (ii > 0) {
+    text += coordinates[0];
+    for (d = 1; d < dimension; ++d) {
+      text += ',' + coordinates[d];
+    }
+    for (i = stride; i < ii; i += stride) {
+      text += ' ' + coordinates[i];
+      for (d = 1; d < dimension; ++d) {
+        text += ',' + coordinates[i + d];
+      }
+    }
+  }
+  ol.format.XSD.writeStringTextNode(node, text);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeDocument_ = function(node, features, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.DOCUMENT_SERIALIZERS_,
+      ol.format.KML.DOCUMENT_NODE_FACTORY_, features, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Object} icon Icon object.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeIcon_ = function(node, icon, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  var parentNode = objectStack[objectStack.length - 1].node;
+  var orderedKeys = ol.format.KML.ICON_SEQUENCE_[parentNode.namespaceURI];
+  var values = ol.xml.makeSequence(icon, orderedKeys);
+  ol.xml.pushSerializeAndPop(context,
+      ol.format.KML.ICON_SERIALIZERS_, ol.xml.OBJECT_PROPERTY_NODE_FACTORY,
+      values, objectStack, orderedKeys);
+  orderedKeys =
+      ol.format.KML.ICON_SEQUENCE_[ol.format.KML.GX_NAMESPACE_URIS_[0]];
+  values = ol.xml.makeSequence(icon, orderedKeys);
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.ICON_SERIALIZERS_,
+      ol.format.KML.GX_NODE_FACTORY_, values, objectStack, orderedKeys);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.style.Icon} style Icon style.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeIconStyle_ = function(node, style, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  var properties = {};
+  var src = style.getSrc();
+  var size = style.getSize();
+  var iconImageSize = style.getImageSize();
+  var iconProperties = {
+    'href': src
+  };
+
+  if (!goog.isNull(size)) {
+    goog.object.set(iconProperties, 'w', size[0]);
+    goog.object.set(iconProperties, 'h', size[1]);
+    var anchor = style.getAnchor(); // top-left
+    var origin = style.getOrigin(); // top-left
+
+    if (!goog.isNull(origin) && !goog.isNull(iconImageSize) &&
+        origin[0] !== 0 && origin[1] !== size[1]) {
+      goog.object.set(iconProperties, 'x', origin[0]);
+      goog.object.set(iconProperties, 'y',
+          iconImageSize[1] - (origin[1] + size[1]));
+    }
+
+    if (!goog.isNull(anchor) &&
+        anchor[0] !== 0 && anchor[1] !== size[1]) {
+      var /** @type {ol.format.KMLVec2_} */ hotSpot = {
+        x: anchor[0],
+        xunits: ol.style.IconAnchorUnits.PIXELS,
+        y: size[1] - anchor[1],
+        yunits: ol.style.IconAnchorUnits.PIXELS
+      };
+      goog.object.set(properties, 'hotSpot', hotSpot);
+    }
+  }
+
+  goog.object.set(properties, 'Icon', iconProperties);
+
+  var scale = style.getScale();
+  if (scale !== 1) {
+    goog.object.set(properties, 'scale', scale);
+  }
+
+  var rotation = style.getRotation();
+  if (rotation !== 0) {
+    goog.object.set(properties, 'heading', rotation); // 0-360
+  }
+
+  var parentNode = objectStack[objectStack.length - 1].node;
+  var orderedKeys = ol.format.KML.ICON_STYLE_SEQUENCE_[parentNode.namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.ICON_STYLE_SERIALIZERS_,
+      ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.style.Text} style style.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeLabelStyle_ = function(node, style, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  var properties = {};
+  var fill = style.getFill();
+  if (!goog.isNull(fill)) {
+    goog.object.set(properties, 'color', fill.getColor());
+  }
+  var scale = style.getScale();
+  if (goog.isDef(scale) && scale !== 1) {
+    goog.object.set(properties, 'scale', scale);
+  }
+  var parentNode = objectStack[objectStack.length - 1].node;
+  var orderedKeys =
+      ol.format.KML.LABEL_STYLE_SEQUENCE_[parentNode.namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.LABEL_STYLE_SERIALIZERS_,
+      ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.style.Stroke} style style.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeLineStyle_ = function(node, style, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  var properties = {
+    'color': style.getColor(),
+    'width': style.getWidth()
+  };
+  var parentNode = objectStack[objectStack.length - 1].node;
+  var orderedKeys = ol.format.KML.LINE_STYLE_SEQUENCE_[parentNode.namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.LINE_STYLE_SERIALIZERS_,
+      ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeMultiGeometry_ =
+    function(node, geometry, objectStack) {
+  goog.asserts.assert(
+      (geometry instanceof ol.geom.MultiPoint) ||
+      (geometry instanceof ol.geom.MultiLineString) ||
+      (geometry instanceof ol.geom.MultiPolygon));
+  /** @type {ol.xml.NodeStackItem} */
+  var context = {node: node};
+  var type = geometry.getType();
+  /** @type {Array.<ol.geom.Geometry>} */
+  var geometries;
+  /** @type {function(*, Array.<*>, string=): (Node|undefined)} */
+  var factory;
+  if (type == ol.geom.GeometryType.MULTI_POINT) {
+    geometries =
+        (/** @type {ol.geom.MultiPoint} */ (geometry)).getPoints();
+    factory = ol.format.KML.POINT_NODE_FACTORY_;
+  } else if (type == ol.geom.GeometryType.MULTI_LINE_STRING) {
+    geometries =
+        (/** @type {ol.geom.MultiLineString} */ (geometry)).getLineStrings();
+    factory = ol.format.KML.LINE_STRING_NODE_FACTORY_;
+  } else if (type == ol.geom.GeometryType.MULTI_POLYGON) {
+    geometries =
+        (/** @type {ol.geom.MultiPolygon} */ (geometry)).getPolygons();
+    factory = ol.format.KML.POLYGON_NODE_FACTORY_;
+  } else {
+    goog.asserts.fail();
+  }
+  ol.xml.pushSerializeAndPop(context,
+      ol.format.KML.MULTI_GEOMETRY_SERIALIZERS_, factory,
+      geometries, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.LinearRing} linearRing Linear ring.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeBoundaryIs_ = function(node, linearRing, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  ol.xml.pushSerializeAndPop(context,
+      ol.format.KML.BOUNDARY_IS_SERIALIZERS_,
+      ol.format.KML.LINEAR_RING_NODE_FACTORY_, [linearRing], objectStack);
+};
+
+
+/**
+ * FIXME currently we do serialize arbitrary/custom feature properties
+ * (ExtendedData).
+ * @param {Node} node Node.
+ * @param {ol.Feature} feature Feature.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writePlacemark_ = function(node, feature, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+
+  // set id
+  if (goog.isDefAndNotNull(feature.getId())) {
+    node.setAttribute('id', feature.getId());
+  }
+
+  // serialize properties (properties unknown to KML are not serialized)
+  var properties = feature.getProperties();
+  var styleFunction = feature.getStyleFunction();
+  if (goog.isDef(styleFunction)) {
+    // FIXME the styles returned by the style function are supposed to be
+    // resolution-independent here
+    var styles = styleFunction.call(feature, 0);
+    if (!goog.isNull(styles) && styles.length > 0) {
+      goog.object.set(properties, 'Style', styles[0]);
+      var textStyle = styles[0].getText();
+      if (!goog.isNull(textStyle)) {
+        goog.object.set(properties, 'name', textStyle.getText());
+      }
+    }
+  }
+  var parentNode = objectStack[objectStack.length - 1].node;
+  var orderedKeys = ol.format.KML.PLACEMARK_SEQUENCE_[parentNode.namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.PLACEMARK_SERIALIZERS_,
+      ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys);
+
+  // serialize geometry
+  var options = /** @type {olx.format.WriteOptions} */ (objectStack[0]);
+  var geometry = feature.getGeometry();
+  if (goog.isDefAndNotNull(geometry)) {
+    geometry =
+        ol.format.Feature.transformWithOptions(geometry, true, options);
+  }
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.PLACEMARK_SERIALIZERS_,
+      ol.format.KML.GEOMETRY_NODE_FACTORY_, [geometry], objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.SimpleGeometry} geometry Geometry.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writePrimitiveGeometry_ = function(node, geometry, objectStack) {
+  goog.asserts.assert(
+      (geometry instanceof ol.geom.Point) ||
+      (geometry instanceof ol.geom.LineString) ||
+      (geometry instanceof ol.geom.LinearRing));
+  var flatCoordinates = geometry.getFlatCoordinates();
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  goog.object.set(context, 'layout', geometry.getLayout());
+  goog.object.set(context, 'stride', geometry.getStride());
+  ol.xml.pushSerializeAndPop(context,
+      ol.format.KML.PRIMITIVE_GEOMETRY_SERIALIZERS_,
+      ol.format.KML.COORDINATES_NODE_FACTORY_,
+      [flatCoordinates], objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.geom.Polygon} polygon Polygon.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writePolygon_ = function(node, polygon, objectStack) {
+  goog.asserts.assertInstanceof(polygon, ol.geom.Polygon);
+  var linearRings = polygon.getLinearRings();
+  goog.asserts.assert(linearRings.length > 0);
+  var outerRing = linearRings.shift();
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  // inner rings
+  ol.xml.pushSerializeAndPop(context,
+      ol.format.KML.POLYGON_SERIALIZERS_,
+      ol.format.KML.INNER_BOUNDARY_NODE_FACTORY_,
+      linearRings, objectStack);
+  // outer ring
+  ol.xml.pushSerializeAndPop(context,
+      ol.format.KML.POLYGON_SERIALIZERS_,
+      ol.format.KML.OUTER_BOUNDARY_NODE_FACTORY_,
+      [outerRing], objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.style.Fill} style Style.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writePolyStyle_ = function(node, style, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.POLY_STYLE_SERIALIZERS_,
+      ol.format.KML.COLOR_NODE_FACTORY_, [style.getColor()], objectStack);
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the scale to.
+ * @param {number|undefined} scale Scale.
+ * @private
+ */
+ol.format.KML.writeScaleTextNode_ = function(node, scale) {
+  ol.format.XSD.writeDecimalTextNode(node, scale * scale);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.style.Style} style Style.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.KML.writeStyle_ = function(node, style, objectStack) {
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: node};
+  var properties = {};
+  var fillStyle = style.getFill();
+  var strokeStyle = style.getStroke();
+  var imageStyle = style.getImage();
+  var textStyle = style.getText();
+  if (!goog.isNull(imageStyle)) {
+    goog.object.set(properties, 'IconStyle', imageStyle);
+  }
+  if (!goog.isNull(textStyle)) {
+    goog.object.set(properties, 'LabelStyle', textStyle);
+  }
+  if (!goog.isNull(strokeStyle)) {
+    goog.object.set(properties, 'LineStyle', strokeStyle);
+  }
+  if (!goog.isNull(fillStyle)) {
+    goog.object.set(properties, 'PolyStyle', fillStyle);
+  }
+  var parentNode = objectStack[objectStack.length - 1].node;
+  var orderedKeys = ol.format.KML.STYLE_SEQUENCE_[parentNode.namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.STYLE_SERIALIZERS_,
+      ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, objectStack, orderedKeys);
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the Vec2 to.
+ * @param {ol.format.KMLVec2_} vec2 Vec2.
+ * @private
+ */
+ol.format.KML.writeVec2_ = function(node, vec2) {
+  node.setAttribute('x', vec2.x);
+  node.setAttribute('y', vec2.y);
+  node.setAttribute('xunits', vec2.xunits);
+  node.setAttribute('yunits', vec2.yunits);
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.KML.KML_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, [
+      'Document', 'Placemark'
+    ]);
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.KML_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'Document': ol.xml.makeChildAppender(ol.format.KML.writeDocument_),
+      'Placemark': ol.xml.makeChildAppender(ol.format.KML.writePlacemark_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.DOCUMENT_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'Placemark': ol.xml.makeChildAppender(ol.format.KML.writePlacemark_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, string>}
+ * @private
+ */
+ol.format.KML.GEOMETRY_TYPE_TO_NODENAME_ = {
+  'Point': 'Point',
+  'LineString': 'LineString',
+  'LinearRing': 'LinearRing',
+  'Polygon': 'Polygon',
+  'MultiPoint': 'MultiGeometry',
+  'MultiLineString': 'MultiGeometry',
+  'MultiPolygon': 'MultiGeometry'
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.KML.ICON_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, [
+      'href'
+    ],
+    ol.xml.makeStructureNS(
+        ol.format.KML.GX_NAMESPACE_URIS_, [
+          'x', 'y', 'w', 'h'
+    ]));
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.ICON_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'href': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode)
+    }, ol.xml.makeStructureNS(
+        ol.format.KML.GX_NAMESPACE_URIS_, {
+          'x': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+          'y': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+          'w': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+          'h': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode)
+        }));
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.KML.ICON_STYLE_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, [
+      'scale', 'heading', 'Icon', 'hotSpot'
+    ]);
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.ICON_STYLE_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'Icon': ol.xml.makeChildAppender(ol.format.KML.writeIcon_),
+      'heading': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode),
+      'hotSpot': ol.xml.makeChildAppender(ol.format.KML.writeVec2_),
+      'scale': ol.xml.makeChildAppender(ol.format.KML.writeScaleTextNode_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.KML.LABEL_STYLE_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, [
+      'color', 'scale'
+    ]);
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.LABEL_STYLE_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'color': ol.xml.makeChildAppender(ol.format.KML.writeColorTextNode_),
+      'scale': ol.xml.makeChildAppender(ol.format.KML.writeScaleTextNode_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.KML.LINE_STYLE_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, [
+      'color', 'width'
+    ]);
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.LINE_STYLE_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'color': ol.xml.makeChildAppender(ol.format.KML.writeColorTextNode_),
+      'width': ol.xml.makeChildAppender(ol.format.XSD.writeDecimalTextNode)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.BOUNDARY_IS_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'LinearRing': ol.xml.makeChildAppender(
+          ol.format.KML.writePrimitiveGeometry_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.MULTI_GEOMETRY_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'LineString': ol.xml.makeChildAppender(
+          ol.format.KML.writePrimitiveGeometry_),
+      'Point': ol.xml.makeChildAppender(
+          ol.format.KML.writePrimitiveGeometry_),
+      'Polygon': ol.xml.makeChildAppender(ol.format.KML.writePolygon_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.KML.PLACEMARK_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, [
+      'name', 'open', 'visibility', 'address', 'phoneNumber', 'description',
+      'styleUrl', 'Style'
+    ]);
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.PLACEMARK_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'MultiGeometry': ol.xml.makeChildAppender(
+          ol.format.KML.writeMultiGeometry_),
+      'LineString': ol.xml.makeChildAppender(
+          ol.format.KML.writePrimitiveGeometry_),
+      'LinearRing': ol.xml.makeChildAppender(
+          ol.format.KML.writePrimitiveGeometry_),
+      'Point': ol.xml.makeChildAppender(
+          ol.format.KML.writePrimitiveGeometry_),
+      'Polygon': ol.xml.makeChildAppender(ol.format.KML.writePolygon_),
+      'Style': ol.xml.makeChildAppender(ol.format.KML.writeStyle_),
+      'address': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'description': ol.xml.makeChildAppender(
+          ol.format.XSD.writeStringTextNode),
+      'name': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'open': ol.xml.makeChildAppender(ol.format.XSD.writeBooleanTextNode),
+      'phoneNumber': ol.xml.makeChildAppender(
+          ol.format.XSD.writeStringTextNode),
+      'styleUrl': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode),
+      'visibility': ol.xml.makeChildAppender(
+          ol.format.XSD.writeBooleanTextNode)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.PRIMITIVE_GEOMETRY_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'coordinates': ol.xml.makeChildAppender(
+          ol.format.KML.writeCoordinatesTextNode_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.POLYGON_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'outerBoundaryIs': ol.xml.makeChildAppender(
+          ol.format.KML.writeBoundaryIs_),
+      'innerBoundaryIs': ol.xml.makeChildAppender(
+          ol.format.KML.writeBoundaryIs_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.POLY_STYLE_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'color': ol.xml.makeChildAppender(ol.format.KML.writeColorTextNode_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Array.<string>>}
+ * @private
+ */
+ol.format.KML.STYLE_SEQUENCE_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, [
+      'IconStyle', 'LabelStyle', 'LineStyle', 'PolyStyle'
+    ]);
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.KML.STYLE_SERIALIZERS_ = ol.xml.makeStructureNS(
+    ol.format.KML.NAMESPACE_URIS_, {
+      'IconStyle': ol.xml.makeChildAppender(ol.format.KML.writeIconStyle_),
+      'LabelStyle': ol.xml.makeChildAppender(ol.format.KML.writeLabelStyle_),
+      'LineStyle': ol.xml.makeChildAppender(ol.format.KML.writeLineStyle_),
+      'PolyStyle': ol.xml.makeChildAppender(ol.format.KML.writePolyStyle_)
+    });
+
+
+/**
+ * @const
+ * @param {*} value Value.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {string=} opt_nodeName Node name.
+ * @return {Node|undefined} Node.
+ * @private
+ */
+ol.format.KML.GX_NODE_FACTORY_ = function(value, objectStack, opt_nodeName) {
+  return ol.xml.createElementNS(ol.format.KML.GX_NAMESPACE_URIS_[0],
+      'gx:' + opt_nodeName);
+};
+
+
+/**
+ * @const
+ * @param {*} value Value.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {string=} opt_nodeName Node name.
+ * @return {Node|undefined} Node.
+ * @private
+ */
+ol.format.KML.DOCUMENT_NODE_FACTORY_ = function(value, objectStack,
+    opt_nodeName) {
+  goog.asserts.assertInstanceof(value, ol.Feature);
+  var parentNode = objectStack[objectStack.length - 1].node;
+  goog.asserts.assert(ol.xml.isNode(parentNode));
+  return ol.xml.createElementNS(parentNode.namespaceURI, 'Placemark');
+};
+
+
+/**
+ * @const
+ * @param {*} value Value.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {string=} opt_nodeName Node name.
+ * @return {Node|undefined} Node.
+ * @private
+ */
+ol.format.KML.GEOMETRY_NODE_FACTORY_ = function(value, objectStack,
+    opt_nodeName) {
+  if (goog.isDefAndNotNull(value)) {
+    goog.asserts.assertInstanceof(value, ol.geom.Geometry);
+    var parentNode = objectStack[objectStack.length - 1].node;
+    goog.asserts.assert(ol.xml.isNode(parentNode));
+    return ol.xml.createElementNS(parentNode.namespaceURI,
+        ol.format.KML.GEOMETRY_TYPE_TO_NODENAME_[value.getType()]);
+  }
+};
+
+
+/**
+ * A factory for creating coordinates nodes.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ * @private
+ */
+ol.format.KML.COLOR_NODE_FACTORY_ = ol.xml.makeSimpleNodeFactory('color');
+
+
+/**
+ * A factory for creating coordinates nodes.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ * @private
+ */
+ol.format.KML.COORDINATES_NODE_FACTORY_ =
+    ol.xml.makeSimpleNodeFactory('coordinates');
+
+
+/**
+ * A factory for creating innerBoundaryIs nodes.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ * @private
+ */
+ol.format.KML.INNER_BOUNDARY_NODE_FACTORY_ =
+    ol.xml.makeSimpleNodeFactory('innerBoundaryIs');
+
+
+/**
+ * A factory for creating Point nodes.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ * @private
+ */
+ol.format.KML.POINT_NODE_FACTORY_ =
+    ol.xml.makeSimpleNodeFactory('Point');
+
+
+/**
+ * A factory for creating LineString nodes.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ * @private
+ */
+ol.format.KML.LINE_STRING_NODE_FACTORY_ =
+    ol.xml.makeSimpleNodeFactory('LineString');
+
+
+/**
+ * A factory for creating LinearRing nodes.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ * @private
+ */
+ol.format.KML.LINEAR_RING_NODE_FACTORY_ =
+    ol.xml.makeSimpleNodeFactory('LinearRing');
+
+
+/**
+ * A factory for creating Polygon nodes.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ * @private
+ */
+ol.format.KML.POLYGON_NODE_FACTORY_ =
+    ol.xml.makeSimpleNodeFactory('Polygon');
+
+
+/**
+ * A factory for creating outerBoundaryIs nodes.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ * @private
+ */
+ol.format.KML.OUTER_BOUNDARY_NODE_FACTORY_ =
+    ol.xml.makeSimpleNodeFactory('outerBoundaryIs');
+
+
+/**
+ * Encode an array of features in the KML format.
+ *
+ * @function
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {string} Result.
+ * @api stable
+ */
+ol.format.KML.prototype.writeFeatures;
+
+
+/**
+ * Encode an array of features in the KML format as an XML node.
+ *
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {Node} Node.
+ * @api
+ */
+ol.format.KML.prototype.writeFeaturesNode = function(features, opt_options) {
+  opt_options = this.adaptOptions(opt_options);
+  var kml = ol.xml.createElementNS(ol.format.KML.NAMESPACE_URIS_[4], 'kml');
+  var xmlnsUri = 'http://www.w3.org/2000/xmlns/';
+  var xmlSchemaInstanceUri = 'http://www.w3.org/2001/XMLSchema-instance';
+  ol.xml.setAttributeNS(kml, xmlnsUri, 'xmlns:gx',
+      ol.format.KML.GX_NAMESPACE_URIS_[0]);
+  ol.xml.setAttributeNS(kml, xmlnsUri, 'xmlns:xsi', xmlSchemaInstanceUri);
+  ol.xml.setAttributeNS(kml, xmlSchemaInstanceUri, 'xsi:schemaLocation',
+      ol.format.KML.SCHEMA_LOCATION_);
+
+  var /** @type {ol.xml.NodeStackItem} */ context = {node: kml};
+  var properties = {};
+  if (features.length > 1) {
+    goog.object.set(properties, 'Document', features);
+  } else if (features.length == 1) {
+    goog.object.set(properties, 'Placemark', features[0]);
+  }
+  var orderedKeys = ol.format.KML.KML_SEQUENCE_[kml.namespaceURI];
+  var values = ol.xml.makeSequence(properties, orderedKeys);
+  ol.xml.pushSerializeAndPop(context, ol.format.KML.KML_SERIALIZERS_,
+      ol.xml.OBJECT_PROPERTY_NODE_FACTORY, values, [opt_options], orderedKeys);
+  return kml;
+};
diff --git a/src/ol/format/osmxmlformat.js b/src/ol/format/osmxmlformat.js
new file mode 100644
index 0000000..ebc332d
--- /dev/null
+++ b/src/ol/format/osmxmlformat.js
@@ -0,0 +1,252 @@
+// FIXME add typedef for stack state objects
+goog.provide('ol.format.OSMXML');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('ol.Feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.XMLFeature');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.proj');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading data in the
+ * [OSMXML format](http://wiki.openstreetmap.org/wiki/OSM_XML).
+ *
+ * @constructor
+ * @extends {ol.format.XMLFeature}
+ * @api stable
+ */
+ol.format.OSMXML = function() {
+  goog.base(this);
+
+  /**
+   * @inheritDoc
+   */
+  this.defaultDataProjection = ol.proj.get('EPSG:4326');
+};
+goog.inherits(ol.format.OSMXML, ol.format.XMLFeature);
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ * @private
+ */
+ol.format.OSMXML.EXTENSIONS_ = ['.osm'];
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.OSMXML.prototype.getExtensions = function() {
+  return ol.format.OSMXML.EXTENSIONS_;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.OSMXML.readNode_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'node');
+  var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
+  var state = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+  var id = node.getAttribute('id');
+  var coordinates = /** @type {Array.<number>} */ ([
+    parseFloat(node.getAttribute('lon')),
+    parseFloat(node.getAttribute('lat'))
+  ]);
+  goog.object.set(state.nodes, id, coordinates);
+
+  var values = ol.xml.pushParseAndPop({
+    tags: {}
+  }, ol.format.OSMXML.NODE_PARSERS_, node, objectStack);
+  if (!goog.object.isEmpty(values.tags)) {
+    var geometry = new ol.geom.Point(coordinates);
+    ol.format.Feature.transformWithOptions(geometry, false, options);
+    var feature = new ol.Feature(geometry);
+    feature.setId(id);
+    feature.setProperties(values.tags);
+    state.features.push(feature);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.OSMXML.readWay_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'way');
+  var options = /** @type {olx.format.ReadOptions} */ (objectStack[0]);
+  var id = node.getAttribute('id');
+  var values = ol.xml.pushParseAndPop({
+    ndrefs: [],
+    tags: {}
+  }, ol.format.OSMXML.WAY_PARSERS_, node, objectStack);
+  var state = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+  var flatCoordinates = /** @type {Array.<number>} */ ([]);
+  for (var i = 0, ii = values.ndrefs.length; i < ii; i++) {
+    var point = goog.object.get(state.nodes, values.ndrefs[i]);
+    goog.array.extend(flatCoordinates, point);
+  }
+  var geometry;
+  if (values.ndrefs[0] == values.ndrefs[values.ndrefs.length - 1]) {
+    // closed way
+    geometry = new ol.geom.Polygon(null);
+    geometry.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates,
+        [flatCoordinates.length]);
+  } else {
+    geometry = new ol.geom.LineString(null);
+    geometry.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates);
+  }
+  ol.format.Feature.transformWithOptions(geometry, false, options);
+  var feature = new ol.Feature(geometry);
+  feature.setId(id);
+  feature.setProperties(values.tags);
+  state.features.push(feature);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.Feature|undefined} Track.
+ */
+ol.format.OSMXML.readNd_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'nd');
+  var values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+  values.ndrefs.push(node.getAttribute('ref'));
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {ol.Feature|undefined} Track.
+ */
+ol.format.OSMXML.readTag_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'tag');
+  var values = /** @type {Object} */ (objectStack[objectStack.length - 1]);
+  goog.object.set(values.tags, node.getAttribute('k'), node.getAttribute('v'));
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Array.<string>}
+ */
+ol.format.OSMXML.NAMESPACE_URIS_ = [
+  null
+];
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OSMXML.WAY_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OSMXML.NAMESPACE_URIS_, {
+      'nd': ol.format.OSMXML.readNd_,
+      'tag': ol.format.OSMXML.readTag_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OSMXML.PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OSMXML.NAMESPACE_URIS_, {
+      'node': ol.format.OSMXML.readNode_,
+      'way': ol.format.OSMXML.readWay_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OSMXML.NODE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OSMXML.NAMESPACE_URIS_, {
+      'tag': ol.format.OSMXML.readTag_
+    });
+
+
+/**
+ * Read all features from an OSM source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.OSMXML.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.OSMXML.prototype.readFeaturesFromNode = function(node, opt_options) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  var options = this.getReadOptions(node, opt_options);
+  if (node.localName == 'osm') {
+    var state = ol.xml.pushParseAndPop({
+      nodes: {},
+      features: []
+    }, ol.format.OSMXML.PARSERS_, node, [options]);
+    if (goog.isDef(state.features)) {
+      return state.features;
+    }
+  }
+  return [];
+};
+
+
+/**
+ * Read the projection from an OSM source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.proj.Projection} Projection.
+ * @api stable
+ */
+ol.format.OSMXML.prototype.readProjection;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.OSMXML.prototype.readProjectionFromDocument = function(doc) {
+  return this.defaultDataProjection;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.OSMXML.prototype.readProjectionFromNode = function(node) {
+  return this.defaultDataProjection;
+};
diff --git a/src/ol/format/owsformat.js b/src/ol/format/owsformat.js
new file mode 100644
index 0000000..5a4e5d4
--- /dev/null
+++ b/src/ol/format/owsformat.js
@@ -0,0 +1,502 @@
+goog.provide('ol.format.OWS');
+
+goog.require('goog.asserts');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('ol.format.XLink');
+goog.require('ol.format.XML');
+goog.require('ol.format.XSD');
+goog.require('ol.xml');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.format.XML}
+ */
+ol.format.OWS = function() {
+  goog.base(this);
+};
+goog.inherits(ol.format.OWS, ol.format.XML);
+
+
+/**
+ * @param {Document} doc Document.
+ * @return {Object} OWS object.
+ */
+ol.format.OWS.prototype.readFromDocument = function(doc) {
+  goog.asserts.assert(doc.nodeType == goog.dom.NodeType.DOCUMENT);
+  for (var n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) {
+    if (n.nodeType == goog.dom.NodeType.ELEMENT) {
+      return this.readFromNode(n);
+    }
+  }
+  return null;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {Object} OWS object.
+ */
+ol.format.OWS.prototype.readFromNode = function(node) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  var owsObject = ol.xml.pushParseAndPop({},
+      ol.format.OWS.PARSERS_, node, []);
+  return goog.isDef(owsObject) ? owsObject : null;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readAddress_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Address');
+  return ol.xml.pushParseAndPop({},
+      ol.format.OWS.ADDRESS_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readAllowedValues_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'AllowedValues');
+  return ol.xml.pushParseAndPop({},
+      ol.format.OWS.ALLOWED_VALUES_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readConstraint_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Constraint');
+  var object = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(object));
+  var name = node.getAttribute('name');
+  var value = ol.xml.pushParseAndPop({},
+      ol.format.OWS.CONSTRAINT_PARSERS_, node,
+      objectStack);
+  if (!goog.isDef(value)) {
+    return undefined;
+  }
+  if (!goog.isDef(object.constraints)) {
+    object.constraints = {};
+  }
+  object.constraints[name] = value;
+
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readContactInfo_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'ContactInfo');
+  return ol.xml.pushParseAndPop({},
+      ol.format.OWS.CONTACT_INFO_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readDcp_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'DCP');
+  return ol.xml.pushParseAndPop({},
+      ol.format.OWS.DCP_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readGet_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Get');
+  var object = objectStack[objectStack.length - 1];
+  var url = ol.format.XLink.readHref(node);
+  goog.asserts.assert(goog.isObject(object));
+  var value = ol.xml.pushParseAndPop({'url': url},
+      ol.format.OWS.REQUEST_METHOD_PARSERS_, node, objectStack);
+  if (!goog.isDef(value)) {
+    return undefined;
+  }
+  var get = goog.object.get(object, 'get');
+  if (!goog.isDef(get)) {
+    goog.object.set(object, 'get', [value]);
+  }else {
+    goog.asserts.assert(goog.isArray(get));
+    get.push(value);
+  }
+
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readHttp_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'HTTP');
+  return ol.xml.pushParseAndPop({}, ol.format.OWS.HTTP_PARSERS_,
+      node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readOperation_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Operation');
+  var name = node.getAttribute('name');
+  var value = ol.xml.pushParseAndPop({},
+      ol.format.OWS.OPERATION_PARSERS_, node, objectStack);
+  if (!goog.isDef(value)) {
+    return undefined;
+  }
+  var object = /** @type {Object} */
+      (objectStack[objectStack.length - 1]);
+  goog.asserts.assert(goog.isObject(object));
+  goog.object.set(object, name, value);
+
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readOperationsMetadata_ = function(node,
+    objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'OperationsMetadata');
+  return ol.xml.pushParseAndPop({},
+      ol.format.OWS.OPERATIONS_METADATA_PARSERS_, node,
+      objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readPhone_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Phone');
+  return ol.xml.pushParseAndPop({},
+      ol.format.OWS.PHONE_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readServiceIdentification_ = function(node,
+    objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'ServiceIdentification');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.OWS.SERVICE_IDENTIFICATION_PARSERS_, node,
+      objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readServiceContact_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'ServiceContact');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.OWS.SERVICE_CONTACT_PARSERS_, node,
+      objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readServiceProvider_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'ServiceProvider');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.OWS.SERVICE_PROVIDER_PARSERS_, node,
+      objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined}
+ */
+ol.format.OWS.readValue_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Value');
+  var object = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(object));
+  var key = ol.format.XSD.readString(node);
+  if (!goog.isDef(key)) {
+    return undefined;
+  }
+  goog.object.set(object, key, true);
+};
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ * @private
+ */
+ol.format.OWS.NAMESPACE_URIS_ = [
+  null,
+  'http://www.opengis.net/ows/1.1'
+];
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'ServiceIdentification': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readServiceIdentification_,
+          'serviceIdentification'),
+      'ServiceProvider': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readServiceProvider_,
+          'serviceProvider'),
+      'OperationsMetadata': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readOperationsMetadata_,
+          'operationsMetadata')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.ADDRESS_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'DeliveryPoint': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString, 'deliveryPoint'),
+      'City': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString,
+          'city'),
+      'AdministrativeArea': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString, 'administrativeArea'),
+      'PostalCode': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString,
+          'postalCode'),
+      'Country': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString, 'country'),
+      'ElectronicMailAddress': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString, 'electronicMailAddress')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.ALLOWED_VALUES_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'Value': ol.format.OWS.readValue_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.CONSTRAINT_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'AllowedValues': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readAllowedValues_, 'allowedValues'
+      )
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.CONTACT_INFO_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'Phone': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readPhone_, 'phone'),
+      'Address': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readAddress_, 'address')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.DCP_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'HTTP': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readHttp_, 'http')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.HTTP_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'Get': ol.format.OWS.readGet_,
+      'Post': undefined // TODO
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.OPERATION_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'DCP': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readDcp_, 'dcp')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.OPERATIONS_METADATA_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'Operation': ol.format.OWS.readOperation_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.PHONE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'Voice': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString,
+          'voice'),
+      'Facsimile': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString,
+          'facsimile')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.REQUEST_METHOD_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'Constraint': ol.format.OWS.readConstraint_
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.SERVICE_CONTACT_PARSERS_ =
+    ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'IndividualName': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString, 'individualName'),
+      'PositionName': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString,
+          'positionName'),
+      'ContactInfo': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readContactInfo_, 'contactInfo')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.SERVICE_IDENTIFICATION_PARSERS_ =
+    ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'Title': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString,
+          'title'),
+      'ServiceTypeVersion': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString, 'serviceTypeVersion'),
+      'ServiceType': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString, 'serviceType')
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.OWS.SERVICE_PROVIDER_PARSERS_ =
+    ol.xml.makeParsersNS(
+    ol.format.OWS.NAMESPACE_URIS_, {
+      'ProviderName': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString,
+          'providerName'),
+      'ProviderSite': ol.xml.makeObjectPropertySetter(ol.format.XLink.readHref,
+          'providerSite'),
+      'ServiceContact': ol.xml.makeObjectPropertySetter(
+          ol.format.OWS.readServiceContact_, 'serviceContact')
+    });
diff --git a/src/ol/format/polylineformat.js b/src/ol/format/polylineformat.js
new file mode 100644
index 0000000..cab6513
--- /dev/null
+++ b/src/ol/format/polylineformat.js
@@ -0,0 +1,401 @@
+goog.provide('ol.format.Polyline');
+
+goog.require('goog.asserts');
+goog.require('ol.Feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.TextFeature');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.flat.flip');
+goog.require('ol.geom.flat.inflate');
+goog.require('ol.proj');
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the Encoded
+ * Polyline Algorithm Format.
+ *
+ * @constructor
+ * @extends {ol.format.TextFeature}
+ * @param {olx.format.PolylineOptions=} opt_options
+ *     Optional configuration object.
+ * @api stable
+ */
+ol.format.Polyline = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this);
+
+  /**
+   * @inheritDoc
+   */
+  this.defaultDataProjection = ol.proj.get('EPSG:4326');
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.factor_ = goog.isDef(options.factor) ? options.factor : 1e5;
+};
+goog.inherits(ol.format.Polyline, ol.format.TextFeature);
+
+
+/**
+ * Encode a list of n-dimensional points and return an encoded string
+ *
+ * Attention: This function will modify the passed array!
+ *
+ * @param {Array.<number>} numbers A list of n-dimensional points.
+ * @param {number} stride The number of dimension of the points in the list.
+ * @param {number=} opt_factor The factor by which the numbers will be
+ *     multiplied. The remaining decimal places will get rounded away.
+ *     Default is `1e5`.
+ * @return {string} The encoded string.
+ * @api
+ */
+ol.format.Polyline.encodeDeltas = function(numbers, stride, opt_factor) {
+  var factor = goog.isDef(opt_factor) ? opt_factor : 1e5;
+  var d;
+
+  var lastNumbers = new Array(stride);
+  for (d = 0; d < stride; ++d) {
+    lastNumbers[d] = 0;
+  }
+
+  var i, ii;
+  for (i = 0, ii = numbers.length; i < ii;) {
+    for (d = 0; d < stride; ++d, ++i) {
+      var num = numbers[i];
+      var delta = num - lastNumbers[d];
+      lastNumbers[d] = num;
+
+      numbers[i] = delta;
+    }
+  }
+
+  return ol.format.Polyline.encodeFloats(numbers, factor);
+};
+
+
+/**
+ * Decode a list of n-dimensional points from an encoded string
+ *
+ * @param {string} encoded An encoded string.
+ * @param {number} stride The number of dimension of the points in the
+ *     encoded string.
+ * @param {number=} opt_factor The factor by which the resulting numbers will
+ *     be divided. Default is `1e5`.
+ * @return {Array.<number>} A list of n-dimensional points.
+ * @api
+ */
+ol.format.Polyline.decodeDeltas = function(encoded, stride, opt_factor) {
+  var factor = goog.isDef(opt_factor) ? opt_factor : 1e5;
+  var d;
+
+  /** @type {Array.<number>} */
+  var lastNumbers = new Array(stride);
+  for (d = 0; d < stride; ++d) {
+    lastNumbers[d] = 0;
+  }
+
+  var numbers = ol.format.Polyline.decodeFloats(encoded, factor);
+
+  var i, ii;
+  for (i = 0, ii = numbers.length; i < ii;) {
+    for (d = 0; d < stride; ++d, ++i) {
+      lastNumbers[d] += numbers[i];
+
+      numbers[i] = lastNumbers[d];
+    }
+  }
+
+  return numbers;
+};
+
+
+/**
+ * Encode a list of floating point numbers and return an encoded string
+ *
+ * Attention: This function will modify the passed array!
+ *
+ * @param {Array.<number>} numbers A list of floating point numbers.
+ * @param {number=} opt_factor The factor by which the numbers will be
+ *     multiplied. The remaining decimal places will get rounded away.
+ *     Default is `1e5`.
+ * @return {string} The encoded string.
+ * @api
+ */
+ol.format.Polyline.encodeFloats = function(numbers, opt_factor) {
+  var factor = goog.isDef(opt_factor) ? opt_factor : 1e5;
+  var i, ii;
+  for (i = 0, ii = numbers.length; i < ii; ++i) {
+    numbers[i] = Math.round(numbers[i] * factor);
+  }
+
+  return ol.format.Polyline.encodeSignedIntegers(numbers);
+};
+
+
+/**
+ * Decode a list of floating point numbers from an encoded string
+ *
+ * @param {string} encoded An encoded string.
+ * @param {number=} opt_factor The factor by which the result will be divided.
+ *     Default is `1e5`.
+ * @return {Array.<number>} A list of floating point numbers.
+ * @api
+ */
+ol.format.Polyline.decodeFloats = function(encoded, opt_factor) {
+  var factor = goog.isDef(opt_factor) ? opt_factor : 1e5;
+  var numbers = ol.format.Polyline.decodeSignedIntegers(encoded);
+  var i, ii;
+  for (i = 0, ii = numbers.length; i < ii; ++i) {
+    numbers[i] /= factor;
+  }
+  return numbers;
+};
+
+
+/**
+ * Encode a list of signed integers and return an encoded string
+ *
+ * Attention: This function will modify the passed array!
+ *
+ * @param {Array.<number>} numbers A list of signed integers.
+ * @return {string} The encoded string.
+ */
+ol.format.Polyline.encodeSignedIntegers = function(numbers) {
+  var i, ii;
+  for (i = 0, ii = numbers.length; i < ii; ++i) {
+    var num = numbers[i];
+    numbers[i] = (num < 0) ? ~(num << 1) : (num << 1);
+  }
+  return ol.format.Polyline.encodeUnsignedIntegers(numbers);
+};
+
+
+/**
+ * Decode a list of signed integers from an encoded string
+ *
+ * @param {string} encoded An encoded string.
+ * @return {Array.<number>} A list of signed integers.
+ */
+ol.format.Polyline.decodeSignedIntegers = function(encoded) {
+  var numbers = ol.format.Polyline.decodeUnsignedIntegers(encoded);
+  var i, ii;
+  for (i = 0, ii = numbers.length; i < ii; ++i) {
+    var num = numbers[i];
+    numbers[i] = (num & 1) ? ~(num >> 1) : (num >> 1);
+  }
+  return numbers;
+};
+
+
+/**
+ * Encode a list of unsigned integers and return an encoded string
+ *
+ * @param {Array.<number>} numbers A list of unsigned integers.
+ * @return {string} The encoded string.
+ */
+ol.format.Polyline.encodeUnsignedIntegers = function(numbers) {
+  var encoded = '';
+  var i, ii;
+  for (i = 0, ii = numbers.length; i < ii; ++i) {
+    encoded += ol.format.Polyline.encodeUnsignedInteger(numbers[i]);
+  }
+  return encoded;
+};
+
+
+/**
+ * Decode a list of unsigned integers from an encoded string
+ *
+ * @param {string} encoded An encoded string.
+ * @return {Array.<number>} A list of unsigned integers.
+ */
+ol.format.Polyline.decodeUnsignedIntegers = function(encoded) {
+  var numbers = [];
+  var current = 0;
+  var shift = 0;
+  var i, ii;
+  for (i = 0, ii = encoded.length; i < ii; ++i) {
+    var b = encoded.charCodeAt(i) - 63;
+    current |= (b & 0x1f) << shift;
+    if (b < 0x20) {
+      numbers.push(current);
+      current = 0;
+      shift = 0;
+    } else {
+      shift += 5;
+    }
+  }
+  return numbers;
+};
+
+
+/**
+ * Encode one single unsigned integer and return an encoded string
+ *
+ * @param {number} num Unsigned integer that should be encoded.
+ * @return {string} The encoded string.
+ */
+ol.format.Polyline.encodeUnsignedInteger = function(num) {
+  var value, encoded = '';
+  while (num >= 0x20) {
+    value = (0x20 | (num & 0x1f)) + 63;
+    encoded += String.fromCharCode(value);
+    num >>= 5;
+  }
+  value = num + 63;
+  encoded += String.fromCharCode(value);
+  return encoded;
+};
+
+
+/**
+ * Read the feature from the Polyline source. The coordinates are assumed to be
+ * in two dimensions and in latitude, longitude order.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.Feature} Feature.
+ * @api stable
+ */
+ol.format.Polyline.prototype.readFeature;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.Polyline.prototype.readFeatureFromText = function(text, opt_options) {
+  var geometry = this.readGeometryFromText(text, opt_options);
+  return new ol.Feature(geometry);
+};
+
+
+/**
+ * Read the feature from the source. As Polyline sources contain a single
+ * feature, this will return the feature in an array.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.Polyline.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.Polyline.prototype.readFeaturesFromText =
+    function(text, opt_options) {
+  var feature = this.readFeatureFromText(text, opt_options);
+  return [feature];
+};
+
+
+/**
+ * Read the geometry from the source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.geom.Geometry} Geometry.
+ * @api stable
+ */
+ol.format.Polyline.prototype.readGeometry;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.Polyline.prototype.readGeometryFromText =
+    function(text, opt_options) {
+  var flatCoordinates = ol.format.Polyline.decodeDeltas(text, 2, this.factor_);
+  ol.geom.flat.flip.flipXY(
+      flatCoordinates, 0, flatCoordinates.length, 2, flatCoordinates);
+  var coordinates = ol.geom.flat.inflate.coordinates(
+      flatCoordinates, 0, flatCoordinates.length, 2);
+
+  return /** @type {ol.geom.Geometry} */ (
+      ol.format.Feature.transformWithOptions(
+          new ol.geom.LineString(coordinates), false,
+          this.adaptOptions(opt_options)));
+};
+
+
+/**
+ * Read the projection from a Polyline source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.proj.Projection} Projection.
+ * @api stable
+ */
+ol.format.Polyline.prototype.readProjection;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.Polyline.prototype.readProjectionFromText = function(text) {
+  return this.defaultDataProjection;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.Polyline.prototype.writeFeatureText = function(feature, opt_options) {
+  var geometry = feature.getGeometry();
+  if (goog.isDefAndNotNull(geometry)) {
+    return this.writeGeometryText(geometry, opt_options);
+  } else {
+    goog.asserts.fail();
+    return '';
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.Polyline.prototype.writeFeaturesText =
+    function(features, opt_options) {
+  goog.asserts.assert(features.length == 1);
+  return this.writeFeatureText(features[0], opt_options);
+};
+
+
+/**
+ * Write a single geometry in Polyline format.
+ *
+ * @function
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {string} Geometry.
+ * @api stable
+ */
+ol.format.Polyline.prototype.writeGeometry;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.Polyline.prototype.writeGeometryText =
+    function(geometry, opt_options) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+  geometry = /** @type {ol.geom.LineString} */
+      (ol.format.Feature.transformWithOptions(
+          geometry, true, this.adaptOptions(opt_options)));
+  var flatCoordinates = geometry.getFlatCoordinates();
+  var stride = geometry.getStride();
+  ol.geom.flat.flip.flipXY(
+      flatCoordinates, 0, flatCoordinates.length, stride, flatCoordinates);
+  return ol.format.Polyline.encodeDeltas(flatCoordinates, stride, this.factor_);
+};
diff --git a/src/ol/format/textfeatureformat.js b/src/ol/format/textfeatureformat.js
new file mode 100644
index 0000000..c838c1a
--- /dev/null
+++ b/src/ol/format/textfeatureformat.js
@@ -0,0 +1,167 @@
+goog.provide('ol.format.TextFeature');
+
+goog.require('goog.asserts');
+goog.require('ol.format.Feature');
+goog.require('ol.format.FormatType');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for text feature formats.
+ *
+ * @constructor
+ * @extends {ol.format.Feature}
+ */
+ol.format.TextFeature = function() {
+  goog.base(this);
+};
+goog.inherits(ol.format.TextFeature, ol.format.Feature);
+
+
+/**
+ * @param {Document|Node|Object|string} source Source.
+ * @private
+ * @return {string} Text.
+ */
+ol.format.TextFeature.prototype.getText_ = function(source) {
+  if (goog.isString(source)) {
+    return source;
+  } else {
+    goog.asserts.fail();
+    return '';
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TextFeature.prototype.getType = function() {
+  return ol.format.FormatType.TEXT;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TextFeature.prototype.readFeature = function(source, opt_options) {
+  return this.readFeatureFromText(
+      this.getText_(source), this.adaptOptions(opt_options));
+};
+
+
+/**
+ * @param {string} text Text.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @protected
+ * @return {ol.Feature} Feature.
+ */
+ol.format.TextFeature.prototype.readFeatureFromText = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TextFeature.prototype.readFeatures = function(source, opt_options) {
+  return this.readFeaturesFromText(
+      this.getText_(source), this.adaptOptions(opt_options));
+};
+
+
+/**
+ * @param {string} text Text.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @protected
+ * @return {Array.<ol.Feature>} Features.
+ */
+ol.format.TextFeature.prototype.readFeaturesFromText = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TextFeature.prototype.readGeometry = function(source, opt_options) {
+  return this.readGeometryFromText(
+      this.getText_(source), this.adaptOptions(opt_options));
+};
+
+
+/**
+ * @param {string} text Text.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @protected
+ * @return {ol.geom.Geometry} Geometry.
+ */
+ol.format.TextFeature.prototype.readGeometryFromText = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TextFeature.prototype.readProjection = function(source) {
+  return this.readProjectionFromText(this.getText_(source));
+};
+
+
+/**
+ * @param {string} text Text.
+ * @protected
+ * @return {ol.proj.Projection} Projection.
+ */
+ol.format.TextFeature.prototype.readProjectionFromText = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TextFeature.prototype.writeFeature = function(feature, opt_options) {
+  return this.writeFeatureText(feature, this.adaptOptions(opt_options));
+};
+
+
+/**
+ * @param {ol.Feature} feature Features.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @protected
+ * @return {string} Text.
+ */
+ol.format.TextFeature.prototype.writeFeatureText = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TextFeature.prototype.writeFeatures = function(
+    features, opt_options) {
+  return this.writeFeaturesText(features, this.adaptOptions(opt_options));
+};
+
+
+/**
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @protected
+ * @return {string} Text.
+ */
+ol.format.TextFeature.prototype.writeFeaturesText = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TextFeature.prototype.writeGeometry = function(
+    geometry, opt_options) {
+  return this.writeGeometryText(geometry, this.adaptOptions(opt_options));
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @protected
+ * @return {string} Text.
+ */
+ol.format.TextFeature.prototype.writeGeometryText = goog.abstractMethod;
diff --git a/src/ol/format/topojsonformat.js b/src/ol/format/topojsonformat.js
new file mode 100644
index 0000000..2773f2e
--- /dev/null
+++ b/src/ol/format/topojsonformat.js
@@ -0,0 +1,409 @@
+goog.provide('ol.format.TopoJSON');
+
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('ol.Feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.JSONFeature');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.proj');
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the TopoJSON format.
+ *
+ * @constructor
+ * @extends {ol.format.JSONFeature}
+ * @param {olx.format.TopoJSONOptions=} opt_options Options.
+ * @api stable
+ */
+ol.format.TopoJSON = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this);
+
+  /**
+   * @inheritDoc
+   */
+  this.defaultDataProjection = ol.proj.get(
+      goog.isDefAndNotNull(options.defaultDataProjection) ?
+          options.defaultDataProjection : 'EPSG:4326');
+
+};
+goog.inherits(ol.format.TopoJSON, ol.format.JSONFeature);
+
+
+/**
+ * @const {Array.<string>}
+ * @private
+ */
+ol.format.TopoJSON.EXTENSIONS_ = ['.topojson'];
+
+
+/**
+ * Concatenate arcs into a coordinate array.
+ * @param {Array.<number>} indices Indices of arcs to concatenate.  Negative
+ *     values indicate arcs need to be reversed.
+ * @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs (already
+ *     transformed).
+ * @return {Array.<ol.Coordinate>} Coordinates array.
+ * @private
+ */
+ol.format.TopoJSON.concatenateArcs_ = function(indices, arcs) {
+  /** @type {Array.<ol.Coordinate>} */
+  var coordinates = [];
+  var index, arc;
+  var i, ii;
+  var j, jj;
+  for (i = 0, ii = indices.length; i < ii; ++i) {
+    index = indices[i];
+    if (i > 0) {
+      // splicing together arcs, discard last point
+      coordinates.pop();
+    }
+    if (index >= 0) {
+      // forward arc
+      arc = arcs[index];
+    } else {
+      // reverse arc
+      arc = arcs[~index].slice().reverse();
+    }
+    coordinates.push.apply(coordinates, arc);
+  }
+  // provide fresh copies of coordinate arrays
+  for (j = 0, jj = coordinates.length; j < jj; ++j) {
+    coordinates[j] = coordinates[j].slice();
+  }
+  return coordinates;
+};
+
+
+/**
+ * Create a point from a TopoJSON geometry object.
+ *
+ * @param {TopoJSONGeometry} object TopoJSON object.
+ * @param {Array.<number>} scale Scale for each dimension.
+ * @param {Array.<number>} translate Translation for each dimension.
+ * @return {ol.geom.Point} Geometry.
+ * @private
+ */
+ol.format.TopoJSON.readPointGeometry_ = function(object, scale, translate) {
+  var coordinates = object.coordinates;
+  if (!goog.isNull(scale) && !goog.isNull(translate)) {
+    ol.format.TopoJSON.transformVertex_(coordinates, scale, translate);
+  }
+  return new ol.geom.Point(coordinates);
+};
+
+
+/**
+ * Create a multi-point from a TopoJSON geometry object.
+ *
+ * @param {TopoJSONGeometry} object TopoJSON object.
+ * @param {Array.<number>} scale Scale for each dimension.
+ * @param {Array.<number>} translate Translation for each dimension.
+ * @return {ol.geom.MultiPoint} Geometry.
+ * @private
+ */
+ol.format.TopoJSON.readMultiPointGeometry_ = function(object, scale,
+    translate) {
+  var coordinates = object.coordinates;
+  var i, ii;
+  if (!goog.isNull(scale) && !goog.isNull(translate)) {
+    for (i = 0, ii = coordinates.length; i < ii; ++i) {
+      ol.format.TopoJSON.transformVertex_(coordinates[i], scale, translate);
+    }
+  }
+  return new ol.geom.MultiPoint(coordinates);
+};
+
+
+/**
+ * Create a linestring from a TopoJSON geometry object.
+ *
+ * @param {TopoJSONGeometry} object TopoJSON object.
+ * @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
+ * @return {ol.geom.LineString} Geometry.
+ * @private
+ */
+ol.format.TopoJSON.readLineStringGeometry_ = function(object, arcs) {
+  var coordinates = ol.format.TopoJSON.concatenateArcs_(object.arcs, arcs);
+  return new ol.geom.LineString(coordinates);
+};
+
+
+/**
+ * Create a multi-linestring from a TopoJSON geometry object.
+ *
+ * @param {TopoJSONGeometry} object TopoJSON object.
+ * @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
+ * @return {ol.geom.MultiLineString} Geometry.
+ * @private
+ */
+ol.format.TopoJSON.readMultiLineStringGeometry_ = function(object, arcs) {
+  var coordinates = [];
+  var i, ii;
+  for (i = 0, ii = object.arcs.length; i < ii; ++i) {
+    coordinates[i] = ol.format.TopoJSON.concatenateArcs_(object.arcs[i], arcs);
+  }
+  return new ol.geom.MultiLineString(coordinates);
+};
+
+
+/**
+ * Create a polygon from a TopoJSON geometry object.
+ *
+ * @param {TopoJSONGeometry} object TopoJSON object.
+ * @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
+ * @return {ol.geom.Polygon} Geometry.
+ * @private
+ */
+ol.format.TopoJSON.readPolygonGeometry_ = function(object, arcs) {
+  var coordinates = [];
+  var i, ii;
+  for (i = 0, ii = object.arcs.length; i < ii; ++i) {
+    coordinates[i] = ol.format.TopoJSON.concatenateArcs_(object.arcs[i], arcs);
+  }
+  return new ol.geom.Polygon(coordinates);
+};
+
+
+/**
+ * Create a multi-polygon from a TopoJSON geometry object.
+ *
+ * @param {TopoJSONGeometry} object TopoJSON object.
+ * @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
+ * @return {ol.geom.MultiPolygon} Geometry.
+ * @private
+ */
+ol.format.TopoJSON.readMultiPolygonGeometry_ = function(object, arcs) {
+  var coordinates = [];
+  var polyArray, ringCoords, j, jj;
+  var i, ii;
+  for (i = 0, ii = object.arcs.length; i < ii; ++i) {
+    // for each polygon
+    polyArray = object.arcs[i];
+    ringCoords = [];
+    for (j = 0, jj = polyArray.length; j < jj; ++j) {
+      // for each ring
+      ringCoords[j] = ol.format.TopoJSON.concatenateArcs_(polyArray[j], arcs);
+    }
+    coordinates[i] = ringCoords;
+  }
+  return new ol.geom.MultiPolygon(coordinates);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TopoJSON.prototype.getExtensions = function() {
+  return ol.format.TopoJSON.EXTENSIONS_;
+};
+
+
+/**
+ * Create features from a TopoJSON GeometryCollection object.
+ *
+ * @param {TopoJSONGeometryCollection} collection TopoJSON Geometry
+ *     object.
+ * @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
+ * @param {Array.<number>} scale Scale for each dimension.
+ * @param {Array.<number>} translate Translation for each dimension.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Array of features.
+ * @private
+ */
+ol.format.TopoJSON.readFeaturesFromGeometryCollection_ = function(
+    collection, arcs, scale, translate, opt_options) {
+  var geometries = collection.geometries;
+  var features = [];
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    features[i] = ol.format.TopoJSON.readFeatureFromGeometry_(
+        geometries[i], arcs, scale, translate, opt_options);
+  }
+  return features;
+};
+
+
+/**
+ * Create a feature from a TopoJSON geometry object.
+ *
+ * @param {TopoJSONGeometry} object TopoJSON geometry object.
+ * @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
+ * @param {Array.<number>} scale Scale for each dimension.
+ * @param {Array.<number>} translate Translation for each dimension.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.Feature} Feature.
+ * @private
+ */
+ol.format.TopoJSON.readFeatureFromGeometry_ = function(object, arcs,
+    scale, translate, opt_options) {
+  var geometry;
+  var type = object.type;
+  var geometryReader = ol.format.TopoJSON.GEOMETRY_READERS_[type];
+  goog.asserts.assert(goog.isDef(geometryReader));
+  if ((type === 'Point') || (type === 'MultiPoint')) {
+    geometry = geometryReader(object, scale, translate);
+  } else {
+    geometry = geometryReader(object, arcs);
+  }
+  var feature = new ol.Feature();
+  feature.setGeometry(/** @type {ol.geom.Geometry} */ (
+      ol.format.Feature.transformWithOptions(geometry, false, opt_options)));
+  if (goog.isDef(object.id)) {
+    feature.setId(object.id);
+  }
+  if (goog.isDef(object.properties)) {
+    feature.setProperties(object.properties);
+  }
+  return feature;
+};
+
+
+/**
+ * Read all features from a TopoJSON source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.TopoJSON.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.TopoJSON.prototype.readFeaturesFromObject = function(
+    object, opt_options) {
+  if (object.type == 'Topology') {
+    var topoJSONTopology = /** @type {TopoJSONTopology} */ (object);
+    var transform, scale = null, translate = null;
+    if (goog.isDef(topoJSONTopology.transform)) {
+      transform = /** @type {TopoJSONTransform} */
+          (topoJSONTopology.transform);
+      scale = transform.scale;
+      translate = transform.translate;
+    }
+    var arcs = topoJSONTopology.arcs;
+    if (goog.isDef(transform)) {
+      ol.format.TopoJSON.transformArcs_(arcs, scale, translate);
+    }
+    /** @type {Array.<ol.Feature>} */
+    var features = [];
+    var topoJSONFeatures = goog.object.getValues(topoJSONTopology.objects);
+    var i, ii;
+    var feature;
+    for (i = 0, ii = topoJSONFeatures.length; i < ii; ++i) {
+      if (topoJSONFeatures[i].type === 'GeometryCollection') {
+        feature = /** @type {TopoJSONGeometryCollection} */
+            (topoJSONFeatures[i]);
+        features.push.apply(features,
+            ol.format.TopoJSON.readFeaturesFromGeometryCollection_(
+                feature, arcs, scale, translate, opt_options));
+      } else {
+        feature = /** @type {TopoJSONGeometry} */
+            (topoJSONFeatures[i]);
+        features.push(ol.format.TopoJSON.readFeatureFromGeometry_(
+            feature, arcs, scale, translate, opt_options));
+      }
+    }
+    return features;
+  } else {
+    return [];
+  }
+};
+
+
+/**
+ * Apply a linear transform to array of arcs.  The provided array of arcs is
+ * modified in place.
+ *
+ * @param {Array.<Array.<ol.Coordinate>>} arcs Array of arcs.
+ * @param {Array.<number>} scale Scale for each dimension.
+ * @param {Array.<number>} translate Translation for each dimension.
+ * @private
+ */
+ol.format.TopoJSON.transformArcs_ = function(arcs, scale, translate) {
+  var i, ii;
+  for (i = 0, ii = arcs.length; i < ii; ++i) {
+    ol.format.TopoJSON.transformArc_(arcs[i], scale, translate);
+  }
+};
+
+
+/**
+ * Apply a linear transform to an arc.  The provided arc is modified in place.
+ *
+ * @param {Array.<ol.Coordinate>} arc Arc.
+ * @param {Array.<number>} scale Scale for each dimension.
+ * @param {Array.<number>} translate Translation for each dimension.
+ * @private
+ */
+ol.format.TopoJSON.transformArc_ = function(arc, scale, translate) {
+  var x = 0;
+  var y = 0;
+  var vertex;
+  var i, ii;
+  for (i = 0, ii = arc.length; i < ii; ++i) {
+    vertex = arc[i];
+    x += vertex[0];
+    y += vertex[1];
+    vertex[0] = x;
+    vertex[1] = y;
+    ol.format.TopoJSON.transformVertex_(vertex, scale, translate);
+  }
+};
+
+
+/**
+ * Apply a linear transform to a vertex.  The provided vertex is modified in
+ * place.
+ *
+ * @param {ol.Coordinate} vertex Vertex.
+ * @param {Array.<number>} scale Scale for each dimension.
+ * @param {Array.<number>} translate Translation for each dimension.
+ * @private
+ */
+ol.format.TopoJSON.transformVertex_ = function(vertex, scale, translate) {
+  vertex[0] = vertex[0] * scale[0] + translate[0];
+  vertex[1] = vertex[1] * scale[1] + translate[1];
+};
+
+
+/**
+ * Read the projection from a TopoJSON source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} object Source.
+ * @return {ol.proj.Projection} Projection.
+ * @api stable
+ */
+ol.format.TopoJSON.prototype.readProjection = function(object) {
+  return this.defaultDataProjection;
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Object.<string, function(TopoJSONGeometry, Array, ...[Array]): ol.geom.Geometry>}
+ */
+ol.format.TopoJSON.GEOMETRY_READERS_ = {
+  'Point': ol.format.TopoJSON.readPointGeometry_,
+  'LineString': ol.format.TopoJSON.readLineStringGeometry_,
+  'Polygon': ol.format.TopoJSON.readPolygonGeometry_,
+  'MultiPoint': ol.format.TopoJSON.readMultiPointGeometry_,
+  'MultiLineString': ol.format.TopoJSON.readMultiLineStringGeometry_,
+  'MultiPolygon': ol.format.TopoJSON.readMultiPolygonGeometry_
+};
diff --git a/src/ol/format/wfsformat.js b/src/ol/format/wfsformat.js
new file mode 100644
index 0000000..f007bed
--- /dev/null
+++ b/src/ol/format/wfsformat.js
@@ -0,0 +1,764 @@
+goog.provide('ol.format.WFS');
+
+goog.require('goog.asserts');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('ol.format.GML3');
+goog.require('ol.format.GMLBase');
+goog.require('ol.format.XMLFeature');
+goog.require('ol.format.XSD');
+goog.require('ol.geom.Geometry');
+goog.require('ol.proj');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Feature format for reading and writing data in the WFS format.
+ * By default, supports WFS version 1.1.0. You can pass a GML format
+ * as option if you want to read a WFS that contains GML2 (WFS 1.0.0).
+ * Also see {@link ol.format.GMLBase} which is used by this format.
+ *
+ * @constructor
+ * @param {olx.format.WFSOptions=} opt_options
+ *     Optional configuration object.
+ * @extends {ol.format.XMLFeature}
+ * @api stable
+ */
+ol.format.WFS = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.featureType_ = options.featureType;
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.featureNS_ = options.featureNS;
+
+  /**
+   * @private
+   * @type {ol.format.GMLBase}
+   */
+  this.gmlFormat_ = goog.isDef(options.gmlFormat) ?
+      options.gmlFormat : new ol.format.GML3();
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.schemaLocation_ = goog.isDef(options.schemaLocation) ?
+      options.schemaLocation : ol.format.WFS.SCHEMA_LOCATION;
+
+  goog.base(this);
+};
+goog.inherits(ol.format.WFS, ol.format.XMLFeature);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.format.WFS.FEATURE_PREFIX = 'feature';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.format.WFS.XMLNS = 'http://www.w3.org/2000/xmlns/';
+
+
+/**
+ * Number of features; bounds/extent.
+ * @typedef {{numberOfFeatures: number,
+ *            bounds: ol.Extent}}
+ * @api stable
+ */
+ol.format.WFS.FeatureCollectionMetadata;
+
+
+/**
+ * Total deleted; total inserted; total updated; array of insert ids.
+ * @typedef {{totalDeleted: number,
+ *            totalInserted: number,
+ *            totalUpdated: number,
+ *            insertIds: Array.<string>}}
+ * @api stable
+ */
+ol.format.WFS.TransactionResponse;
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.format.WFS.SCHEMA_LOCATION = 'http://www.opengis.net/wfs ' +
+    'http://schemas.opengis.net/wfs/1.1.0/wfs.xsd';
+
+
+/**
+ * Read all features from a WFS FeatureCollection.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.WFS.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WFS.prototype.readFeaturesFromNode = function(node, opt_options) {
+  var context = {
+    'featureType': this.featureType_,
+    'featureNS': this.featureNS_
+  };
+  goog.object.extend(context, this.getReadOptions(node,
+      goog.isDef(opt_options) ? opt_options : {}));
+  var objectStack = [context];
+  var features = ol.xml.pushParseAndPop([],
+      this.gmlFormat_.FEATURE_COLLECTION_PARSERS, node,
+      objectStack, this.gmlFormat_);
+  if (!goog.isDef(features)) {
+    features = [];
+  }
+  return features;
+};
+
+
+/**
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.format.WFS.TransactionResponse|undefined} Transaction response.
+ * @api stable
+ */
+ol.format.WFS.prototype.readTransactionResponse = function(source) {
+  if (ol.xml.isDocument(source)) {
+    return this.readTransactionResponseFromDocument(
+        /** @type {Document} */ (source));
+  } else if (ol.xml.isNode(source)) {
+    return this.readTransactionResponseFromNode(/** @type {Node} */ (source));
+  } else if (goog.isString(source)) {
+    var doc = ol.xml.parse(source);
+    return this.readTransactionResponseFromDocument(doc);
+  } else {
+    goog.asserts.fail();
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {ol.format.WFS.FeatureCollectionMetadata|undefined}
+ *     FeatureCollection metadata.
+ * @api stable
+ */
+ol.format.WFS.prototype.readFeatureCollectionMetadata = function(source) {
+  if (ol.xml.isDocument(source)) {
+    return this.readFeatureCollectionMetadataFromDocument(
+        /** @type {Document} */ (source));
+  } else if (ol.xml.isNode(source)) {
+    return this.readFeatureCollectionMetadataFromNode(
+        /** @type {Node} */ (source));
+  } else if (goog.isString(source)) {
+    var doc = ol.xml.parse(source);
+    return this.readFeatureCollectionMetadataFromDocument(doc);
+  } else {
+    goog.asserts.fail();
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Document} doc Document.
+ * @return {ol.format.WFS.FeatureCollectionMetadata|undefined}
+ *     FeatureCollection metadata.
+ */
+ol.format.WFS.prototype.readFeatureCollectionMetadataFromDocument =
+    function(doc) {
+  goog.asserts.assert(doc.nodeType == goog.dom.NodeType.DOCUMENT);
+  for (var n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) {
+    if (n.nodeType == goog.dom.NodeType.ELEMENT) {
+      return this.readFeatureCollectionMetadataFromNode(n);
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WFS.FEATURE_COLLECTION_PARSERS_ = {
+  'http://www.opengis.net/gml': {
+    'boundedBy': ol.xml.makeObjectPropertySetter(
+        ol.format.GMLBase.prototype.readGeometryElement, 'bounds')
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {ol.format.WFS.FeatureCollectionMetadata|undefined}
+ *     FeatureCollection metadata.
+ */
+ol.format.WFS.prototype.readFeatureCollectionMetadataFromNode = function(node) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'FeatureCollection');
+  var result = {};
+  var value = ol.format.XSD.readNonNegativeIntegerString(
+      node.getAttribute('numberOfFeatures'));
+  goog.object.set(result, 'numberOfFeatures', value);
+  return ol.xml.pushParseAndPop(
+      /** @type {ol.format.WFS.FeatureCollectionMetadata} */ (result),
+      ol.format.WFS.FEATURE_COLLECTION_PARSERS_, node, [], this.gmlFormat_);
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WFS.TRANSACTION_SUMMARY_PARSERS_ = {
+  'http://www.opengis.net/wfs': {
+    'totalInserted': ol.xml.makeObjectPropertySetter(
+        ol.format.XSD.readNonNegativeInteger),
+    'totalUpdated': ol.xml.makeObjectPropertySetter(
+        ol.format.XSD.readNonNegativeInteger),
+    'totalDeleted': ol.xml.makeObjectPropertySetter(
+        ol.format.XSD.readNonNegativeInteger)
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Transaction Summary.
+ * @private
+ */
+ol.format.WFS.readTransactionSummary_ = function(node, objectStack) {
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WFS.TRANSACTION_SUMMARY_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WFS.OGC_FID_PARSERS_ = {
+  'http://www.opengis.net/ogc': {
+    'FeatureId': ol.xml.makeArrayPusher(function(node, objectStack) {
+      return node.getAttribute('fid');
+    })
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ */
+ol.format.WFS.fidParser_ = function(node, objectStack) {
+  ol.xml.parseNode(ol.format.WFS.OGC_FID_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WFS.INSERT_RESULTS_PARSERS_ = {
+  'http://www.opengis.net/wfs': {
+    'Feature': ol.format.WFS.fidParser_
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Array.<string>|undefined} Insert results.
+ * @private
+ */
+ol.format.WFS.readInsertResults_ = function(node, objectStack) {
+  return ol.xml.pushParseAndPop(
+      [], ol.format.WFS.INSERT_RESULTS_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WFS.TRANSACTION_RESPONSE_PARSERS_ = {
+  'http://www.opengis.net/wfs': {
+    'TransactionSummary': ol.xml.makeObjectPropertySetter(
+        ol.format.WFS.readTransactionSummary_, 'transactionSummary'),
+    'InsertResults': ol.xml.makeObjectPropertySetter(
+        ol.format.WFS.readInsertResults_, 'insertIds')
+  }
+};
+
+
+/**
+ * @param {Document} doc Document.
+ * @return {ol.format.WFS.TransactionResponse|undefined} Transaction response.
+ */
+ol.format.WFS.prototype.readTransactionResponseFromDocument = function(doc) {
+  goog.asserts.assert(doc.nodeType == goog.dom.NodeType.DOCUMENT);
+  for (var n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) {
+    if (n.nodeType == goog.dom.NodeType.ELEMENT) {
+      return this.readTransactionResponseFromNode(n);
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {ol.format.WFS.TransactionResponse|undefined} Transaction response.
+ */
+ol.format.WFS.prototype.readTransactionResponseFromNode = function(node) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'TransactionResponse');
+  return ol.xml.pushParseAndPop(
+      /** @type {ol.format.WFS.TransactionResponse} */({}),
+      ol.format.WFS.TRANSACTION_RESPONSE_PARSERS_, node, []);
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.WFS.QUERY_SERIALIZERS_ = {
+  'http://www.opengis.net/wfs': {
+    'PropertyName': ol.xml.makeChildAppender(ol.format.XSD.writeStringTextNode)
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Feature} feature Feature.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeFeature_ = function(node, feature, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var featureType = goog.object.get(context, 'featureType');
+  var featureNS = goog.object.get(context, 'featureNS');
+  var child = ol.xml.createElementNS(featureNS, featureType);
+  node.appendChild(child);
+  ol.format.GML3.prototype.writeFeatureElement(child, feature, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {number|string} fid Feature identifier.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeOgcFidFilter_ = function(node, fid, objectStack) {
+  var filter = ol.xml.createElementNS('http://www.opengis.net/ogc', 'Filter');
+  var child = ol.xml.createElementNS('http://www.opengis.net/ogc', 'FeatureId');
+  filter.appendChild(child);
+  child.setAttribute('fid', fid);
+  node.appendChild(filter);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Feature} feature Feature.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeDelete_ = function(node, feature, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var featureType = goog.object.get(context, 'featureType');
+  var featurePrefix = goog.object.get(context, 'featurePrefix');
+  featurePrefix = goog.isDef(featurePrefix) ? featurePrefix :
+      ol.format.WFS.FEATURE_PREFIX;
+  var featureNS = goog.object.get(context, 'featureNS');
+  node.setAttribute('typeName', featurePrefix + ':' + featureType);
+  ol.xml.setAttributeNS(node, ol.format.WFS.XMLNS, 'xmlns:' + featurePrefix,
+      featureNS);
+  var fid = feature.getId();
+  if (goog.isDef(fid)) {
+    ol.format.WFS.writeOgcFidFilter_(node, fid, objectStack);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Feature} feature Feature.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeUpdate_ = function(node, feature, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var featureType = goog.object.get(context, 'featureType');
+  var featurePrefix = goog.object.get(context, 'featurePrefix');
+  featurePrefix = goog.isDef(featurePrefix) ? featurePrefix :
+      ol.format.WFS.FEATURE_PREFIX;
+  var featureNS = goog.object.get(context, 'featureNS');
+  node.setAttribute('typeName', featurePrefix + ':' + featureType);
+  ol.xml.setAttributeNS(node, ol.format.WFS.XMLNS, 'xmlns:' + featurePrefix,
+      featureNS);
+  var fid = feature.getId();
+  if (goog.isDef(fid)) {
+    var keys = feature.getKeys();
+    var values = [];
+    for (var i = 0, ii = keys.length; i < ii; i++) {
+      var value = feature.get(keys[i]);
+      if (goog.isDef(value)) {
+        values.push({name: keys[i], value: value});
+      }
+    }
+    ol.xml.pushSerializeAndPop({node: node, srsName:
+          goog.object.get(context, 'srsName')},
+    ol.format.WFS.TRANSACTION_SERIALIZERS_,
+    ol.xml.makeSimpleNodeFactory('Property'), values,
+    objectStack);
+    ol.format.WFS.writeOgcFidFilter_(node, fid, objectStack);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Object} pair Property name and value.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeProperty_ = function(node, pair, objectStack) {
+  var name = ol.xml.createElementNS('http://www.opengis.net/wfs', 'Name');
+  node.appendChild(name);
+  ol.format.XSD.writeStringTextNode(name, pair.name);
+  if (goog.isDefAndNotNull(pair.value)) {
+    var value = ol.xml.createElementNS('http://www.opengis.net/wfs', 'Value');
+    node.appendChild(value);
+    if (pair.value instanceof ol.geom.Geometry) {
+      ol.format.GML3.prototype.writeGeometryElement(value,
+          pair.value, objectStack);
+    } else {
+      ol.format.XSD.writeStringTextNode(value, pair.value);
+    }
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {{vendorId: string, safeToIgnore: boolean, value: string}}
+ *     nativeElement The native element.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeNative_ = function(node, nativeElement, objectStack) {
+  if (goog.isDef(nativeElement.vendorId)) {
+    node.setAttribute('vendorId', nativeElement.vendorId);
+  }
+  if (goog.isDef(nativeElement.safeToIgnore)) {
+    node.setAttribute('safeToIgnore', nativeElement.safeToIgnore);
+  }
+  if (goog.isDef(nativeElement.value)) {
+    ol.format.XSD.writeStringTextNode(node, nativeElement.value);
+  }
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.WFS.TRANSACTION_SERIALIZERS_ = {
+  'http://www.opengis.net/wfs': {
+    'Insert': ol.xml.makeChildAppender(ol.format.WFS.writeFeature_),
+    'Update': ol.xml.makeChildAppender(ol.format.WFS.writeUpdate_),
+    'Delete': ol.xml.makeChildAppender(ol.format.WFS.writeDelete_),
+    'Property': ol.xml.makeChildAppender(ol.format.WFS.writeProperty_),
+    'Native': ol.xml.makeChildAppender(ol.format.WFS.writeNative_)
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {string} featureType Feature type.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeQuery_ = function(node, featureType, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var featurePrefix = goog.object.get(context, 'featurePrefix');
+  var featureNS = goog.object.get(context, 'featureNS');
+  var propertyNames = goog.object.get(context, 'propertyNames');
+  var srsName = goog.object.get(context, 'srsName');
+  var prefix = goog.isDef(featurePrefix) ? featurePrefix + ':' : '';
+  node.setAttribute('typeName', prefix + featureType);
+  if (goog.isDef(srsName)) {
+    node.setAttribute('srsName', srsName);
+  }
+  if (goog.isDef(featureNS)) {
+    ol.xml.setAttributeNS(node, ol.format.WFS.XMLNS, 'xmlns:' + featurePrefix,
+        featureNS);
+  }
+  var item = goog.object.clone(context);
+  item.node = node;
+  ol.xml.pushSerializeAndPop(item,
+      ol.format.WFS.QUERY_SERIALIZERS_,
+      ol.xml.makeSimpleNodeFactory('PropertyName'), propertyNames,
+      objectStack);
+  var bbox = goog.object.get(context, 'bbox');
+  if (goog.isDef(bbox)) {
+    var child = ol.xml.createElementNS('http://www.opengis.net/ogc', 'Filter');
+    ol.format.WFS.writeOgcBBOX_(child, bbox, objectStack);
+    node.appendChild(child);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {string} value PropertyName value.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeOgcPropertyName_ = function(node, value, objectStack) {
+  var property = ol.xml.createElementNS('http://www.opengis.net/ogc',
+      'PropertyName');
+  ol.format.XSD.writeStringTextNode(property, value);
+  node.appendChild(property);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {ol.Extent} bbox Bounding box.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeOgcBBOX_ = function(node, bbox, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var geometryName = goog.object.get(context, 'geometryName');
+  var bboxNode = ol.xml.createElementNS('http://www.opengis.net/ogc', 'BBOX');
+  node.appendChild(bboxNode);
+  ol.format.WFS.writeOgcPropertyName_(bboxNode, geometryName, objectStack);
+  ol.format.GML3.prototype.writeGeometryElement(bboxNode, bbox, objectStack);
+};
+
+
+/**
+ * @type {Object.<string, Object.<string, ol.xml.Serializer>>}
+ * @private
+ */
+ol.format.WFS.GETFEATURE_SERIALIZERS_ = {
+  'http://www.opengis.net/wfs': {
+    'Query': ol.xml.makeChildAppender(
+        ol.format.WFS.writeQuery_)
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<{string}>} featureTypes Feature types.
+ * @param {Array.<*>} objectStack Node stack.
+ * @private
+ */
+ol.format.WFS.writeGetFeature_ = function(node, featureTypes, objectStack) {
+  var context = objectStack[objectStack.length - 1];
+  goog.asserts.assert(goog.isObject(context));
+  var item = goog.object.clone(context);
+  item.node = node;
+  ol.xml.pushSerializeAndPop(item,
+      ol.format.WFS.GETFEATURE_SERIALIZERS_,
+      ol.xml.makeSimpleNodeFactory('Query'), featureTypes,
+      objectStack);
+};
+
+
+/**
+ * @param {olx.format.WFSWriteGetFeatureOptions} options Options.
+ * @return {Node} Result.
+ * @api stable
+ */
+ol.format.WFS.prototype.writeGetFeature = function(options) {
+  var node = ol.xml.createElementNS('http://www.opengis.net/wfs',
+      'GetFeature');
+  node.setAttribute('service', 'WFS');
+  node.setAttribute('version', '1.1.0');
+  if (goog.isDef(options)) {
+    if (goog.isDef(options.handle)) {
+      node.setAttribute('handle', options.handle);
+    }
+    if (goog.isDef(options.outputFormat)) {
+      node.setAttribute('outputFormat', options.outputFormat);
+    }
+    if (goog.isDef(options.maxFeatures)) {
+      node.setAttribute('maxFeatures', options.maxFeatures);
+    }
+    if (goog.isDef(options.resultType)) {
+      node.setAttribute('resultType', options.resultType);
+    }
+    if (goog.isDef(options.startIndex)) {
+      node.setAttribute('startIndex', options.startIndex);
+    }
+    if (goog.isDef(options.count)) {
+      node.setAttribute('count', options.count);
+    }
+  }
+  ol.xml.setAttributeNS(node, 'http://www.w3.org/2001/XMLSchema-instance',
+      'xsi:schemaLocation', this.schemaLocation_);
+  var context = {
+    node: node,
+    srsName: options.srsName,
+    featureNS: goog.isDef(options.featureNS) ?
+        options.featureNS : this.featureNS_,
+    featurePrefix: options.featurePrefix,
+    geometryName: options.geometryName,
+    bbox: options.bbox,
+    propertyNames: goog.isDef(options.propertyNames) ?
+        options.propertyNames : []
+  };
+  goog.asserts.assert(goog.isArray(options.featureTypes));
+  ol.format.WFS.writeGetFeature_(node, options.featureTypes, [context]);
+  return node;
+};
+
+
+/**
+ * @param {Array.<ol.Feature>} inserts The features to insert.
+ * @param {Array.<ol.Feature>} updates The features to update.
+ * @param {Array.<ol.Feature>} deletes The features to delete.
+ * @param {olx.format.WFSWriteTransactionOptions} options Write options.
+ * @return {Node} Result.
+ * @api stable
+ */
+ol.format.WFS.prototype.writeTransaction = function(inserts, updates, deletes,
+    options) {
+  var objectStack = [];
+  var node = ol.xml.createElementNS('http://www.opengis.net/wfs',
+      'Transaction');
+  node.setAttribute('service', 'WFS');
+  node.setAttribute('version', '1.1.0');
+  var baseObj, obj;
+  if (goog.isDef(options)) {
+    baseObj = goog.isDef(options.gmlOptions) ? options.gmlOptions : {};
+    if (goog.isDef(options.handle)) {
+      node.setAttribute('handle', options.handle);
+    }
+  }
+  ol.xml.setAttributeNS(node, 'http://www.w3.org/2001/XMLSchema-instance',
+      'xsi:schemaLocation', this.schemaLocation_);
+  if (goog.isDefAndNotNull(inserts)) {
+    obj = {node: node, featureNS: options.featureNS,
+      featureType: options.featureType, featurePrefix: options.featurePrefix};
+    goog.object.extend(obj, baseObj);
+    ol.xml.pushSerializeAndPop(obj,
+        ol.format.WFS.TRANSACTION_SERIALIZERS_,
+        ol.xml.makeSimpleNodeFactory('Insert'), inserts,
+        objectStack);
+  }
+  if (goog.isDefAndNotNull(updates)) {
+    obj = {node: node, featureNS: options.featureNS,
+      featureType: options.featureType, featurePrefix: options.featurePrefix};
+    goog.object.extend(obj, baseObj);
+    ol.xml.pushSerializeAndPop(obj,
+        ol.format.WFS.TRANSACTION_SERIALIZERS_,
+        ol.xml.makeSimpleNodeFactory('Update'), updates,
+        objectStack);
+  }
+  if (goog.isDefAndNotNull(deletes)) {
+    ol.xml.pushSerializeAndPop({node: node, featureNS: options.featureNS,
+      featureType: options.featureType, featurePrefix: options.featurePrefix},
+    ol.format.WFS.TRANSACTION_SERIALIZERS_,
+    ol.xml.makeSimpleNodeFactory('Delete'), deletes,
+    objectStack);
+  }
+  if (goog.isDef(options.nativeElements)) {
+    ol.xml.pushSerializeAndPop({node: node, featureNS: options.featureNS,
+      featureType: options.featureType, featurePrefix: options.featurePrefix},
+    ol.format.WFS.TRANSACTION_SERIALIZERS_,
+    ol.xml.makeSimpleNodeFactory('Native'), options.nativeElements,
+    objectStack);
+  }
+  return node;
+};
+
+
+/**
+ * Read the projection from a WFS source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {?ol.proj.Projection} Projection.
+ * @api stable
+ */
+ol.format.WFS.prototype.readProjection;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WFS.prototype.readProjectionFromDocument = function(doc) {
+  goog.asserts.assert(doc.nodeType == goog.dom.NodeType.DOCUMENT);
+  for (var n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) {
+    if (n.nodeType == goog.dom.NodeType.ELEMENT) {
+      return this.readProjectionFromNode(n);
+    }
+  }
+  return null;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WFS.prototype.readProjectionFromNode = function(node) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'FeatureCollection');
+  node = node.firstElementChild.firstElementChild;
+  if (goog.isDefAndNotNull(node)) {
+    for (var n = node.firstElementChild; !goog.isNull(n);
+        n = n.nextElementSibling) {
+      if (!(n.childNodes.length === 0 ||
+          (n.childNodes.length === 1 &&
+          n.firstChild.nodeType === 3))) {
+        var objectStack = [{}];
+        this.gmlFormat_.readGeometryElement(n, objectStack);
+        return ol.proj.get(objectStack.pop().srsName);
+      }
+    }
+  }
+  return null;
+};
diff --git a/src/ol/format/wktformat.js b/src/ol/format/wktformat.js
new file mode 100644
index 0000000..40fc276
--- /dev/null
+++ b/src/ol/format/wktformat.js
@@ -0,0 +1,860 @@
+goog.provide('ol.format.WKT');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.Feature');
+goog.require('ol.format.Feature');
+goog.require('ol.format.TextFeature');
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.GeometryCollection');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.format.TextFeature}
+ * @param {olx.format.WKTOptions=} opt_options Options.
+ * @api stable
+ */
+ol.format.WKT = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this);
+
+  /**
+   * Split GeometryCollection into multiple features.
+   * @type {boolean}
+   * @private
+   */
+  this.splitCollection_ = goog.isDef(options.splitCollection) ?
+      options.splitCollection : false;
+
+};
+goog.inherits(ol.format.WKT, ol.format.TextFeature);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.format.WKT.EMPTY = 'EMPTY';
+
+
+/**
+ * @param {ol.geom.Point} geom Point geometry.
+ * @return {string} Coordinates part of Point as WKT.
+ * @private
+ */
+ol.format.WKT.encodePointGeometry_ = function(geom) {
+  var coordinates = geom.getCoordinates();
+  if (goog.array.isEmpty(coordinates)) {
+    return '';
+  }
+  return coordinates[0] + ' ' + coordinates[1];
+};
+
+
+/**
+ * @param {ol.geom.MultiPoint} geom MultiPoint geometry.
+ * @return {string} Coordinates part of MultiPoint as WKT.
+ * @private
+ */
+ol.format.WKT.encodeMultiPointGeometry_ = function(geom) {
+  var array = [];
+  var components = geom.getPoints();
+  for (var i = 0, ii = components.length; i < ii; ++i) {
+    array.push('(' + ol.format.WKT.encodePointGeometry_(components[i]) + ')');
+  }
+  return array.join(',');
+};
+
+
+/**
+ * @param {ol.geom.GeometryCollection} geom GeometryCollection geometry.
+ * @return {string} Coordinates part of GeometryCollection as WKT.
+ * @private
+ */
+ol.format.WKT.encodeGeometryCollectionGeometry_ = function(geom) {
+  var array = [];
+  var geoms = geom.getGeometries();
+  for (var i = 0, ii = geoms.length; i < ii; ++i) {
+    array.push(ol.format.WKT.encode_(geoms[i]));
+  }
+  return array.join(',');
+};
+
+
+/**
+ * @param {ol.geom.LineString|ol.geom.LinearRing} geom LineString geometry.
+ * @return {string} Coordinates part of LineString as WKT.
+ * @private
+ */
+ol.format.WKT.encodeLineStringGeometry_ = function(geom) {
+  var coordinates = geom.getCoordinates();
+  var array = [];
+  for (var i = 0, ii = coordinates.length; i < ii; ++i) {
+    array.push(coordinates[i][0] + ' ' + coordinates[i][1]);
+  }
+  return array.join(',');
+};
+
+
+/**
+ * @param {ol.geom.MultiLineString} geom MultiLineString geometry.
+ * @return {string} Coordinates part of MultiLineString as WKT.
+ * @private
+ */
+ol.format.WKT.encodeMultiLineStringGeometry_ = function(geom) {
+  var array = [];
+  var components = geom.getLineStrings();
+  for (var i = 0, ii = components.length; i < ii; ++i) {
+    array.push('(' + ol.format.WKT.encodeLineStringGeometry_(
+        components[i]) + ')');
+  }
+  return array.join(',');
+};
+
+
+/**
+ * @param {ol.geom.Polygon} geom Polygon geometry.
+ * @return {string} Coordinates part of Polygon as WKT.
+ * @private
+ */
+ol.format.WKT.encodePolygonGeometry_ = function(geom) {
+  var array = [];
+  var rings = geom.getLinearRings();
+  for (var i = 0, ii = rings.length; i < ii; ++i) {
+    array.push('(' + ol.format.WKT.encodeLineStringGeometry_(
+        rings[i]) + ')');
+  }
+  return array.join(',');
+};
+
+
+/**
+ * @param {ol.geom.MultiPolygon} geom MultiPolygon geometry.
+ * @return {string} Coordinates part of MultiPolygon as WKT.
+ * @private
+ */
+ol.format.WKT.encodeMultiPolygonGeometry_ = function(geom) {
+  var array = [];
+  var components = geom.getPolygons();
+  for (var i = 0, ii = components.length; i < ii; ++i) {
+    array.push('(' + ol.format.WKT.encodePolygonGeometry_(
+        components[i]) + ')');
+  }
+  return array.join(',');
+};
+
+
+/**
+ * Encode a geometry as WKT.
+ * @param {ol.geom.Geometry} geom The geometry to encode.
+ * @return {string} WKT string for the geometry.
+ * @private
+ */
+ol.format.WKT.encode_ = function(geom) {
+  var type = geom.getType();
+  var geometryEncoder = ol.format.WKT.GeometryEncoder_[type];
+  goog.asserts.assert(goog.isDef(geometryEncoder));
+  var enc = geometryEncoder(geom);
+  type = type.toUpperCase();
+  if (enc.length === 0) {
+    return type + ' ' + ol.format.WKT.EMPTY;
+  }
+  return type + '(' + enc + ')';
+};
+
+
+/**
+ * @const
+ * @type {Object.<string, function(ol.geom.Geometry): string>}
+ * @private
+ */
+ol.format.WKT.GeometryEncoder_ = {
+  'Point': ol.format.WKT.encodePointGeometry_,
+  'LineString': ol.format.WKT.encodeLineStringGeometry_,
+  'Polygon': ol.format.WKT.encodePolygonGeometry_,
+  'MultiPoint': ol.format.WKT.encodeMultiPointGeometry_,
+  'MultiLineString': ol.format.WKT.encodeMultiLineStringGeometry_,
+  'MultiPolygon': ol.format.WKT.encodeMultiPolygonGeometry_,
+  'GeometryCollection': ol.format.WKT.encodeGeometryCollectionGeometry_
+};
+
+
+/**
+ * Parse a WKT string.
+ * @param {string} wkt WKT string.
+ * @return {ol.geom.Geometry|ol.geom.GeometryCollection|undefined}
+ *     The geometry created.
+ * @private
+ */
+ol.format.WKT.prototype.parse_ = function(wkt) {
+  var lexer = new ol.format.WKT.Lexer(wkt);
+  var parser = new ol.format.WKT.Parser(lexer);
+  return parser.parse();
+};
+
+
+/**
+ * Read a feature from a WKT source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.Feature} Feature.
+ * @api stable
+ */
+ol.format.WKT.prototype.readFeature;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WKT.prototype.readFeatureFromText = function(text, opt_options) {
+  var geom = this.readGeometryFromText(text, opt_options);
+  if (goog.isDef(geom)) {
+    var feature = new ol.Feature();
+    feature.setGeometry(geom);
+    return feature;
+  }
+  return null;
+};
+
+
+/**
+ * Read all features from a WKT source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.WKT.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WKT.prototype.readFeaturesFromText = function(text, opt_options) {
+  var geometries = [];
+  var geometry = this.readGeometryFromText(text, opt_options);
+  if (this.splitCollection_ &&
+      geometry.getType() == ol.geom.GeometryType.GEOMETRY_COLLECTION) {
+    geometries = (/** @type {ol.geom.GeometryCollection} */ (geometry))
+        .getGeometriesArray();
+  } else {
+    geometries = [geometry];
+  }
+  var feature, features = [];
+  for (var i = 0, ii = geometries.length; i < ii; ++i) {
+    feature = new ol.Feature();
+    feature.setGeometry(geometries[i]);
+    features.push(feature);
+  }
+  return features;
+};
+
+
+/**
+ * Read a single geometry from a WKT source.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Read options.
+ * @return {ol.geom.Geometry} Geometry.
+ * @api stable
+ */
+ol.format.WKT.prototype.readGeometry;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WKT.prototype.readGeometryFromText = function(text, opt_options) {
+  var geometry = this.parse_(text);
+  if (goog.isDef(geometry)) {
+    return /** @type {ol.geom.Geometry} */ (
+        ol.format.Feature.transformWithOptions(geometry, false, opt_options));
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WKT.prototype.readProjectionFromText = function(text) {
+  return null;
+};
+
+
+/**
+ * Encode a feature as a WKT string.
+ *
+ * @function
+ * @param {ol.Feature} feature Feature.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {string} WKT string.
+ * @api stable
+ */
+ol.format.WKT.prototype.writeFeature;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WKT.prototype.writeFeatureText = function(feature, opt_options) {
+  var geometry = feature.getGeometry();
+  if (goog.isDef(geometry)) {
+    return this.writeGeometryText(geometry, opt_options);
+  }
+  return '';
+};
+
+
+/**
+ * Encode an array of features as a WKT string.
+ *
+ * @function
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Write options.
+ * @return {string} WKT string.
+ * @api stable
+ */
+ol.format.WKT.prototype.writeFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WKT.prototype.writeFeaturesText = function(features, opt_options) {
+  if (features.length == 1) {
+    return this.writeFeatureText(features[0], opt_options);
+  }
+  var geometries = [];
+  for (var i = 0, ii = features.length; i < ii; ++i) {
+    geometries.push(features[i].getGeometry());
+  }
+  var collection = new ol.geom.GeometryCollection(geometries);
+  return this.writeGeometryText(collection, opt_options);
+};
+
+
+/**
+ * Write a single geometry as a WKT string.
+ *
+ * @function
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @return {string} WKT string.
+ * @api stable
+ */
+ol.format.WKT.prototype.writeGeometry;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WKT.prototype.writeGeometryText = function(geometry, opt_options) {
+  return ol.format.WKT.encode_(/** @type {ol.geom.Geometry} */ (
+      ol.format.Feature.transformWithOptions(geometry, true, opt_options)));
+};
+
+
+/**
+ * @typedef {{type: number, value: (number|string|undefined), position: number}}
+ */
+ol.format.WKT.Token;
+
+
+/**
+ * @const
+ * @enum {number}
+ */
+ol.format.WKT.TokenType = {
+  TEXT: 1,
+  LEFT_PAREN: 2,
+  RIGHT_PAREN: 3,
+  NUMBER: 4,
+  COMMA: 5,
+  EOF: 6
+};
+
+
+
+/**
+ * Class to tokenize a WKT string.
+ * @param {string} wkt WKT string.
+ * @constructor
+ * @protected
+ */
+ol.format.WKT.Lexer = function(wkt) {
+
+  /**
+   * @type {string}
+   */
+  this.wkt = wkt;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.index_ = -1;
+};
+
+
+/**
+ * @param {string} c Character.
+ * @return {boolean} Whether the character is alphabetic.
+ * @private
+ */
+ol.format.WKT.Lexer.prototype.isAlpha_ = function(c) {
+  return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
+};
+
+
+/**
+ * @param {string} c Character.
+ * @param {boolean=} opt_decimal Whether the string number
+ *     contains a dot, i.e. is a decimal number.
+ * @return {boolean} Whether the character is numeric.
+ * @private
+ */
+ol.format.WKT.Lexer.prototype.isNumeric_ = function(c, opt_decimal) {
+  var decimal = goog.isDef(opt_decimal) ? opt_decimal : false;
+  return c >= '0' && c <= '9' || c == '.' && !decimal;
+};
+
+
+/**
+ * @param {string} c Character.
+ * @return {boolean} Whether the character is whitespace.
+ * @private
+ */
+ol.format.WKT.Lexer.prototype.isWhiteSpace_ = function(c) {
+  return c == ' ' || c == '\t' || c == '\r' || c == '\n';
+};
+
+
+/**
+ * @return {string} Next string character.
+ * @private
+ */
+ol.format.WKT.Lexer.prototype.nextChar_ = function() {
+  return this.wkt.charAt(++this.index_);
+};
+
+
+/**
+ * Fetch and return the next token.
+ * @return {!ol.format.WKT.Token} Next string token.
+ */
+ol.format.WKT.Lexer.prototype.nextToken = function() {
+  var c = this.nextChar_();
+  var token = {position: this.index_, value: c};
+
+  if (c == '(') {
+    token.type = ol.format.WKT.TokenType.LEFT_PAREN;
+  } else if (c == ',') {
+    token.type = ol.format.WKT.TokenType.COMMA;
+  } else if (c == ')') {
+    token.type = ol.format.WKT.TokenType.RIGHT_PAREN;
+  } else if (this.isNumeric_(c) || c == '-') {
+    token.type = ol.format.WKT.TokenType.NUMBER;
+    token.value = this.readNumber_();
+  } else if (this.isAlpha_(c)) {
+    token.type = ol.format.WKT.TokenType.TEXT;
+    token.value = this.readText_();
+  } else if (this.isWhiteSpace_(c)) {
+    return this.nextToken();
+  } else if (c === '') {
+    token.type = ol.format.WKT.TokenType.EOF;
+  } else {
+    throw new Error('Unexpected character: ' + c);
+  }
+
+  return token;
+};
+
+
+/**
+ * @return {number} Numeric token value.
+ * @private
+ */
+ol.format.WKT.Lexer.prototype.readNumber_ = function() {
+  var c, index = this.index_;
+  var decimal = false;
+  do {
+    if (c == '.') {
+      decimal = true;
+    }
+    c = this.nextChar_();
+  } while (this.isNumeric_(c, decimal));
+  return parseFloat(this.wkt.substring(index, this.index_--));
+};
+
+
+/**
+ * @return {string} String token value.
+ * @private
+ */
+ol.format.WKT.Lexer.prototype.readText_ = function() {
+  var c, index = this.index_;
+  do {
+    c = this.nextChar_();
+  } while (this.isAlpha_(c));
+  return this.wkt.substring(index, this.index_--).toUpperCase();
+};
+
+
+
+/**
+ * Class to parse the tokens from the WKT string.
+ * @param {ol.format.WKT.Lexer} lexer
+ * @constructor
+ * @protected
+ */
+ol.format.WKT.Parser = function(lexer) {
+
+  /**
+   * @type {ol.format.WKT.Lexer}
+   * @private
+   */
+  this.lexer_ = lexer;
+
+  /**
+   * @type {ol.format.WKT.Token}
+   * @private
+   */
+  this.token_;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.dimension_ = 2;
+};
+
+
+/**
+ * Fetch the next token form the lexer and replace the active token.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.consume_ = function() {
+  this.token_ = this.lexer_.nextToken();
+};
+
+
+/**
+ * If the given type matches the current token, consume it.
+ * @param {ol.format.WKT.TokenType.<number>} type Token type.
+ * @return {boolean} Whether the token matches the given type.
+ */
+ol.format.WKT.Parser.prototype.match = function(type) {
+  var isMatch = this.token_.type == type;
+  if (isMatch) {
+    this.consume_();
+  }
+  return isMatch;
+};
+
+
+/**
+ * Try to parse the tokens provided by the lexer.
+ * @return {ol.geom.Geometry|ol.geom.GeometryCollection} The geometry.
+ */
+ol.format.WKT.Parser.prototype.parse = function() {
+  this.consume_();
+  var geometry = this.parseGeometry_();
+  goog.asserts.assert(this.token_.type == ol.format.WKT.TokenType.EOF);
+  return geometry;
+};
+
+
+/**
+ * @return {!(ol.geom.Geometry|ol.geom.GeometryCollection)} The geometry.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parseGeometry_ = function() {
+  var token = this.token_;
+  if (this.match(ol.format.WKT.TokenType.TEXT)) {
+    var geomType = token.value;
+    if (geomType == ol.geom.GeometryType.GEOMETRY_COLLECTION.toUpperCase()) {
+      var geometries = this.parseGeometryCollectionText_();
+      return new ol.geom.GeometryCollection(geometries);
+    } else {
+      var parser = ol.format.WKT.Parser.GeometryParser_[geomType];
+      var ctor = ol.format.WKT.Parser.GeometryConstructor_[geomType];
+      if (!goog.isDef(parser) || !goog.isDef(ctor)) {
+        throw new Error('Invalid geometry type: ' + geomType);
+      }
+      var coordinates = parser.call(this);
+      return new ctor(coordinates);
+    }
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {!Array.<ol.geom.Geometry>} A collection of geometries.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parseGeometryCollectionText_ = function() {
+  if (this.match(ol.format.WKT.TokenType.LEFT_PAREN)) {
+    var geometries = [];
+    do {
+      geometries.push(this.parseGeometry_());
+    } while (this.match(ol.format.WKT.TokenType.COMMA));
+    if (this.match(ol.format.WKT.TokenType.RIGHT_PAREN)) {
+      return geometries;
+    }
+  } else if (this.isEmptyGeometry_()) {
+    return [];
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {Array.<number>} All values in a point.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parsePointText_ = function() {
+  if (this.match(ol.format.WKT.TokenType.LEFT_PAREN)) {
+    var coordinates = this.parsePoint_();
+    if (this.match(ol.format.WKT.TokenType.RIGHT_PAREN)) {
+      return coordinates;
+    }
+  } else if (this.isEmptyGeometry_()) {
+    return null;
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} All points in a linestring.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parseLineStringText_ = function() {
+  if (this.match(ol.format.WKT.TokenType.LEFT_PAREN)) {
+    var coordinates = this.parsePointList_();
+    if (this.match(ol.format.WKT.TokenType.RIGHT_PAREN)) {
+      return coordinates;
+    }
+  } else if (this.isEmptyGeometry_()) {
+    return [];
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} All points in a polygon.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parsePolygonText_ = function() {
+  if (this.match(ol.format.WKT.TokenType.LEFT_PAREN)) {
+    var coordinates = this.parseLineStringTextList_();
+    if (this.match(ol.format.WKT.TokenType.RIGHT_PAREN)) {
+      return coordinates;
+    }
+  } else if (this.isEmptyGeometry_()) {
+    return [];
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} All points in a multipoint.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parseMultiPointText_ = function() {
+  if (this.match(ol.format.WKT.TokenType.LEFT_PAREN)) {
+    var coordinates;
+    if (this.token_.type == ol.format.WKT.TokenType.LEFT_PAREN) {
+      coordinates = this.parsePointTextList_();
+    } else {
+      coordinates = this.parsePointList_();
+    }
+    if (this.match(ol.format.WKT.TokenType.RIGHT_PAREN)) {
+      return coordinates;
+    }
+  } else if (this.isEmptyGeometry_()) {
+    return [];
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} All linestring points
+ *                                        in a multilinestring.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parseMultiLineStringText_ = function() {
+  if (this.match(ol.format.WKT.TokenType.LEFT_PAREN)) {
+    var coordinates = this.parseLineStringTextList_();
+    if (this.match(ol.format.WKT.TokenType.RIGHT_PAREN)) {
+      return coordinates;
+    }
+  } else if (this.isEmptyGeometry_()) {
+    return [];
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} All polygon points in a multipolygon.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parseMultiPolygonText_ = function() {
+  if (this.match(ol.format.WKT.TokenType.LEFT_PAREN)) {
+    var coordinates = this.parsePolygonTextList_();
+    if (this.match(ol.format.WKT.TokenType.RIGHT_PAREN)) {
+      return coordinates;
+    }
+  } else if (this.isEmptyGeometry_()) {
+    return [];
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {!Array.<number>} A point.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parsePoint_ = function() {
+  var coordinates = [];
+  for (var i = 0; i < this.dimension_; ++i) {
+    var token = this.token_;
+    if (this.match(ol.format.WKT.TokenType.NUMBER)) {
+      coordinates.push(token.value);
+    } else {
+      break;
+    }
+  }
+  if (coordinates.length == this.dimension_) {
+    return coordinates;
+  }
+  throw new Error(this.formatErrorMessage_());
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} An array of points.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parsePointList_ = function() {
+  var coordinates = [this.parsePoint_()];
+  while (this.match(ol.format.WKT.TokenType.COMMA)) {
+    coordinates.push(this.parsePoint_());
+  }
+  return coordinates;
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} An array of points.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parsePointTextList_ = function() {
+  var coordinates = [this.parsePointText_()];
+  while (this.match(ol.format.WKT.TokenType.COMMA)) {
+    coordinates.push(this.parsePointText_());
+  }
+  return coordinates;
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} An array of points.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parseLineStringTextList_ = function() {
+  var coordinates = [this.parseLineStringText_()];
+  while (this.match(ol.format.WKT.TokenType.COMMA)) {
+    coordinates.push(this.parseLineStringText_());
+  }
+  return coordinates;
+};
+
+
+/**
+ * @return {!Array.<!Array.<number>>} An array of points.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.parsePolygonTextList_ = function() {
+  var coordinates = [this.parsePolygonText_()];
+  while (this.match(ol.format.WKT.TokenType.COMMA)) {
+    coordinates.push(this.parsePolygonText_());
+  }
+  return coordinates;
+};
+
+
+/**
+ * @return {boolean} Whether the token implies an empty geometry.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.isEmptyGeometry_ = function() {
+  var isEmpty = this.token_.type == ol.format.WKT.TokenType.TEXT &&
+      this.token_.value == ol.format.WKT.EMPTY;
+  if (isEmpty) {
+    this.consume_();
+  }
+  return isEmpty;
+};
+
+
+/**
+ * Create an error message for an unexpected token error.
+ * @return {string} Error message.
+ * @private
+ */
+ol.format.WKT.Parser.prototype.formatErrorMessage_ = function() {
+  return 'Unexpected `' + this.token_.value + '` at position ' +
+      this.token_.position + ' in `' + this.lexer_.wkt + '`';
+};
+
+
+/**
+ * @enum {function (new:ol.geom.Geometry, Array, ol.geom.GeometryLayout.<string>=)}
+ * @private
+ */
+ol.format.WKT.Parser.GeometryConstructor_ = {
+  'POINT': ol.geom.Point,
+  'LINESTRING': ol.geom.LineString,
+  'POLYGON': ol.geom.Polygon,
+  'MULTIPOINT': ol.geom.MultiPoint,
+  'MULTILINESTRING': ol.geom.MultiLineString,
+  'MULTIPOLYGON': ol.geom.MultiPolygon
+};
+
+
+/**
+ * @enum {(function(): Array)}
+ * @private
+ */
+ol.format.WKT.Parser.GeometryParser_ = {
+  'POINT': ol.format.WKT.Parser.prototype.parsePointText_,
+  'LINESTRING': ol.format.WKT.Parser.prototype.parseLineStringText_,
+  'POLYGON': ol.format.WKT.Parser.prototype.parsePolygonText_,
+  'MULTIPOINT': ol.format.WKT.Parser.prototype.parseMultiPointText_,
+  'MULTILINESTRING': ol.format.WKT.Parser.prototype.parseMultiLineStringText_,
+  'MULTIPOLYGON': ol.format.WKT.Parser.prototype.parseMultiPolygonText_
+};
diff --git a/src/ol/format/wmscapabilitiesformat.js b/src/ol/format/wmscapabilitiesformat.js
new file mode 100644
index 0000000..a3d9be5
--- /dev/null
+++ b/src/ol/format/wmscapabilitiesformat.js
@@ -0,0 +1,834 @@
+goog.provide('ol.format.WMSCapabilities');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('ol.format.XLink');
+goog.require('ol.format.XML');
+goog.require('ol.format.XSD');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Format for reading WMS capabilities data
+ *
+ * @constructor
+ * @extends {ol.format.XML}
+ * @api
+ */
+ol.format.WMSCapabilities = function() {
+
+  goog.base(this);
+
+  /**
+   * @type {string|undefined}
+   */
+  this.version = undefined;
+};
+goog.inherits(ol.format.WMSCapabilities, ol.format.XML);
+
+
+/**
+ * Read a WMS capabilities document.
+ *
+ * @function
+ * @param {Document|Node|string} source The XML source.
+ * @return {Object} An object representing the WMS capabilities.
+ * @api
+ */
+ol.format.WMSCapabilities.prototype.read;
+
+
+/**
+ * @param {Document} doc Document.
+ * @return {Object} WMS Capability object.
+ */
+ol.format.WMSCapabilities.prototype.readFromDocument = function(doc) {
+  goog.asserts.assert(doc.nodeType == goog.dom.NodeType.DOCUMENT);
+  for (var n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) {
+    if (n.nodeType == goog.dom.NodeType.ELEMENT) {
+      return this.readFromNode(n);
+    }
+  }
+  return null;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {Object} WMS Capability object.
+ */
+ol.format.WMSCapabilities.prototype.readFromNode = function(node) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'WMS_Capabilities' ||
+      node.localName == 'WMT_MS_Capabilities');
+  this.version = goog.string.trim(node.getAttribute('version'));
+  goog.asserts.assertString(this.version);
+  var wmsCapabilityObject = ol.xml.pushParseAndPop({
+    'version': this.version
+  }, ol.format.WMSCapabilities.PARSERS_, node, []);
+  return goog.isDef(wmsCapabilityObject) ? wmsCapabilityObject : null;
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Attribution object.
+ */
+ol.format.WMSCapabilities.readAttribution_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Attribution');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.ATTRIBUTION_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object} Bounding box object.
+ */
+ol.format.WMSCapabilities.readBoundingBox_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'BoundingBox');
+
+  var extent = [
+    ol.format.XSD.readDecimalString(node.getAttribute('minx')),
+    ol.format.XSD.readDecimalString(node.getAttribute('miny')),
+    ol.format.XSD.readDecimalString(node.getAttribute('maxx')),
+    ol.format.XSD.readDecimalString(node.getAttribute('maxy'))
+  ];
+
+  var resolutions = [
+    ol.format.XSD.readDecimalString(node.getAttribute('resx')),
+    ol.format.XSD.readDecimalString(node.getAttribute('resy'))
+  ];
+
+  return {
+    'crs': node.getAttribute('CRS'),
+    'extent': extent,
+    'res': resolutions
+  };
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {ol.Extent|undefined} Bounding box object.
+ */
+ol.format.WMSCapabilities.readEXGeographicBoundingBox_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'EX_GeographicBoundingBox');
+  var geographicBoundingBox = ol.xml.pushParseAndPop(
+      {},
+      ol.format.WMSCapabilities.EX_GEOGRAPHIC_BOUNDING_BOX_PARSERS_,
+      node, objectStack);
+  if (!goog.isDef(geographicBoundingBox)) {
+    return undefined;
+  }
+  var westBoundLongitude = /** @type {number|undefined} */ (goog.object.get(
+      geographicBoundingBox, 'westBoundLongitude'));
+  var southBoundLatitude = /** @type {number|undefined} */ (goog.object.get(
+      geographicBoundingBox, 'southBoundLatitude'));
+  var eastBoundLongitude = /** @type {number|undefined} */ (goog.object.get(
+      geographicBoundingBox, 'eastBoundLongitude'));
+  var northBoundLatitude = /** @type {number|undefined} */ (goog.object.get(
+      geographicBoundingBox, 'northBoundLatitude'));
+  if (!goog.isDef(westBoundLongitude) || !goog.isDef(southBoundLatitude) ||
+      !goog.isDef(eastBoundLongitude) || !goog.isDef(northBoundLatitude)) {
+    return undefined;
+  }
+  return [
+    westBoundLongitude, southBoundLatitude,
+    eastBoundLongitude, northBoundLatitude
+  ];
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined} Capability object.
+ */
+ol.format.WMSCapabilities.readCapability_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Capability');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.CAPABILITY_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined} Service object.
+ */
+ol.format.WMSCapabilities.readService_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Service');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.SERVICE_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined} Contact information object.
+ */
+ol.format.WMSCapabilities.readContactInformation_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'ContactInformation');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.CONTACT_INFORMATION_PARSERS_,
+      node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined} Contact person object.
+ */
+ol.format.WMSCapabilities.readContactPersonPrimary_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'ContactPersonPrimary');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.CONTACT_PERSON_PARSERS_,
+      node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined} Contact address object.
+ */
+ol.format.WMSCapabilities.readContactAddress_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'ContactAddress');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.CONTACT_ADDRESS_PARSERS_,
+      node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Array.<string>|undefined} Format array.
+ */
+ol.format.WMSCapabilities.readException_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Exception');
+  return ol.xml.pushParseAndPop(
+      [], ol.format.WMSCapabilities.EXCEPTION_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @private
+ * @return {Object|undefined} Layer object.
+ */
+ol.format.WMSCapabilities.readCapabilityLayer_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Layer');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.LAYER_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Layer object.
+ */
+ol.format.WMSCapabilities.readLayer_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Layer');
+  var parentLayerObject = /**  @type {Object.<string,*>} */
+      (objectStack[objectStack.length - 1]);
+
+  var layerObject = /**  @type {Object.<string,*>} */ (ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.LAYER_PARSERS_, node, objectStack));
+
+  if (!goog.isDef(layerObject)) {
+    return undefined;
+  }
+  var queryable =
+      ol.format.XSD.readBooleanString(node.getAttribute('queryable'));
+  if (!goog.isDef(queryable)) {
+    queryable = goog.object.get(parentLayerObject, 'queryable');
+  }
+  goog.object.set(
+      layerObject, 'queryable', goog.isDef(queryable) ? queryable : false);
+
+  var cascaded = ol.format.XSD.readNonNegativeIntegerString(
+      node.getAttribute('cascaded'));
+  if (!goog.isDef(cascaded)) {
+    cascaded = goog.object.get(parentLayerObject, 'cascaded');
+  }
+  goog.object.set(layerObject, 'cascaded', cascaded);
+
+  var opaque = ol.format.XSD.readBooleanString(node.getAttribute('opaque'));
+  if (!goog.isDef(opaque)) {
+    opaque = goog.object.get(parentLayerObject, 'opaque');
+  }
+  goog.object.set(layerObject, 'opaque', goog.isDef(opaque) ? opaque : false);
+
+  var noSubsets =
+      ol.format.XSD.readBooleanString(node.getAttribute('noSubsets'));
+  if (!goog.isDef(noSubsets)) {
+    noSubsets = goog.object.get(parentLayerObject, 'noSubsets');
+  }
+  goog.object.set(
+      layerObject, 'noSubsets', goog.isDef(noSubsets) ? noSubsets : false);
+
+  var fixedWidth =
+      ol.format.XSD.readDecimalString(node.getAttribute('fixedWidth'));
+  if (!goog.isDef(fixedWidth)) {
+    fixedWidth = goog.object.get(parentLayerObject, 'fixedWidth');
+  }
+  goog.object.set(layerObject, 'fixedWidth', fixedWidth);
+
+  var fixedHeight =
+      ol.format.XSD.readDecimalString(node.getAttribute('fixedHeight'));
+  if (!goog.isDef(fixedHeight)) {
+    fixedHeight = goog.object.get(parentLayerObject, 'fixedHeight');
+  }
+  goog.object.set(layerObject, 'fixedHeight', fixedHeight);
+
+  // See 7.2.4.8
+  var addKeys = ['Style', 'CRS', 'AuthorityURL'];
+  goog.array.forEach(addKeys, function(key) {
+    var parentValue = goog.object.get(parentLayerObject, key);
+    if (goog.isDef(parentValue)) {
+      var childValue = goog.object.setIfUndefined(layerObject, key, []);
+      childValue = childValue.concat(parentValue);
+      goog.object.set(layerObject, key, childValue);
+    }
+  });
+
+  var replaceKeys = ['EX_GeographicBoundingBox', 'BoundingBox', 'Dimension',
+    'Attribution', 'MinScaleDenominator', 'MaxScaleDenominator'];
+  goog.array.forEach(replaceKeys, function(key) {
+    var childValue = goog.object.get(layerObject, key);
+    if (!goog.isDef(childValue)) {
+      var parentValue = goog.object.get(parentLayerObject, key);
+      goog.object.set(layerObject, key, parentValue);
+    }
+  });
+
+  return layerObject;
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object} Dimension object.
+ */
+ol.format.WMSCapabilities.readDimension_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Dimension');
+  var dimensionObject = {
+    'name': node.getAttribute('name'),
+    'units': node.getAttribute('units'),
+    'unitSymbol': node.getAttribute('unitSymbol'),
+    'default': node.getAttribute('default'),
+    'multipleValues': ol.format.XSD.readBooleanString(
+        node.getAttribute('multipleValues')),
+    'nearestValue': ol.format.XSD.readBooleanString(
+        node.getAttribute('nearestValue')),
+    'current': ol.format.XSD.readBooleanString(node.getAttribute('current')),
+    'values': ol.format.XSD.readString(node)
+  };
+  return dimensionObject;
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Online resource object.
+ */
+ol.format.WMSCapabilities.readFormatOnlineresource_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.FORMAT_ONLINERESOURCE_PARSERS_,
+      node, objectStack);
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Request object.
+ */
+ol.format.WMSCapabilities.readRequest_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Request');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.REQUEST_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} DCP type object.
+ */
+ol.format.WMSCapabilities.readDCPType_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'DCPType');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.DCPTYPE_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} HTTP object.
+ */
+ol.format.WMSCapabilities.readHTTP_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'HTTP');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.HTTP_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Operation type object.
+ */
+ol.format.WMSCapabilities.readOperationType_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.OPERATIONTYPE_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Online resource object.
+ */
+ol.format.WMSCapabilities.readSizedFormatOnlineresource_ =
+    function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  var formatOnlineresource =
+      ol.format.WMSCapabilities.readFormatOnlineresource_(node, objectStack);
+  if (goog.isDef(formatOnlineresource)) {
+    var size = [
+      ol.format.XSD.readNonNegativeIntegerString(node.getAttribute('width')),
+      ol.format.XSD.readNonNegativeIntegerString(node.getAttribute('height'))
+    ];
+    goog.object.set(formatOnlineresource, 'size', size);
+    return formatOnlineresource;
+  }
+  return undefined;
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Authority URL object.
+ */
+ol.format.WMSCapabilities.readAuthorityURL_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'AuthorityURL');
+  var authorityObject =
+      ol.format.WMSCapabilities.readFormatOnlineresource_(node, objectStack);
+  if (goog.isDef(authorityObject)) {
+    goog.object.set(authorityObject, 'name', node.getAttribute('name'));
+    return authorityObject;
+  }
+  return undefined;
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Metadata URL object.
+ */
+ol.format.WMSCapabilities.readMetadataURL_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'MetadataURL');
+  var metadataObject =
+      ol.format.WMSCapabilities.readFormatOnlineresource_(node, objectStack);
+  if (goog.isDef(metadataObject)) {
+    goog.object.set(metadataObject, 'type', node.getAttribute('type'));
+    return metadataObject;
+  }
+  return undefined;
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Object|undefined} Style object.
+ */
+ol.format.WMSCapabilities.readStyle_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'Style');
+  return ol.xml.pushParseAndPop(
+      {}, ol.format.WMSCapabilities.STYLE_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @private
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Array.<string>|undefined} Keyword list.
+ */
+ol.format.WMSCapabilities.readKeywordList_ = function(node, objectStack) {
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  goog.asserts.assert(node.localName == 'KeywordList');
+  return ol.xml.pushParseAndPop(
+      [], ol.format.WMSCapabilities.KEYWORDLIST_PARSERS_, node, objectStack);
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Array.<string>}
+ */
+ol.format.WMSCapabilities.NAMESPACE_URIS_ = [
+  null,
+  'http://www.opengis.net/wms'
+];
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Service': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readService_),
+      'Capability': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readCapability_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.CAPABILITY_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Request': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readRequest_),
+      'Exception': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readException_),
+      'Layer': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readCapabilityLayer_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.SERVICE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'Title': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'Abstract': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'KeywordList': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readKeywordList_),
+      'OnlineResource': ol.xml.makeObjectPropertySetter(
+          ol.format.XLink.readHref),
+      'ContactInformation': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readContactInformation_),
+      'Fees': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'AccessConstraints': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString),
+      'LayerLimit': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readNonNegativeInteger),
+      'MaxWidth': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readNonNegativeInteger),
+      'MaxHeight': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readNonNegativeInteger)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.CONTACT_INFORMATION_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'ContactPersonPrimary': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readContactPersonPrimary_),
+      'ContactPosition': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString),
+      'ContactAddress': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readContactAddress_),
+      'ContactVoiceTelephone': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString),
+      'ContactFacsimileTelephone': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString),
+      'ContactElectronicMailAddress': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.CONTACT_PERSON_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'ContactPerson': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString),
+      'ContactOrganization': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.CONTACT_ADDRESS_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'AddressType': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'Address': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'City': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'StateOrProvince': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readString),
+      'PostCode': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'Country': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.EXCEPTION_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Format': ol.xml.makeArrayPusher(ol.format.XSD.readString)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.LAYER_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'Title': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'Abstract': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'KeywordList': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readKeywordList_),
+      'CRS': ol.xml.makeObjectPropertyPusher(ol.format.XSD.readString),
+      'EX_GeographicBoundingBox': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readEXGeographicBoundingBox_),
+      'BoundingBox': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readBoundingBox_),
+      'Dimension': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readDimension_),
+      'Attribution': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readAttribution_),
+      'AuthorityURL': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readAuthorityURL_),
+      'Identifier': ol.xml.makeObjectPropertyPusher(ol.format.XSD.readString),
+      'MetadataURL': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readMetadataURL_),
+      'DataURL': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readFormatOnlineresource_),
+      'FeatureListURL': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readFormatOnlineresource_),
+      'Style': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readStyle_),
+      'MinScaleDenominator': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readDecimal),
+      'MaxScaleDenominator': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readDecimal),
+      'Layer': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readLayer_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.ATTRIBUTION_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Title': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'OnlineResource': ol.xml.makeObjectPropertySetter(
+          ol.format.XLink.readHref),
+      'LogoURL': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readSizedFormatOnlineresource_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.EX_GEOGRAPHIC_BOUNDING_BOX_PARSERS_ =
+    ol.xml.makeParsersNS(ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'westBoundLongitude': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readDecimal),
+      'eastBoundLongitude': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readDecimal),
+      'southBoundLatitude': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readDecimal),
+      'northBoundLatitude': ol.xml.makeObjectPropertySetter(
+          ol.format.XSD.readDecimal)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.REQUEST_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'GetCapabilities': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readOperationType_),
+      'GetMap': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readOperationType_),
+      'GetFeatureInfo': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readOperationType_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.OPERATIONTYPE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Format': ol.xml.makeObjectPropertyPusher(ol.format.XSD.readString),
+      'DCPType': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readDCPType_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.DCPTYPE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'HTTP': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readHTTP_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.HTTP_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Get': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readFormatOnlineresource_),
+      'Post': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readFormatOnlineresource_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.STYLE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Name': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'Title': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'Abstract': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'LegendURL': ol.xml.makeObjectPropertyPusher(
+          ol.format.WMSCapabilities.readSizedFormatOnlineresource_),
+      'StyleSheetURL': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readFormatOnlineresource_),
+      'StyleURL': ol.xml.makeObjectPropertySetter(
+          ol.format.WMSCapabilities.readFormatOnlineresource_)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.FORMAT_ONLINERESOURCE_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Format': ol.xml.makeObjectPropertySetter(ol.format.XSD.readString),
+      'OnlineResource': ol.xml.makeObjectPropertySetter(
+          ol.format.XLink.readHref)
+    });
+
+
+/**
+ * @const
+ * @type {Object.<string, Object.<string, ol.xml.Parser>>}
+ * @private
+ */
+ol.format.WMSCapabilities.KEYWORDLIST_PARSERS_ = ol.xml.makeParsersNS(
+    ol.format.WMSCapabilities.NAMESPACE_URIS_, {
+      'Keyword': ol.xml.makeArrayPusher(ol.format.XSD.readString)
+    });
diff --git a/src/ol/format/wmsgetfeatureinfoformat.js b/src/ol/format/wmsgetfeatureinfoformat.js
new file mode 100644
index 0000000..0d92818
--- /dev/null
+++ b/src/ol/format/wmsgetfeatureinfoformat.js
@@ -0,0 +1,146 @@
+goog.provide('ol.format.WMSGetFeatureInfo');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.NodeType');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('ol.format.GML');
+goog.require('ol.format.GML2');
+goog.require('ol.format.XMLFeature');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Format for reading WMSGetFeatureInfo format. It uses
+ * {@link ol.format.GML2} to read features.
+ *
+ * @constructor
+ * @extends {ol.format.XMLFeature}
+ * @api
+ */
+ol.format.WMSGetFeatureInfo = function() {
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.featureNS_ = 'http://mapserver.gis.umn.edu/mapserver';
+
+
+  /**
+   * @private
+   * @type {ol.format.GML2}
+   */
+  this.gmlFormat_ = new ol.format.GML2();
+
+  goog.base(this);
+};
+goog.inherits(ol.format.WMSGetFeatureInfo, ol.format.XMLFeature);
+
+
+/**
+ * @const
+ * @type {string}
+ * @private
+ */
+ol.format.WMSGetFeatureInfo.featureIdentifier_ = '_feature';
+
+
+/**
+ * @const
+ * @type {string}
+ * @private
+ */
+ol.format.WMSGetFeatureInfo.layerIdentifier_ = '_layer';
+
+
+/**
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @return {Array.<ol.Feature>} Features.
+ * @private
+ */
+ol.format.WMSGetFeatureInfo.prototype.readFeatures_ =
+    function(node, objectStack) {
+
+  node.namespaceURI = this.featureNS_;
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  var localName = ol.xml.getLocalName(node);
+  /** @type {Array.<ol.Feature>} */
+  var features = [];
+  if (node.childNodes.length === 0) {
+    return features;
+  }
+  if (localName == 'msGMLOutput') {
+    goog.array.forEach(node.childNodes, function(layer) {
+      if (layer.nodeType !== goog.dom.NodeType.ELEMENT) {
+        return;
+      }
+      var context = objectStack[0];
+      goog.asserts.assert(goog.isObject(context));
+
+      goog.asserts.assert(layer.localName.indexOf(
+          ol.format.WMSGetFeatureInfo.layerIdentifier_) >= 0);
+
+      var featureType = goog.string.remove(layer.localName,
+          ol.format.WMSGetFeatureInfo.layerIdentifier_) +
+          ol.format.WMSGetFeatureInfo.featureIdentifier_;
+
+      goog.object.set(context, 'featureType', featureType);
+      goog.object.set(context, 'featureNS', this.featureNS_);
+
+      var parsers = {};
+      parsers[featureType] = ol.xml.makeArrayPusher(
+          this.gmlFormat_.readFeatureElement, this.gmlFormat_);
+      var parsersNS = ol.xml.makeParsersNS(
+          [goog.object.get(context, 'featureNS'), null], parsers);
+      layer.namespaceURI = this.featureNS_;
+      var layerFeatures = ol.xml.pushParseAndPop(
+          [], parsersNS, layer, objectStack, this.gmlFormat_);
+      if (goog.isDef(layerFeatures)) {
+        goog.array.extend(features, layerFeatures);
+      }
+    }, this);
+  }
+  if (localName == 'FeatureCollection') {
+    var gmlFeatures = ol.xml.pushParseAndPop([],
+        this.gmlFormat_.FEATURE_COLLECTION_PARSERS, node,
+        [{}], this.gmlFormat_);
+    if (goog.isDef(gmlFeatures)) {
+      features = gmlFeatures;
+    }
+  }
+  return features;
+};
+
+
+/**
+ * Read all features from a WMSGetFeatureInfo response.
+ *
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.format.WMSGetFeatureInfo.prototype.readFeatures;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.WMSGetFeatureInfo.prototype.readFeaturesFromNode =
+    function(node, opt_options) {
+  var options = {
+    'featureType': this.featureType,
+    'featureNS': this.featureNS
+  };
+  if (goog.isDef(opt_options)) {
+    goog.object.extend(options, this.getReadOptions(node, opt_options));
+  }
+  return this.readFeatures_(node, [options]);
+};
diff --git a/src/ol/format/xlinkformat.js b/src/ol/format/xlinkformat.js
new file mode 100644
index 0000000..a01b61e
--- /dev/null
+++ b/src/ol/format/xlinkformat.js
@@ -0,0 +1,17 @@
+goog.provide('ol.format.XLink');
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.format.XLink.NAMESPACE_URI = 'http://www.w3.org/1999/xlink';
+
+
+/**
+ * @param {Node} node Node.
+ * @return {boolean|undefined} Boolean.
+ */
+ol.format.XLink.readHref = function(node) {
+  return node.getAttributeNS(ol.format.XLink.NAMESPACE_URI, 'href');
+};
diff --git a/src/ol/format/xmlfeatureformat.js b/src/ol/format/xmlfeatureformat.js
new file mode 100644
index 0000000..5ac7ba1
--- /dev/null
+++ b/src/ol/format/xmlfeatureformat.js
@@ -0,0 +1,251 @@
+goog.provide('ol.format.XMLFeature');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.NodeType');
+goog.require('goog.dom.xml');
+goog.require('ol.format.Feature');
+goog.require('ol.format.FormatType');
+goog.require('ol.proj');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for XML feature formats.
+ *
+ * @constructor
+ * @extends {ol.format.Feature}
+ */
+ol.format.XMLFeature = function() {
+  goog.base(this);
+};
+goog.inherits(ol.format.XMLFeature, ol.format.Feature);
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.XMLFeature.prototype.getType = function() {
+  return ol.format.FormatType.XML;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.XMLFeature.prototype.readFeature = function(source, opt_options) {
+  if (ol.xml.isDocument(source)) {
+    return this.readFeatureFromDocument(
+        /** @type {Document} */ (source), opt_options);
+  } else if (ol.xml.isNode(source)) {
+    return this.readFeatureFromNode(/** @type {Node} */ (source), opt_options);
+  } else if (goog.isString(source)) {
+    var doc = ol.xml.parse(source);
+    return this.readFeatureFromDocument(doc, opt_options);
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+};
+
+
+/**
+ * @param {Document} doc Document.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @return {ol.Feature} Feature.
+ */
+ol.format.XMLFeature.prototype.readFeatureFromDocument = function(
+    doc, opt_options) {
+  var features = this.readFeaturesFromDocument(doc, opt_options);
+  if (features.length > 0) {
+    return features[0];
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @return {ol.Feature} Feature.
+ */
+ol.format.XMLFeature.prototype.readFeatureFromNode = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.XMLFeature.prototype.readFeatures = function(source, opt_options) {
+  if (ol.xml.isDocument(source)) {
+    return this.readFeaturesFromDocument(
+        /** @type {Document} */ (source), opt_options);
+  } else if (ol.xml.isNode(source)) {
+    return this.readFeaturesFromNode(/** @type {Node} */ (source), opt_options);
+  } else if (goog.isString(source)) {
+    var doc = ol.xml.parse(source);
+    return this.readFeaturesFromDocument(doc, opt_options);
+  } else {
+    goog.asserts.fail();
+    return [];
+  }
+};
+
+
+/**
+ * @param {Document} doc Document.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @protected
+ * @return {Array.<ol.Feature>} Features.
+ */
+ol.format.XMLFeature.prototype.readFeaturesFromDocument = function(
+    doc, opt_options) {
+  /** @type {Array.<ol.Feature>} */
+  var features = [];
+  var n;
+  for (n = doc.firstChild; !goog.isNull(n); n = n.nextSibling) {
+    if (n.nodeType == goog.dom.NodeType.ELEMENT) {
+      goog.array.extend(features, this.readFeaturesFromNode(n, opt_options));
+    }
+  }
+  return features;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @protected
+ * @return {Array.<ol.Feature>} Features.
+ */
+ol.format.XMLFeature.prototype.readFeaturesFromNode = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.XMLFeature.prototype.readGeometry = function(source, opt_options) {
+  if (ol.xml.isDocument(source)) {
+    return this.readGeometryFromDocument(
+        /** @type {Document} */ (source), opt_options);
+  } else if (ol.xml.isNode(source)) {
+    return this.readGeometryFromNode(/** @type {Node} */ (source), opt_options);
+  } else if (goog.isString(source)) {
+    var doc = ol.xml.parse(source);
+    return this.readGeometryFromDocument(doc, opt_options);
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+};
+
+
+/**
+ * @param {Document} doc Document.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @protected
+ * @return {ol.geom.Geometry} Geometry.
+ */
+ol.format.XMLFeature.prototype.readGeometryFromDocument = goog.abstractMethod;
+
+
+/**
+ * @param {Node} node Node.
+ * @param {olx.format.ReadOptions=} opt_options Options.
+ * @protected
+ * @return {ol.geom.Geometry} Geometry.
+ */
+ol.format.XMLFeature.prototype.readGeometryFromNode = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.XMLFeature.prototype.readProjection = function(source) {
+  if (ol.xml.isDocument(source)) {
+    return this.readProjectionFromDocument(/** @type {Document} */ (source));
+  } else if (ol.xml.isNode(source)) {
+    return this.readProjectionFromNode(/** @type {Node} */ (source));
+  } else if (goog.isString(source)) {
+    var doc = ol.xml.parse(source);
+    return this.readProjectionFromDocument(doc);
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+};
+
+
+/**
+ * @param {Document} doc Document.
+ * @protected
+ * @return {ol.proj.Projection} Projection.
+ */
+ol.format.XMLFeature.prototype.readProjectionFromDocument = goog.abstractMethod;
+
+
+/**
+ * @param {Node} node Node.
+ * @protected
+ * @return {ol.proj.Projection} Projection.
+ */
+ol.format.XMLFeature.prototype.readProjectionFromNode = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.XMLFeature.prototype.writeFeature = function(feature, opt_options) {
+  var node = this.writeFeatureNode(feature, opt_options);
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  return goog.dom.xml.serialize(/** @type {Element} */(node));
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @protected
+ * @return {Node} Node.
+ */
+ol.format.XMLFeature.prototype.writeFeatureNode = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.XMLFeature.prototype.writeFeatures = function(features, opt_options) {
+  var node = this.writeFeaturesNode(features, opt_options);
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  return goog.dom.xml.serialize(/** @type {Element} */(node));
+};
+
+
+/**
+ * @param {Array.<ol.Feature>} features Features.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {Node} Node.
+ */
+ol.format.XMLFeature.prototype.writeFeaturesNode = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.format.XMLFeature.prototype.writeGeometry = function(geometry, opt_options) {
+  var node = this.writeGeometryNode(geometry, opt_options);
+  goog.asserts.assert(node.nodeType == goog.dom.NodeType.ELEMENT);
+  return goog.dom.xml.serialize(/** @type {Element} */(node));
+};
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {olx.format.WriteOptions=} opt_options Options.
+ * @return {Node} Node.
+ */
+ol.format.XMLFeature.prototype.writeGeometryNode = goog.abstractMethod;
diff --git a/src/ol/format/xmlformat.js b/src/ol/format/xmlformat.js
new file mode 100644
index 0000000..11d46fb
--- /dev/null
+++ b/src/ol/format/xmlformat.js
@@ -0,0 +1,48 @@
+goog.provide('ol.format.XML');
+
+goog.require('goog.asserts');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Generic format for reading non-feature XML data
+ *
+ * @constructor
+ */
+ol.format.XML = function() {
+};
+
+
+/**
+ * @param {Document|Node|string} source Source.
+ * @return {Object}
+ */
+ol.format.XML.prototype.read = function(source) {
+  if (ol.xml.isDocument(source)) {
+    return this.readFromDocument(/** @type {Document} */ (source));
+  } else if (ol.xml.isNode(source)) {
+    return this.readFromNode(/** @type {Node} */ (source));
+  } else if (goog.isString(source)) {
+    var doc = ol.xml.parse(source);
+    return this.readFromDocument(doc);
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+};
+
+
+/**
+ * @param {Document} doc Document.
+ * @return {Object}
+ */
+ol.format.XML.prototype.readFromDocument = goog.abstractMethod;
+
+
+/**
+ * @param {Node} node Node.
+ * @return {Object}
+ */
+ol.format.XML.prototype.readFromNode = goog.abstractMethod;
diff --git a/src/ol/format/xsdformat.js b/src/ol/format/xsdformat.js
new file mode 100644
index 0000000..5198859
--- /dev/null
+++ b/src/ol/format/xsdformat.js
@@ -0,0 +1,183 @@
+goog.provide('ol.format.XSD');
+
+goog.require('goog.asserts');
+goog.require('goog.string');
+goog.require('ol.xml');
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.format.XSD.NAMESPACE_URI = 'http://www.w3.org/2001/XMLSchema';
+
+
+/**
+ * @param {Node} node Node.
+ * @return {boolean|undefined} Boolean.
+ */
+ol.format.XSD.readBoolean = function(node) {
+  var s = ol.xml.getAllTextContent(node, false);
+  return ol.format.XSD.readBooleanString(s);
+};
+
+
+/**
+ * @param {string} string String.
+ * @return {boolean|undefined} Boolean.
+ */
+ol.format.XSD.readBooleanString = function(string) {
+  var m = /^\s*(true|1)|(false|0)\s*$/.exec(string);
+  if (m) {
+    return goog.isDef(m[1]) || false;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {number|undefined} DateTime in seconds.
+ */
+ol.format.XSD.readDateTime = function(node) {
+  var s = ol.xml.getAllTextContent(node, false);
+  var re =
+      /^\s*(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|(?:([+\-])(\d{2})(?::(\d{2}))?))\s*$/;
+  var m = re.exec(s);
+  if (m) {
+    var year = parseInt(m[1], 10);
+    var month = parseInt(m[2], 10) - 1;
+    var day = parseInt(m[3], 10);
+    var hour = parseInt(m[4], 10);
+    var minute = parseInt(m[5], 10);
+    var second = parseInt(m[6], 10);
+    var dateTime = Date.UTC(year, month, day, hour, minute, second) / 1000;
+    if (m[7] != 'Z') {
+      var sign = m[8] == '-' ? -1 : 1;
+      dateTime += sign * 60 * parseInt(m[9], 10);
+      if (goog.isDef(m[10])) {
+        dateTime += sign * 60 * 60 * parseInt(m[10], 10);
+      }
+    }
+    return dateTime;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {number|undefined} Decimal.
+ */
+ol.format.XSD.readDecimal = function(node) {
+  var s = ol.xml.getAllTextContent(node, false);
+  return ol.format.XSD.readDecimalString(s);
+};
+
+
+/**
+ * @param {string} string String.
+ * @return {number|undefined} Decimal.
+ */
+ol.format.XSD.readDecimalString = function(string) {
+  // FIXME check spec
+  var m = /^\s*([+\-]?\d*\.?\d+(?:e[+\-]?\d+)?)\s*$/i.exec(string);
+  if (m) {
+    return parseFloat(m[1]);
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {number|undefined} Non negative integer.
+ */
+ol.format.XSD.readNonNegativeInteger = function(node) {
+  var s = ol.xml.getAllTextContent(node, false);
+  return ol.format.XSD.readNonNegativeIntegerString(s);
+};
+
+
+/**
+ * @param {string} string String.
+ * @return {number|undefined} Non negative integer.
+ */
+ol.format.XSD.readNonNegativeIntegerString = function(string) {
+  var m = /^\s*(\d+)\s*$/.exec(string);
+  if (m) {
+    return parseInt(m[1], 10);
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {string|undefined} String.
+ */
+ol.format.XSD.readString = function(node) {
+  var s = ol.xml.getAllTextContent(node, false);
+  return goog.string.trim(s);
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the boolean to.
+ * @param {boolean} bool Boolean.
+ */
+ol.format.XSD.writeBooleanTextNode = function(node, bool) {
+  ol.format.XSD.writeStringTextNode(node, (bool) ? '1' : '0');
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the dateTime to.
+ * @param {number} dateTime DateTime in seconds.
+ */
+ol.format.XSD.writeDateTimeTextNode = function(node, dateTime) {
+  var date = new Date(dateTime * 1000);
+  var string = date.getUTCFullYear() + '-' +
+      goog.string.padNumber(date.getUTCMonth() + 1, 2) + '-' +
+      goog.string.padNumber(date.getUTCDate(), 2) + 'T' +
+      goog.string.padNumber(date.getUTCHours(), 2) + ':' +
+      goog.string.padNumber(date.getUTCMinutes(), 2) + ':' +
+      goog.string.padNumber(date.getUTCSeconds(), 2) + 'Z';
+  node.appendChild(ol.xml.DOCUMENT.createTextNode(string));
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the decimal to.
+ * @param {number} decimal Decimal.
+ */
+ol.format.XSD.writeDecimalTextNode = function(node, decimal) {
+  var string = decimal.toPrecision();
+  node.appendChild(ol.xml.DOCUMENT.createTextNode(string));
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the decimal to.
+ * @param {number} nonNegativeInteger Non negative integer.
+ */
+ol.format.XSD.writeNonNegativeIntegerTextNode =
+    function(node, nonNegativeInteger) {
+  goog.asserts.assert(nonNegativeInteger >= 0);
+  goog.asserts.assert(nonNegativeInteger == (nonNegativeInteger | 0));
+  var string = nonNegativeInteger.toString();
+  node.appendChild(ol.xml.DOCUMENT.createTextNode(string));
+};
+
+
+/**
+ * @param {Node} node Node to append a TextNode with the string to.
+ * @param {string} string String.
+ */
+ol.format.XSD.writeStringTextNode = function(node, string) {
+  node.appendChild(ol.xml.DOCUMENT.createTextNode(string));
+};
diff --git a/src/ol/framestate.js b/src/ol/framestate.js
new file mode 100644
index 0000000..a1847f5
--- /dev/null
+++ b/src/ol/framestate.js
@@ -0,0 +1,21 @@
+// FIXME factor out common code between usedTiles and wantedTiles
+
+goog.provide('ol.PostRenderFunction');
+goog.provide('ol.PreRenderFunction');
+
+
+/**
+ * @typedef {function(ol.Map, ?olx.FrameState): boolean}
+ */
+ol.PostRenderFunction;
+
+
+/**
+ * Function to perform manipulations before rendering. This function is called
+ * with the {@link ol.Map} as first and an optional {@link olx.FrameState} as
+ * second argument. Return `true` to keep this function for the next frame,
+ * `false` to remove it.
+ * @typedef {function(ol.Map, ?olx.FrameState): boolean}
+ * @api
+ */
+ol.PreRenderFunction;
diff --git a/src/ol/geolocation.js b/src/ol/geolocation.js
new file mode 100644
index 0000000..aea6daf
--- /dev/null
+++ b/src/ol/geolocation.js
@@ -0,0 +1,406 @@
+// FIXME handle geolocation not supported
+
+goog.provide('ol.Geolocation');
+goog.provide('ol.GeolocationProperty');
+
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.math');
+goog.require('ol.Coordinate');
+goog.require('ol.Object');
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.Polygon');
+goog.require('ol.has');
+goog.require('ol.proj');
+goog.require('ol.sphere.WGS84');
+
+
+/**
+ * @enum {string}
+ */
+ol.GeolocationProperty = {
+  ACCURACY: 'accuracy',
+  ACCURACY_GEOMETRY: 'accuracyGeometry',
+  ALTITUDE: 'altitude',
+  ALTITUDE_ACCURACY: 'altitudeAccuracy',
+  HEADING: 'heading',
+  POSITION: 'position',
+  PROJECTION: 'projection',
+  SPEED: 'speed',
+  TRACKING: 'tracking',
+  TRACKING_OPTIONS: 'trackingOptions'
+};
+
+
+
+/**
+ * @classdesc
+ * Helper class for providing HTML5 Geolocation capabilities.
+ * The [Geolocation API](http://www.w3.org/TR/geolocation-API/)
+ * is used to locate a user's position.
+ *
+ * Example:
+ *
+ *     var geolocation = new ol.Geolocation({
+ *       // take the projection to use from the map's view
+ *       projection: view.getProjection()
+ *     });
+ *     // listen to changes in position
+ *     geolocation.on('change', function(evt) {
+ *       window.console.log(geolocation.getPosition());
+ *     });
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @fires change Triggered when the position changes.
+ * @param {olx.GeolocationOptions=} opt_options Options.
+ * @api stable
+ */
+ol.Geolocation = function(opt_options) {
+
+  goog.base(this);
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * The unprojected (EPSG:4326) device position.
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.position_ = null;
+
+  /**
+   * @private
+   * @type {ol.TransformFunction}
+   */
+  this.transform_ = ol.proj.identityTransform;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.watchId_ = undefined;
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.GeolocationProperty.PROJECTION),
+      this.handleProjectionChanged_, false, this);
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.GeolocationProperty.TRACKING),
+      this.handleTrackingChanged_, false, this);
+
+  if (goog.isDef(options.projection)) {
+    this.setProjection(ol.proj.get(options.projection));
+  }
+  if (goog.isDef(options.trackingOptions)) {
+    this.setTrackingOptions(options.trackingOptions);
+  }
+
+  this.setTracking(goog.isDef(options.tracking) ? options.tracking : false);
+
+};
+goog.inherits(ol.Geolocation, ol.Object);
+
+
+/**
+ * @inheritDoc
+ */
+ol.Geolocation.prototype.disposeInternal = function() {
+  this.setTracking(false);
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * @private
+ */
+ol.Geolocation.prototype.handleProjectionChanged_ = function() {
+  var projection = this.getProjection();
+  if (goog.isDefAndNotNull(projection)) {
+    this.transform_ = ol.proj.getTransformFromProjections(
+        ol.proj.get('EPSG:4326'), projection);
+    if (!goog.isNull(this.position_)) {
+      this.set(
+          ol.GeolocationProperty.POSITION, this.transform_(this.position_));
+    }
+  }
+};
+
+
+/**
+ * @private
+ */
+ol.Geolocation.prototype.handleTrackingChanged_ = function() {
+  if (ol.has.GEOLOCATION) {
+    var tracking = this.getTracking();
+    if (tracking && !goog.isDef(this.watchId_)) {
+      this.watchId_ = goog.global.navigator.geolocation.watchPosition(
+          goog.bind(this.positionChange_, this),
+          goog.bind(this.positionError_, this),
+          this.getTrackingOptions());
+    } else if (!tracking && goog.isDef(this.watchId_)) {
+      goog.global.navigator.geolocation.clearWatch(this.watchId_);
+      this.watchId_ = undefined;
+    }
+  }
+};
+
+
+/**
+ * @private
+ * @param {GeolocationPosition} position position event.
+ */
+ol.Geolocation.prototype.positionChange_ = function(position) {
+  var coords = position.coords;
+  this.set(ol.GeolocationProperty.ACCURACY, coords.accuracy);
+  this.set(ol.GeolocationProperty.ALTITUDE,
+      goog.isNull(coords.altitude) ? undefined : coords.altitude);
+  this.set(ol.GeolocationProperty.ALTITUDE_ACCURACY,
+      goog.isNull(coords.altitudeAccuracy) ?
+      undefined : coords.altitudeAccuracy);
+  this.set(ol.GeolocationProperty.HEADING, goog.isNull(coords.heading) ?
+      undefined : goog.math.toRadians(coords.heading));
+  if (goog.isNull(this.position_)) {
+    this.position_ = [coords.longitude, coords.latitude];
+  } else {
+    this.position_[0] = coords.longitude;
+    this.position_[1] = coords.latitude;
+  }
+  var projectedPosition = this.transform_(this.position_);
+  this.set(ol.GeolocationProperty.POSITION, projectedPosition);
+  this.set(ol.GeolocationProperty.SPEED,
+      goog.isNull(coords.speed) ? undefined : coords.speed);
+  var geometry = ol.geom.Polygon.circular(
+      ol.sphere.WGS84, this.position_, coords.accuracy);
+  geometry.applyTransform(this.transform_);
+  this.set(ol.GeolocationProperty.ACCURACY_GEOMETRY, geometry);
+  this.changed();
+};
+
+
+/**
+ * @private
+ * @param {GeolocationPositionError} error error object.
+ */
+ol.Geolocation.prototype.positionError_ = function(error) {
+  error.type = goog.events.EventType.ERROR;
+  this.setTracking(false);
+  this.dispatchEvent(error);
+};
+
+
+/**
+ * Get the accuracy of the position in meters.
+ * @return {number|undefined} The accuracy of the position measurement in
+ *     meters.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getAccuracy = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.GeolocationProperty.ACCURACY));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getAccuracy',
+    ol.Geolocation.prototype.getAccuracy);
+
+
+/**
+ * Get a geometry of the position accuracy.
+ * @return {?ol.geom.Geometry} A geometry of the position accuracy.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getAccuracyGeometry = function() {
+  return /** @type {?ol.geom.Geometry} */ (
+      this.get(ol.GeolocationProperty.ACCURACY_GEOMETRY) || null);
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getAccuracyGeometry',
+    ol.Geolocation.prototype.getAccuracyGeometry);
+
+
+/**
+ * Get the altitude associated with the position.
+ * @return {number|undefined} The altitude of the position in meters above mean
+ *     sea level.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getAltitude = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.GeolocationProperty.ALTITUDE));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getAltitude',
+    ol.Geolocation.prototype.getAltitude);
+
+
+/**
+ * Get the altitude accuracy of the position.
+ * @return {number|undefined} The accuracy of the altitude measurement in
+ *     meters.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getAltitudeAccuracy = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.GeolocationProperty.ALTITUDE_ACCURACY));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getAltitudeAccuracy',
+    ol.Geolocation.prototype.getAltitudeAccuracy);
+
+
+/**
+ * Get the heading as radians clockwise from North.
+ * @return {number|undefined} The heading of the device in radians from north.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getHeading = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.GeolocationProperty.HEADING));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getHeading',
+    ol.Geolocation.prototype.getHeading);
+
+
+/**
+ * Get the position of the device.
+ * @return {ol.Coordinate|undefined} The current position of the device reported
+ *     in the current projection.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getPosition = function() {
+  return /** @type {ol.Coordinate|undefined} */ (
+      this.get(ol.GeolocationProperty.POSITION));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getPosition',
+    ol.Geolocation.prototype.getPosition);
+
+
+/**
+ * Get the projection associated with the position.
+ * @return {ol.proj.Projection|undefined} The projection the position is
+ *     reported in.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getProjection = function() {
+  return /** @type {ol.proj.Projection|undefined} */ (
+      this.get(ol.GeolocationProperty.PROJECTION));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getProjection',
+    ol.Geolocation.prototype.getProjection);
+
+
+/**
+ * Get the speed in meters per second.
+ * @return {number|undefined} The instantaneous speed of the device in meters
+ *     per second.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getSpeed = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.GeolocationProperty.SPEED));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getSpeed',
+    ol.Geolocation.prototype.getSpeed);
+
+
+/**
+ * Are we tracking the user's position?
+ * @return {boolean} Whether to track the device's position.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getTracking = function() {
+  return /** @type {boolean} */ (
+      this.get(ol.GeolocationProperty.TRACKING));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getTracking',
+    ol.Geolocation.prototype.getTracking);
+
+
+/**
+ * Get the tracking options.
+ * @see http://www.w3.org/TR/geolocation-API/#position-options
+ * @return {GeolocationPositionOptions|undefined} PositionOptions as defined by
+ *     the HTML5 Geolocation spec at
+ *     {@link http://www.w3.org/TR/geolocation-API/#position_options_interface}
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.getTrackingOptions = function() {
+  return /** @type {GeolocationPositionOptions|undefined} */ (
+      this.get(ol.GeolocationProperty.TRACKING_OPTIONS));
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'getTrackingOptions',
+    ol.Geolocation.prototype.getTrackingOptions);
+
+
+/**
+ * Set the projection to use for transforming the coordinates.
+ * @param {ol.proj.Projection} projection The projection the position is
+ *     reported in.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.setProjection = function(projection) {
+  this.set(ol.GeolocationProperty.PROJECTION, projection);
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'setProjection',
+    ol.Geolocation.prototype.setProjection);
+
+
+/**
+ * Enable/disable tracking.
+ * @param {boolean} tracking Whether to track the device's position.
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.setTracking = function(tracking) {
+  this.set(ol.GeolocationProperty.TRACKING, tracking);
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'setTracking',
+    ol.Geolocation.prototype.setTracking);
+
+
+/**
+ * Set the tracking options.
+ * @see http://www.w3.org/TR/geolocation-API/#position-options
+ * @param {GeolocationPositionOptions} options PositionOptions as defined by the
+ *     HTML5 Geolocation spec at
+ *     {@link http://www.w3.org/TR/geolocation-API/#position_options_interface}
+ * @observable
+ * @api stable
+ */
+ol.Geolocation.prototype.setTrackingOptions = function(options) {
+  this.set(ol.GeolocationProperty.TRACKING_OPTIONS, options);
+};
+goog.exportProperty(
+    ol.Geolocation.prototype,
+    'setTrackingOptions',
+    ol.Geolocation.prototype.setTrackingOptions);
diff --git a/src/ol/geom/circle.js b/src/ol/geom/circle.js
new file mode 100644
index 0000000..cc32031
--- /dev/null
+++ b/src/ol/geom/circle.js
@@ -0,0 +1,236 @@
+goog.provide('ol.geom.Circle');
+
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.proj');
+
+
+
+/**
+ * @classdesc
+ * Circle geometry.
+ *
+ * @constructor
+ * @extends {ol.geom.SimpleGeometry}
+ * @param {ol.Coordinate} center Center.
+ * @param {number=} opt_radius Radius.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api
+ */
+ol.geom.Circle = function(center, opt_radius, opt_layout) {
+  goog.base(this);
+  var radius = goog.isDef(opt_radius) ? opt_radius : 0;
+  this.setCenterAndRadius(center, radius,
+      /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
+};
+goog.inherits(ol.geom.Circle, ol.geom.SimpleGeometry);
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.Circle} Clone.
+ * @api
+ */
+ol.geom.Circle.prototype.clone = function() {
+  var circle = new ol.geom.Circle(null);
+  circle.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
+  return circle;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.Circle.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  var flatCoordinates = this.flatCoordinates;
+  var dx = x - flatCoordinates[0];
+  var dy = y - flatCoordinates[1];
+  var squaredDistance = dx * dx + dy * dy;
+  if (squaredDistance < minSquaredDistance) {
+    var i;
+    if (squaredDistance === 0) {
+      for (i = 0; i < this.stride; ++i) {
+        closestPoint[i] = flatCoordinates[i];
+      }
+    } else {
+      var delta = this.getRadius() / Math.sqrt(squaredDistance);
+      closestPoint[0] = flatCoordinates[0] + delta * dx;
+      closestPoint[1] = flatCoordinates[1] + delta * dy;
+      for (i = 2; i < this.stride; ++i) {
+        closestPoint[i] = flatCoordinates[i];
+      }
+    }
+    closestPoint.length = this.stride;
+    return squaredDistance;
+  } else {
+    return minSquaredDistance;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.Circle.prototype.containsXY = function(x, y) {
+  var flatCoordinates = this.flatCoordinates;
+  var dx = x - flatCoordinates[0];
+  var dy = y - flatCoordinates[1];
+  return dx * dx + dy * dy <= this.getRadiusSquared_();
+};
+
+
+/**
+ * @return {ol.Coordinate} Center.
+ * @api
+ */
+ol.geom.Circle.prototype.getCenter = function() {
+  return this.flatCoordinates.slice(0, this.stride);
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.Circle.prototype.getExtent = function(opt_extent) {
+  if (this.extentRevision != this.getRevision()) {
+    var flatCoordinates = this.flatCoordinates;
+    var radius = flatCoordinates[this.stride] - flatCoordinates[0];
+    this.extent = ol.extent.createOrUpdate(
+        flatCoordinates[0] - radius, flatCoordinates[1] - radius,
+        flatCoordinates[0] + radius, flatCoordinates[1] + radius,
+        this.extent);
+    this.extentRevision = this.getRevision();
+  }
+  goog.asserts.assert(goog.isDef(this.extent));
+  return ol.extent.returnOrUpdate(this.extent, opt_extent);
+};
+
+
+/**
+ * @return {number} Radius.
+ * @api
+ */
+ol.geom.Circle.prototype.getRadius = function() {
+  return Math.sqrt(this.getRadiusSquared_());
+};
+
+
+/**
+ * @private
+ * @return {number} Radius squared.
+ */
+ol.geom.Circle.prototype.getRadiusSquared_ = function() {
+  var dx = this.flatCoordinates[this.stride] - this.flatCoordinates[0];
+  var dy = this.flatCoordinates[this.stride + 1] - this.flatCoordinates[1];
+  return dx * dx + dy * dy;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.Circle.prototype.getType = function() {
+  return ol.geom.GeometryType.CIRCLE;
+};
+
+
+/**
+ * @param {ol.Coordinate} center Center.
+ * @api
+ */
+ol.geom.Circle.prototype.setCenter = function(center) {
+  var stride = this.stride;
+  goog.asserts.assert(center.length == stride);
+  var radius = this.flatCoordinates[stride] - this.flatCoordinates[0];
+  var flatCoordinates = center.slice();
+  flatCoordinates[stride] = flatCoordinates[0] + radius;
+  var i;
+  for (i = 1; i < stride; ++i) {
+    flatCoordinates[stride + i] = center[i];
+  }
+  this.setFlatCoordinates(this.layout, flatCoordinates);
+};
+
+
+/**
+ * @param {ol.Coordinate} center Center.
+ * @param {number} radius Radius.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api
+ */
+ol.geom.Circle.prototype.setCenterAndRadius =
+    function(center, radius, opt_layout) {
+  if (goog.isNull(center)) {
+    this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
+  } else {
+    this.setLayout(opt_layout, center, 0);
+    if (goog.isNull(this.flatCoordinates)) {
+      this.flatCoordinates = [];
+    }
+    /** @type {Array.<number>} */
+    var flatCoordinates = this.flatCoordinates;
+    var offset = ol.geom.flat.deflate.coordinate(
+        flatCoordinates, 0, center, this.stride);
+    flatCoordinates[offset++] = flatCoordinates[0] + radius;
+    var i, ii;
+    for (i = 1, ii = this.stride; i < ii; ++i) {
+      flatCoordinates[offset++] = flatCoordinates[i];
+    }
+    flatCoordinates.length = offset;
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ */
+ol.geom.Circle.prototype.setFlatCoordinates =
+    function(layout, flatCoordinates) {
+  this.setFlatCoordinatesInternal(layout, flatCoordinates);
+  this.changed();
+};
+
+
+/**
+ * The radius is in the units of the projection.
+ * @param {number} radius Radius.
+ * @api
+ */
+ol.geom.Circle.prototype.setRadius = function(radius) {
+  goog.asserts.assert(!goog.isNull(this.flatCoordinates));
+  this.flatCoordinates[this.stride] = this.flatCoordinates[0] + radius;
+  this.changed();
+};
+
+
+/**
+ * Transform each coordinate of the circle from one coordinate reference system
+ * to another. The geometry is modified in place.
+ * If you do not want the geometry modified in place, first clone() it and
+ * then use this function on the clone.
+ *
+ * Internally a circle is currently represented by two points: the center of
+ * the circle `[cx, cy]`, and the point to the right of the circle
+ * `[cx + r, cy]`. This `transform` function just transforms these two points.
+ * So the resulting geometry is also a circle, and that circle does not
+ * correspond to the shape that would be obtained by transforming every point
+ * of the original circle.
+ *
+ * @param {ol.proj.ProjectionLike} source The current projection.  Can be a
+ *     string identifier or a {@link ol.proj.Projection} object.
+ * @param {ol.proj.ProjectionLike} destination The desired projection.  Can be a
+ *     string identifier or a {@link ol.proj.Projection} object.
+ * @return {ol.geom.Circle} This geometry.  Note that original geometry is
+ *     modified in place.
+ * @function
+ * @api stable
+ */
+ol.geom.Circle.prototype.transform;
diff --git a/src/ol/geom/flat/areaflatgeom.js b/src/ol/geom/flat/areaflatgeom.js
new file mode 100644
index 0000000..eb0b1e4
--- /dev/null
+++ b/src/ol/geom/flat/areaflatgeom.js
@@ -0,0 +1,64 @@
+goog.provide('ol.geom.flat.area');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @return {number} Area.
+ */
+ol.geom.flat.area.linearRing = function(flatCoordinates, offset, end, stride) {
+  var twiceArea = 0;
+  var x1 = flatCoordinates[end - stride];
+  var y1 = flatCoordinates[end - stride + 1];
+  for (; offset < end; offset += stride) {
+    var x2 = flatCoordinates[offset];
+    var y2 = flatCoordinates[offset + 1];
+    twiceArea += y1 * x2 - x1 * y2;
+    x1 = x2;
+    y1 = y2;
+  }
+  return twiceArea / 2;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @return {number} Area.
+ */
+ol.geom.flat.area.linearRings =
+    function(flatCoordinates, offset, ends, stride) {
+  var area = 0;
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    area += ol.geom.flat.area.linearRing(flatCoordinates, offset, end, stride);
+    offset = end;
+  }
+  return area;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @return {number} Area.
+ */
+ol.geom.flat.area.linearRingss =
+    function(flatCoordinates, offset, endss, stride) {
+  var area = 0;
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    area +=
+        ol.geom.flat.area.linearRings(flatCoordinates, offset, ends, stride);
+    offset = ends[ends.length - 1];
+  }
+  return area;
+};
diff --git a/src/ol/geom/flat/centerflatgeom.js b/src/ol/geom/flat/centerflatgeom.js
new file mode 100644
index 0000000..81f2436
--- /dev/null
+++ b/src/ol/geom/flat/centerflatgeom.js
@@ -0,0 +1,26 @@
+goog.provide('ol.geom.flat.center');
+
+goog.require('ol.extent');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @return {Array.<number>} Flat centers.
+ */
+ol.geom.flat.center.linearRingss =
+    function(flatCoordinates, offset, endss, stride) {
+  var flatCenters = [];
+  var i, ii;
+  var extent = ol.extent.createEmpty();
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    extent = ol.extent.createOrUpdateFromFlatCoordinates(
+        flatCoordinates, offset, ends[0], stride);
+    flatCenters.push((extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2);
+    offset = ends[ends.length - 1];
+  }
+  return flatCenters;
+};
diff --git a/src/ol/geom/flat/closestflatgeom.js b/src/ol/geom/flat/closestflatgeom.js
new file mode 100644
index 0000000..9170d24
--- /dev/null
+++ b/src/ol/geom/flat/closestflatgeom.js
@@ -0,0 +1,260 @@
+goog.provide('ol.geom.flat.closest');
+
+goog.require('goog.asserts');
+goog.require('goog.math');
+goog.require('ol.math');
+
+
+/**
+ * Returns the point on the 2D line segment flatCoordinates[offset1] to
+ * flatCoordinates[offset2] that is closest to the point (x, y).  Extra
+ * dimensions are linearly interpolated.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset1 Offset 1.
+ * @param {number} offset2 Offset 2.
+ * @param {number} stride Stride.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @param {Array.<number>} closestPoint Closest point.
+ */
+ol.geom.flat.closest.point =
+    function(flatCoordinates, offset1, offset2, stride, x, y, closestPoint) {
+  var x1 = flatCoordinates[offset1];
+  var y1 = flatCoordinates[offset1 + 1];
+  var dx = flatCoordinates[offset2] - x1;
+  var dy = flatCoordinates[offset2 + 1] - y1;
+  var i, offset;
+  if (dx === 0 && dy === 0) {
+    offset = offset1;
+  } else {
+    var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);
+    if (t > 1) {
+      offset = offset2;
+    } else if (t > 0) {
+      for (i = 0; i < stride; ++i) {
+        closestPoint[i] = goog.math.lerp(flatCoordinates[offset1 + i],
+            flatCoordinates[offset2 + i], t);
+      }
+      closestPoint.length = stride;
+      return;
+    } else {
+      offset = offset1;
+    }
+  }
+  for (i = 0; i < stride; ++i) {
+    closestPoint[i] = flatCoordinates[offset + i];
+  }
+  closestPoint.length = stride;
+};
+
+
+/**
+ * Return the squared of the largest distance between any pair of consecutive
+ * coordinates.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} maxSquaredDelta Max squared delta.
+ * @return {number} Max squared delta.
+ */
+ol.geom.flat.closest.getMaxSquaredDelta =
+    function(flatCoordinates, offset, end, stride, maxSquaredDelta) {
+  var x1 = flatCoordinates[offset];
+  var y1 = flatCoordinates[offset + 1];
+  for (offset += stride; offset < end; offset += stride) {
+    var x2 = flatCoordinates[offset];
+    var y2 = flatCoordinates[offset + 1];
+    var squaredDelta = ol.math.squaredDistance(x1, y1, x2, y2);
+    if (squaredDelta > maxSquaredDelta) {
+      maxSquaredDelta = squaredDelta;
+    }
+    x1 = x2;
+    y1 = y2;
+  }
+  return maxSquaredDelta;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {number} maxSquaredDelta Max squared delta.
+ * @return {number} Max squared delta.
+ */
+ol.geom.flat.closest.getsMaxSquaredDelta =
+    function(flatCoordinates, offset, ends, stride, maxSquaredDelta) {
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    maxSquaredDelta = ol.geom.flat.closest.getMaxSquaredDelta(
+        flatCoordinates, offset, end, stride, maxSquaredDelta);
+    offset = end;
+  }
+  return maxSquaredDelta;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @param {number} maxSquaredDelta Max squared delta.
+ * @return {number} Max squared delta.
+ */
+ol.geom.flat.closest.getssMaxSquaredDelta =
+    function(flatCoordinates, offset, endss, stride, maxSquaredDelta) {
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    maxSquaredDelta = ol.geom.flat.closest.getsMaxSquaredDelta(
+        flatCoordinates, offset, ends, stride, maxSquaredDelta);
+    offset = ends[ends.length - 1];
+  }
+  return maxSquaredDelta;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} maxDelta Max delta.
+ * @param {boolean} isRing Is ring.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @param {Array.<number>} closestPoint Closest point.
+ * @param {number} minSquaredDistance Minimum squared distance.
+ * @param {Array.<number>=} opt_tmpPoint Temporary point object.
+ * @return {number} Minimum squared distance.
+ */
+ol.geom.flat.closest.getClosestPoint = function(flatCoordinates, offset, end,
+    stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance,
+    opt_tmpPoint) {
+  if (offset == end) {
+    return minSquaredDistance;
+  }
+  var i, squaredDistance;
+  if (maxDelta === 0) {
+    // All points are identical, so just test the first point.
+    squaredDistance = ol.math.squaredDistance(
+        x, y, flatCoordinates[offset], flatCoordinates[offset + 1]);
+    if (squaredDistance < minSquaredDistance) {
+      for (i = 0; i < stride; ++i) {
+        closestPoint[i] = flatCoordinates[offset + i];
+      }
+      closestPoint.length = stride;
+      return squaredDistance;
+    } else {
+      return minSquaredDistance;
+    }
+  }
+  goog.asserts.assert(maxDelta > 0);
+  var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN];
+  var index = offset + stride;
+  while (index < end) {
+    ol.geom.flat.closest.point(
+        flatCoordinates, index - stride, index, stride, x, y, tmpPoint);
+    squaredDistance = ol.math.squaredDistance(x, y, tmpPoint[0], tmpPoint[1]);
+    if (squaredDistance < minSquaredDistance) {
+      minSquaredDistance = squaredDistance;
+      for (i = 0; i < stride; ++i) {
+        closestPoint[i] = tmpPoint[i];
+      }
+      closestPoint.length = stride;
+      index += stride;
+    } else {
+      // Skip ahead multiple points, because we know that all the skipped
+      // points cannot be any closer than the closest point we have found so
+      // far.  We know this because we know how close the current point is, how
+      // close the closest point we have found so far is, and the maximum
+      // distance between consecutive points.  For example, if we're currently
+      // at distance 10, the best we've found so far is 3, and that the maximum
+      // distance between consecutive points is 2, then we'll need to skip at
+      // least (10 - 3) / 2 == 3 (rounded down) points to have any chance of
+      // finding a closer point.  We use Math.max(..., 1) to ensure that we
+      // always advance at least one point, to avoid an infinite loop.
+      index += stride * Math.max(
+          ((Math.sqrt(squaredDistance) -
+            Math.sqrt(minSquaredDistance)) / maxDelta) | 0, 1);
+    }
+  }
+  if (isRing) {
+    // Check the closing segment.
+    ol.geom.flat.closest.point(
+        flatCoordinates, end - stride, offset, stride, x, y, tmpPoint);
+    squaredDistance = ol.math.squaredDistance(x, y, tmpPoint[0], tmpPoint[1]);
+    if (squaredDistance < minSquaredDistance) {
+      minSquaredDistance = squaredDistance;
+      for (i = 0; i < stride; ++i) {
+        closestPoint[i] = tmpPoint[i];
+      }
+      closestPoint.length = stride;
+    }
+  }
+  return minSquaredDistance;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {number} maxDelta Max delta.
+ * @param {boolean} isRing Is ring.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @param {Array.<number>} closestPoint Closest point.
+ * @param {number} minSquaredDistance Minimum squared distance.
+ * @param {Array.<number>=} opt_tmpPoint Temporary point object.
+ * @return {number} Minimum squared distance.
+ */
+ol.geom.flat.closest.getsClosestPoint = function(flatCoordinates, offset, ends,
+    stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance,
+    opt_tmpPoint) {
+  var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN];
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    minSquaredDistance = ol.geom.flat.closest.getClosestPoint(
+        flatCoordinates, offset, end, stride,
+        maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint);
+    offset = end;
+  }
+  return minSquaredDistance;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @param {number} maxDelta Max delta.
+ * @param {boolean} isRing Is ring.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @param {Array.<number>} closestPoint Closest point.
+ * @param {number} minSquaredDistance Minimum squared distance.
+ * @param {Array.<number>=} opt_tmpPoint Temporary point object.
+ * @return {number} Minimum squared distance.
+ */
+ol.geom.flat.closest.getssClosestPoint = function(flatCoordinates, offset,
+    endss, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance,
+    opt_tmpPoint) {
+  var tmpPoint = goog.isDef(opt_tmpPoint) ? opt_tmpPoint : [NaN, NaN];
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    minSquaredDistance = ol.geom.flat.closest.getsClosestPoint(
+        flatCoordinates, offset, ends, stride,
+        maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint);
+    offset = ends[ends.length - 1];
+  }
+  return minSquaredDistance;
+};
diff --git a/src/ol/geom/flat/containsflatgeom.js b/src/ol/geom/flat/containsflatgeom.js
new file mode 100644
index 0000000..1837945
--- /dev/null
+++ b/src/ol/geom/flat/containsflatgeom.js
@@ -0,0 +1,114 @@
+goog.provide('ol.geom.flat.contains');
+
+goog.require('goog.asserts');
+goog.require('ol.extent');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} Contains extent.
+ */
+ol.geom.flat.contains.linearRingContainsExtent =
+    function(flatCoordinates, offset, end, stride, extent) {
+  var outside = ol.extent.forEachCorner(extent,
+      /**
+       * @param {ol.Coordinate} coordinate Coordinate.
+       */
+      function(coordinate) {
+        return !ol.geom.flat.contains.linearRingContainsXY(flatCoordinates,
+            offset, end, stride, coordinate[0], coordinate[1]);
+      });
+  return !outside;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @return {boolean} Contains (x, y).
+ */
+ol.geom.flat.contains.linearRingContainsXY =
+    function(flatCoordinates, offset, end, stride, x, y) {
+  // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
+  var contains = false;
+  var x1 = flatCoordinates[end - stride];
+  var y1 = flatCoordinates[end - stride + 1];
+  for (; offset < end; offset += stride) {
+    var x2 = flatCoordinates[offset];
+    var y2 = flatCoordinates[offset + 1];
+    var intersect = ((y1 > y) != (y2 > y)) &&
+        (x < (x2 - x1) * (y - y1) / (y2 - y1) + x1);
+    if (intersect) {
+      contains = !contains;
+    }
+    x1 = x2;
+    y1 = y2;
+  }
+  return contains;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @return {boolean} Contains (x, y).
+ */
+ol.geom.flat.contains.linearRingsContainsXY =
+    function(flatCoordinates, offset, ends, stride, x, y) {
+  goog.asserts.assert(ends.length > 0);
+  if (ends.length === 0) {
+    return false;
+  }
+  if (!ol.geom.flat.contains.linearRingContainsXY(
+      flatCoordinates, offset, ends[0], stride, x, y)) {
+    return false;
+  }
+  var i, ii;
+  for (i = 1, ii = ends.length; i < ii; ++i) {
+    if (ol.geom.flat.contains.linearRingContainsXY(
+        flatCoordinates, ends[i - 1], ends[i], stride, x, y)) {
+      return false;
+    }
+  }
+  return true;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @return {boolean} Contains (x, y).
+ */
+ol.geom.flat.contains.linearRingssContainsXY =
+    function(flatCoordinates, offset, endss, stride, x, y) {
+  goog.asserts.assert(endss.length > 0);
+  if (endss.length === 0) {
+    return false;
+  }
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    if (ol.geom.flat.contains.linearRingsContainsXY(
+        flatCoordinates, offset, ends, stride, x, y)) {
+      return true;
+    }
+    offset = ends[ends.length - 1];
+  }
+  return false;
+};
diff --git a/src/ol/geom/flat/deflateflatgeom.js b/src/ol/geom/flat/deflateflatgeom.js
new file mode 100644
index 0000000..e0aca18
--- /dev/null
+++ b/src/ol/geom/flat/deflateflatgeom.js
@@ -0,0 +1,91 @@
+goog.provide('ol.geom.flat.deflate');
+
+goog.require('goog.asserts');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} stride Stride.
+ * @return {number} offset Offset.
+ */
+ol.geom.flat.deflate.coordinate =
+    function(flatCoordinates, offset, coordinate, stride) {
+  goog.asserts.assert(coordinate.length == stride);
+  var i, ii;
+  for (i = 0, ii = coordinate.length; i < ii; ++i) {
+    flatCoordinates[offset++] = coordinate[i];
+  }
+  return offset;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @param {number} stride Stride.
+ * @return {number} offset Offset.
+ */
+ol.geom.flat.deflate.coordinates =
+    function(flatCoordinates, offset, coordinates, stride) {
+  var i, ii;
+  for (i = 0, ii = coordinates.length; i < ii; ++i) {
+    var coordinate = coordinates[i];
+    goog.asserts.assert(coordinate.length == stride);
+    var j;
+    for (j = 0; j < stride; ++j) {
+      flatCoordinates[offset++] = coordinate[j];
+    }
+  }
+  return offset;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<ol.Coordinate>>} coordinatess Coordinatess.
+ * @param {number} stride Stride.
+ * @param {Array.<number>=} opt_ends Ends.
+ * @return {Array.<number>} Ends.
+ */
+ol.geom.flat.deflate.coordinatess =
+    function(flatCoordinates, offset, coordinatess, stride, opt_ends) {
+  var ends = goog.isDef(opt_ends) ? opt_ends : [];
+  var i = 0;
+  var j, jj;
+  for (j = 0, jj = coordinatess.length; j < jj; ++j) {
+    var end = ol.geom.flat.deflate.coordinates(
+        flatCoordinates, offset, coordinatess[j], stride);
+    ends[i++] = end;
+    offset = end;
+  }
+  ends.length = i;
+  return ends;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<Array.<ol.Coordinate>>>} coordinatesss Coordinatesss.
+ * @param {number} stride Stride.
+ * @param {Array.<Array.<number>>=} opt_endss Endss.
+ * @return {Array.<Array.<number>>} Endss.
+ */
+ol.geom.flat.deflate.coordinatesss =
+    function(flatCoordinates, offset, coordinatesss, stride, opt_endss) {
+  var endss = goog.isDef(opt_endss) ? opt_endss : [];
+  var i = 0;
+  var j, jj;
+  for (j = 0, jj = coordinatesss.length; j < jj; ++j) {
+    var ends = ol.geom.flat.deflate.coordinatess(
+        flatCoordinates, offset, coordinatesss[j], stride, endss[i]);
+    endss[i++] = ends;
+    offset = ends[ends.length - 1];
+  }
+  endss.length = i;
+  return endss;
+};
diff --git a/src/ol/geom/flat/flipflatgeom.js b/src/ol/geom/flat/flipflatgeom.js
new file mode 100644
index 0000000..220f211
--- /dev/null
+++ b/src/ol/geom/flat/flipflatgeom.js
@@ -0,0 +1,37 @@
+goog.provide('ol.geom.flat.flip');
+
+goog.require('goog.asserts');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {Array.<number>=} opt_dest Destination.
+ * @param {number=} opt_destOffset Destination offset.
+ * @return {Array.<number>} Flat coordinates.
+ */
+ol.geom.flat.flip.flipXY =
+    function(flatCoordinates, offset, end, stride, opt_dest, opt_destOffset) {
+  var dest, destOffset;
+  if (goog.isDef(opt_dest)) {
+    dest = opt_dest;
+    destOffset = goog.isDef(opt_destOffset) ? opt_destOffset : 0;
+  } else {
+    goog.asserts.assert(!goog.isDef(opt_destOffset));
+    dest = [];
+    destOffset = 0;
+  }
+  var j, k;
+  for (j = offset; j < end; ) {
+    var x = flatCoordinates[j++];
+    dest[destOffset++] = flatCoordinates[j++];
+    dest[destOffset++] = x;
+    for (k = 2; k < stride; ++k) {
+      dest[destOffset++] = flatCoordinates[j++];
+    }
+  }
+  dest.length = destOffset;
+  return dest;
+};
diff --git a/src/ol/geom/flat/geodesicflatgeom.js b/src/ol/geom/flat/geodesicflatgeom.js
new file mode 100644
index 0000000..53d3aa8
--- /dev/null
+++ b/src/ol/geom/flat/geodesicflatgeom.js
@@ -0,0 +1,180 @@
+goog.provide('ol.geom.flat.geodesic');
+
+goog.require('goog.asserts');
+goog.require('goog.math');
+goog.require('goog.object');
+goog.require('ol.TransformFunction');
+goog.require('ol.math');
+goog.require('ol.proj');
+
+
+/**
+ * @private
+ * @param {function(number): ol.Coordinate} interpolate Interpolate function.
+ * @param {ol.TransformFunction} transform Transform from longitude/latitude to
+ *     projected coordinates.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @return {Array.<number>} Flat coordinates.
+ */
+ol.geom.flat.geodesic.line_ =
+    function(interpolate, transform, squaredTolerance) {
+  // FIXME reduce garbage generation
+  // FIXME optimize stack operations
+
+  /** @type {Array.<number>} */
+  var flatCoordinates = [];
+
+  var geoA = interpolate(0);
+  var geoB = interpolate(1);
+
+  var a = transform(geoA);
+  var b = transform(geoB);
+
+  /** @type {Array.<ol.Coordinate>} */
+  var geoStack = [geoB, geoA];
+  /** @type {Array.<ol.Coordinate>} */
+  var stack = [b, a];
+  /** @type {Array.<number>} */
+  var fractionStack = [1, 0];
+
+  /** @type {Object.<number, boolean>} */
+  var fractions = {};
+
+  var maxIterations = 1e5;
+  var geoM, m, fracA, fracB, fracM, key;
+
+  while (--maxIterations > 0 && fractionStack.length > 0) {
+    // Pop the a coordinate off the stack
+    fracA = fractionStack.pop();
+    geoA = geoStack.pop();
+    a = stack.pop();
+    // Add the a coordinate if it has not been added yet
+    key = fracA.toString();
+    if (!goog.object.containsKey(fractions, key)) {
+      flatCoordinates.push(a[0], a[1]);
+      goog.object.set(fractions, key, true);
+    }
+    // Pop the b coordinate off the stack
+    fracB = fractionStack.pop();
+    geoB = geoStack.pop();
+    b = stack.pop();
+    // Find the m point between the a and b coordinates
+    fracM = (fracA + fracB) / 2;
+    geoM = interpolate(fracM);
+    m = transform(geoM);
+    if (ol.math.squaredSegmentDistance(m[0], m[1], a[0], a[1],
+        b[0], b[1]) < squaredTolerance) {
+      // If the m point is sufficiently close to the straight line, then we
+      // discard it.  Just use the b coordinate and move on to the next line
+      // segment.
+      flatCoordinates.push(b[0], b[1]);
+      key = fracB.toString();
+      goog.asserts.assert(!goog.object.containsKey(fractions, key));
+      goog.object.set(fractions, key, true);
+    } else {
+      // Otherwise, we need to subdivide the current line segment.  Split it
+      // into two and push the two line segments onto the stack.
+      fractionStack.push(fracB, fracM, fracM, fracA);
+      stack.push(b, m, m, a);
+      geoStack.push(geoB, geoM, geoM, geoA);
+    }
+  }
+  goog.asserts.assert(maxIterations > 0);
+
+  return flatCoordinates;
+};
+
+
+/**
+* Generate a great-circle arcs between two lat/lon points.
+* @param {number} lon1 Longitude 1 in degrees.
+* @param {number} lat1 Latitude 1 in degrees.
+* @param {number} lon2 Longitude 2 in degrees.
+* @param {number} lat2 Latitude 2 in degrees.
+ * @param {ol.proj.Projection} projection Projection.
+* @param {number} squaredTolerance Squared tolerance.
+* @return {Array.<number>} Flat coordinates.
+*/
+ol.geom.flat.geodesic.greatCircleArc = function(
+    lon1, lat1, lon2, lat2, projection, squaredTolerance) {
+
+  var geoProjection = ol.proj.get('EPSG:4326');
+
+  var cosLat1 = Math.cos(goog.math.toRadians(lat1));
+  var sinLat1 = Math.sin(goog.math.toRadians(lat1));
+  var cosLat2 = Math.cos(goog.math.toRadians(lat2));
+  var sinLat2 = Math.sin(goog.math.toRadians(lat2));
+  var cosDeltaLon = Math.cos(goog.math.toRadians(lon2 - lon1));
+  var sinDeltaLon = Math.sin(goog.math.toRadians(lon2 - lon1));
+  var d = sinLat1 * sinLat2 + cosLat1 * cosLat2 * cosDeltaLon;
+
+  return ol.geom.flat.geodesic.line_(
+      /**
+       * @param {number} frac Fraction.
+       * @return {ol.Coordinate} Coordinate.
+       */
+      function(frac) {
+        if (1 <= d) {
+          return [lon2, lat2];
+        }
+        var D = frac * Math.acos(d);
+        var cosD = Math.cos(D);
+        var sinD = Math.sin(D);
+        var y = sinDeltaLon * cosLat2;
+        var x = cosLat1 * sinLat2 - sinLat1 * cosLat2 * cosDeltaLon;
+        var theta = Math.atan2(y, x);
+        var lat = Math.asin(sinLat1 * cosD + cosLat1 * sinD * Math.cos(theta));
+        var lon = goog.math.toRadians(lon1) +
+            Math.atan2(Math.sin(theta) * sinD * cosLat1,
+                       cosD - sinLat1 * Math.sin(lat));
+        return [goog.math.toDegrees(lon), goog.math.toDegrees(lat)];
+      }, ol.proj.getTransform(geoProjection, projection), squaredTolerance);
+};
+
+
+/**
+ * Generate a meridian (line at constant longitude).
+ * @param {number} lon Longitude.
+ * @param {number} lat1 Latitude 1.
+ * @param {number} lat2 Latitude 2.
+ * @param {ol.proj.Projection} projection Projection.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @return {Array.<number>} Flat coordinates.
+ */
+ol.geom.flat.geodesic.meridian =
+    function(lon, lat1, lat2, projection, squaredTolerance) {
+  var epsg4326Projection = ol.proj.get('EPSG:4326');
+  return ol.geom.flat.geodesic.line_(
+      /**
+       * @param {number} frac Fraction.
+       * @return {ol.Coordinate} Coordinate.
+       */
+      function(frac) {
+        return [lon, lat1 + ((lat2 - lat1) * frac)];
+      },
+      ol.proj.getTransform(epsg4326Projection, projection), squaredTolerance);
+};
+
+
+/**
+ * Generate a parallel (line at constant latitude).
+ * @param {number} lat Latitude.
+ * @param {number} lon1 Longitude 1.
+ * @param {number} lon2 Longitude 2.
+ * @param {ol.proj.Projection} projection Projection.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @return {Array.<number>} Flat coordinates.
+ */
+ol.geom.flat.geodesic.parallel =
+    function(lat, lon1, lon2, projection, squaredTolerance) {
+  var epsg4326Projection = ol.proj.get('EPSG:4326');
+  return ol.geom.flat.geodesic.line_(
+      /**
+       * @param {number} frac Fraction.
+       * @return {ol.Coordinate} Coordinate.
+       */
+      function(frac) {
+        return [lon1 + ((lon2 - lon1) * frac), lat];
+      },
+      ol.proj.getTransform(epsg4326Projection, projection), squaredTolerance);
+};
diff --git a/src/ol/geom/flat/inflateflatgeom.js b/src/ol/geom/flat/inflateflatgeom.js
new file mode 100644
index 0000000..53c4620
--- /dev/null
+++ b/src/ol/geom/flat/inflateflatgeom.js
@@ -0,0 +1,71 @@
+goog.provide('ol.geom.flat.inflate');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {Array.<ol.Coordinate>=} opt_coordinates Coordinates.
+ * @return {Array.<ol.Coordinate>} Coordinates.
+ */
+ol.geom.flat.inflate.coordinates =
+    function(flatCoordinates, offset, end, stride, opt_coordinates) {
+  var coordinates = goog.isDef(opt_coordinates) ? opt_coordinates : [];
+  var i = 0;
+  var j;
+  for (j = offset; j < end; j += stride) {
+    coordinates[i++] = flatCoordinates.slice(j, j + stride);
+  }
+  coordinates.length = i;
+  return coordinates;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {Array.<Array.<ol.Coordinate>>=} opt_coordinatess Coordinatess.
+ * @return {Array.<Array.<ol.Coordinate>>} Coordinatess.
+ */
+ol.geom.flat.inflate.coordinatess =
+    function(flatCoordinates, offset, ends, stride, opt_coordinatess) {
+  var coordinatess = goog.isDef(opt_coordinatess) ? opt_coordinatess : [];
+  var i = 0;
+  var j, jj;
+  for (j = 0, jj = ends.length; j < jj; ++j) {
+    var end = ends[j];
+    coordinatess[i++] = ol.geom.flat.inflate.coordinates(
+        flatCoordinates, offset, end, stride, coordinatess[i]);
+    offset = end;
+  }
+  coordinatess.length = i;
+  return coordinatess;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @param {Array.<Array.<Array.<ol.Coordinate>>>=} opt_coordinatesss
+ *     Coordinatesss.
+ * @return {Array.<Array.<Array.<ol.Coordinate>>>} Coordinatesss.
+ */
+ol.geom.flat.inflate.coordinatesss =
+    function(flatCoordinates, offset, endss, stride, opt_coordinatesss) {
+  var coordinatesss = goog.isDef(opt_coordinatesss) ? opt_coordinatesss : [];
+  var i = 0;
+  var j, jj;
+  for (j = 0, jj = endss.length; j < jj; ++j) {
+    var ends = endss[j];
+    coordinatesss[i++] = ol.geom.flat.inflate.coordinatess(
+        flatCoordinates, offset, ends, stride, coordinatesss[i]);
+    offset = ends[ends.length - 1];
+  }
+  coordinatesss.length = i;
+  return coordinatesss;
+};
diff --git a/src/ol/geom/flat/interiorpointflatgeom.js b/src/ol/geom/flat/interiorpointflatgeom.js
new file mode 100644
index 0000000..bc8d108
--- /dev/null
+++ b/src/ol/geom/flat/interiorpointflatgeom.js
@@ -0,0 +1,92 @@
+goog.provide('ol.geom.flat.interiorpoint');
+
+goog.require('goog.asserts');
+goog.require('ol.geom.flat.contains');
+
+
+/**
+ * Calculates a point that is likely to lie in the interior of the linear rings.
+ * Inspired by JTS's com.vividsolutions.jts.geom.Geometry#getInteriorPoint.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {Array.<number>} flatCenters Flat centers.
+ * @param {number} flatCentersOffset Flat center offset.
+ * @param {Array.<number>=} opt_dest Destination.
+ * @return {Array.<number>} Destination.
+ */
+ol.geom.flat.interiorpoint.linearRings = function(flatCoordinates, offset,
+    ends, stride, flatCenters, flatCentersOffset, opt_dest) {
+  var i, ii, x, x1, x2, y1, y2;
+  var y = flatCenters[flatCentersOffset + 1];
+  /** @type {Array.<number>} */
+  var intersections = [];
+  // Calculate intersections with the horizontal line
+  var end = ends[0];
+  x1 = flatCoordinates[end - stride];
+  y1 = flatCoordinates[end - stride + 1];
+  for (i = offset; i < end; i += stride) {
+    x2 = flatCoordinates[i];
+    y2 = flatCoordinates[i + 1];
+    if ((y <= y1 && y2 <= y) || (y1 <= y && y <= y2)) {
+      x = (y - y1) / (y2 - y1) * (x2 - x1) + x1;
+      intersections.push(x);
+    }
+    x1 = x2;
+    y1 = y2;
+  }
+  // Find the longest segment of the horizontal line that has its center point
+  // inside the linear ring.
+  var pointX = NaN;
+  var maxSegmentLength = -Infinity;
+  intersections.sort();
+  x1 = intersections[0];
+  for (i = 1, ii = intersections.length; i < ii; ++i) {
+    x2 = intersections[i];
+    var segmentLength = Math.abs(x2 - x1);
+    if (segmentLength > maxSegmentLength) {
+      x = (x1 + x2) / 2;
+      if (ol.geom.flat.contains.linearRingsContainsXY(
+          flatCoordinates, offset, ends, stride, x, y)) {
+        pointX = x;
+        maxSegmentLength = segmentLength;
+      }
+    }
+    x1 = x2;
+  }
+  if (isNaN(pointX)) {
+    // There is no horizontal line that has its center point inside the linear
+    // ring.  Use the center of the the linear ring's extent.
+    pointX = flatCenters[flatCentersOffset];
+  }
+  if (goog.isDef(opt_dest)) {
+    opt_dest.push(pointX, y);
+    return opt_dest;
+  } else {
+    return [pointX, y];
+  }
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @param {Array.<number>} flatCenters Flat centers.
+ * @return {Array.<number>} Interior points.
+ */
+ol.geom.flat.interiorpoint.linearRingss =
+    function(flatCoordinates, offset, endss, stride, flatCenters) {
+  goog.asserts.assert(2 * endss.length == flatCenters.length);
+  var interiorPoints = [];
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    interiorPoints = ol.geom.flat.interiorpoint.linearRings(flatCoordinates,
+        offset, ends, stride, flatCenters, 2 * i, interiorPoints);
+    offset = ends[ends.length - 1];
+  }
+  return interiorPoints;
+};
diff --git a/src/ol/geom/flat/interpolateflatgeom.js b/src/ol/geom/flat/interpolateflatgeom.js
new file mode 100644
index 0000000..9d24deb
--- /dev/null
+++ b/src/ol/geom/flat/interpolateflatgeom.js
@@ -0,0 +1,190 @@
+goog.provide('ol.geom.flat.interpolate');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.math');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} fraction Fraction.
+ * @param {Array.<number>=} opt_dest Destination.
+ * @return {Array.<number>} Destination.
+ */
+ol.geom.flat.interpolate.lineString =
+    function(flatCoordinates, offset, end, stride, fraction, opt_dest) {
+  // FIXME interpolate extra dimensions
+  goog.asserts.assert(0 <= fraction && fraction <= 1);
+  var pointX = NaN;
+  var pointY = NaN;
+  var n = (end - offset) / stride;
+  if (n === 0) {
+    goog.asserts.fail();
+  } else if (n == 1) {
+    pointX = flatCoordinates[offset];
+    pointY = flatCoordinates[offset + 1];
+  } else if (n == 2) {
+    pointX = (1 - fraction) * flatCoordinates[offset] +
+        fraction * flatCoordinates[offset + stride];
+    pointY = (1 - fraction) * flatCoordinates[offset + 1] +
+        fraction * flatCoordinates[offset + stride + 1];
+  } else {
+    var x1 = flatCoordinates[offset];
+    var y1 = flatCoordinates[offset + 1];
+    var length = 0;
+    var cumulativeLengths = [0];
+    var i;
+    for (i = offset + stride; i < end; i += stride) {
+      var x2 = flatCoordinates[i];
+      var y2 = flatCoordinates[i + 1];
+      length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
+      cumulativeLengths.push(length);
+      x1 = x2;
+      y1 = y2;
+    }
+    var target = fraction * length;
+    var index = goog.array.binarySearch(cumulativeLengths, target);
+    if (index < 0) {
+      var t = (target - cumulativeLengths[-index - 2]) /
+          (cumulativeLengths[-index - 1] - cumulativeLengths[-index - 2]);
+      var o = offset + (-index - 2) * stride;
+      pointX = goog.math.lerp(
+          flatCoordinates[o], flatCoordinates[o + stride], t);
+      pointY = goog.math.lerp(
+          flatCoordinates[o + 1], flatCoordinates[o + stride + 1], t);
+    } else {
+      pointX = flatCoordinates[offset + index * stride];
+      pointY = flatCoordinates[offset + index * stride + 1];
+    }
+  }
+  if (goog.isDefAndNotNull(opt_dest)) {
+    opt_dest[0] = pointX;
+    opt_dest[1] = pointY;
+    return opt_dest;
+  } else {
+    return [pointX, pointY];
+  }
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} m M.
+ * @param {boolean} extrapolate Extrapolate.
+ * @return {ol.Coordinate} Coordinate.
+ */
+ol.geom.flat.lineStringCoordinateAtM =
+    function(flatCoordinates, offset, end, stride, m, extrapolate) {
+  if (end == offset) {
+    return null;
+  }
+  var coordinate;
+  if (m < flatCoordinates[offset + stride - 1]) {
+    if (extrapolate) {
+      coordinate = flatCoordinates.slice(offset, offset + stride);
+      coordinate[stride - 1] = m;
+      return coordinate;
+    } else {
+      return null;
+    }
+  } else if (flatCoordinates[end - 1] < m) {
+    if (extrapolate) {
+      coordinate = flatCoordinates.slice(end - stride, end);
+      coordinate[stride - 1] = m;
+      return coordinate;
+    } else {
+      return null;
+    }
+  }
+  // FIXME use O(1) search
+  if (m == flatCoordinates[offset + stride - 1]) {
+    return flatCoordinates.slice(offset, offset + stride);
+  }
+  var lo = offset / stride;
+  var hi = end / stride;
+  while (lo < hi) {
+    var mid = (lo + hi) >> 1;
+    if (m < flatCoordinates[(mid + 1) * stride - 1]) {
+      hi = mid;
+    } else {
+      lo = mid + 1;
+    }
+  }
+  var m0 = flatCoordinates[lo * stride - 1];
+  if (m == m0) {
+    return flatCoordinates.slice((lo - 1) * stride, (lo - 1) * stride + stride);
+  }
+  var m1 = flatCoordinates[(lo + 1) * stride - 1];
+  goog.asserts.assert(m0 < m);
+  goog.asserts.assert(m <= m1);
+  var t = (m - m0) / (m1 - m0);
+  coordinate = [];
+  var i;
+  for (i = 0; i < stride - 1; ++i) {
+    coordinate.push(goog.math.lerp(flatCoordinates[(lo - 1) * stride + i],
+        flatCoordinates[lo * stride + i], t));
+  }
+  coordinate.push(m);
+  goog.asserts.assert(coordinate.length == stride);
+  return coordinate;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {number} m M.
+ * @param {boolean} extrapolate Extrapolate.
+ * @param {boolean} interpolate Interpolate.
+ * @return {ol.Coordinate} Coordinate.
+ */
+ol.geom.flat.lineStringsCoordinateAtM = function(
+    flatCoordinates, offset, ends, stride, m, extrapolate, interpolate) {
+  if (interpolate) {
+    return ol.geom.flat.lineStringCoordinateAtM(
+        flatCoordinates, offset, ends[ends.length - 1], stride, m, extrapolate);
+  }
+  var coordinate;
+  if (m < flatCoordinates[stride - 1]) {
+    if (extrapolate) {
+      coordinate = flatCoordinates.slice(0, stride);
+      coordinate[stride - 1] = m;
+      return coordinate;
+    } else {
+      return null;
+    }
+  }
+  if (flatCoordinates[flatCoordinates.length - 1] < m) {
+    if (extrapolate) {
+      coordinate = flatCoordinates.slice(flatCoordinates.length - stride);
+      coordinate[stride - 1] = m;
+      return coordinate;
+    } else {
+      return null;
+    }
+  }
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    if (offset == end) {
+      continue;
+    }
+    if (m < flatCoordinates[offset + stride - 1]) {
+      return null;
+    } else if (m <= flatCoordinates[end - 1]) {
+      return ol.geom.flat.lineStringCoordinateAtM(
+          flatCoordinates, offset, end, stride, m, false);
+    }
+    offset = end;
+  }
+  goog.asserts.fail();
+  return null;
+};
diff --git a/src/ol/geom/flat/intersectsextent.js b/src/ol/geom/flat/intersectsextent.js
new file mode 100644
index 0000000..a86ca4f
--- /dev/null
+++ b/src/ol/geom/flat/intersectsextent.js
@@ -0,0 +1,154 @@
+goog.provide('ol.geom.flat.intersectsextent');
+
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.flat.contains');
+goog.require('ol.geom.flat.segments');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} True if the geometry and the extent intersect.
+ */
+ol.geom.flat.intersectsextent.lineString =
+    function(flatCoordinates, offset, end, stride, extent) {
+  var coordinatesExtent = ol.extent.extendFlatCoordinates(
+      ol.extent.createEmpty(), flatCoordinates, offset, end, stride);
+  if (!ol.extent.intersects(extent, coordinatesExtent)) {
+    return false;
+  }
+  if (ol.extent.containsExtent(extent, coordinatesExtent)) {
+    return true;
+  }
+  if (coordinatesExtent[0] >= extent[0] &&
+      coordinatesExtent[2] <= extent[2]) {
+    return true;
+  }
+  if (coordinatesExtent[1] >= extent[1] &&
+      coordinatesExtent[3] <= extent[3]) {
+    return true;
+  }
+  return ol.geom.flat.segments.forEach(flatCoordinates, offset, end, stride,
+      /**
+       * @param {ol.Coordinate} point1 Start point.
+       * @param {ol.Coordinate} point2 End point.
+       * @return {boolean} `true` if the segment and the extent intersect,
+       *     `false` otherwise.
+       */
+      function(point1, point2) {
+        return ol.extent.intersectsSegment(extent, point1, point2);
+      });
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} True if the geometry and the extent intersect.
+ */
+ol.geom.flat.intersectsextent.lineStrings =
+    function(flatCoordinates, offset, ends, stride, extent) {
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    if (ol.geom.flat.intersectsextent.lineString(
+        flatCoordinates, offset, ends[i], stride, extent)) {
+      return true;
+    }
+    offset = ends[i];
+  }
+  return false;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} True if the geometry and the extent intersect.
+ */
+ol.geom.flat.intersectsextent.linearRing =
+    function(flatCoordinates, offset, end, stride, extent) {
+  if (ol.geom.flat.intersectsextent.lineString(
+      flatCoordinates, offset, end, stride, extent)) {
+    return true;
+  }
+  if (ol.geom.flat.contains.linearRingContainsXY(
+      flatCoordinates, offset, end, stride, extent[0], extent[1])) {
+    return true;
+  }
+  if (ol.geom.flat.contains.linearRingContainsXY(
+      flatCoordinates, offset, end, stride, extent[0], extent[3])) {
+    return true;
+  }
+  if (ol.geom.flat.contains.linearRingContainsXY(
+      flatCoordinates, offset, end, stride, extent[2], extent[1])) {
+    return true;
+  }
+  if (ol.geom.flat.contains.linearRingContainsXY(
+      flatCoordinates, offset, end, stride, extent[2], extent[3])) {
+    return true;
+  }
+  return false;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} True if the geometry and the extent intersect.
+ */
+ol.geom.flat.intersectsextent.linearRings =
+    function(flatCoordinates, offset, ends, stride, extent) {
+  goog.asserts.assert(ends.length > 0);
+  if (!ol.geom.flat.intersectsextent.linearRing(
+      flatCoordinates, offset, ends[0], stride, extent)) {
+    return false;
+  }
+  if (ends.length === 1) {
+    return true;
+  }
+  var i, ii;
+  for (i = 1, ii = ends.length; i < ii; ++i) {
+    if (ol.geom.flat.contains.linearRingContainsExtent(
+        flatCoordinates, ends[i - 1], ends[i], stride, extent)) {
+      return false;
+    }
+  }
+  return true;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} True if the geometry and the extent intersect.
+ */
+ol.geom.flat.intersectsextent.linearRingss =
+    function(flatCoordinates, offset, endss, stride, extent) {
+  goog.asserts.assert(endss.length > 0);
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    if (ol.geom.flat.intersectsextent.linearRings(
+        flatCoordinates, offset, ends, stride, extent)) {
+      return true;
+    }
+    offset = ends[ends.length - 1];
+  }
+  return false;
+};
diff --git a/src/ol/geom/flat/lengthflatgeom.js b/src/ol/geom/flat/lengthflatgeom.js
new file mode 100644
index 0000000..ac1c685
--- /dev/null
+++ b/src/ol/geom/flat/lengthflatgeom.js
@@ -0,0 +1,43 @@
+goog.provide('ol.geom.flat.length');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @return {number} Length.
+ */
+ol.geom.flat.length.lineString =
+    function(flatCoordinates, offset, end, stride) {
+  var x1 = flatCoordinates[offset];
+  var y1 = flatCoordinates[offset + 1];
+  var length = 0;
+  var i;
+  for (i = offset + stride; i < end; i += stride) {
+    var x2 = flatCoordinates[i];
+    var y2 = flatCoordinates[i + 1];
+    length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
+    x1 = x2;
+    y1 = y2;
+  }
+  return length;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @return {number} Perimeter.
+ */
+ol.geom.flat.length.linearRing =
+    function(flatCoordinates, offset, end, stride) {
+  var perimeter =
+      ol.geom.flat.length.lineString(flatCoordinates, offset, end, stride);
+  var dx = flatCoordinates[end - stride] - flatCoordinates[offset];
+  var dy = flatCoordinates[end - stride + 1] - flatCoordinates[offset + 1];
+  perimeter += Math.sqrt(dx * dx + dy * dy);
+  return perimeter;
+};
diff --git a/src/ol/geom/flat/orientflatgeom.js b/src/ol/geom/flat/orientflatgeom.js
new file mode 100644
index 0000000..48c7dd5
--- /dev/null
+++ b/src/ol/geom/flat/orientflatgeom.js
@@ -0,0 +1,115 @@
+goog.provide('ol.geom.flat.orient');
+
+goog.require('ol.geom.flat.reverse');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @return {boolean} Is clockwise.
+ */
+ol.geom.flat.orient.linearRingIsClockwise =
+    function(flatCoordinates, offset, end, stride) {
+  // http://tinyurl.com/clockwise-method
+  // https://github.com/OSGeo/gdal/blob/trunk/gdal/ogr/ogrlinearring.cpp
+  var edge = 0;
+  var x1 = flatCoordinates[end - stride];
+  var y1 = flatCoordinates[end - stride + 1];
+  for (; offset < end; offset += stride) {
+    var x2 = flatCoordinates[offset];
+    var y2 = flatCoordinates[offset + 1];
+    edge += (x2 - x1) * (y2 + y1);
+    x1 = x2;
+    y1 = y2;
+  }
+  return edge > 0;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @return {boolean} `true` if all rings are correctly oriented, `false`
+ *     otherwise.
+ */
+ol.geom.flat.orient.linearRingsAreOriented =
+    function(flatCoordinates, offset, ends, stride) {
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    var isClockwise = ol.geom.flat.orient.linearRingIsClockwise(
+        flatCoordinates, offset, end, stride);
+    if (i === 0 ? !isClockwise : isClockwise) {
+      return false;
+    }
+    offset = end;
+  }
+  return true;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @return {boolean} `true` if all rings are correctly oriented, `false`
+ *     otherwise.
+ */
+ol.geom.flat.linearRingssAreOriented =
+    function(flatCoordinates, offset, endss, stride) {
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    if (!ol.geom.flat.orient.linearRingsAreOriented(
+        flatCoordinates, offset, endss[i], stride)) {
+      return false;
+    }
+  }
+  return true;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @return {number} End.
+ */
+ol.geom.flat.orient.orientLinearRings =
+    function(flatCoordinates, offset, ends, stride) {
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    var isClockwise = ol.geom.flat.orient.linearRingIsClockwise(
+        flatCoordinates, offset, end, stride);
+    var reverse = i === 0 ? !isClockwise : isClockwise;
+    if (reverse) {
+      ol.geom.flat.reverse.coordinates(flatCoordinates, offset, end, stride);
+    }
+    offset = end;
+  }
+  return offset;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @return {number} End.
+ */
+ol.geom.flat.orient.orientLinearRingss =
+    function(flatCoordinates, offset, endss, stride) {
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    offset = ol.geom.flat.orient.orientLinearRings(
+        flatCoordinates, offset, endss[i], stride);
+  }
+  return offset;
+};
diff --git a/src/ol/geom/flat/reverseflatgeom.js b/src/ol/geom/flat/reverseflatgeom.js
new file mode 100644
index 0000000..32ad1db
--- /dev/null
+++ b/src/ol/geom/flat/reverseflatgeom.js
@@ -0,0 +1,22 @@
+goog.provide('ol.geom.flat.reverse');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ */
+ol.geom.flat.reverse.coordinates =
+    function(flatCoordinates, offset, end, stride) {
+  while (offset < end - stride) {
+    var i;
+    for (i = 0; i < stride; ++i) {
+      var tmp = flatCoordinates[offset + i];
+      flatCoordinates[offset + i] = flatCoordinates[end - stride + i];
+      flatCoordinates[end - stride + i] = tmp;
+    }
+    offset += stride;
+    end -= stride;
+  }
+};
diff --git a/src/ol/geom/flat/segmentsflatgeom.js b/src/ol/geom/flat/segmentsflatgeom.js
new file mode 100644
index 0000000..8c6aac2
--- /dev/null
+++ b/src/ol/geom/flat/segmentsflatgeom.js
@@ -0,0 +1,33 @@
+goog.provide('ol.geom.flat.segments');
+
+
+/**
+ * This function calls `callback` for each segment of the flat coordinates
+ * array. If the callback returns a truthy value the function returns that
+ * value immediately. Otherwise the function returns `false`.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {function(ol.Coordinate, ol.Coordinate): T} callback Function
+ *     called for each segment.
+ * @return {T|boolean} Value.
+ * @template T
+ */
+ol.geom.flat.segments.forEach =
+    function(flatCoordinates, offset, end, stride, callback) {
+  var point1 = [flatCoordinates[offset], flatCoordinates[offset + 1]];
+  var point2 = [];
+  var ret;
+  for (; (offset + stride) < end; offset += stride) {
+    point2[0] = flatCoordinates[offset + stride];
+    point2[1] = flatCoordinates[offset + stride + 1];
+    ret = callback(point1, point2);
+    if (ret) {
+      return ret;
+    }
+    point1[0] = point2[0];
+    point1[1] = point2[1];
+  }
+  return false;
+};
diff --git a/src/ol/geom/flat/simplifyflatgeom.js b/src/ol/geom/flat/simplifyflatgeom.js
new file mode 100644
index 0000000..7b747c6
--- /dev/null
+++ b/src/ol/geom/flat/simplifyflatgeom.js
@@ -0,0 +1,400 @@
+// Based on simplify-js https://github.com/mourner/simplify-js
+// Copyright (c) 2012, Vladimir Agafonkin
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+//    1. Redistributions of source code must retain the above copyright notice,
+//       this list of conditions and the following disclaimer.
+//
+//    2. Redistributions in binary form must reproduce the above copyright
+//       notice, this list of conditions and the following disclaimer in the
+//       documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+goog.provide('ol.geom.flat.simplify');
+
+goog.require('ol.math');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @param {boolean} highQuality Highest quality.
+ * @param {Array.<number>=} opt_simplifiedFlatCoordinates Simplified flat
+ *     coordinates.
+ * @return {Array.<number>} Simplified line string.
+ */
+ol.geom.flat.simplify.lineString = function(flatCoordinates, offset, end,
+    stride, squaredTolerance, highQuality, opt_simplifiedFlatCoordinates) {
+  var simplifiedFlatCoordinates = goog.isDef(opt_simplifiedFlatCoordinates) ?
+      opt_simplifiedFlatCoordinates : [];
+  if (!highQuality) {
+    end = ol.geom.flat.simplify.radialDistance(flatCoordinates, offset, end,
+        stride, squaredTolerance,
+        simplifiedFlatCoordinates, 0);
+    flatCoordinates = simplifiedFlatCoordinates;
+    offset = 0;
+    stride = 2;
+  }
+  simplifiedFlatCoordinates.length = ol.geom.flat.simplify.douglasPeucker(
+      flatCoordinates, offset, end, stride, squaredTolerance,
+      simplifiedFlatCoordinates, 0);
+  return simplifiedFlatCoordinates;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
+ *     coordinates.
+ * @param {number} simplifiedOffset Simplified offset.
+ * @return {number} Simplified offset.
+ */
+ol.geom.flat.simplify.douglasPeucker = function(flatCoordinates, offset, end,
+    stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) {
+  var n = (end - offset) / stride;
+  if (n < 3) {
+    for (; offset < end; offset += stride) {
+      simplifiedFlatCoordinates[simplifiedOffset++] =
+          flatCoordinates[offset];
+      simplifiedFlatCoordinates[simplifiedOffset++] =
+          flatCoordinates[offset + 1];
+    }
+    return simplifiedOffset;
+  }
+  /** @type {Array.<number>} */
+  var markers = new Array(n);
+  markers[0] = 1;
+  markers[n - 1] = 1;
+  /** @type {Array.<number>} */
+  var stack = [offset, end - stride];
+  var index = 0;
+  var i;
+  while (stack.length > 0) {
+    var last = stack.pop();
+    var first = stack.pop();
+    var maxSquaredDistance = 0;
+    var x1 = flatCoordinates[first];
+    var y1 = flatCoordinates[first + 1];
+    var x2 = flatCoordinates[last];
+    var y2 = flatCoordinates[last + 1];
+    for (i = first + stride; i < last; i += stride) {
+      var x = flatCoordinates[i];
+      var y = flatCoordinates[i + 1];
+      var squaredDistance = ol.math.squaredSegmentDistance(
+          x, y, x1, y1, x2, y2);
+      if (squaredDistance > maxSquaredDistance) {
+        index = i;
+        maxSquaredDistance = squaredDistance;
+      }
+    }
+    if (maxSquaredDistance > squaredTolerance) {
+      markers[(index - offset) / stride] = 1;
+      if (first + stride < index) {
+        stack.push(first, index);
+      }
+      if (index + stride < last) {
+        stack.push(index, last);
+      }
+    }
+  }
+  for (i = 0; i < n; ++i) {
+    if (markers[i]) {
+      simplifiedFlatCoordinates[simplifiedOffset++] =
+          flatCoordinates[offset + i * stride];
+      simplifiedFlatCoordinates[simplifiedOffset++] =
+          flatCoordinates[offset + i * stride + 1];
+    }
+  }
+  return simplifiedOffset;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
+ *     coordinates.
+ * @param {number} simplifiedOffset Simplified offset.
+ * @param {Array.<number>} simplifiedEnds Simplified ends.
+ * @return {number} Simplified offset.
+ */
+ol.geom.flat.simplify.douglasPeuckers = function(flatCoordinates, offset,
+    ends, stride, squaredTolerance, simplifiedFlatCoordinates,
+    simplifiedOffset, simplifiedEnds) {
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    simplifiedOffset = ol.geom.flat.simplify.douglasPeucker(
+        flatCoordinates, offset, end, stride, squaredTolerance,
+        simplifiedFlatCoordinates, simplifiedOffset);
+    simplifiedEnds.push(simplifiedOffset);
+    offset = end;
+  }
+  return simplifiedOffset;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
+ *     coordinates.
+ * @param {number} simplifiedOffset Simplified offset.
+ * @param {Array.<Array.<number>>} simplifiedEndss Simplified endss.
+ * @return {number} Simplified offset.
+ */
+ol.geom.flat.simplify.douglasPeuckerss = function(
+    flatCoordinates, offset, endss, stride, squaredTolerance,
+    simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) {
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    var simplifiedEnds = [];
+    simplifiedOffset = ol.geom.flat.simplify.douglasPeuckers(
+        flatCoordinates, offset, ends, stride, squaredTolerance,
+        simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds);
+    simplifiedEndss.push(simplifiedEnds);
+    offset = ends[ends.length - 1];
+  }
+  return simplifiedOffset;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
+ *     coordinates.
+ * @param {number} simplifiedOffset Simplified offset.
+ * @return {number} Simplified offset.
+ */
+ol.geom.flat.simplify.radialDistance = function(flatCoordinates, offset, end,
+    stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) {
+  if (end <= offset + stride) {
+    // zero or one point, no simplification possible, so copy and return
+    for (; offset < end; offset += stride) {
+      simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];
+      simplifiedFlatCoordinates[simplifiedOffset++] =
+          flatCoordinates[offset + 1];
+    }
+    return simplifiedOffset;
+  }
+  var x1 = flatCoordinates[offset];
+  var y1 = flatCoordinates[offset + 1];
+  // copy first point
+  simplifiedFlatCoordinates[simplifiedOffset++] = x1;
+  simplifiedFlatCoordinates[simplifiedOffset++] = y1;
+  var x2 = x1;
+  var y2 = y1;
+  for (offset += stride; offset < end; offset += stride) {
+    x2 = flatCoordinates[offset];
+    y2 = flatCoordinates[offset + 1];
+    if (ol.math.squaredDistance(x1, y1, x2, y2) > squaredTolerance) {
+      // copy point at offset
+      simplifiedFlatCoordinates[simplifiedOffset++] = x2;
+      simplifiedFlatCoordinates[simplifiedOffset++] = y2;
+      x1 = x2;
+      y1 = y2;
+    }
+  }
+  if (x2 != x1 || y2 != y1) {
+    // copy last point
+    simplifiedFlatCoordinates[simplifiedOffset++] = x2;
+    simplifiedFlatCoordinates[simplifiedOffset++] = y2;
+  }
+  return simplifiedOffset;
+};
+
+
+/**
+ * @param {number} value Value.
+ * @param {number} tolerance Tolerance.
+ * @return {number} Rounded value.
+ */
+ol.geom.flat.simplify.snap = function(value, tolerance) {
+  return tolerance * Math.round(value / tolerance);
+};
+
+
+/**
+ * Simplifies a line string using an algorithm designed by Tim Schaub.
+ * Coordinates are snapped to the nearest value in a virtual grid and
+ * consecutive duplicate coordinates are discarded.  This effectively preserves
+ * topology as the simplification of any subsection of a line string is
+ * independent of the rest of the line string.  This means that, for examples,
+ * the common edge between two polygons will be simplified to the same line
+ * string independently in both polygons.  This implementation uses a single
+ * pass over the coordinates and eliminates intermediate collinear points.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} tolerance Tolerance.
+ * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
+ *     coordinates.
+ * @param {number} simplifiedOffset Simplified offset.
+ * @return {number} Simplified offset.
+ */
+ol.geom.flat.simplify.quantize = function(flatCoordinates, offset, end, stride,
+    tolerance, simplifiedFlatCoordinates, simplifiedOffset) {
+  // do nothing if the line is empty
+  if (offset == end) {
+    return simplifiedOffset;
+  }
+  // snap the first coordinate (P1)
+  var x1 = ol.geom.flat.simplify.snap(flatCoordinates[offset], tolerance);
+  var y1 = ol.geom.flat.simplify.snap(flatCoordinates[offset + 1], tolerance);
+  offset += stride;
+  // add the first coordinate to the output
+  simplifiedFlatCoordinates[simplifiedOffset++] = x1;
+  simplifiedFlatCoordinates[simplifiedOffset++] = y1;
+  // find the next coordinate that does not snap to the same value as the first
+  // coordinate (P2)
+  var x2, y2;
+  do {
+    x2 = ol.geom.flat.simplify.snap(flatCoordinates[offset], tolerance);
+    y2 = ol.geom.flat.simplify.snap(flatCoordinates[offset + 1], tolerance);
+    offset += stride;
+    if (offset == end) {
+      // all coordinates snap to the same value, the line collapses to a point
+      // push the last snapped value anyway to ensure that the output contains
+      // at least two points
+      // FIXME should we really return at least two points anyway?
+      simplifiedFlatCoordinates[simplifiedOffset++] = x2;
+      simplifiedFlatCoordinates[simplifiedOffset++] = y2;
+      return simplifiedOffset;
+    }
+  } while (x2 == x1 && y2 == y1);
+  while (offset < end) {
+    var x3, y3;
+    // snap the next coordinate (P3)
+    x3 = ol.geom.flat.simplify.snap(flatCoordinates[offset], tolerance);
+    y3 = ol.geom.flat.simplify.snap(flatCoordinates[offset + 1], tolerance);
+    offset += stride;
+    // skip P3 if it is equal to P2
+    if (x3 == x2 && y3 == y2) {
+      continue;
+    }
+    // calculate the delta between P1 and P2
+    var dx1 = x2 - x1;
+    var dy1 = y2 - y1;
+    // calculate the delta between P3 and P1
+    var dx2 = x3 - x1;
+    var dy2 = y3 - y1;
+    // if P1, P2, and P3 are colinear and P3 is further from P1 than P2 is from
+    // P1 in the same direction then P2 is on the straight line between P1 and
+    // P3
+    if ((dx1 * dy2 == dy1 * dx2) &&
+        ((dx1 < 0 && dx2 < dx1) || dx1 == dx2 || (dx1 > 0 && dx2 > dx1)) &&
+        ((dy1 < 0 && dy2 < dy1) || dy1 == dy2 || (dy1 > 0 && dy2 > dy1))) {
+      // discard P2 and set P2 = P3
+      x2 = x3;
+      y2 = y3;
+      continue;
+    }
+    // either P1, P2, and P3 are not colinear, or they are colinear but P3 is
+    // between P3 and P1 or on the opposite half of the line to P2.  add P2,
+    // and continue with P1 = P2 and P2 = P3
+    simplifiedFlatCoordinates[simplifiedOffset++] = x2;
+    simplifiedFlatCoordinates[simplifiedOffset++] = y2;
+    x1 = x2;
+    y1 = y2;
+    x2 = x3;
+    y2 = y3;
+  }
+  // add the last point (P2)
+  simplifiedFlatCoordinates[simplifiedOffset++] = x2;
+  simplifiedFlatCoordinates[simplifiedOffset++] = y2;
+  return simplifiedOffset;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @param {number} tolerance Tolerance.
+ * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
+ *     coordinates.
+ * @param {number} simplifiedOffset Simplified offset.
+ * @param {Array.<number>} simplifiedEnds Simplified ends.
+ * @return {number} Simplified offset.
+ */
+ol.geom.flat.simplify.quantizes = function(
+    flatCoordinates, offset, ends, stride,
+    tolerance,
+    simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) {
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    simplifiedOffset = ol.geom.flat.simplify.quantize(
+        flatCoordinates, offset, end, stride,
+        tolerance,
+        simplifiedFlatCoordinates, simplifiedOffset);
+    simplifiedEnds.push(simplifiedOffset);
+    offset = end;
+  }
+  return simplifiedOffset;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<Array.<number>>} endss Endss.
+ * @param {number} stride Stride.
+ * @param {number} tolerance Tolerance.
+ * @param {Array.<number>} simplifiedFlatCoordinates Simplified flat
+ *     coordinates.
+ * @param {number} simplifiedOffset Simplified offset.
+ * @param {Array.<Array.<number>>} simplifiedEndss Simplified endss.
+ * @return {number} Simplified offset.
+ */
+ol.geom.flat.simplify.quantizess = function(
+    flatCoordinates, offset, endss, stride,
+    tolerance,
+    simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) {
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i];
+    var simplifiedEnds = [];
+    simplifiedOffset = ol.geom.flat.simplify.quantizes(
+        flatCoordinates, offset, ends, stride,
+        tolerance,
+        simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds);
+    simplifiedEndss.push(simplifiedEnds);
+    offset = ends[ends.length - 1];
+  }
+  return simplifiedOffset;
+};
diff --git a/src/ol/geom/flat/transformflatgeom.js b/src/ol/geom/flat/transformflatgeom.js
new file mode 100644
index 0000000..7bb08e8
--- /dev/null
+++ b/src/ol/geom/flat/transformflatgeom.js
@@ -0,0 +1,65 @@
+goog.provide('ol.geom.flat.transform');
+
+goog.require('goog.vec.Mat4');
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {Array.<number>=} opt_dest Destination.
+ * @return {Array.<number>} Transformed coordinates.
+ */
+ol.geom.flat.transform.transform2D =
+    function(flatCoordinates, offset, end, stride, transform, opt_dest) {
+  var m00 = goog.vec.Mat4.getElement(transform, 0, 0);
+  var m10 = goog.vec.Mat4.getElement(transform, 1, 0);
+  var m01 = goog.vec.Mat4.getElement(transform, 0, 1);
+  var m11 = goog.vec.Mat4.getElement(transform, 1, 1);
+  var m03 = goog.vec.Mat4.getElement(transform, 0, 3);
+  var m13 = goog.vec.Mat4.getElement(transform, 1, 3);
+  var dest = goog.isDef(opt_dest) ? opt_dest : [];
+  var i = 0;
+  var j;
+  for (j = offset; j < end; j += stride) {
+    var x = flatCoordinates[j];
+    var y = flatCoordinates[j + 1];
+    dest[i++] = m00 * x + m01 * y + m03;
+    dest[i++] = m10 * x + m11 * y + m13;
+  }
+  if (goog.isDef(opt_dest) && dest.length != i) {
+    dest.length = i;
+  }
+  return dest;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {number} deltaX Delta X.
+ * @param {number} deltaY Delta Y.
+ * @param {Array.<number>=} opt_dest Destination.
+ * @return {Array.<number>} Transformed coordinates.
+ */
+ol.geom.flat.transform.translate =
+    function(flatCoordinates, offset, end, stride, deltaX, deltaY, opt_dest) {
+  var dest = goog.isDef(opt_dest) ? opt_dest : [];
+  var i = 0;
+  var j, k;
+  for (j = offset; j < end; j += stride) {
+    dest[i++] = flatCoordinates[j] + deltaX;
+    dest[i++] = flatCoordinates[j + 1] + deltaY;
+    for (k = j + 2; k < j + stride; ++k) {
+      dest[i++] = flatCoordinates[k];
+    }
+  }
+  if (goog.isDef(opt_dest) && dest.length != i) {
+    dest.length = i;
+  }
+  return dest;
+};
diff --git a/src/ol/geom/geom.jsdoc b/src/ol/geom/geom.jsdoc
new file mode 100644
index 0000000..1a947e5
--- /dev/null
+++ b/src/ol/geom/geom.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.geom
+ */
diff --git a/src/ol/geom/geometry.js b/src/ol/geom/geometry.js
new file mode 100644
index 0000000..f2c9ebd
--- /dev/null
+++ b/src/ol/geom/geometry.js
@@ -0,0 +1,225 @@
+goog.provide('ol.geom.Geometry');
+goog.provide('ol.geom.GeometryType');
+
+goog.require('goog.asserts');
+goog.require('goog.functions');
+goog.require('ol.Observable');
+goog.require('ol.proj');
+
+
+/**
+ * The geometry type. One of `'Point'`, `'LineString'`, `'LinearRing'`,
+ * `'Polygon'`, `'MultiPoint'`, `'MultiLineString'`, `'MultiPolygon'`,
+ * `'GeometryCollection'`, `'Circle'`.
+ * @enum {string}
+ * @api stable
+ */
+ol.geom.GeometryType = {
+  POINT: 'Point',
+  LINE_STRING: 'LineString',
+  LINEAR_RING: 'LinearRing',
+  POLYGON: 'Polygon',
+  MULTI_POINT: 'MultiPoint',
+  MULTI_LINE_STRING: 'MultiLineString',
+  MULTI_POLYGON: 'MultiPolygon',
+  GEOMETRY_COLLECTION: 'GeometryCollection',
+  CIRCLE: 'Circle'
+};
+
+
+/**
+ * The coordinate layout for geometries, indicating whether a 3rd or 4th z ('Z')
+ * or measure ('M') coordinate is available. Supported values are `'XY'`,
+ * `'XYZ'`, `'XYM'`, `'XYZM'`.
+ * @enum {string}
+ * @api stable
+ */
+ol.geom.GeometryLayout = {
+  XY: 'XY',
+  XYZ: 'XYZ',
+  XYM: 'XYM',
+  XYZM: 'XYZM'
+};
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for vector geometries.
+ *
+ * @constructor
+ * @extends {ol.Observable}
+ * @fires change Triggered when the geometry changes.
+ * @api stable
+ */
+ol.geom.Geometry = function() {
+
+  goog.base(this);
+
+  /**
+   * @protected
+   * @type {ol.Extent|undefined}
+   */
+  this.extent = undefined;
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.extentRevision = -1;
+
+  /**
+   * @protected
+   * @type {Object.<string, ol.geom.Geometry>}
+   */
+  this.simplifiedGeometryCache = {};
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.simplifiedGeometryMaxMinSquaredTolerance = 0;
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.simplifiedGeometryRevision = 0;
+
+};
+goog.inherits(ol.geom.Geometry, ol.Observable);
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @function
+ * @return {!ol.geom.Geometry} Clone.
+ * @api stable
+ */
+ol.geom.Geometry.prototype.clone = goog.abstractMethod;
+
+
+/**
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @param {ol.Coordinate} closestPoint Closest point.
+ * @param {number} minSquaredDistance Minimum squared distance.
+ * @return {number} Minimum squared distance.
+ */
+ol.geom.Geometry.prototype.closestPointXY = goog.abstractMethod;
+
+
+/**
+ * @param {ol.Coordinate} point Point.
+ * @param {ol.Coordinate=} opt_closestPoint Closest point.
+ * @return {ol.Coordinate} Closest point.
+ * @api stable
+ */
+ol.geom.Geometry.prototype.getClosestPoint = function(point, opt_closestPoint) {
+  var closestPoint = goog.isDef(opt_closestPoint) ?
+      opt_closestPoint : [NaN, NaN];
+  this.closestPointXY(point[0], point[1], closestPoint, Infinity);
+  return closestPoint;
+};
+
+
+/**
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @return {boolean} Contains coordinate.
+ */
+ol.geom.Geometry.prototype.containsCoordinate = function(coordinate) {
+  return this.containsXY(coordinate[0], coordinate[1]);
+};
+
+
+/**
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @return {boolean} Contains (x, y).
+ */
+ol.geom.Geometry.prototype.containsXY = goog.functions.FALSE;
+
+
+/**
+ * Get the extent of the geometry.
+ * @function
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} extent Extent.
+ * @api stable
+ */
+ol.geom.Geometry.prototype.getExtent = goog.abstractMethod;
+
+
+/**
+ * Create a simplified version of this geometry using the Douglas Peucker
+ * algorithm.
+ * @see http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm
+ * @function
+ * @param {number} squaredTolerance Squared tolerance.
+ * @return {ol.geom.Geometry} Simplified geometry.
+ */
+ol.geom.Geometry.prototype.getSimplifiedGeometry = goog.abstractMethod;
+
+
+/**
+ * Get the type of this geometry.
+ * @function
+ * @return {ol.geom.GeometryType} Geometry type.
+ * @api stable
+ */
+ol.geom.Geometry.prototype.getType = goog.abstractMethod;
+
+
+/**
+ * Apply a transform function to each coordinate of the geometry.
+ * The geometry is modified in place.
+ * If you do not want the geometry modified in place, first clone() it and
+ * then use this function on the clone.
+ * @function
+ * @param {ol.TransformFunction} transformFn Transform.
+ * @api stable
+ */
+ol.geom.Geometry.prototype.applyTransform = goog.abstractMethod;
+
+
+/**
+ * Test if the geometry and the passed extent intersect.
+ * @param {ol.Extent} extent Extent.
+ * @return {boolean} `true` if the geometry and the extent intersect.
+ * @function
+ * @api
+ */
+ol.geom.Geometry.prototype.intersectsExtent = goog.abstractMethod;
+
+
+/**
+ * Translate the geometry.
+ * @param {number} deltaX Delta X.
+ * @param {number} deltaY Delta Y.
+ * @function
+ * @api
+ */
+ol.geom.Geometry.prototype.translate = goog.abstractMethod;
+
+
+/**
+ * Transform each coordinate of the geometry from one coordinate reference
+ * system to another. The geometry is modified in place.
+ * For example, a line will be transformed to a line and a circle to a circle.
+ * If you do not want the geometry modified in place, first clone() it and
+ * then use this function on the clone.
+ *
+ * @param {ol.proj.ProjectionLike} source The current projection.  Can be a
+ *     string identifier or a {@link ol.proj.Projection} object.
+ * @param {ol.proj.ProjectionLike} destination The desired projection.  Can be a
+ *     string identifier or a {@link ol.proj.Projection} object.
+ * @return {ol.geom.Geometry} This geometry.  Note that original geometry is
+ *     modified in place.
+ * @api stable
+ */
+ol.geom.Geometry.prototype.transform = function(source, destination) {
+  this.applyTransform(ol.proj.getTransform(source, destination));
+  return this;
+};
diff --git a/src/ol/geom/geometrycollection.js b/src/ol/geom/geometrycollection.js
new file mode 100644
index 0000000..ca5cb08
--- /dev/null
+++ b/src/ol/geom/geometrycollection.js
@@ -0,0 +1,302 @@
+goog.provide('ol.geom.GeometryCollection');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol.extent');
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.GeometryType');
+
+
+
+/**
+ * @classdesc
+ * An array of {@link ol.geom.Geometry} objects.
+ *
+ * @constructor
+ * @extends {ol.geom.Geometry}
+ * @param {Array.<ol.geom.Geometry>=} opt_geometries Geometries.
+ * @api stable
+ */
+ol.geom.GeometryCollection = function(opt_geometries) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {Array.<ol.geom.Geometry>}
+   */
+  this.geometries_ = goog.isDef(opt_geometries) ? opt_geometries : null;
+
+  this.listenGeometriesChange_();
+};
+goog.inherits(ol.geom.GeometryCollection, ol.geom.Geometry);
+
+
+/**
+ * @param {Array.<ol.geom.Geometry>} geometries Geometries.
+ * @private
+ * @return {Array.<ol.geom.Geometry>} Cloned geometries.
+ */
+ol.geom.GeometryCollection.cloneGeometries_ = function(geometries) {
+  var clonedGeometries = [];
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    clonedGeometries.push(geometries[i].clone());
+  }
+  return clonedGeometries;
+};
+
+
+/**
+ * @private
+ */
+ol.geom.GeometryCollection.prototype.unlistenGeometriesChange_ = function() {
+  var i, ii;
+  if (goog.isNull(this.geometries_)) {
+    return;
+  }
+  for (i = 0, ii = this.geometries_.length; i < ii; ++i) {
+    goog.events.unlisten(
+        this.geometries_[i], goog.events.EventType.CHANGE,
+        this.changed, false, this);
+  }
+};
+
+
+/**
+ * @private
+ */
+ol.geom.GeometryCollection.prototype.listenGeometriesChange_ = function() {
+  var i, ii;
+  if (goog.isNull(this.geometries_)) {
+    return;
+  }
+  for (i = 0, ii = this.geometries_.length; i < ii; ++i) {
+    goog.events.listen(
+        this.geometries_[i], goog.events.EventType.CHANGE,
+        this.changed, false, this);
+  }
+};
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.GeometryCollection} Clone.
+ * @api stable
+ */
+ol.geom.GeometryCollection.prototype.clone = function() {
+  var geometryCollection = new ol.geom.GeometryCollection(null);
+  geometryCollection.setGeometries(this.geometries_);
+  return geometryCollection;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.GeometryCollection.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  if (minSquaredDistance <
+      ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
+    return minSquaredDistance;
+  }
+  var geometries = this.geometries_;
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    minSquaredDistance = geometries[i].closestPointXY(
+        x, y, closestPoint, minSquaredDistance);
+  }
+  return minSquaredDistance;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.GeometryCollection.prototype.containsXY = function(x, y) {
+  var geometries = this.geometries_;
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    if (geometries[i].containsXY(x, y)) {
+      return true;
+    }
+  }
+  return false;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.GeometryCollection.prototype.getExtent = function(opt_extent) {
+  if (this.extentRevision != this.getRevision()) {
+    var extent = ol.extent.createOrUpdateEmpty(this.extent);
+    var geometries = this.geometries_;
+    var i, ii;
+    for (i = 0, ii = geometries.length; i < ii; ++i) {
+      ol.extent.extend(extent, geometries[i].getExtent());
+    }
+    this.extent = extent;
+    this.extentRevision = this.getRevision();
+  }
+  goog.asserts.assert(goog.isDef(this.extent));
+  return ol.extent.returnOrUpdate(this.extent, opt_extent);
+};
+
+
+/**
+ * @return {Array.<ol.geom.Geometry>} Geometries.
+ * @api stable
+ */
+ol.geom.GeometryCollection.prototype.getGeometries = function() {
+  return ol.geom.GeometryCollection.cloneGeometries_(this.geometries_);
+};
+
+
+/**
+ * @return {Array.<ol.geom.Geometry>} Geometries.
+ */
+ol.geom.GeometryCollection.prototype.getGeometriesArray = function() {
+  return this.geometries_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.GeometryCollection.prototype.getSimplifiedGeometry =
+    function(squaredTolerance) {
+  if (this.simplifiedGeometryRevision != this.getRevision()) {
+    goog.object.clear(this.simplifiedGeometryCache);
+    this.simplifiedGeometryMaxMinSquaredTolerance = 0;
+    this.simplifiedGeometryRevision = this.getRevision();
+  }
+  if (squaredTolerance < 0 ||
+      (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 &&
+       squaredTolerance < this.simplifiedGeometryMaxMinSquaredTolerance)) {
+    return this;
+  }
+  var key = squaredTolerance.toString();
+  if (this.simplifiedGeometryCache.hasOwnProperty(key)) {
+    return this.simplifiedGeometryCache[key];
+  } else {
+    var simplifiedGeometries = [];
+    var geometries = this.geometries_;
+    var simplified = false;
+    var i, ii;
+    for (i = 0, ii = geometries.length; i < ii; ++i) {
+      var geometry = geometries[i];
+      var simplifiedGeometry = geometry.getSimplifiedGeometry(squaredTolerance);
+      simplifiedGeometries.push(simplifiedGeometry);
+      if (simplifiedGeometry !== geometry) {
+        simplified = true;
+      }
+    }
+    if (simplified) {
+      var simplifiedGeometryCollection = new ol.geom.GeometryCollection(null);
+      simplifiedGeometryCollection.setGeometriesArray(simplifiedGeometries);
+      this.simplifiedGeometryCache[key] = simplifiedGeometryCollection;
+      return simplifiedGeometryCollection;
+    } else {
+      this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;
+      return this;
+    }
+  }
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.GeometryCollection.prototype.getType = function() {
+  return ol.geom.GeometryType.GEOMETRY_COLLECTION;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.GeometryCollection.prototype.intersectsExtent = function(extent) {
+  var geometries = this.geometries_;
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    if (geometries[i].intersectsExtent(extent)) {
+      return true;
+    }
+  }
+  return false;
+};
+
+
+/**
+ * @return {boolean} Is empty.
+ */
+ol.geom.GeometryCollection.prototype.isEmpty = function() {
+  return goog.array.isEmpty(this.geometries_);
+};
+
+
+/**
+ * @param {Array.<ol.geom.Geometry>} geometries Geometries.
+ * @api stable
+ */
+ol.geom.GeometryCollection.prototype.setGeometries = function(geometries) {
+  this.setGeometriesArray(
+      ol.geom.GeometryCollection.cloneGeometries_(geometries));
+};
+
+
+/**
+ * @param {Array.<ol.geom.Geometry>} geometries Geometries.
+ */
+ol.geom.GeometryCollection.prototype.setGeometriesArray = function(geometries) {
+  this.unlistenGeometriesChange_();
+  this.geometries_ = geometries;
+  this.listenGeometriesChange_();
+  this.changed();
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.GeometryCollection.prototype.applyTransform = function(transformFn) {
+  var geometries = this.geometries_;
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    geometries[i].applyTransform(transformFn);
+  }
+  this.changed();
+};
+
+
+/**
+ * Translate the geometry.
+ * @param {number} deltaX Delta X.
+ * @param {number} deltaY Delta Y.
+ * @api
+ */
+ol.geom.GeometryCollection.prototype.translate = function(deltaX, deltaY) {
+  var geometries = this.geometries_;
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    geometries[i].translate(deltaX, deltaY);
+  }
+  this.changed();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.GeometryCollection.prototype.disposeInternal = function() {
+  this.unlistenGeometriesChange_();
+  goog.base(this, 'disposeInternal');
+};
diff --git a/src/ol/geom/linearring.js b/src/ol/geom/linearring.js
new file mode 100644
index 0000000..f527d13
--- /dev/null
+++ b/src/ol/geom/linearring.js
@@ -0,0 +1,154 @@
+goog.provide('ol.geom.LinearRing');
+
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.area');
+goog.require('ol.geom.flat.closest');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.geom.flat.inflate');
+goog.require('ol.geom.flat.simplify');
+
+
+
+/**
+ * @classdesc
+ * Linear ring geometry. Only used as part of polygon; cannot be rendered
+ * on its own.
+ *
+ * @constructor
+ * @extends {ol.geom.SimpleGeometry}
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.LinearRing = function(coordinates, opt_layout) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDelta_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDeltaRevision_ = -1;
+
+  this.setCoordinates(coordinates,
+      /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
+
+};
+goog.inherits(ol.geom.LinearRing, ol.geom.SimpleGeometry);
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.LinearRing} Clone.
+ * @api stable
+ */
+ol.geom.LinearRing.prototype.clone = function() {
+  var linearRing = new ol.geom.LinearRing(null);
+  linearRing.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
+  return linearRing;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.LinearRing.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  if (minSquaredDistance <
+      ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
+    return minSquaredDistance;
+  }
+  if (this.maxDeltaRevision_ != this.getRevision()) {
+    this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getMaxSquaredDelta(
+        this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0));
+    this.maxDeltaRevision_ = this.getRevision();
+  }
+  return ol.geom.flat.closest.getClosestPoint(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
+      this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);
+};
+
+
+/**
+ * @return {number} Area (on projected plane).
+ * @api stable
+ */
+ol.geom.LinearRing.prototype.getArea = function() {
+  return ol.geom.flat.area.linearRing(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
+};
+
+
+/**
+ * @return {Array.<ol.Coordinate>} Coordinates.
+ * @api stable
+ */
+ol.geom.LinearRing.prototype.getCoordinates = function() {
+  return ol.geom.flat.inflate.coordinates(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.LinearRing.prototype.getSimplifiedGeometryInternal =
+    function(squaredTolerance) {
+  var simplifiedFlatCoordinates = [];
+  simplifiedFlatCoordinates.length = ol.geom.flat.simplify.douglasPeucker(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
+      squaredTolerance, simplifiedFlatCoordinates, 0);
+  var simplifiedLinearRing = new ol.geom.LinearRing(null);
+  simplifiedLinearRing.setFlatCoordinates(
+      ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates);
+  return simplifiedLinearRing;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.LinearRing.prototype.getType = function() {
+  return ol.geom.GeometryType.LINEAR_RING;
+};
+
+
+/**
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.LinearRing.prototype.setCoordinates =
+    function(coordinates, opt_layout) {
+  if (goog.isNull(coordinates)) {
+    this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
+  } else {
+    this.setLayout(opt_layout, coordinates, 1);
+    if (goog.isNull(this.flatCoordinates)) {
+      this.flatCoordinates = [];
+    }
+    this.flatCoordinates.length = ol.geom.flat.deflate.coordinates(
+        this.flatCoordinates, 0, coordinates, this.stride);
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ */
+ol.geom.LinearRing.prototype.setFlatCoordinates =
+    function(layout, flatCoordinates) {
+  this.setFlatCoordinatesInternal(layout, flatCoordinates);
+  this.changed();
+};
diff --git a/src/ol/geom/linestring.js b/src/ol/geom/linestring.js
new file mode 100644
index 0000000..0d80bca
--- /dev/null
+++ b/src/ol/geom/linestring.js
@@ -0,0 +1,234 @@
+goog.provide('ol.geom.LineString');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.closest');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.geom.flat.inflate');
+goog.require('ol.geom.flat.interpolate');
+goog.require('ol.geom.flat.intersectsextent');
+goog.require('ol.geom.flat.length');
+goog.require('ol.geom.flat.simplify');
+
+
+
+/**
+ * @classdesc
+ * Linestring geometry.
+ *
+ * @constructor
+ * @extends {ol.geom.SimpleGeometry}
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.LineString = function(coordinates, opt_layout) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.flatMidpoint_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.flatMidpointRevision_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDelta_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDeltaRevision_ = -1;
+
+  this.setCoordinates(coordinates,
+      /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
+
+};
+goog.inherits(ol.geom.LineString, ol.geom.SimpleGeometry);
+
+
+/**
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @api stable
+ */
+ol.geom.LineString.prototype.appendCoordinate = function(coordinate) {
+  goog.asserts.assert(coordinate.length == this.stride);
+  if (goog.isNull(this.flatCoordinates)) {
+    this.flatCoordinates = coordinate.slice();
+  } else {
+    goog.array.extend(this.flatCoordinates, coordinate);
+  }
+  this.changed();
+};
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.LineString} Clone.
+ * @api stable
+ */
+ol.geom.LineString.prototype.clone = function() {
+  var lineString = new ol.geom.LineString(null);
+  lineString.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
+  return lineString;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.LineString.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  if (minSquaredDistance <
+      ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
+    return minSquaredDistance;
+  }
+  if (this.maxDeltaRevision_ != this.getRevision()) {
+    this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getMaxSquaredDelta(
+        this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0));
+    this.maxDeltaRevision_ = this.getRevision();
+  }
+  return ol.geom.flat.closest.getClosestPoint(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
+      this.maxDelta_, false, x, y, closestPoint, minSquaredDistance);
+};
+
+
+/**
+ * Returns the coordinate at `m` using linear interpolation, or `null` if no
+ * such coordinate exists.
+ *
+ * `opt_extrapolate` controls extrapolation beyond the range of Ms in the
+ * MultiLineString. If `opt_extrapolate` is `true` then Ms less than the first
+ * M will return the first coordinate and Ms greater than the last M will
+ * return the last coordinate.
+ *
+ * @param {number} m M.
+ * @param {boolean=} opt_extrapolate Extrapolate.
+ * @return {ol.Coordinate} Coordinate.
+ * @api stable
+ */
+ol.geom.LineString.prototype.getCoordinateAtM = function(m, opt_extrapolate) {
+  if (this.layout != ol.geom.GeometryLayout.XYM &&
+      this.layout != ol.geom.GeometryLayout.XYZM) {
+    return null;
+  }
+  var extrapolate = goog.isDef(opt_extrapolate) ? opt_extrapolate : false;
+  return ol.geom.flat.lineStringCoordinateAtM(this.flatCoordinates, 0,
+      this.flatCoordinates.length, this.stride, m, extrapolate);
+};
+
+
+/**
+ * @return {Array.<ol.Coordinate>} Coordinates.
+ * @api stable
+ */
+ol.geom.LineString.prototype.getCoordinates = function() {
+  return ol.geom.flat.inflate.coordinates(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
+};
+
+
+/**
+ * @return {number} Length (on projected plane).
+ * @api stable
+ */
+ol.geom.LineString.prototype.getLength = function() {
+  return ol.geom.flat.length.lineString(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
+};
+
+
+/**
+ * @return {Array.<number>} Flat midpoint.
+ */
+ol.geom.LineString.prototype.getFlatMidpoint = function() {
+  if (this.flatMidpointRevision_ != this.getRevision()) {
+    this.flatMidpoint_ = ol.geom.flat.interpolate.lineString(
+        this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
+        0.5, this.flatMidpoint_);
+    this.flatMidpointRevision_ = this.getRevision();
+  }
+  return this.flatMidpoint_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.LineString.prototype.getSimplifiedGeometryInternal =
+    function(squaredTolerance) {
+  var simplifiedFlatCoordinates = [];
+  simplifiedFlatCoordinates.length = ol.geom.flat.simplify.douglasPeucker(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
+      squaredTolerance, simplifiedFlatCoordinates, 0);
+  var simplifiedLineString = new ol.geom.LineString(null);
+  simplifiedLineString.setFlatCoordinates(
+      ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates);
+  return simplifiedLineString;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.LineString.prototype.getType = function() {
+  return ol.geom.GeometryType.LINE_STRING;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.LineString.prototype.intersectsExtent = function(extent) {
+  return ol.geom.flat.intersectsextent.lineString(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
+      extent);
+};
+
+
+/**
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.LineString.prototype.setCoordinates =
+    function(coordinates, opt_layout) {
+  if (goog.isNull(coordinates)) {
+    this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
+  } else {
+    this.setLayout(opt_layout, coordinates, 1);
+    if (goog.isNull(this.flatCoordinates)) {
+      this.flatCoordinates = [];
+    }
+    this.flatCoordinates.length = ol.geom.flat.deflate.coordinates(
+        this.flatCoordinates, 0, coordinates, this.stride);
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ */
+ol.geom.LineString.prototype.setFlatCoordinates =
+    function(layout, flatCoordinates) {
+  this.setFlatCoordinatesInternal(layout, flatCoordinates);
+  this.changed();
+};
diff --git a/src/ol/geom/multilinestring.js b/src/ol/geom/multilinestring.js
new file mode 100644
index 0000000..751636a
--- /dev/null
+++ b/src/ol/geom/multilinestring.js
@@ -0,0 +1,320 @@
+goog.provide('ol.geom.MultiLineString');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.closest');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.geom.flat.inflate');
+goog.require('ol.geom.flat.interpolate');
+goog.require('ol.geom.flat.intersectsextent');
+goog.require('ol.geom.flat.simplify');
+
+
+
+/**
+ * @classdesc
+ * Multi-linestring geometry.
+ *
+ * @constructor
+ * @extends {ol.geom.SimpleGeometry}
+ * @param {Array.<Array.<ol.Coordinate>>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.MultiLineString = function(coordinates, opt_layout) {
+
+  goog.base(this);
+
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+  this.ends_ = [];
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDelta_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDeltaRevision_ = -1;
+
+  this.setCoordinates(coordinates,
+      /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
+
+};
+goog.inherits(ol.geom.MultiLineString, ol.geom.SimpleGeometry);
+
+
+/**
+ * @param {ol.geom.LineString} lineString LineString.
+ * @api stable
+ */
+ol.geom.MultiLineString.prototype.appendLineString = function(lineString) {
+  goog.asserts.assert(lineString.getLayout() == this.layout);
+  if (goog.isNull(this.flatCoordinates)) {
+    this.flatCoordinates = lineString.getFlatCoordinates().slice();
+  } else {
+    goog.array.extend(
+        this.flatCoordinates, lineString.getFlatCoordinates().slice());
+  }
+  this.ends_.push(this.flatCoordinates.length);
+  this.changed();
+};
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.MultiLineString} Clone.
+ * @api stable
+ */
+ol.geom.MultiLineString.prototype.clone = function() {
+  var multiLineString = new ol.geom.MultiLineString(null);
+  multiLineString.setFlatCoordinates(
+      this.layout, this.flatCoordinates.slice(), this.ends_.slice());
+  return multiLineString;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.MultiLineString.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  if (minSquaredDistance <
+      ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
+    return minSquaredDistance;
+  }
+  if (this.maxDeltaRevision_ != this.getRevision()) {
+    this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getsMaxSquaredDelta(
+        this.flatCoordinates, 0, this.ends_, this.stride, 0));
+    this.maxDeltaRevision_ = this.getRevision();
+  }
+  return ol.geom.flat.closest.getsClosestPoint(
+      this.flatCoordinates, 0, this.ends_, this.stride,
+      this.maxDelta_, false, x, y, closestPoint, minSquaredDistance);
+};
+
+
+/**
+ * Returns the coordinate at `m` using linear interpolation, or `null` if no
+ * such coordinate exists.
+ *
+ * `opt_extrapolate` controls extrapolation beyond the range of Ms in the
+ * MultiLineString. If `opt_extrapolate` is `true` then Ms less than the first
+ * M will return the first coordinate and Ms greater than the last M will
+ * return the last coordinate.
+ *
+ * `opt_interpolate` controls interpolation between consecutive LineStrings
+ * within the MultiLineString. If `opt_interpolate` is `true` the coordinates
+ * will be linearly interpolated between the last coordinate of one LineString
+ * and the first coordinate of the next LineString.  If `opt_interpolate` is
+ * `false` then the function will return `null` for Ms falling between
+ * LineStrings.
+ *
+ * @param {number} m M.
+ * @param {boolean=} opt_extrapolate Extrapolate.
+ * @param {boolean=} opt_interpolate Interpolate.
+ * @return {ol.Coordinate} Coordinate.
+ * @api stable
+ */
+ol.geom.MultiLineString.prototype.getCoordinateAtM =
+    function(m, opt_extrapolate, opt_interpolate) {
+  if ((this.layout != ol.geom.GeometryLayout.XYM &&
+       this.layout != ol.geom.GeometryLayout.XYZM) ||
+      this.flatCoordinates.length === 0) {
+    return null;
+  }
+  var extrapolate = goog.isDef(opt_extrapolate) ? opt_extrapolate : false;
+  var interpolate = goog.isDef(opt_interpolate) ? opt_interpolate : false;
+  return ol.geom.flat.lineStringsCoordinateAtM(this.flatCoordinates, 0,
+      this.ends_, this.stride, m, extrapolate, interpolate);
+};
+
+
+/**
+ * @return {Array.<Array.<ol.Coordinate>>} Coordinates.
+ * @api stable
+ */
+ol.geom.MultiLineString.prototype.getCoordinates = function() {
+  return ol.geom.flat.inflate.coordinatess(
+      this.flatCoordinates, 0, this.ends_, this.stride);
+};
+
+
+/**
+ * @return {Array.<number>} Ends.
+ */
+ol.geom.MultiLineString.prototype.getEnds = function() {
+  return this.ends_;
+};
+
+
+/**
+ * @param {number} index Index.
+ * @return {ol.geom.LineString} LineString.
+ * @api stable
+ */
+ol.geom.MultiLineString.prototype.getLineString = function(index) {
+  goog.asserts.assert(0 <= index && index < this.ends_.length);
+  if (index < 0 || this.ends_.length <= index) {
+    return null;
+  }
+  var lineString = new ol.geom.LineString(null);
+  lineString.setFlatCoordinates(this.layout, this.flatCoordinates.slice(
+      index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]));
+  return lineString;
+};
+
+
+/**
+ * @return {Array.<ol.geom.LineString>} LineStrings.
+ * @api stable
+ */
+ol.geom.MultiLineString.prototype.getLineStrings = function() {
+  var flatCoordinates = this.flatCoordinates;
+  var ends = this.ends_;
+  var layout = this.layout;
+  /** @type {Array.<ol.geom.LineString>} */
+  var lineStrings = [];
+  var offset = 0;
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    var lineString = new ol.geom.LineString(null);
+    lineString.setFlatCoordinates(layout, flatCoordinates.slice(offset, end));
+    lineStrings.push(lineString);
+    offset = end;
+  }
+  return lineStrings;
+};
+
+
+/**
+ * @return {Array.<number>} Flat midpoints.
+ */
+ol.geom.MultiLineString.prototype.getFlatMidpoints = function() {
+  var midpoints = [];
+  var flatCoordinates = this.flatCoordinates;
+  var offset = 0;
+  var ends = this.ends_;
+  var stride = this.stride;
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    var midpoint = ol.geom.flat.interpolate.lineString(
+        flatCoordinates, offset, end, stride, 0.5);
+    goog.array.extend(midpoints, midpoint);
+    offset = end;
+  }
+  return midpoints;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.MultiLineString.prototype.getSimplifiedGeometryInternal =
+    function(squaredTolerance) {
+  var simplifiedFlatCoordinates = [];
+  var simplifiedEnds = [];
+  simplifiedFlatCoordinates.length = ol.geom.flat.simplify.douglasPeuckers(
+      this.flatCoordinates, 0, this.ends_, this.stride, squaredTolerance,
+      simplifiedFlatCoordinates, 0, simplifiedEnds);
+  var simplifiedMultiLineString = new ol.geom.MultiLineString(null);
+  simplifiedMultiLineString.setFlatCoordinates(
+      ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEnds);
+  return simplifiedMultiLineString;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.MultiLineString.prototype.getType = function() {
+  return ol.geom.GeometryType.MULTI_LINE_STRING;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.MultiLineString.prototype.intersectsExtent = function(extent) {
+  return ol.geom.flat.intersectsextent.lineStrings(
+      this.flatCoordinates, 0, this.ends_, this.stride, extent);
+};
+
+
+/**
+ * @param {Array.<Array.<ol.Coordinate>>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.MultiLineString.prototype.setCoordinates =
+    function(coordinates, opt_layout) {
+  if (goog.isNull(coordinates)) {
+    this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.ends_);
+  } else {
+    this.setLayout(opt_layout, coordinates, 2);
+    if (goog.isNull(this.flatCoordinates)) {
+      this.flatCoordinates = [];
+    }
+    var ends = ol.geom.flat.deflate.coordinatess(
+        this.flatCoordinates, 0, coordinates, this.stride, this.ends_);
+    this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {Array.<number>} ends Ends.
+ */
+ol.geom.MultiLineString.prototype.setFlatCoordinates =
+    function(layout, flatCoordinates, ends) {
+  if (goog.isNull(flatCoordinates)) {
+    goog.asserts.assert(!goog.isNull(ends) && ends.length === 0);
+  } else if (ends.length === 0) {
+    goog.asserts.assert(flatCoordinates.length === 0);
+  } else {
+    goog.asserts.assert(flatCoordinates.length == ends[ends.length - 1]);
+  }
+  this.setFlatCoordinatesInternal(layout, flatCoordinates);
+  this.ends_ = ends;
+  this.changed();
+};
+
+
+/**
+ * @param {Array.<ol.geom.LineString>} lineStrings LineStrings.
+ */
+ol.geom.MultiLineString.prototype.setLineStrings = function(lineStrings) {
+  var layout = ol.geom.GeometryLayout.XY;
+  var flatCoordinates = [];
+  var ends = [];
+  var i, ii;
+  for (i = 0, ii = lineStrings.length; i < ii; ++i) {
+    var lineString = lineStrings[i];
+    if (i === 0) {
+      layout = lineString.getLayout();
+    } else {
+      // FIXME better handle the case of non-matching layouts
+      goog.asserts.assert(lineString.getLayout() == layout);
+    }
+    goog.array.extend(flatCoordinates, lineString.getFlatCoordinates());
+    ends.push(flatCoordinates.length);
+  }
+  this.setFlatCoordinates(layout, flatCoordinates, ends);
+};
diff --git a/src/ol/geom/multipoint.js b/src/ol/geom/multipoint.js
new file mode 100644
index 0000000..32b1cc0
--- /dev/null
+++ b/src/ol/geom/multipoint.js
@@ -0,0 +1,193 @@
+goog.provide('ol.geom.MultiPoint');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.geom.flat.inflate');
+goog.require('ol.math');
+
+
+
+/**
+ * @classdesc
+ * Multi-point geometry.
+ *
+ * @constructor
+ * @extends {ol.geom.SimpleGeometry}
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.MultiPoint = function(coordinates, opt_layout) {
+  goog.base(this);
+  this.setCoordinates(coordinates,
+      /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
+};
+goog.inherits(ol.geom.MultiPoint, ol.geom.SimpleGeometry);
+
+
+/**
+ * @param {ol.geom.Point} point Point.
+ * @api stable
+ */
+ol.geom.MultiPoint.prototype.appendPoint = function(point) {
+  goog.asserts.assert(point.getLayout() == this.layout);
+  if (goog.isNull(this.flatCoordinates)) {
+    this.flatCoordinates = point.getFlatCoordinates().slice();
+  } else {
+    goog.array.extend(this.flatCoordinates, point.getFlatCoordinates());
+  }
+  this.changed();
+};
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.MultiPoint} Clone.
+ * @api stable
+ */
+ol.geom.MultiPoint.prototype.clone = function() {
+  var multiPoint = new ol.geom.MultiPoint(null);
+  multiPoint.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
+  return multiPoint;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.MultiPoint.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  if (minSquaredDistance <
+      ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
+    return minSquaredDistance;
+  }
+  var flatCoordinates = this.flatCoordinates;
+  var stride = this.stride;
+  var i, ii, j;
+  for (i = 0, ii = flatCoordinates.length; i < ii; i += stride) {
+    var squaredDistance = ol.math.squaredDistance(
+        x, y, flatCoordinates[i], flatCoordinates[i + 1]);
+    if (squaredDistance < minSquaredDistance) {
+      minSquaredDistance = squaredDistance;
+      for (j = 0; j < stride; ++j) {
+        closestPoint[j] = flatCoordinates[i + j];
+      }
+      closestPoint.length = stride;
+    }
+  }
+  return minSquaredDistance;
+};
+
+
+/**
+ * @return {Array.<ol.Coordinate>} Coordinates.
+ * @api stable
+ */
+ol.geom.MultiPoint.prototype.getCoordinates = function() {
+  return ol.geom.flat.inflate.coordinates(
+      this.flatCoordinates, 0, this.flatCoordinates.length, this.stride);
+};
+
+
+/**
+ * @param {number} index Index.
+ * @return {ol.geom.Point} Point.
+ * @api stable
+ */
+ol.geom.MultiPoint.prototype.getPoint = function(index) {
+  var n = goog.isNull(this.flatCoordinates) ?
+      0 : this.flatCoordinates.length / this.stride;
+  goog.asserts.assert(0 <= index && index < n);
+  if (index < 0 || n <= index) {
+    return null;
+  }
+  var point = new ol.geom.Point(null);
+  point.setFlatCoordinates(this.layout, this.flatCoordinates.slice(
+      index * this.stride, (index + 1) * this.stride));
+  return point;
+};
+
+
+/**
+ * @return {Array.<ol.geom.Point>} Points.
+ * @api stable
+ */
+ol.geom.MultiPoint.prototype.getPoints = function() {
+  var flatCoordinates = this.flatCoordinates;
+  var layout = this.layout;
+  var stride = this.stride;
+  /** @type {Array.<ol.geom.Point>} */
+  var points = [];
+  var i, ii;
+  for (i = 0, ii = flatCoordinates.length; i < ii; i += stride) {
+    var point = new ol.geom.Point(null);
+    point.setFlatCoordinates(layout, flatCoordinates.slice(i, i + stride));
+    points.push(point);
+  }
+  return points;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.MultiPoint.prototype.getType = function() {
+  return ol.geom.GeometryType.MULTI_POINT;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.MultiPoint.prototype.intersectsExtent = function(extent) {
+  var flatCoordinates = this.flatCoordinates;
+  var stride = this.stride;
+  var i, ii, x, y;
+  for (i = 0, ii = flatCoordinates.length; i < ii; i += stride) {
+    x = flatCoordinates[i];
+    y = flatCoordinates[i + 1];
+    if (ol.extent.containsXY(extent, x, y)) {
+      return true;
+    }
+  }
+  return false;
+};
+
+
+/**
+ * @param {Array.<ol.Coordinate>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.MultiPoint.prototype.setCoordinates =
+    function(coordinates, opt_layout) {
+  if (goog.isNull(coordinates)) {
+    this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
+  } else {
+    this.setLayout(opt_layout, coordinates, 1);
+    if (goog.isNull(this.flatCoordinates)) {
+      this.flatCoordinates = [];
+    }
+    this.flatCoordinates.length = ol.geom.flat.deflate.coordinates(
+        this.flatCoordinates, 0, coordinates, this.stride);
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ */
+ol.geom.MultiPoint.prototype.setFlatCoordinates =
+    function(layout, flatCoordinates) {
+  this.setFlatCoordinatesInternal(layout, flatCoordinates);
+  this.changed();
+};
diff --git a/src/ol/geom/multipolygon.js b/src/ol/geom/multipolygon.js
new file mode 100644
index 0000000..3dafa46
--- /dev/null
+++ b/src/ol/geom/multipolygon.js
@@ -0,0 +1,404 @@
+goog.provide('ol.geom.MultiPolygon');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.Polygon');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.area');
+goog.require('ol.geom.flat.center');
+goog.require('ol.geom.flat.closest');
+goog.require('ol.geom.flat.contains');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.geom.flat.inflate');
+goog.require('ol.geom.flat.interiorpoint');
+goog.require('ol.geom.flat.intersectsextent');
+goog.require('ol.geom.flat.orient');
+goog.require('ol.geom.flat.simplify');
+
+
+
+/**
+ * @classdesc
+ * Multi-polygon geometry.
+ *
+ * @constructor
+ * @extends {ol.geom.SimpleGeometry}
+ * @param {Array.<Array.<Array.<ol.Coordinate>>>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.MultiPolygon = function(coordinates, opt_layout) {
+
+  goog.base(this);
+
+  /**
+   * @type {Array.<Array.<number>>}
+   * @private
+   */
+  this.endss_ = [];
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.flatInteriorPointsRevision_ = -1;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.flatInteriorPoints_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDelta_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDeltaRevision_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.orientedRevision_ = -1;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.orientedFlatCoordinates_ = null;
+
+  this.setCoordinates(coordinates,
+      /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
+
+};
+goog.inherits(ol.geom.MultiPolygon, ol.geom.SimpleGeometry);
+
+
+/**
+ * @param {ol.geom.Polygon} polygon Polygon.
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.appendPolygon = function(polygon) {
+  goog.asserts.assert(polygon.getLayout() == this.layout);
+  /** @type {Array.<number>} */
+  var ends;
+  if (goog.isNull(this.flatCoordinates)) {
+    this.flatCoordinates = polygon.getFlatCoordinates().slice();
+    ends = polygon.getEnds().slice();
+    this.endss_.push();
+  } else {
+    var offset = this.flatCoordinates.length;
+    goog.array.extend(this.flatCoordinates, polygon.getFlatCoordinates());
+    ends = polygon.getEnds().slice();
+    var i, ii;
+    for (i = 0, ii = ends.length; i < ii; ++i) {
+      ends[i] += offset;
+    }
+  }
+  this.endss_.push(ends);
+  this.changed();
+};
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.MultiPolygon} Clone.
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.clone = function() {
+  var multiPolygon = new ol.geom.MultiPolygon(null);
+  multiPolygon.setFlatCoordinates(
+      this.layout, this.flatCoordinates.slice(), this.endss_.slice());
+  return multiPolygon;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.MultiPolygon.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  if (minSquaredDistance <
+      ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
+    return minSquaredDistance;
+  }
+  if (this.maxDeltaRevision_ != this.getRevision()) {
+    this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getssMaxSquaredDelta(
+        this.flatCoordinates, 0, this.endss_, this.stride, 0));
+    this.maxDeltaRevision_ = this.getRevision();
+  }
+  return ol.geom.flat.closest.getssClosestPoint(
+      this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride,
+      this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.MultiPolygon.prototype.containsXY = function(x, y) {
+  return ol.geom.flat.contains.linearRingssContainsXY(
+      this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, x, y);
+};
+
+
+/**
+ * @return {number} Area (on projected plane).
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.getArea = function() {
+  return ol.geom.flat.area.linearRingss(
+      this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride);
+};
+
+
+/**
+ * @return {Array.<Array.<Array.<ol.Coordinate>>>} Coordinates.
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.getCoordinates = function() {
+  return ol.geom.flat.inflate.coordinatesss(
+      this.flatCoordinates, 0, this.endss_, this.stride);
+};
+
+
+/**
+ * @return {Array.<Array.<number>>} Endss.
+ */
+ol.geom.MultiPolygon.prototype.getEndss = function() {
+  return this.endss_;
+};
+
+
+/**
+ * @return {Array.<number>} Flat interior points.
+ */
+ol.geom.MultiPolygon.prototype.getFlatInteriorPoints = function() {
+  if (this.flatInteriorPointsRevision_ != this.getRevision()) {
+    var flatCenters = ol.geom.flat.center.linearRingss(
+        this.flatCoordinates, 0, this.endss_, this.stride);
+    this.flatInteriorPoints_ = ol.geom.flat.interiorpoint.linearRingss(
+        this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride,
+        flatCenters);
+    this.flatInteriorPointsRevision_ = this.getRevision();
+  }
+  return this.flatInteriorPoints_;
+};
+
+
+/**
+ * @return {ol.geom.MultiPoint} Interior points.
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.getInteriorPoints = function() {
+  var interiorPoints = new ol.geom.MultiPoint(null);
+  interiorPoints.setFlatCoordinates(ol.geom.GeometryLayout.XY,
+      this.getFlatInteriorPoints().slice());
+  return interiorPoints;
+};
+
+
+/**
+ * @return {Array.<number>} Oriented flat coordinates.
+ */
+ol.geom.MultiPolygon.prototype.getOrientedFlatCoordinates = function() {
+  if (this.orientedRevision_ != this.getRevision()) {
+    var flatCoordinates = this.flatCoordinates;
+    if (ol.geom.flat.linearRingssAreOriented(
+        flatCoordinates, 0, this.endss_, this.stride)) {
+      this.orientedFlatCoordinates_ = flatCoordinates;
+    } else {
+      this.orientedFlatCoordinates_ = flatCoordinates.slice();
+      this.orientedFlatCoordinates_.length =
+          ol.geom.flat.orient.orientLinearRingss(
+              this.orientedFlatCoordinates_, 0, this.endss_, this.stride);
+    }
+    this.orientedRevision_ = this.getRevision();
+  }
+  return this.orientedFlatCoordinates_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.MultiPolygon.prototype.getSimplifiedGeometryInternal =
+    function(squaredTolerance) {
+  var simplifiedFlatCoordinates = [];
+  var simplifiedEndss = [];
+  simplifiedFlatCoordinates.length = ol.geom.flat.simplify.quantizess(
+      this.flatCoordinates, 0, this.endss_, this.stride,
+      Math.sqrt(squaredTolerance),
+      simplifiedFlatCoordinates, 0, simplifiedEndss);
+  var simplifiedMultiPolygon = new ol.geom.MultiPolygon(null);
+  simplifiedMultiPolygon.setFlatCoordinates(
+      ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEndss);
+  return simplifiedMultiPolygon;
+};
+
+
+/**
+ * @param {number} index Index.
+ * @return {ol.geom.Polygon} Polygon.
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.getPolygon = function(index) {
+  goog.asserts.assert(0 <= index && index < this.endss_.length);
+  if (index < 0 || this.endss_.length <= index) {
+    return null;
+  }
+  var offset;
+  if (index === 0) {
+    offset = 0;
+  } else {
+    var prevEnds = this.endss_[index - 1];
+    offset = prevEnds[prevEnds.length - 1];
+  }
+  var ends = this.endss_[index].slice();
+  var end = ends[ends.length - 1];
+  if (offset !== 0) {
+    var i, ii;
+    for (i = 0, ii = ends.length; i < ii; ++i) {
+      ends[i] -= offset;
+    }
+  }
+  var polygon = new ol.geom.Polygon(null);
+  polygon.setFlatCoordinates(
+      this.layout, this.flatCoordinates.slice(offset, end), ends);
+  return polygon;
+};
+
+
+/**
+ * @return {Array.<ol.geom.Polygon>} Polygons.
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.getPolygons = function() {
+  var layout = this.layout;
+  var flatCoordinates = this.flatCoordinates;
+  var endss = this.endss_;
+  var polygons = [];
+  var offset = 0;
+  var i, ii, j, jj;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    var ends = endss[i].slice();
+    var end = ends[ends.length - 1];
+    if (offset !== 0) {
+      for (j = 0, jj = ends.length; j < jj; ++j) {
+        ends[j] -= offset;
+      }
+    }
+    var polygon = new ol.geom.Polygon(null);
+    polygon.setFlatCoordinates(
+        layout, flatCoordinates.slice(offset, end), ends);
+    polygons.push(polygon);
+    offset = end;
+  }
+  return polygons;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.getType = function() {
+  return ol.geom.GeometryType.MULTI_POLYGON;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.MultiPolygon.prototype.intersectsExtent = function(extent) {
+  return ol.geom.flat.intersectsextent.linearRingss(
+      this.getOrientedFlatCoordinates(), 0, this.endss_, this.stride, extent);
+};
+
+
+/**
+ * @param {Array.<Array.<Array.<ol.Coordinate>>>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.MultiPolygon.prototype.setCoordinates =
+    function(coordinates, opt_layout) {
+  if (goog.isNull(coordinates)) {
+    this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.endss_);
+  } else {
+    this.setLayout(opt_layout, coordinates, 3);
+    if (goog.isNull(this.flatCoordinates)) {
+      this.flatCoordinates = [];
+    }
+    var endss = ol.geom.flat.deflate.coordinatesss(
+        this.flatCoordinates, 0, coordinates, this.stride, this.endss_);
+    if (endss.length === 0) {
+      this.flatCoordinates.length = 0;
+    } else {
+      var lastEnds = endss[endss.length - 1];
+      this.flatCoordinates.length = lastEnds.length === 0 ?
+          0 : lastEnds[lastEnds.length - 1];
+    }
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {Array.<Array.<number>>} endss Endss.
+ */
+ol.geom.MultiPolygon.prototype.setFlatCoordinates =
+    function(layout, flatCoordinates, endss) {
+  goog.asserts.assert(!goog.isNull(endss));
+  if (goog.isNull(flatCoordinates) || flatCoordinates.length === 0) {
+    goog.asserts.assert(endss.length === 0);
+  } else {
+    goog.asserts.assert(endss.length > 0);
+    var ends = endss[endss.length - 1];
+    goog.asserts.assert(flatCoordinates.length == ends[ends.length - 1]);
+  }
+  this.setFlatCoordinatesInternal(layout, flatCoordinates);
+  this.endss_ = endss;
+  this.changed();
+};
+
+
+/**
+ * @param {Array.<ol.geom.Polygon>} polygons Polygons.
+ */
+ol.geom.MultiPolygon.prototype.setPolygons = function(polygons) {
+  var layout = ol.geom.GeometryLayout.XY;
+  var flatCoordinates = [];
+  var endss = [];
+  var i, ii, ends;
+  for (i = 0, ii = polygons.length; i < ii; ++i) {
+    var polygon = polygons[i];
+    if (i === 0) {
+      layout = polygon.getLayout();
+    } else {
+      // FIXME better handle the case of non-matching layouts
+      goog.asserts.assert(polygon.getLayout() == layout);
+    }
+    var offset = flatCoordinates.length;
+    ends = polygon.getEnds();
+    var j, jj;
+    for (j = 0, jj = ends.length; j < jj; ++j) {
+      ends[j] += offset;
+    }
+    goog.array.extend(flatCoordinates, polygon.getFlatCoordinates());
+    endss.push(ends);
+  }
+  this.setFlatCoordinates(layout, flatCoordinates, endss);
+};
diff --git a/src/ol/geom/point.js b/src/ol/geom/point.js
new file mode 100644
index 0000000..07ba09a
--- /dev/null
+++ b/src/ol/geom/point.js
@@ -0,0 +1,133 @@
+goog.provide('ol.geom.Point');
+
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.math');
+
+
+
+/**
+ * @classdesc
+ * Point geometry.
+ *
+ * @constructor
+ * @extends {ol.geom.SimpleGeometry}
+ * @param {ol.Coordinate} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.Point = function(coordinates, opt_layout) {
+  goog.base(this);
+  this.setCoordinates(coordinates,
+      /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
+};
+goog.inherits(ol.geom.Point, ol.geom.SimpleGeometry);
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.Point} Clone.
+ * @api stable
+ */
+ol.geom.Point.prototype.clone = function() {
+  var point = new ol.geom.Point(null);
+  point.setFlatCoordinates(this.layout, this.flatCoordinates.slice());
+  return point;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.Point.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  var flatCoordinates = this.flatCoordinates;
+  var squaredDistance = ol.math.squaredDistance(
+      x, y, flatCoordinates[0], flatCoordinates[1]);
+  if (squaredDistance < minSquaredDistance) {
+    var stride = this.stride;
+    var i;
+    for (i = 0; i < stride; ++i) {
+      closestPoint[i] = flatCoordinates[i];
+    }
+    closestPoint.length = stride;
+    return squaredDistance;
+  } else {
+    return minSquaredDistance;
+  }
+};
+
+
+/**
+ * @return {ol.Coordinate} Coordinates.
+ * @api stable
+ */
+ol.geom.Point.prototype.getCoordinates = function() {
+  return goog.isNull(this.flatCoordinates) ? [] : this.flatCoordinates.slice();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.Point.prototype.getExtent = function(opt_extent) {
+  if (this.extentRevision != this.getRevision()) {
+    this.extent = ol.extent.createOrUpdateFromCoordinate(
+        this.flatCoordinates, this.extent);
+    this.extentRevision = this.getRevision();
+  }
+  goog.asserts.assert(goog.isDef(this.extent));
+  return ol.extent.returnOrUpdate(this.extent, opt_extent);
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.Point.prototype.getType = function() {
+  return ol.geom.GeometryType.POINT;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.Point.prototype.intersectsExtent = function(extent) {
+  return ol.extent.containsXY(extent,
+      this.flatCoordinates[0], this.flatCoordinates[1]);
+};
+
+
+/**
+ * @param {ol.Coordinate} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.Point.prototype.setCoordinates = function(coordinates, opt_layout) {
+  if (goog.isNull(coordinates)) {
+    this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null);
+  } else {
+    this.setLayout(opt_layout, coordinates, 0);
+    if (goog.isNull(this.flatCoordinates)) {
+      this.flatCoordinates = [];
+    }
+    this.flatCoordinates.length = ol.geom.flat.deflate.coordinate(
+        this.flatCoordinates, 0, coordinates, this.stride);
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ */
+ol.geom.Point.prototype.setFlatCoordinates = function(layout, flatCoordinates) {
+  this.setFlatCoordinatesInternal(layout, flatCoordinates);
+  this.changed();
+};
diff --git a/src/ol/geom/polygon.js b/src/ol/geom/polygon.js
new file mode 100644
index 0000000..4eea415
--- /dev/null
+++ b/src/ol/geom/polygon.js
@@ -0,0 +1,395 @@
+goog.provide('ol.geom.Polygon');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.LinearRing');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.SimpleGeometry');
+goog.require('ol.geom.flat.area');
+goog.require('ol.geom.flat.closest');
+goog.require('ol.geom.flat.contains');
+goog.require('ol.geom.flat.deflate');
+goog.require('ol.geom.flat.inflate');
+goog.require('ol.geom.flat.interiorpoint');
+goog.require('ol.geom.flat.intersectsextent');
+goog.require('ol.geom.flat.orient');
+goog.require('ol.geom.flat.simplify');
+
+
+
+/**
+ * @classdesc
+ * Polygon geometry.
+ *
+ * @constructor
+ * @extends {ol.geom.SimpleGeometry}
+ * @param {Array.<Array.<ol.Coordinate>>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.Polygon = function(coordinates, opt_layout) {
+
+  goog.base(this);
+
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+  this.ends_ = [];
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.flatInteriorPointRevision_ = -1;
+
+  /**
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.flatInteriorPoint_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDelta_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxDeltaRevision_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.orientedRevision_ = -1;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.orientedFlatCoordinates_ = null;
+
+  this.setCoordinates(coordinates,
+      /** @type {ol.geom.GeometryLayout|undefined} */ (opt_layout));
+
+};
+goog.inherits(ol.geom.Polygon, ol.geom.SimpleGeometry);
+
+
+/**
+ * @param {ol.geom.LinearRing} linearRing Linear ring.
+ * @api stable
+ */
+ol.geom.Polygon.prototype.appendLinearRing = function(linearRing) {
+  goog.asserts.assert(linearRing.getLayout() == this.layout);
+  if (goog.isNull(this.flatCoordinates)) {
+    this.flatCoordinates = linearRing.getFlatCoordinates().slice();
+  } else {
+    goog.array.extend(this.flatCoordinates, linearRing.getFlatCoordinates());
+  }
+  this.ends_.push(this.flatCoordinates.length);
+  this.changed();
+};
+
+
+/**
+ * Make a complete copy of the geometry.
+ * @return {!ol.geom.Polygon} Clone.
+ * @api stable
+ */
+ol.geom.Polygon.prototype.clone = function() {
+  var polygon = new ol.geom.Polygon(null);
+  polygon.setFlatCoordinates(
+      this.layout, this.flatCoordinates.slice(), this.ends_.slice());
+  return polygon;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.Polygon.prototype.closestPointXY =
+    function(x, y, closestPoint, minSquaredDistance) {
+  if (minSquaredDistance <
+      ol.extent.closestSquaredDistanceXY(this.getExtent(), x, y)) {
+    return minSquaredDistance;
+  }
+  if (this.maxDeltaRevision_ != this.getRevision()) {
+    this.maxDelta_ = Math.sqrt(ol.geom.flat.closest.getsMaxSquaredDelta(
+        this.flatCoordinates, 0, this.ends_, this.stride, 0));
+    this.maxDeltaRevision_ = this.getRevision();
+  }
+  return ol.geom.flat.closest.getsClosestPoint(
+      this.flatCoordinates, 0, this.ends_, this.stride,
+      this.maxDelta_, true, x, y, closestPoint, minSquaredDistance);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.Polygon.prototype.containsXY = function(x, y) {
+  return ol.geom.flat.contains.linearRingsContainsXY(
+      this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, x, y);
+};
+
+
+/**
+ * @return {number} Area (on projected plane).
+ * @api stable
+ */
+ol.geom.Polygon.prototype.getArea = function() {
+  return ol.geom.flat.area.linearRings(
+      this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride);
+};
+
+
+/**
+ * @return {Array.<Array.<ol.Coordinate>>} Coordinates.
+ * @api stable
+ */
+ol.geom.Polygon.prototype.getCoordinates = function() {
+  return ol.geom.flat.inflate.coordinatess(
+      this.flatCoordinates, 0, this.ends_, this.stride);
+};
+
+
+/**
+ * @return {Array.<number>} Ends.
+ */
+ol.geom.Polygon.prototype.getEnds = function() {
+  return this.ends_;
+};
+
+
+/**
+ * @return {Array.<number>} Interior point.
+ */
+ol.geom.Polygon.prototype.getFlatInteriorPoint = function() {
+  if (this.flatInteriorPointRevision_ != this.getRevision()) {
+    var flatCenter = ol.extent.getCenter(this.getExtent());
+    this.flatInteriorPoint_ = ol.geom.flat.interiorpoint.linearRings(
+        this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride,
+        flatCenter, 0);
+    this.flatInteriorPointRevision_ = this.getRevision();
+  }
+  return this.flatInteriorPoint_;
+};
+
+
+/**
+ * @return {ol.geom.Point} Interior point.
+ * @api stable
+ */
+ol.geom.Polygon.prototype.getInteriorPoint = function() {
+  return new ol.geom.Point(this.getFlatInteriorPoint());
+};
+
+
+/**
+ * Return the number of rings of the polygon,  this includes the exterior
+ * ring and any interior rings.
+ *
+ * @return {number} Number of rings.
+ * @api
+ */
+ol.geom.Polygon.prototype.getLinearRingCount = function() {
+  return this.ends_.length;
+};
+
+
+/**
+ * Return the Nth linear ring of the polygon geometry. Return `null` if the
+ * given index is out of range.
+ * The exterior linear ring is available at index `0` and the interior rings
+ * at index `1` and beyond.
+ *
+ * @param {number} index Index.
+ * @return {ol.geom.LinearRing} Linear ring.
+ * @api stable
+ */
+ol.geom.Polygon.prototype.getLinearRing = function(index) {
+  goog.asserts.assert(0 <= index && index < this.ends_.length);
+  if (index < 0 || this.ends_.length <= index) {
+    return null;
+  }
+  var linearRing = new ol.geom.LinearRing(null);
+  linearRing.setFlatCoordinates(this.layout, this.flatCoordinates.slice(
+      index === 0 ? 0 : this.ends_[index - 1], this.ends_[index]));
+  return linearRing;
+};
+
+
+/**
+ * @return {Array.<ol.geom.LinearRing>} Linear rings.
+ * @api stable
+ */
+ol.geom.Polygon.prototype.getLinearRings = function() {
+  var layout = this.layout;
+  var flatCoordinates = this.flatCoordinates;
+  var ends = this.ends_;
+  var linearRings = [];
+  var offset = 0;
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    var linearRing = new ol.geom.LinearRing(null);
+    linearRing.setFlatCoordinates(layout, flatCoordinates.slice(offset, end));
+    linearRings.push(linearRing);
+    offset = end;
+  }
+  return linearRings;
+};
+
+
+/**
+ * @return {Array.<number>} Oriented flat coordinates.
+ */
+ol.geom.Polygon.prototype.getOrientedFlatCoordinates = function() {
+  if (this.orientedRevision_ != this.getRevision()) {
+    var flatCoordinates = this.flatCoordinates;
+    if (ol.geom.flat.orient.linearRingsAreOriented(
+        flatCoordinates, 0, this.ends_, this.stride)) {
+      this.orientedFlatCoordinates_ = flatCoordinates;
+    } else {
+      this.orientedFlatCoordinates_ = flatCoordinates.slice();
+      this.orientedFlatCoordinates_.length =
+          ol.geom.flat.orient.orientLinearRings(
+              this.orientedFlatCoordinates_, 0, this.ends_, this.stride);
+    }
+    this.orientedRevision_ = this.getRevision();
+  }
+  return this.orientedFlatCoordinates_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.Polygon.prototype.getSimplifiedGeometryInternal =
+    function(squaredTolerance) {
+  var simplifiedFlatCoordinates = [];
+  var simplifiedEnds = [];
+  simplifiedFlatCoordinates.length = ol.geom.flat.simplify.quantizes(
+      this.flatCoordinates, 0, this.ends_, this.stride,
+      Math.sqrt(squaredTolerance),
+      simplifiedFlatCoordinates, 0, simplifiedEnds);
+  var simplifiedPolygon = new ol.geom.Polygon(null);
+  simplifiedPolygon.setFlatCoordinates(
+      ol.geom.GeometryLayout.XY, simplifiedFlatCoordinates, simplifiedEnds);
+  return simplifiedPolygon;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.Polygon.prototype.getType = function() {
+  return ol.geom.GeometryType.POLYGON;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.geom.Polygon.prototype.intersectsExtent = function(extent) {
+  return ol.geom.flat.intersectsextent.linearRings(
+      this.getOrientedFlatCoordinates(), 0, this.ends_, this.stride, extent);
+};
+
+
+/**
+ * @param {Array.<Array.<ol.Coordinate>>} coordinates Coordinates.
+ * @param {ol.geom.GeometryLayout=} opt_layout Layout.
+ * @api stable
+ */
+ol.geom.Polygon.prototype.setCoordinates = function(coordinates, opt_layout) {
+  if (goog.isNull(coordinates)) {
+    this.setFlatCoordinates(ol.geom.GeometryLayout.XY, null, this.ends_);
+  } else {
+    this.setLayout(opt_layout, coordinates, 2);
+    if (goog.isNull(this.flatCoordinates)) {
+      this.flatCoordinates = [];
+    }
+    var ends = ol.geom.flat.deflate.coordinatess(
+        this.flatCoordinates, 0, coordinates, this.stride, this.ends_);
+    this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {Array.<number>} ends Ends.
+ */
+ol.geom.Polygon.prototype.setFlatCoordinates =
+    function(layout, flatCoordinates, ends) {
+  if (goog.isNull(flatCoordinates)) {
+    goog.asserts.assert(!goog.isNull(ends) && ends.length === 0);
+  } else if (ends.length === 0) {
+    goog.asserts.assert(flatCoordinates.length === 0);
+  } else {
+    goog.asserts.assert(flatCoordinates.length == ends[ends.length - 1]);
+  }
+  this.setFlatCoordinatesInternal(layout, flatCoordinates);
+  this.ends_ = ends;
+  this.changed();
+};
+
+
+/**
+ * Create an approximation of a circle on the surface of a sphere.
+ * @param {ol.Sphere} sphere The sphere.
+ * @param {ol.Coordinate} center Center (`[lon, lat]` in degrees).
+ * @param {number} radius The great-circle distance from the center to
+ *     the polygon vertices.
+ * @param {number=} opt_n Optional number of vertices for the resulting
+ *     polygon. Default is `32`.
+ * @return {ol.geom.Polygon} The "circular" polygon.
+ * @api stable
+ */
+ol.geom.Polygon.circular = function(sphere, center, radius, opt_n) {
+  var n = goog.isDef(opt_n) ? opt_n : 32;
+  /** @type {Array.<number>} */
+  var flatCoordinates = [];
+  var i;
+  for (i = 0; i < n; ++i) {
+    goog.array.extend(
+        flatCoordinates, sphere.offset(center, radius, 2 * Math.PI * i / n));
+  }
+  flatCoordinates.push(flatCoordinates[0], flatCoordinates[1]);
+  var polygon = new ol.geom.Polygon(null);
+  polygon.setFlatCoordinates(
+      ol.geom.GeometryLayout.XY, flatCoordinates, [flatCoordinates.length]);
+  return polygon;
+};
+
+
+/**
+ * Create a polygon from an extent. The layout used is `XY`.
+ * @param {ol.Extent} extent The extent.
+ * @return {ol.geom.Polygon} The polygon.
+ * @api
+ */
+ol.geom.Polygon.fromExtent = function(extent) {
+  var minX = extent[0];
+  var minY = extent[1];
+  var maxX = extent[2];
+  var maxY = extent[3];
+  var flatCoordinates =
+      [minX, minY, minX, maxY, maxX, maxY, maxX, minY, minX, minY];
+  var polygon = new ol.geom.Polygon(null);
+  polygon.setFlatCoordinates(
+      ol.geom.GeometryLayout.XY, flatCoordinates, [flatCoordinates.length]);
+  return polygon;
+};
diff --git a/src/ol/geom/simplegeometry.js b/src/ol/geom/simplegeometry.js
new file mode 100644
index 0000000..7ead9c8
--- /dev/null
+++ b/src/ol/geom/simplegeometry.js
@@ -0,0 +1,293 @@
+goog.provide('ol.geom.SimpleGeometry');
+
+goog.require('goog.asserts');
+goog.require('goog.functions');
+goog.require('goog.object');
+goog.require('ol.extent');
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.flat.transform');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; only used for creating subclasses; do not instantiate
+ * in apps, as cannot be rendered.
+ *
+ * @constructor
+ * @extends {ol.geom.Geometry}
+ * @api stable
+ */
+ol.geom.SimpleGeometry = function() {
+
+  goog.base(this);
+
+  /**
+   * @protected
+   * @type {ol.geom.GeometryLayout}
+   */
+  this.layout = ol.geom.GeometryLayout.XY;
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.stride = 2;
+
+  /**
+   * @protected
+   * @type {Array.<number>}
+   */
+  this.flatCoordinates = null;
+
+};
+goog.inherits(ol.geom.SimpleGeometry, ol.geom.Geometry);
+
+
+/**
+ * @param {number} stride Stride.
+ * @private
+ * @return {ol.geom.GeometryLayout} layout Layout.
+ */
+ol.geom.SimpleGeometry.getLayoutForStride_ = function(stride) {
+  if (stride == 2) {
+    return ol.geom.GeometryLayout.XY;
+  } else if (stride == 3) {
+    return ol.geom.GeometryLayout.XYZ;
+  } else if (stride == 4) {
+    return ol.geom.GeometryLayout.XYZM;
+  } else {
+    goog.asserts.fail('unsupported stride: ' + stride);
+  }
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @private
+ * @return {number} Stride.
+ */
+ol.geom.SimpleGeometry.getStrideForLayout_ = function(layout) {
+  if (layout == ol.geom.GeometryLayout.XY) {
+    return 2;
+  } else if (layout == ol.geom.GeometryLayout.XYZ) {
+    return 3;
+  } else if (layout == ol.geom.GeometryLayout.XYM) {
+    return 3;
+  } else if (layout == ol.geom.GeometryLayout.XYZM) {
+    return 4;
+  } else {
+    goog.asserts.fail('unsupported layout: ' + layout);
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.SimpleGeometry.prototype.containsXY = goog.functions.FALSE;
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.SimpleGeometry.prototype.getExtent = function(opt_extent) {
+  if (this.extentRevision != this.getRevision()) {
+    this.extent = ol.extent.createOrUpdateFromFlatCoordinates(
+        this.flatCoordinates, 0, this.flatCoordinates.length, this.stride,
+        this.extent);
+    this.extentRevision = this.getRevision();
+  }
+  goog.asserts.assert(goog.isDef(this.extent));
+  return ol.extent.returnOrUpdate(this.extent, opt_extent);
+};
+
+
+/**
+ * @return {ol.Coordinate} First coordinate.
+ * @api stable
+ */
+ol.geom.SimpleGeometry.prototype.getFirstCoordinate = function() {
+  return this.flatCoordinates.slice(0, this.stride);
+};
+
+
+/**
+ * @return {Array.<number>} Flat coordinates.
+ */
+ol.geom.SimpleGeometry.prototype.getFlatCoordinates = function() {
+  return this.flatCoordinates;
+};
+
+
+/**
+ * @return {ol.Coordinate} Last point.
+ * @api stable
+ */
+ol.geom.SimpleGeometry.prototype.getLastCoordinate = function() {
+  return this.flatCoordinates.slice(this.flatCoordinates.length - this.stride);
+};
+
+
+/**
+ * @return {ol.geom.GeometryLayout} Layout.
+ * @api stable
+ */
+ol.geom.SimpleGeometry.prototype.getLayout = function() {
+  return this.layout;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.geom.SimpleGeometry.prototype.getSimplifiedGeometry =
+    function(squaredTolerance) {
+  if (this.simplifiedGeometryRevision != this.getRevision()) {
+    goog.object.clear(this.simplifiedGeometryCache);
+    this.simplifiedGeometryMaxMinSquaredTolerance = 0;
+    this.simplifiedGeometryRevision = this.getRevision();
+  }
+  // If squaredTolerance is negative or if we know that simplification will not
+  // have any effect then just return this.
+  if (squaredTolerance < 0 ||
+      (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 &&
+       squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)) {
+    return this;
+  }
+  var key = squaredTolerance.toString();
+  if (this.simplifiedGeometryCache.hasOwnProperty(key)) {
+    return this.simplifiedGeometryCache[key];
+  } else {
+    var simplifiedGeometry =
+        this.getSimplifiedGeometryInternal(squaredTolerance);
+    var simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates();
+    if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) {
+      this.simplifiedGeometryCache[key] = simplifiedGeometry;
+      return simplifiedGeometry;
+    } else {
+      // Simplification did not actually remove any coordinates.  We now know
+      // that any calls to getSimplifiedGeometry with a squaredTolerance less
+      // than or equal to the current squaredTolerance will also not have any
+      // effect.  This allows us to short circuit simplification (saving CPU
+      // cycles) and prevents the cache of simplified geometries from filling
+      // up with useless identical copies of this geometry (saving memory).
+      this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;
+      return this;
+    }
+  }
+};
+
+
+/**
+ * @param {number} squaredTolerance Squared tolerance.
+ * @return {ol.geom.SimpleGeometry} Simplified geometry.
+ * @protected
+ */
+ol.geom.SimpleGeometry.prototype.getSimplifiedGeometryInternal =
+    function(squaredTolerance) {
+  return this;
+};
+
+
+/**
+ * @return {number} Stride.
+ */
+ol.geom.SimpleGeometry.prototype.getStride = function() {
+  return this.stride;
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout} layout Layout.
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @protected
+ */
+ol.geom.SimpleGeometry.prototype.setFlatCoordinatesInternal =
+    function(layout, flatCoordinates) {
+  this.stride = ol.geom.SimpleGeometry.getStrideForLayout_(layout);
+  this.layout = layout;
+  this.flatCoordinates = flatCoordinates;
+};
+
+
+/**
+ * @param {ol.geom.GeometryLayout|undefined} layout Layout.
+ * @param {Array} coordinates Coordinates.
+ * @param {number} nesting Nesting.
+ * @protected
+ */
+ol.geom.SimpleGeometry.prototype.setLayout =
+    function(layout, coordinates, nesting) {
+  /** @type {number} */
+  var stride;
+  if (goog.isDef(layout)) {
+    stride = ol.geom.SimpleGeometry.getStrideForLayout_(layout);
+  } else {
+    var i;
+    for (i = 0; i < nesting; ++i) {
+      if (coordinates.length === 0) {
+        this.layout = ol.geom.GeometryLayout.XY;
+        this.stride = 2;
+        return;
+      } else {
+        coordinates = /** @type {Array} */ (coordinates[0]);
+      }
+    }
+    stride = (/** @type {Array} */ (coordinates)).length;
+    layout = ol.geom.SimpleGeometry.getLayoutForStride_(stride);
+  }
+  this.layout = layout;
+  this.stride = stride;
+};
+
+
+/**
+ * @inheritDoc
+ * @api stable
+ */
+ol.geom.SimpleGeometry.prototype.applyTransform = function(transformFn) {
+  if (!goog.isNull(this.flatCoordinates)) {
+    transformFn(this.flatCoordinates, this.flatCoordinates, this.stride);
+    this.changed();
+  }
+};
+
+
+/**
+ * Translate the geometry.
+ * @param {number} deltaX Delta X.
+ * @param {number} deltaY Delta Y.
+ * @api
+ */
+ol.geom.SimpleGeometry.prototype.translate = function(deltaX, deltaY) {
+  var flatCoordinates = this.getFlatCoordinates();
+  if (!goog.isNull(flatCoordinates)) {
+    var stride = this.getStride();
+    ol.geom.flat.transform.translate(
+        flatCoordinates, 0, flatCoordinates.length, stride,
+        deltaX, deltaY, flatCoordinates);
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {ol.geom.SimpleGeometry} simpleGeometry Simple geometry.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {Array.<number>=} opt_dest Destination.
+ * @return {Array.<number>} Transformed flat coordinates.
+ */
+ol.geom.transformSimpleGeometry2D =
+    function(simpleGeometry, transform, opt_dest) {
+  var flatCoordinates = simpleGeometry.getFlatCoordinates();
+  if (goog.isNull(flatCoordinates)) {
+    return null;
+  } else {
+    var stride = simpleGeometry.getStride();
+    return ol.geom.flat.transform.transform2D(
+        flatCoordinates, 0, flatCoordinates.length, stride,
+        transform, opt_dest);
+  }
+};
diff --git a/src/ol/graticule.js b/src/ol/graticule.js
new file mode 100644
index 0000000..3b4fe7d
--- /dev/null
+++ b/src/ol/graticule.js
@@ -0,0 +1,435 @@
+goog.provide('ol.Graticule');
+
+goog.require('goog.asserts');
+goog.require('goog.math');
+goog.require('ol.extent');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.flat.geodesic');
+goog.require('ol.proj');
+goog.require('ol.render.EventType');
+goog.require('ol.style.Stroke');
+
+
+
+/**
+ * @constructor
+ * @param {olx.GraticuleOptions=} opt_options Options.
+ * @api
+ */
+ol.Graticule = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @type {ol.Map}
+   * @private
+   */
+  this.map_ = null;
+
+  /**
+   * @type {ol.proj.Projection}
+   * @private
+   */
+  this.projection_ = null;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.maxLat_ = Infinity;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.maxLon_ = Infinity;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.minLat_ = -Infinity;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.minLon_ = -Infinity;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.targetSize_ = goog.isDef(options.targetSize) ?
+      options.targetSize : 100;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.maxLines_ = goog.isDef(options.maxLines) ? options.maxLines : 100;
+  goog.asserts.assert(this.maxLines_ > 0);
+
+  /**
+   * @type {Array.<ol.geom.LineString>}
+   * @private
+   */
+  this.meridians_ = [];
+
+  /**
+   * @type {Array.<ol.geom.LineString>}
+   * @private
+   */
+  this.parallels_ = [];
+
+  /**
+   * @type {ol.style.Stroke}
+   * @private
+   */
+  this.strokeStyle_ = goog.isDef(options.strokeStyle) ?
+      options.strokeStyle : ol.Graticule.DEFAULT_STROKE_STYLE_;
+
+  /**
+   * @type {ol.TransformFunction|undefined}
+   * @private
+   */
+  this.fromLonLatTransform_ = undefined;
+
+  /**
+   * @type {ol.TransformFunction|undefined}
+   * @private
+   */
+  this.toLonLatTransform_ = undefined;
+
+  /**
+   * @type {ol.Coordinate}
+   * @private
+   */
+  this.projectionCenterLonLat_ = null;
+
+  this.setMap(goog.isDef(options.map) ? options.map : null);
+};
+
+
+/**
+ * @type {ol.style.Stroke}
+ * @private
+ * @const
+ */
+ol.Graticule.DEFAULT_STROKE_STYLE_ = new ol.style.Stroke({
+  color: 'rgba(0,0,0,0.2)'
+});
+
+
+/**
+ * TODO can be configurable
+ * @type {Array.<number>}
+ * @private
+ */
+ol.Graticule.intervals_ = [90, 45, 30, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05,
+  0.01, 0.005, 0.002, 0.001];
+
+
+/**
+ * @param {number} lon Longitude.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @param {ol.Extent} extent Extent.
+ * @param {number} index Index.
+ * @return {number} Index.
+ * @private
+ */
+ol.Graticule.prototype.addMeridian_ =
+    function(lon, squaredTolerance, extent, index) {
+  var lineString = this.getMeridian_(lon, squaredTolerance, index);
+  if (ol.extent.intersects(lineString.getExtent(), extent)) {
+    this.meridians_[index++] = lineString;
+  }
+  return index;
+};
+
+
+/**
+ * @param {number} lat Latitude.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @param {ol.Extent} extent Extent.
+ * @param {number} index Index.
+ * @return {number} Index.
+ * @private
+ */
+ol.Graticule.prototype.addParallel_ =
+    function(lat, squaredTolerance, extent, index) {
+  var lineString = this.getParallel_(lat, squaredTolerance, index);
+  if (ol.extent.intersects(lineString.getExtent(), extent)) {
+    this.parallels_[index++] = lineString;
+  }
+  return index;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Coordinate} center Center.
+ * @param {number} resolution Resolution.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @private
+ */
+ol.Graticule.prototype.createGraticule_ =
+    function(extent, center, resolution, squaredTolerance) {
+
+  var interval = this.getInterval_(resolution);
+  if (interval == -1) {
+    this.meridians_.length = this.parallels_.length = 0;
+    return;
+  }
+
+  var centerLonLat = this.toLonLatTransform_(center);
+  var centerLon = centerLonLat[0];
+  var centerLat = centerLonLat[1];
+  var maxLines = this.maxLines_;
+  var cnt, idx, lat, lon;
+
+  // Create meridians
+
+  centerLon = Math.floor(centerLon / interval) * interval;
+  lon = goog.math.clamp(centerLon, this.minLon_, this.maxLon_);
+
+  idx = this.addMeridian_(lon, squaredTolerance, extent, 0);
+
+  cnt = 0;
+  while (lon != this.minLon_ && cnt++ < maxLines) {
+    lon = Math.max(lon - interval, this.minLon_);
+    idx = this.addMeridian_(lon, squaredTolerance, extent, idx);
+  }
+
+  lon = goog.math.clamp(centerLon, this.minLon_, this.maxLon_);
+
+  cnt = 0;
+  while (lon != this.maxLon_ && cnt++ < maxLines) {
+    lon = Math.min(lon + interval, this.maxLon_);
+    idx = this.addMeridian_(lon, squaredTolerance, extent, idx);
+  }
+
+  this.meridians_.length = idx;
+
+  // Create parallels
+
+  centerLat = Math.floor(centerLat / interval) * interval;
+  lat = goog.math.clamp(centerLat, this.minLat_, this.maxLat_);
+
+  idx = this.addParallel_(lat, squaredTolerance, extent, 0);
+
+  cnt = 0;
+  while (lat != this.minLat_ && cnt++ < maxLines) {
+    lat = Math.max(lat - interval, this.minLat_);
+    idx = this.addParallel_(lat, squaredTolerance, extent, idx);
+  }
+
+  lat = goog.math.clamp(centerLat, this.minLat_, this.maxLat_);
+
+  cnt = 0;
+  while (lat != this.maxLat_ && cnt++ < maxLines) {
+    lat = Math.min(lat + interval, this.maxLat_);
+    idx = this.addParallel_(lat, squaredTolerance, extent, idx);
+  }
+
+  this.parallels_.length = idx;
+
+};
+
+
+/**
+ * @param {number} resolution Resolution.
+ * @return {number} The interval in degrees.
+ * @private
+ */
+ol.Graticule.prototype.getInterval_ = function(resolution) {
+  var centerLon = this.projectionCenterLonLat_[0];
+  var centerLat = this.projectionCenterLonLat_[1];
+  var interval = -1;
+  var i, ii, delta, dist;
+  var target = Math.pow(this.targetSize_ * resolution, 2);
+  /** @type {Array.<number>} **/
+  var p1 = [];
+  /** @type {Array.<number>} **/
+  var p2 = [];
+  for (i = 0, ii = ol.Graticule.intervals_.length; i < ii; ++i) {
+    delta = ol.Graticule.intervals_[i] / 2;
+    p1[0] = centerLon - delta;
+    p1[1] = centerLat - delta;
+    p2[0] = centerLon + delta;
+    p2[1] = centerLat + delta;
+    this.fromLonLatTransform_(p1, p1);
+    this.fromLonLatTransform_(p2, p2);
+    dist = Math.pow(p2[0] - p1[0], 2) + Math.pow(p2[1] - p1[1], 2);
+    if (dist <= target) {
+      break;
+    }
+    interval = ol.Graticule.intervals_[i];
+  }
+  return interval;
+};
+
+
+/**
+ * @return {ol.Map} The map.
+ * @api
+ */
+ol.Graticule.prototype.getMap = function() {
+  return this.map_;
+};
+
+
+/**
+ * @param {number} lon Longitude.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @return {ol.geom.LineString} The meridian line string.
+ * @param {number} index Index.
+ * @private
+ */
+ol.Graticule.prototype.getMeridian_ = function(lon, squaredTolerance, index) {
+  goog.asserts.assert(lon >= this.minLon_);
+  goog.asserts.assert(lon <= this.maxLon_);
+  var flatCoordinates = ol.geom.flat.geodesic.meridian(lon,
+      this.minLat_, this.maxLat_, this.projection_, squaredTolerance);
+  goog.asserts.assert(flatCoordinates.length > 0);
+  var lineString = goog.isDef(this.meridians_[index]) ?
+      this.meridians_[index] : new ol.geom.LineString(null);
+  lineString.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates);
+  return lineString;
+};
+
+
+/**
+ * @return {Array.<ol.geom.LineString>} The meridians.
+ * @api
+ */
+ol.Graticule.prototype.getMeridians = function() {
+  return this.meridians_;
+};
+
+
+/**
+ * @param {number} lat Latitude.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @return {ol.geom.LineString} The parallel line string.
+ * @param {number} index Index.
+ * @private
+ */
+ol.Graticule.prototype.getParallel_ = function(lat, squaredTolerance, index) {
+  goog.asserts.assert(lat >= this.minLat_);
+  goog.asserts.assert(lat <= this.maxLat_);
+  var flatCoordinates = ol.geom.flat.geodesic.parallel(lat,
+      this.minLon_, this.maxLon_, this.projection_, squaredTolerance);
+  goog.asserts.assert(flatCoordinates.length > 0);
+  var lineString = goog.isDef(this.parallels_[index]) ?
+      this.parallels_[index] : new ol.geom.LineString(null);
+  lineString.setFlatCoordinates(ol.geom.GeometryLayout.XY, flatCoordinates);
+  return lineString;
+};
+
+
+/**
+ * @return {Array.<ol.geom.LineString>} The parallels.
+ * @api
+ */
+ol.Graticule.prototype.getParallels = function() {
+  return this.parallels_;
+};
+
+
+/**
+ * @param {ol.render.Event} e Event.
+ * @private
+ */
+ol.Graticule.prototype.handlePostCompose_ = function(e) {
+  var vectorContext = e.vectorContext;
+  var frameState = e.frameState;
+  var extent = frameState.extent;
+  var viewState = frameState.viewState;
+  var center = viewState.center;
+  var projection = viewState.projection;
+  var resolution = viewState.resolution;
+  var pixelRatio = frameState.pixelRatio;
+  var squaredTolerance =
+      resolution * resolution / (4 * pixelRatio * pixelRatio);
+
+  var updateProjectionInfo = goog.isNull(this.projection_) ||
+      !ol.proj.equivalent(this.projection_, projection);
+
+  if (updateProjectionInfo) {
+    this.updateProjectionInfo_(projection);
+  }
+
+  this.createGraticule_(extent, center, resolution, squaredTolerance);
+
+  // Draw the lines
+  vectorContext.setFillStrokeStyle(null, this.strokeStyle_);
+  var i, l, line;
+  for (i = 0, l = this.meridians_.length; i < l; ++i) {
+    line = this.meridians_[i];
+    vectorContext.drawLineStringGeometry(line, null);
+  }
+  for (i = 0, l = this.parallels_.length; i < l; ++i) {
+    line = this.parallels_[i];
+    vectorContext.drawLineStringGeometry(line, null);
+  }
+};
+
+
+/**
+ * @param {ol.proj.Projection} projection Projection.
+ * @private
+ */
+ol.Graticule.prototype.updateProjectionInfo_ = function(projection) {
+  goog.asserts.assert(!goog.isNull(projection));
+
+  var extent = projection.getExtent();
+  var worldExtent = projection.getWorldExtent();
+  var maxLat = worldExtent[3];
+  var maxLon = worldExtent[2];
+  var minLat = worldExtent[1];
+  var minLon = worldExtent[0];
+
+  goog.asserts.assert(!goog.isNull(extent));
+  goog.asserts.assert(goog.isDef(maxLat));
+  goog.asserts.assert(goog.isDef(maxLon));
+  goog.asserts.assert(goog.isDef(minLat));
+  goog.asserts.assert(goog.isDef(minLon));
+
+  this.maxLat_ = maxLat;
+  this.maxLon_ = maxLon;
+  this.minLat_ = minLat;
+  this.minLon_ = minLon;
+
+  var epsg4326Projection = ol.proj.get('EPSG:4326');
+
+  this.fromLonLatTransform_ = ol.proj.getTransform(
+      epsg4326Projection, projection);
+
+  this.toLonLatTransform_ = ol.proj.getTransform(
+      projection, epsg4326Projection);
+
+  this.projectionCenterLonLat_ = this.toLonLatTransform_(
+      ol.extent.getCenter(extent));
+
+  this.projection_ = projection;
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @api
+ */
+ol.Graticule.prototype.setMap = function(map) {
+  if (!goog.isNull(this.map_)) {
+    this.map_.un(ol.render.EventType.POSTCOMPOSE,
+        this.handlePostCompose_, this);
+    this.map_.render();
+  }
+  if (!goog.isNull(map)) {
+    map.on(ol.render.EventType.POSTCOMPOSE,
+        this.handlePostCompose_, this);
+    map.render();
+  }
+  this.map_ = map;
+};
diff --git a/src/ol/has.js b/src/ol/has.js
new file mode 100644
index 0000000..f86249f
--- /dev/null
+++ b/src/ol/has.js
@@ -0,0 +1,150 @@
+goog.provide('ol.has');
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('ol');
+goog.require('ol.dom');
+goog.require('ol.webgl');
+
+
+/**
+ * The ratio between physical pixels and device-independent pixels
+ * (dips) on the device (`window.devicePixelRatio`).
+ * @const
+ * @type {number}
+ * @api stable
+ */
+ol.has.DEVICE_PIXEL_RATIO = goog.global.devicePixelRatio || 1;
+
+
+/**
+ * True if the browser supports ArrayBuffers.
+ * @const
+ * @type {boolean}
+ */
+ol.has.ARRAY_BUFFER = 'ArrayBuffer' in goog.global;
+
+
+/**
+ * True if the browser's Canvas implementation implements {get,set}LineDash.
+ * @type {boolean}
+ */
+ol.has.CANVAS_LINE_DASH = false;
+
+
+/**
+ * True if browser supports Canvas.
+ * @const
+ * @type {boolean}
+ * @api stable
+ */
+ol.has.CANVAS = ol.ENABLE_CANVAS && (
+    /**
+     * @return {boolean} Canvas supported.
+     */
+    function() {
+      if (!('HTMLCanvasElement' in goog.global)) {
+        return false;
+      }
+      try {
+        var context = ol.dom.createCanvasContext2D();
+        if (goog.isNull(context)) {
+          return false;
+        } else {
+          if (goog.isDef(context.setLineDash)) {
+            ol.has.CANVAS_LINE_DASH = true;
+          }
+          return true;
+        }
+      } catch (e) {
+        return false;
+      }
+    })();
+
+
+/**
+ * Indicates if DeviceOrientation is supported in the user's browser.
+ * @const
+ * @type {boolean}
+ * @api stable
+ */
+ol.has.DEVICE_ORIENTATION = 'DeviceOrientationEvent' in goog.global;
+
+
+/**
+ * True if browser supports DOM.
+ * @const
+ * @type {boolean}
+ */
+ol.has.DOM = ol.ENABLE_DOM;
+
+
+/**
+ * Is HTML5 geolocation supported in the current browser?
+ * @const
+ * @type {boolean}
+ * @api stable
+ */
+ol.has.GEOLOCATION = 'geolocation' in goog.global.navigator;
+
+
+/**
+ * True if browser supports touch events.
+ * @const
+ * @type {boolean}
+ * @api stable
+ */
+ol.has.TOUCH = ol.ASSUME_TOUCH || 'ontouchstart' in goog.global;
+
+
+/**
+ * True if browser supports pointer events.
+ * @const
+ * @type {boolean}
+ */
+ol.has.POINTER = 'PointerEvent' in goog.global;
+
+
+/**
+ * True if browser supports ms pointer events (IE 10).
+ * @const
+ * @type {boolean}
+ */
+ol.has.MSPOINTER = !!(goog.global.navigator.msPointerEnabled);
+
+
+/**
+ * True if browser supports WebGL.
+ * @const
+ * @type {boolean}
+ * @api stable
+ */
+ol.has.WEBGL;
+
+
+(function() {
+  if (ol.ENABLE_WEBGL) {
+    var hasWebGL = false;
+    var textureSize;
+    var /** @type {Array.<string>} */ extensions = [];
+
+    if ('WebGLRenderingContext' in goog.global) {
+      try {
+        var canvas = /** @type {HTMLCanvasElement} */
+            (goog.dom.createElement(goog.dom.TagName.CANVAS));
+        var gl = ol.webgl.getContext(canvas, {
+          failIfMajorPerformanceCaveat: true
+        });
+        if (!goog.isNull(gl)) {
+          hasWebGL = true;
+          textureSize = /** @type {number} */
+              (gl.getParameter(gl.MAX_TEXTURE_SIZE));
+          extensions = gl.getSupportedExtensions();
+        }
+      } catch (e) {}
+    }
+    ol.has.WEBGL = hasWebGL;
+    ol.WEBGL_EXTENSIONS = extensions;
+    ol.WEBGL_MAX_TEXTURE_SIZE = textureSize;
+  }
+})();
diff --git a/src/ol/has.jsdoc b/src/ol/has.jsdoc
new file mode 100644
index 0000000..ca1dca6
--- /dev/null
+++ b/src/ol/has.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.has
+ */
diff --git a/src/ol/image.js b/src/ol/image.js
new file mode 100644
index 0000000..e1881c0
--- /dev/null
+++ b/src/ol/image.js
@@ -0,0 +1,152 @@
+goog.provide('ol.Image');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol.ImageBase');
+goog.require('ol.ImageState');
+goog.require('ol.extent');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.ImageBase}
+ * @param {ol.Extent} extent Extent.
+ * @param {number|undefined} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {Array.<ol.Attribution>} attributions Attributions.
+ * @param {string} src Image source URI.
+ * @param {?string} crossOrigin Cross origin.
+ * @param {ol.ImageLoadFunctionType} imageLoadFunction Image load function.
+ */
+ol.Image = function(extent, resolution, pixelRatio, attributions, src,
+    crossOrigin, imageLoadFunction) {
+
+  goog.base(this, extent, resolution, pixelRatio, ol.ImageState.IDLE,
+      attributions);
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.src_ = src;
+
+  /**
+   * @private
+   * @type {Image}
+   */
+  this.image_ = new Image();
+  if (!goog.isNull(crossOrigin)) {
+    this.image_.crossOrigin = crossOrigin;
+  }
+
+  /**
+   * @private
+   * @type {Object.<number, Image>}
+   */
+  this.imageByContext_ = {};
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.imageListenerKeys_ = null;
+
+  /**
+   * @protected
+   * @type {ol.ImageState}
+   */
+  this.state = ol.ImageState.IDLE;
+
+  /**
+   * @private
+   * @type {ol.ImageLoadFunctionType}
+   */
+  this.imageLoadFunction_ = imageLoadFunction;
+
+};
+goog.inherits(ol.Image, ol.ImageBase);
+
+
+/**
+ * @param {Object=} opt_context Object.
+ * @return {HTMLCanvasElement|Image|HTMLVideoElement} Image.
+ * @api
+ */
+ol.Image.prototype.getImage = function(opt_context) {
+  if (goog.isDef(opt_context)) {
+    var image;
+    var key = goog.getUid(opt_context);
+    if (key in this.imageByContext_) {
+      return this.imageByContext_[key];
+    } else if (goog.object.isEmpty(this.imageByContext_)) {
+      image = this.image_;
+    } else {
+      image = /** @type {Image} */ (this.image_.cloneNode(false));
+    }
+    this.imageByContext_[key] = image;
+    return image;
+  } else {
+    return this.image_;
+  }
+};
+
+
+/**
+ * Tracks loading or read errors.
+ *
+ * @private
+ */
+ol.Image.prototype.handleImageError_ = function() {
+  this.state = ol.ImageState.ERROR;
+  this.unlistenImage_();
+  this.changed();
+};
+
+
+/**
+ * Tracks successful image load.
+ *
+ * @private
+ */
+ol.Image.prototype.handleImageLoad_ = function() {
+  if (!goog.isDef(this.resolution)) {
+    this.resolution = ol.extent.getHeight(this.extent) / this.image_.height;
+  }
+  this.state = ol.ImageState.LOADED;
+  this.unlistenImage_();
+  this.changed();
+};
+
+
+/**
+ * Load not yet loaded URI.
+ */
+ol.Image.prototype.load = function() {
+  if (this.state == ol.ImageState.IDLE) {
+    this.state = ol.ImageState.LOADING;
+    goog.asserts.assert(goog.isNull(this.imageListenerKeys_));
+    this.imageListenerKeys_ = [
+      goog.events.listenOnce(this.image_, goog.events.EventType.ERROR,
+          this.handleImageError_, false, this),
+      goog.events.listenOnce(this.image_, goog.events.EventType.LOAD,
+          this.handleImageLoad_, false, this)
+    ];
+    this.imageLoadFunction_(this, this.src_);
+  }
+};
+
+
+/**
+ * Discards event handlers which listen for load completion or errors.
+ *
+ * @private
+ */
+ol.Image.prototype.unlistenImage_ = function() {
+  goog.asserts.assert(!goog.isNull(this.imageListenerKeys_));
+  goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey);
+  this.imageListenerKeys_ = null;
+};
diff --git a/src/ol/imagebase.js b/src/ol/imagebase.js
new file mode 100644
index 0000000..5e0a464
--- /dev/null
+++ b/src/ol/imagebase.js
@@ -0,0 +1,129 @@
+goog.provide('ol.ImageBase');
+goog.provide('ol.ImageState');
+
+goog.require('goog.asserts');
+goog.require('goog.events.EventTarget');
+goog.require('goog.events.EventType');
+goog.require('ol.Attribution');
+goog.require('ol.Extent');
+
+
+/**
+ * @enum {number}
+ */
+ol.ImageState = {
+  IDLE: 0,
+  LOADING: 1,
+  LOADED: 2,
+  ERROR: 3
+};
+
+
+
+/**
+ * @constructor
+ * @extends {goog.events.EventTarget}
+ * @param {ol.Extent} extent Extent.
+ * @param {number|undefined} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.ImageState} state State.
+ * @param {Array.<ol.Attribution>} attributions Attributions.
+ */
+ol.ImageBase = function(extent, resolution, pixelRatio, state, attributions) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {Array.<ol.Attribution>}
+   */
+  this.attributions_ = attributions;
+
+  /**
+   * @protected
+   * @type {ol.Extent}
+   */
+  this.extent = extent;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.pixelRatio_ = pixelRatio;
+
+  /**
+   * @protected
+   * @type {number|undefined}
+   */
+  this.resolution = resolution;
+
+  /**
+   * @protected
+   * @type {ol.ImageState}
+   */
+  this.state = state;
+
+};
+goog.inherits(ol.ImageBase, goog.events.EventTarget);
+
+
+/**
+ * @protected
+ */
+ol.ImageBase.prototype.changed = function() {
+  this.dispatchEvent(goog.events.EventType.CHANGE);
+};
+
+
+/**
+ * @return {Array.<ol.Attribution>} Attributions.
+ */
+ol.ImageBase.prototype.getAttributions = function() {
+  return this.attributions_;
+};
+
+
+/**
+ * @return {ol.Extent} Extent.
+ */
+ol.ImageBase.prototype.getExtent = function() {
+  return this.extent;
+};
+
+
+/**
+ * @param {Object=} opt_context Object.
+ * @return {HTMLCanvasElement|Image|HTMLVideoElement} Image.
+ */
+ol.ImageBase.prototype.getImage = goog.abstractMethod;
+
+
+/**
+ * @return {number} PixelRatio.
+ */
+ol.ImageBase.prototype.getPixelRatio = function() {
+  return this.pixelRatio_;
+};
+
+
+/**
+ * @return {number} Resolution.
+ */
+ol.ImageBase.prototype.getResolution = function() {
+  goog.asserts.assert(goog.isDef(this.resolution), 'resolution not yet set');
+  return this.resolution;
+};
+
+
+/**
+ * @return {ol.ImageState} State.
+ */
+ol.ImageBase.prototype.getState = function() {
+  return this.state;
+};
+
+
+/**
+ * Load not yet loaded URI.
+ */
+ol.ImageBase.prototype.load = goog.abstractMethod;
diff --git a/src/ol/imagecanvas.js b/src/ol/imagecanvas.js
new file mode 100644
index 0000000..6cc9b72
--- /dev/null
+++ b/src/ol/imagecanvas.js
@@ -0,0 +1,38 @@
+goog.provide('ol.ImageCanvas');
+
+goog.require('ol.ImageBase');
+goog.require('ol.ImageState');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.ImageBase}
+ * @param {ol.Extent} extent Extent.
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {Array.<ol.Attribution>} attributions Attributions.
+ * @param {HTMLCanvasElement} canvas Canvas.
+ */
+ol.ImageCanvas = function(extent, resolution, pixelRatio, attributions,
+    canvas) {
+
+  goog.base(this, extent, resolution, pixelRatio, ol.ImageState.LOADED,
+      attributions);
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.canvas_ = canvas;
+
+};
+goog.inherits(ol.ImageCanvas, ol.ImageBase);
+
+
+/**
+ * @inheritDoc
+ */
+ol.ImageCanvas.prototype.getImage = function(opt_context) {
+  return this.canvas_;
+};
diff --git a/src/ol/imageloadfunction.js b/src/ol/imageloadfunction.js
new file mode 100644
index 0000000..0d4b74c
--- /dev/null
+++ b/src/ol/imageloadfunction.js
@@ -0,0 +1,21 @@
+goog.provide('ol.ImageLoadFunctionType');
+
+
+/**
+ * A function that takes an {@link ol.Image} for the image and a `{string}` for
+ * the src as arguments. It is supposed to make it so the underlying image
+ * {@link ol.Image#getImage} is assigned the content specified by the src. If
+ * not specified, the default is
+ *
+ *     function(image, src) {
+ *       image.getImage().src = src;
+ *     }
+ *
+ * Providing a custom `imageLoadFunction` can be useful to load images with
+ * post requests or - in general - through XHR requests, where the src of the
+ * image element would be set to a data URI when the content is loaded.
+ *
+ * @typedef {function(ol.Image, string)}
+ * @api
+ */
+ol.ImageLoadFunctionType;
diff --git a/src/ol/imagetile.js b/src/ol/imagetile.js
new file mode 100644
index 0000000..b0fc00d
--- /dev/null
+++ b/src/ol/imagetile.js
@@ -0,0 +1,160 @@
+goog.provide('ol.ImageTile');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol.Tile');
+goog.require('ol.TileCoord');
+goog.require('ol.TileLoadFunctionType');
+goog.require('ol.TileState');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.Tile}
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {ol.TileState} state State.
+ * @param {string} src Image source URI.
+ * @param {?string} crossOrigin Cross origin.
+ * @param {ol.TileLoadFunctionType} tileLoadFunction Tile load function.
+ */
+ol.ImageTile = function(tileCoord, state, src, crossOrigin, tileLoadFunction) {
+
+  goog.base(this, tileCoord, state);
+
+  /**
+   * Image URI
+   *
+   * @private
+   * @type {string}
+   */
+  this.src_ = src;
+
+  /**
+   * @private
+   * @type {Image}
+   */
+  this.image_ = new Image();
+  if (!goog.isNull(crossOrigin)) {
+    this.image_.crossOrigin = crossOrigin;
+  }
+
+  /**
+   * @private
+   * @type {Object.<number, Image>}
+   */
+  this.imageByContext_ = {};
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.imageListenerKeys_ = null;
+
+  /**
+   * @private
+   * @type {ol.TileLoadFunctionType}
+   */
+  this.tileLoadFunction_ = tileLoadFunction;
+
+};
+goog.inherits(ol.ImageTile, ol.Tile);
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.ImageTile.prototype.getImage = function(opt_context) {
+  if (goog.isDef(opt_context)) {
+    var image;
+    var key = goog.getUid(opt_context);
+    if (key in this.imageByContext_) {
+      return this.imageByContext_[key];
+    } else if (goog.object.isEmpty(this.imageByContext_)) {
+      image = this.image_;
+    } else {
+      image = /** @type {Image} */ (this.image_.cloneNode(false));
+    }
+    this.imageByContext_[key] = image;
+    return image;
+  } else {
+    return this.image_;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.ImageTile.prototype.getKey = function() {
+  return this.src_;
+};
+
+
+/**
+ * Tracks loading or read errors.
+ *
+ * @private
+ */
+ol.ImageTile.prototype.handleImageError_ = function() {
+  this.state = ol.TileState.ERROR;
+  this.unlistenImage_();
+  this.changed();
+};
+
+
+/**
+ * Tracks successful image load.
+ *
+ * @private
+ */
+ol.ImageTile.prototype.handleImageLoad_ = function() {
+  if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+    if (!goog.isDef(this.image_.naturalWidth)) {
+      this.image_.naturalWidth = this.image_.width;
+      this.image_.naturalHeight = this.image_.height;
+    }
+  }
+
+  if (this.image_.naturalWidth && this.image_.naturalHeight) {
+    this.state = ol.TileState.LOADED;
+  } else {
+    this.state = ol.TileState.EMPTY;
+  }
+  this.unlistenImage_();
+  this.changed();
+};
+
+
+/**
+ * Load not yet loaded URI.
+ */
+ol.ImageTile.prototype.load = function() {
+  if (this.state == ol.TileState.IDLE) {
+    this.state = ol.TileState.LOADING;
+    goog.asserts.assert(goog.isNull(this.imageListenerKeys_));
+    this.imageListenerKeys_ = [
+      goog.events.listenOnce(this.image_, goog.events.EventType.ERROR,
+          this.handleImageError_, false, this),
+      goog.events.listenOnce(this.image_, goog.events.EventType.LOAD,
+          this.handleImageLoad_, false, this)
+    ];
+    this.tileLoadFunction_(this, this.src_);
+  }
+};
+
+
+/**
+ * Discards event handlers which listen for load completion or errors.
+ *
+ * @private
+ */
+ol.ImageTile.prototype.unlistenImage_ = function() {
+  goog.asserts.assert(!goog.isNull(this.imageListenerKeys_));
+  goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey);
+  this.imageListenerKeys_ = null;
+};
diff --git a/src/ol/imageurlfunction.js b/src/ol/imageurlfunction.js
new file mode 100644
index 0000000..fe52c71
--- /dev/null
+++ b/src/ol/imageurlfunction.js
@@ -0,0 +1,46 @@
+goog.provide('ol.ImageUrlFunction');
+goog.provide('ol.ImageUrlFunctionType');
+
+goog.require('ol.Size');
+
+
+/**
+ * @typedef {function(this:ol.source.Image, ol.Extent, ol.Size,
+ *     ol.proj.Projection): (string|undefined)}
+ */
+ol.ImageUrlFunctionType;
+
+
+/**
+ * @param {string} baseUrl Base URL (may have query data).
+ * @param {Object.<string,*>} params to encode in the URL.
+ * @param {function(string, Object.<string,*>, ol.Extent, ol.Size,
+ *     ol.proj.Projection): (string|undefined)} paramsFunction params function.
+ * @return {ol.ImageUrlFunctionType} Image URL function.
+ */
+ol.ImageUrlFunction.createFromParamsFunction =
+    function(baseUrl, params, paramsFunction) {
+  return (
+      /**
+       * @this {ol.source.Image}
+       * @param {ol.Extent} extent Extent.
+       * @param {ol.Size} size Size.
+       * @param {ol.proj.Projection} projection Projection.
+       * @return {string|undefined} URL.
+       */
+      function(extent, size, projection) {
+        return paramsFunction(baseUrl, params, extent, size, projection);
+      });
+};
+
+
+/**
+ * @this {ol.source.Image}
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Size} size Size.
+ * @return {string|undefined} Image URL.
+ */
+ol.ImageUrlFunction.nullImageUrlFunction =
+    function(extent, size) {
+  return undefined;
+};
diff --git a/src/ol/interaction/doubleclickzoominteraction.js b/src/ol/interaction/doubleclickzoominteraction.js
new file mode 100644
index 0000000..a01d7ba
--- /dev/null
+++ b/src/ol/interaction/doubleclickzoominteraction.js
@@ -0,0 +1,64 @@
+goog.provide('ol.interaction.DoubleClickZoom');
+
+goog.require('goog.asserts');
+goog.require('ol.MapBrowserEvent');
+goog.require('ol.MapBrowserEvent.EventType');
+goog.require('ol.interaction.Interaction');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to zoom by double-clicking on the map.
+ *
+ * @constructor
+ * @extends {ol.interaction.Interaction}
+ * @param {olx.interaction.DoubleClickZoomOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.DoubleClickZoom = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.delta_ = goog.isDef(options.delta) ? options.delta : 1;
+
+  goog.base(this, {
+    handleEvent: ol.interaction.DoubleClickZoom.handleEvent
+  });
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.duration_ = goog.isDef(options.duration) ? options.duration : 250;
+
+};
+goog.inherits(ol.interaction.DoubleClickZoom, ol.interaction.Interaction);
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.DoubleClickZoom}
+ * @api
+ */
+ol.interaction.DoubleClickZoom.handleEvent = function(mapBrowserEvent) {
+  var stopEvent = false;
+  var browserEvent = mapBrowserEvent.browserEvent;
+  if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.DBLCLICK) {
+    var map = mapBrowserEvent.map;
+    var anchor = mapBrowserEvent.coordinate;
+    var delta = browserEvent.shiftKey ? -this.delta_ : this.delta_;
+    var view = map.getView();
+    goog.asserts.assert(!goog.isNull(view));
+    ol.interaction.Interaction.zoomByDelta(
+        map, view, delta, anchor, this.duration_);
+    mapBrowserEvent.preventDefault();
+    stopEvent = true;
+  }
+  return !stopEvent;
+};
diff --git a/src/ol/interaction/draganddropinteraction.js b/src/ol/interaction/draganddropinteraction.js
new file mode 100644
index 0000000..3769fa0
--- /dev/null
+++ b/src/ol/interaction/draganddropinteraction.js
@@ -0,0 +1,236 @@
+// FIXME should handle all geo-referenced data, not just vector data
+
+goog.provide('ol.interaction.DragAndDrop');
+goog.provide('ol.interaction.DragAndDropEvent');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.Event');
+goog.require('goog.events.FileDropHandler');
+goog.require('goog.events.FileDropHandler.EventType');
+goog.require('goog.fs.FileReader');
+goog.require('goog.functions');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.proj');
+
+
+
+/**
+ * @classdesc
+ * Handles input of vector data by drag and drop.
+ *
+ * @constructor
+ * @extends {ol.interaction.Interaction}
+ * @fires ol.interaction.DragAndDropEvent
+ * @param {olx.interaction.DragAndDropOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.DragAndDrop = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    handleEvent: ol.interaction.DragAndDrop.handleEvent
+  });
+
+  /**
+   * @private
+   * @type {Array.<function(new: ol.format.Feature)>}
+   */
+  this.formatConstructors_ = goog.isDef(options.formatConstructors) ?
+      options.formatConstructors : [];
+
+  /**
+   * @private
+   * @type {ol.proj.Projection}
+   */
+  this.projection_ = goog.isDef(options.projection) ?
+      ol.proj.get(options.projection) : null;
+
+  /**
+   * @private
+   * @type {goog.events.FileDropHandler}
+   */
+  this.fileDropHandler_ = null;
+
+  /**
+   * @private
+   * @type {goog.events.Key|undefined}
+   */
+  this.dropListenKey_ = undefined;
+
+};
+goog.inherits(ol.interaction.DragAndDrop, ol.interaction.Interaction);
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.DragAndDrop.prototype.disposeInternal = function() {
+  if (goog.isDef(this.dropListenKey_)) {
+    goog.events.unlistenByKey(this.dropListenKey_);
+  }
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * @param {goog.events.BrowserEvent} event Event.
+ * @private
+ */
+ol.interaction.DragAndDrop.prototype.handleDrop_ = function(event) {
+  var files = event.getBrowserEvent().dataTransfer.files;
+  var i, ii, file;
+  for (i = 0, ii = files.length; i < ii; ++i) {
+    file = files[i];
+    // The empty string param is a workaround for
+    // https://code.google.com/p/closure-library/issues/detail?id=524
+    var reader = goog.fs.FileReader.readAsText(file, '');
+    reader.addCallback(goog.partial(this.handleResult_, file), this);
+  }
+};
+
+
+/**
+ * @param {File} file File.
+ * @param {string} result Result.
+ * @private
+ */
+ol.interaction.DragAndDrop.prototype.handleResult_ = function(file, result) {
+  var map = this.getMap();
+  goog.asserts.assert(!goog.isNull(map));
+  var projection = this.projection_;
+  if (goog.isNull(projection)) {
+    var view = map.getView();
+    goog.asserts.assert(!goog.isNull(view));
+    projection = view.getProjection();
+    goog.asserts.assert(goog.isDef(projection));
+  }
+  var formatConstructors = this.formatConstructors_;
+  var features = [];
+  var i, ii;
+  for (i = 0, ii = formatConstructors.length; i < ii; ++i) {
+    var formatConstructor = formatConstructors[i];
+    var format = new formatConstructor();
+    var readFeatures = this.tryReadFeatures_(format, result);
+    if (!goog.isNull(readFeatures)) {
+      var featureProjection = format.readProjection(result);
+      var transform = ol.proj.getTransform(featureProjection, projection);
+      var j, jj;
+      for (j = 0, jj = readFeatures.length; j < jj; ++j) {
+        var feature = readFeatures[j];
+        var geometry = feature.getGeometry();
+        if (goog.isDefAndNotNull(geometry)) {
+          geometry.applyTransform(transform);
+        }
+        features.push(feature);
+      }
+    }
+  }
+  this.dispatchEvent(
+      new ol.interaction.DragAndDropEvent(
+          ol.interaction.DragAndDropEventType.ADD_FEATURES, this, file,
+          features, projection));
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.DragAndDrop}
+ * @api
+ */
+ol.interaction.DragAndDrop.handleEvent = goog.functions.TRUE;
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.DragAndDrop.prototype.setMap = function(map) {
+  if (goog.isDef(this.dropListenKey_)) {
+    goog.events.unlistenByKey(this.dropListenKey_);
+    this.dropListenKey_ = undefined;
+  }
+  if (!goog.isNull(this.fileDropHandler_)) {
+    goog.dispose(this.fileDropHandler_);
+    this.fileDropHandler_ = null;
+  }
+  goog.asserts.assert(!goog.isDef(this.dropListenKey_));
+  goog.base(this, 'setMap', map);
+  if (!goog.isNull(map)) {
+    this.fileDropHandler_ = new goog.events.FileDropHandler(map.getViewport());
+    this.dropListenKey_ = goog.events.listen(
+        this.fileDropHandler_, goog.events.FileDropHandler.EventType.DROP,
+        this.handleDrop_, false, this);
+  }
+};
+
+
+/**
+ * @param {ol.format.Feature} format Format.
+ * @param {string} text Text.
+ * @private
+ * @return {Array.<ol.Feature>} Features.
+ */
+ol.interaction.DragAndDrop.prototype.tryReadFeatures_ = function(format, text) {
+  try {
+    return format.readFeatures(text);
+  } catch (e) {
+    return null;
+  }
+};
+
+
+/**
+ * @enum {string}
+ */
+ol.interaction.DragAndDropEventType = {
+  /**
+   * Triggered when features are added
+   * @event ol.interaction.DragAndDropEvent#addfeatures
+   * @api stable
+   */
+  ADD_FEATURES: 'addfeatures'
+};
+
+
+
+/**
+ * @classdesc
+ * Events emitted by {@link ol.interaction.DragAndDrop} instances are instances
+ * of this type.
+ *
+ * @constructor
+ * @extends {goog.events.Event}
+ * @implements {oli.interaction.DragAndDropEvent}
+ * @param {ol.interaction.DragAndDropEventType} type Type.
+ * @param {Object} target Target.
+ * @param {File} file File.
+ * @param {Array.<ol.Feature>=} opt_features Features.
+ * @param {ol.proj.Projection=} opt_projection Projection.
+ */
+ol.interaction.DragAndDropEvent =
+    function(type, target, file, opt_features, opt_projection) {
+
+  goog.base(this, type, target);
+
+  /**
+   * @type {Array.<ol.Feature>|undefined}
+   * @api stable
+   */
+  this.features = opt_features;
+
+  /**
+   * @type {File}
+   * @api stable
+   */
+  this.file = file;
+
+  /**
+   * @type {ol.proj.Projection|undefined}
+   * @api
+   */
+  this.projection = opt_projection;
+
+};
+goog.inherits(ol.interaction.DragAndDropEvent, goog.events.Event);
diff --git a/src/ol/interaction/dragboxinteraction.js b/src/ol/interaction/dragboxinteraction.js
new file mode 100644
index 0000000..9438dca
--- /dev/null
+++ b/src/ol/interaction/dragboxinteraction.js
@@ -0,0 +1,206 @@
+// FIXME draw drag box
+goog.provide('ol.DragBoxEvent');
+goog.provide('ol.interaction.DragBox');
+
+goog.require('goog.events.Event');
+goog.require('ol');
+goog.require('ol.events.ConditionType');
+goog.require('ol.events.condition');
+goog.require('ol.interaction.Pointer');
+goog.require('ol.render.Box');
+
+
+/**
+ * @const
+ * @type {number}
+ */
+ol.DRAG_BOX_HYSTERESIS_PIXELS_SQUARED =
+    ol.DRAG_BOX_HYSTERESIS_PIXELS *
+    ol.DRAG_BOX_HYSTERESIS_PIXELS;
+
+
+/**
+ * @enum {string}
+ */
+ol.DragBoxEventType = {
+  /**
+   * Triggered upon drag box start.
+   * @event ol.DragBoxEvent#boxstart
+   * @api stable
+   */
+  BOXSTART: 'boxstart',
+  /**
+   * Triggered upon drag box end.
+   * @event ol.DragBoxEvent#boxend
+   * @api stable
+   */
+  BOXEND: 'boxend'
+};
+
+
+
+/**
+ * @classdesc
+ * Events emitted by {@link ol.interaction.DragBox} instances are instances of
+ * this type.
+ *
+ * @param {string} type The event type.
+ * @param {ol.Coordinate} coordinate The event coordinate.
+ * @extends {goog.events.Event}
+ * @constructor
+ * @implements {oli.DragBoxEvent}
+ */
+ol.DragBoxEvent = function(type, coordinate) {
+  goog.base(this, type);
+
+  /**
+   * The coordinate of the drag event.
+   * @const
+   * @type {ol.Coordinate}
+   * @api stable
+   */
+  this.coordinate = coordinate;
+
+};
+goog.inherits(ol.DragBoxEvent, goog.events.Event);
+
+
+
+/**
+ * @classdesc
+ * Allows the user to draw a vector box by clicking and dragging on the map,
+ * normally combined with an {@link ol.events.condition} that limits
+ * it to when the shift or other key is held down. This is used, for example,
+ * for zooming to a specific area of the map
+ * (see {@link ol.interaction.DragZoom} and
+ * {@link ol.interaction.DragRotateAndZoom}).
+ *
+ * This interaction is only supported for mouse devices.
+ *
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ * @fires ol.DragBoxEvent
+ * @param {olx.interaction.DragBoxOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.DragBox = function(opt_options) {
+
+  goog.base(this, {
+    handleDownEvent: ol.interaction.DragBox.handleDownEvent_,
+    handleDragEvent: ol.interaction.DragBox.handleDragEvent_,
+    handleUpEvent: ol.interaction.DragBox.handleUpEvent_
+  });
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.style.Style}
+   */
+  var style = goog.isDef(options.style) ? options.style : null;
+
+  /**
+   * @type {ol.render.Box}
+   * @private
+   */
+  this.box_ = new ol.render.Box(style);
+
+  /**
+   * @type {ol.Pixel}
+   * @private
+   */
+  this.startPixel_ = null;
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.condition_ = goog.isDef(options.condition) ?
+      options.condition : ol.events.condition.always;
+
+};
+goog.inherits(ol.interaction.DragBox, ol.interaction.Pointer);
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @this {ol.interaction.DragBox}
+ * @private
+ */
+ol.interaction.DragBox.handleDragEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return;
+  }
+
+  this.box_.setPixels(this.startPixel_, mapBrowserEvent.pixel);
+};
+
+
+/**
+ * Returns geometry of last drawn box.
+ * @return {ol.geom.Polygon} Geometry.
+ * @api stable
+ */
+ol.interaction.DragBox.prototype.getGeometry = function() {
+  return this.box_.getGeometry();
+};
+
+
+/**
+ * To be overriden by child classes.
+ * FIXME: use constructor option instead of relying on overridding.
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @protected
+ */
+ol.interaction.DragBox.prototype.onBoxEnd = goog.nullFunction;
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Stop drag sequence?
+ * @this {ol.interaction.DragBox}
+ * @private
+ */
+ol.interaction.DragBox.handleUpEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return true;
+  }
+
+  this.box_.setMap(null);
+
+  var deltaX = mapBrowserEvent.pixel[0] - this.startPixel_[0];
+  var deltaY = mapBrowserEvent.pixel[1] - this.startPixel_[1];
+
+  if (deltaX * deltaX + deltaY * deltaY >=
+      ol.DRAG_BOX_HYSTERESIS_PIXELS_SQUARED) {
+    this.onBoxEnd(mapBrowserEvent);
+    this.dispatchEvent(new ol.DragBoxEvent(ol.DragBoxEventType.BOXEND,
+        mapBrowserEvent.coordinate));
+  }
+  return false;
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Start drag sequence?
+ * @this {ol.interaction.DragBox}
+ * @private
+ */
+ol.interaction.DragBox.handleDownEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return false;
+  }
+
+  var browserEvent = mapBrowserEvent.browserEvent;
+  if (browserEvent.isMouseActionButton() && this.condition_(mapBrowserEvent)) {
+    this.startPixel_ = mapBrowserEvent.pixel;
+    this.box_.setMap(mapBrowserEvent.map);
+    this.box_.setPixels(this.startPixel_, this.startPixel_);
+    this.dispatchEvent(new ol.DragBoxEvent(ol.DragBoxEventType.BOXSTART,
+        mapBrowserEvent.coordinate));
+    return true;
+  } else {
+    return false;
+  }
+};
diff --git a/src/ol/interaction/dragpaninteraction.js b/src/ol/interaction/dragpaninteraction.js
new file mode 100644
index 0000000..22b207e
--- /dev/null
+++ b/src/ol/interaction/dragpaninteraction.js
@@ -0,0 +1,168 @@
+goog.provide('ol.interaction.DragPan');
+
+goog.require('goog.asserts');
+goog.require('ol.Kinetic');
+goog.require('ol.Pixel');
+goog.require('ol.PreRenderFunction');
+goog.require('ol.ViewHint');
+goog.require('ol.coordinate');
+goog.require('ol.events.condition');
+goog.require('ol.interaction.Pointer');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to pan the map by dragging the map.
+ *
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ * @param {olx.interaction.DragPanOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.DragPan = function(opt_options) {
+
+  goog.base(this, {
+    handleDownEvent: ol.interaction.DragPan.handleDownEvent_,
+    handleDragEvent: ol.interaction.DragPan.handleDragEvent_,
+    handleUpEvent: ol.interaction.DragPan.handleUpEvent_
+  });
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.Kinetic|undefined}
+   */
+  this.kinetic_ = options.kinetic;
+
+  /**
+   * @private
+   * @type {?ol.PreRenderFunction}
+   */
+  this.kineticPreRenderFn_ = null;
+
+  /**
+   * @type {ol.Pixel}
+   */
+  this.lastCentroid = null;
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.condition_ = goog.isDef(options.condition) ?
+      options.condition : ol.events.condition.noModifierKeys;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.noKinetic_ = false;
+
+};
+goog.inherits(ol.interaction.DragPan, ol.interaction.Pointer);
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @this {ol.interaction.DragPan}
+ * @private
+ */
+ol.interaction.DragPan.handleDragEvent_ = function(mapBrowserEvent) {
+  goog.asserts.assert(this.targetPointers.length >= 1);
+  var centroid =
+      ol.interaction.Pointer.centroid(this.targetPointers);
+  if (this.kinetic_) {
+    this.kinetic_.update(centroid[0], centroid[1]);
+  }
+  if (!goog.isNull(this.lastCentroid)) {
+    var deltaX = this.lastCentroid[0] - centroid[0];
+    var deltaY = centroid[1] - this.lastCentroid[1];
+    var map = mapBrowserEvent.map;
+    var view = map.getView();
+    var viewState = view.getState();
+    var center = [deltaX, deltaY];
+    ol.coordinate.scale(center, viewState.resolution);
+    ol.coordinate.rotate(center, viewState.rotation);
+    ol.coordinate.add(center, viewState.center);
+    center = view.constrainCenter(center);
+    map.render();
+    view.setCenter(center);
+  }
+  this.lastCentroid = centroid;
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Stop drag sequence?
+ * @this {ol.interaction.DragPan}
+ * @private
+ */
+ol.interaction.DragPan.handleUpEvent_ = function(mapBrowserEvent) {
+  var map = mapBrowserEvent.map;
+  var view = map.getView();
+  if (this.targetPointers.length === 0) {
+    if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) {
+      var distance = this.kinetic_.getDistance();
+      var angle = this.kinetic_.getAngle();
+      var center = view.getCenter();
+      goog.asserts.assert(goog.isDef(center));
+      this.kineticPreRenderFn_ = this.kinetic_.pan(center);
+      map.beforeRender(this.kineticPreRenderFn_);
+      var centerpx = map.getPixelFromCoordinate(center);
+      var dest = map.getCoordinateFromPixel([
+        centerpx[0] - distance * Math.cos(angle),
+        centerpx[1] - distance * Math.sin(angle)
+      ]);
+      dest = view.constrainCenter(dest);
+      view.setCenter(dest);
+    }
+    view.setHint(ol.ViewHint.INTERACTING, -1);
+    map.render();
+    return false;
+  } else {
+    this.lastCentroid = null;
+    return true;
+  }
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Start drag sequence?
+ * @this {ol.interaction.DragPan}
+ * @private
+ */
+ol.interaction.DragPan.handleDownEvent_ = function(mapBrowserEvent) {
+  if (this.targetPointers.length > 0 && this.condition_(mapBrowserEvent)) {
+    var map = mapBrowserEvent.map;
+    var view = map.getView();
+    this.lastCentroid = null;
+    if (!this.handlingDownUpSequence) {
+      view.setHint(ol.ViewHint.INTERACTING, 1);
+    }
+    map.render();
+    if (!goog.isNull(this.kineticPreRenderFn_) &&
+        map.removePreRenderFunction(this.kineticPreRenderFn_)) {
+      view.setCenter(mapBrowserEvent.frameState.viewState.center);
+      this.kineticPreRenderFn_ = null;
+    }
+    if (this.kinetic_) {
+      this.kinetic_.begin();
+    }
+    // No kinetic as soon as more than one pointer on the screen is
+    // detected. This is to prevent nasty pans after pinch.
+    this.noKinetic_ = this.targetPointers.length > 1;
+    return true;
+  } else {
+    return false;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.DragPan.prototype.shouldStopEvent = goog.functions.FALSE;
diff --git a/src/ol/interaction/dragrotateandzoominteraction.js b/src/ol/interaction/dragrotateandzoominteraction.js
new file mode 100644
index 0000000..a39d5e0
--- /dev/null
+++ b/src/ol/interaction/dragrotateandzoominteraction.js
@@ -0,0 +1,151 @@
+goog.provide('ol.interaction.DragRotateAndZoom');
+
+goog.require('goog.asserts');
+goog.require('goog.math.Vec2');
+goog.require('ol');
+goog.require('ol.ViewHint');
+goog.require('ol.events.ConditionType');
+goog.require('ol.events.condition');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.interaction.Pointer');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to zoom and rotate the map by clicking and dragging
+ * on the map.  By default, this interaction is limited to when the shift
+ * key is held down.
+ *
+ * This interaction is only supported for mouse devices.
+ *
+ * And this interaction is not included in the default interactions.
+ *
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ * @param {olx.interaction.DragRotateAndZoomOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.DragRotateAndZoom = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    handleDownEvent: ol.interaction.DragRotateAndZoom.handleDownEvent_,
+    handleDragEvent: ol.interaction.DragRotateAndZoom.handleDragEvent_,
+    handleUpEvent: ol.interaction.DragRotateAndZoom.handleUpEvent_
+  });
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.condition_ = goog.isDef(options.condition) ?
+      options.condition : ol.events.condition.shiftKeyOnly;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.lastAngle_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.lastMagnitude_ = undefined;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.lastScaleDelta_ = 0;
+
+};
+goog.inherits(ol.interaction.DragRotateAndZoom,
+    ol.interaction.Pointer);
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @this {ol.interaction.DragRotateAndZoom}
+ * @private
+ */
+ol.interaction.DragRotateAndZoom.handleDragEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return;
+  }
+
+  var map = mapBrowserEvent.map;
+  var size = map.getSize();
+  var offset = mapBrowserEvent.pixel;
+  var delta = new goog.math.Vec2(
+      offset[0] - size[0] / 2,
+      size[1] / 2 - offset[1]);
+  var theta = Math.atan2(delta.y, delta.x);
+  var magnitude = delta.magnitude();
+  var view = map.getView();
+  var viewState = view.getState();
+  map.render();
+  if (goog.isDef(this.lastAngle_)) {
+    var angleDelta = theta - this.lastAngle_;
+    ol.interaction.Interaction.rotateWithoutConstraints(
+        map, view, viewState.rotation - angleDelta);
+  }
+  this.lastAngle_ = theta;
+  if (goog.isDef(this.lastMagnitude_)) {
+    var resolution = this.lastMagnitude_ * (viewState.resolution / magnitude);
+    ol.interaction.Interaction.zoomWithoutConstraints(map, view, resolution);
+  }
+  if (goog.isDef(this.lastMagnitude_)) {
+    this.lastScaleDelta_ = this.lastMagnitude_ / magnitude;
+  }
+  this.lastMagnitude_ = magnitude;
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Stop drag sequence?
+ * @this {ol.interaction.DragRotateAndZoom}
+ * @private
+ */
+ol.interaction.DragRotateAndZoom.handleUpEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return true;
+  }
+
+  var map = mapBrowserEvent.map;
+  var view = map.getView();
+  view.setHint(ol.ViewHint.INTERACTING, -1);
+  var viewState = view.getState();
+  var direction = this.lastScaleDelta_ - 1;
+  ol.interaction.Interaction.rotate(map, view, viewState.rotation);
+  ol.interaction.Interaction.zoom(map, view, viewState.resolution,
+      undefined, ol.DRAGROTATEANDZOOM_ANIMATION_DURATION,
+      direction);
+  this.lastScaleDelta_ = 0;
+  return false;
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Start drag sequence?
+ * @this {ol.interaction.DragRotateAndZoom}
+ * @private
+ */
+ol.interaction.DragRotateAndZoom.handleDownEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return false;
+  }
+
+  if (this.condition_(mapBrowserEvent)) {
+    mapBrowserEvent.map.getView().setHint(ol.ViewHint.INTERACTING, 1);
+    this.lastAngle_ = undefined;
+    this.lastMagnitude_ = undefined;
+    return true;
+  } else {
+    return false;
+  }
+};
diff --git a/src/ol/interaction/dragrotateinteraction.js b/src/ol/interaction/dragrotateinteraction.js
new file mode 100644
index 0000000..d7e3a73
--- /dev/null
+++ b/src/ol/interaction/dragrotateinteraction.js
@@ -0,0 +1,128 @@
+goog.provide('ol.interaction.DragRotate');
+
+goog.require('goog.asserts');
+goog.require('ol');
+goog.require('ol.ViewHint');
+goog.require('ol.events.ConditionType');
+goog.require('ol.events.condition');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.interaction.Pointer');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to rotate the map by clicking and dragging on the map,
+ * normally combined with an {@link ol.events.condition} that limits
+ * it to when the alt and shift keys are held down.
+ *
+ * This interaction is only supported for mouse devices.
+ *
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ * @param {olx.interaction.DragRotateOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.DragRotate = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    handleDownEvent: ol.interaction.DragRotate.handleDownEvent_,
+    handleDragEvent: ol.interaction.DragRotate.handleDragEvent_,
+    handleUpEvent: ol.interaction.DragRotate.handleUpEvent_
+  });
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.condition_ = goog.isDef(options.condition) ?
+      options.condition : ol.events.condition.altShiftKeysOnly;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.lastAngle_ = undefined;
+
+};
+goog.inherits(ol.interaction.DragRotate, ol.interaction.Pointer);
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @this {ol.interaction.DragRotate}
+ * @private
+ */
+ol.interaction.DragRotate.handleDragEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return;
+  }
+
+  var map = mapBrowserEvent.map;
+  var size = map.getSize();
+  var offset = mapBrowserEvent.pixel;
+  var theta =
+      Math.atan2(size[1] / 2 - offset[1], offset[0] - size[0] / 2);
+  if (goog.isDef(this.lastAngle_)) {
+    var delta = theta - this.lastAngle_;
+    var view = map.getView();
+    var viewState = view.getState();
+    map.render();
+    ol.interaction.Interaction.rotateWithoutConstraints(
+        map, view, viewState.rotation - delta);
+  }
+  this.lastAngle_ = theta;
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Stop drag sequence?
+ * @this {ol.interaction.DragRotate}
+ * @private
+ */
+ol.interaction.DragRotate.handleUpEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return true;
+  }
+
+  var map = mapBrowserEvent.map;
+  var view = map.getView();
+  view.setHint(ol.ViewHint.INTERACTING, -1);
+  var viewState = view.getState();
+  ol.interaction.Interaction.rotate(map, view, viewState.rotation,
+      undefined, ol.DRAGROTATE_ANIMATION_DURATION);
+  return false;
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Start drag sequence?
+ * @this {ol.interaction.DragRotate}
+ * @private
+ */
+ol.interaction.DragRotate.handleDownEvent_ = function(mapBrowserEvent) {
+  if (!ol.events.condition.mouseOnly(mapBrowserEvent)) {
+    return false;
+  }
+
+  var browserEvent = mapBrowserEvent.browserEvent;
+  if (browserEvent.isMouseActionButton() && this.condition_(mapBrowserEvent)) {
+    var map = mapBrowserEvent.map;
+    map.getView().setHint(ol.ViewHint.INTERACTING, 1);
+    map.render();
+    this.lastAngle_ = undefined;
+    return true;
+  } else {
+    return false;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.DragRotate.prototype.shouldStopEvent = goog.functions.FALSE;
diff --git a/src/ol/interaction/dragzoominteraction.js b/src/ol/interaction/dragzoominteraction.js
new file mode 100644
index 0000000..db190f2
--- /dev/null
+++ b/src/ol/interaction/dragzoominteraction.js
@@ -0,0 +1,65 @@
+goog.provide('ol.interaction.DragZoom');
+
+goog.require('goog.asserts');
+goog.require('ol');
+goog.require('ol.events.condition');
+goog.require('ol.extent');
+goog.require('ol.interaction.DragBox');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to zoom the map by clicking and dragging on the map,
+ * normally combined with an {@link ol.events.condition} that limits
+ * it to when a key, shift by default, is held down.
+ *
+ * @constructor
+ * @extends {ol.interaction.DragBox}
+ * @param {olx.interaction.DragZoomOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.DragZoom = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var condition = goog.isDef(options.condition) ?
+      options.condition : ol.events.condition.shiftKeyOnly;
+
+  /**
+   * @private
+   * @type {ol.style.Style}
+   */
+  var style = goog.isDef(options.style) ?
+      options.style : new ol.style.Style({
+        stroke: new ol.style.Stroke({
+          color: [0, 0, 255, 1]
+        })
+      });
+
+  goog.base(this, {
+    condition: condition,
+    style: style
+  });
+
+};
+goog.inherits(ol.interaction.DragZoom, ol.interaction.DragBox);
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.DragZoom.prototype.onBoxEnd = function() {
+  var map = this.getMap();
+  var view = map.getView();
+  goog.asserts.assert(!goog.isNull(view));
+  var extent = this.getGeometry().getExtent();
+  var center = ol.extent.getCenter(extent);
+  var size = map.getSize();
+  goog.asserts.assert(goog.isDef(size));
+  ol.interaction.Interaction.zoom(map, view,
+      view.getResolutionForExtent(extent, size),
+      center, ol.DRAGZOOM_ANIMATION_DURATION);
+};
diff --git a/src/ol/interaction/drawinteraction.js b/src/ol/interaction/drawinteraction.js
new file mode 100644
index 0000000..352985e
--- /dev/null
+++ b/src/ol/interaction/drawinteraction.js
@@ -0,0 +1,628 @@
+goog.provide('ol.DrawEvent');
+goog.provide('ol.interaction.Draw');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.Event');
+goog.require('ol.Collection');
+goog.require('ol.Coordinate');
+goog.require('ol.Feature');
+goog.require('ol.FeatureOverlay');
+goog.require('ol.Map');
+goog.require('ol.MapBrowserEvent');
+goog.require('ol.MapBrowserEvent.EventType');
+goog.require('ol.Object');
+goog.require('ol.events.condition');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.interaction.InteractionProperty');
+goog.require('ol.interaction.Pointer');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Style');
+
+
+/**
+ * @enum {string}
+ */
+ol.DrawEventType = {
+  /**
+   * Triggered upon feature draw start
+   * @event ol.DrawEvent#drawstart
+   * @api stable
+   */
+  DRAWSTART: 'drawstart',
+  /**
+   * Triggered upon feature draw end
+   * @event ol.DrawEvent#drawend
+   * @api stable
+   */
+  DRAWEND: 'drawend'
+};
+
+
+
+/**
+ * @classdesc
+ * Events emitted by {@link ol.interaction.Draw} instances are instances of
+ * this type.
+ *
+ * @constructor
+ * @extends {goog.events.Event}
+ * @implements {oli.DrawEvent}
+ * @param {ol.DrawEventType} type Type.
+ * @param {ol.Feature} feature The feature drawn.
+ */
+ol.DrawEvent = function(type, feature) {
+
+  goog.base(this, type);
+
+  /**
+   * The feature being drawn.
+   * @type {ol.Feature}
+   * @api stable
+   */
+  this.feature = feature;
+
+};
+goog.inherits(ol.DrawEvent, goog.events.Event);
+
+
+
+/**
+ * @classdesc
+ * Interaction that allows drawing geometries.
+ *
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ * @fires ol.DrawEvent
+ * @param {olx.interaction.DrawOptions} options Options.
+ * @api stable
+ */
+ol.interaction.Draw = function(options) {
+
+  goog.base(this, {
+    handleDownEvent: ol.interaction.Draw.handleDownEvent_,
+    handleEvent: ol.interaction.Draw.handleEvent,
+    handleUpEvent: ol.interaction.Draw.handleUpEvent_
+  });
+
+  /**
+   * @type {ol.Pixel}
+   * @private
+   */
+  this.downPx_ = null;
+
+  /**
+   * Target source for drawn features.
+   * @type {ol.source.Vector}
+   * @private
+   */
+  this.source_ = goog.isDef(options.source) ? options.source : null;
+
+  /**
+   * Target collection for drawn features.
+   * @type {ol.Collection.<ol.Feature>}
+   * @private
+   */
+  this.features_ = goog.isDef(options.features) ? options.features : null;
+
+  /**
+   * Pixel distance for snapping.
+   * @type {number}
+   * @private
+   */
+  this.snapTolerance_ = goog.isDef(options.snapTolerance) ?
+      options.snapTolerance : 12;
+
+  /**
+   * The number of points that must be drawn before a polygon ring can be
+   * finished.  The default is 3.
+   * @type {number}
+   * @private
+   */
+  this.minPointsPerRing_ = goog.isDef(options.minPointsPerRing) ?
+      options.minPointsPerRing : 3;
+
+  /**
+   * Geometry type.
+   * @type {ol.geom.GeometryType}
+   * @private
+   */
+  this.type_ = options.type;
+
+  /**
+   * Drawing mode (derived from geometry type.
+   * @type {ol.interaction.DrawMode}
+   * @private
+   */
+  this.mode_ = ol.interaction.Draw.getMode_(this.type_);
+
+  /**
+   * Finish coordinate for the feature (first point for polygons, last point for
+   * linestrings).
+   * @type {ol.Coordinate}
+   * @private
+   */
+  this.finishCoordinate_ = null;
+
+  /**
+   * Sketch feature.
+   * @type {ol.Feature}
+   * @private
+   */
+  this.sketchFeature_ = null;
+
+  /**
+   * Sketch point.
+   * @type {ol.Feature}
+   * @private
+   */
+  this.sketchPoint_ = null;
+
+  /**
+   * Sketch line. Used when drawing polygon.
+   * @type {ol.Feature}
+   * @private
+   */
+  this.sketchLine_ = null;
+
+  /**
+   * Sketch polygon. Used when drawing polygon.
+   * @type {Array.<Array.<ol.Coordinate>>}
+   * @private
+   */
+  this.sketchPolygonCoords_ = null;
+
+  /**
+   * Squared tolerance for handling up events.  If the squared distance
+   * between a down and up event is greater than this tolerance, up events
+   * will not be handled.
+   * @type {number}
+   * @private
+   */
+  this.squaredClickTolerance_ = 4;
+
+  /**
+   * Draw overlay where our sketch features are drawn.
+   * @type {ol.FeatureOverlay}
+   * @private
+   */
+  this.overlay_ = new ol.FeatureOverlay({
+    style: goog.isDef(options.style) ?
+        options.style : ol.interaction.Draw.getDefaultStyleFunction()
+  });
+
+  /**
+   * Name of the geometry attribute for newly created features.
+   * @type {string|undefined}
+   * @private
+   */
+  this.geometryName_ = options.geometryName;
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.condition_ = goog.isDef(options.condition) ?
+      options.condition : ol.events.condition.noModifierKeys;
+
+  goog.events.listen(this,
+      ol.Object.getChangeEventType(ol.interaction.InteractionProperty.ACTIVE),
+      this.updateState_, false, this);
+
+};
+goog.inherits(ol.interaction.Draw, ol.interaction.Pointer);
+
+
+/**
+ * @return {ol.style.StyleFunction} Styles.
+ */
+ol.interaction.Draw.getDefaultStyleFunction = function() {
+  var styles = ol.style.createDefaultEditingStyles();
+  return function(feature, resolution) {
+    return styles[feature.getGeometry().getType()];
+  };
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.Draw.prototype.setMap = function(map) {
+  goog.base(this, 'setMap', map);
+  this.updateState_();
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.Draw}
+ * @api
+ */
+ol.interaction.Draw.handleEvent = function(mapBrowserEvent) {
+  var map = mapBrowserEvent.map;
+  if (!map.isDef()) {
+    return true;
+  }
+  var pass = true;
+  if (mapBrowserEvent.type === ol.MapBrowserEvent.EventType.POINTERMOVE) {
+    pass = this.handlePointerMove_(mapBrowserEvent);
+  } else if (mapBrowserEvent.type === ol.MapBrowserEvent.EventType.DBLCLICK) {
+    pass = false;
+  }
+  return ol.interaction.Pointer.handleEvent.call(this, mapBrowserEvent) && pass;
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} event Event.
+ * @return {boolean} Start drag sequence?
+ * @this {ol.interaction.Draw}
+ * @private
+ */
+ol.interaction.Draw.handleDownEvent_ = function(event) {
+  if (this.condition_(event)) {
+    this.downPx_ = event.pixel;
+    return true;
+  } else {
+    return false;
+  }
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} event Event.
+ * @return {boolean} Stop drag sequence?
+ * @this {ol.interaction.Draw}
+ * @private
+ */
+ol.interaction.Draw.handleUpEvent_ = function(event) {
+  var downPx = this.downPx_;
+  var clickPx = event.pixel;
+  var dx = downPx[0] - clickPx[0];
+  var dy = downPx[1] - clickPx[1];
+  var squaredDistance = dx * dx + dy * dy;
+  var pass = true;
+  if (squaredDistance <= this.squaredClickTolerance_) {
+    this.handlePointerMove_(event);
+    if (goog.isNull(this.finishCoordinate_)) {
+      this.startDrawing_(event);
+    } else if (this.mode_ === ol.interaction.DrawMode.POINT ||
+        this.atFinish_(event)) {
+      this.finishDrawing();
+    } else {
+      this.addToDrawing_(event);
+    }
+    pass = false;
+  }
+  return pass;
+};
+
+
+/**
+ * Handle move events.
+ * @param {ol.MapBrowserEvent} event A move event.
+ * @return {boolean} Pass the event to other interactions.
+ * @private
+ */
+ol.interaction.Draw.prototype.handlePointerMove_ = function(event) {
+  if (this.mode_ === ol.interaction.DrawMode.POINT &&
+      goog.isNull(this.finishCoordinate_)) {
+    this.startDrawing_(event);
+  } else if (!goog.isNull(this.finishCoordinate_)) {
+    this.modifyDrawing_(event);
+  } else {
+    this.createOrUpdateSketchPoint_(event);
+  }
+  return true;
+};
+
+
+/**
+ * Determine if an event is within the snapping tolerance of the start coord.
+ * @param {ol.MapBrowserEvent} event Event.
+ * @return {boolean} The event is within the snapping tolerance of the start.
+ * @private
+ */
+ol.interaction.Draw.prototype.atFinish_ = function(event) {
+  var at = false;
+  if (!goog.isNull(this.sketchFeature_)) {
+    var geometry = this.sketchFeature_.getGeometry();
+    var potentiallyDone = false;
+    var potentiallyFinishCoordinates = [this.finishCoordinate_];
+    if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) {
+      goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+      potentiallyDone = geometry.getCoordinates().length > 2;
+    } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
+      goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
+      potentiallyDone = geometry.getCoordinates()[0].length >
+          this.minPointsPerRing_;
+      potentiallyFinishCoordinates = [this.sketchPolygonCoords_[0][0],
+        this.sketchPolygonCoords_[0][this.sketchPolygonCoords_[0].length - 2]];
+    }
+    if (potentiallyDone) {
+      var map = event.map;
+      for (var i = 0, ii = potentiallyFinishCoordinates.length; i < ii; i++) {
+        var finishCoordinate = potentiallyFinishCoordinates[i];
+        var finishPixel = map.getPixelFromCoordinate(finishCoordinate);
+        var pixel = event.pixel;
+        var dx = pixel[0] - finishPixel[0];
+        var dy = pixel[1] - finishPixel[1];
+        at = Math.sqrt(dx * dx + dy * dy) <= this.snapTolerance_;
+        if (at) {
+          this.finishCoordinate_ = finishCoordinate;
+          break;
+        }
+      }
+    }
+  }
+  return at;
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} event Event.
+ * @private
+ */
+ol.interaction.Draw.prototype.createOrUpdateSketchPoint_ = function(event) {
+  var coordinates = event.coordinate.slice();
+  if (goog.isNull(this.sketchPoint_)) {
+    this.sketchPoint_ = new ol.Feature(new ol.geom.Point(coordinates));
+    this.updateSketchFeatures_();
+  } else {
+    var sketchPointGeom = this.sketchPoint_.getGeometry();
+    goog.asserts.assertInstanceof(sketchPointGeom, ol.geom.Point);
+    sketchPointGeom.setCoordinates(coordinates);
+  }
+};
+
+
+/**
+ * Start the drawing.
+ * @param {ol.MapBrowserEvent} event Event.
+ * @private
+ */
+ol.interaction.Draw.prototype.startDrawing_ = function(event) {
+  var start = event.coordinate;
+  this.finishCoordinate_ = start;
+  var geometry;
+  if (this.mode_ === ol.interaction.DrawMode.POINT) {
+    geometry = new ol.geom.Point(start.slice());
+  } else {
+    if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) {
+      geometry = new ol.geom.LineString([start.slice(), start.slice()]);
+    } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
+      this.sketchLine_ = new ol.Feature(new ol.geom.LineString([start.slice(),
+            start.slice()]));
+      this.sketchPolygonCoords_ = [[start.slice(), start.slice()]];
+      geometry = new ol.geom.Polygon(this.sketchPolygonCoords_);
+    }
+  }
+  goog.asserts.assert(goog.isDef(geometry));
+  this.sketchFeature_ = new ol.Feature();
+  if (goog.isDef(this.geometryName_)) {
+    this.sketchFeature_.setGeometryName(this.geometryName_);
+  }
+  this.sketchFeature_.setGeometry(geometry);
+  this.updateSketchFeatures_();
+  this.dispatchEvent(new ol.DrawEvent(ol.DrawEventType.DRAWSTART,
+      this.sketchFeature_));
+};
+
+
+/**
+ * Modify the drawing.
+ * @param {ol.MapBrowserEvent} event Event.
+ * @private
+ */
+ol.interaction.Draw.prototype.modifyDrawing_ = function(event) {
+  var coordinate = event.coordinate;
+  var geometry = this.sketchFeature_.getGeometry();
+  var coordinates, last;
+  if (this.mode_ === ol.interaction.DrawMode.POINT) {
+    goog.asserts.assertInstanceof(geometry, ol.geom.Point);
+    last = geometry.getCoordinates();
+    last[0] = coordinate[0];
+    last[1] = coordinate[1];
+    geometry.setCoordinates(last);
+  } else {
+    if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) {
+      goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+      coordinates = geometry.getCoordinates();
+    } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
+      goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
+      coordinates = this.sketchPolygonCoords_[0];
+    }
+    if (this.atFinish_(event)) {
+      // snap to finish
+      coordinate = this.finishCoordinate_.slice();
+    }
+    var sketchPointGeom = this.sketchPoint_.getGeometry();
+    goog.asserts.assertInstanceof(sketchPointGeom, ol.geom.Point);
+    sketchPointGeom.setCoordinates(coordinate);
+    last = coordinates[coordinates.length - 1];
+    last[0] = coordinate[0];
+    last[1] = coordinate[1];
+    if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) {
+      goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+      geometry.setCoordinates(coordinates);
+    } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
+      var sketchLineGeom = this.sketchLine_.getGeometry();
+      goog.asserts.assertInstanceof(sketchLineGeom, ol.geom.LineString);
+      sketchLineGeom.setCoordinates(coordinates);
+      goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
+      geometry.setCoordinates(this.sketchPolygonCoords_);
+    }
+  }
+  this.updateSketchFeatures_();
+};
+
+
+/**
+ * Add a new coordinate to the drawing.
+ * @param {ol.MapBrowserEvent} event Event.
+ * @private
+ */
+ol.interaction.Draw.prototype.addToDrawing_ = function(event) {
+  var coordinate = event.coordinate;
+  var geometry = this.sketchFeature_.getGeometry();
+  var coordinates;
+  if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) {
+    this.finishCoordinate_ = coordinate.slice();
+    goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+    coordinates = geometry.getCoordinates();
+    coordinates.push(coordinate.slice());
+    geometry.setCoordinates(coordinates);
+  } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
+    this.sketchPolygonCoords_[0].push(coordinate.slice());
+    goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
+    geometry.setCoordinates(this.sketchPolygonCoords_);
+  }
+  this.updateSketchFeatures_();
+};
+
+
+/**
+ * Stop drawing and add the sketch feature to the target layer.
+ * @api
+ */
+ol.interaction.Draw.prototype.finishDrawing = function() {
+  var sketchFeature = this.abortDrawing_();
+  goog.asserts.assert(!goog.isNull(sketchFeature));
+  var coordinates;
+  var geometry = sketchFeature.getGeometry();
+  if (this.mode_ === ol.interaction.DrawMode.POINT) {
+    goog.asserts.assertInstanceof(geometry, ol.geom.Point);
+    coordinates = geometry.getCoordinates();
+  } else if (this.mode_ === ol.interaction.DrawMode.LINE_STRING) {
+    goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+    coordinates = geometry.getCoordinates();
+    // remove the redundant last point
+    coordinates.pop();
+    geometry.setCoordinates(coordinates);
+  } else if (this.mode_ === ol.interaction.DrawMode.POLYGON) {
+    goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
+    // When we finish drawing a polygon on the last point,
+    // the last coordinate is duplicated as for LineString
+    // we force the replacement by the first point
+    this.sketchPolygonCoords_[0].pop();
+    this.sketchPolygonCoords_[0].push(this.sketchPolygonCoords_[0][0]);
+    geometry.setCoordinates(this.sketchPolygonCoords_);
+    coordinates = geometry.getCoordinates();
+  }
+
+  // cast multi-part geometries
+  if (this.type_ === ol.geom.GeometryType.MULTI_POINT) {
+    sketchFeature.setGeometry(new ol.geom.MultiPoint([coordinates]));
+  } else if (this.type_ === ol.geom.GeometryType.MULTI_LINE_STRING) {
+    sketchFeature.setGeometry(new ol.geom.MultiLineString([coordinates]));
+  } else if (this.type_ === ol.geom.GeometryType.MULTI_POLYGON) {
+    sketchFeature.setGeometry(new ol.geom.MultiPolygon([coordinates]));
+  }
+
+  if (!goog.isNull(this.features_)) {
+    this.features_.push(sketchFeature);
+  }
+  if (!goog.isNull(this.source_)) {
+    this.source_.addFeature(sketchFeature);
+  }
+  this.dispatchEvent(new ol.DrawEvent(ol.DrawEventType.DRAWEND, sketchFeature));
+};
+
+
+/**
+ * Stop drawing without adding the sketch feature to the target layer.
+ * @return {ol.Feature} The sketch feature (or null if none).
+ * @private
+ */
+ol.interaction.Draw.prototype.abortDrawing_ = function() {
+  this.finishCoordinate_ = null;
+  var sketchFeature = this.sketchFeature_;
+  if (!goog.isNull(sketchFeature)) {
+    this.sketchFeature_ = null;
+    this.sketchPoint_ = null;
+    this.sketchLine_ = null;
+    this.overlay_.getFeatures().clear();
+  }
+  return sketchFeature;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.Draw.prototype.shouldStopEvent = goog.functions.FALSE;
+
+
+/**
+ * Redraw the skecth features.
+ * @private
+ */
+ol.interaction.Draw.prototype.updateSketchFeatures_ = function() {
+  var sketchFeatures = [];
+  if (!goog.isNull(this.sketchFeature_)) {
+    sketchFeatures.push(this.sketchFeature_);
+  }
+  if (!goog.isNull(this.sketchLine_)) {
+    sketchFeatures.push(this.sketchLine_);
+  }
+  if (!goog.isNull(this.sketchPoint_)) {
+    sketchFeatures.push(this.sketchPoint_);
+  }
+  this.overlay_.setFeatures(new ol.Collection(sketchFeatures));
+};
+
+
+/**
+ * @private
+ */
+ol.interaction.Draw.prototype.updateState_ = function() {
+  var map = this.getMap();
+  var active = this.getActive();
+  if (goog.isNull(map) || !active) {
+    this.abortDrawing_();
+  }
+  this.overlay_.setMap(active ? map : null);
+};
+
+
+/**
+ * Get the drawing mode.  The mode for mult-part geometries is the same as for
+ * their single-part cousins.
+ * @param {ol.geom.GeometryType} type Geometry type.
+ * @return {ol.interaction.DrawMode} Drawing mode.
+ * @private
+ */
+ol.interaction.Draw.getMode_ = function(type) {
+  var mode;
+  if (type === ol.geom.GeometryType.POINT ||
+      type === ol.geom.GeometryType.MULTI_POINT) {
+    mode = ol.interaction.DrawMode.POINT;
+  } else if (type === ol.geom.GeometryType.LINE_STRING ||
+      type === ol.geom.GeometryType.MULTI_LINE_STRING) {
+    mode = ol.interaction.DrawMode.LINE_STRING;
+  } else if (type === ol.geom.GeometryType.POLYGON ||
+      type === ol.geom.GeometryType.MULTI_POLYGON) {
+    mode = ol.interaction.DrawMode.POLYGON;
+  }
+  goog.asserts.assert(goog.isDef(mode));
+  return mode;
+};
+
+
+/**
+ * Draw mode.  This collapses multi-part geometry types with their single-part
+ * cousins.
+ * @enum {string}
+ */
+ol.interaction.DrawMode = {
+  POINT: 'Point',
+  LINE_STRING: 'LineString',
+  POLYGON: 'Polygon'
+};
diff --git a/src/ol/interaction/interaction.js b/src/ol/interaction/interaction.js
new file mode 100644
index 0000000..3db0a9c
--- /dev/null
+++ b/src/ol/interaction/interaction.js
@@ -0,0 +1,252 @@
+// FIXME factor out key precondition (shift et. al)
+
+goog.provide('ol.interaction.Interaction');
+goog.provide('ol.interaction.InteractionProperty');
+
+goog.require('goog.asserts');
+goog.require('ol.MapBrowserEvent');
+goog.require('ol.Object');
+goog.require('ol.animation');
+goog.require('ol.easing');
+
+
+/**
+ * @enum {string}
+ */
+ol.interaction.InteractionProperty = {
+  ACTIVE: 'active'
+};
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * User actions that change the state of the map. Some are similar to controls,
+ * but are not associated with a DOM element.
+ * For example, {@link ol.interaction.KeyboardZoom} is functionally the same as
+ * {@link ol.control.Zoom}, but triggered by a keyboard event not a button
+ * element event.
+ * Although interactions do not have a DOM element, some of them do render
+ * vectors and so are visible on the screen.
+ *
+ * @constructor
+ * @param {olx.interaction.InteractionOptions} options Options.
+ * @extends {ol.Object}
+ * @api
+ */
+ol.interaction.Interaction = function(options) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {ol.Map}
+   */
+  this.map_ = null;
+
+  this.setActive(true);
+
+  /**
+   * @type {function(ol.MapBrowserEvent):boolean}
+   */
+  this.handleEvent = options.handleEvent;
+
+};
+goog.inherits(ol.interaction.Interaction, ol.Object);
+
+
+/**
+ * @return {boolean} `true` if the interaction is active, `false` otherwise.
+ * @observable
+ * @api
+ */
+ol.interaction.Interaction.prototype.getActive = function() {
+  return /** @type {boolean} */ (
+      this.get(ol.interaction.InteractionProperty.ACTIVE));
+};
+goog.exportProperty(
+    ol.interaction.Interaction.prototype,
+    'getActive',
+    ol.interaction.Interaction.prototype.getActive);
+
+
+/**
+ * Get the map associated with this interaction.
+ * @return {ol.Map} Map.
+ */
+ol.interaction.Interaction.prototype.getMap = function() {
+  return this.map_;
+};
+
+
+/**
+ * Activate or deactivate the interaction.
+ * @param {boolean} active Active.
+ * @observable
+ * @api
+ */
+ol.interaction.Interaction.prototype.setActive = function(active) {
+  this.set(ol.interaction.InteractionProperty.ACTIVE, active);
+};
+goog.exportProperty(
+    ol.interaction.Interaction.prototype,
+    'setActive',
+    ol.interaction.Interaction.prototype.setActive);
+
+
+/**
+ * Remove the interaction from its current map and attach it to the new map.
+ * Subclasses may set up event handlers to get notified about changes to
+ * the map here.
+ * @param {ol.Map} map Map.
+ */
+ol.interaction.Interaction.prototype.setMap = function(map) {
+  this.map_ = map;
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {ol.View} view View.
+ * @param {ol.Coordinate} delta Delta.
+ * @param {number=} opt_duration Duration.
+ */
+ol.interaction.Interaction.pan = function(map, view, delta, opt_duration) {
+  var currentCenter = view.getCenter();
+  if (goog.isDef(currentCenter)) {
+    if (goog.isDef(opt_duration) && opt_duration > 0) {
+      map.beforeRender(ol.animation.pan({
+        source: currentCenter,
+        duration: opt_duration,
+        easing: ol.easing.linear
+      }));
+    }
+    var center = view.constrainCenter(
+        [currentCenter[0] + delta[0], currentCenter[1] + delta[1]]);
+    view.setCenter(center);
+  }
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {ol.View} view View.
+ * @param {number|undefined} rotation Rotation.
+ * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
+ * @param {number=} opt_duration Duration.
+ */
+ol.interaction.Interaction.rotate =
+    function(map, view, rotation, opt_anchor, opt_duration) {
+  rotation = view.constrainRotation(rotation, 0);
+  ol.interaction.Interaction.rotateWithoutConstraints(
+      map, view, rotation, opt_anchor, opt_duration);
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {ol.View} view View.
+ * @param {number|undefined} rotation Rotation.
+ * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
+ * @param {number=} opt_duration Duration.
+ */
+ol.interaction.Interaction.rotateWithoutConstraints =
+    function(map, view, rotation, opt_anchor, opt_duration) {
+  if (goog.isDefAndNotNull(rotation)) {
+    var currentRotation = view.getRotation();
+    var currentCenter = view.getCenter();
+    if (goog.isDef(currentRotation) && goog.isDef(currentCenter) &&
+        goog.isDef(opt_duration) && opt_duration > 0) {
+      map.beforeRender(ol.animation.rotate({
+        rotation: currentRotation,
+        duration: opt_duration,
+        easing: ol.easing.easeOut
+      }));
+      if (goog.isDef(opt_anchor)) {
+        map.beforeRender(ol.animation.pan({
+          source: currentCenter,
+          duration: opt_duration,
+          easing: ol.easing.easeOut
+        }));
+      }
+    }
+    view.rotate(rotation, opt_anchor);
+  }
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {ol.View} view View.
+ * @param {number|undefined} resolution Resolution to go to.
+ * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
+ * @param {number=} opt_duration Duration.
+ * @param {number=} opt_direction Zooming direction; > 0 indicates
+ *     zooming out, in which case the constraints system will select
+ *     the largest nearest resolution; < 0 indicates zooming in, in
+ *     which case the constraints system will select the smallest
+ *     nearest resolution; == 0 indicates that the zooming direction
+ *     is unknown/not relevant, in which case the constraints system
+ *     will select the nearest resolution. If not defined 0 is
+ *     assumed.
+ */
+ol.interaction.Interaction.zoom =
+    function(map, view, resolution, opt_anchor, opt_duration, opt_direction) {
+  resolution = view.constrainResolution(resolution, 0, opt_direction);
+  ol.interaction.Interaction.zoomWithoutConstraints(
+      map, view, resolution, opt_anchor, opt_duration);
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {ol.View} view View.
+ * @param {number} delta Delta from previous zoom level.
+ * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
+ * @param {number=} opt_duration Duration.
+ */
+ol.interaction.Interaction.zoomByDelta =
+    function(map, view, delta, opt_anchor, opt_duration) {
+  var currentResolution = view.getResolution();
+  var resolution = view.constrainResolution(currentResolution, delta, 0);
+  ol.interaction.Interaction.zoomWithoutConstraints(
+      map, view, resolution, opt_anchor, opt_duration);
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {ol.View} view View.
+ * @param {number|undefined} resolution Resolution to go to.
+ * @param {ol.Coordinate=} opt_anchor Anchor coordinate.
+ * @param {number=} opt_duration Duration.
+ */
+ol.interaction.Interaction.zoomWithoutConstraints =
+    function(map, view, resolution, opt_anchor, opt_duration) {
+  if (goog.isDefAndNotNull(resolution)) {
+    var currentResolution = view.getResolution();
+    var currentCenter = view.getCenter();
+    if (goog.isDef(currentResolution) && goog.isDef(currentCenter) &&
+        goog.isDef(opt_duration) && opt_duration > 0) {
+      map.beforeRender(ol.animation.zoom({
+        resolution: currentResolution,
+        duration: opt_duration,
+        easing: ol.easing.easeOut
+      }));
+      if (goog.isDef(opt_anchor)) {
+        map.beforeRender(ol.animation.pan({
+          source: currentCenter,
+          duration: opt_duration,
+          easing: ol.easing.easeOut
+        }));
+      }
+    }
+    if (goog.isDefAndNotNull(opt_anchor)) {
+      var center = view.calculateCenterZoom(resolution, opt_anchor);
+      view.setCenter(center);
+    }
+    view.setResolution(resolution);
+  }
+};
diff --git a/src/ol/interaction/interaction.jsdoc b/src/ol/interaction/interaction.jsdoc
new file mode 100644
index 0000000..6da0d14
--- /dev/null
+++ b/src/ol/interaction/interaction.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.interaction
+ */
diff --git a/src/ol/interaction/interactiondefaults.js b/src/ol/interaction/interactiondefaults.js
new file mode 100644
index 0000000..4b0815a
--- /dev/null
+++ b/src/ol/interaction/interactiondefaults.js
@@ -0,0 +1,113 @@
+goog.provide('ol.interaction');
+
+goog.require('ol.Collection');
+goog.require('ol.Kinetic');
+goog.require('ol.interaction.DoubleClickZoom');
+goog.require('ol.interaction.DragPan');
+goog.require('ol.interaction.DragRotate');
+goog.require('ol.interaction.DragZoom');
+goog.require('ol.interaction.KeyboardPan');
+goog.require('ol.interaction.KeyboardZoom');
+goog.require('ol.interaction.MouseWheelZoom');
+goog.require('ol.interaction.PinchRotate');
+goog.require('ol.interaction.PinchZoom');
+
+
+/**
+ * Set of interactions included in maps by default. Specific interactions can be
+ * excluded by setting the appropriate option to false in the constructor
+ * options, but the order of the interactions is fixed.  If you want to specify
+ * a different order for interactions, you will need to create your own
+ * {@link ol.interaction.Interaction} instances and insert them into a
+ * {@link ol.Collection} in the order you want before creating your
+ * {@link ol.Map} instance. The default set of interactions, in sequence, is:
+ * * {@link ol.interaction.DragRotate}
+ * * {@link ol.interaction.DoubleClickZoom}
+ * * {@link ol.interaction.DragPan}
+ * * {@link ol.interaction.PinchRotate}
+ * * {@link ol.interaction.PinchZoom}
+ * * {@link ol.interaction.KeyboardPan}
+ * * {@link ol.interaction.KeyboardZoom}
+ * * {@link ol.interaction.MouseWheelZoom}
+ * * {@link ol.interaction.DragZoom}
+ *
+ * Note that DragZoom renders a box as a vector polygon, so this interaction
+ * should be excluded if you want a build with no vector support.
+ *
+ * @param {olx.interaction.DefaultsOptions=} opt_options Defaults options.
+ * @return {ol.Collection.<ol.interaction.Interaction>} A collection of
+ * interactions to be used with the ol.Map constructor's interactions option.
+ * @api stable
+ */
+ol.interaction.defaults = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var interactions = new ol.Collection();
+
+  var kinetic = new ol.Kinetic(-0.005, 0.05, 100);
+
+  var altShiftDragRotate = goog.isDef(options.altShiftDragRotate) ?
+      options.altShiftDragRotate : true;
+  if (altShiftDragRotate) {
+    interactions.push(new ol.interaction.DragRotate());
+  }
+
+  var doubleClickZoom = goog.isDef(options.doubleClickZoom) ?
+      options.doubleClickZoom : true;
+  if (doubleClickZoom) {
+    interactions.push(new ol.interaction.DoubleClickZoom({
+      delta: options.zoomDelta,
+      duration: options.zoomDuration
+    }));
+  }
+
+  var dragPan = goog.isDef(options.dragPan) ?
+      options.dragPan : true;
+  if (dragPan) {
+    interactions.push(new ol.interaction.DragPan({
+      kinetic: kinetic
+    }));
+  }
+
+  var pinchRotate = goog.isDef(options.pinchRotate) ?
+      options.pinchRotate : true;
+  if (pinchRotate) {
+    interactions.push(new ol.interaction.PinchRotate());
+  }
+
+  var pinchZoom = goog.isDef(options.pinchZoom) ?
+      options.pinchZoom : true;
+  if (pinchZoom) {
+    interactions.push(new ol.interaction.PinchZoom({
+      duration: options.zoomDuration
+    }));
+  }
+
+  var keyboard = goog.isDef(options.keyboard) ?
+      options.keyboard : true;
+  if (keyboard) {
+    interactions.push(new ol.interaction.KeyboardPan());
+    interactions.push(new ol.interaction.KeyboardZoom({
+      delta: options.zoomDelta,
+      duration: options.zoomDuration
+    }));
+  }
+
+  var mouseWheelZoom = goog.isDef(options.mouseWheelZoom) ?
+      options.mouseWheelZoom : true;
+  if (mouseWheelZoom) {
+    interactions.push(new ol.interaction.MouseWheelZoom({
+      duration: options.zoomDuration
+    }));
+  }
+
+  var shiftDragZoom = goog.isDef(options.shiftDragZoom) ?
+      options.shiftDragZoom : true;
+  if (shiftDragZoom) {
+    interactions.push(new ol.interaction.DragZoom());
+  }
+
+  return interactions;
+
+};
diff --git a/src/ol/interaction/keyboardpaninteraction.js b/src/ol/interaction/keyboardpaninteraction.js
new file mode 100644
index 0000000..9cfee2d
--- /dev/null
+++ b/src/ol/interaction/keyboardpaninteraction.js
@@ -0,0 +1,99 @@
+goog.provide('ol.interaction.KeyboardPan');
+
+goog.require('goog.asserts');
+goog.require('goog.events.KeyCodes');
+goog.require('goog.events.KeyHandler.EventType');
+goog.require('goog.functions');
+goog.require('ol');
+goog.require('ol.coordinate');
+goog.require('ol.events.ConditionType');
+goog.require('ol.events.condition');
+goog.require('ol.interaction.Interaction');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to pan the map using keyboard arrows.
+ * Note that, although this interaction is by default included in maps,
+ * the keys can only be used when browser focus is on the element to which
+ * the keyboard events are attached. By default, this is the map div,
+ * though you can change this with the `keyboardEventTarget` in
+ * {@link ol.Map}. `document` never loses focus but, for any other element,
+ * focus will have to be on, and returned to, this element if the keys are to
+ * function.
+ * See also {@link ol.interaction.KeyboardZoom}.
+ *
+ * @constructor
+ * @extends {ol.interaction.Interaction}
+ * @param {olx.interaction.KeyboardPanOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.KeyboardPan = function(opt_options) {
+
+  goog.base(this, {
+    handleEvent: ol.interaction.KeyboardPan.handleEvent
+  });
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.condition_ = goog.isDef(options.condition) ? options.condition :
+      goog.functions.and(ol.events.condition.noModifierKeys,
+          ol.events.condition.targetNotEditable);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.pixelDelta_ = goog.isDef(options.pixelDelta) ? options.pixelDelta : 128;
+
+};
+goog.inherits(ol.interaction.KeyboardPan, ol.interaction.Interaction);
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.KeyboardPan}
+ * @api
+ */
+ol.interaction.KeyboardPan.handleEvent = function(mapBrowserEvent) {
+  var stopEvent = false;
+  if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) {
+    var keyEvent = /** @type {goog.events.KeyEvent} */
+        (mapBrowserEvent.browserEvent);
+    var keyCode = keyEvent.keyCode;
+    if (this.condition_(mapBrowserEvent) &&
+        (keyCode == goog.events.KeyCodes.DOWN ||
+        keyCode == goog.events.KeyCodes.LEFT ||
+        keyCode == goog.events.KeyCodes.RIGHT ||
+        keyCode == goog.events.KeyCodes.UP)) {
+      var map = mapBrowserEvent.map;
+      var view = map.getView();
+      goog.asserts.assert(!goog.isNull(view));
+      var viewState = view.getState();
+      var mapUnitsDelta = viewState.resolution * this.pixelDelta_;
+      var deltaX = 0, deltaY = 0;
+      if (keyCode == goog.events.KeyCodes.DOWN) {
+        deltaY = -mapUnitsDelta;
+      } else if (keyCode == goog.events.KeyCodes.LEFT) {
+        deltaX = -mapUnitsDelta;
+      } else if (keyCode == goog.events.KeyCodes.RIGHT) {
+        deltaX = mapUnitsDelta;
+      } else {
+        deltaY = mapUnitsDelta;
+      }
+      var delta = [deltaX, deltaY];
+      ol.coordinate.rotate(delta, viewState.rotation);
+      ol.interaction.Interaction.pan(
+          map, view, delta, ol.KEYBOARD_PAN_DURATION);
+      mapBrowserEvent.preventDefault();
+      stopEvent = true;
+    }
+  }
+  return !stopEvent;
+};
diff --git a/src/ol/interaction/keyboardzoominteraction.js b/src/ol/interaction/keyboardzoominteraction.js
new file mode 100644
index 0000000..b76f8a0
--- /dev/null
+++ b/src/ol/interaction/keyboardzoominteraction.js
@@ -0,0 +1,85 @@
+goog.provide('ol.interaction.KeyboardZoom');
+
+goog.require('goog.asserts');
+goog.require('goog.events.KeyHandler.EventType');
+goog.require('ol.events.ConditionType');
+goog.require('ol.events.condition');
+goog.require('ol.interaction.Interaction');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to zoom the map using keyboard + and -.
+ * Note that, although this interaction is by default included in maps,
+ * the keys can only be used when browser focus is on the element to which
+ * the keyboard events are attached. By default, this is the map div,
+ * though you can change this with the `keyboardEventTarget` in
+ * {@link ol.Map}. `document` never loses focus but, for any other element,
+ * focus will have to be on, and returned to, this element if the keys are to
+ * function.
+ * See also {@link ol.interaction.KeyboardPan}.
+ *
+ * @constructor
+ * @param {olx.interaction.KeyboardZoomOptions=} opt_options Options.
+ * @extends {ol.interaction.Interaction}
+ * @api stable
+ */
+ol.interaction.KeyboardZoom = function(opt_options) {
+
+  goog.base(this, {
+    handleEvent: ol.interaction.KeyboardZoom.handleEvent
+  });
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.condition_ = goog.isDef(options.condition) ? options.condition :
+          ol.events.condition.targetNotEditable;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.delta_ = goog.isDef(options.delta) ? options.delta : 1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.duration_ = goog.isDef(options.duration) ? options.duration : 100;
+
+};
+goog.inherits(ol.interaction.KeyboardZoom, ol.interaction.Interaction);
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.KeyboardZoom}
+ * @api
+ */
+ol.interaction.KeyboardZoom.handleEvent = function(mapBrowserEvent) {
+  var stopEvent = false;
+  if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) {
+    var keyEvent = /** @type {goog.events.KeyEvent} */
+        (mapBrowserEvent.browserEvent);
+    var charCode = keyEvent.charCode;
+    if (this.condition_(mapBrowserEvent) &&
+        (charCode == '+'.charCodeAt(0) || charCode == '-'.charCodeAt(0))) {
+      var map = mapBrowserEvent.map;
+      var delta = (charCode == '+'.charCodeAt(0)) ? this.delta_ : -this.delta_;
+      map.render();
+      var view = map.getView();
+      goog.asserts.assert(!goog.isNull(view));
+      ol.interaction.Interaction.zoomByDelta(
+          map, view, delta, undefined, this.duration_);
+      mapBrowserEvent.preventDefault();
+      stopEvent = true;
+    }
+  }
+  return !stopEvent;
+};
diff --git a/src/ol/interaction/modifyinteraction.js b/src/ol/interaction/modifyinteraction.js
new file mode 100644
index 0000000..8446a7b
--- /dev/null
+++ b/src/ol/interaction/modifyinteraction.js
@@ -0,0 +1,791 @@
+goog.provide('ol.interaction.Modify');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.functions');
+goog.require('ol.Collection');
+goog.require('ol.CollectionEventType');
+goog.require('ol.Feature');
+goog.require('ol.FeatureOverlay');
+goog.require('ol.MapBrowserEvent.EventType');
+goog.require('ol.ViewHint');
+goog.require('ol.coordinate');
+goog.require('ol.events.condition');
+goog.require('ol.extent');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.interaction.Pointer');
+goog.require('ol.structs.RBush');
+goog.require('ol.style.Style');
+
+
+/**
+ * @typedef {{depth: (Array.<number>|undefined),
+ *            feature: ol.Feature,
+ *            geometry: ol.geom.SimpleGeometry,
+ *            index: (number|undefined),
+ *            segment: Array.<ol.Extent>}}
+ */
+ol.interaction.SegmentDataType;
+
+
+
+/**
+ * @classdesc
+ * Interaction for modifying vector data.
+ *
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ * @param {olx.interaction.ModifyOptions} options Options.
+ * @api stable
+ */
+ol.interaction.Modify = function(options) {
+
+  goog.base(this, {
+    handleDownEvent: ol.interaction.Modify.handleDownEvent_,
+    handleDragEvent: ol.interaction.Modify.handleDragEvent_,
+    handleEvent: ol.interaction.Modify.handleEvent,
+    handleUpEvent: ol.interaction.Modify.handleUpEvent_
+  });
+
+  /**
+   * @type {ol.events.ConditionType}
+   * @private
+   */
+  this.deleteCondition_ = goog.isDef(options.deleteCondition) ?
+      options.deleteCondition :
+      /** @type {ol.events.ConditionType} */ (goog.functions.and(
+          ol.events.condition.noModifierKeys,
+          ol.events.condition.singleClick));
+
+  /**
+   * Editing vertex.
+   * @type {ol.Feature}
+   * @private
+   */
+  this.vertexFeature_ = null;
+
+  /**
+   * Segments intersecting {@link this.vertexFeature_} by segment uid.
+   * @type {Object.<string, boolean>}
+   * @private
+   */
+  this.vertexSegments_ = null;
+
+  /**
+   * @type {ol.Pixel}
+   * @private
+   */
+  this.lastPixel_ = [0, 0];
+
+  /**
+   * Segment RTree for each layer
+   * @type {Object.<*, ol.structs.RBush>}
+   * @private
+   */
+  this.rBush_ = new ol.structs.RBush();
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.pixelTolerance_ = goog.isDef(options.pixelTolerance) ?
+      options.pixelTolerance : 10;
+
+  /**
+   * @type {boolean}
+   * @private
+   */
+  this.snappedToVertex_ = false;
+
+  /**
+   * @type {Array}
+   * @private
+   */
+  this.dragSegments_ = null;
+
+  /**
+   * Draw overlay where are sketch features are drawn.
+   * @type {ol.FeatureOverlay}
+   * @private
+   */
+  this.overlay_ = new ol.FeatureOverlay({
+    style: goog.isDef(options.style) ? options.style :
+        ol.interaction.Modify.getDefaultStyleFunction()
+  });
+
+  /**
+  * @const
+  * @private
+  * @type {Object.<string, function(ol.Feature, ol.geom.Geometry)> }
+  */
+  this.SEGMENT_WRITERS_ = {
+    'Point': this.writePointGeometry_,
+    'LineString': this.writeLineStringGeometry_,
+    'LinearRing': this.writeLineStringGeometry_,
+    'Polygon': this.writePolygonGeometry_,
+    'MultiPoint': this.writeMultiPointGeometry_,
+    'MultiLineString': this.writeMultiLineStringGeometry_,
+    'MultiPolygon': this.writeMultiPolygonGeometry_,
+    'GeometryCollection': this.writeGeometryCollectionGeometry_
+  };
+
+  /**
+   * @type {ol.Collection.<ol.Feature>}
+   * @private
+   */
+  this.features_ = options.features;
+
+  this.features_.forEach(this.addFeature_, this);
+  goog.events.listen(this.features_, ol.CollectionEventType.ADD,
+      this.handleFeatureAdd_, false, this);
+  goog.events.listen(this.features_, ol.CollectionEventType.REMOVE,
+      this.handleFeatureRemove_, false, this);
+
+};
+goog.inherits(ol.interaction.Modify, ol.interaction.Pointer);
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.interaction.Modify.prototype.addFeature_ = function(feature) {
+  var geometry = feature.getGeometry();
+  if (goog.isDef(this.SEGMENT_WRITERS_[geometry.getType()])) {
+    this.SEGMENT_WRITERS_[geometry.getType()].call(this, feature, geometry);
+  }
+  var map = this.getMap();
+  if (!goog.isNull(map)) {
+    this.handlePointerAtPixel_(this.lastPixel_, map);
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.Modify.prototype.setMap = function(map) {
+  this.overlay_.setMap(map);
+  goog.base(this, 'setMap', map);
+};
+
+
+/**
+ * @param {ol.CollectionEvent} evt Event.
+ * @private
+ */
+ol.interaction.Modify.prototype.handleFeatureAdd_ = function(evt) {
+  var feature = evt.element;
+  goog.asserts.assertInstanceof(feature, ol.Feature);
+  this.addFeature_(feature);
+};
+
+
+/**
+ * @param {ol.CollectionEvent} evt Event.
+ * @private
+ */
+ol.interaction.Modify.prototype.handleFeatureRemove_ = function(evt) {
+  var feature = evt.element;
+  var rBush = this.rBush_;
+  var i, nodesToRemove = [];
+  rBush.forEachInExtent(feature.getGeometry().getExtent(), function(node) {
+    if (feature === node.feature) {
+      nodesToRemove.push(node);
+    }
+  });
+  for (i = nodesToRemove.length - 1; i >= 0; --i) {
+    rBush.remove(nodesToRemove[i]);
+  }
+  // There remains only vertexFeature…
+  if (!goog.isNull(this.vertexFeature_) &&
+      this.features_.getLength() === 0) {
+    this.overlay_.removeFeature(this.vertexFeature_);
+    this.vertexFeature_ = null;
+  }
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature
+ * @param {ol.geom.Point} geometry Geometry.
+ * @private
+ */
+ol.interaction.Modify.prototype.writePointGeometry_ =
+    function(feature, geometry) {
+  var coordinates = geometry.getCoordinates();
+  var segmentData = /** @type {ol.interaction.SegmentDataType} */ ({
+    feature: feature,
+    geometry: geometry,
+    segment: [coordinates, coordinates]
+  });
+  this.rBush_.insert(geometry.getExtent(), segmentData);
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature
+ * @param {ol.geom.MultiPoint} geometry Geometry.
+ * @private
+ */
+ol.interaction.Modify.prototype.writeMultiPointGeometry_ =
+    function(feature, geometry) {
+  var points = geometry.getCoordinates();
+  var coordinates, i, ii, segmentData;
+  for (i = 0, ii = points.length; i < ii; ++i) {
+    coordinates = points[i];
+    segmentData = /** @type {ol.interaction.SegmentDataType} */ ({
+      feature: feature,
+      geometry: geometry,
+      depth: [i],
+      index: i,
+      segment: [coordinates, coordinates]
+    });
+    this.rBush_.insert(geometry.getExtent(), segmentData);
+  }
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature
+ * @param {ol.geom.LineString} geometry Geometry.
+ * @private
+ */
+ol.interaction.Modify.prototype.writeLineStringGeometry_ =
+    function(feature, geometry) {
+  var coordinates = geometry.getCoordinates();
+  var i, ii, segment, segmentData;
+  for (i = 0, ii = coordinates.length - 1; i < ii; ++i) {
+    segment = coordinates.slice(i, i + 2);
+    segmentData = /** @type {ol.interaction.SegmentDataType} */ ({
+      feature: feature,
+      geometry: geometry,
+      index: i,
+      segment: segment
+    });
+    this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData);
+  }
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature
+ * @param {ol.geom.MultiLineString} geometry Geometry.
+ * @private
+ */
+ol.interaction.Modify.prototype.writeMultiLineStringGeometry_ =
+    function(feature, geometry) {
+  var lines = geometry.getCoordinates();
+  var coordinates, i, ii, j, jj, segment, segmentData;
+  for (j = 0, jj = lines.length; j < jj; ++j) {
+    coordinates = lines[j];
+    for (i = 0, ii = coordinates.length - 1; i < ii; ++i) {
+      segment = coordinates.slice(i, i + 2);
+      segmentData = /** @type {ol.interaction.SegmentDataType} */ ({
+        feature: feature,
+        geometry: geometry,
+        depth: [j],
+        index: i,
+        segment: segment
+      });
+      this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData);
+    }
+  }
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature
+ * @param {ol.geom.Polygon} geometry Geometry.
+ * @private
+ */
+ol.interaction.Modify.prototype.writePolygonGeometry_ =
+    function(feature, geometry) {
+  var rings = geometry.getCoordinates();
+  var coordinates, i, ii, j, jj, segment, segmentData;
+  for (j = 0, jj = rings.length; j < jj; ++j) {
+    coordinates = rings[j];
+    for (i = 0, ii = coordinates.length - 1; i < ii; ++i) {
+      segment = coordinates.slice(i, i + 2);
+      segmentData = /** @type {ol.interaction.SegmentDataType} */ ({
+        feature: feature,
+        geometry: geometry,
+        depth: [j],
+        index: i,
+        segment: segment
+      });
+      this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData);
+    }
+  }
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature
+ * @param {ol.geom.MultiPolygon} geometry Geometry.
+ * @private
+ */
+ol.interaction.Modify.prototype.writeMultiPolygonGeometry_ =
+    function(feature, geometry) {
+  var polygons = geometry.getCoordinates();
+  var coordinates, i, ii, j, jj, k, kk, rings, segment, segmentData;
+  for (k = 0, kk = polygons.length; k < kk; ++k) {
+    rings = polygons[k];
+    for (j = 0, jj = rings.length; j < jj; ++j) {
+      coordinates = rings[j];
+      for (i = 0, ii = coordinates.length - 1; i < ii; ++i) {
+        segment = coordinates.slice(i, i + 2);
+        segmentData = /** @type {ol.interaction.SegmentDataType} */ ({
+          feature: feature,
+          geometry: geometry,
+          depth: [j, k],
+          index: i,
+          segment: segment
+        });
+        this.rBush_.insert(ol.extent.boundingExtent(segment), segmentData);
+      }
+    }
+  }
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature
+ * @param {ol.geom.GeometryCollection} geometry Geometry.
+ * @private
+ */
+ol.interaction.Modify.prototype.writeGeometryCollectionGeometry_ =
+    function(feature, geometry) {
+  var i, geometries = geometry.getGeometriesArray();
+  for (i = 0; i < geometries.length; ++i) {
+    this.SEGMENT_WRITERS_[geometries[i].getType()].call(
+        this, feature, geometries[i]);
+  }
+};
+
+
+/**
+ * @param {ol.Coordinate} coordinates Coordinates.
+ * @return {ol.Feature} Vertex feature.
+ * @private
+ */
+ol.interaction.Modify.prototype.createOrUpdateVertexFeature_ =
+    function(coordinates) {
+  var vertexFeature = this.vertexFeature_;
+  if (goog.isNull(vertexFeature)) {
+    vertexFeature = new ol.Feature(new ol.geom.Point(coordinates));
+    this.vertexFeature_ = vertexFeature;
+    this.overlay_.addFeature(vertexFeature);
+  } else {
+    var geometry = /** @type {ol.geom.Point} */ (vertexFeature.getGeometry());
+    geometry.setCoordinates(coordinates);
+  }
+  return vertexFeature;
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} evt Event.
+ * @return {boolean} Start drag sequence?
+ * @this {ol.interaction.Modify}
+ * @private
+ */
+ol.interaction.Modify.handleDownEvent_ = function(evt) {
+  this.handlePointerAtPixel_(evt.pixel, evt.map);
+  this.dragSegments_ = [];
+  var vertexFeature = this.vertexFeature_;
+  if (!goog.isNull(vertexFeature)) {
+    var insertVertices = [];
+    var geometry =  /** @type {ol.geom.Point} */ (vertexFeature.getGeometry());
+    var vertex = geometry.getCoordinates();
+    var vertexExtent = ol.extent.boundingExtent([vertex]);
+    var segmentDataMatches = this.rBush_.getInExtent(vertexExtent);
+    for (var i = 0, ii = segmentDataMatches.length; i < ii; ++i) {
+      var segmentDataMatch = segmentDataMatches[i];
+      var segment = segmentDataMatch.segment;
+      if (ol.coordinate.equals(segment[0], vertex)) {
+        this.dragSegments_.push([segmentDataMatch, 0]);
+      } else if (ol.coordinate.equals(segment[1], vertex)) {
+        this.dragSegments_.push([segmentDataMatch, 1]);
+      } else if (goog.getUid(segment) in this.vertexSegments_) {
+        insertVertices.push([segmentDataMatch, vertex]);
+      }
+    }
+    for (i = insertVertices.length - 1; i >= 0; --i) {
+      this.insertVertex_.apply(this, insertVertices[i]);
+    }
+  }
+  return !goog.isNull(this.vertexFeature_);
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} evt Event.
+ * @this {ol.interaction.Modify}
+ * @private
+ */
+ol.interaction.Modify.handleDragEvent_ = function(evt) {
+  var vertex = evt.coordinate;
+  for (var i = 0, ii = this.dragSegments_.length; i < ii; ++i) {
+    var dragSegment = this.dragSegments_[i];
+    var segmentData = dragSegment[0];
+    var depth = segmentData.depth;
+    var geometry = segmentData.geometry;
+    var coordinates = geometry.getCoordinates();
+    var segment = segmentData.segment;
+    var index = dragSegment[1];
+
+    while (vertex.length < geometry.getStride()) {
+      vertex.push(0);
+    }
+
+    switch (geometry.getType()) {
+      case ol.geom.GeometryType.POINT:
+        coordinates = vertex;
+        segment[0] = segment[1] = vertex;
+        break;
+      case ol.geom.GeometryType.MULTI_POINT:
+        coordinates[segmentData.index] = vertex;
+        segment[0] = segment[1] = vertex;
+        break;
+      case ol.geom.GeometryType.LINE_STRING:
+        coordinates[segmentData.index + index] = vertex;
+        segment[index] = vertex;
+        break;
+      case ol.geom.GeometryType.MULTI_LINE_STRING:
+        coordinates[depth[0]][segmentData.index + index] = vertex;
+        segment[index] = vertex;
+        break;
+      case ol.geom.GeometryType.POLYGON:
+        coordinates[depth[0]][segmentData.index + index] = vertex;
+        segment[index] = vertex;
+        break;
+      case ol.geom.GeometryType.MULTI_POLYGON:
+        coordinates[depth[1]][depth[0]][segmentData.index + index] = vertex;
+        segment[index] = vertex;
+        break;
+    }
+
+    geometry.setCoordinates(coordinates);
+    this.createOrUpdateVertexFeature_(vertex);
+  }
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} evt Event.
+ * @return {boolean} Stop drag sequence?
+ * @this {ol.interaction.Modify}
+ * @private
+ */
+ol.interaction.Modify.handleUpEvent_ = function(evt) {
+  var segmentData;
+  for (var i = this.dragSegments_.length - 1; i >= 0; --i) {
+    segmentData = this.dragSegments_[i][0];
+    this.rBush_.update(ol.extent.boundingExtent(segmentData.segment),
+        segmentData);
+  }
+  return false;
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.Modify}
+ * @api
+ */
+ol.interaction.Modify.handleEvent = function(mapBrowserEvent) {
+  var handled;
+  if (!mapBrowserEvent.map.getView().getHints()[ol.ViewHint.INTERACTING] &&
+      mapBrowserEvent.type == ol.MapBrowserEvent.EventType.POINTERMOVE) {
+    this.handlePointerMove_(mapBrowserEvent);
+  }
+  if (!goog.isNull(this.vertexFeature_) && this.snappedToVertex_ &&
+      this.deleteCondition_(mapBrowserEvent)) {
+    var geometry = this.vertexFeature_.getGeometry();
+    goog.asserts.assertInstanceof(geometry, ol.geom.Point);
+    handled = this.removeVertex_();
+  }
+  return ol.interaction.Pointer.handleEvent.call(this, mapBrowserEvent) &&
+      !handled;
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} evt Event.
+ * @private
+ */
+ol.interaction.Modify.prototype.handlePointerMove_ = function(evt) {
+  this.lastPixel_ = evt.pixel;
+  this.handlePointerAtPixel_(evt.pixel, evt.map);
+};
+
+
+/**
+ * @param {ol.Pixel} pixel Pixel
+ * @param {ol.Map} map Map.
+ * @private
+ */
+ol.interaction.Modify.prototype.handlePointerAtPixel_ = function(pixel, map) {
+  var pixelCoordinate = map.getCoordinateFromPixel(pixel);
+  var sortByDistance = function(a, b) {
+    return ol.coordinate.squaredDistanceToSegment(pixelCoordinate, a.segment) -
+        ol.coordinate.squaredDistanceToSegment(pixelCoordinate, b.segment);
+  };
+
+  var lowerLeft = map.getCoordinateFromPixel(
+      [pixel[0] - this.pixelTolerance_, pixel[1] + this.pixelTolerance_]);
+  var upperRight = map.getCoordinateFromPixel(
+      [pixel[0] + this.pixelTolerance_, pixel[1] - this.pixelTolerance_]);
+  var box = ol.extent.boundingExtent([lowerLeft, upperRight]);
+
+  var rBush = this.rBush_;
+  var nodes = rBush.getInExtent(box);
+  if (nodes.length > 0) {
+    nodes.sort(sortByDistance);
+    var node = nodes[0];
+    var closestSegment = node.segment;
+    var vertex = (ol.coordinate.closestOnSegment(pixelCoordinate,
+        closestSegment));
+    var vertexPixel = map.getPixelFromCoordinate(vertex);
+    if (Math.sqrt(ol.coordinate.squaredDistance(pixel, vertexPixel)) <=
+        this.pixelTolerance_) {
+      var pixel1 = map.getPixelFromCoordinate(closestSegment[0]);
+      var pixel2 = map.getPixelFromCoordinate(closestSegment[1]);
+      var squaredDist1 = ol.coordinate.squaredDistance(vertexPixel, pixel1);
+      var squaredDist2 = ol.coordinate.squaredDistance(vertexPixel, pixel2);
+      var dist = Math.sqrt(Math.min(squaredDist1, squaredDist2));
+      this.snappedToVertex_ = dist <= this.pixelTolerance_;
+      if (this.snappedToVertex_) {
+        vertex = squaredDist1 > squaredDist2 ?
+            closestSegment[1] : closestSegment[0];
+      }
+      this.createOrUpdateVertexFeature_(vertex);
+      var vertexSegments = {};
+      vertexSegments[goog.getUid(closestSegment)] = true;
+      var segment;
+      for (var i = 1, ii = nodes.length; i < ii; ++i) {
+        segment = nodes[i].segment;
+        if ((ol.coordinate.equals(closestSegment[0], segment[0]) &&
+            ol.coordinate.equals(closestSegment[1], segment[1]) ||
+            (ol.coordinate.equals(closestSegment[0], segment[1]) &&
+            ol.coordinate.equals(closestSegment[1], segment[0])))) {
+          vertexSegments[goog.getUid(segment)] = true;
+        } else {
+          break;
+        }
+      }
+      this.vertexSegments_ = vertexSegments;
+      return;
+    }
+  }
+  if (!goog.isNull(this.vertexFeature_)) {
+    this.overlay_.removeFeature(this.vertexFeature_);
+    this.vertexFeature_ = null;
+  }
+};
+
+
+/**
+ * @param {ol.interaction.SegmentDataType} segmentData Segment data.
+ * @param {ol.Coordinate} vertex Vertex.
+ * @private
+ */
+ol.interaction.Modify.prototype.insertVertex_ = function(segmentData, vertex) {
+  var segment = segmentData.segment;
+  var feature = segmentData.feature;
+  var geometry = segmentData.geometry;
+  var depth = segmentData.depth;
+  var index = segmentData.index;
+  var coordinates;
+
+  while (vertex.length < geometry.getStride()) {
+    vertex.push(0);
+  }
+
+  switch (geometry.getType()) {
+    case ol.geom.GeometryType.MULTI_LINE_STRING:
+      goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString);
+      coordinates = geometry.getCoordinates();
+      coordinates[depth[0]].splice(index + 1, 0, vertex);
+      break;
+    case ol.geom.GeometryType.POLYGON:
+      goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
+      coordinates = geometry.getCoordinates();
+      coordinates[depth[0]].splice(index + 1, 0, vertex);
+      break;
+    case ol.geom.GeometryType.MULTI_POLYGON:
+      goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon);
+      coordinates = geometry.getCoordinates();
+      coordinates[depth[1]][depth[0]].splice(index + 1, 0, vertex);
+      break;
+    case ol.geom.GeometryType.LINE_STRING:
+      goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+      coordinates = geometry.getCoordinates();
+      coordinates.splice(index + 1, 0, vertex);
+      break;
+    default:
+      return;
+  }
+
+  geometry.setCoordinates(coordinates);
+  var rTree = this.rBush_;
+  goog.asserts.assert(goog.isDef(segment));
+  rTree.remove(segmentData);
+  goog.asserts.assert(goog.isDef(index));
+  this.updateSegmentIndices_(geometry, index, depth, 1);
+  var newSegmentData = /** @type {ol.interaction.SegmentDataType} */ ({
+    segment: [segment[0], vertex],
+    feature: feature,
+    geometry: geometry,
+    depth: depth,
+    index: index
+  });
+  rTree.insert(ol.extent.boundingExtent(newSegmentData.segment),
+      newSegmentData);
+  this.dragSegments_.push([newSegmentData, 1]);
+
+  var newSegmentData2 = /** @type {ol.interaction.SegmentDataType} */ ({
+    segment: [vertex, segment[1]],
+    feature: feature,
+    geometry: geometry,
+    depth: depth,
+    index: index + 1
+  });
+  rTree.insert(ol.extent.boundingExtent(newSegmentData2.segment),
+      newSegmentData2);
+  this.dragSegments_.push([newSegmentData2, 0]);
+};
+
+
+/**
+ * Removes a vertex from all matching features.
+ * @return {boolean} True when a vertex was removed.
+ * @private
+ */
+ol.interaction.Modify.prototype.removeVertex_ = function() {
+  var dragSegments = this.dragSegments_;
+  var segmentsByFeature = {};
+  var deleted = false;
+  var component, coordinates, dragSegment, geometry, i, index, left;
+  var newIndex, newSegment, right, segmentData, uid;
+  for (i = dragSegments.length - 1; i >= 0; --i) {
+    dragSegment = dragSegments[i];
+    segmentData = dragSegment[0];
+    geometry = segmentData.geometry;
+    coordinates = geometry.getCoordinates();
+    uid = goog.getUid(segmentData.feature);
+    left = right = index = undefined;
+    if (dragSegment[1] === 0) {
+      right = segmentData;
+      index = segmentData.index;
+    } else if (dragSegment[1] == 1) {
+      left = segmentData;
+      index = segmentData.index + 1;
+    }
+    if (!(uid in segmentsByFeature)) {
+      segmentsByFeature[uid] = [left, right, index];
+    }
+    newSegment = segmentsByFeature[uid];
+    if (goog.isDef(left)) {
+      newSegment[0] = left;
+    }
+    if (goog.isDef(right)) {
+      newSegment[1] = right;
+    }
+    if (goog.isDef(newSegment[0]) && goog.isDef(newSegment[1])) {
+      component = coordinates;
+      deleted = false;
+      newIndex = index - 1;
+      switch (geometry.getType()) {
+        case ol.geom.GeometryType.MULTI_LINE_STRING:
+          coordinates[segmentData.depth[0]].splice(index, 1);
+          deleted = true;
+          break;
+        case ol.geom.GeometryType.LINE_STRING:
+          coordinates.splice(index, 1);
+          deleted = true;
+          break;
+        case ol.geom.GeometryType.MULTI_POLYGON:
+          component = component[segmentData.depth[1]];
+          /* falls through */
+        case ol.geom.GeometryType.POLYGON:
+          component = component[segmentData.depth[0]];
+          if (component.length > 4) {
+            if (index == component.length - 1) {
+              index = 0;
+            }
+            component.splice(index, 1);
+            deleted = true;
+            if (index === 0) {
+              // close the ring again
+              component.pop();
+              component.push(component[0]);
+              newIndex = component.length - 1;
+            }
+          }
+          break;
+      }
+
+      if (deleted) {
+        this.rBush_.remove(newSegment[0]);
+        this.rBush_.remove(newSegment[1]);
+        geometry.setCoordinates(coordinates);
+        goog.asserts.assert(newIndex >= 0);
+        var newSegmentData = /** @type {ol.interaction.SegmentDataType} */ ({
+          depth: segmentData.depth,
+          feature: segmentData.feature,
+          geometry: segmentData.geometry,
+          index: newIndex,
+          segment: [newSegment[0].segment[0], newSegment[1].segment[1]]
+        });
+        this.rBush_.insert(ol.extent.boundingExtent(newSegmentData.segment),
+            newSegmentData);
+        this.updateSegmentIndices_(geometry, index, segmentData.depth, -1);
+
+        this.overlay_.removeFeature(this.vertexFeature_);
+        this.vertexFeature_ = null;
+      }
+    }
+  }
+  return deleted;
+};
+
+
+/**
+ * @param {ol.geom.SimpleGeometry} geometry Geometry.
+ * @param {number} index Index.
+ * @param {Array.<number>|undefined} depth Depth.
+ * @param {number} delta Delta (1 or -1).
+ * @private
+ */
+ol.interaction.Modify.prototype.updateSegmentIndices_ = function(
+    geometry, index, depth, delta) {
+  this.rBush_.forEachInExtent(geometry.getExtent(), function(segmentDataMatch) {
+    if (segmentDataMatch.geometry === geometry &&
+        (!goog.isDef(depth) ||
+        goog.array.equals(segmentDataMatch.depth, depth)) &&
+        segmentDataMatch.index > index) {
+      segmentDataMatch.index += delta;
+    }
+  });
+};
+
+
+/**
+ * @return {ol.style.StyleFunction} Styles.
+ */
+ol.interaction.Modify.getDefaultStyleFunction = function() {
+  var style = ol.style.createDefaultEditingStyles();
+  return function(feature, resolution) {
+    return style[ol.geom.GeometryType.POINT];
+  };
+};
diff --git a/src/ol/interaction/mousewheelzoominteraction.js b/src/ol/interaction/mousewheelzoominteraction.js
new file mode 100644
index 0000000..547ccb5
--- /dev/null
+++ b/src/ol/interaction/mousewheelzoominteraction.js
@@ -0,0 +1,118 @@
+goog.provide('ol.interaction.MouseWheelZoom');
+
+goog.require('goog.asserts');
+goog.require('goog.events.MouseWheelEvent');
+goog.require('goog.events.MouseWheelHandler.EventType');
+goog.require('goog.math');
+goog.require('ol');
+goog.require('ol.Coordinate');
+goog.require('ol.interaction.Interaction');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to zoom the map by scrolling the mouse wheel.
+ *
+ * @constructor
+ * @extends {ol.interaction.Interaction}
+ * @param {olx.interaction.MouseWheelZoomOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.MouseWheelZoom = function(opt_options) {
+
+  goog.base(this, {
+    handleEvent: ol.interaction.MouseWheelZoom.handleEvent
+  });
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.delta_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.duration_ = goog.isDef(options.duration) ? options.duration : 250;
+
+  /**
+   * @private
+   * @type {?ol.Coordinate}
+   */
+  this.lastAnchor_ = null;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.startTime_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.timeoutId_ = undefined;
+
+};
+goog.inherits(ol.interaction.MouseWheelZoom, ol.interaction.Interaction);
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.MouseWheelZoom}
+ * @api
+ */
+ol.interaction.MouseWheelZoom.handleEvent = function(mapBrowserEvent) {
+  var stopEvent = false;
+  if (mapBrowserEvent.type ==
+      goog.events.MouseWheelHandler.EventType.MOUSEWHEEL) {
+    var map = mapBrowserEvent.map;
+    var mouseWheelEvent = mapBrowserEvent.browserEvent;
+    goog.asserts.assertInstanceof(mouseWheelEvent, goog.events.MouseWheelEvent);
+
+    this.lastAnchor_ = mapBrowserEvent.coordinate;
+    this.delta_ += mouseWheelEvent.deltaY;
+
+    if (!goog.isDef(this.startTime_)) {
+      this.startTime_ = goog.now();
+    }
+
+    var duration = ol.MOUSEWHEELZOOM_TIMEOUT_DURATION;
+    var timeLeft = Math.max(duration - (goog.now() - this.startTime_), 0);
+
+    goog.global.clearTimeout(this.timeoutId_);
+    this.timeoutId_ = goog.global.setTimeout(
+        goog.bind(this.doZoom_, this, map), timeLeft);
+
+    mapBrowserEvent.preventDefault();
+    stopEvent = true;
+  }
+  return !stopEvent;
+};
+
+
+/**
+ * @private
+ * @param {ol.Map} map Map.
+ */
+ol.interaction.MouseWheelZoom.prototype.doZoom_ = function(map) {
+  var maxDelta = ol.MOUSEWHEELZOOM_MAXDELTA;
+  var delta = goog.math.clamp(this.delta_, -maxDelta, maxDelta);
+
+  var view = map.getView();
+  goog.asserts.assert(!goog.isNull(view));
+
+  map.render();
+  ol.interaction.Interaction.zoomByDelta(map, view, -delta, this.lastAnchor_,
+      this.duration_);
+
+  this.delta_ = 0;
+  this.lastAnchor_ = null;
+  this.startTime_ = undefined;
+  this.timeoutId_ = undefined;
+};
diff --git a/src/ol/interaction/pinchrotateinteraction.js b/src/ol/interaction/pinchrotateinteraction.js
new file mode 100644
index 0000000..e1aa2fc
--- /dev/null
+++ b/src/ol/interaction/pinchrotateinteraction.js
@@ -0,0 +1,169 @@
+goog.provide('ol.interaction.PinchRotate');
+
+goog.require('goog.asserts');
+goog.require('goog.style');
+goog.require('ol');
+goog.require('ol.Coordinate');
+goog.require('ol.ViewHint');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.interaction.Pointer');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to rotate the map by twisting with two fingers
+ * on a touch screen.
+ *
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ * @param {olx.interaction.PinchRotateOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.PinchRotate = function(opt_options) {
+
+  goog.base(this, {
+    handleDownEvent: ol.interaction.PinchRotate.handleDownEvent_,
+    handleDragEvent: ol.interaction.PinchRotate.handleDragEvent_,
+    handleUpEvent: ol.interaction.PinchRotate.handleUpEvent_
+  });
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.anchor_ = null;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.lastAngle_ = undefined;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.rotating_ = false;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.rotationDelta_ = 0.0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.threshold_ = goog.isDef(options.threshold) ? options.threshold : 0.3;
+
+};
+goog.inherits(ol.interaction.PinchRotate, ol.interaction.Pointer);
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @this {ol.interaction.PinchRotate}
+ * @private
+ */
+ol.interaction.PinchRotate.handleDragEvent_ = function(mapBrowserEvent) {
+  goog.asserts.assert(this.targetPointers.length >= 2);
+  var rotationDelta = 0.0;
+
+  var touch0 = this.targetPointers[0];
+  var touch1 = this.targetPointers[1];
+
+  // angle between touches
+  var angle = Math.atan2(
+      touch1.clientY - touch0.clientY,
+      touch1.clientX - touch0.clientX);
+
+  if (goog.isDef(this.lastAngle_)) {
+    var delta = angle - this.lastAngle_;
+    this.rotationDelta_ += delta;
+    if (!this.rotating_ &&
+        Math.abs(this.rotationDelta_) > this.threshold_) {
+      this.rotating_ = true;
+    }
+    rotationDelta = delta;
+  }
+  this.lastAngle_ = angle;
+
+  var map = mapBrowserEvent.map;
+
+  // rotate anchor point.
+  // FIXME: should be the intersection point between the lines:
+  //     touch0,touch1 and previousTouch0,previousTouch1
+  var viewportPosition = goog.style.getClientPosition(map.getViewport());
+  var centroid =
+      ol.interaction.Pointer.centroid(this.targetPointers);
+  centroid[0] -= viewportPosition.x;
+  centroid[1] -= viewportPosition.y;
+  this.anchor_ = map.getCoordinateFromPixel(centroid);
+
+  // rotate
+  if (this.rotating_) {
+    var view = map.getView();
+    var viewState = view.getState();
+    map.render();
+    ol.interaction.Interaction.rotateWithoutConstraints(map, view,
+        viewState.rotation + rotationDelta, this.anchor_);
+  }
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Stop drag sequence?
+ * @this {ol.interaction.PinchRotate}
+ * @private
+ */
+ol.interaction.PinchRotate.handleUpEvent_ = function(mapBrowserEvent) {
+  if (this.targetPointers.length < 2) {
+    var map = mapBrowserEvent.map;
+    var view = map.getView();
+    view.setHint(ol.ViewHint.INTERACTING, -1);
+    if (this.rotating_) {
+      var viewState = view.getState();
+      ol.interaction.Interaction.rotate(
+          map, view, viewState.rotation, this.anchor_,
+          ol.ROTATE_ANIMATION_DURATION);
+    }
+    return false;
+  } else {
+    return true;
+  }
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Start drag sequence?
+ * @this {ol.interaction.PinchRotate}
+ * @private
+ */
+ol.interaction.PinchRotate.handleDownEvent_ = function(mapBrowserEvent) {
+  if (this.targetPointers.length >= 2) {
+    var map = mapBrowserEvent.map;
+    this.anchor_ = null;
+    this.lastAngle_ = undefined;
+    this.rotating_ = false;
+    this.rotationDelta_ = 0.0;
+    if (!this.handlingDownUpSequence) {
+      map.getView().setHint(ol.ViewHint.INTERACTING, 1);
+    }
+    map.render();
+    return true;
+  } else {
+    return false;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.PinchRotate.prototype.shouldStopEvent = goog.functions.FALSE;
diff --git a/src/ol/interaction/pinchzoominteraction.js b/src/ol/interaction/pinchzoominteraction.js
new file mode 100644
index 0000000..dbe9fff
--- /dev/null
+++ b/src/ol/interaction/pinchzoominteraction.js
@@ -0,0 +1,158 @@
+goog.provide('ol.interaction.PinchZoom');
+
+goog.require('goog.asserts');
+goog.require('goog.style');
+goog.require('ol.Coordinate');
+goog.require('ol.ViewHint');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.interaction.Pointer');
+
+
+
+/**
+ * @classdesc
+ * Allows the user to zoom the map by pinching with two fingers
+ * on a touch screen.
+ *
+ * @constructor
+ * @extends {ol.interaction.Pointer}
+ * @param {olx.interaction.PinchZoomOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.PinchZoom = function(opt_options) {
+
+  goog.base(this, {
+    handleDownEvent: ol.interaction.PinchZoom.handleDownEvent_,
+    handleDragEvent: ol.interaction.PinchZoom.handleDragEvent_,
+    handleUpEvent: ol.interaction.PinchZoom.handleUpEvent_
+  });
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.anchor_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.duration_ = goog.isDef(options.duration) ? options.duration : 400;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.lastDistance_ = undefined;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.lastScaleDelta_ = 1;
+
+};
+goog.inherits(ol.interaction.PinchZoom, ol.interaction.Pointer);
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @this {ol.interaction.PinchZoom}
+ * @private
+ */
+ol.interaction.PinchZoom.handleDragEvent_ = function(mapBrowserEvent) {
+  goog.asserts.assert(this.targetPointers.length >= 2);
+  var scaleDelta = 1.0;
+
+  var touch0 = this.targetPointers[0];
+  var touch1 = this.targetPointers[1];
+  var dx = touch0.clientX - touch1.clientX;
+  var dy = touch0.clientY - touch1.clientY;
+
+  // distance between touches
+  var distance = Math.sqrt(dx * dx + dy * dy);
+
+  if (goog.isDef(this.lastDistance_)) {
+    scaleDelta = this.lastDistance_ / distance;
+  }
+  this.lastDistance_ = distance;
+  if (scaleDelta != 1.0) {
+    this.lastScaleDelta_ = scaleDelta;
+  }
+
+  var map = mapBrowserEvent.map;
+  var view = map.getView();
+  var viewState = view.getState();
+
+  // scale anchor point.
+  var viewportPosition = goog.style.getClientPosition(map.getViewport());
+  var centroid =
+      ol.interaction.Pointer.centroid(this.targetPointers);
+  centroid[0] -= viewportPosition.x;
+  centroid[1] -= viewportPosition.y;
+  this.anchor_ = map.getCoordinateFromPixel(centroid);
+
+  // scale, bypass the resolution constraint
+  map.render();
+  ol.interaction.Interaction.zoomWithoutConstraints(
+      map, view, viewState.resolution * scaleDelta, this.anchor_);
+
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Stop drag sequence?
+ * @this {ol.interaction.PinchZoom}
+ * @private
+ */
+ol.interaction.PinchZoom.handleUpEvent_ =
+    function(mapBrowserEvent) {
+  if (this.targetPointers.length < 2) {
+    var map = mapBrowserEvent.map;
+    var view = map.getView();
+    view.setHint(ol.ViewHint.INTERACTING, -1);
+    var viewState = view.getState();
+    // Zoom to final resolution, with an animation, and provide a
+    // direction not to zoom out/in if user was pinching in/out.
+    // Direction is > 0 if pinching out, and < 0 if pinching in.
+    var direction = this.lastScaleDelta_ - 1;
+    ol.interaction.Interaction.zoom(map, view, viewState.resolution,
+        this.anchor_, this.duration_, direction);
+    return false;
+  } else {
+    return true;
+  }
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Start drag sequence?
+ * @this {ol.interaction.PinchZoom}
+ * @private
+ */
+ol.interaction.PinchZoom.handleDownEvent_ =
+    function(mapBrowserEvent) {
+  if (this.targetPointers.length >= 2) {
+    var map = mapBrowserEvent.map;
+    this.anchor_ = null;
+    this.lastDistance_ = undefined;
+    this.lastScaleDelta_ = 1;
+    if (!this.handlingDownUpSequence) {
+      map.getView().setHint(ol.ViewHint.INTERACTING, 1);
+    }
+    map.render();
+    return true;
+  } else {
+    return false;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.interaction.PinchZoom.prototype.shouldStopEvent = goog.functions.FALSE;
diff --git a/src/ol/interaction/pointerinteraction.js b/src/ol/interaction/pointerinteraction.js
new file mode 100644
index 0000000..ba730b2
--- /dev/null
+++ b/src/ol/interaction/pointerinteraction.js
@@ -0,0 +1,221 @@
+goog.provide('ol.interaction.Pointer');
+
+goog.require('goog.asserts');
+goog.require('goog.functions');
+goog.require('goog.object');
+goog.require('ol.MapBrowserEvent.EventType');
+goog.require('ol.MapBrowserPointerEvent');
+goog.require('ol.Pixel');
+goog.require('ol.interaction.Interaction');
+
+
+
+/**
+ * @classdesc
+ * Base class that calls user-defined functions on `down`, `move` and `up`
+ * events. This class also manages "drag sequences".
+ *
+ * When the `handleDownEvent` user function returns `true` a drag sequence is
+ * started. During a drag sequence the `handleDragEvent` user function is
+ * called on `move` events. The drag sequence ends when the `handleUpEvent`
+ * user function is called and returns `false`.
+ *
+ * @constructor
+ * @param {olx.interaction.PointerOptions=} opt_options Options.
+ * @extends {ol.interaction.Interaction}
+ * @api
+ */
+ol.interaction.Pointer = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var handleEvent = goog.isDef(options.handleEvent) ?
+      options.handleEvent : ol.interaction.Pointer.handleEvent;
+
+  goog.base(this, {
+    handleEvent: handleEvent
+  });
+
+  /**
+   * @type {function(ol.MapBrowserPointerEvent):boolean}
+   * @private
+   */
+  this.handleDownEvent_ = goog.isDef(options.handleDownEvent) ?
+      options.handleDownEvent : ol.interaction.Pointer.handleDownEvent;
+
+  /**
+   * @type {function(ol.MapBrowserPointerEvent)}
+   * @private
+   */
+  this.handleDragEvent_ = goog.isDef(options.handleDragEvent) ?
+      options.handleDragEvent : ol.interaction.Pointer.handleDragEvent;
+
+  /**
+   * @type {function(ol.MapBrowserPointerEvent)}
+   * @private
+   */
+  this.handleMoveEvent_ = goog.isDef(options.handleMoveEvent) ?
+      options.handleMoveEvent : ol.interaction.Pointer.handleMoveEvent;
+
+  /**
+   * @type {function(ol.MapBrowserPointerEvent):boolean}
+   * @private
+   */
+  this.handleUpEvent_ = goog.isDef(options.handleUpEvent) ?
+      options.handleUpEvent : ol.interaction.Pointer.handleUpEvent;
+
+  /**
+   * @type {boolean}
+   * @protected
+   */
+  this.handlingDownUpSequence = false;
+
+  /**
+   * @type {Object.<number, ol.pointer.PointerEvent>}
+   * @private
+   */
+  this.trackedPointers_ = {};
+
+  /**
+   * @type {Array.<ol.pointer.PointerEvent>}
+   * @protected
+   */
+  this.targetPointers = [];
+
+};
+goog.inherits(ol.interaction.Pointer, ol.interaction.Interaction);
+
+
+/**
+ * @param {Array.<ol.pointer.PointerEvent>} pointerEvents
+ * @return {ol.Pixel} Centroid pixel.
+ */
+ol.interaction.Pointer.centroid = function(pointerEvents) {
+  var length = pointerEvents.length;
+  var clientX = 0;
+  var clientY = 0;
+  for (var i = 0; i < length; i++) {
+    clientX += pointerEvents[i].clientX;
+    clientY += pointerEvents[i].clientY;
+  }
+  return [clientX / length, clientY / length];
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Whether the event is a pointerdown, pointerdrag
+ *     or pointerup event.
+ * @private
+ */
+ol.interaction.Pointer.prototype.isPointerDraggingEvent_ =
+    function(mapBrowserEvent) {
+  var type = mapBrowserEvent.type;
+  return (
+      type === ol.MapBrowserEvent.EventType.POINTERDOWN ||
+      type === ol.MapBrowserEvent.EventType.POINTERDRAG ||
+      type === ol.MapBrowserEvent.EventType.POINTERUP);
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @private
+ */
+ol.interaction.Pointer.prototype.updateTrackedPointers_ =
+    function(mapBrowserEvent) {
+  if (this.isPointerDraggingEvent_(mapBrowserEvent)) {
+    var event = mapBrowserEvent.pointerEvent;
+
+    if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.POINTERUP) {
+      delete this.trackedPointers_[event.pointerId];
+    } else if (mapBrowserEvent.type ==
+        ol.MapBrowserEvent.EventType.POINTERDOWN) {
+      this.trackedPointers_[event.pointerId] = event;
+    } else if (event.pointerId in this.trackedPointers_) {
+      // update only when there was a pointerdown event for this pointer
+      this.trackedPointers_[event.pointerId] = event;
+    }
+    this.targetPointers = goog.object.getValues(this.trackedPointers_);
+  }
+};
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @this {ol.interaction.Pointer}
+ */
+ol.interaction.Pointer.handleDragEvent = goog.nullFunction;
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Capture dragging.
+ * @this {ol.interaction.Pointer}
+ */
+ol.interaction.Pointer.handleUpEvent = goog.functions.FALSE;
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @return {boolean} Capture dragging.
+ * @this {ol.interaction.Pointer}
+ */
+ol.interaction.Pointer.handleDownEvent = goog.functions.FALSE;
+
+
+/**
+ * @param {ol.MapBrowserPointerEvent} mapBrowserEvent Event.
+ * @this {ol.interaction.Pointer}
+ */
+ol.interaction.Pointer.handleMoveEvent = goog.nullFunction;
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.Pointer}
+ * @api
+ */
+ol.interaction.Pointer.handleEvent = function(mapBrowserEvent) {
+  if (!(mapBrowserEvent instanceof ol.MapBrowserPointerEvent)) {
+    return true;
+  }
+
+  var stopEvent = false;
+  this.updateTrackedPointers_(mapBrowserEvent);
+  if (this.handlingDownUpSequence) {
+    if (mapBrowserEvent.type ==
+        ol.MapBrowserEvent.EventType.POINTERDRAG) {
+      this.handleDragEvent_(mapBrowserEvent);
+    } else if (mapBrowserEvent.type ==
+        ol.MapBrowserEvent.EventType.POINTERUP) {
+      this.handlingDownUpSequence =
+          this.handleUpEvent_(mapBrowserEvent);
+    }
+  }
+  if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.POINTERDOWN) {
+    var handled = this.handleDownEvent_(mapBrowserEvent);
+    this.handlingDownUpSequence = handled;
+    stopEvent = this.shouldStopEvent(handled);
+  } else if (mapBrowserEvent.type == ol.MapBrowserEvent.EventType.POINTERMOVE) {
+    this.handleMoveEvent_(mapBrowserEvent);
+  }
+  return !stopEvent;
+};
+
+
+/**
+ * This method is used to determine if "down" events should be propagated to
+ * other interactions or should be stopped.
+ *
+ * The method receives the return code of the "handleDownEvent" function.
+ *
+ * By default this function is the "identity" function. It's overidden in
+ * child classes.
+ *
+ * @param {boolean} handled Was the event handled by the interaction?
+ * @return {boolean} Should the event be stopped?
+ * @protected
+ */
+ol.interaction.Pointer.prototype.shouldStopEvent = goog.functions.identity;
diff --git a/src/ol/interaction/selectinteraction.js b/src/ol/interaction/selectinteraction.js
new file mode 100644
index 0000000..2da26fd
--- /dev/null
+++ b/src/ol/interaction/selectinteraction.js
@@ -0,0 +1,251 @@
+goog.provide('ol.interaction.Select');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.functions');
+goog.require('ol.CollectionEventType');
+goog.require('ol.Feature');
+goog.require('ol.FeatureOverlay');
+goog.require('ol.events.condition');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.style.Style');
+
+
+
+/**
+ * @classdesc
+ * Handles selection of vector data. A {@link ol.FeatureOverlay} is maintained
+ * internally to store the selected feature(s). Which features are selected is
+ * determined by the `condition` option, and optionally the `toggle` or
+ * `add`/`remove` options.
+ *
+ * @constructor
+ * @extends {ol.interaction.Interaction}
+ * @param {olx.interaction.SelectOptions=} opt_options Options.
+ * @api stable
+ */
+ol.interaction.Select = function(opt_options) {
+
+  goog.base(this, {
+    handleEvent: ol.interaction.Select.handleEvent
+  });
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.condition_ = goog.isDef(options.condition) ?
+      options.condition : ol.events.condition.singleClick;
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.addCondition_ = goog.isDef(options.addCondition) ?
+      options.addCondition : ol.events.condition.never;
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.removeCondition_ = goog.isDef(options.removeCondition) ?
+      options.removeCondition : ol.events.condition.never;
+
+  /**
+   * @private
+   * @type {ol.events.ConditionType}
+   */
+  this.toggleCondition_ = goog.isDef(options.toggleCondition) ?
+      options.toggleCondition : ol.events.condition.shiftKeyOnly;
+
+  var layerFilter;
+  if (goog.isDef(options.layers)) {
+    if (goog.isFunction(options.layers)) {
+      layerFilter = options.layers;
+    } else {
+      var layers = options.layers;
+      layerFilter =
+          /**
+           * @param {ol.layer.Layer} layer Layer.
+           * @return {boolean} Include.
+           */
+          function(layer) {
+        return goog.array.contains(layers, layer);
+      };
+    }
+  } else {
+    layerFilter = goog.functions.TRUE;
+  }
+
+  /**
+   * @private
+   * @type {function(ol.layer.Layer): boolean}
+   */
+  this.layerFilter_ = layerFilter;
+
+  /**
+   * @private
+   * @type {ol.FeatureOverlay}
+   */
+  this.featureOverlay_ = new ol.FeatureOverlay({
+    style: goog.isDef(options.style) ? options.style :
+        ol.interaction.Select.getDefaultStyleFunction()
+  });
+
+  var features = this.featureOverlay_.getFeatures();
+  goog.events.listen(features, ol.CollectionEventType.ADD,
+      this.addFeature_, false, this);
+  goog.events.listen(features, ol.CollectionEventType.REMOVE,
+      this.removeFeature_, false, this);
+
+};
+goog.inherits(ol.interaction.Select, ol.interaction.Interaction);
+
+
+/**
+ * Get the selected features.
+ * @return {ol.Collection.<ol.Feature>} Features collection.
+ * @api stable
+ */
+ol.interaction.Select.prototype.getFeatures = function() {
+  return this.featureOverlay_.getFeatures();
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent Map browser event.
+ * @return {boolean} `false` to stop event propagation.
+ * @this {ol.interaction.Select}
+ * @api
+ */
+ol.interaction.Select.handleEvent = function(mapBrowserEvent) {
+  if (!this.condition_(mapBrowserEvent)) {
+    return true;
+  }
+  var add = this.addCondition_(mapBrowserEvent);
+  var remove = this.removeCondition_(mapBrowserEvent);
+  var toggle = this.toggleCondition_(mapBrowserEvent);
+  var set = !add && !remove && !toggle;
+  var map = mapBrowserEvent.map;
+  var features = this.featureOverlay_.getFeatures();
+  if (set) {
+    // Replace the currently selected feature(s) with the feature at the pixel,
+    // or clear the selected feature(s) if there is no feature at the pixel.
+    /** @type {ol.Feature|undefined} */
+    var feature = map.forEachFeatureAtPixel(mapBrowserEvent.pixel,
+        /**
+         * @param {ol.Feature} feature Feature.
+         * @param {ol.layer.Layer} layer Layer.
+         */
+        function(feature, layer) {
+          return feature;
+        }, undefined, this.layerFilter_);
+    if (goog.isDef(feature) &&
+        features.getLength() == 1 &&
+        features.item(0) == feature) {
+      // No change
+    } else {
+      if (features.getLength() !== 0) {
+        features.clear();
+      }
+      if (goog.isDef(feature)) {
+        features.push(feature);
+      }
+    }
+  } else {
+    // Modify the currently selected feature(s).
+    var /** @type {Array.<ol.Feature>} */ deselected = [];
+    var /** @type {Array.<ol.Feature>} */ selected = [];
+    map.forEachFeatureAtPixel(mapBrowserEvent.pixel,
+        /**
+         * @param {ol.Feature} feature Feature.
+         * @param {ol.layer.Layer} layer Layer.
+         */
+        function(feature, layer) {
+          var index = goog.array.indexOf(features.getArray(), feature);
+          if (index == -1) {
+            if (add || toggle) {
+              selected.push(feature);
+            }
+          } else {
+            if (remove || toggle) {
+              deselected.push(feature);
+            }
+          }
+        }, undefined, this.layerFilter_);
+    var i;
+    for (i = deselected.length - 1; i >= 0; --i) {
+      features.remove(deselected[i]);
+    }
+    features.extend(selected);
+  }
+  return ol.events.condition.mouseMove(mapBrowserEvent);
+};
+
+
+/**
+ * Remove the interaction from its current map, if any,  and attach it to a new
+ * map, if any. Pass `null` to just remove the interaction from the current map.
+ * @param {ol.Map} map Map.
+ * @api stable
+ */
+ol.interaction.Select.prototype.setMap = function(map) {
+  var currentMap = this.getMap();
+  var selectedFeatures = this.featureOverlay_.getFeatures();
+  if (!goog.isNull(currentMap)) {
+    selectedFeatures.forEach(currentMap.unskipFeature, currentMap);
+  }
+  goog.base(this, 'setMap', map);
+  this.featureOverlay_.setMap(map);
+  if (!goog.isNull(map)) {
+    selectedFeatures.forEach(map.skipFeature, map);
+  }
+};
+
+
+/**
+ * @return {ol.style.StyleFunction} Styles.
+ */
+ol.interaction.Select.getDefaultStyleFunction = function() {
+  var styles = ol.style.createDefaultEditingStyles();
+  goog.array.extend(styles[ol.geom.GeometryType.POLYGON],
+      styles[ol.geom.GeometryType.LINE_STRING]);
+  goog.array.extend(styles[ol.geom.GeometryType.GEOMETRY_COLLECTION],
+      styles[ol.geom.GeometryType.LINE_STRING]);
+
+  return function(feature, resolution) {
+    return styles[feature.getGeometry().getType()];
+  };
+};
+
+
+/**
+ * @param {ol.CollectionEvent} evt Event.
+ * @private
+ */
+ol.interaction.Select.prototype.addFeature_ = function(evt) {
+  var feature = evt.element;
+  var map = this.getMap();
+  goog.asserts.assertInstanceof(feature, ol.Feature);
+  if (!goog.isNull(map)) {
+    map.skipFeature(feature);
+  }
+};
+
+
+/**
+ * @param {ol.CollectionEvent} evt Event.
+ * @private
+ */
+ol.interaction.Select.prototype.removeFeature_ = function(evt) {
+  var feature = evt.element;
+  var map = this.getMap();
+  goog.asserts.assertInstanceof(feature, ol.Feature);
+  if (!goog.isNull(map)) {
+    map.unskipFeature(feature);
+  }
+};
diff --git a/src/ol/kinetic.js b/src/ol/kinetic.js
new file mode 100644
index 0000000..c4cf3b9
--- /dev/null
+++ b/src/ol/kinetic.js
@@ -0,0 +1,159 @@
+goog.provide('ol.Kinetic');
+
+goog.require('ol.Coordinate');
+goog.require('ol.PreRenderFunction');
+goog.require('ol.animation');
+
+
+
+/**
+ * @classdesc
+ * Implementation of inertial deceleration for map movement.
+ *
+ * @constructor
+ * @param {number} decay Rate of decay (must be negative).
+ * @param {number} minVelocity Minimum velocity (pixels/millisecond).
+ * @param {number} delay Delay to consider to calculate the kinetic
+ *     initial values (milliseconds).
+ * @struct
+ * @api
+ */
+ol.Kinetic = function(decay, minVelocity, delay) {
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.decay_ = decay;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.minVelocity_ = minVelocity;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.delay_ = delay;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.points_ = [];
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.angle_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.initialVelocity_ = 0;
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.Kinetic.prototype.begin = function() {
+  this.points_.length = 0;
+  this.angle_ = 0;
+  this.initialVelocity_ = 0;
+};
+
+
+/**
+ * @param {number} x X.
+ * @param {number} y Y.
+ */
+ol.Kinetic.prototype.update = function(x, y) {
+  this.points_.push(x, y, goog.now());
+};
+
+
+/**
+ * @return {boolean} Whether we should do kinetic animation.
+ */
+ol.Kinetic.prototype.end = function() {
+  if (this.points_.length < 6) {
+    // at least 2 points are required (i.e. there must be at least 6 elements
+    // in the array)
+    return false;
+  }
+  var delay = goog.now() - this.delay_;
+  var lastIndex = this.points_.length - 3;
+  if (this.points_[lastIndex + 2] < delay) {
+    // the last tracked point is too old, which means that the user stopped
+    // panning before releasing the map
+    return false;
+  }
+
+  // get the first point which still falls into the delay time
+  var firstIndex = lastIndex - 3;
+  while (firstIndex > 0 && this.points_[firstIndex + 2] > delay) {
+    firstIndex -= 3;
+  }
+  var duration = this.points_[lastIndex + 2] - this.points_[firstIndex + 2];
+  var dx = this.points_[lastIndex] - this.points_[firstIndex];
+  var dy = this.points_[lastIndex + 1] - this.points_[firstIndex + 1];
+  this.angle_ = Math.atan2(dy, dx);
+  this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration;
+  return this.initialVelocity_ > this.minVelocity_;
+};
+
+
+/**
+ * @param {ol.Coordinate} source Source coordinate for the animation.
+ * @return {ol.PreRenderFunction} Pre-render function for kinetic animation.
+ */
+ol.Kinetic.prototype.pan = function(source) {
+  var decay = this.decay_;
+  var initialVelocity = this.initialVelocity_;
+  var velocity = this.minVelocity_ - initialVelocity;
+  var duration = this.getDuration_();
+  var easingFunction = (
+      /**
+       * @param {number} t T.
+       * @return {number} Easing.
+       */
+      function(t) {
+        return initialVelocity * (Math.exp((decay * t) * duration) - 1) /
+            velocity;
+      });
+  return ol.animation.pan({
+    source: source,
+    duration: duration,
+    easing: easingFunction
+  });
+};
+
+
+/**
+ * @private
+ * @return {number} Duration of animation (milliseconds).
+ */
+ol.Kinetic.prototype.getDuration_ = function() {
+  return Math.log(this.minVelocity_ / this.initialVelocity_) / this.decay_;
+};
+
+
+/**
+ * @return {number} Total distance travelled (pixels).
+ */
+ol.Kinetic.prototype.getDistance = function() {
+  return (this.minVelocity_ - this.initialVelocity_) / this.decay_;
+};
+
+
+/**
+ * @return {number} Angle of the kinetic panning animation (radians).
+ */
+ol.Kinetic.prototype.getAngle = function() {
+  return this.angle_;
+};
diff --git a/src/ol/layer/heatmaplayer.js b/src/ol/layer/heatmaplayer.js
new file mode 100644
index 0000000..a5970a0
--- /dev/null
+++ b/src/ol/layer/heatmaplayer.js
@@ -0,0 +1,215 @@
+goog.provide('ol.layer.Heatmap');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.math');
+goog.require('ol.Object');
+goog.require('ol.dom');
+goog.require('ol.layer.Vector');
+goog.require('ol.render.EventType');
+goog.require('ol.style.Icon');
+goog.require('ol.style.Style');
+
+
+/**
+ * @enum {string}
+ */
+ol.layer.HeatmapLayerProperty = {
+  GRADIENT: 'gradient'
+};
+
+
+
+/**
+ * @classdesc
+ * Layer for rendering vector data as a heatmap.
+ * Note that any property set in the options is set as a {@link ol.Object}
+ * property on the layer object; for example, setting `title: 'My Title'` in the
+ * options means that `title` is observable, and has get/set accessors.
+ *
+ * @constructor
+ * @extends {ol.layer.Vector}
+ * @fires ol.render.Event
+ * @param {olx.layer.HeatmapOptions=} opt_options Options.
+ * @api
+ */
+ol.layer.Heatmap = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, /** @type {olx.layer.VectorOptions} */ (options));
+
+  /**
+   * @private
+   * @type {Uint8ClampedArray}
+   */
+  this.gradient_ = null;
+
+  goog.events.listen(this,
+      ol.Object.getChangeEventType(ol.layer.HeatmapLayerProperty.GRADIENT),
+      this.handleGradientChanged_, false, this);
+
+  this.setGradient(goog.isDef(options.gradient) ?
+      options.gradient : ol.layer.Heatmap.DEFAULT_GRADIENT);
+
+  var circle = ol.layer.Heatmap.createCircle_(
+      goog.isDef(options.radius) ? options.radius : 8,
+      goog.isDef(options.blur) ? options.blur : 15,
+      goog.isDef(options.shadow) ? options.shadow : 250);
+
+  /**
+   * @type {Array.<Array.<ol.style.Style>>}
+   */
+  var styleCache = new Array(256);
+
+  var weight = goog.isDef(options.weight) ? options.weight : 'weight';
+  var weightFunction;
+  if (goog.isString(weight)) {
+    weightFunction = function(feature) {
+      return feature.get(weight);
+    };
+  } else {
+    weightFunction = weight;
+  }
+  goog.asserts.assert(goog.isFunction(weightFunction));
+
+  this.setStyle(function(feature, resolution) {
+    var weight = weightFunction(feature);
+    var opacity = goog.isDef(weight) ? goog.math.clamp(weight, 0, 1) : 1;
+    // cast to 8 bits
+    var index = (255 * opacity) | 0;
+    var style = styleCache[index];
+    if (!goog.isDef(style)) {
+      style = [
+        new ol.style.Style({
+          image: new ol.style.Icon({
+            opacity: opacity,
+            src: circle
+          })
+        })
+      ];
+      styleCache[index] = style;
+    }
+    return style;
+  });
+
+  // For performance reasons, don't sort the features before rendering.
+  // The render order is not relevant for a heatmap representation.
+  this.setRenderOrder(null);
+
+  goog.events.listen(this, ol.render.EventType.RENDER,
+      this.handleRender_, false, this);
+
+};
+goog.inherits(ol.layer.Heatmap, ol.layer.Vector);
+
+
+/**
+ * @const
+ * @type {Array.<string>}
+ */
+ol.layer.Heatmap.DEFAULT_GRADIENT = ['#00f', '#0ff', '#0f0', '#ff0', '#f00'];
+
+
+/**
+ * @param {Array.<string>} colors
+ * @return {Uint8ClampedArray}
+ * @private
+ */
+ol.layer.Heatmap.createGradient_ = function(colors) {
+  var width = 1;
+  var height = 256;
+  var context = ol.dom.createCanvasContext2D(width, height);
+
+  var gradient = context.createLinearGradient(0, 0, width, height);
+  var step = 1 / (colors.length - 1);
+  for (var i = 0, ii = colors.length; i < ii; ++i) {
+    gradient.addColorStop(i * step, colors[i]);
+  }
+
+  context.fillStyle = gradient;
+  context.fillRect(0, 0, width, height);
+
+  return context.getImageData(0, 0, width, height).data;
+};
+
+
+/**
+ * @param {number} radius Radius size in pixel.
+ * @param {number} blur Blur size in pixel.
+ * @param {number} shadow Shadow offset size in pixel.
+ * @return {string}
+ * @private
+ */
+ol.layer.Heatmap.createCircle_ = function(radius, blur, shadow) {
+  var halfSize = radius + blur + 1;
+  var size = 2 * halfSize;
+  var context = ol.dom.createCanvasContext2D(size, size);
+  context.shadowOffsetX = context.shadowOffsetY = shadow;
+  context.shadowBlur = blur;
+  context.shadowColor = '#000';
+  context.beginPath();
+  var center = halfSize - shadow;
+  context.arc(center, center, radius, 0, Math.PI * 2, true);
+  context.fill();
+  return context.canvas.toDataURL();
+};
+
+
+/**
+ * @return {Array.<string>} Colors.
+ * @api
+ * @observable
+ */
+ol.layer.Heatmap.prototype.getGradient = function() {
+  return /** @type {Array.<string>} */ (
+      this.get(ol.layer.HeatmapLayerProperty.GRADIENT));
+};
+goog.exportProperty(
+    ol.layer.Heatmap.prototype,
+    'getGradient',
+    ol.layer.Heatmap.prototype.getGradient);
+
+
+/**
+ * @private
+ */
+ol.layer.Heatmap.prototype.handleGradientChanged_ = function() {
+  this.gradient_ = ol.layer.Heatmap.createGradient_(this.getGradient());
+};
+
+
+/**
+ * @param {ol.render.Event} event Post compose event
+ * @private
+ */
+ol.layer.Heatmap.prototype.handleRender_ = function(event) {
+  goog.asserts.assert(event.type == ol.render.EventType.RENDER);
+  var context = event.context;
+  var canvas = context.canvas;
+  var image = context.getImageData(0, 0, canvas.width, canvas.height);
+  var view8 = image.data;
+  var i, ii, alpha, offset;
+  for (i = 0, ii = view8.length; i < ii; i += 4) {
+    alpha = view8[i + 3] * 4;
+    if (alpha) {
+      view8[i] = this.gradient_[alpha];
+      view8[i + 1] = this.gradient_[alpha + 1];
+      view8[i + 2] = this.gradient_[alpha + 2];
+    }
+  }
+  context.putImageData(image, 0, 0);
+};
+
+
+/**
+ * @param {Array.<string>} colors Gradient.
+ * @api
+ * @observable
+ */
+ol.layer.Heatmap.prototype.setGradient = function(colors) {
+  this.set(ol.layer.HeatmapLayerProperty.GRADIENT, colors);
+};
+goog.exportProperty(
+    ol.layer.Heatmap.prototype,
+    'setGradient',
+    ol.layer.Heatmap.prototype.setGradient);
diff --git a/src/ol/layer/imagelayer.js b/src/ol/layer/imagelayer.js
new file mode 100644
index 0000000..f4b3a23
--- /dev/null
+++ b/src/ol/layer/imagelayer.js
@@ -0,0 +1,33 @@
+goog.provide('ol.layer.Image');
+
+goog.require('ol.layer.Layer');
+
+
+
+/**
+ * @classdesc
+ * Server-rendered images that are available for arbitrary extents and
+ * resolutions.
+ * Note that any property set in the options is set as a {@link ol.Object}
+ * property on the layer object; for example, setting `title: 'My Title'` in the
+ * options means that `title` is observable, and has get/set accessors.
+ *
+ * @constructor
+ * @extends {ol.layer.Layer}
+ * @fires ol.render.Event
+ * @param {olx.layer.ImageOptions=} opt_options Layer options.
+ * @api stable
+ */
+ol.layer.Image = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+  goog.base(this,  /** @type {olx.layer.LayerOptions} */ (options));
+};
+goog.inherits(ol.layer.Image, ol.layer.Layer);
+
+
+/**
+ * @function
+ * @return {ol.source.Image} Source.
+ * @api stable
+ */
+ol.layer.Image.prototype.getSource;
diff --git a/src/ol/layer/layer.js b/src/ol/layer/layer.js
new file mode 100644
index 0000000..6ad78fa
--- /dev/null
+++ b/src/ol/layer/layer.js
@@ -0,0 +1,149 @@
+goog.provide('ol.layer.Layer');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol.Object');
+goog.require('ol.layer.Base');
+goog.require('ol.layer.LayerProperty');
+goog.require('ol.source.State');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * A visual representation of raster or vector map data.
+ * Layers group together those properties that pertain to how the data is to be
+ * displayed, irrespective of the source of that data.
+ *
+ * @constructor
+ * @extends {ol.layer.Base}
+ * @fires ol.render.Event
+ * @fires change Triggered when the state of the source changes.
+ * @param {olx.layer.LayerOptions} options Layer options.
+ * @api stable
+ */
+ol.layer.Layer = function(options) {
+
+  var baseOptions = goog.object.clone(options);
+  delete baseOptions.source;
+
+  goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions));
+
+  /**
+   * @private
+   * @type {goog.events.Key}
+   */
+  this.sourceChangeKey_ = null;
+
+  goog.events.listen(this,
+      ol.Object.getChangeEventType(ol.layer.LayerProperty.SOURCE),
+      this.handleSourcePropertyChange_, false, this);
+
+  var source = goog.isDef(options.source) ? options.source : null;
+  this.setSource(source);
+};
+goog.inherits(ol.layer.Layer, ol.layer.Base);
+
+
+/**
+ * Return `true` if the layer is visible, and if the passed resolution is
+ * between the layer's minResolution and maxResolution. The comparison is
+ * inclusive for `minResolution` and exclusive for `maxResolution`.
+ * @param {ol.layer.LayerState} layerState Layer state.
+ * @param {number} resolution Resolution.
+ * @return {boolean} The layer is visible at the given resolution.
+ */
+ol.layer.Layer.visibleAtResolution = function(layerState, resolution) {
+  return layerState.visible && resolution >= layerState.minResolution &&
+      resolution < layerState.maxResolution;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.layer.Layer.prototype.getLayersArray = function(opt_array) {
+  var array = goog.isDef(opt_array) ? opt_array : [];
+  array.push(this);
+  return array;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.layer.Layer.prototype.getLayerStatesArray = function(opt_states) {
+  var states = goog.isDef(opt_states) ? opt_states : [];
+  states.push(this.getLayerState());
+  return states;
+};
+
+
+/**
+ * Get the layer source.
+ * @return {ol.source.Source} The layer source (or `null` if not yet set).
+ * @observable
+ * @api stable
+ */
+ol.layer.Layer.prototype.getSource = function() {
+  var source = this.get(ol.layer.LayerProperty.SOURCE);
+  return goog.isDef(source) ?
+      /** @type {ol.source.Source} */ (source) : null;
+};
+goog.exportProperty(
+    ol.layer.Layer.prototype,
+    'getSource',
+    ol.layer.Layer.prototype.getSource);
+
+
+/**
+  * @inheritDoc
+  */
+ol.layer.Layer.prototype.getSourceState = function() {
+  var source = this.getSource();
+  return goog.isNull(source) ? ol.source.State.UNDEFINED : source.getState();
+};
+
+
+/**
+ * @private
+ */
+ol.layer.Layer.prototype.handleSourceChange_ = function() {
+  this.changed();
+};
+
+
+/**
+ * @private
+ */
+ol.layer.Layer.prototype.handleSourcePropertyChange_ = function() {
+  if (!goog.isNull(this.sourceChangeKey_)) {
+    goog.events.unlistenByKey(this.sourceChangeKey_);
+    this.sourceChangeKey_ = null;
+  }
+  var source = this.getSource();
+  if (!goog.isNull(source)) {
+    this.sourceChangeKey_ = goog.events.listen(source,
+        goog.events.EventType.CHANGE, this.handleSourceChange_, false, this);
+  }
+  this.changed();
+};
+
+
+/**
+ * Set the layer source.
+ * @param {ol.source.Source} source The layer source.
+ * @observable
+ * @api stable
+ */
+ol.layer.Layer.prototype.setSource = function(source) {
+  this.set(ol.layer.LayerProperty.SOURCE, source);
+};
+goog.exportProperty(
+    ol.layer.Layer.prototype,
+    'setSource',
+    ol.layer.Layer.prototype.setSource);
diff --git a/src/ol/layer/layer.jsdoc b/src/ol/layer/layer.jsdoc
new file mode 100644
index 0000000..29e9851
--- /dev/null
+++ b/src/ol/layer/layer.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.layer
+ */
diff --git a/src/ol/layer/layerbase.js b/src/ol/layer/layerbase.js
new file mode 100644
index 0000000..a7722e8
--- /dev/null
+++ b/src/ol/layer/layerbase.js
@@ -0,0 +1,428 @@
+goog.provide('ol.layer.Base');
+goog.provide('ol.layer.LayerProperty');
+goog.provide('ol.layer.LayerState');
+
+goog.require('goog.events');
+goog.require('goog.math');
+goog.require('goog.object');
+goog.require('ol.Object');
+goog.require('ol.source.State');
+
+
+/**
+ * @enum {string}
+ */
+ol.layer.LayerProperty = {
+  BRIGHTNESS: 'brightness',
+  CONTRAST: 'contrast',
+  HUE: 'hue',
+  OPACITY: 'opacity',
+  SATURATION: 'saturation',
+  VISIBLE: 'visible',
+  EXTENT: 'extent',
+  MAX_RESOLUTION: 'maxResolution',
+  MIN_RESOLUTION: 'minResolution',
+  SOURCE: 'source'
+};
+
+
+/**
+ * @typedef {{layer: ol.layer.Layer,
+ *            brightness: number,
+ *            contrast: number,
+ *            hue: number,
+ *            opacity: number,
+ *            saturation: number,
+ *            sourceState: ol.source.State,
+ *            visible: boolean,
+ *            extent: (ol.Extent|undefined),
+ *            maxResolution: number,
+ *            minResolution: number}}
+ */
+ol.layer.LayerState;
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Note that with `ol.layer.Base` and all its subclasses, any property set in
+ * the options is set as a {@link ol.Object} property on the layer object, so
+ * is observable, and has get/set accessors.
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @param {olx.layer.BaseOptions} options Layer options.
+ * @api stable
+ */
+ol.layer.Base = function(options) {
+
+  goog.base(this);
+
+  /**
+   * @type {Object.<string, *>}
+   */
+  var properties = goog.object.clone(options);
+  properties[ol.layer.LayerProperty.BRIGHTNESS] =
+      goog.isDef(options.brightness) ? options.brightness : 0;
+  properties[ol.layer.LayerProperty.CONTRAST] =
+      goog.isDef(options.contrast) ? options.contrast : 1;
+  properties[ol.layer.LayerProperty.HUE] =
+      goog.isDef(options.hue) ? options.hue : 0;
+  properties[ol.layer.LayerProperty.OPACITY] =
+      goog.isDef(options.opacity) ? options.opacity : 1;
+  properties[ol.layer.LayerProperty.SATURATION] =
+      goog.isDef(options.saturation) ? options.saturation : 1;
+  properties[ol.layer.LayerProperty.VISIBLE] =
+      goog.isDef(options.visible) ? options.visible : true;
+  properties[ol.layer.LayerProperty.MAX_RESOLUTION] =
+      goog.isDef(options.maxResolution) ? options.maxResolution : Infinity;
+  properties[ol.layer.LayerProperty.MIN_RESOLUTION] =
+      goog.isDef(options.minResolution) ? options.minResolution : 0;
+
+  this.setProperties(properties);
+};
+goog.inherits(ol.layer.Base, ol.Object);
+
+
+/**
+ * @return {number|undefined} The brightness of the layer.
+ * @observable
+ * @api
+ */
+ol.layer.Base.prototype.getBrightness = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.layer.LayerProperty.BRIGHTNESS));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getBrightness',
+    ol.layer.Base.prototype.getBrightness);
+
+
+/**
+ * @return {number|undefined} The contrast of the layer.
+ * @observable
+ * @api
+ */
+ol.layer.Base.prototype.getContrast = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.layer.LayerProperty.CONTRAST));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getContrast',
+    ol.layer.Base.prototype.getContrast);
+
+
+/**
+ * @return {number|undefined} The hue of the layer.
+ * @observable
+ * @api
+ */
+ol.layer.Base.prototype.getHue = function() {
+  return /** @type {number|undefined} */ (this.get(ol.layer.LayerProperty.HUE));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getHue',
+    ol.layer.Base.prototype.getHue);
+
+
+/**
+ * @return {ol.layer.LayerState} Layer state.
+ */
+ol.layer.Base.prototype.getLayerState = function() {
+  var brightness = this.getBrightness();
+  var contrast = this.getContrast();
+  var hue = this.getHue();
+  var opacity = this.getOpacity();
+  var saturation = this.getSaturation();
+  var sourceState = this.getSourceState();
+  var visible = this.getVisible();
+  var extent = this.getExtent();
+  var maxResolution = this.getMaxResolution();
+  var minResolution = this.getMinResolution();
+  return {
+    layer: /** @type {ol.layer.Layer} */ (this),
+    brightness: goog.isDef(brightness) ? goog.math.clamp(brightness, -1, 1) : 0,
+    contrast: goog.isDef(contrast) ? Math.max(contrast, 0) : 1,
+    hue: goog.isDef(hue) ? hue : 0,
+    opacity: goog.isDef(opacity) ? goog.math.clamp(opacity, 0, 1) : 1,
+    saturation: goog.isDef(saturation) ? Math.max(saturation, 0) : 1,
+    sourceState: sourceState,
+    visible: goog.isDef(visible) ? !!visible : true,
+    extent: extent,
+    maxResolution: goog.isDef(maxResolution) ? maxResolution : Infinity,
+    minResolution: goog.isDef(minResolution) ? Math.max(minResolution, 0) : 0
+  };
+};
+
+
+/**
+ * @param {Array.<ol.layer.Layer>=} opt_array Array of layers (to be
+ *     modified in place).
+ * @return {Array.<ol.layer.Layer>} Array of layers.
+ */
+ol.layer.Base.prototype.getLayersArray = goog.abstractMethod;
+
+
+/**
+ * @param {Array.<ol.layer.LayerState>=} opt_states Optional list of layer
+ *     states (to be modified in place).
+ * @return {Array.<ol.layer.LayerState>} List of layer states.
+ */
+ol.layer.Base.prototype.getLayerStatesArray = goog.abstractMethod;
+
+
+/**
+ * @return {ol.Extent|undefined} The layer extent.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.getExtent = function() {
+  return /** @type {ol.Extent|undefined} */ (
+      this.get(ol.layer.LayerProperty.EXTENT));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getExtent',
+    ol.layer.Base.prototype.getExtent);
+
+
+/**
+ * @return {number|undefined} The maximum resolution of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.getMaxResolution = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.layer.LayerProperty.MAX_RESOLUTION));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getMaxResolution',
+    ol.layer.Base.prototype.getMaxResolution);
+
+
+/**
+ * @return {number|undefined} The minimum resolution of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.getMinResolution = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.layer.LayerProperty.MIN_RESOLUTION));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getMinResolution',
+    ol.layer.Base.prototype.getMinResolution);
+
+
+/**
+ * @return {number|undefined} The opacity of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.getOpacity = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.layer.LayerProperty.OPACITY));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getOpacity',
+    ol.layer.Base.prototype.getOpacity);
+
+
+/**
+ * @return {number|undefined} The saturation of the layer.
+ * @observable
+ * @api
+ */
+ol.layer.Base.prototype.getSaturation = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.layer.LayerProperty.SATURATION));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getSaturation',
+    ol.layer.Base.prototype.getSaturation);
+
+
+/**
+ * @return {ol.source.State} Source state.
+ */
+ol.layer.Base.prototype.getSourceState = goog.abstractMethod;
+
+
+/**
+ * @return {boolean|undefined} The visiblity of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.getVisible = function() {
+  return /** @type {boolean|undefined} */ (
+      this.get(ol.layer.LayerProperty.VISIBLE));
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'getVisible',
+    ol.layer.Base.prototype.getVisible);
+
+
+/**
+ * Adjust the layer brightness.  A value of -1 will render the layer completely
+ * black.  A value of 0 will leave the brightness unchanged.  A value of 1 will
+ * render the layer completely white.  Other values are linear multipliers on
+ * the effect (values are clamped between -1 and 1).
+ *
+ * The filter effects draft [1] says the brightness function is supposed to
+ * render 0 black, 1 unchanged, and all other values as a linear multiplier.
+ *
+ * The current WebKit implementation clamps values between -1 (black) and 1
+ * (white) [2].  There is a bug open to change the filter effect spec [3].
+ *
+ * TODO: revisit this if the spec is still unmodified before we release
+ *
+ * [1] https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html
+ * [2] https://github.com/WebKit/webkit/commit/8f4765e569
+ * [3] https://www.w3.org/Bugs/Public/show_bug.cgi?id=15647
+ *
+ * @param {number|undefined} brightness The brightness of the layer.
+ * @observable
+ * @api
+ */
+ol.layer.Base.prototype.setBrightness = function(brightness) {
+  this.set(ol.layer.LayerProperty.BRIGHTNESS, brightness);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setBrightness',
+    ol.layer.Base.prototype.setBrightness);
+
+
+/**
+ * Adjust the layer contrast.  A value of 0 will render the layer completely
+ * grey.  A value of 1 will leave the contrast unchanged.  Other values are
+ * linear multipliers on the effect (and values over 1 are permitted).
+ *
+ * @param {number|undefined} contrast The contrast of the layer.
+ * @observable
+ * @api
+ */
+ol.layer.Base.prototype.setContrast = function(contrast) {
+  this.set(ol.layer.LayerProperty.CONTRAST, contrast);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setContrast',
+    ol.layer.Base.prototype.setContrast);
+
+
+/**
+ * Apply a hue-rotation to the layer.  A value of 0 will leave the hue
+ * unchanged.  Other values are radians around the color circle.
+ * @param {number|undefined} hue The hue of the layer.
+ * @observable
+ * @api
+ */
+ol.layer.Base.prototype.setHue = function(hue) {
+  this.set(ol.layer.LayerProperty.HUE, hue);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setHue',
+    ol.layer.Base.prototype.setHue);
+
+
+/**
+ * Set the extent at which the layer is visible.  If `undefined`, the layer
+ * will be visible at all extents.
+ * @param {ol.Extent|undefined} extent The extent of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.setExtent = function(extent) {
+  this.set(ol.layer.LayerProperty.EXTENT, extent);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setExtent',
+    ol.layer.Base.prototype.setExtent);
+
+
+/**
+ * @param {number|undefined} maxResolution The maximum resolution of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.setMaxResolution = function(maxResolution) {
+  this.set(ol.layer.LayerProperty.MAX_RESOLUTION, maxResolution);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setMaxResolution',
+    ol.layer.Base.prototype.setMaxResolution);
+
+
+/**
+ * @param {number|undefined} minResolution The minimum resolution of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.setMinResolution = function(minResolution) {
+  this.set(ol.layer.LayerProperty.MIN_RESOLUTION, minResolution);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setMinResolution',
+    ol.layer.Base.prototype.setMinResolution);
+
+
+/**
+ * @param {number|undefined} opacity The opacity of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.setOpacity = function(opacity) {
+  this.set(ol.layer.LayerProperty.OPACITY, opacity);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setOpacity',
+    ol.layer.Base.prototype.setOpacity);
+
+
+/**
+ * Adjust layer saturation.  A value of 0 will render the layer completely
+ * unsaturated.  A value of 1 will leave the saturation unchanged.  Other
+ * values are linear multipliers of the effect (and values over 1 are
+ * permitted).
+ *
+ * @param {number|undefined} saturation The saturation of the layer.
+ * @observable
+ * @api
+ */
+ol.layer.Base.prototype.setSaturation = function(saturation) {
+  this.set(ol.layer.LayerProperty.SATURATION, saturation);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setSaturation',
+    ol.layer.Base.prototype.setSaturation);
+
+
+/**
+ * @param {boolean|undefined} visible The visiblity of the layer.
+ * @observable
+ * @api stable
+ */
+ol.layer.Base.prototype.setVisible = function(visible) {
+  this.set(ol.layer.LayerProperty.VISIBLE, visible);
+};
+goog.exportProperty(
+    ol.layer.Base.prototype,
+    'setVisible',
+    ol.layer.Base.prototype.setVisible);
diff --git a/src/ol/layer/layergroup.js b/src/ol/layer/layergroup.js
new file mode 100644
index 0000000..dcb420f
--- /dev/null
+++ b/src/ol/layer/layergroup.js
@@ -0,0 +1,236 @@
+goog.provide('ol.layer.Group');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.math');
+goog.require('goog.object');
+goog.require('ol.Collection');
+goog.require('ol.CollectionEvent');
+goog.require('ol.CollectionEventType');
+goog.require('ol.Object');
+goog.require('ol.ObjectEventType');
+goog.require('ol.extent');
+goog.require('ol.layer.Base');
+goog.require('ol.source.State');
+
+
+/**
+ * @enum {string}
+ */
+ol.layer.GroupProperty = {
+  LAYERS: 'layers'
+};
+
+
+
+/**
+ * @classdesc
+ * A {@link ol.Collection} of layers that are handled together.
+ *
+ * @constructor
+ * @extends {ol.layer.Base}
+ * @fires change Triggered when the group/Collection changes.
+ * @param {olx.layer.GroupOptions=} opt_options Layer options.
+ * @api stable
+ */
+ol.layer.Group = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+  var baseOptions = /** @type {olx.layer.GroupOptions} */
+      (goog.object.clone(options));
+  delete baseOptions.layers;
+
+  var layers = options.layers;
+
+  goog.base(this, baseOptions);
+
+  /**
+   * @private
+   * @type {Object.<string, goog.events.Key>}
+   */
+  this.listenerKeys_ = null;
+
+  goog.events.listen(this,
+      ol.Object.getChangeEventType(ol.layer.GroupProperty.LAYERS),
+      this.handleLayersChanged_, false, this);
+
+  if (goog.isDefAndNotNull(layers)) {
+    if (goog.isArray(layers)) {
+      layers = new ol.Collection(goog.array.clone(layers));
+    } else {
+      goog.asserts.assertInstanceof(layers, ol.Collection);
+      layers = layers;
+    }
+  } else {
+    layers = new ol.Collection();
+  }
+
+  this.setLayers(layers);
+
+};
+goog.inherits(ol.layer.Group, ol.layer.Base);
+
+
+/**
+ * @private
+ */
+ol.layer.Group.prototype.handleLayerChange_ = function() {
+  if (this.getVisible()) {
+    this.changed();
+  }
+};
+
+
+/**
+ * @param {goog.events.Event} event Event.
+ * @private
+ */
+ol.layer.Group.prototype.handleLayersChanged_ = function(event) {
+  if (!goog.isNull(this.listenerKeys_)) {
+    goog.array.forEach(
+        goog.object.getValues(this.listenerKeys_), goog.events.unlistenByKey);
+    this.listenerKeys_ = null;
+  }
+
+  var layers = this.getLayers();
+  if (goog.isDefAndNotNull(layers)) {
+    this.listenerKeys_ = {
+      'add': goog.events.listen(layers, ol.CollectionEventType.ADD,
+          this.handleLayersAdd_, false, this),
+      'remove': goog.events.listen(layers, ol.CollectionEventType.REMOVE,
+          this.handleLayersRemove_, false, this)
+    };
+
+    var layersArray = layers.getArray();
+    var i, ii, layer;
+    for (i = 0, ii = layersArray.length; i < ii; i++) {
+      layer = layersArray[i];
+      this.listenerKeys_[goog.getUid(layer).toString()] =
+          goog.events.listen(layer,
+              [ol.ObjectEventType.PROPERTYCHANGE, goog.events.EventType.CHANGE],
+              this.handleLayerChange_, false, this);
+    }
+  }
+
+  this.changed();
+};
+
+
+/**
+ * @param {ol.CollectionEvent} collectionEvent Collection event.
+ * @private
+ */
+ol.layer.Group.prototype.handleLayersAdd_ = function(collectionEvent) {
+  var layer = /** @type {ol.layer.Base} */ (collectionEvent.element);
+  this.listenerKeys_[goog.getUid(layer).toString()] = goog.events.listen(
+      layer, [ol.ObjectEventType.PROPERTYCHANGE, goog.events.EventType.CHANGE],
+      this.handleLayerChange_, false, this);
+  this.changed();
+};
+
+
+/**
+ * @param {ol.CollectionEvent} collectionEvent Collection event.
+ * @private
+ */
+ol.layer.Group.prototype.handleLayersRemove_ = function(collectionEvent) {
+  var layer = /** @type {ol.layer.Base} */ (collectionEvent.element);
+  var key = goog.getUid(layer).toString();
+  goog.events.unlistenByKey(this.listenerKeys_[key]);
+  delete this.listenerKeys_[key];
+  this.changed();
+};
+
+
+/**
+ * @return {!ol.Collection.<ol.layer.Base>} Collection of
+ * {@link ol.layer.Layer layers} that are part of this group.
+ * @observable
+ * @api stable
+ */
+ol.layer.Group.prototype.getLayers = function() {
+  return /** @type {!ol.Collection.<ol.layer.Base>} */ (this.get(
+      ol.layer.GroupProperty.LAYERS));
+};
+goog.exportProperty(
+    ol.layer.Group.prototype,
+    'getLayers',
+    ol.layer.Group.prototype.getLayers);
+
+
+/**
+ * @param {!ol.Collection.<ol.layer.Base>} layers Collection of
+ * {@link ol.layer.Layer layers} that are part of this group.
+ * @observable
+ * @api stable
+ */
+ol.layer.Group.prototype.setLayers = function(layers) {
+  this.set(ol.layer.GroupProperty.LAYERS, layers);
+};
+goog.exportProperty(
+    ol.layer.Group.prototype,
+    'setLayers',
+    ol.layer.Group.prototype.setLayers);
+
+
+/**
+ * @inheritDoc
+ */
+ol.layer.Group.prototype.getLayersArray = function(opt_array) {
+  var array = goog.isDef(opt_array) ? opt_array : [];
+  this.getLayers().forEach(function(layer) {
+    layer.getLayersArray(array);
+  });
+  return array;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.layer.Group.prototype.getLayerStatesArray = function(opt_states) {
+  var states = goog.isDef(opt_states) ? opt_states : [];
+
+  var pos = states.length;
+
+  this.getLayers().forEach(function(layer) {
+    layer.getLayerStatesArray(states);
+  });
+
+  var ownLayerState = this.getLayerState();
+  var i, ii, layerState;
+  for (i = pos, ii = states.length; i < ii; i++) {
+    layerState = states[i];
+    layerState.brightness = goog.math.clamp(
+        layerState.brightness + ownLayerState.brightness, -1, 1);
+    layerState.contrast *= ownLayerState.contrast;
+    layerState.hue += ownLayerState.hue;
+    layerState.opacity *= ownLayerState.opacity;
+    layerState.saturation *= ownLayerState.saturation;
+    layerState.visible = layerState.visible && ownLayerState.visible;
+    layerState.maxResolution = Math.min(
+        layerState.maxResolution, ownLayerState.maxResolution);
+    layerState.minResolution = Math.max(
+        layerState.minResolution, ownLayerState.minResolution);
+    if (goog.isDef(ownLayerState.extent)) {
+      if (goog.isDef(layerState.extent)) {
+        layerState.extent = ol.extent.getIntersection(
+            layerState.extent, ownLayerState.extent);
+      } else {
+        layerState.extent = ownLayerState.extent;
+      }
+    }
+  }
+
+  return states;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.layer.Group.prototype.getSourceState = function() {
+  return ol.source.State.READY;
+};
diff --git a/src/ol/layer/tilelayer.js b/src/ol/layer/tilelayer.js
new file mode 100644
index 0000000..9aa70cf
--- /dev/null
+++ b/src/ol/layer/tilelayer.js
@@ -0,0 +1,102 @@
+goog.provide('ol.layer.Tile');
+
+goog.require('ol.layer.Layer');
+
+
+/**
+ * @enum {string}
+ */
+ol.layer.TileProperty = {
+  PRELOAD: 'preload',
+  USE_INTERIM_TILES_ON_ERROR: 'useInterimTilesOnError'
+};
+
+
+
+/**
+ * @classdesc
+ * For layer sources that provide pre-rendered, tiled images in grids that are
+ * organized by zoom levels for specific resolutions.
+ * Note that any property set in the options is set as a {@link ol.Object}
+ * property on the layer object; for example, setting `title: 'My Title'` in the
+ * options means that `title` is observable, and has get/set accessors.
+ *
+ * @constructor
+ * @extends {ol.layer.Layer}
+ * @fires ol.render.Event
+ * @param {olx.layer.TileOptions=} opt_options Tile layer options.
+ * @api stable
+ */
+ol.layer.Tile = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+  goog.base(this,  /** @type {olx.layer.LayerOptions} */ (options));
+};
+goog.inherits(ol.layer.Tile, ol.layer.Layer);
+
+
+/**
+ * @return {number|undefined} The level to preload tiles up to.
+ * @observable
+ * @api
+ */
+ol.layer.Tile.prototype.getPreload = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.layer.TileProperty.PRELOAD));
+};
+goog.exportProperty(
+    ol.layer.Tile.prototype,
+    'getPreload',
+    ol.layer.Tile.prototype.getPreload);
+
+
+/**
+ * @function
+ * @return {ol.source.Tile} Source.
+ * @api stable
+ */
+ol.layer.Tile.prototype.getSource;
+
+
+/**
+ * @param {number} preload The level to preload tiles up to.
+ * @observable
+ * @api
+ */
+ol.layer.Tile.prototype.setPreload = function(preload) {
+  this.set(ol.layer.TileProperty.PRELOAD, preload);
+};
+goog.exportProperty(
+    ol.layer.Tile.prototype,
+    'setPreload',
+    ol.layer.Tile.prototype.setPreload);
+
+
+/**
+ * @return {boolean|undefined} Use interim tiles on error.
+ * @observable
+ * @api
+ */
+ol.layer.Tile.prototype.getUseInterimTilesOnError = function() {
+  return /** @type {boolean|undefined} */ (
+      this.get(ol.layer.TileProperty.USE_INTERIM_TILES_ON_ERROR));
+};
+goog.exportProperty(
+    ol.layer.Tile.prototype,
+    'getUseInterimTilesOnError',
+    ol.layer.Tile.prototype.getUseInterimTilesOnError);
+
+
+/**
+ * @param {boolean|undefined} useInterimTilesOnError Use interim tiles on error.
+ * @observable
+ * @api
+ */
+ol.layer.Tile.prototype.setUseInterimTilesOnError =
+    function(useInterimTilesOnError) {
+  this.set(
+      ol.layer.TileProperty.USE_INTERIM_TILES_ON_ERROR, useInterimTilesOnError);
+};
+goog.exportProperty(
+    ol.layer.Tile.prototype,
+    'setUseInterimTilesOnError',
+    ol.layer.Tile.prototype.setUseInterimTilesOnError);
diff --git a/src/ol/layer/vectorlayer.js b/src/ol/layer/vectorlayer.js
new file mode 100644
index 0000000..025f76e
--- /dev/null
+++ b/src/ol/layer/vectorlayer.js
@@ -0,0 +1,140 @@
+goog.provide('ol.layer.Vector');
+
+goog.require('goog.object');
+goog.require('ol.layer.Layer');
+goog.require('ol.style.Style');
+
+
+/**
+ * @enum {string}
+ */
+ol.layer.VectorProperty = {
+  RENDER_ORDER: 'renderOrder'
+};
+
+
+
+/**
+ * @classdesc
+ * Vector data that is rendered client-side.
+ * Note that any property set in the options is set as a {@link ol.Object}
+ * property on the layer object; for example, setting `title: 'My Title'` in the
+ * options means that `title` is observable, and has get/set accessors.
+ *
+ * @constructor
+ * @extends {ol.layer.Layer}
+ * @fires ol.render.Event
+ * @param {olx.layer.VectorOptions=} opt_options Options.
+ * @api stable
+ */
+ol.layer.Vector = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ?
+      opt_options : /** @type {olx.layer.VectorOptions} */ ({});
+
+  var baseOptions = goog.object.clone(options);
+
+  delete baseOptions.style;
+  goog.base(this, /** @type {olx.layer.LayerOptions} */ (baseOptions));
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.renderBuffer_ = goog.isDef(options.renderBuffer) ?
+      options.renderBuffer : 100;
+
+  /**
+   * User provided style.
+   * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction}
+   * @private
+   */
+  this.style_ = null;
+
+  /**
+   * Style function for use within the library.
+   * @type {ol.style.StyleFunction|undefined}
+   * @private
+   */
+  this.styleFunction_ = undefined;
+
+  this.setStyle(options.style);
+
+};
+goog.inherits(ol.layer.Vector, ol.layer.Layer);
+
+
+/**
+ * @return {number|undefined} Render buffer.
+ */
+ol.layer.Vector.prototype.getRenderBuffer = function() {
+  return this.renderBuffer_;
+};
+
+
+/**
+ * @return {function(ol.Feature, ol.Feature): number|null|undefined} Render
+ *     order.
+ */
+ol.layer.Vector.prototype.getRenderOrder = function() {
+  return /** @type {function(ol.Feature, ol.Feature):number|null|undefined} */ (
+      this.get(ol.layer.VectorProperty.RENDER_ORDER));
+};
+
+
+/**
+ * @function
+ * @return {ol.source.Vector} Source.
+ * @api stable
+ */
+ol.layer.Vector.prototype.getSource;
+
+
+/**
+ * Get the style for features.  This returns whatever was passed to the `style`
+ * option at construction or to the `setStyle` method.
+ * @return {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction}
+ *     Layer style.
+ * @api stable
+ */
+ol.layer.Vector.prototype.getStyle = function() {
+  return this.style_;
+};
+
+
+/**
+ * Get the style function.
+ * @return {ol.style.StyleFunction|undefined} Layer style function.
+ * @api stable
+ */
+ol.layer.Vector.prototype.getStyleFunction = function() {
+  return this.styleFunction_;
+};
+
+
+/**
+ * @param {function(ol.Feature, ol.Feature):number|null|undefined} renderOrder
+ *     Render order.
+ */
+ol.layer.Vector.prototype.setRenderOrder = function(renderOrder) {
+  this.set(ol.layer.VectorProperty.RENDER_ORDER, renderOrder);
+};
+
+
+/**
+ * Set the style for features.  This can be a single style object, an array
+ * of styles, or a function that takes a feature and resolution and returns
+ * an array of styles. If it is `undefined` the default style is used. If
+ * it is `null` the layer has no style (a `null` style), so only features
+ * that have their own styles will be rendered in the layer. See
+ * {@link ol.style} for information on the default style.
+ * @param {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
+ *     style Layer style.
+ * @api stable
+ */
+ol.layer.Vector.prototype.setStyle = function(style) {
+  this.style_ = goog.isDef(style) ? style : ol.style.defaultStyleFunction;
+  this.styleFunction_ = goog.isNull(style) ?
+      undefined : ol.style.createStyleFunction(this.style_);
+  this.changed();
+};
diff --git a/src/ol/loadingstrategy.js b/src/ol/loadingstrategy.js
new file mode 100644
index 0000000..418fc62
--- /dev/null
+++ b/src/ol/loadingstrategy.js
@@ -0,0 +1,60 @@
+goog.provide('ol.loadingstrategy');
+
+goog.require('ol.TileCoord');
+
+
+/**
+ * Strategy function for loading all features with a single request.
+ * @param {ol.Extent} extent Extent.
+ * @param {number} resolution Resolution.
+ * @return {Array.<ol.Extent>} Extents.
+ * @api
+ */
+ol.loadingstrategy.all = function(extent, resolution) {
+  return [[-Infinity, -Infinity, Infinity, Infinity]];
+};
+
+
+/**
+ * Strategy function for loading features based on the view's extent and
+ * resolution.
+ * @param {ol.Extent} extent Extent.
+ * @param {number} resolution Resolution.
+ * @return {Array.<ol.Extent>} Extents.
+ * @api
+ */
+ol.loadingstrategy.bbox = function(extent, resolution) {
+  return [extent];
+};
+
+
+/**
+ * Creates a strategy function for loading features based on a tile grid.
+ * @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
+ * @return {function(ol.Extent, number): Array.<ol.Extent>} Loading strategy.
+ * @api
+ */
+ol.loadingstrategy.createTile = function(tileGrid) {
+  return (
+      /**
+       * @param {ol.Extent} extent Extent.
+       * @param {number} resolution Resolution.
+       * @return {Array.<ol.Extent>} Extents.
+       */
+      function(extent, resolution) {
+        var z = tileGrid.getZForResolution(resolution);
+        var tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
+        /** @type {Array.<ol.Extent>} */
+        var extents = [];
+        /** @type {ol.TileCoord} */
+        var tileCoord = [z, 0, 0];
+        for (tileCoord[1] = tileRange.minX; tileCoord[1] <= tileRange.maxX;
+             ++tileCoord[1]) {
+          for (tileCoord[2] = tileRange.minY; tileCoord[2] <= tileRange.maxY;
+               ++tileCoord[2]) {
+            extents.push(tileGrid.getTileCoordExtent(tileCoord));
+          }
+        }
+        return extents;
+      });
+};
diff --git a/src/ol/loadingstrategy.jsdoc b/src/ol/loadingstrategy.jsdoc
new file mode 100644
index 0000000..baecef7
--- /dev/null
+++ b/src/ol/loadingstrategy.jsdoc
@@ -0,0 +1,5 @@
+/**
+ * Strategies for loading vector data.
+ * @see ol.source.ServerVector
+ * @namespace ol.loadingstrategy
+ */
diff --git a/src/ol/map.js b/src/ol/map.js
new file mode 100644
index 0000000..19d25f7
--- /dev/null
+++ b/src/ol/map.js
@@ -0,0 +1,1564 @@
+// FIXME recheck layer/map projection compatability when projection changes
+// FIXME layer renderers should skip when they can't reproject
+// FIXME add tilt and height?
+
+goog.provide('ol.Map');
+goog.provide('ol.MapProperty');
+
+goog.require('goog.Uri.QueryData');
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.async.AnimationDelay');
+goog.require('goog.async.nextTick');
+goog.require('goog.debug.Console');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.dom.ViewportSizeMonitor');
+goog.require('goog.events');
+goog.require('goog.events.BrowserEvent');
+goog.require('goog.events.Event');
+goog.require('goog.events.EventType');
+goog.require('goog.events.KeyHandler');
+goog.require('goog.events.KeyHandler.EventType');
+goog.require('goog.events.MouseWheelHandler');
+goog.require('goog.events.MouseWheelHandler.EventType');
+goog.require('goog.log');
+goog.require('goog.log.Level');
+goog.require('goog.object');
+goog.require('goog.style');
+goog.require('goog.vec.Mat4');
+goog.require('ol.Collection');
+goog.require('ol.CollectionEventType');
+goog.require('ol.MapBrowserEvent');
+goog.require('ol.MapBrowserEvent.EventType');
+goog.require('ol.MapBrowserEventHandler');
+goog.require('ol.MapEvent');
+goog.require('ol.MapEventType');
+goog.require('ol.Object');
+goog.require('ol.ObjectEvent');
+goog.require('ol.ObjectEventType');
+goog.require('ol.Pixel');
+goog.require('ol.PostRenderFunction');
+goog.require('ol.PreRenderFunction');
+goog.require('ol.RendererType');
+goog.require('ol.Size');
+goog.require('ol.TileQueue');
+goog.require('ol.View');
+goog.require('ol.ViewHint');
+goog.require('ol.control');
+goog.require('ol.extent');
+goog.require('ol.has');
+goog.require('ol.interaction');
+goog.require('ol.layer.Base');
+goog.require('ol.layer.Group');
+goog.require('ol.proj');
+goog.require('ol.proj.common');
+goog.require('ol.renderer.Map');
+goog.require('ol.renderer.canvas.Map');
+goog.require('ol.renderer.dom.Map');
+goog.require('ol.renderer.webgl.Map');
+goog.require('ol.structs.PriorityQueue');
+goog.require('ol.tilecoord');
+goog.require('ol.vec.Mat4');
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.OL3_URL = 'http://openlayers.org/';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.OL3_LOGO_URL = 'data:image/png;base64,' +
+    'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBI' +
+    'WXMAAAHGAAABxgEXwfpGAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAA' +
+    'AhNQTFRF////AP//AICAgP//AFVVQECA////K1VVSbbbYL/fJ05idsTYJFtbbcjbJllmZszW' +
+    'WMTOIFhoHlNiZszTa9DdUcHNHlNlV8XRIVdiasrUHlZjIVZjaMnVH1RlIFRkH1RkH1ZlasvY' +
+    'asvXVsPQH1VkacnVa8vWIVZjIFRjVMPQa8rXIVVkXsXRsNveIFVkIFZlIVVj3eDeh6GmbMvX' +
+    'H1ZkIFRka8rWbMvXIFVkIFVjIFVkbMvWH1VjbMvWIFVlbcvWIFVla8vVIFVkbMvWbMvVH1Vk' +
+    'bMvWIFVlbcvWIFVkbcvVbMvWjNPbIFVkU8LPwMzNIFVkbczWIFVkbsvWbMvXIFVkRnB8bcvW' +
+    '2+TkW8XRIFVkIlZlJVloJlpoKlxrLl9tMmJwOWd0Omh1RXF8TneCT3iDUHiDU8LPVMLPVcLP' +
+    'VcPQVsPPVsPQV8PQWMTQWsTQW8TQXMXSXsXRX4SNX8bSYMfTYcfTYsfTY8jUZcfSZsnUaIqT' +
+    'acrVasrVa8jTa8rWbI2VbMvWbcvWdJObdcvUdszUd8vVeJaee87Yfc3WgJyjhqGnitDYjaar' +
+    'ldPZnrK2oNbborW5o9bbo9fbpLa6q9ndrL3ArtndscDDutzfu8fJwN7gwt7gxc/QyuHhy+Hi' +
+    'zeHi0NfX0+Pj19zb1+Tj2uXk29/e3uLg3+Lh3+bl4uXj4ufl4+fl5Ofl5ufl5ujm5+jmySDn' +
+    'BAAAAFp0Uk5TAAECAgMEBAYHCA0NDg4UGRogIiMmKSssLzU7PkJJT1JTVFliY2hrdHZ3foSF' +
+    'hYeJjY2QkpugqbG1tre5w8zQ09XY3uXn6+zx8vT09vf4+Pj5+fr6/P39/f3+gz7SsAAAAVVJ' +
+    'REFUOMtjYKA7EBDnwCPLrObS1BRiLoJLnte6CQy8FLHLCzs2QUG4FjZ5GbcmBDDjxJBXDWxC' +
+    'Brb8aM4zbkIDzpLYnAcE9VXlJSWlZRU13koIeW57mGx5XjoMZEUqwxWYQaQbSzLSkYGfKFSe' +
+    '0QMsX5WbjgY0YS4MBplemI4BdGBW+DQ11eZiymfqQuXZIjqwyadPNoSZ4L+0FVM6e+oGI6g8' +
+    'a9iKNT3o8kVzNkzRg5lgl7p4wyRUL9Yt2jAxVh6mQCogae6GmflI8p0r13VFWTHBQ0rWPW7a' +
+    'hgWVcPm+9cuLoyy4kCJDzCm6d8PSFoh0zvQNC5OjDJhQopPPJqph1doJBUD5tnkbZiUEqaCn' +
+    'B3bTqLTFG1bPn71kw4b+GFdpLElKIzRxxgYgWNYc5SCENVHKeUaltHdXx0dZ8uBI1hJ2UUDg' +
+    'q82CM2MwKeibqAvSO7MCABq0wXEPiqWEAAAAAElFTkSuQmCC';
+
+
+/**
+ * @type {Array.<ol.RendererType>}
+ */
+ol.DEFAULT_RENDERER_TYPES = [
+  ol.RendererType.CANVAS,
+  ol.RendererType.WEBGL,
+  ol.RendererType.DOM
+];
+
+
+/**
+ * @enum {string}
+ */
+ol.MapProperty = {
+  LAYERGROUP: 'layergroup',
+  SIZE: 'size',
+  TARGET: 'target',
+  VIEW: 'view'
+};
+
+
+
+/**
+ * @classdesc
+ * The map is the core component of OpenLayers. For a map to render, a view,
+ * one or more layers, and a target container are needed:
+ *
+ *     var map = new ol.Map({
+ *       view: new ol.View({
+ *         center: [0, 0],
+ *         zoom: 1
+ *       }),
+ *       layers: [
+ *         new ol.layer.Tile({
+ *           source: new ol.source.MapQuest({layer: 'osm'})
+ *         })
+ *       ],
+ *       target: 'map'
+ *     });
+ *
+ * The above snippet creates a map using a {@link ol.layer.Tile} to display
+ * {@link ol.source.MapQuest} OSM data and render it to a DOM element with the
+ * id `map`.
+ *
+ * The constructor places a viewport container (with CSS class name
+ * `ol-viewport`) in the target element (see `getViewport()`), and then two
+ * further elements within the viewport: one with CSS class name
+ * `ol-overlaycontainer-stopevent` for controls and some overlays, and one with
+ * CSS class name `ol-overlaycontainer` for other overlays (see the `stopEvent`
+ * option of {@link ol.Overlay} for the difference). The map itself is placed in
+ * a further element within the viewport, either DOM or Canvas, depending on the
+ * renderer.
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @param {olx.MapOptions} options Map options.
+ * @fires ol.MapBrowserEvent
+ * @fires ol.MapEvent
+ * @fires ol.render.Event#postcompose
+ * @fires ol.render.Event#precompose
+ * @api stable
+ */
+ol.Map = function(options) {
+
+  goog.base(this);
+
+  var optionsInternal = ol.Map.createOptionsInternal(options);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.pixelRatio_ = goog.isDef(options.pixelRatio) ?
+      options.pixelRatio : ol.has.DEVICE_PIXEL_RATIO;
+
+  /**
+   * @private
+   * @type {Object}
+   */
+  this.logos_ = optionsInternal.logos;
+
+  /**
+   * @private
+   * @type {goog.async.AnimationDelay}
+   */
+  this.animationDelay_ =
+      new goog.async.AnimationDelay(this.renderFrame_, undefined, this);
+  this.registerDisposable(this.animationDelay_);
+
+  /**
+   * @private
+   * @type {goog.vec.Mat4.Number}
+   */
+  this.coordinateToPixelMatrix_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @private
+   * @type {goog.vec.Mat4.Number}
+   */
+  this.pixelToCoordinateMatrix_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.frameIndex_ = 0;
+
+  /**
+   * @private
+   * @type {?olx.FrameState}
+   */
+  this.frameState_ = null;
+
+  /**
+   * The extent at the previous 'moveend' event.
+   * @private
+   * @type {ol.Extent}
+   */
+  this.previousExtent_ = ol.extent.createEmpty();
+
+  /**
+   * @private
+   * @type {goog.events.Key}
+   */
+  this.viewPropertyListenerKey_ = null;
+
+  /**
+   * @private
+   * @type {Array.<goog.events.Key>}
+   */
+  this.layerGroupPropertyListenerKeys_ = null;
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.viewport_ = goog.dom.createDom(goog.dom.TagName.DIV, 'ol-viewport');
+  this.viewport_.style.position = 'relative';
+  this.viewport_.style.overflow = 'hidden';
+  this.viewport_.style.width = '100%';
+  this.viewport_.style.height = '100%';
+  // prevent page zoom on IE >= 10 browsers
+  this.viewport_.style.msTouchAction = 'none';
+  if (ol.has.TOUCH) {
+    this.viewport_.className = 'ol-touch';
+  }
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.overlayContainer_ = goog.dom.createDom(goog.dom.TagName.DIV,
+      'ol-overlaycontainer');
+  goog.dom.appendChild(this.viewport_, this.overlayContainer_);
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.overlayContainerStopEvent_ = goog.dom.createDom(goog.dom.TagName.DIV,
+      'ol-overlaycontainer-stopevent');
+  goog.events.listen(this.overlayContainerStopEvent_, [
+    goog.events.EventType.CLICK,
+    goog.events.EventType.DBLCLICK,
+    goog.events.EventType.MOUSEDOWN,
+    goog.events.EventType.TOUCHSTART,
+    goog.events.EventType.MSPOINTERDOWN,
+    ol.MapBrowserEvent.EventType.POINTERDOWN,
+    goog.userAgent.GECKO ? 'DOMMouseScroll' : 'mousewheel'
+  ], goog.events.Event.stopPropagation);
+  goog.dom.appendChild(this.viewport_, this.overlayContainerStopEvent_);
+
+  var mapBrowserEventHandler = new ol.MapBrowserEventHandler(this);
+  goog.events.listen(mapBrowserEventHandler,
+      goog.object.getValues(ol.MapBrowserEvent.EventType),
+      this.handleMapBrowserEvent, false, this);
+  this.registerDisposable(mapBrowserEventHandler);
+
+  /**
+   * @private
+   * @type {Element|Document}
+   */
+  this.keyboardEventTarget_ = optionsInternal.keyboardEventTarget;
+
+  /**
+   * @private
+   * @type {goog.events.KeyHandler}
+   */
+  this.keyHandler_ = new goog.events.KeyHandler();
+  goog.events.listen(this.keyHandler_, goog.events.KeyHandler.EventType.KEY,
+      this.handleBrowserEvent, false, this);
+  this.registerDisposable(this.keyHandler_);
+
+  var mouseWheelHandler = new goog.events.MouseWheelHandler(this.viewport_);
+  goog.events.listen(mouseWheelHandler,
+      goog.events.MouseWheelHandler.EventType.MOUSEWHEEL,
+      this.handleBrowserEvent, false, this);
+  this.registerDisposable(mouseWheelHandler);
+
+  /**
+   * @type {ol.Collection.<ol.control.Control>}
+   * @private
+   */
+  this.controls_ = optionsInternal.controls;
+
+  /**
+   * @type {olx.DeviceOptions}
+   * @private
+   */
+  this.deviceOptions_ = optionsInternal.deviceOptions;
+
+  /**
+   * @type {ol.Collection.<ol.interaction.Interaction>}
+   * @private
+   */
+  this.interactions_ = optionsInternal.interactions;
+
+  /**
+   * @type {ol.Collection.<ol.Overlay>}
+   * @private
+   */
+  this.overlays_ = optionsInternal.overlays;
+
+  /**
+   * @type {ol.renderer.Map}
+   * @private
+   */
+  this.renderer_ =
+      new optionsInternal.rendererConstructor(this.viewport_, this);
+  this.registerDisposable(this.renderer_);
+
+  /**
+   * @private
+   */
+  this.viewportSizeMonitor_ = new goog.dom.ViewportSizeMonitor();
+  this.registerDisposable(this.viewportSizeMonitor_);
+
+  goog.events.listen(this.viewportSizeMonitor_, goog.events.EventType.RESIZE,
+      this.updateSize, false, this);
+
+  /**
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.focus_ = null;
+
+  /**
+   * @private
+   * @type {Array.<ol.PreRenderFunction>}
+   */
+  this.preRenderFunctions_ = [];
+
+  /**
+   * @private
+   * @type {Array.<ol.PostRenderFunction>}
+   */
+  this.postRenderFunctions_ = [];
+
+  /**
+   * @private
+   * @type {ol.TileQueue}
+   */
+  this.tileQueue_ = new ol.TileQueue(
+      goog.bind(this.getTilePriority, this),
+      goog.bind(this.handleTileChange_, this));
+
+  /**
+   * Uids of features to skip at rendering time.
+   * @type {Object.<string, boolean>}
+   * @private
+   */
+  this.skippedFeatureUids_ = {};
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.MapProperty.LAYERGROUP),
+      this.handleLayerGroupChanged_, false, this);
+  goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.VIEW),
+      this.handleViewChanged_, false, this);
+  goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.SIZE),
+      this.handleSizeChanged_, false, this);
+  goog.events.listen(this, ol.Object.getChangeEventType(ol.MapProperty.TARGET),
+      this.handleTargetChanged_, false, this);
+
+  // setProperties will trigger the rendering of the map if the map
+  // is "defined" already.
+  this.setProperties(optionsInternal.values);
+
+  this.controls_.forEach(
+      /**
+       * @param {ol.control.Control} control Control.
+       * @this {ol.Map}
+       */
+      function(control) {
+        control.setMap(this);
+      }, this);
+
+  goog.events.listen(this.controls_, ol.CollectionEventType.ADD,
+      /**
+       * @param {ol.CollectionEvent} event Collection event.
+       */
+      function(event) {
+        event.element.setMap(this);
+      }, false, this);
+
+  goog.events.listen(this.controls_, ol.CollectionEventType.REMOVE,
+      /**
+       * @param {ol.CollectionEvent} event Collection event.
+       */
+      function(event) {
+        event.element.setMap(null);
+      }, false, this);
+
+  this.interactions_.forEach(
+      /**
+       * @param {ol.interaction.Interaction} interaction Interaction.
+       * @this {ol.Map}
+       */
+      function(interaction) {
+        interaction.setMap(this);
+      }, this);
+
+  goog.events.listen(this.interactions_, ol.CollectionEventType.ADD,
+      /**
+       * @param {ol.CollectionEvent} event Collection event.
+       */
+      function(event) {
+        event.element.setMap(this);
+      }, false, this);
+
+  goog.events.listen(this.interactions_, ol.CollectionEventType.REMOVE,
+      /**
+       * @param {ol.CollectionEvent} event Collection event.
+       */
+      function(event) {
+        event.element.setMap(null);
+      }, false, this);
+
+  this.overlays_.forEach(
+      /**
+       * @param {ol.Overlay} overlay Overlay.
+       * @this {ol.Map}
+       */
+      function(overlay) {
+        overlay.setMap(this);
+      }, this);
+
+  goog.events.listen(this.overlays_, ol.CollectionEventType.ADD,
+      /**
+       * @param {ol.CollectionEvent} event Collection event.
+       */
+      function(event) {
+        event.element.setMap(this);
+      }, false, this);
+
+  goog.events.listen(this.overlays_, ol.CollectionEventType.REMOVE,
+      /**
+       * @param {ol.CollectionEvent} event Collection event.
+       */
+      function(event) {
+        event.element.setMap(null);
+      }, false, this);
+
+};
+goog.inherits(ol.Map, ol.Object);
+
+
+/**
+ * Add the given control to the map.
+ * @param {ol.control.Control} control Control.
+ * @api stable
+ */
+ol.Map.prototype.addControl = function(control) {
+  var controls = this.getControls();
+  goog.asserts.assert(goog.isDef(controls));
+  controls.push(control);
+};
+
+
+/**
+ * Add the given interaction to the map.
+ * @param {ol.interaction.Interaction} interaction Interaction to add.
+ * @api stable
+ */
+ol.Map.prototype.addInteraction = function(interaction) {
+  var interactions = this.getInteractions();
+  goog.asserts.assert(goog.isDef(interactions));
+  interactions.push(interaction);
+};
+
+
+/**
+ * Adds the given layer to the top of this map.
+ * @param {ol.layer.Base} layer Layer.
+ * @api stable
+ */
+ol.Map.prototype.addLayer = function(layer) {
+  var layers = this.getLayerGroup().getLayers();
+  layers.push(layer);
+};
+
+
+/**
+ * Add the given overlay to the map.
+ * @param {ol.Overlay} overlay Overlay.
+ * @api stable
+ */
+ol.Map.prototype.addOverlay = function(overlay) {
+  var overlays = this.getOverlays();
+  goog.asserts.assert(goog.isDef(overlays));
+  overlays.push(overlay);
+};
+
+
+/**
+ * Add functions to be called before rendering. This can be used for attaching
+ * animations before updating the map's view.  The {@link ol.animation}
+ * namespace provides several static methods for creating prerender functions.
+ * @param {...ol.PreRenderFunction} var_args Any number of pre-render functions.
+ * @api
+ */
+ol.Map.prototype.beforeRender = function(var_args) {
+  this.render();
+  Array.prototype.push.apply(this.preRenderFunctions_, arguments);
+};
+
+
+/**
+ * @param {ol.PreRenderFunction} preRenderFunction Pre-render function.
+ * @return {boolean} Whether the preRenderFunction has been found and removed.
+ */
+ol.Map.prototype.removePreRenderFunction = function(preRenderFunction) {
+  return goog.array.remove(this.preRenderFunctions_, preRenderFunction);
+};
+
+
+/**
+ *
+ * @inheritDoc
+ */
+ol.Map.prototype.disposeInternal = function() {
+  goog.dom.removeNode(this.viewport_);
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * Detect features that intersect a pixel on the viewport, and execute a
+ * callback with each intersecting feature. Layers included in the detection can
+ * be configured through `opt_layerFilter`. Feature overlays will always be
+ * included in the detection.
+ * @param {ol.Pixel} pixel Pixel.
+ * @param {function(this: S, ol.Feature, ol.layer.Layer): T} callback Feature
+ *     callback. If the detected feature is not on a layer, but on a
+ *     {@link ol.FeatureOverlay}, then the 2nd argument to this function will
+ *     be `null`. To stop detection, callback functions can return a truthy
+ *     value.
+ * @param {S=} opt_this Value to use as `this` when executing `callback`.
+ * @param {(function(this: U, ol.layer.Layer): boolean)=} opt_layerFilter Layer
+ *     filter function, only layers which are visible and for which this
+ *     function returns `true` will be tested for features. By default, all
+ *     visible layers will be tested. Feature overlays will always be tested.
+ * @param {U=} opt_this2 Value to use as `this` when executing `layerFilter`.
+ * @return {T|undefined} Callback result, i.e. the return value of last
+ * callback execution, or the first truthy callback return value.
+ * @template S,T,U
+ * @api stable
+ */
+ol.Map.prototype.forEachFeatureAtPixel =
+    function(pixel, callback, opt_this, opt_layerFilter, opt_this2) {
+  if (goog.isNull(this.frameState_)) {
+    return;
+  }
+  var coordinate = this.getCoordinateFromPixel(pixel);
+  var thisArg = goog.isDef(opt_this) ? opt_this : null;
+  var layerFilter = goog.isDef(opt_layerFilter) ?
+      opt_layerFilter : goog.functions.TRUE;
+  var thisArg2 = goog.isDef(opt_this2) ? opt_this2 : null;
+  return this.renderer_.forEachFeatureAtPixel(
+      coordinate, this.frameState_, callback, thisArg,
+      layerFilter, thisArg2);
+};
+
+
+/**
+ * Returns the geographical coordinate for a browser event.
+ * @param {Event} event Event.
+ * @return {ol.Coordinate} Coordinate.
+ * @api stable
+ */
+ol.Map.prototype.getEventCoordinate = function(event) {
+  return this.getCoordinateFromPixel(this.getEventPixel(event));
+};
+
+
+/**
+ * Returns the map pixel position for a browser event relative to the viewport.
+ * @param {Event} event Event.
+ * @return {ol.Pixel} Pixel.
+ * @api stable
+ */
+ol.Map.prototype.getEventPixel = function(event) {
+  // Use the offsetX and offsetY values if available.
+  // See http://www.w3.org/TR/cssom-view/#dom-mouseevent-offsetx and
+  // http://www.w3.org/TR/cssom-view/#dom-mouseevent-offsety
+  if (goog.isDef(event.offsetX) && goog.isDef(event.offsetY)) {
+    return [event.offsetX, event.offsetY];
+  } else if (goog.isDef(event.changedTouches)) {
+    // offsetX and offsetY are not defined for Touch Event
+    //
+    // goog.style.getRelativePosition is based on event.targetTouches,
+    // but touchend and touchcancel events have no targetTouches when
+    // the last finger is removed from the screen.
+    // So we ourselves compute the position of touch events.
+    // See https://github.com/google/closure-library/pull/323
+    var touch = event.changedTouches[0];
+    var viewportPosition = goog.style.getClientPosition(this.viewport_);
+    return [
+      touch.clientX - viewportPosition.x,
+      touch.clientY - viewportPosition.y
+    ];
+  } else {
+    // Compute offsetX and offsetY values for browsers that don't implement
+    // cssom-view specification
+    var eventPosition = goog.style.getRelativePosition(event, this.viewport_);
+    return [eventPosition.x, eventPosition.y];
+  }
+};
+
+
+/**
+ * Get the target in which this map is rendered.
+ * Note that this returns what is entered as an option or in setTarget:
+ * if that was an element, it returns an element; if a string, it returns that.
+ * @return {Element|string|undefined} The Element or id of the Element that the
+ *     map is rendered in.
+ * @observable
+ * @api stable
+ */
+ol.Map.prototype.getTarget = function() {
+  return /** @type {Element|string|undefined} */ (
+      this.get(ol.MapProperty.TARGET));
+};
+goog.exportProperty(
+    ol.Map.prototype,
+    'getTarget',
+    ol.Map.prototype.getTarget);
+
+
+/**
+ * Get the DOM element into which this map is rendered. In contrast to
+ * `getTarget` this method always return an `Element`, or `null` if the
+ * map has no target.
+ * @return {Element} The element that the map is rendered in.
+ * @api
+ */
+ol.Map.prototype.getTargetElement = function() {
+  var target = this.getTarget();
+  return goog.isDef(target) ? goog.dom.getElement(target) : null;
+};
+
+
+/**
+ * @param {ol.Pixel} pixel Pixel.
+ * @return {ol.Coordinate} Coordinate.
+ * @api stable
+ */
+ol.Map.prototype.getCoordinateFromPixel = function(pixel) {
+  var frameState = this.frameState_;
+  if (goog.isNull(frameState)) {
+    return null;
+  } else {
+    var vec2 = pixel.slice();
+    return ol.vec.Mat4.multVec2(frameState.pixelToCoordinateMatrix, vec2, vec2);
+  }
+};
+
+
+/**
+ * @return {ol.Collection.<ol.control.Control>} Controls.
+ * @api stable
+ */
+ol.Map.prototype.getControls = function() {
+  return this.controls_;
+};
+
+
+/**
+ * @return {ol.Collection.<ol.Overlay>} Overlays.
+ * @api stable
+ */
+ol.Map.prototype.getOverlays = function() {
+  return this.overlays_;
+};
+
+
+/**
+ * Gets the collection of {@link ol.interaction.Interaction} instances
+ * associated with this map. Modifying this collection changes the interactions
+ * associated with the map.
+ *
+ * Interactions are used for e.g. pan, zoom and rotate.
+ * @return {ol.Collection.<ol.interaction.Interaction>} Interactions.
+ * @api stable
+ */
+ol.Map.prototype.getInteractions = function() {
+  return this.interactions_;
+};
+
+
+/**
+ * Get the layergroup associated with this map.
+ * @return {ol.layer.Group} A layer group containing the layers in this map.
+ * @observable
+ * @api stable
+ */
+ol.Map.prototype.getLayerGroup = function() {
+  return /** @type {ol.layer.Group} */ (this.get(ol.MapProperty.LAYERGROUP));
+};
+goog.exportProperty(
+    ol.Map.prototype,
+    'getLayerGroup',
+    ol.Map.prototype.getLayerGroup);
+
+
+/**
+ * Get the collection of layers associated with this map.
+ * @return {!ol.Collection.<ol.layer.Base>} Layers.
+ * @api stable
+ */
+ol.Map.prototype.getLayers = function() {
+  var layers = this.getLayerGroup().getLayers();
+  return layers;
+};
+
+
+/**
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @return {ol.Pixel} Pixel.
+ * @api stable
+ */
+ol.Map.prototype.getPixelFromCoordinate = function(coordinate) {
+  var frameState = this.frameState_;
+  if (goog.isNull(frameState)) {
+    return null;
+  } else {
+    var vec2 = coordinate.slice(0, 2);
+    return ol.vec.Mat4.multVec2(frameState.coordinateToPixelMatrix, vec2, vec2);
+  }
+};
+
+
+/**
+ * Get the map renderer.
+ * @return {ol.renderer.Map} Renderer
+ */
+ol.Map.prototype.getRenderer = function() {
+  return this.renderer_;
+};
+
+
+/**
+ * Get the size of this map.
+ * @return {ol.Size|undefined} The size in pixels of the map in the DOM.
+ * @observable
+ * @api stable
+ */
+ol.Map.prototype.getSize = function() {
+  return /** @type {ol.Size|undefined} */ (this.get(ol.MapProperty.SIZE));
+};
+goog.exportProperty(
+    ol.Map.prototype,
+    'getSize',
+    ol.Map.prototype.getSize);
+
+
+/**
+ * Get the view associated with this map. A view manages properties such as
+ * center and resolution.
+ * @return {ol.View} The view that controls this map.
+ * @observable
+ * @api stable
+ */
+ol.Map.prototype.getView = function() {
+  return /** @type {ol.View} */ (this.get(ol.MapProperty.VIEW));
+};
+goog.exportProperty(
+    ol.Map.prototype,
+    'getView',
+    ol.Map.prototype.getView);
+
+
+/**
+ * @return {Element} Viewport.
+ * @api stable
+ */
+ol.Map.prototype.getViewport = function() {
+  return this.viewport_;
+};
+
+
+/**
+ * @return {Element} The map's overlay container. Elements added to this
+ * container will let mousedown and touchstart events through to the map, so
+ * clicks and gestures on an overlay will trigger {@link ol.MapBrowserEvent}
+ * events.
+ */
+ol.Map.prototype.getOverlayContainer = function() {
+  return this.overlayContainer_;
+};
+
+
+/**
+ * @return {Element} The map's overlay container. Elements added to this
+ * container won't let mousedown and touchstart events through to the map, so
+ * clicks and gestures on an overlay don't trigger any
+ * {@link ol.MapBrowserEvent}.
+ */
+ol.Map.prototype.getOverlayContainerStopEvent = function() {
+  return this.overlayContainerStopEvent_;
+};
+
+
+/**
+ * @param {ol.Tile} tile Tile.
+ * @param {string} tileSourceKey Tile source key.
+ * @param {ol.Coordinate} tileCenter Tile center.
+ * @param {number} tileResolution Tile resolution.
+ * @return {number} Tile priority.
+ */
+ol.Map.prototype.getTilePriority =
+    function(tile, tileSourceKey, tileCenter, tileResolution) {
+  // Filter out tiles at higher zoom levels than the current zoom level, or that
+  // are outside the visible extent.
+  var frameState = this.frameState_;
+  if (goog.isNull(frameState) || !(tileSourceKey in frameState.wantedTiles)) {
+    return ol.structs.PriorityQueue.DROP;
+  }
+  var coordKey = ol.tilecoord.toString(tile.tileCoord);
+  if (!frameState.wantedTiles[tileSourceKey][coordKey]) {
+    return ol.structs.PriorityQueue.DROP;
+  }
+  // Prioritize the highest zoom level tiles closest to the focus.
+  // Tiles at higher zoom levels are prioritized using Math.log(tileResolution).
+  // Within a zoom level, tiles are prioritized by the distance in pixels
+  // between the center of the tile and the focus.  The factor of 65536 means
+  // that the prioritization should behave as desired for tiles up to
+  // 65536 * Math.log(2) = 45426 pixels from the focus.
+  var deltaX = tileCenter[0] - frameState.focus[0];
+  var deltaY = tileCenter[1] - frameState.focus[1];
+  return 65536 * Math.log(tileResolution) +
+      Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution;
+};
+
+
+/**
+ * @param {goog.events.BrowserEvent} browserEvent Browser event.
+ * @param {string=} opt_type Type.
+ */
+ol.Map.prototype.handleBrowserEvent = function(browserEvent, opt_type) {
+  var type = opt_type || browserEvent.type;
+  var mapBrowserEvent = new ol.MapBrowserEvent(type, this, browserEvent);
+  this.handleMapBrowserEvent(mapBrowserEvent);
+};
+
+
+/**
+ * @param {ol.MapBrowserEvent} mapBrowserEvent The event to handle.
+ */
+ol.Map.prototype.handleMapBrowserEvent = function(mapBrowserEvent) {
+  if (goog.isNull(this.frameState_)) {
+    // With no view defined, we cannot translate pixels into geographical
+    // coordinates so interactions cannot be used.
+    return;
+  }
+  this.focus_ = mapBrowserEvent.coordinate;
+  mapBrowserEvent.frameState = this.frameState_;
+  var interactions = this.getInteractions();
+  goog.asserts.assert(goog.isDef(interactions));
+  var interactionsArray = interactions.getArray();
+  var i;
+  if (this.dispatchEvent(mapBrowserEvent) !== false) {
+    for (i = interactionsArray.length - 1; i >= 0; i--) {
+      var interaction = interactionsArray[i];
+      if (!interaction.getActive()) {
+        continue;
+      }
+      var cont = interaction.handleEvent(mapBrowserEvent);
+      if (!cont) {
+        break;
+      }
+    }
+  }
+};
+
+
+/**
+ * @protected
+ */
+ol.Map.prototype.handlePostRender = function() {
+
+  var frameState = this.frameState_;
+
+  // Manage the tile queue
+  // Image loads are expensive and a limited resource, so try to use them
+  // efficiently:
+  // * When the view is static we allow a large number of parallel tile loads
+  //   to complete the frame as quickly as possible.
+  // * When animating or interacting, image loads can cause janks, so we reduce
+  //   the maximum number of loads per frame and limit the number of parallel
+  //   tile loads to remain reactive to view changes and to reduce the chance of
+  //   loading tiles that will quickly disappear from view.
+  var tileQueue = this.tileQueue_;
+  if (!tileQueue.isEmpty()) {
+    var maxTotalLoading = 16;
+    var maxNewLoads = maxTotalLoading;
+    var tileSourceCount = 0;
+    if (!goog.isNull(frameState)) {
+      var hints = frameState.viewHints;
+      var deviceOptions = this.deviceOptions_;
+      if (hints[ol.ViewHint.ANIMATING]) {
+        maxTotalLoading = deviceOptions.loadTilesWhileAnimating === false ?
+            0 : 8;
+        maxNewLoads = 2;
+      }
+      if (hints[ol.ViewHint.INTERACTING]) {
+        maxTotalLoading = deviceOptions.loadTilesWhileInteracting === false ?
+            0 : 8;
+        maxNewLoads = 2;
+      }
+      tileSourceCount = goog.object.getCount(frameState.wantedTiles);
+    }
+    maxTotalLoading *= tileSourceCount;
+    maxNewLoads *= tileSourceCount;
+    if (tileQueue.getTilesLoading() < maxTotalLoading) {
+      tileQueue.reprioritize(); // FIXME only call if view has changed
+      tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads);
+    }
+  }
+
+  var postRenderFunctions = this.postRenderFunctions_;
+  var i, ii;
+  for (i = 0, ii = postRenderFunctions.length; i < ii; ++i) {
+    postRenderFunctions[i](this, frameState);
+  }
+  postRenderFunctions.length = 0;
+};
+
+
+/**
+ * @private
+ */
+ol.Map.prototype.handleSizeChanged_ = function() {
+  this.render();
+};
+
+
+/**
+ * @private
+ */
+ol.Map.prototype.handleTargetChanged_ = function() {
+  // target may be undefined, null, a string or an Element.
+  // If it's a string we convert it to an Element before proceeding.
+  // If it's not now an Element we remove the viewport from the DOM.
+  // If it's an Element we append the viewport element to it.
+
+  var target = this.getTarget();
+
+  /**
+   * @type {Element}
+   */
+  var targetElement = goog.isDef(target) ?
+      goog.dom.getElement(target) : null;
+
+  this.keyHandler_.detach();
+
+  if (goog.isNull(targetElement)) {
+    goog.dom.removeNode(this.viewport_);
+  } else {
+    goog.dom.appendChild(targetElement, this.viewport_);
+
+    var keyboardEventTarget = goog.isNull(this.keyboardEventTarget_) ?
+        targetElement : this.keyboardEventTarget_;
+    this.keyHandler_.attach(keyboardEventTarget);
+  }
+
+  this.updateSize();
+  // updateSize calls setSize, so no need to call this.render
+  // ourselves here.
+};
+
+
+/**
+ * @private
+ */
+ol.Map.prototype.handleTileChange_ = function() {
+  this.render();
+};
+
+
+/**
+ * @private
+ */
+ol.Map.prototype.handleViewPropertyChanged_ = function() {
+  this.render();
+};
+
+
+/**
+ * @private
+ */
+ol.Map.prototype.handleViewChanged_ = function() {
+  if (!goog.isNull(this.viewPropertyListenerKey_)) {
+    goog.events.unlistenByKey(this.viewPropertyListenerKey_);
+    this.viewPropertyListenerKey_ = null;
+  }
+  var view = this.getView();
+  if (!goog.isNull(view)) {
+    this.viewPropertyListenerKey_ = goog.events.listen(
+        view, ol.ObjectEventType.PROPERTYCHANGE,
+        this.handleViewPropertyChanged_, false, this);
+  }
+  this.render();
+};
+
+
+/**
+ * @param {goog.events.Event} event Event.
+ * @private
+ */
+ol.Map.prototype.handleLayerGroupMemberChanged_ = function(event) {
+  goog.asserts.assertInstanceof(event, goog.events.Event);
+  this.render();
+};
+
+
+/**
+ * @param {ol.ObjectEvent} event Event.
+ * @private
+ */
+ol.Map.prototype.handleLayerGroupPropertyChanged_ = function(event) {
+  goog.asserts.assertInstanceof(event, ol.ObjectEvent);
+  this.render();
+};
+
+
+/**
+ * @private
+ */
+ol.Map.prototype.handleLayerGroupChanged_ = function() {
+  if (!goog.isNull(this.layerGroupPropertyListenerKeys_)) {
+    var length = this.layerGroupPropertyListenerKeys_.length;
+    for (var i = 0; i < length; ++i) {
+      goog.events.unlistenByKey(this.layerGroupPropertyListenerKeys_[i]);
+    }
+    this.layerGroupPropertyListenerKeys_ = null;
+  }
+  var layerGroup = this.getLayerGroup();
+  if (goog.isDefAndNotNull(layerGroup)) {
+    this.layerGroupPropertyListenerKeys_ = [
+      goog.events.listen(
+          layerGroup, ol.ObjectEventType.PROPERTYCHANGE,
+          this.handleLayerGroupPropertyChanged_, false, this),
+      goog.events.listen(
+          layerGroup, goog.events.EventType.CHANGE,
+          this.handleLayerGroupMemberChanged_, false, this)
+    ];
+  }
+  this.render();
+};
+
+
+/**
+ * Returns `true` if the map is defined, `false` otherwise. The map is defined
+ * if it is contained in `document`, visible, has non-zero height and width, and
+ * has a defined view.
+ * @return {boolean} Is defined.
+ */
+ol.Map.prototype.isDef = function() {
+  if (!goog.dom.contains(document, this.viewport_)) {
+    return false;
+  }
+  if (!goog.style.isElementShown(this.viewport_)) {
+    return false;
+  }
+  var size = this.getSize();
+  if (!goog.isDefAndNotNull(size) || size[0] <= 0 || size[1] <= 0) {
+    return false;
+  }
+  var view = this.getView();
+  if (goog.isNull(view) || !view.isDef()) {
+    return false;
+  }
+  return true;
+};
+
+
+/**
+ * @return {boolean} Is rendered.
+ */
+ol.Map.prototype.isRendered = function() {
+  return !goog.isNull(this.frameState_);
+};
+
+
+/**
+ * Requests an immediate render in a synchronous manner.
+ * @api stable
+ */
+ol.Map.prototype.renderSync = function() {
+  this.animationDelay_.fire();
+};
+
+
+/**
+ * Requests a render frame; rendering will effectively occur at the next browser
+ * animation frame.
+ * @api stable
+ */
+ol.Map.prototype.render = function() {
+  if (!this.animationDelay_.isActive()) {
+    this.animationDelay_.start();
+  }
+};
+
+
+/**
+ * Remove the given control from the map.
+ * @param {ol.control.Control} control Control.
+ * @return {ol.control.Control|undefined} The removed control (or undefined
+ *     if the control was not found).
+ * @api stable
+ */
+ol.Map.prototype.removeControl = function(control) {
+  var controls = this.getControls();
+  goog.asserts.assert(goog.isDef(controls));
+  if (goog.isDef(controls.remove(control))) {
+    return control;
+  }
+  return undefined;
+};
+
+
+/**
+ * Remove the given interaction from the map.
+ * @param {ol.interaction.Interaction} interaction Interaction to remove.
+ * @return {ol.interaction.Interaction|undefined} The removed interaction (or
+ *     undefined if the interaction was not found).
+ * @api stable
+ */
+ol.Map.prototype.removeInteraction = function(interaction) {
+  var removed;
+  var interactions = this.getInteractions();
+  goog.asserts.assert(goog.isDef(interactions));
+  if (goog.isDef(interactions.remove(interaction))) {
+    removed = interaction;
+  }
+  return removed;
+};
+
+
+/**
+ * Removes the given layer from the map.
+ * @param {ol.layer.Base} layer Layer.
+ * @return {ol.layer.Base|undefined} The removed layer (or undefined if the
+ *     layer was not found).
+ * @api stable
+ */
+ol.Map.prototype.removeLayer = function(layer) {
+  var layers = this.getLayerGroup().getLayers();
+  return layers.remove(layer);
+};
+
+
+/**
+ * Remove the given overlay from the map.
+ * @param {ol.Overlay} overlay Overlay.
+ * @return {ol.Overlay|undefined} The removed overlay (or undefined
+ *     if the overlay was not found).
+ * @api stable
+ */
+ol.Map.prototype.removeOverlay = function(overlay) {
+  var overlays = this.getOverlays();
+  goog.asserts.assert(goog.isDef(overlays));
+  if (goog.isDef(overlays.remove(overlay))) {
+    return overlay;
+  }
+  return undefined;
+};
+
+
+/**
+ * @param {number} time Time.
+ * @private
+ */
+ol.Map.prototype.renderFrame_ = function(time) {
+
+  var i, ii, viewState;
+
+  /**
+   * Check whether a size has non-zero width and height.  Note that this
+   * function is here because the compiler doesn't recognize that size is
+   * defined in the frameState assignment below when the same code is inline in
+   * the condition below.  The compiler inlines this function itself, so the
+   * resulting code is the same.
+   *
+   * @param {ol.Size} size The size to test.
+   * @return {boolean} Has non-zero width and height.
+   */
+  function hasArea(size) {
+    return size[0] > 0 && size[1] > 0;
+  }
+
+  var size = this.getSize();
+  var view = this.getView();
+  /** @type {?olx.FrameState} */
+  var frameState = null;
+  if (goog.isDef(size) && hasArea(size) &&
+      !goog.isNull(view) && view.isDef()) {
+    var viewHints = view.getHints();
+    var layerStatesArray = this.getLayerGroup().getLayerStatesArray();
+    var layerStates = {};
+    for (i = 0, ii = layerStatesArray.length; i < ii; ++i) {
+      layerStates[goog.getUid(layerStatesArray[i].layer)] = layerStatesArray[i];
+    }
+    viewState = view.getState();
+    frameState = /** @type {olx.FrameState} */ ({
+      animate: false,
+      attributions: {},
+      coordinateToPixelMatrix: this.coordinateToPixelMatrix_,
+      extent: null,
+      focus: goog.isNull(this.focus_) ? viewState.center : this.focus_,
+      index: this.frameIndex_++,
+      layerStates: layerStates,
+      layerStatesArray: layerStatesArray,
+      logos: goog.object.clone(this.logos_),
+      pixelRatio: this.pixelRatio_,
+      pixelToCoordinateMatrix: this.pixelToCoordinateMatrix_,
+      postRenderFunctions: [],
+      size: size,
+      skippedFeatureUids: this.skippedFeatureUids_,
+      tileQueue: this.tileQueue_,
+      time: time,
+      usedTiles: {},
+      viewState: viewState,
+      viewHints: viewHints,
+      wantedTiles: {}
+    });
+  }
+
+  if (!goog.isNull(frameState)) {
+    var preRenderFunctions = this.preRenderFunctions_;
+    var n = 0, preRenderFunction;
+    for (i = 0, ii = preRenderFunctions.length; i < ii; ++i) {
+      preRenderFunction = preRenderFunctions[i];
+      if (preRenderFunction(this, frameState)) {
+        preRenderFunctions[n++] = preRenderFunction;
+      }
+    }
+    preRenderFunctions.length = n;
+
+    frameState.extent = ol.extent.getForViewAndSize(viewState.center,
+        viewState.resolution, viewState.rotation, frameState.size);
+  }
+
+  this.frameState_ = frameState;
+  this.renderer_.renderFrame(frameState);
+
+  if (!goog.isNull(frameState)) {
+    if (frameState.animate) {
+      this.render();
+    }
+    Array.prototype.push.apply(
+        this.postRenderFunctions_, frameState.postRenderFunctions);
+
+    var idle = this.preRenderFunctions_.length === 0 &&
+        !frameState.viewHints[ol.ViewHint.ANIMATING] &&
+        !frameState.viewHints[ol.ViewHint.INTERACTING] &&
+        !ol.extent.equals(frameState.extent, this.previousExtent_);
+
+    if (idle) {
+      this.dispatchEvent(
+          new ol.MapEvent(ol.MapEventType.MOVEEND, this, frameState));
+      ol.extent.clone(frameState.extent, this.previousExtent_);
+    }
+  }
+
+  this.dispatchEvent(
+      new ol.MapEvent(ol.MapEventType.POSTRENDER, this, frameState));
+
+  goog.async.nextTick(this.handlePostRender, this);
+
+};
+
+
+/**
+ * Sets the layergroup of this map.
+ * @param {ol.layer.Group} layerGroup A layer group containing the layers in
+ *     this map.
+ * @observable
+ * @api stable
+ */
+ol.Map.prototype.setLayerGroup = function(layerGroup) {
+  this.set(ol.MapProperty.LAYERGROUP, layerGroup);
+};
+goog.exportProperty(
+    ol.Map.prototype,
+    'setLayerGroup',
+    ol.Map.prototype.setLayerGroup);
+
+
+/**
+ * Set the size of this map.
+ * @param {ol.Size|undefined} size The size in pixels of the map in the DOM.
+ * @observable
+ * @api
+ */
+ol.Map.prototype.setSize = function(size) {
+  this.set(ol.MapProperty.SIZE, size);
+};
+goog.exportProperty(
+    ol.Map.prototype,
+    'setSize',
+    ol.Map.prototype.setSize);
+
+
+/**
+ * Set the target element to render this map into.
+ * @param {Element|string|undefined} target The Element or id of the Element
+ *     that the map is rendered in.
+ * @observable
+ * @api stable
+ */
+ol.Map.prototype.setTarget = function(target) {
+  this.set(ol.MapProperty.TARGET, target);
+};
+goog.exportProperty(
+    ol.Map.prototype,
+    'setTarget',
+    ol.Map.prototype.setTarget);
+
+
+/**
+ * Set the view for this map.
+ * @param {ol.View} view The view that controls this map.
+ * @observable
+ * @api stable
+ */
+ol.Map.prototype.setView = function(view) {
+  this.set(ol.MapProperty.VIEW, view);
+};
+goog.exportProperty(
+    ol.Map.prototype,
+    'setView',
+    ol.Map.prototype.setView);
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ */
+ol.Map.prototype.skipFeature = function(feature) {
+  var featureUid = goog.getUid(feature).toString();
+  this.skippedFeatureUids_[featureUid] = true;
+  this.render();
+};
+
+
+/**
+ * Force a recalculation of the map viewport size.  This should be called when
+ * third-party code changes the size of the map viewport.
+ * @api stable
+ */
+ol.Map.prototype.updateSize = function() {
+  var target = this.getTarget();
+
+  /**
+   * @type {Element}
+   */
+  var targetElement = goog.isDef(target) ? goog.dom.getElement(target) : null;
+
+  if (goog.isNull(targetElement)) {
+    this.setSize(undefined);
+  } else {
+    var size = goog.style.getContentBoxSize(targetElement);
+    this.setSize([size.width, size.height]);
+  }
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ */
+ol.Map.prototype.unskipFeature = function(feature) {
+  var featureUid = goog.getUid(feature).toString();
+  delete this.skippedFeatureUids_[featureUid];
+  this.render();
+};
+
+
+/**
+ * @typedef {{controls: ol.Collection.<ol.control.Control>,
+ *            deviceOptions: olx.DeviceOptions,
+ *            interactions: ol.Collection.<ol.interaction.Interaction>,
+ *            keyboardEventTarget: (Element|Document),
+ *            logos: Object,
+ *            overlays: ol.Collection.<ol.Overlay>,
+ *            rendererConstructor:
+ *                function(new: ol.renderer.Map, Element, ol.Map),
+ *            values: Object.<string, *>}}
+ */
+ol.MapOptionsInternal;
+
+
+/**
+ * @param {olx.MapOptions} options Map options.
+ * @return {ol.MapOptionsInternal} Internal map options.
+ */
+ol.Map.createOptionsInternal = function(options) {
+
+  /**
+   * @type {Element|Document}
+   */
+  var keyboardEventTarget = null;
+  if (goog.isDef(options.keyboardEventTarget)) {
+    // cannot use goog.dom.getElement because its argument cannot be
+    // of type Document
+    keyboardEventTarget = goog.isString(options.keyboardEventTarget) ?
+        document.getElementById(options.keyboardEventTarget) :
+        options.keyboardEventTarget;
+  }
+
+  /**
+   * @type {Object.<string, *>}
+   */
+  var values = {};
+
+  var logos = {};
+  if (!goog.isDef(options.logo) ||
+      (goog.isBoolean(options.logo) && options.logo)) {
+    logos[ol.OL3_LOGO_URL] = ol.OL3_URL;
+  } else {
+    var logo = options.logo;
+    if (goog.isString(logo)) {
+      logos[logo] = '';
+    } else if (goog.isObject(logo)) {
+      goog.asserts.assertString(logo.href);
+      goog.asserts.assertString(logo.src);
+      logos[logo.src] = logo.href;
+    }
+  }
+
+  var layerGroup = (options.layers instanceof ol.layer.Group) ?
+      options.layers : new ol.layer.Group({layers: options.layers});
+  values[ol.MapProperty.LAYERGROUP] = layerGroup;
+
+  values[ol.MapProperty.TARGET] = options.target;
+
+  values[ol.MapProperty.VIEW] = goog.isDef(options.view) ?
+      options.view : new ol.View();
+
+  /**
+   * @type {function(new: ol.renderer.Map, Element, ol.Map)}
+   */
+  var rendererConstructor = ol.renderer.Map;
+
+  /**
+   * @type {Array.<ol.RendererType>}
+   */
+  var rendererTypes;
+  if (goog.isDef(options.renderer)) {
+    if (goog.isArray(options.renderer)) {
+      rendererTypes = options.renderer;
+    } else if (goog.isString(options.renderer)) {
+      rendererTypes = [options.renderer];
+    } else {
+      goog.asserts.fail('Incorrect format for renderer option');
+    }
+  } else {
+    rendererTypes = ol.DEFAULT_RENDERER_TYPES;
+  }
+
+  var i, ii;
+  for (i = 0, ii = rendererTypes.length; i < ii; ++i) {
+    /** @type {ol.RendererType} */
+    var rendererType = rendererTypes[i];
+    if (ol.ENABLE_CANVAS && rendererType == ol.RendererType.CANVAS) {
+      if (ol.has.CANVAS) {
+        rendererConstructor = ol.renderer.canvas.Map;
+        break;
+      }
+    } else if (ol.ENABLE_DOM && rendererType == ol.RendererType.DOM) {
+      if (ol.has.DOM) {
+        rendererConstructor = ol.renderer.dom.Map;
+        break;
+      }
+    } else if (ol.ENABLE_WEBGL && rendererType == ol.RendererType.WEBGL) {
+      if (ol.has.WEBGL) {
+        rendererConstructor = ol.renderer.webgl.Map;
+        break;
+      }
+    }
+  }
+
+  var controls;
+  if (goog.isDef(options.controls)) {
+    if (goog.isArray(options.controls)) {
+      controls = new ol.Collection(goog.array.clone(options.controls));
+    } else {
+      goog.asserts.assertInstanceof(options.controls, ol.Collection);
+      controls = options.controls;
+    }
+  } else {
+    controls = ol.control.defaults();
+  }
+
+  var deviceOptions = goog.isDef(options.deviceOptions) ?
+      options.deviceOptions : /** @type {olx.DeviceOptions} */ ({});
+
+  var interactions;
+  if (goog.isDef(options.interactions)) {
+    if (goog.isArray(options.interactions)) {
+      interactions = new ol.Collection(goog.array.clone(options.interactions));
+    } else {
+      goog.asserts.assertInstanceof(options.interactions, ol.Collection);
+      interactions = options.interactions;
+    }
+  } else {
+    interactions = ol.interaction.defaults();
+  }
+
+  var overlays;
+  if (goog.isDef(options.overlays)) {
+    if (goog.isArray(options.overlays)) {
+      overlays = new ol.Collection(goog.array.clone(options.overlays));
+    } else {
+      goog.asserts.assertInstanceof(options.overlays, ol.Collection);
+      overlays = options.overlays;
+    }
+  } else {
+    overlays = new ol.Collection();
+  }
+
+  return {
+    controls: controls,
+    deviceOptions: deviceOptions,
+    interactions: interactions,
+    keyboardEventTarget: keyboardEventTarget,
+    logos: logos,
+    overlays: overlays,
+    rendererConstructor: rendererConstructor,
+    values: values
+  };
+
+};
+
+
+ol.proj.common.add();
+
+
+if (goog.DEBUG) {
+  (function() {
+    goog.debug.Console.autoInstall();
+    var logger = goog.log.getLogger('ol');
+    logger.setLevel(goog.log.Level.FINEST);
+  })();
+}
diff --git a/src/ol/mapbrowserevent.js b/src/ol/mapbrowserevent.js
new file mode 100644
index 0000000..199b2fa
--- /dev/null
+++ b/src/ol/mapbrowserevent.js
@@ -0,0 +1,510 @@
+goog.provide('ol.MapBrowserEvent');
+goog.provide('ol.MapBrowserEvent.EventType');
+goog.provide('ol.MapBrowserEventHandler');
+goog.provide('ol.MapBrowserPointerEvent');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.BrowserEvent');
+goog.require('goog.events.EventTarget');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol');
+goog.require('ol.Coordinate');
+goog.require('ol.MapEvent');
+goog.require('ol.Pixel');
+goog.require('ol.pointer.PointerEvent');
+goog.require('ol.pointer.PointerEventHandler');
+
+
+
+/**
+ * @classdesc
+ * Events emitted as map browser events are instances of this type.
+ * See {@link ol.Map} for which events trigger a map browser event.
+ *
+ * @constructor
+ * @extends {ol.MapEvent}
+ * @implements {oli.MapBrowserEvent}
+ * @param {string} type Event type.
+ * @param {ol.Map} map Map.
+ * @param {goog.events.BrowserEvent} browserEvent Browser event.
+ * @param {?olx.FrameState=} opt_frameState Frame state.
+ */
+ol.MapBrowserEvent = function(type, map, browserEvent, opt_frameState) {
+
+  goog.base(this, type, map, opt_frameState);
+
+  /**
+   * @const
+   * @type {goog.events.BrowserEvent}
+   */
+  this.browserEvent = browserEvent;
+
+  /**
+   * @const
+   * @type {Event}
+   * @api stable
+   */
+  this.originalEvent = browserEvent.getBrowserEvent();
+
+  /**
+   * @type {ol.Pixel}
+   * @api stable
+   */
+  this.pixel = map.getEventPixel(this.originalEvent);
+
+  /**
+   * @type {ol.Coordinate}
+   * @api stable
+   */
+  this.coordinate = map.getCoordinateFromPixel(this.pixel);
+
+};
+goog.inherits(ol.MapBrowserEvent, ol.MapEvent);
+
+
+/**
+ * Prevents the default browser action.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault
+ * @override
+ * @api stable
+ */
+ol.MapBrowserEvent.prototype.preventDefault = function() {
+  goog.base(this, 'preventDefault');
+  this.browserEvent.preventDefault();
+};
+
+
+/**
+ * Prevents further propagation of the current event.
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation
+ * @override
+ * @api stable
+ */
+ol.MapBrowserEvent.prototype.stopPropagation = function() {
+  goog.base(this, 'stopPropagation');
+  this.browserEvent.stopPropagation();
+};
+
+
+
+/**
+ * @constructor
+ * @extends {ol.MapBrowserEvent}
+ * @param {string} type Event type.
+ * @param {ol.Map} map Map.
+ * @param {ol.pointer.PointerEvent} pointerEvent Pointer event.
+ * @param {?olx.FrameState=} opt_frameState Frame state.
+ */
+ol.MapBrowserPointerEvent = function(type, map, pointerEvent, opt_frameState) {
+
+  goog.base(this, type, map, pointerEvent.browserEvent, opt_frameState);
+
+  /**
+   * @const
+   * @type {ol.pointer.PointerEvent}
+   */
+  this.pointerEvent = pointerEvent;
+
+};
+goog.inherits(ol.MapBrowserPointerEvent, ol.MapBrowserEvent);
+
+
+
+/**
+ * @param {ol.Map} map The map with the viewport to listen to events on.
+ * @constructor
+ * @extends {goog.events.EventTarget}
+ */
+ol.MapBrowserEventHandler = function(map) {
+
+  goog.base(this);
+
+  /**
+   * This is the element that we will listen to the real events on.
+   * @type {ol.Map}
+   * @private
+   */
+  this.map_ = map;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.clickTimeoutId_ = 0;
+
+  /**
+   * @type {boolean}
+   * @private
+   */
+  this.dragged_ = false;
+
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+  this.dragListenerKeys_ = null;
+
+  /**
+   * @type {goog.events.Key}
+   * @private
+   */
+  this.pointerdownListenerKey_ = null;
+
+  if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+    /**
+     * @type {goog.events.Key}
+     * @private
+     */
+    this.ieDblclickListenerKey_ = null;
+  }
+
+  /**
+   * @type {ol.pointer.PointerEvent}
+   * @private
+   */
+  this.down_ = null;
+
+  var element = this.map_.getViewport();
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.activePointers_ = 0;
+
+  /**
+   * @type {Object.<number, boolean>}
+   * @private
+   */
+  this.trackedTouches_ = {};
+
+  /**
+   * Event handler which generates pointer events for
+   * the viewport element.
+   *
+   * @type {ol.pointer.PointerEventHandler}
+   * @private
+   */
+  this.pointerEventHandler_ = new ol.pointer.PointerEventHandler(element);
+
+  /**
+   * Event handler which generates pointer events for
+   * the document (used when dragging).
+   *
+   * @type {ol.pointer.PointerEventHandler}
+   * @private
+   */
+  this.documentPointerEventHandler_ = null;
+
+  this.pointerdownListenerKey_ = goog.events.listen(this.pointerEventHandler_,
+      ol.pointer.EventType.POINTERDOWN,
+      this.handlePointerDown_, false, this);
+
+  this.relayedListenerKey_ = goog.events.listen(this.pointerEventHandler_,
+      ol.pointer.EventType.POINTERMOVE,
+      this.relayEvent_, false, this);
+
+  if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+    /*
+     * On legacy IE, double clicks do not produce two mousedown and
+     * mouseup events. That is why a separate DBLCLICK event listener
+     * is used.
+     */
+    this.ieDblclickListenerKey_ = goog.events.listen(element,
+        goog.events.EventType.DBLCLICK,
+        this.emulateClickLegacyIE_, false, this);
+  }
+
+};
+goog.inherits(ol.MapBrowserEventHandler, goog.events.EventTarget);
+
+
+/**
+ * Get the last "down" type event. This will be set on pointerdown.
+ * @return {ol.pointer.PointerEvent} The most recent "down" type event (or null
+ * if none have occurred).
+ */
+ol.MapBrowserEventHandler.prototype.getDown = function() {
+  return this.down_;
+};
+
+
+/**
+ * @param {goog.events.BrowserEvent} browserEvent Pointer event.
+ * @private
+ */
+ol.MapBrowserEventHandler.prototype.emulateClickLegacyIE_ =
+    function(browserEvent) {
+  var pointerEvent = this.pointerEventHandler_.wrapMouseEvent(
+      ol.MapBrowserEvent.EventType.POINTERUP,
+      browserEvent
+      );
+  this.emulateClick_(pointerEvent);
+};
+
+
+/**
+ * @param {ol.pointer.PointerEvent} pointerEvent Pointer event.
+ * @private
+ */
+ol.MapBrowserEventHandler.prototype.emulateClick_ = function(pointerEvent) {
+  var newEvent;
+  newEvent = new ol.MapBrowserPointerEvent(
+      ol.MapBrowserEvent.EventType.CLICK, this.map_, pointerEvent);
+  this.dispatchEvent(newEvent);
+  if (this.clickTimeoutId_ !== 0) {
+    // double-click
+    goog.global.clearTimeout(this.clickTimeoutId_);
+    this.clickTimeoutId_ = 0;
+    newEvent = new ol.MapBrowserPointerEvent(
+        ol.MapBrowserEvent.EventType.DBLCLICK, this.map_, pointerEvent);
+    this.dispatchEvent(newEvent);
+  } else {
+    // click
+    this.clickTimeoutId_ = goog.global.setTimeout(goog.bind(function() {
+      this.clickTimeoutId_ = 0;
+      var newEvent = new ol.MapBrowserPointerEvent(
+          ol.MapBrowserEvent.EventType.SINGLECLICK, this.map_, pointerEvent);
+      this.dispatchEvent(newEvent);
+    }, this), 250);
+  }
+};
+
+
+/**
+ * Keeps track on how many pointers are currently active.
+ *
+ * @param {ol.pointer.PointerEvent} pointerEvent Pointer event.
+ * @private
+ */
+ol.MapBrowserEventHandler.prototype.updateActivePointers_ =
+    function(pointerEvent) {
+  var event = pointerEvent;
+
+  if (event.type == ol.MapBrowserEvent.EventType.POINTERUP ||
+      event.type == ol.MapBrowserEvent.EventType.POINTERCANCEL) {
+    delete this.trackedTouches_[event.pointerId];
+  } else if (event.type == ol.MapBrowserEvent.EventType.POINTERDOWN) {
+    this.trackedTouches_[event.pointerId] = true;
+  }
+  this.activePointers_ = goog.object.getCount(this.trackedTouches_);
+};
+
+
+/**
+ * @param {ol.pointer.PointerEvent} pointerEvent Pointer event.
+ * @private
+ */
+ol.MapBrowserEventHandler.prototype.handlePointerUp_ = function(pointerEvent) {
+  this.updateActivePointers_(pointerEvent);
+  var newEvent = new ol.MapBrowserPointerEvent(
+      ol.MapBrowserEvent.EventType.POINTERUP, this.map_, pointerEvent);
+  this.dispatchEvent(newEvent);
+
+  goog.asserts.assert(this.activePointers_ >= 0);
+  if (this.activePointers_ === 0) {
+    goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey);
+    this.dragListenerKeys_ = null;
+    goog.dispose(this.documentPointerEventHandler_);
+    this.documentPointerEventHandler_ = null;
+  }
+
+  // We emulate click event on left mouse button click, touch contact, and pen
+  // contact. isMouseActionButton returns true in these cases (evt.button is set
+  // to 0).
+  // See http://www.w3.org/TR/pointerevents/#button-states
+  if (!this.dragged_ && this.isMouseActionButton_(pointerEvent)) {
+    goog.asserts.assert(!goog.isNull(this.down_));
+    this.emulateClick_(this.down_);
+  }
+};
+
+
+/**
+ * @param {ol.pointer.PointerEvent} pointerEvent Pointer event.
+ * @return {boolean} If the left mouse button was pressed.
+ * @private
+ */
+ol.MapBrowserEventHandler.prototype.isMouseActionButton_ =
+    function(pointerEvent) {
+  if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+    return pointerEvent.button == 1;
+  } else {
+    return pointerEvent.button === 0;
+  }
+};
+
+
+/**
+ * @param {ol.pointer.PointerEvent} pointerEvent Pointer event.
+ * @private
+ */
+ol.MapBrowserEventHandler.prototype.handlePointerDown_ =
+    function(pointerEvent) {
+  this.updateActivePointers_(pointerEvent);
+  var newEvent = new ol.MapBrowserPointerEvent(
+      ol.MapBrowserEvent.EventType.POINTERDOWN, this.map_, pointerEvent);
+  this.dispatchEvent(newEvent);
+
+  this.down_ = pointerEvent;
+  this.dragged_ = false;
+
+  if (goog.isNull(this.dragListenerKeys_)) {
+    /* Set up a pointer event handler on the `document`,
+     * which is required when the pointer is moved outside
+     * the viewport when dragging.
+     */
+    this.documentPointerEventHandler_ =
+        new ol.pointer.PointerEventHandler(document);
+
+    this.dragListenerKeys_ = [
+      goog.events.listen(this.documentPointerEventHandler_,
+          ol.MapBrowserEvent.EventType.POINTERMOVE,
+          this.handlePointerMove_, false, this),
+      goog.events.listen(this.documentPointerEventHandler_,
+          ol.MapBrowserEvent.EventType.POINTERUP,
+          this.handlePointerUp_, false, this),
+      /* Note that the listener for `pointercancel is set up on
+       * `pointerEventHandler_` and not `documentPointerEventHandler_` like
+       * the `pointerup` and `pointermove` listeners.
+       *
+       * The reason for this is the following: `TouchSource.vacuumTouches_()`
+       * issues `pointercancel` events, when there was no `touchend` for a
+       * `touchstart`. Now, let's say a first `touchstart` is registered on
+       * `pointerEventHandler_`. The `documentPointerEventHandler_` is set up.
+       * But `documentPointerEventHandler_` doesn't know about the first
+       * `touchstart`. If there is no `touchend` for the `touchstart`, we can
+       * only receive a `touchcancel` from `pointerEventHandler_`, because it is
+       * only registered there.
+       */
+      goog.events.listen(this.pointerEventHandler_,
+          ol.MapBrowserEvent.EventType.POINTERCANCEL,
+          this.handlePointerUp_, false, this)
+    ];
+  }
+};
+
+
+/**
+ * @param {ol.pointer.PointerEvent} pointerEvent Pointer event.
+ * @private
+ */
+ol.MapBrowserEventHandler.prototype.handlePointerMove_ =
+    function(pointerEvent) {
+  // Fix IE10 on windows Surface : When you tap the tablet, it triggers
+  // multiple pointermove events between pointerdown and pointerup with
+  // the exact same coordinates of the pointerdown event. To avoid a
+  // 'false' touchmove event to be dispatched , we test if the pointer
+  // effectively moved.
+  if (pointerEvent.clientX != this.down_.clientX ||
+      pointerEvent.clientY != this.down_.clientY) {
+    this.dragged_ = true;
+    var newEvent = new ol.MapBrowserPointerEvent(
+        ol.MapBrowserEvent.EventType.POINTERDRAG, this.map_, pointerEvent);
+    this.dispatchEvent(newEvent);
+  }
+
+  // Some native android browser triggers mousemove events during small period
+  // of time. See: https://code.google.com/p/android/issues/detail?id=5491 or
+  // https://code.google.com/p/android/issues/detail?id=19827
+  // ex: Galaxy Tab P3110 + Android 4.1.1
+  pointerEvent.preventDefault();
+};
+
+
+/**
+ * Wrap and relay a pointer event.  Note that this requires that the type
+ * string for the MapBrowserPointerEvent matches the PointerEvent type.
+ * @param {ol.pointer.PointerEvent} pointerEvent Pointer event.
+ * @private
+ */
+ol.MapBrowserEventHandler.prototype.relayEvent_ = function(pointerEvent) {
+  this.dispatchEvent(new ol.MapBrowserPointerEvent(
+      pointerEvent.type, this.map_, pointerEvent));
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.MapBrowserEventHandler.prototype.disposeInternal = function() {
+  if (!goog.isNull(this.relayedListenerKey_)) {
+    goog.events.unlistenByKey(this.relayedListenerKey_);
+    this.relayedListenerKey_ = null;
+  }
+  if (!goog.isNull(this.pointerdownListenerKey_)) {
+    goog.events.unlistenByKey(this.pointerdownListenerKey_);
+    this.pointerdownListenerKey_ = null;
+  }
+  if (!goog.isNull(this.dragListenerKeys_)) {
+    goog.array.forEach(this.dragListenerKeys_, goog.events.unlistenByKey);
+    this.dragListenerKeys_ = null;
+  }
+  if (!goog.isNull(this.documentPointerEventHandler_)) {
+    goog.dispose(this.documentPointerEventHandler_);
+    this.documentPointerEventHandler_ = null;
+  }
+  if (!goog.isNull(this.pointerEventHandler_)) {
+    goog.dispose(this.pointerEventHandler_);
+    this.pointerEventHandler_ = null;
+  }
+  if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE &&
+      !goog.isNull(this.ieDblclickListenerKey_)) {
+    goog.events.unlistenByKey(this.ieDblclickListenerKey_);
+    this.ieDblclickListenerKey_ = null;
+  }
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * Constants for event names.
+ * @enum {string}
+ */
+ol.MapBrowserEvent.EventType = {
+  // derived event types
+  /**
+   * A true single click with no dragging and no double click. Note that this
+   * event is delayed by 250 ms to ensure that it is not a double click.
+   * @event ol.MapBrowserEvent#singleclick
+   * @api
+   */
+  SINGLECLICK: 'singleclick',
+  /**
+   * A click with no dragging. A double click will fire two of this.
+   * @event ol.MapBrowserEvent#click
+   * @api
+   */
+  CLICK: goog.events.EventType.CLICK,
+  /**
+   * A true double click, with no dragging.
+   * @event ol.MapBrowserEvent#dblclick
+   * @api
+   */
+  DBLCLICK: goog.events.EventType.DBLCLICK,
+  /**
+   * Triggered when a pointer is dragged.
+   * @event ol.MapBrowserEvent#pointerdrag
+   * @api
+   */
+  POINTERDRAG: 'pointerdrag',
+
+  // original pointer event types
+  /**
+   * Triggered when a pointer is moved. Note that on touch devices this is
+   * triggered when the map is panned, so is not the same as mousemove.
+   * @event ol.MapBrowserEvent#pointermove
+   * @api
+   */
+  POINTERMOVE: 'pointermove',
+  POINTERDOWN: 'pointerdown',
+  POINTERUP: 'pointerup',
+  POINTEROVER: 'pointerover',
+  POINTEROUT: 'pointerout',
+  POINTERENTER: 'pointerenter',
+  POINTERLEAVE: 'pointerleave',
+  POINTERCANCEL: 'pointercancel'
+};
diff --git a/src/ol/mapevent.js b/src/ol/mapevent.js
new file mode 100644
index 0000000..260d002
--- /dev/null
+++ b/src/ol/mapevent.js
@@ -0,0 +1,58 @@
+goog.provide('ol.MapEvent');
+goog.provide('ol.MapEventType');
+
+goog.require('goog.events.Event');
+
+
+/**
+ * @enum {string}
+ */
+ol.MapEventType = {
+  /**
+   * Triggered after a map frame is rendered.
+   * @event ol.MapEvent#postrender
+   * @api
+   */
+  POSTRENDER: 'postrender',
+  /**
+   * Triggered after the map is moved.
+   * @event ol.MapEvent#moveend
+   * @api
+   */
+  MOVEEND: 'moveend'
+};
+
+
+
+/**
+ * @classdesc
+ * Events emitted as map events are instances of this type.
+ * See {@link ol.Map} for which events trigger a map event.
+ *
+ * @constructor
+ * @extends {goog.events.Event}
+ * @implements {oli.MapEvent}
+ * @param {string} type Event type.
+ * @param {ol.Map} map Map.
+ * @param {?olx.FrameState=} opt_frameState Frame state.
+ */
+ol.MapEvent = function(type, map, opt_frameState) {
+
+  goog.base(this, type);
+
+  /**
+   * The map where the event occurred.
+   * @type {ol.Map}
+   * @api stable
+   */
+  this.map = map;
+
+  /**
+   * The frame state at the time of the event.
+   * @type {?olx.FrameState}
+   * @api
+   */
+  this.frameState = goog.isDef(opt_frameState) ? opt_frameState : null;
+
+};
+goog.inherits(ol.MapEvent, goog.events.Event);
diff --git a/src/ol/math.js b/src/ol/math.js
new file mode 100644
index 0000000..70c46df
--- /dev/null
+++ b/src/ol/math.js
@@ -0,0 +1,112 @@
+goog.provide('ol.math');
+
+goog.require('goog.asserts');
+
+
+/**
+ * @param {number} x X.
+ * @return {number} Hyperbolic cosine of x.
+ */
+ol.math.cosh = function(x) {
+  return (Math.exp(x) + Math.exp(-x)) / 2;
+};
+
+
+/**
+ * @param {number} x X.
+ * @return {number} Hyperbolic cotangent of x.
+ */
+ol.math.coth = function(x) {
+  var expMinusTwoX = Math.exp(-2 * x);
+  return (1 + expMinusTwoX) / (1 - expMinusTwoX);
+};
+
+
+/**
+ * @param {number} x X.
+ * @return {number} Hyperbolic cosecant of x.
+ */
+ol.math.csch = function(x) {
+  return 2 / (Math.exp(x) - Math.exp(-x));
+};
+
+
+/**
+ * @param {number} x X.
+ * @return {number} The smallest power of two greater than or equal to x.
+ */
+ol.math.roundUpToPowerOfTwo = function(x) {
+  goog.asserts.assert(0 < x);
+  return Math.pow(2, Math.ceil(Math.log(x) / Math.LN2));
+};
+
+
+/**
+ * @param {number} x X.
+ * @return {number} Hyperbolic secant of x.
+ */
+ol.math.sech = function(x) {
+  return 2 / (Math.exp(x) + Math.exp(-x));
+};
+
+
+/**
+ * @param {number} x X.
+ * @return {number} Hyperbolic sine of x.
+ */
+ol.math.sinh = function(x) {
+  return (Math.exp(x) - Math.exp(-x)) / 2;
+};
+
+
+/**
+ * Returns the square of the closest distance between the point (x, y) and the
+ * line segment (x1, y1) to (x2, y2).
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @param {number} x1 X1.
+ * @param {number} y1 Y1.
+ * @param {number} x2 X2.
+ * @param {number} y2 Y2.
+ * @return {number} Squared distance.
+ */
+ol.math.squaredSegmentDistance = function(x, y, x1, y1, x2, y2) {
+  var dx = x2 - x1;
+  var dy = y2 - y1;
+  if (dx !== 0 || dy !== 0) {
+    var t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);
+    if (t > 1) {
+      x1 = x2;
+      y1 = y2;
+    } else if (t > 0) {
+      x1 += dx * t;
+      y1 += dy * t;
+    }
+  }
+  return ol.math.squaredDistance(x, y, x1, y1);
+};
+
+
+/**
+ * Returns the square of the distance between the points (x1, y1) and (x2, y2).
+ * @param {number} x1 X1.
+ * @param {number} y1 Y1.
+ * @param {number} x2 X2.
+ * @param {number} y2 Y2.
+ * @return {number} Squared distance.
+ */
+ol.math.squaredDistance = function(x1, y1, x2, y2) {
+  var dx = x2 - x1;
+  var dy = y2 - y1;
+  return dx * dx + dy * dy;
+};
+
+
+/**
+ * @param {number} x X.
+ * @return {number} Hyperbolic tangent of x.
+ */
+ol.math.tanh = function(x) {
+  var expMinusTwoX = Math.exp(-2 * x);
+  return (1 - expMinusTwoX) / (1 + expMinusTwoX);
+};
diff --git a/src/ol/object.js b/src/ol/object.js
new file mode 100644
index 0000000..fe5a613
--- /dev/null
+++ b/src/ol/object.js
@@ -0,0 +1,491 @@
+/**
+ * An implementation of Google Maps' MVCObject.
+ * @see https://developers.google.com/maps/articles/mvcfun
+ * @see https://developers.google.com/maps/documentation/javascript/reference
+ */
+
+goog.provide('ol.Object');
+goog.provide('ol.ObjectEvent');
+goog.provide('ol.ObjectEventType');
+
+goog.require('goog.events');
+goog.require('goog.events.Event');
+goog.require('goog.functions');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('ol.Observable');
+
+
+/**
+ * @enum {string}
+ */
+ol.ObjectEventType = {
+  /**
+   * Triggered when a property is changed.
+   * @event ol.ObjectEvent#propertychange
+   * @api
+   */
+  PROPERTYCHANGE: 'propertychange'
+};
+
+
+
+/**
+ * @classdesc
+ * Events emitted by {@link ol.Object} instances are instances of this type.
+ *
+ * @param {string} type The event type.
+ * @param {string} key The property name.
+ * @param {*} oldValue The old value for `key`.
+ * @extends {goog.events.Event}
+ * @implements {oli.ObjectEvent}
+ * @constructor
+ */
+ol.ObjectEvent = function(type, key, oldValue) {
+  goog.base(this, type);
+
+  /**
+   * The name of the property whose value is changing.
+   * @type {string}
+   * @api
+   */
+  this.key = key;
+
+  /**
+   * The old value. To get the new value use `e.target.get(e.key)` where
+   * `e` is the event object.
+   * @type {*}
+   * @api
+   */
+  this.oldValue = oldValue;
+
+};
+goog.inherits(ol.ObjectEvent, goog.events.Event);
+
+
+
+/**
+ * @constructor
+ * @param {ol.Object} source Source object.
+ * @param {ol.Object} target Target object.
+ * @param {string} sourceKey Source key.
+ * @param {string} targetKey Target key.
+ */
+ol.ObjectAccessor = function(source, target, sourceKey, targetKey) {
+
+  /**
+   * @type {ol.Object}
+   */
+  this.source = source;
+
+  /**
+   * @type {ol.Object}
+   */
+  this.target = target;
+
+  /**
+   * @type {string}
+   */
+  this.sourceKey = sourceKey;
+
+  /**
+   * @type {string}
+   */
+  this.targetKey = targetKey;
+
+  /**
+   * @type {function(?): ?}
+   */
+  this.from = goog.functions.identity;
+
+  /**
+   * @type {function(?): ?}
+   */
+  this.to = goog.functions.identity;
+};
+
+
+/**
+ * @param {function(?): ?} from A function that transforms the source value
+ *     before it is set to the target.
+ * @param {function(?): ?} to A function that transforms the target value
+ *     before it is set to the source.
+ * @api
+ */
+ol.ObjectAccessor.prototype.transform = function(from, to) {
+  var oldValue = ol.Object.getKeyValue_(this.source, this.sourceKey);
+  this.from = from;
+  this.to = to;
+  this.source.notify(this.sourceKey, oldValue);
+};
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Most non-trivial classes inherit from this.
+ *
+ * This extends {@link ol.Observable} with observable properties, where each
+ * property is observable as well as the object as a whole.
+ *
+ * Classes that inherit from this have pre-defined properties, to which you can
+ * add your own. The pre-defined properties are listed in this documentation as
+ * 'Observable Properties', and have their own accessors; for example,
+ * {@link ol.Map} has a `target` property, accessed with `getTarget()`  and
+ * changed with `setTarget()`. Not all properties are however settable. There
+ * are also general-purpose accessors `get()` and `set()`. For example,
+ * `get('target')` is equivalent to `getTarget()`.
+ *
+ * The `set` accessors trigger a change event, and you can monitor this by
+ * registering a listener. For example, {@link ol.View} has a `center`
+ * property, so `view.on('change:center', function(evt) {...});` would call the
+ * function whenever the value of the center property changes. Within the
+ * function, `evt.target` would be the view, so `evt.target.getCenter()` would
+ * return the new center.
+ *
+ * You can add your own observable properties with
+ * `object.set('prop', 'value')`, and retrieve that with `object.get('prop')`.
+ * You can listen for changes on that property value with
+ * `object.on('change:prop', listener)`. You can get a list of all
+ * properties with {@link ol.Object#getProperties object.getProperties()}.
+ *
+ * Note that the observable properties are separate from standard JS properties.
+ * You can, for example, give your map object a title with
+ * `map.title='New title'` and with `map.set('title', 'Another title')`. The
+ * first will be a `hasOwnProperty`; the second will appear in
+ * `getProperties()`. Only the second is observable.
+ *
+ * The observable properties also implement a form of Key Value Observing.
+ * Two objects can be bound together such that a change in one will
+ * automatically be reflected in the other. See `bindTo` method for more
+ * details, and see {@link ol.dom.Input} for the specific case of binding an
+ * object with an HTML element.
+ *
+ * @constructor
+ * @extends {ol.Observable}
+ * @param {Object.<string, *>=} opt_values An object with key-value pairs.
+ * @fires ol.ObjectEvent
+ * @api
+ */
+ol.Object = function(opt_values) {
+  goog.base(this);
+
+  // Call goog.getUid to ensure that the order of objects' ids is the same as
+  // the order in which they were created.  This also helps to ensure that
+  // object properties are always added in the same order, which helps many
+  // JavaScript engines generate faster code.
+  goog.getUid(this);
+
+  /**
+   * @private
+   * @type {Object.<string, *>}
+   */
+  this.values_ = {};
+
+  /**
+   * @private
+   * @type {Object.<string, ol.ObjectAccessor>}
+   */
+  this.accessors_ = {};
+
+  /**
+   * @private
+   * @type {Object.<string, goog.events.Key>}
+   */
+  this.listeners_ = {};
+
+  if (goog.isDef(opt_values)) {
+    this.setProperties(opt_values);
+  }
+};
+goog.inherits(ol.Object, ol.Observable);
+
+
+/**
+ * @private
+ * @type {Object.<string, string>}
+ */
+ol.Object.changeEventTypeCache_ = {};
+
+
+/**
+ * @private
+ * @type {Object.<string, string>}
+ */
+ol.Object.getterNameCache_ = {};
+
+
+/**
+ * @private
+ * @type {Object.<string, string>}
+ */
+ol.Object.setterNameCache_ = {};
+
+
+/**
+ * @param {string} key Key name.
+ * @return {string} Change name.
+ */
+ol.Object.getChangeEventType = function(key) {
+  return ol.Object.changeEventTypeCache_.hasOwnProperty(key) ?
+      ol.Object.changeEventTypeCache_[key] :
+      (ol.Object.changeEventTypeCache_[key] = 'change:' + key);
+};
+
+
+/**
+ * @param {string} key String.
+ * @return {string} Getter name.
+ */
+ol.Object.getGetterName = function(key) {
+  return ol.Object.getterNameCache_.hasOwnProperty(key) ?
+      ol.Object.getterNameCache_[key] :
+      (ol.Object.getterNameCache_[key] = 'get' + goog.string.capitalize(key));
+};
+
+
+/**
+ * @param {string} key String.
+ * @return {string} Setter name.
+ */
+ol.Object.getSetterName = function(key) {
+  return ol.Object.setterNameCache_.hasOwnProperty(key) ?
+      ol.Object.setterNameCache_[key] :
+      (ol.Object.setterNameCache_[key] = 'set' + goog.string.capitalize(key));
+};
+
+
+/**
+ * Get the value for an object and a key. Use the getter (`getX`) if it exists,
+ * otherwise use the generic `get` function.
+ * @param {ol.Object} obj Object.
+ * @param {string} key Key;
+ * @return {*} Value;
+ * @private
+ */
+ol.Object.getKeyValue_ = function(obj, key) {
+  var getterName = ol.Object.getGetterName(key);
+  var getter = /** @type {function(): *|undefined} */
+      (goog.object.get(obj, getterName));
+  return goog.isDef(getter) ? getter.call(obj) : obj.get(key);
+};
+
+
+/**
+ * Set the value for an object and a key. Use the setter (`setX`) if it exists,
+ * otherwise use the generic `set` function.
+ * @param {ol.Object} obj Object.
+ * @param {string} key Key.
+ * @param {*} value Value.
+ * @private
+ */
+ol.Object.setKeyValue_ = function(obj, key, value) {
+  var setterName = ol.Object.getSetterName(key);
+  var setter = /** @type {function(*)|undefined} */
+      (goog.object.get(obj, setterName));
+  if (goog.isDef(setter)) {
+    setter.call(obj, value);
+  } else {
+    obj.set(key, value);
+  }
+};
+
+
+/**
+ * The bindTo method allows you to set up a two-way binding between a
+ * `source` and `target` object. The method returns an object with a
+ * `transform` method that you can use to provide `from` and `to`
+ * functions to transform values on the way from the source to the
+ * target and on the way back.
+*
+ * For example, if you had two map views (sourceView and targetView)
+ * and you wanted the target view to have double the resolution of the
+ * source view, you could transform the resolution on the way to and
+ * from the target with the following:
+ *
+ *     sourceView.bindTo('resolution', targetView)
+ *       .transform(
+ *         function(sourceResolution) {
+ *           // from sourceView.resolution to targetView.resolution
+ *           return 2 * sourceResolution;
+ *         },
+ *         function(targetResolution) {
+ *           // from targetView.resolution to sourceView.resolution
+ *           return targetResolution / 2;
+ *         }
+ *       );
+ *
+ * @param {string} key Key name.
+ * @param {ol.Object} target Target.
+ * @param {string=} opt_targetKey Target key.
+ * @return {ol.ObjectAccessor}
+ * @api
+ */
+ol.Object.prototype.bindTo = function(key, target, opt_targetKey) {
+  var targetKey = opt_targetKey || key;
+  this.unbind(key);
+
+  // listen for change:targetkey events
+  var eventType = ol.Object.getChangeEventType(targetKey);
+  this.listeners_[key] = goog.events.listen(target, eventType,
+      /**
+       * @param {ol.ObjectEvent} e Event.
+       * @this {ol.Object}
+       */
+      function(e) {
+        this.notify(key, e.oldValue);
+      }, undefined, this);
+
+  var accessor = new ol.ObjectAccessor(this, target, key, targetKey);
+  this.accessors_[key] = accessor;
+  this.notify(key, this.values_[key]);
+  return accessor;
+};
+
+
+/**
+ * Gets a value.
+ * @param {string} key Key name.
+ * @return {*} Value.
+ * @api
+ */
+ol.Object.prototype.get = function(key) {
+  var value;
+  var accessors = this.accessors_;
+  if (accessors.hasOwnProperty(key)) {
+    var accessor = accessors[key];
+    value = ol.Object.getKeyValue_(accessor.target, accessor.targetKey);
+    value = accessor.to(value);
+  } else if (this.values_.hasOwnProperty(key)) {
+    value = this.values_[key];
+  }
+  return value;
+};
+
+
+/**
+ * Get a list of object property names.
+ * @return {Array.<string>} List of property names.
+ * @api
+ */
+ol.Object.prototype.getKeys = function() {
+  var accessors = this.accessors_;
+  var keysObject;
+  if (goog.object.isEmpty(this.values_)) {
+    if (goog.object.isEmpty(accessors)) {
+      return [];
+    } else {
+      keysObject = accessors;
+    }
+  } else {
+    if (goog.object.isEmpty(accessors)) {
+      keysObject = this.values_;
+    } else {
+      keysObject = {};
+      var key;
+      for (key in this.values_) {
+        keysObject[key] = true;
+      }
+      for (key in accessors) {
+        keysObject[key] = true;
+      }
+    }
+  }
+  return goog.object.getKeys(keysObject);
+};
+
+
+/**
+ * Get an object of all property names and values.
+ * @return {Object.<string, *>} Object.
+ * @api
+ */
+ol.Object.prototype.getProperties = function() {
+  var properties = {};
+  var key;
+  for (key in this.values_) {
+    properties[key] = this.values_[key];
+  }
+  for (key in this.accessors_) {
+    properties[key] = this.get(key);
+  }
+  return properties;
+};
+
+
+/**
+ * @param {string} key Key name.
+ * @param {*} oldValue Old value.
+ */
+ol.Object.prototype.notify = function(key, oldValue) {
+  var eventType;
+  eventType = ol.Object.getChangeEventType(key);
+  this.dispatchEvent(new ol.ObjectEvent(eventType, key, oldValue));
+  eventType = ol.ObjectEventType.PROPERTYCHANGE;
+  this.dispatchEvent(new ol.ObjectEvent(eventType, key, oldValue));
+};
+
+
+/**
+ * Sets a value.
+ * @param {string} key Key name.
+ * @param {*} value Value.
+ * @api
+ */
+ol.Object.prototype.set = function(key, value) {
+  var accessors = this.accessors_;
+  if (accessors.hasOwnProperty(key)) {
+    var accessor = accessors[key];
+    value = accessor.from(value);
+    ol.Object.setKeyValue_(accessor.target, accessor.targetKey, value);
+  } else {
+    var oldValue = this.values_[key];
+    this.values_[key] = value;
+    this.notify(key, oldValue);
+  }
+};
+
+
+/**
+ * Sets a collection of key-value pairs.
+ * @param {Object.<string, *>} values Values.
+ * @api
+ */
+ol.Object.prototype.setProperties = function(values) {
+  var key;
+  for (key in values) {
+    this.set(key, values[key]);
+  }
+};
+
+
+/**
+ * Removes a binding. Unbinding will set the unbound property to the current
+ *     value. The object will not be notified, as the value has not changed.
+ * @param {string} key Key name.
+ * @api
+ */
+ol.Object.prototype.unbind = function(key) {
+  var listeners = this.listeners_;
+  var listener = listeners[key];
+  if (listener) {
+    delete listeners[key];
+    goog.events.unlistenByKey(listener);
+    var value = this.get(key);
+    delete this.accessors_[key];
+    this.values_[key] = value;
+  }
+};
+
+
+/**
+ * Removes all bindings.
+ * @api
+ */
+ol.Object.prototype.unbindAll = function() {
+  for (var key in this.listeners_) {
+    this.unbind(key);
+  }
+};
diff --git a/src/ol/observable.js b/src/ol/observable.js
new file mode 100644
index 0000000..0f48f60
--- /dev/null
+++ b/src/ol/observable.js
@@ -0,0 +1,114 @@
+goog.provide('ol.Observable');
+
+goog.require('goog.events');
+goog.require('goog.events.EventTarget');
+goog.require('goog.events.EventType');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * An event target providing convenient methods for listener registration
+ * and unregistration. A generic `change` event is always available through
+ * {@link ol.Observable#changed}.
+ *
+ * @constructor
+ * @extends {goog.events.EventTarget}
+ * @suppress {checkStructDictInheritance}
+ * @struct
+ * @api stable
+ */
+ol.Observable = function() {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.revision_ = 0;
+
+};
+goog.inherits(ol.Observable, goog.events.EventTarget);
+
+
+/**
+ * Removes an event listener using the key returned by `on()` or `once()`.
+ * @param {goog.events.Key} key The key returned by `on()` or `once()`.
+ * @api stable
+ */
+ol.Observable.unByKey = function(key) {
+  goog.events.unlistenByKey(key);
+};
+
+
+/**
+ * Increases the revision counter and disptches a 'change' event.
+ * @fires change
+ * @api
+ */
+ol.Observable.prototype.changed = function() {
+  ++this.revision_;
+  this.dispatchEvent(goog.events.EventType.CHANGE);
+};
+
+
+/**
+ * @return {number} Revision.
+ * @api
+ */
+ol.Observable.prototype.getRevision = function() {
+  return this.revision_;
+};
+
+
+/**
+ * Listen for a certain type of event.
+ * @param {string|Array.<string>} type The event type or array of event types.
+ * @param {function(?): ?} listener The listener function.
+ * @param {Object=} opt_this The object to use as `this` in `listener`.
+ * @return {goog.events.Key} Unique key for the listener.
+ * @api stable
+ */
+ol.Observable.prototype.on = function(type, listener, opt_this) {
+  return goog.events.listen(this, type, listener, false, opt_this);
+};
+
+
+/**
+ * Listen once for a certain type of event.
+ * @param {string|Array.<string>} type The event type or array of event types.
+ * @param {function(?): ?} listener The listener function.
+ * @param {Object=} opt_this The object to use as `this` in `listener`.
+ * @return {goog.events.Key} Unique key for the listener.
+ * @api stable
+ */
+ol.Observable.prototype.once = function(type, listener, opt_this) {
+  return goog.events.listenOnce(this, type, listener, false, opt_this);
+};
+
+
+/**
+ * Unlisten for a certain type of event.
+ * @param {string|Array.<string>} type The event type or array of event types.
+ * @param {function(?): ?} listener The listener function.
+ * @param {Object=} opt_this The object which was used as `this` by the
+ * `listener`.
+ * @api stable
+ */
+ol.Observable.prototype.un = function(type, listener, opt_this) {
+  goog.events.unlisten(this, type, listener, false, opt_this);
+};
+
+
+/**
+ * Removes an event listener using the key returned by `on()` or `once()`.
+ * Note that using the {@link ol.Observable.unByKey} static function is to
+ * be preferred.
+ * @param {goog.events.Key} key The key returned by `on()` or `once()`.
+ * @function
+ * @api stable
+ */
+ol.Observable.prototype.unByKey = ol.Observable.unByKey;
diff --git a/src/ol/ol.js b/src/ol/ol.js
new file mode 100644
index 0000000..01ca364
--- /dev/null
+++ b/src/ol/ol.js
@@ -0,0 +1,293 @@
+goog.require('goog.userAgent');
+
+goog.provide('ol');
+
+
+/**
+ * Constants defined with the define tag cannot be changed in application
+ * code, but can be set at compile time.
+ * Some reduce the size of the build in advanced compile mode.
+ */
+
+
+/**
+ * @define {boolean} Assume touch.  Default is `false`.
+ */
+ol.ASSUME_TOUCH = false;
+
+
+/**
+ * @define {boolean} Replace unused entries with NaNs.
+ */
+ol.BUFFER_REPLACE_UNUSED_ENTRIES_WITH_NANS = goog.DEBUG;
+
+
+/**
+ * TODO: rename this to something having to do with tile grids
+ * see https://github.com/openlayers/ol3/issues/2076
+ * @define {number} Default maximum zoom for default tile grids.
+ */
+ol.DEFAULT_MAX_ZOOM = 42;
+
+
+/**
+ * @define {number} Default min zoom level for the map view.  Default is `0`.
+ */
+ol.DEFAULT_MIN_ZOOM = 0;
+
+
+/**
+ * @define {number} Default high water mark.
+ */
+ol.DEFAULT_TILE_CACHE_HIGH_WATER_MARK = 2048;
+
+
+/**
+ * @define {number} Default tile size.
+ */
+ol.DEFAULT_TILE_SIZE = 256;
+
+
+/**
+ * @define {string} Default WMS version.
+ */
+ol.DEFAULT_WMS_VERSION = '1.3.0';
+
+
+/**
+ * @define {number} Drag-rotate-zoom animation duration.
+ */
+ol.DRAGROTATEANDZOOM_ANIMATION_DURATION = 400;
+
+
+/**
+ * @define {number} Drag-rotate animation duration.
+ */
+ol.DRAGROTATE_ANIMATION_DURATION = 250;
+
+
+/**
+ * @define {number} Drag-zoom animation duration.
+ */
+ol.DRAGZOOM_ANIMATION_DURATION = 200;
+
+
+/**
+ * @define {number} Hysteresis pixels.
+ */
+ol.DRAG_BOX_HYSTERESIS_PIXELS = 8;
+
+
+/**
+ * @define {boolean} Enable the Canvas renderer.  Default is `true`. Setting
+ *     this to false at compile time in advanced mode removes all code
+ *     supporting the Canvas renderer from the build.
+ */
+ol.ENABLE_CANVAS = true;
+
+
+/**
+ * @define {boolean} Enable the DOM renderer (used as a fallback where Canvas is
+ *     not available).  Default is `true`. Setting this to false at compile time
+ *     in advanced mode removes all code supporting the DOM renderer from the
+ *     build.
+ */
+ol.ENABLE_DOM = true;
+
+
+/**
+ * @define {boolean} Enable rendering of ol.layer.Image based layers.  Default
+ *     is `true`. Setting this to false at compile time in advanced mode removes
+ *     all code supporting Image layers from the build.
+ */
+ol.ENABLE_IMAGE = true;
+
+
+/**
+ * @define {boolean} Enable Closure named colors (`goog.color.names`).
+ *     Enabling these colors adds about 3KB uncompressed / 1.5KB compressed to
+ *     the final build size.  Default is `false`. This setting has no effect
+ *     with Canvas renderer, which uses its own names, whether this is true or
+ *     false.
+ */
+ol.ENABLE_NAMED_COLORS = false;
+
+
+/**
+ * @define {boolean} Enable integration with the Proj4js library.  Default is
+ *     `true`.
+ */
+ol.ENABLE_PROJ4JS = true;
+
+
+/**
+ * @define {boolean} Enable rendering of ol.layer.Tile based layers.  Default is
+ *     `true`. Setting this to false at compile time in advanced mode removes
+ *     all code supporting Tile layers from the build.
+ */
+ol.ENABLE_TILE = true;
+
+
+/**
+ * @define {boolean} Enable rendering of ol.layer.Vector based layers.  Default
+ *     is `true`. Setting this to false at compile time in advanced mode removes
+ *     all code supporting Vector layers from the build.
+ */
+ol.ENABLE_VECTOR = true;
+
+
+/**
+ * @define {boolean} Enable the WebGL renderer.  Default is `true`. Setting
+ *     this to false at compile time in advanced mode removes all code
+ *     supporting the WebGL renderer from the build.
+ */
+ol.ENABLE_WEBGL = true;
+
+
+/**
+ * @define {boolean} Support legacy IE (7-8).  Default is `false`.
+ *     If set to `true`, `goog.array.ASSUME_NATIVE_FUNCTIONS` must be set
+ *     to `false` because legacy IE do not support ECMAScript 5 array functions.
+ */
+ol.LEGACY_IE_SUPPORT = false;
+
+
+/**
+ * @define {number} The size in pixels of the first atlas image. Default is
+ * `256`.
+ */
+ol.INITIAL_ATLAS_SIZE = 256;
+
+
+/**
+ * The page is loaded using HTTPS.
+ * @const
+ * @type {boolean}
+ */
+ol.IS_HTTPS = goog.global.location.protocol === 'https:';
+
+
+/**
+ * Whether the current browser is legacy IE
+ * @const
+ * @type {boolean}
+ */
+ol.IS_LEGACY_IE = goog.userAgent.IE &&
+    !goog.userAgent.isVersionOrHigher('9.0') && goog.userAgent.VERSION !== '';
+
+
+/**
+ * @define {number} Keyboard pan duration.
+ */
+ol.KEYBOARD_PAN_DURATION = 100;
+
+
+/**
+ * @define {number} The maximum size in pixels of atlas images. Default is
+ * `-1`, meaning it is not used (and `ol.ol.WEBGL_MAX_TEXTURE_SIZE` is
+ * used instead).
+ */
+ol.MAX_ATLAS_SIZE = -1;
+
+
+/**
+ * @define {number} Maximum mouse wheel delta.
+ */
+ol.MOUSEWHEELZOOM_MAXDELTA = 1;
+
+
+/**
+ * @define {number} Mouse wheel timeout duration.
+ */
+ol.MOUSEWHEELZOOM_TIMEOUT_DURATION = 80;
+
+
+/**
+ * @define {number} Maximum width and/or height extent ratio that determines
+ * when the overview map should be zoomed out.
+ */
+ol.OVERVIEWMAP_MAX_RATIO = 0.75;
+
+
+/**
+ * @define {number} Minimum width and/or height extent ratio that determines
+ * when the overview map should be zoomed in.
+ */
+ol.OVERVIEWMAP_MIN_RATIO = 0.1;
+
+
+/**
+ * @define {number} Rotate animation duration.
+ */
+ol.ROTATE_ANIMATION_DURATION = 250;
+
+
+/**
+ * @define {number} Tolerance for geometry simplification in device pixels.
+ */
+ol.SIMPLIFY_TOLERANCE = 0.5;
+
+
+/**
+ * @define {number} Texture cache high water mark.
+ */
+ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK = 1024;
+
+
+/**
+ * The maximum supported WebGL texture size in pixels. If WebGL is not
+ * supported, the value is set to `undefined`.
+ * @const
+ * @type {number|undefined}
+ * @api
+ */
+ol.WEBGL_MAX_TEXTURE_SIZE; // value is set in `ol.has`
+
+
+/**
+ * List of supported WebGL extensions.
+ * @const
+ * @type {Array.<string>}
+ */
+ol.WEBGL_EXTENSIONS; // value is set in `ol.has`
+
+
+/**
+ * @define {number} Zoom slider animation duration.
+ */
+ol.ZOOMSLIDER_ANIMATION_DURATION = 200;
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * Usage:
+ *
+ *     function ParentClass(a, b) { }
+ *     ParentClass.prototype.foo = function(a) { }
+ *
+ *     function ChildClass(a, b, c) {
+ *       // Call parent constructor
+ *       ParentClass.call(this, a, b);
+ *     }
+ *     ol.inherits(ChildClass, ParentClass);
+ *
+ *     var child = new ChildClass('a', 'b', 'see');
+ *     child.foo(); // This works.
+ *
+ * In addition, a superclass' implementation of a method can be invoked as
+ * follows:
+ *
+ *     ChildClass.prototype.foo = function(a) {
+ *       ChildClass.base(this, 'foo', a);
+ *       // Other code here.
+ *     };
+ *
+ * @param {Function} childCtor Child constructor.
+ * @param {Function} parentCtor Parent constructor.
+ * @function
+ * @api
+ */
+ol.inherits =
+    goog.inherits;
+// note that the newline above is necessary to satisfy the linter
diff --git a/src/ol/overlay.js b/src/ol/overlay.js
new file mode 100644
index 0000000..cec759b
--- /dev/null
+++ b/src/ol/overlay.js
@@ -0,0 +1,463 @@
+goog.provide('ol.Overlay');
+goog.provide('ol.OverlayPositioning');
+goog.provide('ol.OverlayProperty');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.style');
+goog.require('ol.Coordinate');
+goog.require('ol.Map');
+goog.require('ol.MapEventType');
+goog.require('ol.Object');
+
+
+/**
+ * @enum {string}
+ */
+ol.OverlayProperty = {
+  ELEMENT: 'element',
+  MAP: 'map',
+  OFFSET: 'offset',
+  POSITION: 'position',
+  POSITIONING: 'positioning'
+};
+
+
+/**
+ * Overlay position: `'bottom-left'`, `'bottom-center'`,  `'bottom-right'`,
+ * `'center-left'`, `'center-center'`, `'center-right'`, `'top-left'`,
+ * `'top-center'`, `'top-right'`
+ * @enum {string}
+ * @api stable
+ */
+ol.OverlayPositioning = {
+  BOTTOM_LEFT: 'bottom-left',
+  BOTTOM_CENTER: 'bottom-center',
+  BOTTOM_RIGHT: 'bottom-right',
+  CENTER_LEFT: 'center-left',
+  CENTER_CENTER: 'center-center',
+  CENTER_RIGHT: 'center-right',
+  TOP_LEFT: 'top-left',
+  TOP_CENTER: 'top-center',
+  TOP_RIGHT: 'top-right'
+};
+
+
+
+/**
+ * @classdesc
+ * Like {@link ol.control.Control}, Overlays are visible widgets.
+ * Unlike Controls, they are not in a fixed position on the screen, but are tied
+ * to a geographical coordinate, so panning the map will move an Overlay but not
+ * a Control.
+ *
+ * Example:
+ *
+ *     var popup = new ol.Overlay({
+ *       element: document.getElementById('popup')
+ *     });
+ *     popup.setPosition(coordinate);
+ *     map.addOverlay(popup);
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @param {olx.OverlayOptions} options Overlay options.
+ * @api stable
+ */
+ol.Overlay = function(options) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.insertFirst_ = goog.isDef(options.insertFirst) ?
+      options.insertFirst : true;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.stopEvent_ = goog.isDef(options.stopEvent) ? options.stopEvent : true;
+
+  /**
+   * @private
+   * @type {Element}
+   */
+  this.element_ = goog.dom.createElement(goog.dom.TagName.DIV);
+  this.element_.style.position = 'absolute';
+
+  /**
+   * @private
+   * @type {{bottom_: string,
+   *         left_: string,
+   *         right_: string,
+   *         top_: string,
+   *         visible: boolean}}
+   */
+  this.rendered_ = {
+    bottom_: '',
+    left_: '',
+    right_: '',
+    top_: '',
+    visible: true
+  };
+
+  /**
+   * @private
+   * @type {goog.events.Key}
+   */
+  this.mapPostrenderListenerKey_ = null;
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.OverlayProperty.ELEMENT),
+      this.handleElementChanged, false, this);
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.OverlayProperty.MAP),
+      this.handleMapChanged, false, this);
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.OverlayProperty.OFFSET),
+      this.handleOffsetChanged, false, this);
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.OverlayProperty.POSITION),
+      this.handlePositionChanged, false, this);
+
+  goog.events.listen(
+      this, ol.Object.getChangeEventType(ol.OverlayProperty.POSITIONING),
+      this.handlePositioningChanged, false, this);
+
+  if (goog.isDef(options.element)) {
+    this.setElement(options.element);
+  }
+
+  this.setOffset(goog.isDef(options.offset) ? options.offset : [0, 0]);
+
+  this.setPositioning(goog.isDef(options.positioning) ?
+      /** @type {ol.OverlayPositioning} */ (options.positioning) :
+      ol.OverlayPositioning.TOP_LEFT);
+
+  if (goog.isDef(options.position)) {
+    this.setPosition(options.position);
+  }
+
+};
+goog.inherits(ol.Overlay, ol.Object);
+
+
+/**
+ * Get the DOM element of this overlay.
+ * @return {Element|undefined} The Element containing the overlay.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.getElement = function() {
+  return /** @type {Element|undefined} */ (
+      this.get(ol.OverlayProperty.ELEMENT));
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'getElement',
+    ol.Overlay.prototype.getElement);
+
+
+/**
+ * Get the map associated with this overlay.
+ * @return {ol.Map|undefined} The map that the overlay is part of.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.getMap = function() {
+  return /** @type {ol.Map|undefined} */ (
+      this.get(ol.OverlayProperty.MAP));
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'getMap',
+    ol.Overlay.prototype.getMap);
+
+
+/**
+ * Get the offset of this overlay.
+ * @return {Array.<number>} The offset.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.getOffset = function() {
+  return /** @type {Array.<number>} */ (
+      this.get(ol.OverlayProperty.OFFSET));
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'getOffset',
+    ol.Overlay.prototype.getOffset);
+
+
+/**
+ * Get the current position of this overlay.
+ * @return {ol.Coordinate|undefined} The spatial point that the overlay is
+ *     anchored at.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.getPosition = function() {
+  return /** @type {ol.Coordinate|undefined} */ (
+      this.get(ol.OverlayProperty.POSITION));
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'getPosition',
+    ol.Overlay.prototype.getPosition);
+
+
+/**
+ * Get the current positioning of this overlay.
+ * @return {ol.OverlayPositioning} How the overlay is positioned
+ *     relative to its point on the map.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.getPositioning = function() {
+  return /** @type {ol.OverlayPositioning} */ (
+      this.get(ol.OverlayProperty.POSITIONING));
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'getPositioning',
+    ol.Overlay.prototype.getPositioning);
+
+
+/**
+ * @protected
+ */
+ol.Overlay.prototype.handleElementChanged = function() {
+  goog.dom.removeChildren(this.element_);
+  var element = this.getElement();
+  if (goog.isDefAndNotNull(element)) {
+    goog.dom.append(/** @type {!Node} */ (this.element_), element);
+  }
+};
+
+
+/**
+ * @protected
+ */
+ol.Overlay.prototype.handleMapChanged = function() {
+  if (!goog.isNull(this.mapPostrenderListenerKey_)) {
+    goog.dom.removeNode(this.element_);
+    goog.events.unlistenByKey(this.mapPostrenderListenerKey_);
+    this.mapPostrenderListenerKey_ = null;
+  }
+  var map = this.getMap();
+  if (goog.isDefAndNotNull(map)) {
+    this.mapPostrenderListenerKey_ = goog.events.listen(map,
+        ol.MapEventType.POSTRENDER, this.render, false, this);
+    this.updatePixelPosition_();
+    var container = this.stopEvent_ ?
+        map.getOverlayContainerStopEvent() : map.getOverlayContainer();
+    if (this.insertFirst_) {
+      goog.dom.insertChildAt(/** @type {!Element} */ (
+          container), this.element_, 0);
+    } else {
+      goog.dom.append(/** @type {!Node} */ (container), this.element_);
+    }
+  }
+};
+
+
+/**
+ * @protected
+ */
+ol.Overlay.prototype.render = function() {
+  this.updatePixelPosition_();
+};
+
+
+/**
+ * @protected
+ */
+ol.Overlay.prototype.handleOffsetChanged = function() {
+  this.updatePixelPosition_();
+};
+
+
+/**
+ * @protected
+ */
+ol.Overlay.prototype.handlePositionChanged = function() {
+  this.updatePixelPosition_();
+};
+
+
+/**
+ * @protected
+ */
+ol.Overlay.prototype.handlePositioningChanged = function() {
+  this.updatePixelPosition_();
+};
+
+
+/**
+ * Set the DOM element to be associated with this overlay.
+ * @param {Element|undefined} element The Element containing the overlay.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.setElement = function(element) {
+  this.set(ol.OverlayProperty.ELEMENT, element);
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'setElement',
+    ol.Overlay.prototype.setElement);
+
+
+/**
+ * Set the map to be associated with this overlay.
+ * @param {ol.Map|undefined} map The map that the overlay is part of.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.setMap = function(map) {
+  this.set(ol.OverlayProperty.MAP, map);
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'setMap',
+    ol.Overlay.prototype.setMap);
+
+
+/**
+ * Set the offset for this overlay.
+ * @param {Array.<number>} offset Offset.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.setOffset = function(offset) {
+  this.set(ol.OverlayProperty.OFFSET, offset);
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'setOffset',
+    ol.Overlay.prototype.setOffset);
+
+
+/**
+ * Set the position for this overlay.
+ * @param {ol.Coordinate|undefined} position The spatial point that the overlay
+ *     is anchored at.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.setPosition = function(position) {
+  this.set(ol.OverlayProperty.POSITION, position);
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'setPosition',
+    ol.Overlay.prototype.setPosition);
+
+
+/**
+ * Set the positioning for this overlay.
+ * @param {ol.OverlayPositioning} positioning how the overlay is
+ *     positioned relative to its point on the map.
+ * @observable
+ * @api stable
+ */
+ol.Overlay.prototype.setPositioning = function(positioning) {
+  this.set(ol.OverlayProperty.POSITIONING, positioning);
+};
+goog.exportProperty(
+    ol.Overlay.prototype,
+    'setPositioning',
+    ol.Overlay.prototype.setPositioning);
+
+
+/**
+ * @private
+ */
+ol.Overlay.prototype.updatePixelPosition_ = function() {
+
+  var map = this.getMap();
+  var position = this.getPosition();
+  if (!goog.isDef(map) || !map.isRendered() || !goog.isDef(position)) {
+    if (this.rendered_.visible) {
+      goog.style.setElementShown(this.element_, false);
+      this.rendered_.visible = false;
+    }
+    return;
+  }
+
+  var pixel = map.getPixelFromCoordinate(position);
+  goog.asserts.assert(!goog.isNull(pixel));
+  var mapSize = map.getSize();
+  goog.asserts.assert(goog.isDef(mapSize));
+  var style = this.element_.style;
+  var offset = this.getOffset();
+  goog.asserts.assert(goog.isArray(offset));
+  var positioning = this.getPositioning();
+  goog.asserts.assert(goog.isDef(positioning));
+
+  var offsetX = offset[0];
+  var offsetY = offset[1];
+  if (positioning == ol.OverlayPositioning.BOTTOM_RIGHT ||
+      positioning == ol.OverlayPositioning.CENTER_RIGHT ||
+      positioning == ol.OverlayPositioning.TOP_RIGHT) {
+    if (this.rendered_.left_ !== '') {
+      this.rendered_.left_ = style.left = '';
+    }
+    var right = Math.round(mapSize[0] - pixel[0] - offsetX) + 'px';
+    if (this.rendered_.right_ != right) {
+      this.rendered_.right_ = style.right = right;
+    }
+  } else {
+    if (this.rendered_.right_ !== '') {
+      this.rendered_.right_ = style.right = '';
+    }
+    if (positioning == ol.OverlayPositioning.BOTTOM_CENTER ||
+        positioning == ol.OverlayPositioning.CENTER_CENTER ||
+        positioning == ol.OverlayPositioning.TOP_CENTER) {
+      offsetX -= goog.style.getSize(this.element_).width / 2;
+    }
+    var left = Math.round(pixel[0] + offsetX) + 'px';
+    if (this.rendered_.left_ != left) {
+      this.rendered_.left_ = style.left = left;
+    }
+  }
+  if (positioning == ol.OverlayPositioning.BOTTOM_LEFT ||
+      positioning == ol.OverlayPositioning.BOTTOM_CENTER ||
+      positioning == ol.OverlayPositioning.BOTTOM_RIGHT) {
+    if (this.rendered_.top_ !== '') {
+      this.rendered_.top_ = style.top = '';
+    }
+    var bottom = Math.round(mapSize[1] - pixel[1] - offsetY) + 'px';
+    if (this.rendered_.bottom_ != bottom) {
+      this.rendered_.bottom_ = style.bottom = bottom;
+    }
+  } else {
+    if (this.rendered_.bottom_ !== '') {
+      this.rendered_.bottom_ = style.bottom = '';
+    }
+    if (positioning == ol.OverlayPositioning.CENTER_LEFT ||
+        positioning == ol.OverlayPositioning.CENTER_CENTER ||
+        positioning == ol.OverlayPositioning.CENTER_RIGHT) {
+      offsetY -= goog.style.getSize(this.element_).height / 2;
+    }
+    var top = Math.round(pixel[1] + offsetY) + 'px';
+    if (this.rendered_.top_ != top) {
+      this.rendered_.top_ = style.top = top;
+    }
+  }
+
+  if (!this.rendered_.visible) {
+    goog.style.setElementShown(this.element_, true);
+    this.rendered_.visible = true;
+  }
+
+};
diff --git a/src/ol/pixel.js b/src/ol/pixel.js
new file mode 100644
index 0000000..dbf1d45
--- /dev/null
+++ b/src/ol/pixel.js
@@ -0,0 +1,10 @@
+goog.provide('ol.Pixel');
+
+
+/**
+ * An array with two elements, representing a pixel. The first element is the
+ * x-coordinate, the second the y-coordinate of the pixel.
+ * @typedef {Array.<number>}
+ * @api stable
+ */
+ol.Pixel;
diff --git a/src/ol/pointer/eventsource.js b/src/ol/pointer/eventsource.js
new file mode 100644
index 0000000..cf17cba
--- /dev/null
+++ b/src/ol/pointer/eventsource.js
@@ -0,0 +1,55 @@
+goog.provide('ol.pointer.EventSource');
+
+goog.require('goog.events.BrowserEvent');
+goog.require('goog.object');
+
+
+
+/**
+ * @param {ol.pointer.PointerEventHandler} dispatcher
+ * @param {Object.<string, function(goog.events.BrowserEvent)>} mapping
+ * @constructor
+ */
+ol.pointer.EventSource = function(dispatcher, mapping) {
+  /**
+   * @type {ol.pointer.PointerEventHandler}
+   */
+  this.dispatcher = dispatcher;
+
+  /**
+   * @private
+   * @const
+   * @type {Object.<string, function(goog.events.BrowserEvent)>}
+   */
+  this.mapping_ = mapping;
+};
+
+
+/**
+ * List of events supported by this source.
+ * @return {Array.<string>} Event names
+ */
+ol.pointer.EventSource.prototype.getEvents = function() {
+  return goog.object.getKeys(this.mapping_);
+};
+
+
+/**
+ * Returns a mapping between the supported event types and
+ * the handlers that should handle an event.
+ * @return {Object.<string, function(goog.events.BrowserEvent)>}
+ *         Event/Handler mapping
+ */
+ol.pointer.EventSource.prototype.getMapping = function() {
+  return this.mapping_;
+};
+
+
+/**
+ * Returns the handler that should handle a given event type.
+ * @param {string} eventType
+ * @return {function(goog.events.BrowserEvent)} Handler
+ */
+ol.pointer.EventSource.prototype.getHandlerForEvent = function(eventType) {
+  return this.mapping_[eventType];
+};
diff --git a/src/ol/pointer/mousesource.js b/src/ol/pointer/mousesource.js
new file mode 100644
index 0000000..9aa1ffa
--- /dev/null
+++ b/src/ol/pointer/mousesource.js
@@ -0,0 +1,255 @@
+// Based on https://github.com/Polymer/PointerEvents
+
+// Copyright (c) 2013 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+goog.provide('ol.pointer.MouseSource');
+
+goog.require('goog.object');
+goog.require('ol.pointer.EventSource');
+
+
+
+/**
+ * @param {ol.pointer.PointerEventHandler} dispatcher
+ * @constructor
+ * @extends {ol.pointer.EventSource}
+ */
+ol.pointer.MouseSource = function(dispatcher) {
+  var mapping = {
+    'mousedown': this.mousedown,
+    'mousemove': this.mousemove,
+    'mouseup': this.mouseup,
+    'mouseover': this.mouseover,
+    'mouseout': this.mouseout
+  };
+  goog.base(this, dispatcher, mapping);
+
+  /**
+   * @const
+   * @type {Object.<string, goog.events.BrowserEvent|Object>}
+   */
+  this.pointerMap = dispatcher.pointerMap;
+
+  /**
+   * @const
+   * @type {Array.<ol.Pixel>}
+   */
+  this.lastTouches = [];
+};
+goog.inherits(ol.pointer.MouseSource, ol.pointer.EventSource);
+
+
+/**
+ * @const
+ * @type {number}
+ */
+ol.pointer.MouseSource.POINTER_ID = 1;
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.pointer.MouseSource.POINTER_TYPE = 'mouse';
+
+
+/**
+ * Radius around touchend that swallows mouse events.
+ *
+ * @const
+ * @type {number}
+ */
+ol.pointer.MouseSource.DEDUP_DIST = 25;
+
+
+/**
+ * Detect if a mouse event was simulated from a touch by
+ * checking if previously there was a touch event at the
+ * same position.
+ *
+ * FIXME - Known problem with the native Android browser on
+ * Samsung GT-I9100 (Android 4.1.2):
+ * In case the page is scrolled, this function does not work
+ * correctly when a canvas is used (WebGL or canvas renderer).
+ * Mouse listeners on canvas elements (for this browser), create
+ * two mouse events: One 'good' and one 'bad' one (on other browsers or
+ * when a div is used, there is only one event). For the 'bad' one,
+ * clientX/clientY and also pageX/pageY are wrong when the page
+ * is scrolled. Because of that, this function can not detect if
+ * the events were simulated from a touch event. As result, a
+ * pointer event at a wrong position is dispatched, which confuses
+ * the map interactions.
+ * It is unclear, how one can get the correct position for the event
+ * or detect that the positions are invalid.
+ *
+ * @private
+ * @param {goog.events.BrowserEvent} inEvent
+ * @return {boolean} True, if the event was generated by a touch.
+ */
+ol.pointer.MouseSource.prototype.isEventSimulatedFromTouch_ =
+    function(inEvent) {
+  var lts = this.lastTouches;
+  var x = inEvent.clientX, y = inEvent.clientY;
+  for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {
+    // simulated mouse events will be swallowed near a primary touchend
+    var dx = Math.abs(x - t[0]), dy = Math.abs(y - t[1]);
+    if (dx <= ol.pointer.MouseSource.DEDUP_DIST &&
+        dy <= ol.pointer.MouseSource.DEDUP_DIST) {
+      return true;
+    }
+  }
+  return false;
+};
+
+
+/**
+ * Creates a copy of the original event that will be used
+ * for the fake pointer event.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ * @param {ol.pointer.PointerEventHandler} dispatcher
+ * @return {Object}
+ */
+ol.pointer.MouseSource.prepareEvent = function(inEvent, dispatcher) {
+  var e = dispatcher.cloneEvent(inEvent, inEvent.getBrowserEvent());
+
+  // forward mouse preventDefault
+  var pd = e.preventDefault;
+  e.preventDefault = function() {
+    inEvent.preventDefault();
+    pd();
+  };
+
+  e.pointerId = ol.pointer.MouseSource.POINTER_ID;
+  e.isPrimary = true;
+  e.pointerType = ol.pointer.MouseSource.POINTER_TYPE;
+
+  return e;
+};
+
+
+/**
+ * Handler for `mousedown`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MouseSource.prototype.mousedown = function(inEvent) {
+  if (!this.isEventSimulatedFromTouch_(inEvent)) {
+    var p = goog.object.containsKey(this.pointerMap,
+        ol.pointer.MouseSource.POINTER_ID.toString());
+    // TODO(dfreedman) workaround for some elements not sending mouseup
+    // http://crbug/149091
+    if (p) {
+      this.cancel(inEvent);
+    }
+    var e = ol.pointer.MouseSource.prepareEvent(inEvent, this.dispatcher);
+    goog.object.set(this.pointerMap,
+        ol.pointer.MouseSource.POINTER_ID.toString(), inEvent);
+    this.dispatcher.down(e, inEvent);
+  }
+};
+
+
+/**
+ * Handler for `mousemove`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MouseSource.prototype.mousemove = function(inEvent) {
+  if (!this.isEventSimulatedFromTouch_(inEvent)) {
+    var e = ol.pointer.MouseSource.prepareEvent(inEvent, this.dispatcher);
+    this.dispatcher.move(e, inEvent);
+  }
+};
+
+
+/**
+ * Handler for `mouseup`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MouseSource.prototype.mouseup = function(inEvent) {
+  if (!this.isEventSimulatedFromTouch_(inEvent)) {
+    var p = goog.object.get(this.pointerMap,
+        ol.pointer.MouseSource.POINTER_ID.toString());
+
+    if (p && p.button === inEvent.button) {
+      var e = ol.pointer.MouseSource.prepareEvent(inEvent, this.dispatcher);
+      this.dispatcher.up(e, inEvent);
+      this.cleanupMouse();
+    }
+  }
+};
+
+
+/**
+ * Handler for `mouseover`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MouseSource.prototype.mouseover = function(inEvent) {
+  if (!this.isEventSimulatedFromTouch_(inEvent)) {
+    var e = ol.pointer.MouseSource.prepareEvent(inEvent, this.dispatcher);
+    this.dispatcher.enterOver(e, inEvent);
+  }
+};
+
+
+/**
+ * Handler for `mouseout`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MouseSource.prototype.mouseout = function(inEvent) {
+  if (!this.isEventSimulatedFromTouch_(inEvent)) {
+    var e = ol.pointer.MouseSource.prepareEvent(inEvent, this.dispatcher);
+    this.dispatcher.leaveOut(e, inEvent);
+  }
+};
+
+
+/**
+ * Dispatches a `pointercancel` event.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MouseSource.prototype.cancel = function(inEvent) {
+  var e = ol.pointer.MouseSource.prepareEvent(inEvent, this.dispatcher);
+  this.dispatcher.cancel(e, inEvent);
+  this.cleanupMouse();
+};
+
+
+/**
+ * Remove the mouse from the list of active pointers.
+ */
+ol.pointer.MouseSource.prototype.cleanupMouse = function() {
+  goog.object.remove(this.pointerMap,
+      ol.pointer.MouseSource.POINTER_ID.toString());
+};
diff --git a/src/ol/pointer/mssource.js b/src/ol/pointer/mssource.js
new file mode 100644
index 0000000..4df40d3
--- /dev/null
+++ b/src/ol/pointer/mssource.js
@@ -0,0 +1,196 @@
+// Based on https://github.com/Polymer/PointerEvents
+
+// Copyright (c) 2013 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+goog.provide('ol.pointer.MsSource');
+
+goog.require('goog.object');
+goog.require('ol.pointer.EventSource');
+
+
+
+/**
+ * @param {ol.pointer.PointerEventHandler} dispatcher
+ * @constructor
+ * @extends {ol.pointer.EventSource}
+ */
+ol.pointer.MsSource = function(dispatcher) {
+  var mapping = {
+    'MSPointerDown': this.msPointerDown,
+    'MSPointerMove': this.msPointerMove,
+    'MSPointerUp': this.msPointerUp,
+    'MSPointerOut': this.msPointerOut,
+    'MSPointerOver': this.msPointerOver,
+    'MSPointerCancel': this.msPointerCancel,
+    'MSGotPointerCapture': this.msGotPointerCapture,
+    'MSLostPointerCapture': this.msLostPointerCapture
+  };
+  goog.base(this, dispatcher, mapping);
+
+  /**
+   * @const
+   * @type {Object.<string, goog.events.BrowserEvent|Object>}
+   */
+  this.pointerMap = dispatcher.pointerMap;
+
+  /**
+   * @const
+   * @type {Array.<string>}
+   */
+  this.POINTER_TYPES = [
+    '',
+    'unavailable',
+    'touch',
+    'pen',
+    'mouse'
+  ];
+};
+goog.inherits(ol.pointer.MsSource, ol.pointer.EventSource);
+
+
+/**
+ * Creates a copy of the original event that will be used
+ * for the fake pointer event.
+ *
+ * @private
+ * @param {goog.events.BrowserEvent} inEvent
+ * @return {Object}
+ */
+ol.pointer.MsSource.prototype.prepareEvent_ = function(inEvent) {
+  var e = inEvent;
+  if (goog.isNumber(inEvent.getBrowserEvent().pointerType)) {
+    e = this.dispatcher.cloneEvent(inEvent, inEvent.getBrowserEvent());
+    e.pointerType = this.POINTER_TYPES[inEvent.getBrowserEvent().pointerType];
+  }
+
+  return e;
+};
+
+
+/**
+ * Remove this pointer from the list of active pointers.
+ * @param {number} pointerId
+ */
+ol.pointer.MsSource.prototype.cleanup = function(pointerId) {
+  goog.object.remove(this.pointerMap, pointerId);
+};
+
+
+/**
+ * Handler for `msPointerDown`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MsSource.prototype.msPointerDown = function(inEvent) {
+  goog.object.set(this.pointerMap,
+      inEvent.getBrowserEvent().pointerId, inEvent);
+  var e = this.prepareEvent_(inEvent);
+  this.dispatcher.down(e, inEvent);
+};
+
+
+/**
+ * Handler for `msPointerMove`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MsSource.prototype.msPointerMove = function(inEvent) {
+  var e = this.prepareEvent_(inEvent);
+  this.dispatcher.move(e, inEvent);
+};
+
+
+/**
+ * Handler for `msPointerUp`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MsSource.prototype.msPointerUp = function(inEvent) {
+  var e = this.prepareEvent_(inEvent);
+  this.dispatcher.up(e, inEvent);
+  this.cleanup(inEvent.getBrowserEvent().pointerId);
+};
+
+
+/**
+ * Handler for `msPointerOut`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MsSource.prototype.msPointerOut = function(inEvent) {
+  var e = this.prepareEvent_(inEvent);
+  this.dispatcher.leaveOut(e, inEvent);
+};
+
+
+/**
+ * Handler for `msPointerOver`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MsSource.prototype.msPointerOver = function(inEvent) {
+  var e = this.prepareEvent_(inEvent);
+  this.dispatcher.enterOver(e, inEvent);
+};
+
+
+/**
+ * Handler for `msPointerCancel`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MsSource.prototype.msPointerCancel = function(inEvent) {
+  var e = this.prepareEvent_(inEvent);
+  this.dispatcher.cancel(e, inEvent);
+  this.cleanup(inEvent.getBrowserEvent().pointerId);
+};
+
+
+/**
+ * Handler for `msLostPointerCapture`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MsSource.prototype.msLostPointerCapture = function(inEvent) {
+  var e = this.dispatcher.makeEvent('lostpointercapture',
+      inEvent.getBrowserEvent(), inEvent);
+  this.dispatcher.dispatchEvent(e);
+};
+
+
+/**
+ * Handler for `msGotPointerCapture`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.MsSource.prototype.msGotPointerCapture = function(inEvent) {
+  var e = this.dispatcher.makeEvent('gotpointercapture',
+      inEvent.getBrowserEvent(), inEvent);
+  this.dispatcher.dispatchEvent(e);
+};
diff --git a/src/ol/pointer/nativesource.js b/src/ol/pointer/nativesource.js
new file mode 100644
index 0000000..4509064
--- /dev/null
+++ b/src/ol/pointer/nativesource.js
@@ -0,0 +1,136 @@
+// Based on https://github.com/Polymer/PointerEvents
+
+// Copyright (c) 2013 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+goog.provide('ol.pointer.NativeSource');
+
+goog.require('goog.object');
+goog.require('ol.pointer.EventSource');
+
+
+
+/**
+ * @param {ol.pointer.PointerEventHandler} dispatcher
+ * @constructor
+ * @extends {ol.pointer.EventSource}
+ */
+ol.pointer.NativeSource = function(dispatcher) {
+  var mapping = {
+    'pointerdown': this.pointerDown,
+    'pointermove': this.pointerMove,
+    'pointerup': this.pointerUp,
+    'pointerout': this.pointerOut,
+    'pointerover': this.pointerOver,
+    'pointercancel': this.pointerCancel,
+    'gotpointercapture': this.gotPointerCapture,
+    'lostpointercapture': this.lostPointerCapture
+  };
+  goog.base(this, dispatcher, mapping);
+};
+goog.inherits(ol.pointer.NativeSource, ol.pointer.EventSource);
+
+
+/**
+ * Handler for `pointerdown`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.NativeSource.prototype.pointerDown = function(inEvent) {
+  this.dispatcher.fireNativeEvent(inEvent);
+};
+
+
+/**
+ * Handler for `pointermove`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.NativeSource.prototype.pointerMove = function(inEvent) {
+  this.dispatcher.fireNativeEvent(inEvent);
+};
+
+
+/**
+ * Handler for `pointerup`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.NativeSource.prototype.pointerUp = function(inEvent) {
+  this.dispatcher.fireNativeEvent(inEvent);
+};
+
+
+/**
+ * Handler for `pointerout`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.NativeSource.prototype.pointerOut = function(inEvent) {
+  this.dispatcher.fireNativeEvent(inEvent);
+};
+
+
+/**
+ * Handler for `pointerover`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.NativeSource.prototype.pointerOver = function(inEvent) {
+  this.dispatcher.fireNativeEvent(inEvent);
+};
+
+
+/**
+ * Handler for `pointercancel`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.NativeSource.prototype.pointerCancel = function(inEvent) {
+  this.dispatcher.fireNativeEvent(inEvent);
+};
+
+
+/**
+ * Handler for `lostpointercapture`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.NativeSource.prototype.lostPointerCapture = function(inEvent) {
+  this.dispatcher.fireNativeEvent(inEvent);
+};
+
+
+/**
+ * Handler for `gotpointercapture`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.NativeSource.prototype.gotPointerCapture = function(inEvent) {
+  this.dispatcher.fireNativeEvent(inEvent);
+};
diff --git a/src/ol/pointer/pointerevent.js b/src/ol/pointer/pointerevent.js
new file mode 100644
index 0000000..d17c1ba
--- /dev/null
+++ b/src/ol/pointer/pointerevent.js
@@ -0,0 +1,276 @@
+// Based on https://github.com/Polymer/PointerEvents
+
+// Copyright (c) 2013 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+goog.provide('ol.pointer.PointerEvent');
+
+
+goog.require('goog.events');
+goog.require('goog.events.Event');
+goog.require('goog.object');
+
+
+
+/**
+ * A class for pointer events.
+ *
+ * This class is used as an abstraction for mouse events,
+ * touch events and even native pointer events.
+ *
+ * @constructor
+ * @extends {goog.events.Event}
+ * @param {string} type The type of the event to create.
+ * @param {goog.events.BrowserEvent} browserEvent
+ * @param {Object.<string, ?>=} opt_eventDict An optional dictionary of
+ *    initial event properties.
+ */
+ol.pointer.PointerEvent = function(type, browserEvent, opt_eventDict) {
+  goog.base(this, type);
+
+  /**
+   * @const
+   * @type {goog.events.BrowserEvent}
+   */
+  this.browserEvent = browserEvent;
+
+  var eventDict = goog.isDef(opt_eventDict) ? opt_eventDict : {};
+
+  /**
+   * @type {number}
+   */
+  this.buttons = this.getButtons_(eventDict);
+
+  /**
+   * @type {number}
+   */
+  this.pressure = this.getPressure_(eventDict, this.buttons);
+
+  // MouseEvent related properties
+
+  /**
+   * @type {boolean}
+   */
+  this.bubbles = goog.object.get(eventDict, 'bubbles', false);
+
+  /**
+   * @type {boolean}
+   */
+  this.cancelable = goog.object.get(eventDict, 'cancelable', false);
+
+  /**
+   * @type {Object}
+   */
+  this.view = goog.object.get(eventDict, 'view', null);
+
+  /**
+   * @type {number}
+   */
+  this.detail = goog.object.get(eventDict, 'detail', null);
+
+  /**
+   * @type {number}
+   */
+  this.screenX = goog.object.get(eventDict, 'screenX', 0);
+
+  /**
+   * @type {number}
+   */
+  this.screenY = goog.object.get(eventDict, 'screenY', 0);
+
+  /**
+   * @type {number}
+   */
+  this.clientX = goog.object.get(eventDict, 'clientX', 0);
+
+  /**
+   * @type {number}
+   */
+  this.clientY = goog.object.get(eventDict, 'clientY', 0);
+
+  /**
+   * @type {boolean}
+   */
+  this.ctrlKey = goog.object.get(eventDict, 'ctrlKey', false);
+
+  /**
+   * @type {boolean}
+   */
+  this.altKey = goog.object.get(eventDict, 'altKey', false);
+
+  /**
+   * @type {boolean}
+   */
+  this.shiftKey = goog.object.get(eventDict, 'shiftKey', false);
+
+  /**
+   * @type {boolean}
+   */
+  this.metaKey = goog.object.get(eventDict, 'metaKey', false);
+
+  /**
+   * @type {number}
+   */
+  this.button = goog.object.get(eventDict, 'button', 0);
+
+  /**
+   * @type {Node}
+   */
+  this.relatedTarget = goog.object.get(eventDict, 'relatedTarget', null);
+
+  // PointerEvent related properties
+
+  /**
+   * @const
+   * @type {number}
+   */
+  this.pointerId = goog.object.get(eventDict, 'pointerId', 0);
+
+  /**
+   * @type {number}
+   */
+  this.width = goog.object.get(eventDict, 'width', 0);
+
+  /**
+   * @type {number}
+   */
+  this.height = goog.object.get(eventDict, 'height', 0);
+
+  /**
+   * @type {number}
+   */
+  this.tiltX = goog.object.get(eventDict, 'tiltX', 0);
+
+  /**
+   * @type {number}
+   */
+  this.tiltY = goog.object.get(eventDict, 'tiltY', 0);
+
+  /**
+   * @type {string}
+   */
+  this.pointerType = goog.object.get(eventDict, 'pointerType', '');
+
+  /**
+   * @type {number}
+   */
+  this.hwTimestamp = goog.object.get(eventDict, 'hwTimestamp', 0);
+
+  /**
+   * @type {boolean}
+   */
+  this.isPrimary = goog.object.get(eventDict, 'isPrimary', false);
+
+  // keep the semantics of preventDefault
+  if (browserEvent.preventDefault) {
+    this.preventDefault = function() {
+      browserEvent.preventDefault();
+    };
+  }
+};
+goog.inherits(ol.pointer.PointerEvent, goog.events.Event);
+
+
+/**
+ * @private
+ * @param {Object.<string, ?>} eventDict
+ * @return {number}
+ */
+ol.pointer.PointerEvent.prototype.getButtons_ = function(eventDict) {
+  // According to the w3c spec,
+  // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-button
+  // MouseEvent.button == 0 can mean either no mouse button depressed, or the
+  // left mouse button depressed.
+  //
+  // As of now, the only way to distinguish between the two states of
+  // MouseEvent.button is by using the deprecated MouseEvent.which property, as
+  // this maps mouse buttons to positive integers > 0, and uses 0 to mean that
+  // no mouse button is held.
+  //
+  // MouseEvent.which is derived from MouseEvent.button at MouseEvent creation,
+  // but initMouseEvent does not expose an argument with which to set
+  // MouseEvent.which. Calling initMouseEvent with a buttonArg of 0 will set
+  // MouseEvent.button == 0 and MouseEvent.which == 1, breaking the expectations
+  // of app developers.
+  //
+  // The only way to propagate the correct state of MouseEvent.which and
+  // MouseEvent.button to a new MouseEvent.button == 0 and MouseEvent.which == 0
+  // is to call initMouseEvent with a buttonArg value of -1.
+  //
+  // This is fixed with DOM Level 4's use of buttons
+  var buttons;
+  if (eventDict.buttons || ol.pointer.PointerEvent.HAS_BUTTONS) {
+    buttons = eventDict.buttons;
+  } else {
+    switch (eventDict.which) {
+      case 1: buttons = 1; break;
+      case 2: buttons = 4; break;
+      case 3: buttons = 2; break;
+      default: buttons = 0;
+    }
+  }
+  return buttons;
+};
+
+
+/**
+ * @private
+ * @param {Object.<string, ?>} eventDict
+ * @param {number} buttons
+ * @return {number}
+ */
+ol.pointer.PointerEvent.prototype.getPressure_ = function(eventDict, buttons) {
+  // Spec requires that pointers without pressure specified use 0.5 for down
+  // state and 0 for up state.
+  var pressure = 0;
+  if (eventDict.pressure) {
+    pressure = eventDict.pressure;
+  } else {
+    pressure = buttons ? 0.5 : 0;
+  }
+  return pressure;
+};
+
+
+/**
+ * Is the `buttons` property supported?
+ * @type {boolean}
+ */
+ol.pointer.PointerEvent.HAS_BUTTONS = false;
+
+
+/**
+ * Checks if the `buttons` property is supported.
+ */
+(function() {
+  try {
+    var ev = new MouseEvent('click', {buttons: 1});
+    ol.pointer.PointerEvent.HAS_BUTTONS = ev.buttons === 1;
+  } catch (e) {
+  }
+})();
diff --git a/src/ol/pointer/pointereventhandler.js b/src/ol/pointer/pointereventhandler.js
new file mode 100644
index 0000000..367fb77
--- /dev/null
+++ b/src/ol/pointer/pointereventhandler.js
@@ -0,0 +1,496 @@
+// Based on https://github.com/Polymer/PointerEvents
+
+// Copyright (c) 2013 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+goog.provide('ol.pointer.PointerEventHandler');
+
+goog.require('goog.array');
+goog.require('goog.events');
+goog.require('goog.events.BrowserEvent');
+goog.require('goog.events.Event');
+goog.require('goog.events.EventTarget');
+
+goog.require('ol.has');
+goog.require('ol.pointer.MouseSource');
+goog.require('ol.pointer.MsSource');
+goog.require('ol.pointer.NativeSource');
+goog.require('ol.pointer.PointerEvent');
+goog.require('ol.pointer.TouchSource');
+
+
+
+/**
+ * @constructor
+ * @extends {goog.events.EventTarget}
+ * @param {Element|HTMLDocument} element Viewport element.
+ */
+ol.pointer.PointerEventHandler = function(element) {
+  goog.base(this);
+
+  /**
+   * @const
+   * @private
+   * @type {Element|HTMLDocument}
+   */
+  this.element_ = element;
+
+  /**
+   * @const
+   * @type {Object.<string, goog.events.BrowserEvent|Object>}
+   */
+  this.pointerMap = {};
+
+  /**
+   * @type {Object.<string, function(goog.events.BrowserEvent)>}
+   * @private
+   */
+  this.eventMap_ = {};
+
+  /**
+   * @type {Array.<ol.pointer.EventSource>}
+   * @private
+   */
+  this.eventSourceList_ = [];
+
+  this.registerSources();
+};
+goog.inherits(ol.pointer.PointerEventHandler, goog.events.EventTarget);
+
+
+/**
+ * Set up the event sources (mouse, touch and native pointers)
+ * that generate pointer events.
+ */
+ol.pointer.PointerEventHandler.prototype.registerSources = function() {
+  if (ol.has.POINTER) {
+    this.registerSource('native', new ol.pointer.NativeSource(this));
+  } else if (ol.has.MSPOINTER) {
+    this.registerSource('ms', new ol.pointer.MsSource(this));
+  } else {
+    var mouseSource = new ol.pointer.MouseSource(this);
+    this.registerSource('mouse', mouseSource);
+
+    if (ol.has.TOUCH) {
+      this.registerSource('touch',
+          new ol.pointer.TouchSource(this, mouseSource));
+    }
+  }
+
+  // register events on the viewport element
+  this.register_();
+};
+
+
+/**
+ * Add a new event source that will generate pointer events.
+ *
+ * @param {string} name A name for the event source
+ * @param {ol.pointer.EventSource} source
+ */
+ol.pointer.PointerEventHandler.prototype.registerSource =
+    function(name, source) {
+  var s = source;
+  var newEvents = s.getEvents();
+
+  if (newEvents) {
+    goog.array.forEach(newEvents, function(e) {
+      var handler = s.getHandlerForEvent(e);
+
+      if (handler) {
+        this.eventMap_[e] = goog.bind(handler, s);
+      }
+    }, this);
+    this.eventSourceList_.push(s);
+  }
+};
+
+
+/**
+ * Set up the events for all registered event sources.
+ * @private
+ */
+ol.pointer.PointerEventHandler.prototype.register_ = function() {
+  var l = this.eventSourceList_.length;
+  var eventSource;
+  for (var i = 0; i < l; i++) {
+    eventSource = this.eventSourceList_[i];
+    this.addEvents_(eventSource.getEvents());
+  }
+};
+
+
+/**
+ * Remove all registered events.
+ * @private
+ */
+ol.pointer.PointerEventHandler.prototype.unregister_ = function() {
+  var l = this.eventSourceList_.length;
+  var eventSource;
+  for (var i = 0; i < l; i++) {
+    eventSource = this.eventSourceList_[i];
+    this.removeEvents_(eventSource.getEvents());
+  }
+};
+
+
+/**
+ * Calls the right handler for a new event.
+ * @private
+ * @param {goog.events.BrowserEvent} inEvent Browser event.
+ */
+ol.pointer.PointerEventHandler.prototype.eventHandler_ = function(inEvent) {
+  var type = inEvent.type;
+  var handler = this.eventMap_[type];
+  if (handler) {
+    handler(inEvent);
+  }
+};
+
+
+/**
+ * Setup listeners for the given events.
+ * @private
+ * @param {Array.<string>} events List of events.
+ */
+ol.pointer.PointerEventHandler.prototype.addEvents_ = function(events) {
+  goog.array.forEach(events, function(eventName) {
+    goog.events.listen(this.element_, eventName,
+        this.eventHandler_, false, this);
+  }, this);
+};
+
+
+/**
+ * Unregister listeners for the given events.
+ * @private
+ * @param {Array.<string>} events List of events.
+ */
+ol.pointer.PointerEventHandler.prototype.removeEvents_ = function(events) {
+  goog.array.forEach(events, function(e) {
+    goog.events.unlisten(this.element_, e,
+        this.eventHandler_, false, this);
+  }, this);
+};
+
+
+/**
+ * Returns a snapshot of inEvent, with writable properties.
+ *
+ * @param {goog.events.BrowserEvent} browserEvent Browser event.
+ * @param {Event|Touch} inEvent An event that contains
+ *    properties to copy.
+ * @return {Object} An object containing shallow copies of
+ *    `inEvent`'s properties.
+ */
+ol.pointer.PointerEventHandler.prototype.cloneEvent =
+    function(browserEvent, inEvent) {
+  var eventCopy = {}, p;
+  for (var i = 0, ii = ol.pointer.CLONE_PROPS.length; i < ii; i++) {
+    p = ol.pointer.CLONE_PROPS[i][0];
+    eventCopy[p] =
+        browserEvent[p] ||
+        inEvent[p] ||
+        ol.pointer.CLONE_PROPS[i][1];
+  }
+
+  return eventCopy;
+};
+
+
+// EVENTS
+
+
+/**
+ * Triggers a 'pointerdown' event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.down =
+    function(pointerEventData, browserEvent) {
+  this.fireEvent(ol.pointer.EventType.POINTERDOWN,
+      pointerEventData, browserEvent);
+};
+
+
+/**
+ * Triggers a 'pointermove' event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.move =
+    function(pointerEventData, browserEvent) {
+  this.fireEvent(ol.pointer.EventType.POINTERMOVE,
+      pointerEventData, browserEvent);
+};
+
+
+/**
+ * Triggers a 'pointerup' event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.up =
+    function(pointerEventData, browserEvent) {
+  this.fireEvent(ol.pointer.EventType.POINTERUP,
+      pointerEventData, browserEvent);
+};
+
+
+/**
+ * Triggers a 'pointerenter' event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.enter =
+    function(pointerEventData, browserEvent) {
+  pointerEventData.bubbles = false;
+  this.fireEvent(ol.pointer.EventType.POINTERENTER,
+      pointerEventData, browserEvent);
+};
+
+
+/**
+ * Triggers a 'pointerleave' event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.leave =
+    function(pointerEventData, browserEvent) {
+  pointerEventData.bubbles = false;
+  this.fireEvent(ol.pointer.EventType.POINTERLEAVE,
+      pointerEventData, browserEvent);
+};
+
+
+/**
+ * Triggers a 'pointerover' event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.over =
+    function(pointerEventData, browserEvent) {
+  pointerEventData.bubbles = true;
+  this.fireEvent(ol.pointer.EventType.POINTEROVER,
+      pointerEventData, browserEvent);
+};
+
+
+/**
+ * Triggers a 'pointerout' event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.out =
+    function(pointerEventData, browserEvent) {
+  pointerEventData.bubbles = true;
+  this.fireEvent(ol.pointer.EventType.POINTEROUT,
+      pointerEventData, browserEvent);
+};
+
+
+/**
+ * Triggers a 'pointercancel' event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.cancel =
+    function(pointerEventData, browserEvent) {
+  this.fireEvent(ol.pointer.EventType.POINTERCANCEL,
+      pointerEventData, browserEvent);
+};
+
+
+/**
+ * Triggers a combination of 'pointerout' and 'pointerleave' events.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.leaveOut =
+    function(pointerEventData, browserEvent) {
+  this.out(pointerEventData, browserEvent);
+  if (!this.contains_(
+      pointerEventData.target,
+      pointerEventData.relatedTarget)) {
+    this.leave(pointerEventData, browserEvent);
+  }
+};
+
+
+/**
+ * Triggers a combination of 'pointerover' and 'pointerevents' events.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.enterOver =
+    function(pointerEventData, browserEvent) {
+  this.over(pointerEventData, browserEvent);
+  if (!this.contains_(
+      pointerEventData.target,
+      pointerEventData.relatedTarget)) {
+    this.enter(pointerEventData, browserEvent);
+  }
+};
+
+
+/**
+ * @private
+ * @param {Element} container
+ * @param {Element} contained
+ * @return {boolean} Returns true if the container element
+ *   contains the other element.
+ */
+ol.pointer.PointerEventHandler.prototype.contains_ =
+    function(container, contained) {
+  return container.contains(contained);
+};
+
+
+// EVENT CREATION AND TRACKING
+/**
+ * Creates a new Event of type `inType`, based on the information in
+ * `pointerEventData`.
+ *
+ * @param {string} inType A string representing the type of event to create.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ * @return {ol.pointer.PointerEvent} A PointerEvent of type `inType`.
+ */
+ol.pointer.PointerEventHandler.prototype.makeEvent =
+    function(inType, pointerEventData, browserEvent) {
+  return new ol.pointer.PointerEvent(inType, browserEvent, pointerEventData);
+};
+
+
+/**
+ * Make and dispatch an event in one call.
+ * @param {string} inType A string representing the type of event.
+ * @param {Object} pointerEventData
+ * @param {goog.events.BrowserEvent } browserEvent
+ */
+ol.pointer.PointerEventHandler.prototype.fireEvent =
+    function(inType, pointerEventData, browserEvent) {
+  var e = this.makeEvent(inType, pointerEventData, browserEvent);
+  this.dispatchEvent(e);
+};
+
+
+/**
+ * Creates a pointer event from a native pointer event
+ * and dispatches this event.
+ * @param {goog.events.BrowserEvent} nativeEvent A platform event with a target.
+ */
+ol.pointer.PointerEventHandler.prototype.fireNativeEvent =
+    function(nativeEvent) {
+  var e = this.makeEvent(nativeEvent.type, nativeEvent.getBrowserEvent(),
+      nativeEvent);
+  this.dispatchEvent(e);
+};
+
+
+/**
+ * Wrap a native mouse event into a pointer event.
+ * This proxy method is required for the legacy IE support.
+ * @param {string} eventType The pointer event type.
+ * @param {goog.events.BrowserEvent} browserEvent
+ * @return {ol.pointer.PointerEvent}
+ */
+ol.pointer.PointerEventHandler.prototype.wrapMouseEvent =
+    function(eventType, browserEvent) {
+  var pointerEvent = this.makeEvent(
+      eventType,
+      ol.pointer.MouseSource.prepareEvent(browserEvent, this),
+      browserEvent
+      );
+  return pointerEvent;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.pointer.PointerEventHandler.prototype.disposeInternal = function() {
+  this.unregister_();
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * Constants for event names.
+ * @enum {string}
+ */
+ol.pointer.EventType = {
+  POINTERMOVE: 'pointermove',
+  POINTERDOWN: 'pointerdown',
+  POINTERUP: 'pointerup',
+  POINTEROVER: 'pointerover',
+  POINTEROUT: 'pointerout',
+  POINTERENTER: 'pointerenter',
+  POINTERLEAVE: 'pointerleave',
+  POINTERCANCEL: 'pointercancel'
+};
+
+
+/**
+ * Properties to copy when cloning an event, with default values.
+ * @type {Array.<Array>}
+ */
+ol.pointer.CLONE_PROPS = [
+  // MouseEvent
+  ['bubbles', false],
+  ['cancelable', false],
+  ['view', null],
+  ['detail', null],
+  ['screenX', 0],
+  ['screenY', 0],
+  ['clientX', 0],
+  ['clientY', 0],
+  ['ctrlKey', false],
+  ['altKey', false],
+  ['shiftKey', false],
+  ['metaKey', false],
+  ['button', 0],
+  ['relatedTarget', null],
+  // DOM Level 3
+  ['buttons', 0],
+  // PointerEvent
+  ['pointerId', 0],
+  ['width', 0],
+  ['height', 0],
+  ['pressure', 0],
+  ['tiltX', 0],
+  ['tiltY', 0],
+  ['pointerType', ''],
+  ['hwTimestamp', 0],
+  ['isPrimary', false],
+  // event instance
+  ['type', ''],
+  ['target', null],
+  ['currentTarget', null],
+  ['which', 0]
+];
diff --git a/src/ol/pointer/touchsource.js b/src/ol/pointer/touchsource.js
new file mode 100644
index 0000000..7e3d4c0
--- /dev/null
+++ b/src/ol/pointer/touchsource.js
@@ -0,0 +1,453 @@
+// Based on https://github.com/Polymer/PointerEvents
+
+// Copyright (c) 2013 The Polymer Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+goog.provide('ol.pointer.TouchSource');
+
+goog.require('goog.array');
+goog.require('goog.object');
+goog.require('ol.pointer.EventSource');
+goog.require('ol.pointer.MouseSource');
+
+
+
+/**
+ * @constructor
+ * @param {ol.pointer.PointerEventHandler} dispatcher
+ * @param {ol.pointer.MouseSource} mouseSource
+ * @extends {ol.pointer.EventSource}
+ */
+ol.pointer.TouchSource = function(dispatcher, mouseSource) {
+  var mapping = {
+    'touchstart': this.touchstart,
+    'touchmove': this.touchmove,
+    'touchend': this.touchend,
+    'touchcancel': this.touchcancel
+  };
+  goog.base(this, dispatcher, mapping);
+
+  /**
+   * @const
+   * @type {Object.<string, goog.events.BrowserEvent|Object>}
+   */
+  this.pointerMap = dispatcher.pointerMap;
+
+  /**
+   * @const
+   * @type {ol.pointer.MouseSource}
+   */
+  this.mouseSource = mouseSource;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.firstTouchId_ = undefined;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.clickCount_ = 0;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.resetId_ = undefined;
+};
+goog.inherits(ol.pointer.TouchSource, ol.pointer.EventSource);
+
+
+/**
+ * Mouse event timeout: This should be long enough to
+ * ignore compat mouse events made by touch.
+ * @const
+ * @type {number}
+ */
+ol.pointer.TouchSource.DEDUP_TIMEOUT = 2500;
+
+
+/**
+ * @const
+ * @type {number}
+ */
+ol.pointer.TouchSource.CLICK_COUNT_TIMEOUT = 200;
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.pointer.TouchSource.POINTER_TYPE = 'touch';
+
+
+/**
+ * @private
+ * @param {Touch} inTouch
+ * @return {boolean} True, if this is the primary touch.
+ */
+ol.pointer.TouchSource.prototype.isPrimaryTouch_ = function(inTouch) {
+  return this.firstTouchId_ === inTouch.identifier;
+};
+
+
+/**
+ * Set primary touch if there are no pointers, or the only pointer is the mouse.
+ * @param {Touch} inTouch
+ * @private
+ */
+ol.pointer.TouchSource.prototype.setPrimaryTouch_ = function(inTouch) {
+  var count = goog.object.getCount(this.pointerMap);
+  if (count === 0 || (count === 1 && goog.object.containsKey(this.pointerMap,
+      ol.pointer.MouseSource.POINTER_ID.toString()))) {
+    this.firstTouchId_ = inTouch.identifier;
+    this.cancelResetClickCount_();
+  }
+};
+
+
+/**
+ * @private
+ * @param {Object} inPointer
+ */
+ol.pointer.TouchSource.prototype.removePrimaryPointer_ = function(inPointer) {
+  if (inPointer.isPrimary) {
+    this.firstTouchId_ = undefined;
+    this.resetClickCount_();
+  }
+};
+
+
+/**
+ * @private
+ */
+ol.pointer.TouchSource.prototype.resetClickCount_ = function() {
+  this.resetId_ = goog.global.setTimeout(
+      goog.bind(this.resetClickCountHandler_, this),
+      ol.pointer.TouchSource.CLICK_COUNT_TIMEOUT);
+};
+
+
+/**
+ * @private
+ */
+ol.pointer.TouchSource.prototype.resetClickCountHandler_ = function() {
+  this.clickCount_ = 0;
+  this.resetId_ = undefined;
+};
+
+
+/**
+ * @private
+ */
+ol.pointer.TouchSource.prototype.cancelResetClickCount_ = function() {
+  if (goog.isDef(this.resetId_)) {
+    goog.global.clearTimeout(this.resetId_);
+  }
+};
+
+
+/**
+ * @private
+ * @param {goog.events.BrowserEvent} browserEvent Browser event
+ * @param {Touch} inTouch Touch event
+ * @return {Object}
+ */
+ol.pointer.TouchSource.prototype.touchToPointer_ =
+    function(browserEvent, inTouch) {
+  var e = this.dispatcher.cloneEvent(browserEvent, inTouch);
+  // Spec specifies that pointerId 1 is reserved for Mouse.
+  // Touch identifiers can start at 0.
+  // Add 2 to the touch identifier for compatibility.
+  e.pointerId = inTouch.identifier + 2;
+  // TODO: check if this is neccessary?
+  //e.target = findTarget(e);
+  e.bubbles = true;
+  e.cancelable = true;
+  e.detail = this.clickCount_;
+  e.button = 0;
+  e.buttons = 1;
+  e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;
+  e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;
+  e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
+  e.isPrimary = this.isPrimaryTouch_(inTouch);
+  e.pointerType = ol.pointer.TouchSource.POINTER_TYPE;
+
+  // make sure that the properties that are different for
+  // each `Touch` object are not copied from the BrowserEvent object
+  e.clientX = inTouch.clientX;
+  e.clientY = inTouch.clientY;
+  e.screenX = inTouch.screenX;
+  e.screenY = inTouch.screenY;
+
+  return e;
+};
+
+
+/**
+ * @private
+ * @param {goog.events.BrowserEvent} inEvent Touch event
+ * @param {function(goog.events.BrowserEvent, Object)} inFunction
+ */
+ol.pointer.TouchSource.prototype.processTouches_ =
+    function(inEvent, inFunction) {
+  var touches = Array.prototype.slice.call(
+      inEvent.getBrowserEvent().changedTouches);
+  var count = touches.length;
+  function preventDefault() {
+    inEvent.preventDefault();
+  }
+  var i, pointer;
+  for (i = 0; i < count; ++i) {
+    pointer = this.touchToPointer_(inEvent, touches[i]);
+    // forward touch preventDefaults
+    pointer.preventDefault = preventDefault;
+    inFunction.call(this, inEvent, pointer);
+  }
+};
+
+
+/**
+ * @private
+ * @param {TouchList} touchList
+ * @param {number} searchId
+ * @return {boolean} True, if the `Touch` with the given id is in the list.
+ */
+ol.pointer.TouchSource.prototype.findTouch_ = function(touchList, searchId) {
+  var l = touchList.length;
+  var touch;
+  for (var i = 0; i < l; i++) {
+    touch = touchList[i];
+    if (touch.identifier === searchId) {
+      return true;
+    }
+  }
+  return false;
+};
+
+
+/**
+ * In some instances, a touchstart can happen without a touchend. This
+ * leaves the pointermap in a broken state.
+ * Therefore, on every touchstart, we remove the touches that did not fire a
+ * touchend event.
+ * To keep state globally consistent, we fire a pointercancel for
+ * this "abandoned" touch
+ *
+ * @private
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.TouchSource.prototype.vacuumTouches_ = function(inEvent) {
+  var touchList = inEvent.getBrowserEvent().touches;
+  // pointerMap.getCount() should be < touchList.length here,
+  // as the touchstart has not been processed yet.
+  var keys = goog.object.getKeys(this.pointerMap);
+  var count = keys.length;
+  if (count >= touchList.length) {
+    var d = [];
+    var i, key, value;
+    for (i = 0; i < count; ++i) {
+      key = keys[i];
+      value = this.pointerMap[key];
+      // Never remove pointerId == 1, which is mouse.
+      // Touch identifiers are 2 smaller than their pointerId, which is the
+      // index in pointermap.
+      if (key != ol.pointer.MouseSource.POINTER_ID &&
+          !this.findTouch_(touchList, key - 2)) {
+        d.push(value.out);
+      }
+    }
+    for (i = 0; i < d.length; ++i) {
+      this.cancelOut_(inEvent, d[i]);
+    }
+  }
+};
+
+
+/**
+ * Handler for `touchstart`, triggers `pointerover`,
+ * `pointerenter` and `pointerdown` events.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.TouchSource.prototype.touchstart = function(inEvent) {
+  this.vacuumTouches_(inEvent);
+  this.setPrimaryTouch_(inEvent.getBrowserEvent().changedTouches[0]);
+  this.dedupSynthMouse_(inEvent);
+  this.clickCount_++;
+  this.processTouches_(inEvent, this.overDown_);
+};
+
+
+/**
+ * @private
+ * @param {goog.events.BrowserEvent} browserEvent
+ * @param {Object} inPointer
+ */
+ol.pointer.TouchSource.prototype.overDown_ = function(browserEvent, inPointer) {
+  goog.object.set(this.pointerMap, inPointer.pointerId, {
+    target: inPointer.target,
+    out: inPointer,
+    outTarget: inPointer.target
+  });
+  this.dispatcher.over(inPointer, browserEvent);
+  this.dispatcher.enter(inPointer, browserEvent);
+  this.dispatcher.down(inPointer, browserEvent);
+};
+
+
+/**
+ * Handler for `touchmove`.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.TouchSource.prototype.touchmove = function(inEvent) {
+  inEvent.preventDefault();
+  this.processTouches_(inEvent, this.moveOverOut_);
+};
+
+
+/**
+ * @private
+ * @param {goog.events.BrowserEvent} browserEvent
+ * @param {Object} inPointer
+ */
+ol.pointer.TouchSource.prototype.moveOverOut_ =
+    function(browserEvent, inPointer) {
+  var event = inPointer;
+  var pointer = goog.object.get(this.pointerMap, event.pointerId);
+  // a finger drifted off the screen, ignore it
+  if (!pointer) {
+    return;
+  }
+  var outEvent = pointer.out;
+  var outTarget = pointer.outTarget;
+  this.dispatcher.move(event, browserEvent);
+  if (outEvent && outTarget !== event.target) {
+    outEvent.relatedTarget = event.target;
+    event.relatedTarget = outTarget;
+    // recover from retargeting by shadow
+    outEvent.target = outTarget;
+    if (event.target) {
+      this.dispatcher.leaveOut(outEvent, browserEvent);
+      this.dispatcher.enterOver(event, browserEvent);
+    } else {
+      // clean up case when finger leaves the screen
+      event.target = outTarget;
+      event.relatedTarget = null;
+      this.cancelOut_(browserEvent, event);
+    }
+  }
+  pointer.out = event;
+  pointer.outTarget = event.target;
+};
+
+
+/**
+ * Handler for `touchend`, triggers `pointerup`,
+ * `pointerout` and `pointerleave` events.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.TouchSource.prototype.touchend = function(inEvent) {
+  this.dedupSynthMouse_(inEvent);
+  this.processTouches_(inEvent, this.upOut_);
+};
+
+
+/**
+ * @private
+ * @param {goog.events.BrowserEvent} browserEvent
+ * @param {Object} inPointer
+ */
+ol.pointer.TouchSource.prototype.upOut_ = function(browserEvent, inPointer) {
+  this.dispatcher.up(inPointer, browserEvent);
+  this.dispatcher.out(inPointer, browserEvent);
+  this.dispatcher.leave(inPointer, browserEvent);
+  this.cleanUpPointer_(inPointer);
+};
+
+
+/**
+ * Handler for `touchcancel`, triggers `pointercancel`,
+ * `pointerout` and `pointerleave` events.
+ *
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.TouchSource.prototype.touchcancel = function(inEvent) {
+  this.processTouches_(inEvent, this.cancelOut_);
+};
+
+
+/**
+ * @private
+ * @param {goog.events.BrowserEvent} browserEvent
+ * @param {Object} inPointer
+ */
+ol.pointer.TouchSource.prototype.cancelOut_ =
+    function(browserEvent, inPointer) {
+  this.dispatcher.cancel(inPointer, browserEvent);
+  this.dispatcher.out(inPointer, browserEvent);
+  this.dispatcher.leave(inPointer, browserEvent);
+  this.cleanUpPointer_(inPointer);
+};
+
+
+/**
+ * @private
+ * @param {Object} inPointer
+ */
+ol.pointer.TouchSource.prototype.cleanUpPointer_ = function(inPointer) {
+  goog.object.remove(this.pointerMap, inPointer.pointerId);
+  this.removePrimaryPointer_(inPointer);
+};
+
+
+/**
+ * Prevent synth mouse events from creating pointer events.
+ *
+ * @private
+ * @param {goog.events.BrowserEvent} inEvent
+ */
+ol.pointer.TouchSource.prototype.dedupSynthMouse_ = function(inEvent) {
+  var lts = this.mouseSource.lastTouches;
+  var t = inEvent.getBrowserEvent().changedTouches[0];
+  // only the primary finger will synth mouse events
+  if (this.isPrimaryTouch_(t)) {
+    // remember x/y of last touch
+    var lt = /** @type {ol.Pixel} */ ([t.clientX, t.clientY]);
+    lts.push(lt);
+
+    goog.global.setTimeout(function() {
+      // remove touch after timeout
+      goog.array.remove(lts, lt);
+    }, ol.pointer.TouchSource.DEDUP_TIMEOUT);
+  }
+};
diff --git a/src/ol/proj/common.js b/src/ol/proj/common.js
new file mode 100644
index 0000000..96e57df
--- /dev/null
+++ b/src/ol/proj/common.js
@@ -0,0 +1,24 @@
+goog.provide('ol.proj.common');
+
+goog.require('ol.proj');
+goog.require('ol.proj.EPSG3857');
+goog.require('ol.proj.EPSG4326');
+
+
+/**
+ * FIXME empty description for jsdoc
+ * @api
+ */
+ol.proj.common.add = function() {
+  // Add transformations that don't alter coordinates to convert within set of
+  // projections with equal meaning.
+  ol.proj.addEquivalentProjections(ol.proj.EPSG3857.PROJECTIONS);
+  ol.proj.addEquivalentProjections(ol.proj.EPSG4326.PROJECTIONS);
+  // Add transformations to convert EPSG:4326 like coordinates to EPSG:3857 like
+  // coordinates and back.
+  ol.proj.addEquivalentTransforms(
+      ol.proj.EPSG4326.PROJECTIONS,
+      ol.proj.EPSG3857.PROJECTIONS,
+      ol.proj.EPSG3857.fromEPSG4326,
+      ol.proj.EPSG3857.toEPSG4326);
+};
diff --git a/src/ol/proj/epsg3857projection.js b/src/ol/proj/epsg3857projection.js
new file mode 100644
index 0000000..e5ed7c0
--- /dev/null
+++ b/src/ol/proj/epsg3857projection.js
@@ -0,0 +1,158 @@
+goog.provide('ol.proj.EPSG3857');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.math');
+goog.require('ol.proj');
+goog.require('ol.proj.Projection');
+goog.require('ol.proj.Units');
+
+
+
+/**
+ * @classdesc
+ * Projection object for web/spherical Mercator (EPSG:3857).
+ *
+ * @constructor
+ * @extends {ol.proj.Projection}
+ * @param {string} code Code.
+ * @private
+ */
+ol.proj.EPSG3857_ = function(code) {
+  goog.base(this, {
+    code: code,
+    units: ol.proj.Units.METERS,
+    extent: ol.proj.EPSG3857.EXTENT,
+    global: true,
+    worldExtent: ol.proj.EPSG3857.WORLD_EXTENT
+  });
+};
+goog.inherits(ol.proj.EPSG3857_, ol.proj.Projection);
+
+
+/**
+ * @inheritDoc
+ */
+ol.proj.EPSG3857_.prototype.getPointResolution = function(resolution, point) {
+  return resolution / ol.math.cosh(point[1] / ol.proj.EPSG3857.RADIUS);
+};
+
+
+/**
+ * @const
+ * @type {number}
+ */
+ol.proj.EPSG3857.RADIUS = 6378137;
+
+
+/**
+ * @const
+ * @type {number}
+ */
+ol.proj.EPSG3857.HALF_SIZE = Math.PI * ol.proj.EPSG3857.RADIUS;
+
+
+/**
+ * @const
+ * @type {ol.Extent}
+ */
+ol.proj.EPSG3857.EXTENT = [
+  -ol.proj.EPSG3857.HALF_SIZE, -ol.proj.EPSG3857.HALF_SIZE,
+  ol.proj.EPSG3857.HALF_SIZE, ol.proj.EPSG3857.HALF_SIZE
+];
+
+
+/**
+ * @const
+ * @type {ol.Extent}
+ */
+ol.proj.EPSG3857.WORLD_EXTENT = [-180, -85, 180, 85];
+
+
+/**
+ * Lists several projection codes with the same meaning as EPSG:3857.
+ *
+ * @type {Array.<string>}
+ */
+ol.proj.EPSG3857.CODES = [
+  'EPSG:3857',
+  'EPSG:102100',
+  'EPSG:102113',
+  'EPSG:900913',
+  'urn:ogc:def:crs:EPSG:6.18:3:3857',
+  'urn:ogc:def:crs:EPSG::3857',
+  'http://www.opengis.net/gml/srs/epsg.xml#3857'
+];
+
+
+/**
+ * Projections equal to EPSG:3857.
+ *
+ * @const
+ * @type {Array.<ol.proj.Projection>}
+ */
+ol.proj.EPSG3857.PROJECTIONS = goog.array.map(
+    ol.proj.EPSG3857.CODES,
+    function(code) {
+      return new ol.proj.EPSG3857_(code);
+    });
+
+
+/**
+ * Transformation from EPSG:4326 to EPSG:3857.
+ *
+ * @param {Array.<number>} input Input array of coordinate values.
+ * @param {Array.<number>=} opt_output Output array of coordinate values.
+ * @param {number=} opt_dimension Dimension (default is `2`).
+ * @return {Array.<number>} Output array of coordinate values.
+ */
+ol.proj.EPSG3857.fromEPSG4326 = function(input, opt_output, opt_dimension) {
+  var length = input.length,
+      dimension = opt_dimension > 1 ? opt_dimension : 2,
+      output = opt_output;
+  if (!goog.isDef(output)) {
+    if (dimension > 2) {
+      // preserve values beyond second dimension
+      output = input.slice();
+    } else {
+      output = new Array(length);
+    }
+  }
+  goog.asserts.assert(output.length % dimension === 0);
+  for (var i = 0; i < length; i += dimension) {
+    output[i] = ol.proj.EPSG3857.RADIUS * Math.PI * input[i] / 180;
+    output[i + 1] = ol.proj.EPSG3857.RADIUS *
+        Math.log(Math.tan(Math.PI * (input[i + 1] + 90) / 360));
+  }
+  return output;
+};
+
+
+/**
+ * Transformation from EPSG:3857 to EPSG:4326.
+ *
+ * @param {Array.<number>} input Input array of coordinate values.
+ * @param {Array.<number>=} opt_output Output array of coordinate values.
+ * @param {number=} opt_dimension Dimension (default is `2`).
+ * @return {Array.<number>} Output array of coordinate values.
+ */
+ol.proj.EPSG3857.toEPSG4326 = function(input, opt_output, opt_dimension) {
+  var length = input.length,
+      dimension = opt_dimension > 1 ? opt_dimension : 2,
+      output = opt_output;
+  if (!goog.isDef(output)) {
+    if (dimension > 2) {
+      // preserve values beyond second dimension
+      output = input.slice();
+    } else {
+      output = new Array(length);
+    }
+  }
+  goog.asserts.assert(output.length % dimension === 0);
+  for (var i = 0; i < length; i += dimension) {
+    output[i] = 180 * input[i] / (ol.proj.EPSG3857.RADIUS * Math.PI);
+    output[i + 1] = 360 * Math.atan(
+        Math.exp(input[i + 1] / ol.proj.EPSG3857.RADIUS)) / Math.PI - 90;
+  }
+  return output;
+};
diff --git a/src/ol/proj/epsg4326projection.js b/src/ol/proj/epsg4326projection.js
new file mode 100644
index 0000000..cbbf571
--- /dev/null
+++ b/src/ol/proj/epsg4326projection.js
@@ -0,0 +1,68 @@
+goog.provide('ol.proj.EPSG4326');
+
+goog.require('ol.proj');
+goog.require('ol.proj.Projection');
+goog.require('ol.proj.Units');
+
+
+
+/**
+ * @classdesc
+ * Projection object for WGS84 geographic coordinates (EPSG:4326).
+ *
+ * Note that OpenLayers does not strictly comply with the EPSG definition.
+ * The EPSG registry defines 4326 as a CRS for Latitude,Longitude (y,x).
+ * OpenLayers treats EPSG:4326 as a pseudo-projection, with x,y coordinates.
+ *
+ * @constructor
+ * @extends {ol.proj.Projection}
+ * @param {string} code Code.
+ * @param {string=} opt_axisOrientation Axis orientation.
+ * @private
+ */
+ol.proj.EPSG4326_ = function(code, opt_axisOrientation) {
+  goog.base(this, {
+    code: code,
+    units: ol.proj.Units.DEGREES,
+    extent: ol.proj.EPSG4326.EXTENT,
+    axisOrientation: opt_axisOrientation,
+    global: true,
+    worldExtent: ol.proj.EPSG4326.EXTENT
+  });
+};
+goog.inherits(ol.proj.EPSG4326_, ol.proj.Projection);
+
+
+/**
+ * @inheritDoc
+ */
+ol.proj.EPSG4326_.prototype.getPointResolution = function(resolution, point) {
+  return resolution;
+};
+
+
+/**
+ * Extent of the EPSG:4326 projection which is the whole world.
+ *
+ * @const
+ * @type {ol.Extent}
+ */
+ol.proj.EPSG4326.EXTENT = [-180, -90, 180, 90];
+
+
+/**
+ * Projections equal to EPSG:4326.
+ *
+ * @const
+ * @type {Array.<ol.proj.Projection>}
+ */
+ol.proj.EPSG4326.PROJECTIONS = [
+  new ol.proj.EPSG4326_('CRS:84'),
+  new ol.proj.EPSG4326_('EPSG:4326', 'neu'),
+  new ol.proj.EPSG4326_('urn:ogc:def:crs:EPSG::4326', 'neu'),
+  new ol.proj.EPSG4326_('urn:ogc:def:crs:EPSG:6.6:4326', 'neu'),
+  new ol.proj.EPSG4326_('urn:ogc:def:crs:OGC:1.3:CRS84'),
+  new ol.proj.EPSG4326_('urn:ogc:def:crs:OGC:2:84'),
+  new ol.proj.EPSG4326_('http://www.opengis.net/gml/srs/epsg.xml#4326', 'neu'),
+  new ol.proj.EPSG4326_('urn:x-ogc:def:crs:EPSG:4326', 'neu')
+];
diff --git a/src/ol/proj/proj.js b/src/ol/proj/proj.js
new file mode 100644
index 0000000..5ceccdf
--- /dev/null
+++ b/src/ol/proj/proj.js
@@ -0,0 +1,714 @@
+goog.provide('ol.proj');
+goog.provide('ol.proj.METERS_PER_UNIT');
+goog.provide('ol.proj.Projection');
+goog.provide('ol.proj.ProjectionLike');
+goog.provide('ol.proj.Units');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('ol');
+goog.require('ol.Extent');
+goog.require('ol.TransformFunction');
+goog.require('ol.extent');
+goog.require('ol.sphere.NORMAL');
+
+
+/**
+ * A projection as {@link ol.proj.Projection}, SRS identifier string or
+ * undefined.
+ * @typedef {ol.proj.Projection|string|undefined} ol.proj.ProjectionLike
+ * @api stable
+ */
+ol.proj.ProjectionLike;
+
+
+/**
+ * Projection units: `'degrees'`, `'ft'`, `'m'` or `'pixels'`.
+ * @enum {string}
+ * @api stable
+ */
+ol.proj.Units = {
+  DEGREES: 'degrees',
+  FEET: 'ft',
+  METERS: 'm',
+  PIXELS: 'pixels'
+};
+
+
+/**
+ * Meters per unit lookup table.
+ * @const
+ * @type {Object.<ol.proj.Units, number>}
+ * @api stable
+ */
+ol.proj.METERS_PER_UNIT = {};
+ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] =
+    2 * Math.PI * ol.sphere.NORMAL.radius / 360;
+ol.proj.METERS_PER_UNIT[ol.proj.Units.FEET] = 0.3048;
+ol.proj.METERS_PER_UNIT[ol.proj.Units.METERS] = 1;
+
+
+
+/**
+ * @classdesc
+ * Projection definition class. One of these is created for each projection
+ * supported in the application and stored in the {@link ol.proj} namespace.
+ * You can use these in applications, but this is not required, as API params
+ * and options use {@link ol.proj.ProjectionLike} which means the simple string
+ * code will suffice.
+ *
+ * You can use {@link ol.proj.get} to retrieve the object for a particular
+ * projection.
+ *
+ * The library includes definitions for `EPSG:4326` and `EPSG:3857`, together
+ * with the following aliases:
+ * * `EPSG:4326`: CRS:84, urn:ogc:def:crs:EPSG:6.6:4326,
+ *     urn:ogc:def:crs:OGC:1.3:CRS84, urn:ogc:def:crs:OGC:2:84,
+ *     http://www.opengis.net/gml/srs/epsg.xml#4326,
+ *     urn:x-ogc:def:crs:EPSG:4326
+ * * `EPSG:3857`: EPSG:102100, EPSG:102113, EPSG:900913,
+ *     urn:ogc:def:crs:EPSG:6.18:3:3857,
+ *     http://www.opengis.net/gml/srs/epsg.xml#3857
+ *
+ * If you use proj4js, aliases can be added using `proj4.defs()`; see
+ * [documentation](https://github.com/proj4js/proj4js).
+ *
+ * @constructor
+ * @param {olx.ProjectionOptions} options Projection options.
+ * @struct
+ * @api stable
+ */
+ol.proj.Projection = function(options) {
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.code_ = options.code;
+
+  /**
+   * @private
+   * @type {ol.proj.Units}
+   */
+  this.units_ = /** @type {ol.proj.Units} */ (options.units);
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.extent_ = goog.isDef(options.extent) ? options.extent : null;
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.worldExtent_ = goog.isDef(options.worldExtent) ?
+      options.worldExtent : null;
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.axisOrientation_ = goog.isDef(options.axisOrientation) ?
+      options.axisOrientation : 'enu';
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.global_ = goog.isDef(options.global) ? options.global : false;
+
+  /**
+   * @private
+   * @type {ol.tilegrid.TileGrid}
+   */
+  this.defaultTileGrid_ = null;
+
+};
+
+
+/**
+ * Get the code for this projection, e.g. 'EPSG:4326'.
+ * @return {string} Code.
+ * @api stable
+ */
+ol.proj.Projection.prototype.getCode = function() {
+  return this.code_;
+};
+
+
+/**
+ * Get the validity extent for this projection.
+ * @return {ol.Extent} Extent.
+ * @api stable
+ */
+ol.proj.Projection.prototype.getExtent = function() {
+  return this.extent_;
+};
+
+
+/**
+ * Get the units of this projection.
+ * @return {ol.proj.Units} Units.
+ * @api stable
+ */
+ol.proj.Projection.prototype.getUnits = function() {
+  return this.units_;
+};
+
+
+/**
+ * Get the amount of meters per unit of this projection.  If the projection is
+ * not configured with a units identifier, the return is `undefined`.
+ * @return {number|undefined} Meters.
+ * @api stable
+ */
+ol.proj.Projection.prototype.getMetersPerUnit = function() {
+  return ol.proj.METERS_PER_UNIT[this.units_];
+};
+
+
+/**
+ * Get the world extent for this projection.
+ * @return {ol.Extent} Extent.
+ * @api
+ */
+ol.proj.Projection.prototype.getWorldExtent = function() {
+  return this.worldExtent_;
+};
+
+
+/**
+ * Get the axis orientation of this projection.
+ * Example values are:
+ * enu - the default easting, northing, elevation.
+ * neu - northing, easting, up - useful for "lat/long" geographic coordinates,
+ *     or south orientated transverse mercator.
+ * wnu - westing, northing, up - some planetary coordinate systems have
+ *     "west positive" coordinate systems
+ * @return {string} Axis orientation.
+ */
+ol.proj.Projection.prototype.getAxisOrientation = function() {
+  return this.axisOrientation_;
+};
+
+
+/**
+ * Is this projection a global projection which spans the whole world?
+ * @return {boolean} Wether the projection is global.
+ * @api stable
+ */
+ol.proj.Projection.prototype.isGlobal = function() {
+  return this.global_;
+};
+
+
+/**
+ * @return {ol.tilegrid.TileGrid} The default tile grid.
+ */
+ol.proj.Projection.prototype.getDefaultTileGrid = function() {
+  return this.defaultTileGrid_;
+};
+
+
+/**
+ * @param {ol.tilegrid.TileGrid} tileGrid The default tile grid.
+ */
+ol.proj.Projection.prototype.setDefaultTileGrid = function(tileGrid) {
+  this.defaultTileGrid_ = tileGrid;
+};
+
+
+/**
+ * Set the validity extent for this projection.
+ * @param {ol.Extent} extent Extent.
+ * @api stable
+ */
+ol.proj.Projection.prototype.setExtent = function(extent) {
+  this.extent_ = extent;
+};
+
+
+/**
+ * Set the world extent for this projection.
+ * @param {ol.Extent} worldExtent World extent
+ *     [minlon, minlat, maxlon, maxlat].
+ * @api
+ */
+ol.proj.Projection.prototype.setWorldExtent = function(worldExtent) {
+  this.worldExtent_ = worldExtent;
+};
+
+
+/**
+ * Get the resolution of the point in degrees. For projections with degrees as
+ * the unit this will simply return the provided resolution. For other
+ * projections the point resolution is estimated by transforming the center
+ * pixel to EPSG:4326, measuring its width and height on the normal sphere,
+ * and taking the average of the width and height.
+ * @param {number} resolution Resolution.
+ * @param {ol.Coordinate} point Point.
+ * @return {number} Point resolution.
+ */
+ol.proj.Projection.prototype.getPointResolution = function(resolution, point) {
+  var units = this.getUnits();
+  if (units == ol.proj.Units.DEGREES) {
+    return resolution;
+  } else {
+    // Estimate point resolution by transforming the center pixel to EPSG:4326,
+    // measuring its width and height on the normal sphere, and taking the
+    // average of the width and height.
+    var toEPSG4326 = ol.proj.getTransformFromProjections(
+        this, ol.proj.get('EPSG:4326'));
+    var vertices = [
+      point[0] - resolution / 2, point[1],
+      point[0] + resolution / 2, point[1],
+      point[0], point[1] - resolution / 2,
+      point[0], point[1] + resolution / 2
+    ];
+    vertices = toEPSG4326(vertices, vertices, 2);
+    var width = ol.sphere.NORMAL.haversineDistance(
+        vertices.slice(0, 2), vertices.slice(2, 4));
+    var height = ol.sphere.NORMAL.haversineDistance(
+        vertices.slice(4, 6), vertices.slice(6, 8));
+    var pointResolution = (width + height) / 2;
+    var metersPerUnit = this.getMetersPerUnit();
+    if (goog.isDef(metersPerUnit)) {
+      pointResolution /= metersPerUnit;
+    }
+    return pointResolution;
+  }
+};
+
+
+/**
+ * @private
+ * @type {Object.<string, ol.proj.Projection>}
+ */
+ol.proj.projections_ = {};
+
+
+/**
+ * @private
+ * @type {Object.<string, Object.<string, ol.TransformFunction>>}
+ */
+ol.proj.transforms_ = {};
+
+
+/**
+ * Registers transformation functions that don't alter coordinates. Those allow
+ * to transform between projections with equal meaning.
+ *
+ * @param {Array.<ol.proj.Projection>} projections Projections.
+ * @api
+ */
+ol.proj.addEquivalentProjections = function(projections) {
+  ol.proj.addProjections(projections);
+  goog.array.forEach(projections, function(source) {
+    goog.array.forEach(projections, function(destination) {
+      if (source !== destination) {
+        ol.proj.addTransform(source, destination, ol.proj.cloneTransform);
+      }
+    });
+  });
+};
+
+
+/**
+ * Registers transformation functions to convert coordinates in any projection
+ * in projection1 to any projection in projection2.
+ *
+ * @param {Array.<ol.proj.Projection>} projections1 Projections with equal
+ *     meaning.
+ * @param {Array.<ol.proj.Projection>} projections2 Projections with equal
+ *     meaning.
+ * @param {ol.TransformFunction} forwardTransform Transformation from any
+ *   projection in projection1 to any projection in projection2.
+ * @param {ol.TransformFunction} inverseTransform Transform from any projection
+ *   in projection2 to any projection in projection1..
+ */
+ol.proj.addEquivalentTransforms =
+    function(projections1, projections2, forwardTransform, inverseTransform) {
+  goog.array.forEach(projections1, function(projection1) {
+    goog.array.forEach(projections2, function(projection2) {
+      ol.proj.addTransform(projection1, projection2, forwardTransform);
+      ol.proj.addTransform(projection2, projection1, inverseTransform);
+    });
+  });
+};
+
+
+/**
+ * Add a Projection object to the list of supported projections.
+ *
+ * @param {ol.proj.Projection} projection Projection instance.
+ * @api stable
+ */
+ol.proj.addProjection = function(projection) {
+  ol.proj.projections_[projection.getCode()] = projection;
+  ol.proj.addTransform(projection, projection, ol.proj.cloneTransform);
+};
+
+
+/**
+ * @param {Array.<ol.proj.Projection>} projections Projections.
+ */
+ol.proj.addProjections = function(projections) {
+  var addedProjections = [];
+  goog.array.forEach(projections, function(projection) {
+    addedProjections.push(ol.proj.addProjection(projection));
+  });
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.proj.clearAllProjections = function() {
+  ol.proj.projections_ = {};
+  ol.proj.transforms_ = {};
+};
+
+
+/**
+ * @param {ol.proj.Projection|string|undefined} projection Projection.
+ * @param {string} defaultCode Default code.
+ * @return {ol.proj.Projection} Projection.
+ */
+ol.proj.createProjection = function(projection, defaultCode) {
+  if (!goog.isDefAndNotNull(projection)) {
+    return ol.proj.get(defaultCode);
+  } else if (goog.isString(projection)) {
+    return ol.proj.get(projection);
+  } else {
+    goog.asserts.assertInstanceof(projection, ol.proj.Projection);
+    return projection;
+  }
+};
+
+
+/**
+ * Registers a conversion function to convert coordinates from the source
+ * projection to the destination projection.
+ *
+ * @param {ol.proj.Projection} source Source.
+ * @param {ol.proj.Projection} destination Destination.
+ * @param {ol.TransformFunction} transformFn Transform.
+ */
+ol.proj.addTransform = function(source, destination, transformFn) {
+  var sourceCode = source.getCode();
+  var destinationCode = destination.getCode();
+  var transforms = ol.proj.transforms_;
+  if (!goog.object.containsKey(transforms, sourceCode)) {
+    transforms[sourceCode] = {};
+  }
+  transforms[sourceCode][destinationCode] = transformFn;
+};
+
+
+/**
+ * Registers coordinate transform functions to convert coordinates between the
+ * source projection and the destination projection.
+ * The forward and inverse functions convert coordinate pairs; this function
+ * converts these into the functions used internally which also handle
+ * extents and coordinate arrays.
+ *
+ * @param {ol.proj.ProjectionLike} source Source projection.
+ * @param {ol.proj.ProjectionLike} destination Destination projection.
+ * @param {function(ol.Coordinate): ol.Coordinate} forward The forward transform
+ *     function (that is, from the source projection to the destination
+ *     projection) that takes a {@link ol.Coordinate} as argument and returns
+ *     the transformed {@link ol.Coordinate}.
+ * @param {function(ol.Coordinate): ol.Coordinate} inverse The inverse transform
+ *     function (that is, from the destination projection to the source
+ *     projection) that takes a {@link ol.Coordinate} as argument and returns
+ *     the transformed {@link ol.Coordinate}.
+ * @api stable
+ */
+ol.proj.addCoordinateTransforms =
+    function(source, destination, forward, inverse) {
+  var sourceProj = ol.proj.get(source);
+  var destProj = ol.proj.get(destination);
+  ol.proj.addTransform(sourceProj, destProj,
+      ol.proj.createTransformFromCoordinateTransform(forward));
+  ol.proj.addTransform(destProj, sourceProj,
+      ol.proj.createTransformFromCoordinateTransform(inverse));
+};
+
+
+/**
+ * Creates a {@link ol.TransformFunction} from a simple 2D coordinate transform
+ * function.
+ * @param {function(ol.Coordinate): ol.Coordinate} transform Coordinate
+ *     transform.
+ * @return {ol.TransformFunction} Transform function.
+ */
+ol.proj.createTransformFromCoordinateTransform = function(transform) {
+  return (
+      /**
+       * @param {Array.<number>} input Input.
+       * @param {Array.<number>=} opt_output Output.
+       * @param {number=} opt_dimension Dimension.
+       * @return {Array.<number>} Output.
+       */
+      function(input, opt_output, opt_dimension) {
+        var length = input.length;
+        var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2;
+        var output = goog.isDef(opt_output) ? opt_output : new Array(length);
+        var point, i, j;
+        for (i = 0; i < length; i += dimension) {
+          point = transform([input[i], input[i + 1]]);
+          output[i] = point[0];
+          output[i + 1] = point[1];
+          for (j = dimension - 1; j >= 2; --j) {
+            output[i + j] = input[i + j];
+          }
+        }
+        return output;
+      });
+};
+
+
+/**
+ * Unregisters the conversion function to convert coordinates from the source
+ * projection to the destination projection.  This method is used to clean up
+ * cached transforms during testing.
+ *
+ * @param {ol.proj.Projection} source Source projection.
+ * @param {ol.proj.Projection} destination Destination projection.
+ * @return {ol.TransformFunction} transformFn The unregistered transform.
+ */
+ol.proj.removeTransform = function(source, destination) {
+  var sourceCode = source.getCode();
+  var destinationCode = destination.getCode();
+  var transforms = ol.proj.transforms_;
+  goog.asserts.assert(sourceCode in transforms);
+  goog.asserts.assert(destinationCode in transforms[sourceCode]);
+  var transform = transforms[sourceCode][destinationCode];
+  delete transforms[sourceCode][destinationCode];
+  var keys = goog.object.getKeys(transforms[sourceCode]);
+  if (keys.length === 0) {
+    delete transforms[sourceCode];
+  }
+  return transform;
+};
+
+
+/**
+ * Fetches a Projection object for the code specified.
+ *
+ * @param {ol.proj.ProjectionLike} projectionLike Either a code string which is
+ *     a combination of authority and identifier such as "EPSG:4326", or an
+ *     existing projection object, or undefined.
+ * @return {ol.proj.Projection} Projection object, or null if not in list.
+ * @api stable
+ */
+ol.proj.get = function(projectionLike) {
+  var projection;
+  if (projectionLike instanceof ol.proj.Projection) {
+    projection = projectionLike;
+  } else if (goog.isString(projectionLike)) {
+    var code = projectionLike;
+    var projections = ol.proj.projections_;
+    projection = projections[code];
+    if (ol.ENABLE_PROJ4JS && !goog.isDef(projection) &&
+        typeof proj4 == 'function') {
+      var def = proj4.defs(code);
+      if (goog.isDef(def)) {
+        var units = def.units;
+        if (!goog.isDef(units)) {
+          if (goog.isDef(def.to_meter)) {
+            units = def.to_meter.toString();
+            ol.proj.METERS_PER_UNIT[units] = def.to_meter;
+          }
+        }
+        projection = new ol.proj.Projection({
+          code: code,
+          units: units,
+          axisOrientation: def.axis
+        });
+        ol.proj.addProjection(projection);
+        var currentCode, currentDef, currentProj, proj4Transform;
+        for (currentCode in projections) {
+          currentDef = proj4.defs(currentCode);
+          if (goog.isDef(currentDef)) {
+            currentProj = ol.proj.get(currentCode);
+            if (currentDef === def) {
+              ol.proj.addEquivalentProjections([currentProj, projection]);
+            } else {
+              proj4Transform = proj4(currentCode, code);
+              ol.proj.addCoordinateTransforms(currentProj, projection,
+                  proj4Transform.forward, proj4Transform.inverse);
+            }
+          }
+        }
+      } else {
+        goog.asserts.assert(goog.isDef(projection));
+        projection = null;
+      }
+    }
+  } else {
+    projection = null;
+  }
+  return projection;
+};
+
+
+/**
+ * Checks if two projections are the same, that is every coordinate in one
+ * projection does represent the same geographic point as the same coordinate in
+ * the other projection.
+ *
+ * @param {ol.proj.Projection} projection1 Projection 1.
+ * @param {ol.proj.Projection} projection2 Projection 2.
+ * @return {boolean} Equivalent.
+ */
+ol.proj.equivalent = function(projection1, projection2) {
+  if (projection1 === projection2) {
+    return true;
+  } else if (projection1.getUnits() != projection2.getUnits()) {
+    return false;
+  } else {
+    var transformFn = ol.proj.getTransformFromProjections(
+        projection1, projection2);
+    return transformFn === ol.proj.cloneTransform;
+  }
+};
+
+
+/**
+ * Given the projection-like objects, searches for a transformation
+ * function to convert a coordinates array from the source projection to the
+ * destination projection.
+ *
+ * @param {ol.proj.ProjectionLike} source Source.
+ * @param {ol.proj.ProjectionLike} destination Destination.
+ * @return {ol.TransformFunction} Transform function.
+ * @api stable
+ */
+ol.proj.getTransform = function(source, destination) {
+  var sourceProjection = ol.proj.get(source);
+  var destinationProjection = ol.proj.get(destination);
+  return ol.proj.getTransformFromProjections(
+      sourceProjection, destinationProjection);
+};
+
+
+/**
+ * Searches in the list of transform functions for the function for converting
+ * coordinates from the source projection to the destination projection.
+ *
+ * @param {ol.proj.Projection} sourceProjection Source Projection object.
+ * @param {ol.proj.Projection} destinationProjection Destination Projection
+ *     object.
+ * @return {ol.TransformFunction} Transform function.
+ */
+ol.proj.getTransformFromProjections =
+    function(sourceProjection, destinationProjection) {
+  var transforms = ol.proj.transforms_;
+  var sourceCode = sourceProjection.getCode();
+  var destinationCode = destinationProjection.getCode();
+  var transform;
+  if (goog.object.containsKey(transforms, sourceCode) &&
+      goog.object.containsKey(transforms[sourceCode], destinationCode)) {
+    transform = transforms[sourceCode][destinationCode];
+  }
+  if (!goog.isDef(transform)) {
+    goog.asserts.assert(goog.isDef(transform));
+    transform = ol.proj.identityTransform;
+  }
+  return transform;
+};
+
+
+/**
+ * @param {Array.<number>} input Input coordinate array.
+ * @param {Array.<number>=} opt_output Output array of coordinate values.
+ * @param {number=} opt_dimension Dimension.
+ * @return {Array.<number>} Input coordinate array (same array as input).
+ */
+ol.proj.identityTransform = function(input, opt_output, opt_dimension) {
+  if (goog.isDef(opt_output) && input !== opt_output) {
+    // TODO: consider making this a warning instead
+    goog.asserts.fail('This should not be used internally.');
+    for (var i = 0, ii = input.length; i < ii; ++i) {
+      opt_output[i] = input[i];
+    }
+    input = opt_output;
+  }
+  return input;
+};
+
+
+/**
+ * @param {Array.<number>} input Input coordinate array.
+ * @param {Array.<number>=} opt_output Output array of coordinate values.
+ * @param {number=} opt_dimension Dimension.
+ * @return {Array.<number>} Output coordinate array (new array, same coordinate
+ *     values).
+ */
+ol.proj.cloneTransform = function(input, opt_output, opt_dimension) {
+  var output;
+  if (goog.isDef(opt_output)) {
+    for (var i = 0, ii = input.length; i < ii; ++i) {
+      opt_output[i] = input[i];
+    }
+    output = opt_output;
+  } else {
+    output = input.slice();
+  }
+  return output;
+};
+
+
+/**
+ * Transforms a coordinate from source projection to destination projection.
+ * This returns a new coordinate (and does not modify the original).
+ *
+ * See {@link ol.proj.transformExtent} for extent transformation.
+ * See the transform method of {@link ol.geom.Geometry} and its subclasses for
+ * geometry transforms.
+ *
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {ol.proj.ProjectionLike} source Source projection-like.
+ * @param {ol.proj.ProjectionLike} destination Destination projection-like.
+ * @return {ol.Coordinate} Coordinate.
+ * @api stable
+ */
+ol.proj.transform = function(coordinate, source, destination) {
+  var transformFn = ol.proj.getTransform(source, destination);
+  return transformFn(coordinate, undefined, coordinate.length);
+};
+
+
+/**
+ * Transforms an extent from source projection to destination projection.  This
+ * returns a new extent (and does not modify the original).
+ *
+ * @param {ol.Extent} extent The extent to transform.
+ * @param {ol.proj.ProjectionLike} source Source projection-like.
+ * @param {ol.proj.ProjectionLike} destination Destination projection-like.
+ * @return {ol.Extent} The transformed extent.
+ * @api stable
+ */
+ol.proj.transformExtent = function(extent, source, destination) {
+  var transformFn = ol.proj.getTransform(source, destination);
+  return ol.extent.applyTransform(extent, transformFn);
+};
+
+
+/**
+ * Transforms the given point to the destination projection.
+ *
+ * @param {ol.Coordinate} point Point.
+ * @param {ol.proj.Projection} sourceProjection Source projection.
+ * @param {ol.proj.Projection} destinationProjection Destination projection.
+ * @return {ol.Coordinate} Point.
+ */
+ol.proj.transformWithProjections =
+    function(point, sourceProjection, destinationProjection) {
+  var transformFn = ol.proj.getTransformFromProjections(
+      sourceProjection, destinationProjection);
+  return transformFn(point);
+};
diff --git a/src/ol/proj/proj.jsdoc b/src/ol/proj/proj.jsdoc
new file mode 100644
index 0000000..d188ef7
--- /dev/null
+++ b/src/ol/proj/proj.jsdoc
@@ -0,0 +1,54 @@
+/**
+ * The ol.proj namespace stores:
+ * * a list of {@link ol.proj.Projection}
+ * objects, one for each projection supported by the application
+ * * a list of transform functions needed to convert coordinates in one projection
+ * into another.
+ *
+ * The static functions are the methods used to maintain these.
+ * Each transform function can handle not only simple coordinate pairs, but also
+ * large arrays of coordinates such as vector geometries.
+ *
+ * When loaded, the library adds projection objects for EPSG:4326 (WGS84
+ * geographic coordinates) and EPSG:3857 (Web or Spherical Mercator, as used
+ * for example by Bing Maps or OpenStreetMap), together with the relevant
+ * transform functions.
+ *
+ * Additional transforms may be added by using the {@link http://proj4js.org/}
+ * library (version 2.2 or later). You can use the full build supplied by
+ * Proj4js, or create a custom build to support those projections you need; see
+ * the Proj4js website for how to do this. You also need the Proj4js definitions
+ * for the required projections. These definitions can be obtained from
+ * {@link http://epsg.io/}, and are a JS function, so can be loaded in a script
+ * tag (as in the examples) or pasted into your application.
+ * The first time there is a request for a projection, either with a
+ * {@link ol.proj.projectionLike} or directly with {@link ol.proj.get}, the
+ * code will check if the Proj4js library and the necessary definition are
+ * loaded; if so, it will register the appropriate {@link ol.proj.Projection}
+ * object and add transform functions between the new projection and all the
+ * existing ones. See examples/wms-image-custom-proj for an example of this.
+ * Because the check for presence of the Proj4js library and the definition only
+ * takes place on the first request for them, this means they can be loaded
+ * dynamically as needed; for example, with user-supplied data where you don't
+ * know in advance what projections are needed, you can initially load minimal
+ * support and then load whichever are requested.
+ *
+ * Note that Proj4js does not support projection extents. If you want to add
+ * one for creating default tile grids, you can add it after the Projection
+ * object has been created with `setExtent`, for example,
+ * `ol.proj.get('EPSG:1234').setExtent(extent)`.
+ *
+ * In addition to Proj4js support, any transform functions can be added with
+ * {@link ol.proj.addCoordinateTransforms}. To use this, you must first create
+ * a {@link ol.proj.Projection} object for the new projection and add it with
+ * {@link ol.proj.addProjection}. You can then add the forward and inverse
+ * functions with {@link ol.proj.addCoordinateTransforms}. See
+ * examples/wms-custom-proj for an example of this.
+ *
+ * Note that if no transforms are needed and you only need to define the
+ * projection, just add a {@link ol.proj.Projection} with
+ * {@link ol.proj.addProjection}. See examples/wms-no-proj for an example of
+ * this.
+ *
+ * @namespace ol.proj
+ */
diff --git a/src/ol/render.jsdoc b/src/ol/render.jsdoc
new file mode 100644
index 0000000..a167ba1
--- /dev/null
+++ b/src/ol/render.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.render
+ */
diff --git a/src/ol/render/box.js b/src/ol/render/box.js
new file mode 100644
index 0000000..8c58eef
--- /dev/null
+++ b/src/ol/render/box.js
@@ -0,0 +1,160 @@
+// FIXME add rotation
+
+goog.provide('ol.render.Box');
+
+goog.require('goog.Disposable');
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('ol.geom.Polygon');
+goog.require('ol.render.EventType');
+
+
+
+/**
+ * @constructor
+ * @extends {goog.Disposable}
+ * @param {ol.style.Style} style Style.
+ */
+ol.render.Box = function(style) {
+
+  /**
+   * @private
+   * @type {ol.Map}
+   */
+  this.map_ = null;
+
+  /**
+   * @private
+   * @type {goog.events.Key}
+   */
+  this.postComposeListenerKey_ = null;
+
+  /**
+   * @private
+   * @type {ol.Pixel}
+   */
+  this.startPixel_ = null;
+
+  /**
+   * @private
+   * @type {ol.Pixel}
+   */
+  this.endPixel_ = null;
+
+  /**
+   * @private
+   * @type {ol.geom.Polygon}
+   */
+  this.geometry_ = null;
+
+  /**
+   * @private
+   * @type {ol.style.Style}
+   */
+  this.style_ = style;
+
+};
+goog.inherits(ol.render.Box, goog.Disposable);
+
+
+/**
+ * @private
+ * @return {ol.geom.Polygon} Geometry.
+ */
+ol.render.Box.prototype.createGeometry_ = function() {
+  goog.asserts.assert(!goog.isNull(this.startPixel_));
+  goog.asserts.assert(!goog.isNull(this.endPixel_));
+  goog.asserts.assert(!goog.isNull(this.map_));
+  var startPixel = this.startPixel_;
+  var endPixel = this.endPixel_;
+  var pixels = [
+    startPixel,
+    [startPixel[0], endPixel[1]],
+    endPixel,
+    [endPixel[0], startPixel[1]]
+  ];
+  var coordinates = goog.array.map(pixels,
+      this.map_.getCoordinateFromPixel, this.map_);
+  // close the polygon
+  coordinates[4] = coordinates[0].slice();
+  return new ol.geom.Polygon([coordinates]);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.Box.prototype.disposeInternal = function() {
+  this.setMap(null);
+};
+
+
+/**
+ * @param {ol.render.Event} event Event.
+ * @private
+ */
+ol.render.Box.prototype.handleMapPostCompose_ = function(event) {
+  var geometry = this.geometry_;
+  goog.asserts.assert(goog.isDefAndNotNull(geometry));
+  var style = this.style_;
+  goog.asserts.assert(!goog.isNull(style));
+  // use drawAsync(Infinity) to draw above everything
+  event.vectorContext.drawAsync(Infinity, function(render) {
+    render.setFillStrokeStyle(style.getFill(), style.getStroke());
+    render.setTextStyle(style.getText());
+    render.drawPolygonGeometry(geometry, null);
+  });
+};
+
+
+/**
+ * @return {ol.geom.Polygon} Geometry.
+ */
+ol.render.Box.prototype.getGeometry = function() {
+  return this.geometry_;
+};
+
+
+/**
+ * @private
+ */
+ol.render.Box.prototype.requestMapRenderFrame_ = function() {
+  if (!goog.isNull(this.map_) &&
+      !goog.isNull(this.startPixel_) &&
+      !goog.isNull(this.endPixel_)) {
+    this.map_.render();
+  }
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ */
+ol.render.Box.prototype.setMap = function(map) {
+  if (!goog.isNull(this.postComposeListenerKey_)) {
+    goog.events.unlistenByKey(this.postComposeListenerKey_);
+    this.postComposeListenerKey_ = null;
+    this.map_.render();
+    this.map_ = null;
+  }
+  this.map_ = map;
+  if (!goog.isNull(this.map_)) {
+    this.postComposeListenerKey_ = goog.events.listen(
+        map, ol.render.EventType.POSTCOMPOSE, this.handleMapPostCompose_, false,
+        this);
+    this.requestMapRenderFrame_();
+  }
+};
+
+
+/**
+ * @param {ol.Pixel} startPixel Start pixel.
+ * @param {ol.Pixel} endPixel End pixel.
+ */
+ol.render.Box.prototype.setPixels = function(startPixel, endPixel) {
+  this.startPixel_ = startPixel;
+  this.endPixel_ = endPixel;
+  this.geometry_ = this.createGeometry_();
+  this.requestMapRenderFrame_();
+};
diff --git a/src/ol/render/canvas/canvas.js b/src/ol/render/canvas/canvas.js
new file mode 100644
index 0000000..21e546d
--- /dev/null
+++ b/src/ol/render/canvas/canvas.js
@@ -0,0 +1,96 @@
+goog.provide('ol.render.canvas');
+
+
+/**
+ * @typedef {{fillStyle: string}}
+ */
+ol.render.canvas.FillState;
+
+
+/**
+ * @typedef {{lineCap: string,
+ *            lineDash: Array.<number>,
+ *            lineJoin: string,
+ *            lineWidth: number,
+ *            miterLimit: number,
+ *            strokeStyle: string}}
+ */
+ol.render.canvas.StrokeState;
+
+
+/**
+ * @typedef {{font: string,
+ *            textAlign: string,
+ *            textBaseline: string}}
+ */
+ol.render.canvas.TextState;
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.canvas.defaultFont = '10px sans-serif';
+
+
+/**
+ * @const
+ * @type {ol.Color}
+ */
+ol.render.canvas.defaultFillStyle = [0, 0, 0, 1];
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.canvas.defaultLineCap = 'round';
+
+
+/**
+ * @const
+ * @type {Array.<number>}
+ */
+ol.render.canvas.defaultLineDash = [];
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.canvas.defaultLineJoin = 'round';
+
+
+/**
+ * @const
+ * @type {number}
+ */
+ol.render.canvas.defaultMiterLimit = 10;
+
+
+/**
+ * @const
+ * @type {ol.Color}
+ */
+ol.render.canvas.defaultStrokeStyle = [0, 0, 0, 1];
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.canvas.defaultTextAlign = 'center';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.canvas.defaultTextBaseline = 'middle';
+
+
+/**
+ * @const
+ * @type {number}
+ */
+ol.render.canvas.defaultLineWidth = 1;
diff --git a/src/ol/render/canvas/canvas.jsdoc b/src/ol/render/canvas/canvas.jsdoc
new file mode 100644
index 0000000..cea6b9f
--- /dev/null
+++ b/src/ol/render/canvas/canvas.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.render.canvas
+ */
diff --git a/src/ol/render/canvas/canvasimmediate.js b/src/ol/render/canvas/canvasimmediate.js
new file mode 100644
index 0000000..efaaac5
--- /dev/null
+++ b/src/ol/render/canvas/canvasimmediate.js
@@ -0,0 +1,1016 @@
+// FIXME test, especially polygons with holes and multipolygons
+// FIXME need to handle large thick features (where pixel size matters)
+// FIXME add offset and end to ol.geom.flat.transform.transform2D?
+
+goog.provide('ol.render.canvas.Immediate');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('goog.vec.Mat4');
+goog.require('ol.color');
+goog.require('ol.extent');
+goog.require('ol.geom.flat.transform');
+goog.require('ol.has');
+goog.require('ol.render.IVectorContext');
+goog.require('ol.render.canvas');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @classdesc
+ * A concrete subclass of {@link ol.render.IVectorContext} that implements
+ * direct rendering of features and geometries to an HTML5 Canvas context.
+ * Instances of this class are created internally by the library and
+ * provided to application code as vectorContext member of the
+ * {@link ol.render.Event} object associated with postcompose, precompose and
+ * render events emitted by layers and maps.
+ *
+ * @constructor
+ * @implements {ol.render.IVectorContext}
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.Extent} extent Extent.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {number} viewRotation View rotation.
+ * @struct
+ */
+ol.render.canvas.Immediate =
+    function(context, pixelRatio, extent, transform, viewRotation) {
+
+  /**
+   * @private
+   * @type {Object.<string,
+   *        Array.<function(ol.render.canvas.Immediate)>>}
+   */
+  this.callbacksByZIndex_ = {};
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.context_ = context;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.pixelRatio_ = pixelRatio;
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.extent_ = extent;
+
+  /**
+   * @private
+   * @type {goog.vec.Mat4.Number}
+   */
+  this.transform_ = transform;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.viewRotation_ = viewRotation;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.FillState}
+   */
+  this.contextFillState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.StrokeState}
+   */
+  this.contextStrokeState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.TextState}
+   */
+  this.contextTextState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.FillState}
+   */
+  this.fillState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.StrokeState}
+   */
+  this.strokeState_ = null;
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement|HTMLVideoElement|Image}
+   */
+  this.image_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageAnchorX_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageAnchorY_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageHeight_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageOpacity_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageOriginX_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageOriginY_ = 0;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.imageRotateWithView_ = false;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageRotation_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageScale_ = 0;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.imageSnapToPixel_ = false;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.imageWidth_ = 0;
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.text_ = '';
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textOffsetX_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textOffsetY_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textRotation_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textScale_ = 0;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.FillState}
+   */
+  this.textFillState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.StrokeState}
+   */
+  this.textStrokeState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.TextState}
+   */
+  this.textState_ = null;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.pixelCoordinates_ = [];
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.tmpLocalTransform_ = goog.vec.Mat4.createNumber();
+
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @private
+ */
+ol.render.canvas.Immediate.prototype.drawImages_ =
+    function(flatCoordinates, offset, end, stride) {
+  if (goog.isNull(this.image_)) {
+    return;
+  }
+  goog.asserts.assert(offset === 0);
+  goog.asserts.assert(end == flatCoordinates.length);
+  var pixelCoordinates = ol.geom.flat.transform.transform2D(
+      flatCoordinates, offset, end, 2, this.transform_,
+      this.pixelCoordinates_);
+  var context = this.context_;
+  var localTransform = this.tmpLocalTransform_;
+  var alpha = context.globalAlpha;
+  if (this.imageOpacity_ != 1) {
+    context.globalAlpha = alpha * this.imageOpacity_;
+  }
+  var rotation = this.imageRotation_;
+  if (this.imageRotateWithView_) {
+    rotation += this.viewRotation_;
+  }
+  var i, ii;
+  for (i = 0, ii = pixelCoordinates.length; i < ii; i += 2) {
+    var x = pixelCoordinates[i] - this.imageAnchorX_;
+    var y = pixelCoordinates[i + 1] - this.imageAnchorY_;
+    if (this.imageSnapToPixel_) {
+      x = (x + 0.5) | 0;
+      y = (y + 0.5) | 0;
+    }
+    if (rotation !== 0 || this.imageScale_ != 1) {
+      var centerX = x + this.imageAnchorX_;
+      var centerY = y + this.imageAnchorY_;
+      ol.vec.Mat4.makeTransform2D(localTransform,
+          centerX, centerY, this.imageScale_, this.imageScale_,
+          rotation, -centerX, -centerY);
+      context.setTransform(
+          goog.vec.Mat4.getElement(localTransform, 0, 0),
+          goog.vec.Mat4.getElement(localTransform, 1, 0),
+          goog.vec.Mat4.getElement(localTransform, 0, 1),
+          goog.vec.Mat4.getElement(localTransform, 1, 1),
+          goog.vec.Mat4.getElement(localTransform, 0, 3),
+          goog.vec.Mat4.getElement(localTransform, 1, 3));
+    }
+    context.drawImage(this.image_, this.imageOriginX_, this.imageOriginY_,
+        this.imageWidth_, this.imageHeight_, x, y,
+        this.imageWidth_, this.imageHeight_);
+  }
+  if (rotation !== 0 || this.imageScale_ != 1) {
+    context.setTransform(1, 0, 0, 1, 0, 0);
+  }
+  if (this.imageOpacity_ != 1) {
+    context.globalAlpha = alpha;
+  }
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @private
+ */
+ol.render.canvas.Immediate.prototype.drawText_ =
+    function(flatCoordinates, offset, end, stride) {
+  if (goog.isNull(this.textState_) || this.text_ === '') {
+    return;
+  }
+  if (!goog.isNull(this.textFillState_)) {
+    this.setContextFillState_(this.textFillState_);
+  }
+  if (!goog.isNull(this.textStrokeState_)) {
+    this.setContextStrokeState_(this.textStrokeState_);
+  }
+  this.setContextTextState_(this.textState_);
+  goog.asserts.assert(offset === 0);
+  goog.asserts.assert(end == flatCoordinates.length);
+  var pixelCoordinates = ol.geom.flat.transform.transform2D(
+      flatCoordinates, offset, end, stride, this.transform_,
+      this.pixelCoordinates_);
+  var context = this.context_;
+  for (; offset < end; offset += stride) {
+    var x = pixelCoordinates[offset] + this.textOffsetX_;
+    var y = pixelCoordinates[offset + 1] + this.textOffsetY_;
+    if (this.textRotation_ !== 0 || this.textScale_ != 1) {
+      var localTransform = ol.vec.Mat4.makeTransform2D(this.tmpLocalTransform_,
+          x, y, this.textScale_, this.textScale_, this.textRotation_, -x, -y);
+      context.setTransform(
+          goog.vec.Mat4.getElement(localTransform, 0, 0),
+          goog.vec.Mat4.getElement(localTransform, 1, 0),
+          goog.vec.Mat4.getElement(localTransform, 0, 1),
+          goog.vec.Mat4.getElement(localTransform, 1, 1),
+          goog.vec.Mat4.getElement(localTransform, 0, 3),
+          goog.vec.Mat4.getElement(localTransform, 1, 3));
+    }
+    if (!goog.isNull(this.textStrokeState_)) {
+      context.strokeText(this.text_, x, y);
+    }
+    if (!goog.isNull(this.textFillState_)) {
+      context.fillText(this.text_, x, y);
+    }
+  }
+  if (this.textRotation_ !== 0 || this.textScale_ != 1) {
+    context.setTransform(1, 0, 0, 1, 0, 0);
+  }
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {boolean} close Close.
+ * @private
+ * @return {number} end End.
+ */
+ol.render.canvas.Immediate.prototype.moveToLineTo_ =
+    function(flatCoordinates, offset, end, stride, close) {
+  var context = this.context_;
+  var pixelCoordinates = ol.geom.flat.transform.transform2D(
+      flatCoordinates, offset, end, stride, this.transform_,
+      this.pixelCoordinates_);
+  context.moveTo(pixelCoordinates[0], pixelCoordinates[1]);
+  var i;
+  for (i = 2; i < pixelCoordinates.length; i += 2) {
+    context.lineTo(pixelCoordinates[i], pixelCoordinates[i + 1]);
+  }
+  if (close) {
+    context.lineTo(pixelCoordinates[0], pixelCoordinates[1]);
+  }
+  return end;
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @private
+ * @return {number} End.
+ */
+ol.render.canvas.Immediate.prototype.drawRings_ =
+    function(flatCoordinates, offset, ends, stride) {
+  var context = this.context_;
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    offset = this.moveToLineTo_(
+        flatCoordinates, offset, ends[i], stride, true);
+    context.closePath(); // FIXME is this needed here?
+  }
+  return offset;
+};
+
+
+/**
+ * Register a function to be called for rendering at a given zIndex.  The
+ * function will be called asynchronously.  The callback will receive a
+ * reference to {@link ol.render.canvas.Immediate} context for drawing.
+ *
+ * @param {number} zIndex Z index.
+ * @param {function(ol.render.canvas.Immediate)} callback Callback.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawAsync = function(zIndex, callback) {
+  var zIndexKey = zIndex.toString();
+  var callbacks = this.callbacksByZIndex_[zIndexKey];
+  if (goog.isDef(callbacks)) {
+    callbacks.push(callback);
+  } else {
+    this.callbacksByZIndex_[zIndexKey] = [callback];
+  }
+};
+
+
+/**
+ * Render a circle geometry into the canvas.  Rendering is immediate and uses
+ * the current fill and stroke styles.
+ *
+ * @param {ol.geom.Circle} circleGeometry Circle geometry.
+ * @param {ol.Feature} feature Feature,
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawCircleGeometry =
+    function(circleGeometry, feature) {
+  if (!ol.extent.intersects(this.extent_, circleGeometry.getExtent())) {
+    return;
+  }
+  if (!goog.isNull(this.fillState_) || !goog.isNull(this.strokeState_)) {
+    if (!goog.isNull(this.fillState_)) {
+      this.setContextFillState_(this.fillState_);
+    }
+    if (!goog.isNull(this.strokeState_)) {
+      this.setContextStrokeState_(this.strokeState_);
+    }
+    var pixelCoordinates = ol.geom.transformSimpleGeometry2D(
+        circleGeometry, this.transform_, this.pixelCoordinates_);
+    var dx = pixelCoordinates[2] - pixelCoordinates[0];
+    var dy = pixelCoordinates[3] - pixelCoordinates[1];
+    var radius = Math.sqrt(dx * dx + dy * dy);
+    var context = this.context_;
+    context.beginPath();
+    context.arc(
+        pixelCoordinates[0], pixelCoordinates[1], radius, 0, 2 * Math.PI);
+    if (!goog.isNull(this.fillState_)) {
+      context.fill();
+    }
+    if (!goog.isNull(this.strokeState_)) {
+      context.stroke();
+    }
+  }
+  if (this.text_ !== '') {
+    this.drawText_(circleGeometry.getCenter(), 0, 2, 2);
+  }
+};
+
+
+/**
+ * Render a feature into the canvas.  In order to respect the zIndex of the
+ * style this method draws asynchronously and thus *after* calls to
+ * drawXxxxGeometry have been finished, effectively drawing the feature
+ * *on top* of everything else.  You probably should be using
+ * {@link ol.FeatureOverlay} instead of calling this method directly.
+ *
+ * @param {ol.Feature} feature Feature.
+ * @param {ol.style.Style} style Style.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawFeature = function(feature, style) {
+  var geometry = style.getGeometryFunction()(feature);
+  if (!goog.isDefAndNotNull(geometry) ||
+      !ol.extent.intersects(this.extent_, geometry.getExtent())) {
+    return;
+  }
+  var zIndex = style.getZIndex();
+  if (!goog.isDef(zIndex)) {
+    zIndex = 0;
+  }
+  this.drawAsync(zIndex, function(render) {
+    render.setFillStrokeStyle(style.getFill(), style.getStroke());
+    render.setImageStyle(style.getImage());
+    render.setTextStyle(style.getText());
+    var renderGeometry =
+        ol.render.canvas.Immediate.GEOMETRY_RENDERERS_[geometry.getType()];
+    goog.asserts.assert(goog.isDef(renderGeometry));
+    renderGeometry.call(render, geometry, null);
+  });
+};
+
+
+/**
+ * Render a GeometryCollection to the canvas.  Rendering is immediate and
+ * uses the current styles appropriate for each geometry in the collection.
+ *
+ * @param {ol.geom.GeometryCollection} geometryCollectionGeometry Geometry
+ *     collection.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.canvas.Immediate.prototype.drawGeometryCollectionGeometry =
+    function(geometryCollectionGeometry, feature) {
+  var geometries = geometryCollectionGeometry.getGeometriesArray();
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    var geometry = geometries[i];
+    var geometryRenderer =
+        ol.render.canvas.Immediate.GEOMETRY_RENDERERS_[geometry.getType()];
+    goog.asserts.assert(goog.isDef(geometryRenderer));
+    geometryRenderer.call(this, geometry, feature);
+  }
+};
+
+
+/**
+ * Render a Point geometry into the canvas.  Rendering is immediate and uses
+ * the current style.
+ *
+ * @param {ol.geom.Point} pointGeometry Point geometry.
+ * @param {ol.Feature} feature Feature.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawPointGeometry =
+    function(pointGeometry, feature) {
+  var flatCoordinates = pointGeometry.getFlatCoordinates();
+  var stride = pointGeometry.getStride();
+  if (!goog.isNull(this.image_)) {
+    this.drawImages_(flatCoordinates, 0, flatCoordinates.length, stride);
+  }
+  if (this.text_ !== '') {
+    this.drawText_(flatCoordinates, 0, flatCoordinates.length, stride);
+  }
+};
+
+
+/**
+ * Render a MultiPoint geometry  into the canvas.  Rendering is immediate and
+ * uses the current style.
+ *
+ * @param {ol.geom.MultiPoint} multiPointGeometry MultiPoint geometry.
+ * @param {ol.Feature} feature Feature.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawMultiPointGeometry =
+    function(multiPointGeometry, feature) {
+  var flatCoordinates = multiPointGeometry.getFlatCoordinates();
+  var stride = multiPointGeometry.getStride();
+  if (!goog.isNull(this.image_)) {
+    this.drawImages_(flatCoordinates, 0, flatCoordinates.length, stride);
+  }
+  if (this.text_ !== '') {
+    this.drawText_(flatCoordinates, 0, flatCoordinates.length, stride);
+  }
+};
+
+
+/**
+ * Render a LineString into the canvas.  Rendering is immediate and uses
+ * the current style.
+ *
+ * @param {ol.geom.LineString} lineStringGeometry Line string geometry.
+ * @param {ol.Feature} feature Feature.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawLineStringGeometry =
+    function(lineStringGeometry, feature) {
+  if (!ol.extent.intersects(this.extent_, lineStringGeometry.getExtent())) {
+    return;
+  }
+  if (!goog.isNull(this.strokeState_)) {
+    this.setContextStrokeState_(this.strokeState_);
+    var context = this.context_;
+    var flatCoordinates = lineStringGeometry.getFlatCoordinates();
+    context.beginPath();
+    this.moveToLineTo_(flatCoordinates, 0, flatCoordinates.length,
+        lineStringGeometry.getStride(), false);
+    context.stroke();
+  }
+  if (this.text_ !== '') {
+    var flatMidpoint = lineStringGeometry.getFlatMidpoint();
+    this.drawText_(flatMidpoint, 0, 2, 2);
+  }
+};
+
+
+/**
+ * Render a MultiLineString geometry into the canvas.  Rendering is immediate
+ * and uses the current style.
+ *
+ * @param {ol.geom.MultiLineString} multiLineStringGeometry
+ *     MultiLineString geometry.
+ * @param {ol.Feature} feature Feature.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry =
+    function(multiLineStringGeometry, feature) {
+  var geometryExtent = multiLineStringGeometry.getExtent();
+  if (!ol.extent.intersects(this.extent_, geometryExtent)) {
+    return;
+  }
+  if (!goog.isNull(this.strokeState_)) {
+    this.setContextStrokeState_(this.strokeState_);
+    var context = this.context_;
+    var flatCoordinates = multiLineStringGeometry.getFlatCoordinates();
+    var offset = 0;
+    var ends = multiLineStringGeometry.getEnds();
+    var stride = multiLineStringGeometry.getStride();
+    context.beginPath();
+    var i, ii;
+    for (i = 0, ii = ends.length; i < ii; ++i) {
+      offset = this.moveToLineTo_(
+          flatCoordinates, offset, ends[i], stride, false);
+    }
+    context.stroke();
+  }
+  if (this.text_ !== '') {
+    var flatMidpoints = multiLineStringGeometry.getFlatMidpoints();
+    this.drawText_(flatMidpoints, 0, flatMidpoints.length, 2);
+  }
+};
+
+
+/**
+ * Render a Polygon geometry into the canvas.  Rendering is immediate and uses
+ * the current style.
+ *
+ * @param {ol.geom.Polygon} polygonGeometry Polygon geometry.
+ * @param {ol.Feature} feature Feature.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawPolygonGeometry =
+    function(polygonGeometry, feature) {
+  if (!ol.extent.intersects(this.extent_, polygonGeometry.getExtent())) {
+    return;
+  }
+  if (!goog.isNull(this.strokeState_) || !goog.isNull(this.fillState_)) {
+    if (!goog.isNull(this.fillState_)) {
+      this.setContextFillState_(this.fillState_);
+    }
+    if (!goog.isNull(this.strokeState_)) {
+      this.setContextStrokeState_(this.strokeState_);
+    }
+    var context = this.context_;
+    context.beginPath();
+    this.drawRings_(polygonGeometry.getOrientedFlatCoordinates(),
+        0, polygonGeometry.getEnds(), polygonGeometry.getStride());
+    if (!goog.isNull(this.fillState_)) {
+      context.fill();
+    }
+    if (!goog.isNull(this.strokeState_)) {
+      context.stroke();
+    }
+  }
+  if (this.text_ !== '') {
+    var flatInteriorPoint = polygonGeometry.getFlatInteriorPoint();
+    this.drawText_(flatInteriorPoint, 0, 2, 2);
+  }
+};
+
+
+/**
+ * Render MultiPolygon geometry into the canvas.  Rendering is immediate and
+ * uses the current style.
+ * @param {ol.geom.MultiPolygon} multiPolygonGeometry MultiPolygon geometry.
+ * @param {ol.Feature} feature Feature.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry =
+    function(multiPolygonGeometry, feature) {
+  if (!ol.extent.intersects(this.extent_, multiPolygonGeometry.getExtent())) {
+    return;
+  }
+  if (!goog.isNull(this.strokeState_) || !goog.isNull(this.fillState_)) {
+    if (!goog.isNull(this.fillState_)) {
+      this.setContextFillState_(this.fillState_);
+    }
+    if (!goog.isNull(this.strokeState_)) {
+      this.setContextStrokeState_(this.strokeState_);
+    }
+    var context = this.context_;
+    var flatCoordinates = multiPolygonGeometry.getOrientedFlatCoordinates();
+    var offset = 0;
+    var endss = multiPolygonGeometry.getEndss();
+    var stride = multiPolygonGeometry.getStride();
+    var i, ii;
+    for (i = 0, ii = endss.length; i < ii; ++i) {
+      var ends = endss[i];
+      context.beginPath();
+      offset = this.drawRings_(flatCoordinates, offset, ends, stride);
+      if (!goog.isNull(this.fillState_)) {
+        context.fill();
+      }
+      if (!goog.isNull(this.strokeState_)) {
+        context.stroke();
+      }
+    }
+  }
+  if (this.text_ !== '') {
+    var flatInteriorPoints = multiPolygonGeometry.getFlatInteriorPoints();
+    this.drawText_(flatInteriorPoints, 0, flatInteriorPoints.length, 2);
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Immediate.prototype.drawText = goog.abstractMethod;
+
+
+/**
+ * FIXME: empty description for jsdoc
+ */
+ol.render.canvas.Immediate.prototype.flush = function() {
+  /** @type {Array.<number>} */
+  var zs = goog.array.map(goog.object.getKeys(this.callbacksByZIndex_), Number);
+  goog.array.sort(zs);
+  var i, ii, callbacks, j, jj;
+  for (i = 0, ii = zs.length; i < ii; ++i) {
+    callbacks = this.callbacksByZIndex_[zs[i].toString()];
+    for (j = 0, jj = callbacks.length; j < jj; ++j) {
+      callbacks[j](this);
+    }
+  }
+};
+
+
+/**
+ * @param {ol.render.canvas.FillState} fillState Fill state.
+ * @private
+ */
+ol.render.canvas.Immediate.prototype.setContextFillState_ =
+    function(fillState) {
+  var context = this.context_;
+  var contextFillState = this.contextFillState_;
+  if (goog.isNull(contextFillState)) {
+    context.fillStyle = fillState.fillStyle;
+    this.contextFillState_ = {
+      fillStyle: fillState.fillStyle
+    };
+  } else {
+    if (contextFillState.fillStyle != fillState.fillStyle) {
+      contextFillState.fillStyle = context.fillStyle = fillState.fillStyle;
+    }
+  }
+};
+
+
+/**
+ * @param {ol.render.canvas.StrokeState} strokeState Stroke state.
+ * @private
+ */
+ol.render.canvas.Immediate.prototype.setContextStrokeState_ =
+    function(strokeState) {
+  var context = this.context_;
+  var contextStrokeState = this.contextStrokeState_;
+  if (goog.isNull(contextStrokeState)) {
+    context.lineCap = strokeState.lineCap;
+    if (ol.has.CANVAS_LINE_DASH) {
+      context.setLineDash(strokeState.lineDash);
+    }
+    context.lineJoin = strokeState.lineJoin;
+    context.lineWidth = strokeState.lineWidth;
+    context.miterLimit = strokeState.miterLimit;
+    context.strokeStyle = strokeState.strokeStyle;
+    this.contextStrokeState_ = {
+      lineCap: strokeState.lineCap,
+      lineDash: strokeState.lineDash,
+      lineJoin: strokeState.lineJoin,
+      lineWidth: strokeState.lineWidth,
+      miterLimit: strokeState.miterLimit,
+      strokeStyle: strokeState.strokeStyle
+    };
+  } else {
+    if (contextStrokeState.lineCap != strokeState.lineCap) {
+      contextStrokeState.lineCap = context.lineCap = strokeState.lineCap;
+    }
+    if (ol.has.CANVAS_LINE_DASH) {
+      if (!goog.array.equals(
+          contextStrokeState.lineDash, strokeState.lineDash)) {
+        context.setLineDash(contextStrokeState.lineDash = strokeState.lineDash);
+      }
+    }
+    if (contextStrokeState.lineJoin != strokeState.lineJoin) {
+      contextStrokeState.lineJoin = context.lineJoin = strokeState.lineJoin;
+    }
+    if (contextStrokeState.lineWidth != strokeState.lineWidth) {
+      contextStrokeState.lineWidth = context.lineWidth = strokeState.lineWidth;
+    }
+    if (contextStrokeState.miterLimit != strokeState.miterLimit) {
+      contextStrokeState.miterLimit = context.miterLimit =
+          strokeState.miterLimit;
+    }
+    if (contextStrokeState.strokeStyle != strokeState.strokeStyle) {
+      contextStrokeState.strokeStyle = context.strokeStyle =
+          strokeState.strokeStyle;
+    }
+  }
+};
+
+
+/**
+ * @param {ol.render.canvas.TextState} textState Text state.
+ * @private
+ */
+ol.render.canvas.Immediate.prototype.setContextTextState_ =
+    function(textState) {
+  var context = this.context_;
+  var contextTextState = this.contextTextState_;
+  if (goog.isNull(contextTextState)) {
+    context.font = textState.font;
+    context.textAlign = textState.textAlign;
+    context.textBaseline = textState.textBaseline;
+    this.contextTextState_ = {
+      font: textState.font,
+      textAlign: textState.textAlign,
+      textBaseline: textState.textBaseline
+    };
+  } else {
+    if (contextTextState.font != textState.font) {
+      contextTextState.font = context.font = textState.font;
+    }
+    if (contextTextState.textAlign != textState.textAlign) {
+      contextTextState.textAlign = context.textAlign = textState.textAlign;
+    }
+    if (contextTextState.textBaseline != textState.textBaseline) {
+      contextTextState.textBaseline = context.textBaseline =
+          textState.textBaseline;
+    }
+  }
+};
+
+
+/**
+ * Set the fill and stroke style for subsequent draw operations.  To clear
+ * either fill or stroke styles, pass null for the appropriate parameter.
+ *
+ * @param {ol.style.Fill} fillStyle Fill style.
+ * @param {ol.style.Stroke} strokeStyle Stroke style.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.setFillStrokeStyle =
+    function(fillStyle, strokeStyle) {
+  if (goog.isNull(fillStyle)) {
+    this.fillState_ = null;
+  } else {
+    var fillStyleColor = fillStyle.getColor();
+    this.fillState_ = {
+      fillStyle: ol.color.asString(!goog.isNull(fillStyleColor) ?
+          fillStyleColor : ol.render.canvas.defaultFillStyle)
+    };
+  }
+  if (goog.isNull(strokeStyle)) {
+    this.strokeState_ = null;
+  } else {
+    var strokeStyleColor = strokeStyle.getColor();
+    var strokeStyleLineCap = strokeStyle.getLineCap();
+    var strokeStyleLineDash = strokeStyle.getLineDash();
+    var strokeStyleLineJoin = strokeStyle.getLineJoin();
+    var strokeStyleWidth = strokeStyle.getWidth();
+    var strokeStyleMiterLimit = strokeStyle.getMiterLimit();
+    this.strokeState_ = {
+      lineCap: goog.isDef(strokeStyleLineCap) ?
+          strokeStyleLineCap : ol.render.canvas.defaultLineCap,
+      lineDash: goog.isDefAndNotNull(strokeStyleLineDash) ?
+          strokeStyleLineDash : ol.render.canvas.defaultLineDash,
+      lineJoin: goog.isDef(strokeStyleLineJoin) ?
+          strokeStyleLineJoin : ol.render.canvas.defaultLineJoin,
+      lineWidth: this.pixelRatio_ * (goog.isDef(strokeStyleWidth) ?
+          strokeStyleWidth : ol.render.canvas.defaultLineWidth),
+      miterLimit: goog.isDef(strokeStyleMiterLimit) ?
+          strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit,
+      strokeStyle: ol.color.asString(!goog.isNull(strokeStyleColor) ?
+          strokeStyleColor : ol.render.canvas.defaultStrokeStyle)
+    };
+  }
+};
+
+
+/**
+ * Set the image style for subsequent draw operations.  Pass null to remove
+ * the image style.
+ *
+ * @param {ol.style.Image} imageStyle Image style.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.setImageStyle = function(imageStyle) {
+  if (goog.isNull(imageStyle)) {
+    this.image_ = null;
+  } else {
+    var imageAnchor = imageStyle.getAnchor();
+    // FIXME pixel ratio
+    var imageImage = imageStyle.getImage(1);
+    var imageOrigin = imageStyle.getOrigin();
+    var imageSize = imageStyle.getSize();
+    goog.asserts.assert(!goog.isNull(imageAnchor));
+    goog.asserts.assert(!goog.isNull(imageImage));
+    goog.asserts.assert(!goog.isNull(imageOrigin));
+    goog.asserts.assert(!goog.isNull(imageSize));
+    this.imageAnchorX_ = imageAnchor[0];
+    this.imageAnchorY_ = imageAnchor[1];
+    this.imageHeight_ = imageSize[1];
+    this.image_ = imageImage;
+    this.imageOpacity_ = imageStyle.getOpacity();
+    this.imageOriginX_ = imageOrigin[0];
+    this.imageOriginY_ = imageOrigin[1];
+    this.imageRotateWithView_ = imageStyle.getRotateWithView();
+    this.imageRotation_ = imageStyle.getRotation();
+    this.imageScale_ = imageStyle.getScale();
+    this.imageSnapToPixel_ = imageStyle.getSnapToPixel();
+    this.imageWidth_ = imageSize[0];
+  }
+};
+
+
+/**
+ * Set the text style for subsequent draw operations.  Pass null to
+ * remove the text style.
+ *
+ * @param {ol.style.Text} textStyle Text style.
+ * @api
+ */
+ol.render.canvas.Immediate.prototype.setTextStyle = function(textStyle) {
+  if (goog.isNull(textStyle)) {
+    this.text_ = '';
+  } else {
+    var textFillStyle = textStyle.getFill();
+    if (goog.isNull(textFillStyle)) {
+      this.textFillState_ = null;
+    } else {
+      var textFillStyleColor = textFillStyle.getColor();
+      this.textFillState_ = {
+        fillStyle: ol.color.asString(!goog.isNull(textFillStyleColor) ?
+            textFillStyleColor : ol.render.canvas.defaultFillStyle)
+      };
+    }
+    var textStrokeStyle = textStyle.getStroke();
+    if (goog.isNull(textStrokeStyle)) {
+      this.textStrokeState_ = null;
+    } else {
+      var textStrokeStyleColor = textStrokeStyle.getColor();
+      var textStrokeStyleLineCap = textStrokeStyle.getLineCap();
+      var textStrokeStyleLineDash = textStrokeStyle.getLineDash();
+      var textStrokeStyleLineJoin = textStrokeStyle.getLineJoin();
+      var textStrokeStyleWidth = textStrokeStyle.getWidth();
+      var textStrokeStyleMiterLimit = textStrokeStyle.getMiterLimit();
+      this.textStrokeState_ = {
+        lineCap: goog.isDef(textStrokeStyleLineCap) ?
+            textStrokeStyleLineCap : ol.render.canvas.defaultLineCap,
+        lineDash: goog.isDefAndNotNull(textStrokeStyleLineDash) ?
+            textStrokeStyleLineDash : ol.render.canvas.defaultLineDash,
+        lineJoin: goog.isDef(textStrokeStyleLineJoin) ?
+            textStrokeStyleLineJoin : ol.render.canvas.defaultLineJoin,
+        lineWidth: goog.isDef(textStrokeStyleWidth) ?
+            textStrokeStyleWidth : ol.render.canvas.defaultLineWidth,
+        miterLimit: goog.isDef(textStrokeStyleMiterLimit) ?
+            textStrokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit,
+        strokeStyle: ol.color.asString(!goog.isNull(textStrokeStyleColor) ?
+            textStrokeStyleColor : ol.render.canvas.defaultStrokeStyle)
+      };
+    }
+    var textFont = textStyle.getFont();
+    var textOffsetX = textStyle.getOffsetX();
+    var textOffsetY = textStyle.getOffsetY();
+    var textRotation = textStyle.getRotation();
+    var textScale = textStyle.getScale();
+    var textText = textStyle.getText();
+    var textTextAlign = textStyle.getTextAlign();
+    var textTextBaseline = textStyle.getTextBaseline();
+    this.textState_ = {
+      font: goog.isDef(textFont) ?
+          textFont : ol.render.canvas.defaultFont,
+      textAlign: goog.isDef(textTextAlign) ?
+          textTextAlign : ol.render.canvas.defaultTextAlign,
+      textBaseline: goog.isDef(textTextBaseline) ?
+          textTextBaseline : ol.render.canvas.defaultTextBaseline
+    };
+    this.text_ = goog.isDef(textText) ? textText : '';
+    this.textOffsetX_ =
+        goog.isDef(textOffsetX) ? (this.pixelRatio_ * textOffsetX) : 0;
+    this.textOffsetY_ =
+        goog.isDef(textOffsetY) ? (this.pixelRatio_ * textOffsetY) : 0;
+    this.textRotation_ = goog.isDef(textRotation) ? textRotation : 0;
+    this.textScale_ = this.pixelRatio_ * (goog.isDef(textScale) ?
+        textScale : 1);
+  }
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Object.<ol.geom.GeometryType,
+ *                function(this: ol.render.canvas.Immediate, ol.geom.Geometry,
+ *                         Object)>}
+ */
+ol.render.canvas.Immediate.GEOMETRY_RENDERERS_ = {
+  'Point': ol.render.canvas.Immediate.prototype.drawPointGeometry,
+  'LineString': ol.render.canvas.Immediate.prototype.drawLineStringGeometry,
+  'Polygon': ol.render.canvas.Immediate.prototype.drawPolygonGeometry,
+  'MultiPoint': ol.render.canvas.Immediate.prototype.drawMultiPointGeometry,
+  'MultiLineString':
+      ol.render.canvas.Immediate.prototype.drawMultiLineStringGeometry,
+  'MultiPolygon': ol.render.canvas.Immediate.prototype.drawMultiPolygonGeometry,
+  'GeometryCollection':
+      ol.render.canvas.Immediate.prototype.drawGeometryCollectionGeometry,
+  'Circle': ol.render.canvas.Immediate.prototype.drawCircleGeometry
+};
diff --git a/src/ol/render/canvas/canvasreplay.js b/src/ol/render/canvas/canvasreplay.js
new file mode 100644
index 0000000..92127da
--- /dev/null
+++ b/src/ol/render/canvas/canvasreplay.js
@@ -0,0 +1,2009 @@
+// FIXME add option to apply snapToPixel to all coordinates?
+// FIXME can eliminate empty set styles and strokes (when all geoms skipped)
+
+goog.provide('ol.render.canvas.Replay');
+goog.provide('ol.render.canvas.ReplayGroup');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('goog.vec.Mat4');
+goog.require('ol.array');
+goog.require('ol.color');
+goog.require('ol.dom');
+goog.require('ol.extent');
+goog.require('ol.extent.Relationship');
+goog.require('ol.geom.flat.simplify');
+goog.require('ol.geom.flat.transform');
+goog.require('ol.has');
+goog.require('ol.render.IReplayGroup');
+goog.require('ol.render.IVectorContext');
+goog.require('ol.render.canvas');
+goog.require('ol.vec.Mat4');
+
+
+/**
+ * @enum {number}
+ */
+ol.render.canvas.Instruction = {
+  BEGIN_GEOMETRY: 0,
+  BEGIN_PATH: 1,
+  CIRCLE: 2,
+  CLOSE_PATH: 3,
+  DRAW_IMAGE: 4,
+  DRAW_TEXT: 5,
+  END_GEOMETRY: 6,
+  FILL: 7,
+  MOVE_TO_LINE_TO: 8,
+  SET_FILL_STYLE: 9,
+  SET_STROKE_STYLE: 10,
+  SET_TEXT_STYLE: 11,
+  STROKE: 12
+};
+
+
+
+/**
+ * @constructor
+ * @implements {ol.render.IVectorContext}
+ * @param {number} tolerance Tolerance.
+ * @param {ol.Extent} maxExtent Maximum extent.
+ * @param {number} resolution Resolution.
+ * @protected
+ * @struct
+ */
+ol.render.canvas.Replay = function(tolerance, maxExtent, resolution) {
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.tolerance = tolerance;
+
+  /**
+   * @protected
+   * @type {ol.Extent}
+   */
+  this.maxExtent = maxExtent;
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.maxLineWidth = 0;
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.resolution = resolution;
+
+  /**
+   * @private
+   * @type {Array.<*>}
+   */
+  this.beginGeometryInstruction1_ = null;
+
+  /**
+   * @private
+   * @type {Array.<*>}
+   */
+  this.beginGeometryInstruction2_ = null;
+
+  /**
+   * @protected
+   * @type {Array.<*>}
+   */
+  this.instructions = [];
+
+  /**
+   * @protected
+   * @type {Array.<number>}
+   */
+  this.coordinates = [];
+
+  /**
+   * @private
+   * @type {goog.vec.Mat4.Number}
+   */
+  this.renderedTransform_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @protected
+   * @type {Array.<*>}
+   */
+  this.hitDetectionInstructions = [];
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.pixelCoordinates_ = [];
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.tmpLocalTransform_ = goog.vec.Mat4.createNumber();
+
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {boolean} close Close.
+ * @protected
+ * @return {number} My end.
+ */
+ol.render.canvas.Replay.prototype.appendFlatCoordinates =
+    function(flatCoordinates, offset, end, stride, close) {
+
+  var myEnd = this.coordinates.length;
+  var extent = this.getBufferedMaxExtent();
+  var lastCoord = [flatCoordinates[offset], flatCoordinates[offset + 1]];
+  var nextCoord = [NaN, NaN];
+  var skipped = true;
+
+  var i, lastRel, nextRel;
+  for (i = offset + stride; i < end; i += stride) {
+    nextCoord[0] = flatCoordinates[i];
+    nextCoord[1] = flatCoordinates[i + 1];
+    nextRel = ol.extent.coordinateRelationship(extent, nextCoord);
+    if (nextRel !== lastRel) {
+      if (skipped) {
+        this.coordinates[myEnd++] = lastCoord[0];
+        this.coordinates[myEnd++] = lastCoord[1];
+      }
+      this.coordinates[myEnd++] = nextCoord[0];
+      this.coordinates[myEnd++] = nextCoord[1];
+      skipped = false;
+    } else if (nextRel === ol.extent.Relationship.INTERSECTING) {
+      this.coordinates[myEnd++] = nextCoord[0];
+      this.coordinates[myEnd++] = nextCoord[1];
+      skipped = false;
+    } else {
+      skipped = true;
+    }
+    lastCoord[0] = nextCoord[0];
+    lastCoord[1] = nextCoord[1];
+    lastRel = nextRel;
+  }
+
+  // handle case where there is only one point to append
+  if (i === offset + stride) {
+    this.coordinates[myEnd++] = lastCoord[0];
+    this.coordinates[myEnd++] = lastCoord[1];
+  }
+
+  if (close) {
+    this.coordinates[myEnd++] = flatCoordinates[offset];
+    this.coordinates[myEnd++] = flatCoordinates[offset + 1];
+  }
+  return myEnd;
+};
+
+
+/**
+ * @protected
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.canvas.Replay.prototype.beginGeometry = function(geometry, feature) {
+  this.beginGeometryInstruction1_ =
+      [ol.render.canvas.Instruction.BEGIN_GEOMETRY, feature, 0];
+  this.instructions.push(this.beginGeometryInstruction1_);
+  this.beginGeometryInstruction2_ =
+      [ol.render.canvas.Instruction.BEGIN_GEOMETRY, feature, 0];
+  this.hitDetectionInstructions.push(this.beginGeometryInstruction2_);
+};
+
+
+/**
+ * @private
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {number} viewRotation View rotation.
+ * @param {Object} skippedFeaturesHash Ids of features to skip.
+ * @param {Array.<*>} instructions Instructions array.
+ * @param {function(ol.Feature): T|undefined} featureCallback Feature callback.
+ * @return {T|undefined} Callback result.
+ * @template T
+ */
+ol.render.canvas.Replay.prototype.replay_ = function(
+    context, pixelRatio, transform, viewRotation, skippedFeaturesHash,
+    instructions, featureCallback) {
+  /** @type {Array.<number>} */
+  var pixelCoordinates;
+  if (ol.vec.Mat4.equals2D(transform, this.renderedTransform_)) {
+    pixelCoordinates = this.pixelCoordinates_;
+  } else {
+    pixelCoordinates = ol.geom.flat.transform.transform2D(
+        this.coordinates, 0, this.coordinates.length, 2,
+        transform, this.pixelCoordinates_);
+    goog.vec.Mat4.setFromArray(this.renderedTransform_, transform);
+    goog.asserts.assert(pixelCoordinates === this.pixelCoordinates_);
+  }
+  var i = 0; // instruction index
+  var ii = instructions.length; // end of instructions
+  var d = 0; // data index
+  var dd; // end of per-instruction data
+  var localTransform = this.tmpLocalTransform_;
+  while (i < ii) {
+    var instruction = instructions[i];
+    var type = /** @type {ol.render.canvas.Instruction} */ (instruction[0]);
+    var feature, fill, stroke, text, x, y;
+    switch (type) {
+      case ol.render.canvas.Instruction.BEGIN_GEOMETRY:
+        feature = /** @type {ol.Feature} */ (instruction[1]);
+        var featureUid = goog.getUid(feature).toString();
+        if (!goog.isDef(goog.object.get(skippedFeaturesHash, featureUid))) {
+          ++i;
+        } else {
+          i = /** @type {number} */ (instruction[2]);
+        }
+        break;
+      case ol.render.canvas.Instruction.BEGIN_PATH:
+        context.beginPath();
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.CIRCLE:
+        goog.asserts.assert(goog.isNumber(instruction[1]));
+        d = /** @type {number} */ (instruction[1]);
+        var x1 = pixelCoordinates[d];
+        var y1 = pixelCoordinates[d + 1];
+        var x2 = pixelCoordinates[d + 2];
+        var y2 = pixelCoordinates[d + 3];
+        var dx = x2 - x1;
+        var dy = y2 - y1;
+        var r = Math.sqrt(dx * dx + dy * dy);
+        context.arc(x1, y1, r, 0, 2 * Math.PI, true);
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.CLOSE_PATH:
+        context.closePath();
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.DRAW_IMAGE:
+        goog.asserts.assert(goog.isNumber(instruction[1]));
+        d = /** @type {number} */ (instruction[1]);
+        goog.asserts.assert(goog.isNumber(instruction[2]));
+        dd = /** @type {number} */ (instruction[2]);
+        var image =  /** @type {HTMLCanvasElement|HTMLVideoElement|Image} */
+            (instruction[3]);
+        // Remaining arguments in DRAW_IMAGE are in alphabetical order
+        var anchorX = /** @type {number} */ (instruction[4]) * pixelRatio;
+        var anchorY = /** @type {number} */ (instruction[5]) * pixelRatio;
+        var height = /** @type {number} */ (instruction[6]);
+        var opacity = /** @type {number} */ (instruction[7]);
+        var originX = /** @type {number} */ (instruction[8]);
+        var originY = /** @type {number} */ (instruction[9]);
+        var rotateWithView = /** @type {boolean} */ (instruction[10]);
+        var rotation = /** @type {number} */ (instruction[11]);
+        var scale = /** @type {number} */ (instruction[12]);
+        var snapToPixel = /** @type {boolean} */ (instruction[13]);
+        var width = /** @type {number} */ (instruction[14]);
+        if (rotateWithView) {
+          rotation += viewRotation;
+        }
+        for (; d < dd; d += 2) {
+          x = pixelCoordinates[d] - anchorX;
+          y = pixelCoordinates[d + 1] - anchorY;
+          if (snapToPixel) {
+            x = (x + 0.5) | 0;
+            y = (y + 0.5) | 0;
+          }
+          if (scale != 1 || rotation !== 0) {
+            var centerX = x + anchorX;
+            var centerY = y + anchorY;
+            ol.vec.Mat4.makeTransform2D(
+                localTransform, centerX, centerY, scale, scale,
+                rotation, -centerX, -centerY);
+            context.setTransform(
+                goog.vec.Mat4.getElement(localTransform, 0, 0),
+                goog.vec.Mat4.getElement(localTransform, 1, 0),
+                goog.vec.Mat4.getElement(localTransform, 0, 1),
+                goog.vec.Mat4.getElement(localTransform, 1, 1),
+                goog.vec.Mat4.getElement(localTransform, 0, 3),
+                goog.vec.Mat4.getElement(localTransform, 1, 3));
+          }
+          var alpha = context.globalAlpha;
+          if (opacity != 1) {
+            context.globalAlpha = alpha * opacity;
+          }
+
+          context.drawImage(image, originX, originY, width, height,
+              x, y, width * pixelRatio, height * pixelRatio);
+
+          if (opacity != 1) {
+            context.globalAlpha = alpha;
+          }
+          if (scale != 1 || rotation !== 0) {
+            context.setTransform(1, 0, 0, 1, 0, 0);
+          }
+        }
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.DRAW_TEXT:
+        goog.asserts.assert(goog.isNumber(instruction[1]));
+        d = /** @type {number} */ (instruction[1]);
+        goog.asserts.assert(goog.isNumber(instruction[2]));
+        dd = /** @type {number} */ (instruction[2]);
+        goog.asserts.assert(goog.isString(instruction[3]));
+        text = /** @type {string} */ (instruction[3]);
+        goog.asserts.assert(goog.isNumber(instruction[4]));
+        var offsetX = /** @type {number} */ (instruction[4]) * pixelRatio;
+        goog.asserts.assert(goog.isNumber(instruction[5]));
+        var offsetY = /** @type {number} */ (instruction[5]) * pixelRatio;
+        goog.asserts.assert(goog.isNumber(instruction[6]));
+        rotation = /** @type {number} */ (instruction[6]);
+        goog.asserts.assert(goog.isNumber(instruction[7]));
+        scale = /** @type {number} */ (instruction[7]) * pixelRatio;
+        goog.asserts.assert(goog.isBoolean(instruction[8]));
+        fill = /** @type {boolean} */ (instruction[8]);
+        goog.asserts.assert(goog.isBoolean(instruction[9]));
+        stroke = /** @type {boolean} */ (instruction[9]);
+        for (; d < dd; d += 2) {
+          x = pixelCoordinates[d] + offsetX;
+          y = pixelCoordinates[d + 1] + offsetY;
+          if (scale != 1 || rotation !== 0) {
+            ol.vec.Mat4.makeTransform2D(
+                localTransform, x, y, scale, scale, rotation, -x, -y);
+            context.setTransform(
+                goog.vec.Mat4.getElement(localTransform, 0, 0),
+                goog.vec.Mat4.getElement(localTransform, 1, 0),
+                goog.vec.Mat4.getElement(localTransform, 0, 1),
+                goog.vec.Mat4.getElement(localTransform, 1, 1),
+                goog.vec.Mat4.getElement(localTransform, 0, 3),
+                goog.vec.Mat4.getElement(localTransform, 1, 3));
+          }
+          if (stroke) {
+            context.strokeText(text, x, y);
+          }
+          if (fill) {
+            context.fillText(text, x, y);
+          }
+          if (scale != 1 || rotation !== 0) {
+            context.setTransform(1, 0, 0, 1, 0, 0);
+          }
+        }
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.END_GEOMETRY:
+        if (goog.isDef(featureCallback)) {
+          feature = /** @type {ol.Feature} */ (instruction[1]);
+          var result = featureCallback(feature);
+          if (result) {
+            return result;
+          }
+        }
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.FILL:
+        context.fill();
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.MOVE_TO_LINE_TO:
+        goog.asserts.assert(goog.isNumber(instruction[1]));
+        d = /** @type {number} */ (instruction[1]);
+        goog.asserts.assert(goog.isNumber(instruction[2]));
+        dd = /** @type {number} */ (instruction[2]);
+        context.moveTo(pixelCoordinates[d], pixelCoordinates[d + 1]);
+        for (d += 2; d < dd; d += 2) {
+          context.lineTo(pixelCoordinates[d], pixelCoordinates[d + 1]);
+        }
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.SET_FILL_STYLE:
+        goog.asserts.assert(goog.isString(instruction[1]));
+        context.fillStyle = /** @type {string} */ (instruction[1]);
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.SET_STROKE_STYLE:
+        goog.asserts.assert(goog.isString(instruction[1]));
+        goog.asserts.assert(goog.isNumber(instruction[2]));
+        goog.asserts.assert(goog.isString(instruction[3]));
+        goog.asserts.assert(goog.isString(instruction[4]));
+        goog.asserts.assert(goog.isNumber(instruction[5]));
+        goog.asserts.assert(!goog.isNull(instruction[6]));
+        var usePixelRatio = goog.isDef(instruction[7]) ? instruction[7] : true;
+        var lineWidth = /** @type {number} */ (instruction[2]);
+        context.strokeStyle = /** @type {string} */ (instruction[1]);
+        context.lineWidth = usePixelRatio ? lineWidth * pixelRatio : lineWidth;
+        context.lineCap = /** @type {string} */ (instruction[3]);
+        context.lineJoin = /** @type {string} */ (instruction[4]);
+        context.miterLimit = /** @type {number} */ (instruction[5]);
+        if (ol.has.CANVAS_LINE_DASH) {
+          context.setLineDash(/** @type {Array.<number>} */ (instruction[6]));
+        }
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.SET_TEXT_STYLE:
+        goog.asserts.assert(goog.isString(instruction[1]));
+        goog.asserts.assert(goog.isString(instruction[2]));
+        goog.asserts.assert(goog.isString(instruction[3]));
+        context.font = /** @type {string} */ (instruction[1]);
+        context.textAlign = /** @type {string} */ (instruction[2]);
+        context.textBaseline = /** @type {string} */ (instruction[3]);
+        ++i;
+        break;
+      case ol.render.canvas.Instruction.STROKE:
+        context.stroke();
+        ++i;
+        break;
+      default:
+        goog.asserts.fail();
+        ++i; // consume the instruction anyway, to avoid an infinite loop
+        break;
+    }
+  }
+  // assert that all instructions were consumed
+  goog.asserts.assert(i == instructions.length);
+  return undefined;
+};
+
+
+/**
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {number} viewRotation View rotation.
+ * @param {Object} skippedFeaturesHash Ids of features to skip
+ */
+ol.render.canvas.Replay.prototype.replay = function(
+    context, pixelRatio, transform, viewRotation, skippedFeaturesHash) {
+  var instructions = this.instructions;
+  this.replay_(context, pixelRatio, transform, viewRotation,
+      skippedFeaturesHash, instructions, undefined);
+};
+
+
+/**
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {number} viewRotation View rotation.
+ * @param {Object} skippedFeaturesHash Ids of features to skip
+ * @param {function(ol.Feature): T=} opt_featureCallback Feature callback.
+ * @return {T|undefined} Callback result.
+ * @template T
+ */
+ol.render.canvas.Replay.prototype.replayHitDetection = function(
+    context, transform, viewRotation, skippedFeaturesHash,
+    opt_featureCallback) {
+  var instructions = this.hitDetectionInstructions;
+  return this.replay_(context, 1, transform, viewRotation,
+      skippedFeaturesHash, instructions, opt_featureCallback);
+};
+
+
+/**
+ * @private
+ */
+ol.render.canvas.Replay.prototype.reverseHitDetectionInstructions_ =
+    function() {
+  var hitDetectionInstructions = this.hitDetectionInstructions;
+  // step 1 - reverse array
+  hitDetectionInstructions.reverse();
+  // step 2 - reverse instructions within geometry blocks
+  var i;
+  var n = hitDetectionInstructions.length;
+  var instruction;
+  var type;
+  var begin = -1;
+  for (i = 0; i < n; ++i) {
+    instruction = hitDetectionInstructions[i];
+    type = /** @type {ol.render.canvas.Instruction} */ (instruction[0]);
+    if (type == ol.render.canvas.Instruction.END_GEOMETRY) {
+      goog.asserts.assert(begin == -1);
+      begin = i;
+    } else if (type == ol.render.canvas.Instruction.BEGIN_GEOMETRY) {
+      instruction[2] = i;
+      goog.asserts.assert(begin >= 0);
+      ol.array.reverseSubArray(this.hitDetectionInstructions, begin, i);
+      begin = -1;
+    }
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawAsync = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawCircleGeometry = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawFeature = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawGeometryCollectionGeometry =
+    goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawLineStringGeometry = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawMultiLineStringGeometry =
+    goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawPointGeometry = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawMultiPointGeometry = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawPolygonGeometry = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawMultiPolygonGeometry =
+    goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.drawText = goog.abstractMethod;
+
+
+/**
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.canvas.Replay.prototype.endGeometry = function(geometry, feature) {
+  goog.asserts.assert(!goog.isNull(this.beginGeometryInstruction1_));
+  this.beginGeometryInstruction1_[2] = this.instructions.length;
+  this.beginGeometryInstruction1_ = null;
+  goog.asserts.assert(!goog.isNull(this.beginGeometryInstruction2_));
+  this.beginGeometryInstruction2_[2] = this.hitDetectionInstructions.length;
+  this.beginGeometryInstruction2_ = null;
+  var endGeometryInstruction =
+      [ol.render.canvas.Instruction.END_GEOMETRY, feature];
+  this.instructions.push(endGeometryInstruction);
+  this.hitDetectionInstructions.push(endGeometryInstruction);
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.render.canvas.Replay.prototype.finish = goog.nullFunction;
+
+
+/**
+ * Get the buffered rendering extent.  Rendering will be clipped to the extent
+ * provided to the constructor.  To account for symbolizers that may intersect
+ * this extent, we calculate a buffered extent (e.g. based on stroke width).
+ * @return {ol.Extent} The buffered rendering extent.
+ * @protected
+ */
+ol.render.canvas.Replay.prototype.getBufferedMaxExtent = function() {
+  return this.maxExtent;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.setFillStrokeStyle = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.setImageStyle = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.Replay.prototype.setTextStyle = goog.abstractMethod;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.render.canvas.Replay}
+ * @param {number} tolerance Tolerance.
+ * @param {ol.Extent} maxExtent Maximum extent.
+ * @param {number} resolution Resolution.
+ * @protected
+ * @struct
+ */
+ol.render.canvas.ImageReplay = function(tolerance, maxExtent, resolution) {
+
+  goog.base(this, tolerance, maxExtent, resolution);
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement|HTMLVideoElement|Image}
+   */
+  this.hitDetectionImage_ = null;
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement|HTMLVideoElement|Image}
+   */
+  this.image_ = null;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.anchorX_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.anchorY_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.height_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.opacity_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.originX_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.originY_ = undefined;
+
+  /**
+   * @private
+   * @type {boolean|undefined}
+   */
+  this.rotateWithView_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.rotation_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.scale_ = undefined;
+
+  /**
+   * @private
+   * @type {boolean|undefined}
+   */
+  this.snapToPixel_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.width_ = undefined;
+
+};
+goog.inherits(ol.render.canvas.ImageReplay, ol.render.canvas.Replay);
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @private
+ * @return {number} My end.
+ */
+ol.render.canvas.ImageReplay.prototype.drawCoordinates_ =
+    function(flatCoordinates, offset, end, stride) {
+  return this.appendFlatCoordinates(
+      flatCoordinates, offset, end, stride, false);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.ImageReplay.prototype.drawPointGeometry =
+    function(pointGeometry, feature) {
+  if (goog.isNull(this.image_)) {
+    return;
+  }
+  goog.asserts.assert(goog.isDef(this.anchorX_));
+  goog.asserts.assert(goog.isDef(this.anchorY_));
+  goog.asserts.assert(goog.isDef(this.height_));
+  goog.asserts.assert(goog.isDef(this.opacity_));
+  goog.asserts.assert(goog.isDef(this.originX_));
+  goog.asserts.assert(goog.isDef(this.originY_));
+  goog.asserts.assert(goog.isDef(this.rotateWithView_));
+  goog.asserts.assert(goog.isDef(this.rotation_));
+  goog.asserts.assert(goog.isDef(this.scale_));
+  goog.asserts.assert(goog.isDef(this.width_));
+  this.beginGeometry(pointGeometry, feature);
+  var flatCoordinates = pointGeometry.getFlatCoordinates();
+  var stride = pointGeometry.getStride();
+  var myBegin = this.coordinates.length;
+  var myEnd = this.drawCoordinates_(
+      flatCoordinates, 0, flatCoordinates.length, stride);
+  this.instructions.push([
+    ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.image_,
+    // Remaining arguments to DRAW_IMAGE are in alphabetical order
+    this.anchorX_, this.anchorY_, this.height_, this.opacity_,
+    this.originX_, this.originY_, this.rotateWithView_, this.rotation_,
+    this.scale_, this.snapToPixel_, this.width_
+  ]);
+  this.hitDetectionInstructions.push([
+    ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd,
+    this.hitDetectionImage_,
+    // Remaining arguments to DRAW_IMAGE are in alphabetical order
+    this.anchorX_, this.anchorY_, this.height_, this.opacity_,
+    this.originX_, this.originY_, this.rotateWithView_, this.rotation_,
+    this.scale_, this.snapToPixel_, this.width_
+  ]);
+  this.endGeometry(pointGeometry, feature);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.ImageReplay.prototype.drawMultiPointGeometry =
+    function(multiPointGeometry, feature) {
+  if (goog.isNull(this.image_)) {
+    return;
+  }
+  goog.asserts.assert(goog.isDef(this.anchorX_));
+  goog.asserts.assert(goog.isDef(this.anchorY_));
+  goog.asserts.assert(goog.isDef(this.height_));
+  goog.asserts.assert(goog.isDef(this.opacity_));
+  goog.asserts.assert(goog.isDef(this.originX_));
+  goog.asserts.assert(goog.isDef(this.originY_));
+  goog.asserts.assert(goog.isDef(this.rotateWithView_));
+  goog.asserts.assert(goog.isDef(this.rotation_));
+  goog.asserts.assert(goog.isDef(this.scale_));
+  goog.asserts.assert(goog.isDef(this.width_));
+  this.beginGeometry(multiPointGeometry, feature);
+  var flatCoordinates = multiPointGeometry.getFlatCoordinates();
+  var stride = multiPointGeometry.getStride();
+  var myBegin = this.coordinates.length;
+  var myEnd = this.drawCoordinates_(
+      flatCoordinates, 0, flatCoordinates.length, stride);
+  this.instructions.push([
+    ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd, this.image_,
+    // Remaining arguments to DRAW_IMAGE are in alphabetical order
+    this.anchorX_, this.anchorY_, this.height_, this.opacity_,
+    this.originX_, this.originY_, this.rotateWithView_, this.rotation_,
+    this.scale_, this.snapToPixel_, this.width_
+  ]);
+  this.hitDetectionInstructions.push([
+    ol.render.canvas.Instruction.DRAW_IMAGE, myBegin, myEnd,
+    this.hitDetectionImage_,
+    // Remaining arguments to DRAW_IMAGE are in alphabetical order
+    this.anchorX_, this.anchorY_, this.height_, this.opacity_,
+    this.originX_, this.originY_, this.rotateWithView_, this.rotation_,
+    this.scale_, this.snapToPixel_, this.width_
+  ]);
+  this.endGeometry(multiPointGeometry, feature);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.ImageReplay.prototype.finish = function() {
+  this.reverseHitDetectionInstructions_();
+  // FIXME this doesn't really protect us against further calls to draw*Geometry
+  this.anchorX_ = undefined;
+  this.anchorY_ = undefined;
+  this.hitDetectionImage_ = null;
+  this.image_ = null;
+  this.height_ = undefined;
+  this.scale_ = undefined;
+  this.opacity_ = undefined;
+  this.originX_ = undefined;
+  this.originY_ = undefined;
+  this.rotateWithView_ = undefined;
+  this.rotation_ = undefined;
+  this.snapToPixel_ = undefined;
+  this.width_ = undefined;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.ImageReplay.prototype.setImageStyle = function(imageStyle) {
+  goog.asserts.assert(!goog.isNull(imageStyle));
+  var anchor = imageStyle.getAnchor();
+  goog.asserts.assert(!goog.isNull(anchor));
+  var size = imageStyle.getSize();
+  goog.asserts.assert(!goog.isNull(size));
+  var hitDetectionImage = imageStyle.getHitDetectionImage(1);
+  goog.asserts.assert(!goog.isNull(hitDetectionImage));
+  var image = imageStyle.getImage(1);
+  goog.asserts.assert(!goog.isNull(image));
+  var origin = imageStyle.getOrigin();
+  goog.asserts.assert(!goog.isNull(origin));
+  this.anchorX_ = anchor[0];
+  this.anchorY_ = anchor[1];
+  this.hitDetectionImage_ = hitDetectionImage;
+  this.image_ = image;
+  this.height_ = size[1];
+  this.opacity_ = imageStyle.getOpacity();
+  this.originX_ = origin[0];
+  this.originY_ = origin[1];
+  this.rotateWithView_ = imageStyle.getRotateWithView();
+  this.rotation_ = imageStyle.getRotation();
+  this.scale_ = imageStyle.getScale();
+  this.snapToPixel_ = imageStyle.getSnapToPixel();
+  this.width_ = size[0];
+};
+
+
+
+/**
+ * @constructor
+ * @extends {ol.render.canvas.Replay}
+ * @param {number} tolerance Tolerance.
+ * @param {ol.Extent} maxExtent Maximum extent.
+ * @param {number} resolution Resolution.
+ * @protected
+ * @struct
+ */
+ol.render.canvas.LineStringReplay = function(tolerance, maxExtent, resolution) {
+
+  goog.base(this, tolerance, maxExtent, resolution);
+
+  /**
+   * @private
+   * @type {{currentStrokeStyle: (string|undefined),
+   *         currentLineCap: (string|undefined),
+   *         currentLineDash: Array.<number>,
+   *         currentLineJoin: (string|undefined),
+   *         currentLineWidth: (number|undefined),
+   *         currentMiterLimit: (number|undefined),
+   *         lastStroke: number,
+   *         strokeStyle: (string|undefined),
+   *         lineCap: (string|undefined),
+   *         lineDash: Array.<number>,
+   *         lineJoin: (string|undefined),
+   *         lineWidth: (number|undefined),
+   *         miterLimit: (number|undefined)}|null}
+   */
+  this.state_ = {
+    currentStrokeStyle: undefined,
+    currentLineCap: undefined,
+    currentLineDash: null,
+    currentLineJoin: undefined,
+    currentLineWidth: undefined,
+    currentMiterLimit: undefined,
+    lastStroke: 0,
+    strokeStyle: undefined,
+    lineCap: undefined,
+    lineDash: null,
+    lineJoin: undefined,
+    lineWidth: undefined,
+    miterLimit: undefined
+  };
+
+};
+goog.inherits(ol.render.canvas.LineStringReplay, ol.render.canvas.Replay);
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @private
+ * @return {number} end.
+ */
+ol.render.canvas.LineStringReplay.prototype.drawFlatCoordinates_ =
+    function(flatCoordinates, offset, end, stride) {
+  var myBegin = this.coordinates.length;
+  var myEnd = this.appendFlatCoordinates(
+      flatCoordinates, offset, end, stride, false);
+  var moveToLineToInstruction =
+      [ol.render.canvas.Instruction.MOVE_TO_LINE_TO, myBegin, myEnd];
+  this.instructions.push(moveToLineToInstruction);
+  this.hitDetectionInstructions.push(moveToLineToInstruction);
+  return end;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.LineStringReplay.prototype.getBufferedMaxExtent = function() {
+  var extent = this.maxExtent;
+  if (this.maxLineWidth) {
+    extent = ol.extent.buffer(
+        extent, this.resolution * (this.maxLineWidth + 1) / 2);
+  }
+  return extent;
+};
+
+
+/**
+ * @private
+ */
+ol.render.canvas.LineStringReplay.prototype.setStrokeStyle_ = function() {
+  var state = this.state_;
+  var strokeStyle = state.strokeStyle;
+  var lineCap = state.lineCap;
+  var lineDash = state.lineDash;
+  var lineJoin = state.lineJoin;
+  var lineWidth = state.lineWidth;
+  var miterLimit = state.miterLimit;
+  goog.asserts.assert(goog.isDef(strokeStyle));
+  goog.asserts.assert(goog.isDef(lineCap));
+  goog.asserts.assert(!goog.isNull(lineDash));
+  goog.asserts.assert(goog.isDef(lineJoin));
+  goog.asserts.assert(goog.isDef(lineWidth));
+  goog.asserts.assert(goog.isDef(miterLimit));
+  if (state.currentStrokeStyle != strokeStyle ||
+      state.currentLineCap != lineCap ||
+      !goog.array.equals(state.currentLineDash, lineDash) ||
+      state.currentLineJoin != lineJoin ||
+      state.currentLineWidth != lineWidth ||
+      state.currentMiterLimit != miterLimit) {
+    if (state.lastStroke != this.coordinates.length) {
+      this.instructions.push(
+          [ol.render.canvas.Instruction.STROKE]);
+      state.lastStroke = this.coordinates.length;
+    }
+    this.instructions.push(
+        [ol.render.canvas.Instruction.SET_STROKE_STYLE,
+         strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash],
+        [ol.render.canvas.Instruction.BEGIN_PATH]);
+    state.currentStrokeStyle = strokeStyle;
+    state.currentLineCap = lineCap;
+    state.currentLineDash = lineDash;
+    state.currentLineJoin = lineJoin;
+    state.currentLineWidth = lineWidth;
+    state.currentMiterLimit = miterLimit;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.LineStringReplay.prototype.drawLineStringGeometry =
+    function(lineStringGeometry, feature) {
+  var state = this.state_;
+  goog.asserts.assert(!goog.isNull(state));
+  var strokeStyle = state.strokeStyle;
+  var lineWidth = state.lineWidth;
+  if (!goog.isDef(strokeStyle) || !goog.isDef(lineWidth)) {
+    return;
+  }
+  this.setStrokeStyle_();
+  this.beginGeometry(lineStringGeometry, feature);
+  this.hitDetectionInstructions.push(
+      [ol.render.canvas.Instruction.SET_STROKE_STYLE,
+       state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
+       state.miterLimit, state.lineDash],
+      [ol.render.canvas.Instruction.BEGIN_PATH]);
+  var flatCoordinates = lineStringGeometry.getFlatCoordinates();
+  var stride = lineStringGeometry.getStride();
+  this.drawFlatCoordinates_(
+      flatCoordinates, 0, flatCoordinates.length, stride);
+  this.hitDetectionInstructions.push([ol.render.canvas.Instruction.STROKE]);
+  this.endGeometry(lineStringGeometry, feature);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.LineStringReplay.prototype.drawMultiLineStringGeometry =
+    function(multiLineStringGeometry, feature) {
+  var state = this.state_;
+  goog.asserts.assert(!goog.isNull(state));
+  var strokeStyle = state.strokeStyle;
+  var lineWidth = state.lineWidth;
+  if (!goog.isDef(strokeStyle) || !goog.isDef(lineWidth)) {
+    return;
+  }
+  this.setStrokeStyle_();
+  this.beginGeometry(multiLineStringGeometry, feature);
+  this.hitDetectionInstructions.push(
+      [ol.render.canvas.Instruction.SET_STROKE_STYLE,
+       state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
+       state.miterLimit, state.lineDash],
+      [ol.render.canvas.Instruction.BEGIN_PATH]);
+  var ends = multiLineStringGeometry.getEnds();
+  var flatCoordinates = multiLineStringGeometry.getFlatCoordinates();
+  var stride = multiLineStringGeometry.getStride();
+  var offset = 0;
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    offset = this.drawFlatCoordinates_(
+        flatCoordinates, offset, ends[i], stride);
+  }
+  this.hitDetectionInstructions.push([ol.render.canvas.Instruction.STROKE]);
+  this.endGeometry(multiLineStringGeometry, feature);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.LineStringReplay.prototype.finish = function() {
+  var state = this.state_;
+  goog.asserts.assert(!goog.isNull(state));
+  if (state.lastStroke != this.coordinates.length) {
+    this.instructions.push([ol.render.canvas.Instruction.STROKE]);
+  }
+  this.reverseHitDetectionInstructions_();
+  this.state_ = null;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.LineStringReplay.prototype.setFillStrokeStyle =
+    function(fillStyle, strokeStyle) {
+  goog.asserts.assert(!goog.isNull(this.state_));
+  goog.asserts.assert(goog.isNull(fillStyle));
+  goog.asserts.assert(!goog.isNull(strokeStyle));
+  var strokeStyleColor = strokeStyle.getColor();
+  this.state_.strokeStyle = ol.color.asString(!goog.isNull(strokeStyleColor) ?
+      strokeStyleColor : ol.render.canvas.defaultStrokeStyle);
+  var strokeStyleLineCap = strokeStyle.getLineCap();
+  this.state_.lineCap = goog.isDef(strokeStyleLineCap) ?
+      strokeStyleLineCap : ol.render.canvas.defaultLineCap;
+  var strokeStyleLineDash = strokeStyle.getLineDash();
+  this.state_.lineDash = !goog.isNull(strokeStyleLineDash) ?
+      strokeStyleLineDash : ol.render.canvas.defaultLineDash;
+  var strokeStyleLineJoin = strokeStyle.getLineJoin();
+  this.state_.lineJoin = goog.isDef(strokeStyleLineJoin) ?
+      strokeStyleLineJoin : ol.render.canvas.defaultLineJoin;
+  var strokeStyleWidth = strokeStyle.getWidth();
+  this.state_.lineWidth = goog.isDef(strokeStyleWidth) ?
+      strokeStyleWidth : ol.render.canvas.defaultLineWidth;
+  var strokeStyleMiterLimit = strokeStyle.getMiterLimit();
+  this.state_.miterLimit = goog.isDef(strokeStyleMiterLimit) ?
+      strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit;
+  this.maxLineWidth = Math.max(this.maxLineWidth, this.state_.lineWidth);
+};
+
+
+
+/**
+ * @constructor
+ * @extends {ol.render.canvas.Replay}
+ * @param {number} tolerance Tolerance.
+ * @param {ol.Extent} maxExtent Maximum extent.
+ * @param {number} resolution Resolution.
+ * @protected
+ * @struct
+ */
+ol.render.canvas.PolygonReplay = function(tolerance, maxExtent, resolution) {
+
+  goog.base(this, tolerance, maxExtent, resolution);
+
+  /**
+   * @private
+   * @type {{currentFillStyle: (string|undefined),
+   *         currentStrokeStyle: (string|undefined),
+   *         currentLineCap: (string|undefined),
+   *         currentLineDash: Array.<number>,
+   *         currentLineJoin: (string|undefined),
+   *         currentLineWidth: (number|undefined),
+   *         currentMiterLimit: (number|undefined),
+   *         fillStyle: (string|undefined),
+   *         strokeStyle: (string|undefined),
+   *         lineCap: (string|undefined),
+   *         lineDash: Array.<number>,
+   *         lineJoin: (string|undefined),
+   *         lineWidth: (number|undefined),
+   *         miterLimit: (number|undefined)}|null}
+   */
+  this.state_ = {
+    currentFillStyle: undefined,
+    currentStrokeStyle: undefined,
+    currentLineCap: undefined,
+    currentLineDash: null,
+    currentLineJoin: undefined,
+    currentLineWidth: undefined,
+    currentMiterLimit: undefined,
+    fillStyle: undefined,
+    strokeStyle: undefined,
+    lineCap: undefined,
+    lineDash: null,
+    lineJoin: undefined,
+    lineWidth: undefined,
+    miterLimit: undefined
+  };
+
+};
+goog.inherits(ol.render.canvas.PolygonReplay, ol.render.canvas.Replay);
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {Array.<number>} ends Ends.
+ * @param {number} stride Stride.
+ * @private
+ * @return {number} End.
+ */
+ol.render.canvas.PolygonReplay.prototype.drawFlatCoordinatess_ =
+    function(flatCoordinates, offset, ends, stride) {
+  var state = this.state_;
+  var beginPathInstruction = [ol.render.canvas.Instruction.BEGIN_PATH];
+  this.instructions.push(beginPathInstruction);
+  this.hitDetectionInstructions.push(beginPathInstruction);
+  var i, ii;
+  for (i = 0, ii = ends.length; i < ii; ++i) {
+    var end = ends[i];
+    var myBegin = this.coordinates.length;
+    var myEnd = this.appendFlatCoordinates(
+        flatCoordinates, offset, end, stride, true);
+    var moveToLineToInstruction =
+        [ol.render.canvas.Instruction.MOVE_TO_LINE_TO, myBegin, myEnd];
+    var closePathInstruction = [ol.render.canvas.Instruction.CLOSE_PATH];
+    this.instructions.push(moveToLineToInstruction, closePathInstruction);
+    this.hitDetectionInstructions.push(moveToLineToInstruction,
+        closePathInstruction);
+    offset = end;
+  }
+  // FIXME is it quicker to fill and stroke each polygon individually,
+  // FIXME or all polygons together?
+  var fillInstruction = [ol.render.canvas.Instruction.FILL];
+  this.hitDetectionInstructions.push(fillInstruction);
+  if (goog.isDef(state.fillStyle)) {
+    this.instructions.push(fillInstruction);
+  }
+  if (goog.isDef(state.strokeStyle)) {
+    goog.asserts.assert(goog.isDef(state.lineWidth));
+    var strokeInstruction = [ol.render.canvas.Instruction.STROKE];
+    this.instructions.push(strokeInstruction);
+    this.hitDetectionInstructions.push(strokeInstruction);
+  }
+  return offset;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.PolygonReplay.prototype.drawCircleGeometry =
+    function(circleGeometry, feature) {
+  var state = this.state_;
+  goog.asserts.assert(!goog.isNull(state));
+  var fillStyle = state.fillStyle;
+  var strokeStyle = state.strokeStyle;
+  if (!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) {
+    return;
+  }
+  if (goog.isDef(strokeStyle)) {
+    goog.asserts.assert(goog.isDef(state.lineWidth));
+  }
+  this.setFillStrokeStyles_();
+  this.beginGeometry(circleGeometry, feature);
+  // always fill the circle for hit detection
+  this.hitDetectionInstructions.push(
+      [ol.render.canvas.Instruction.SET_FILL_STYLE,
+       ol.color.asString(ol.render.canvas.defaultFillStyle)]);
+  if (goog.isDef(state.strokeStyle)) {
+    this.hitDetectionInstructions.push(
+        [ol.render.canvas.Instruction.SET_STROKE_STYLE,
+         state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
+         state.miterLimit, state.lineDash]);
+  }
+  var flatCoordinates = circleGeometry.getFlatCoordinates();
+  var stride = circleGeometry.getStride();
+  var myBegin = this.coordinates.length;
+  this.appendFlatCoordinates(
+      flatCoordinates, 0, flatCoordinates.length, stride, false);
+  var beginPathInstruction = [ol.render.canvas.Instruction.BEGIN_PATH];
+  var circleInstruction = [ol.render.canvas.Instruction.CIRCLE, myBegin];
+  this.instructions.push(beginPathInstruction, circleInstruction);
+  this.hitDetectionInstructions.push(beginPathInstruction, circleInstruction);
+  var fillInstruction = [ol.render.canvas.Instruction.FILL];
+  this.hitDetectionInstructions.push(fillInstruction);
+  if (goog.isDef(state.fillStyle)) {
+    this.instructions.push(fillInstruction);
+  }
+  if (goog.isDef(state.strokeStyle)) {
+    goog.asserts.assert(goog.isDef(state.lineWidth));
+    var strokeInstruction = [ol.render.canvas.Instruction.STROKE];
+    this.instructions.push(strokeInstruction);
+    this.hitDetectionInstructions.push(strokeInstruction);
+  }
+  this.endGeometry(circleGeometry, feature);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.PolygonReplay.prototype.drawPolygonGeometry =
+    function(polygonGeometry, feature) {
+  var state = this.state_;
+  goog.asserts.assert(!goog.isNull(state));
+  var fillStyle = state.fillStyle;
+  var strokeStyle = state.strokeStyle;
+  if (!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) {
+    return;
+  }
+  if (goog.isDef(strokeStyle)) {
+    goog.asserts.assert(goog.isDef(state.lineWidth));
+  }
+  this.setFillStrokeStyles_();
+  this.beginGeometry(polygonGeometry, feature);
+  // always fill the polygon for hit detection
+  this.hitDetectionInstructions.push(
+      [ol.render.canvas.Instruction.SET_FILL_STYLE,
+       ol.color.asString(ol.render.canvas.defaultFillStyle)]);
+  if (goog.isDef(state.strokeStyle)) {
+    this.hitDetectionInstructions.push(
+        [ol.render.canvas.Instruction.SET_STROKE_STYLE,
+         state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
+         state.miterLimit, state.lineDash]);
+  }
+  var ends = polygonGeometry.getEnds();
+  var flatCoordinates = polygonGeometry.getOrientedFlatCoordinates();
+  var stride = polygonGeometry.getStride();
+  this.drawFlatCoordinatess_(flatCoordinates, 0, ends, stride);
+  this.endGeometry(polygonGeometry, feature);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.PolygonReplay.prototype.drawMultiPolygonGeometry =
+    function(multiPolygonGeometry, feature) {
+  var state = this.state_;
+  goog.asserts.assert(!goog.isNull(state));
+  var fillStyle = state.fillStyle;
+  var strokeStyle = state.strokeStyle;
+  if (!goog.isDef(fillStyle) && !goog.isDef(strokeStyle)) {
+    return;
+  }
+  if (goog.isDef(strokeStyle)) {
+    goog.asserts.assert(goog.isDef(state.lineWidth));
+  }
+  this.setFillStrokeStyles_();
+  this.beginGeometry(multiPolygonGeometry, feature);
+  // always fill the multi-polygon for hit detection
+  this.hitDetectionInstructions.push(
+      [ol.render.canvas.Instruction.SET_FILL_STYLE,
+       ol.color.asString(ol.render.canvas.defaultFillStyle)]);
+  if (goog.isDef(state.strokeStyle)) {
+    this.hitDetectionInstructions.push(
+        [ol.render.canvas.Instruction.SET_STROKE_STYLE,
+         state.strokeStyle, state.lineWidth, state.lineCap, state.lineJoin,
+         state.miterLimit, state.lineDash]);
+  }
+  var endss = multiPolygonGeometry.getEndss();
+  var flatCoordinates = multiPolygonGeometry.getOrientedFlatCoordinates();
+  var stride = multiPolygonGeometry.getStride();
+  var offset = 0;
+  var i, ii;
+  for (i = 0, ii = endss.length; i < ii; ++i) {
+    offset = this.drawFlatCoordinatess_(
+        flatCoordinates, offset, endss[i], stride);
+  }
+  this.endGeometry(multiPolygonGeometry, feature);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.PolygonReplay.prototype.finish = function() {
+  goog.asserts.assert(!goog.isNull(this.state_));
+  this.reverseHitDetectionInstructions_();
+  this.state_ = null;
+  // We want to preserve topology when drawing polygons.  Polygons are
+  // simplified using quantization and point elimination. However, we might
+  // have received a mix of quantized and non-quantized geometries, so ensure
+  // that all are quantized by quantizing all coordinates in the batch.
+  var tolerance = this.tolerance;
+  if (tolerance !== 0) {
+    var coordinates = this.coordinates;
+    var i, ii;
+    for (i = 0, ii = coordinates.length; i < ii; ++i) {
+      coordinates[i] = ol.geom.flat.simplify.snap(coordinates[i], tolerance);
+    }
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.PolygonReplay.prototype.getBufferedMaxExtent = function() {
+  var extent = this.maxExtent;
+  if (this.maxLineWidth) {
+    extent = ol.extent.buffer(
+        extent, this.resolution * (this.maxLineWidth + 1) / 2);
+  }
+  return extent;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyle =
+    function(fillStyle, strokeStyle) {
+  goog.asserts.assert(!goog.isNull(this.state_));
+  goog.asserts.assert(!goog.isNull(fillStyle) || !goog.isNull(strokeStyle));
+  var state = this.state_;
+  if (!goog.isNull(fillStyle)) {
+    var fillStyleColor = fillStyle.getColor();
+    state.fillStyle = ol.color.asString(!goog.isNull(fillStyleColor) ?
+        fillStyleColor : ol.render.canvas.defaultFillStyle);
+  } else {
+    state.fillStyle = undefined;
+  }
+  if (!goog.isNull(strokeStyle)) {
+    var strokeStyleColor = strokeStyle.getColor();
+    state.strokeStyle = ol.color.asString(!goog.isNull(strokeStyleColor) ?
+        strokeStyleColor : ol.render.canvas.defaultStrokeStyle);
+    var strokeStyleLineCap = strokeStyle.getLineCap();
+    state.lineCap = goog.isDef(strokeStyleLineCap) ?
+        strokeStyleLineCap : ol.render.canvas.defaultLineCap;
+    var strokeStyleLineDash = strokeStyle.getLineDash();
+    state.lineDash = !goog.isNull(strokeStyleLineDash) ?
+        strokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash;
+    var strokeStyleLineJoin = strokeStyle.getLineJoin();
+    state.lineJoin = goog.isDef(strokeStyleLineJoin) ?
+        strokeStyleLineJoin : ol.render.canvas.defaultLineJoin;
+    var strokeStyleWidth = strokeStyle.getWidth();
+    state.lineWidth = goog.isDef(strokeStyleWidth) ?
+        strokeStyleWidth : ol.render.canvas.defaultLineWidth;
+    var strokeStyleMiterLimit = strokeStyle.getMiterLimit();
+    state.miterLimit = goog.isDef(strokeStyleMiterLimit) ?
+        strokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit;
+    this.maxLineWidth = Math.max(this.maxLineWidth, state.lineWidth);
+  } else {
+    state.strokeStyle = undefined;
+    state.lineCap = undefined;
+    state.lineDash = null;
+    state.lineJoin = undefined;
+    state.lineWidth = undefined;
+    state.miterLimit = undefined;
+  }
+};
+
+
+/**
+ * @private
+ */
+ol.render.canvas.PolygonReplay.prototype.setFillStrokeStyles_ = function() {
+  var state = this.state_;
+  var fillStyle = state.fillStyle;
+  var strokeStyle = state.strokeStyle;
+  var lineCap = state.lineCap;
+  var lineDash = state.lineDash;
+  var lineJoin = state.lineJoin;
+  var lineWidth = state.lineWidth;
+  var miterLimit = state.miterLimit;
+  if (goog.isDef(fillStyle) && state.currentFillStyle != fillStyle) {
+    this.instructions.push(
+        [ol.render.canvas.Instruction.SET_FILL_STYLE, fillStyle]);
+    state.currentFillStyle = state.fillStyle;
+  }
+  if (goog.isDef(strokeStyle)) {
+    goog.asserts.assert(goog.isDef(lineCap));
+    goog.asserts.assert(!goog.isNull(lineDash));
+    goog.asserts.assert(goog.isDef(lineJoin));
+    goog.asserts.assert(goog.isDef(lineWidth));
+    goog.asserts.assert(goog.isDef(miterLimit));
+    if (state.currentStrokeStyle != strokeStyle ||
+        state.currentLineCap != lineCap ||
+        state.currentLineDash != lineDash ||
+        state.currentLineJoin != lineJoin ||
+        state.currentLineWidth != lineWidth ||
+        state.currentMiterLimit != miterLimit) {
+      this.instructions.push(
+          [ol.render.canvas.Instruction.SET_STROKE_STYLE,
+           strokeStyle, lineWidth, lineCap, lineJoin, miterLimit, lineDash]);
+      state.currentStrokeStyle = strokeStyle;
+      state.currentLineCap = lineCap;
+      state.currentLineDash = lineDash;
+      state.currentLineJoin = lineJoin;
+      state.currentLineWidth = lineWidth;
+      state.currentMiterLimit = miterLimit;
+    }
+  }
+};
+
+
+
+/**
+ * @constructor
+ * @extends {ol.render.canvas.Replay}
+ * @param {number} tolerance Tolerance.
+ * @param {ol.Extent} maxExtent Maximum extent.
+ * @param {number} resolution Resolution.
+ * @protected
+ * @struct
+ */
+ol.render.canvas.TextReplay = function(tolerance, maxExtent, resolution) {
+
+  goog.base(this, tolerance, maxExtent, resolution);
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.FillState}
+   */
+  this.replayFillState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.StrokeState}
+   */
+  this.replayStrokeState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.TextState}
+   */
+  this.replayTextState_ = null;
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.text_ = '';
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textOffsetX_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textOffsetY_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textRotation_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textScale_ = 0;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.FillState}
+   */
+  this.textFillState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.StrokeState}
+   */
+  this.textStrokeState_ = null;
+
+  /**
+   * @private
+   * @type {?ol.render.canvas.TextState}
+   */
+  this.textState_ = null;
+
+};
+goog.inherits(ol.render.canvas.TextReplay, ol.render.canvas.Replay);
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.TextReplay.prototype.drawText =
+    function(flatCoordinates, offset, end, stride, geometry, feature) {
+  if (this.text_ === '' ||
+      goog.isNull(this.textState_) ||
+      (goog.isNull(this.textFillState_) &&
+       goog.isNull(this.textStrokeState_))) {
+    return;
+  }
+  if (!goog.isNull(this.textFillState_)) {
+    this.setReplayFillState_(this.textFillState_);
+  }
+  if (!goog.isNull(this.textStrokeState_)) {
+    this.setReplayStrokeState_(this.textStrokeState_);
+  }
+  this.setReplayTextState_(this.textState_);
+  this.beginGeometry(geometry, feature);
+  var myBegin = this.coordinates.length;
+  var myEnd =
+      this.appendFlatCoordinates(flatCoordinates, offset, end, stride, false);
+  var fill = !goog.isNull(this.textFillState_);
+  var stroke = !goog.isNull(this.textStrokeState_);
+  var drawTextInstruction = [
+    ol.render.canvas.Instruction.DRAW_TEXT, myBegin, myEnd, this.text_,
+    this.textOffsetX_, this.textOffsetY_, this.textRotation_, this.textScale_,
+    fill, stroke];
+  this.instructions.push(drawTextInstruction);
+  this.hitDetectionInstructions.push(drawTextInstruction);
+  this.endGeometry(geometry, feature);
+};
+
+
+/**
+ * @param {ol.render.canvas.FillState} fillState Fill state.
+ * @private
+ */
+ol.render.canvas.TextReplay.prototype.setReplayFillState_ =
+    function(fillState) {
+  var replayFillState = this.replayFillState_;
+  if (!goog.isNull(replayFillState) &&
+      replayFillState.fillStyle == fillState.fillStyle) {
+    return;
+  }
+  var setFillStyleInstruction =
+      [ol.render.canvas.Instruction.SET_FILL_STYLE, fillState.fillStyle];
+  this.instructions.push(setFillStyleInstruction);
+  this.hitDetectionInstructions.push(setFillStyleInstruction);
+  if (goog.isNull(replayFillState)) {
+    this.replayFillState_ = {
+      fillStyle: fillState.fillStyle
+    };
+  } else {
+    replayFillState.fillStyle = fillState.fillStyle;
+  }
+};
+
+
+/**
+ * @param {ol.render.canvas.StrokeState} strokeState Stroke state.
+ * @private
+ */
+ol.render.canvas.TextReplay.prototype.setReplayStrokeState_ =
+    function(strokeState) {
+  var replayStrokeState = this.replayStrokeState_;
+  if (!goog.isNull(replayStrokeState) &&
+      replayStrokeState.lineCap == strokeState.lineCap &&
+      replayStrokeState.lineDash == strokeState.lineDash &&
+      replayStrokeState.lineJoin == strokeState.lineJoin &&
+      replayStrokeState.lineWidth == strokeState.lineWidth &&
+      replayStrokeState.miterLimit == strokeState.miterLimit &&
+      replayStrokeState.strokeStyle == strokeState.strokeStyle) {
+    return;
+  }
+  var setStrokeStyleInstruction = [
+    ol.render.canvas.Instruction.SET_STROKE_STYLE, strokeState.strokeStyle,
+    strokeState.lineWidth, strokeState.lineCap, strokeState.lineJoin,
+    strokeState.miterLimit, strokeState.lineDash, false
+  ];
+  this.instructions.push(setStrokeStyleInstruction);
+  this.hitDetectionInstructions.push(setStrokeStyleInstruction);
+  if (goog.isNull(replayStrokeState)) {
+    this.replayStrokeState_ = {
+      lineCap: strokeState.lineCap,
+      lineDash: strokeState.lineDash,
+      lineJoin: strokeState.lineJoin,
+      lineWidth: strokeState.lineWidth,
+      miterLimit: strokeState.miterLimit,
+      strokeStyle: strokeState.strokeStyle
+    };
+  } else {
+    replayStrokeState.lineCap = strokeState.lineCap;
+    replayStrokeState.lineDash = strokeState.lineDash;
+    replayStrokeState.lineJoin = strokeState.lineJoin;
+    replayStrokeState.lineWidth = strokeState.lineWidth;
+    replayStrokeState.miterLimit = strokeState.miterLimit;
+    replayStrokeState.strokeStyle = strokeState.strokeStyle;
+  }
+};
+
+
+/**
+ * @param {ol.render.canvas.TextState} textState Text state.
+ * @private
+ */
+ol.render.canvas.TextReplay.prototype.setReplayTextState_ =
+    function(textState) {
+  var replayTextState = this.replayTextState_;
+  if (!goog.isNull(replayTextState) &&
+      replayTextState.font == textState.font &&
+      replayTextState.textAlign == textState.textAlign &&
+      replayTextState.textBaseline == textState.textBaseline) {
+    return;
+  }
+  var setTextStyleInstruction = [ol.render.canvas.Instruction.SET_TEXT_STYLE,
+    textState.font, textState.textAlign, textState.textBaseline];
+  this.instructions.push(setTextStyleInstruction);
+  this.hitDetectionInstructions.push(setTextStyleInstruction);
+  if (goog.isNull(replayTextState)) {
+    this.replayTextState_ = {
+      font: textState.font,
+      textAlign: textState.textAlign,
+      textBaseline: textState.textBaseline
+    };
+  } else {
+    replayTextState.font = textState.font;
+    replayTextState.textAlign = textState.textAlign;
+    replayTextState.textBaseline = textState.textBaseline;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.TextReplay.prototype.setTextStyle = function(textStyle) {
+  if (goog.isNull(textStyle)) {
+    this.text_ = '';
+  } else {
+    var textFillStyle = textStyle.getFill();
+    if (goog.isNull(textFillStyle)) {
+      this.textFillState_ = null;
+    } else {
+      var textFillStyleColor = textFillStyle.getColor();
+      var fillStyle = ol.color.asString(!goog.isNull(textFillStyleColor) ?
+          textFillStyleColor : ol.render.canvas.defaultFillStyle);
+      if (goog.isNull(this.textFillState_)) {
+        this.textFillState_ = {
+          fillStyle: fillStyle
+        };
+      } else {
+        var textFillState = this.textFillState_;
+        textFillState.fillStyle = fillStyle;
+      }
+    }
+    var textStrokeStyle = textStyle.getStroke();
+    if (goog.isNull(textStrokeStyle)) {
+      this.textStrokeState_ = null;
+    } else {
+      var textStrokeStyleColor = textStrokeStyle.getColor();
+      var textStrokeStyleLineCap = textStrokeStyle.getLineCap();
+      var textStrokeStyleLineDash = textStrokeStyle.getLineDash();
+      var textStrokeStyleLineJoin = textStrokeStyle.getLineJoin();
+      var textStrokeStyleWidth = textStrokeStyle.getWidth();
+      var textStrokeStyleMiterLimit = textStrokeStyle.getMiterLimit();
+      var lineCap = goog.isDef(textStrokeStyleLineCap) ?
+          textStrokeStyleLineCap : ol.render.canvas.defaultLineCap;
+      var lineDash = goog.isDefAndNotNull(textStrokeStyleLineDash) ?
+          textStrokeStyleLineDash.slice() : ol.render.canvas.defaultLineDash;
+      var lineJoin = goog.isDef(textStrokeStyleLineJoin) ?
+          textStrokeStyleLineJoin : ol.render.canvas.defaultLineJoin;
+      var lineWidth = goog.isDef(textStrokeStyleWidth) ?
+          textStrokeStyleWidth : ol.render.canvas.defaultLineWidth;
+      var miterLimit = goog.isDef(textStrokeStyleMiterLimit) ?
+          textStrokeStyleMiterLimit : ol.render.canvas.defaultMiterLimit;
+      var strokeStyle = ol.color.asString(!goog.isNull(textStrokeStyleColor) ?
+          textStrokeStyleColor : ol.render.canvas.defaultStrokeStyle);
+      if (goog.isNull(this.textStrokeState_)) {
+        this.textStrokeState_ = {
+          lineCap: lineCap,
+          lineDash: lineDash,
+          lineJoin: lineJoin,
+          lineWidth: lineWidth,
+          miterLimit: miterLimit,
+          strokeStyle: strokeStyle
+        };
+      } else {
+        var textStrokeState = this.textStrokeState_;
+        textStrokeState.lineCap = lineCap;
+        textStrokeState.lineDash = lineDash;
+        textStrokeState.lineJoin = lineJoin;
+        textStrokeState.lineWidth = lineWidth;
+        textStrokeState.miterLimit = miterLimit;
+        textStrokeState.strokeStyle = strokeStyle;
+      }
+    }
+    var textFont = textStyle.getFont();
+    var textOffsetX = textStyle.getOffsetX();
+    var textOffsetY = textStyle.getOffsetY();
+    var textRotation = textStyle.getRotation();
+    var textScale = textStyle.getScale();
+    var textText = textStyle.getText();
+    var textTextAlign = textStyle.getTextAlign();
+    var textTextBaseline = textStyle.getTextBaseline();
+    var font = goog.isDef(textFont) ?
+        textFont : ol.render.canvas.defaultFont;
+    var textAlign = goog.isDef(textTextAlign) ?
+        textTextAlign : ol.render.canvas.defaultTextAlign;
+    var textBaseline = goog.isDef(textTextBaseline) ?
+        textTextBaseline : ol.render.canvas.defaultTextBaseline;
+    if (goog.isNull(this.textState_)) {
+      this.textState_ = {
+        font: font,
+        textAlign: textAlign,
+        textBaseline: textBaseline
+      };
+    } else {
+      var textState = this.textState_;
+      textState.font = font;
+      textState.textAlign = textAlign;
+      textState.textBaseline = textBaseline;
+    }
+    this.text_ = goog.isDef(textText) ? textText : '';
+    this.textOffsetX_ = goog.isDef(textOffsetX) ? textOffsetX : 0;
+    this.textOffsetY_ = goog.isDef(textOffsetY) ? textOffsetY : 0;
+    this.textRotation_ = goog.isDef(textRotation) ? textRotation : 0;
+    this.textScale_ = goog.isDef(textScale) ? textScale : 1;
+  }
+};
+
+
+
+/**
+ * @constructor
+ * @implements {ol.render.IReplayGroup}
+ * @param {number} tolerance Tolerance.
+ * @param {ol.Extent} maxExtent Max extent.
+ * @param {number} resolution Resolution.
+ * @struct
+ */
+ol.render.canvas.ReplayGroup = function(tolerance, maxExtent, resolution) {
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.tolerance_ = tolerance;
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.maxExtent_ = maxExtent;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.resolution_ = resolution;
+
+  /**
+   * @private
+   * @type {Object.<string,
+   *        Object.<ol.render.ReplayType, ol.render.canvas.Replay>>}
+   */
+  this.replaysByZIndex_ = {};
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.hitDetectionContext_ = ol.dom.createCanvasContext2D(1, 1);
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.hitDetectionTransform_ = goog.vec.Mat4.createNumber();
+
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.render.canvas.ReplayGroup.prototype.finish = function() {
+  var zKey;
+  for (zKey in this.replaysByZIndex_) {
+    var replays = this.replaysByZIndex_[zKey];
+    var replayKey;
+    for (replayKey in replays) {
+      replays[replayKey].finish();
+    }
+  }
+};
+
+
+/**
+ * @param {number} resolution Resolution.
+ * @param {number} rotation Rotation.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {Object} skippedFeaturesHash Ids of features to skip
+ * @param {function(ol.Feature): T} callback Feature callback.
+ * @return {T|undefined} Callback result.
+ * @template T
+ */
+ol.render.canvas.ReplayGroup.prototype.forEachGeometryAtPixel = function(
+    resolution, rotation, coordinate, skippedFeaturesHash, callback) {
+
+  var transform = this.hitDetectionTransform_;
+  ol.vec.Mat4.makeTransform2D(transform, 0.5, 0.5,
+      1 / resolution, -1 / resolution, -rotation,
+      -coordinate[0], -coordinate[1]);
+
+  var context = this.hitDetectionContext_;
+  context.clearRect(0, 0, 1, 1);
+
+  return this.replayHitDetection_(context, transform, rotation,
+      skippedFeaturesHash,
+      /**
+       * @param {ol.Feature} feature Feature.
+       * @return {?} Callback result.
+       */
+      function(feature) {
+        var imageData = context.getImageData(0, 0, 1, 1).data;
+        if (imageData[3] > 0) {
+          var result = callback(feature);
+          if (result) {
+            return result;
+          }
+          context.clearRect(0, 0, 1, 1);
+        }
+      });
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.ReplayGroup.prototype.getReplay =
+    function(zIndex, replayType) {
+  var zIndexKey = goog.isDef(zIndex) ? zIndex.toString() : '0';
+  var replays = this.replaysByZIndex_[zIndexKey];
+  if (!goog.isDef(replays)) {
+    replays = {};
+    this.replaysByZIndex_[zIndexKey] = replays;
+  }
+  var replay = replays[replayType];
+  if (!goog.isDef(replay)) {
+    var Constructor = ol.render.canvas.BATCH_CONSTRUCTORS_[replayType];
+    goog.asserts.assert(goog.isDef(Constructor));
+    replay = new Constructor(this.tolerance_, this.maxExtent_,
+        this.resolution_);
+    replays[replayType] = replay;
+  }
+  return replay;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.canvas.ReplayGroup.prototype.isEmpty = function() {
+  return goog.object.isEmpty(this.replaysByZIndex_);
+};
+
+
+/**
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {number} viewRotation View rotation.
+ * @param {Object} skippedFeaturesHash Ids of features to skip
+ */
+ol.render.canvas.ReplayGroup.prototype.replay = function(
+    context, pixelRatio, transform, viewRotation, skippedFeaturesHash) {
+
+  /** @type {Array.<number>} */
+  var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number);
+  goog.array.sort(zs);
+
+  var maxExtent = this.maxExtent_;
+  var minX = maxExtent[0];
+  var minY = maxExtent[1];
+  var maxX = maxExtent[2];
+  var maxY = maxExtent[3];
+  var flatClipCoords = [minX, minY, minX, maxY, maxX, maxY, maxX, minY];
+  ol.geom.flat.transform.transform2D(
+      flatClipCoords, 0, 8, 2, transform, flatClipCoords);
+  context.save();
+  context.beginPath();
+  context.moveTo(flatClipCoords[0], flatClipCoords[1]);
+  context.lineTo(flatClipCoords[2], flatClipCoords[3]);
+  context.lineTo(flatClipCoords[4], flatClipCoords[5]);
+  context.lineTo(flatClipCoords[6], flatClipCoords[7]);
+  context.closePath();
+  context.clip();
+
+  var i, ii, j, jj, replays, replay, result;
+  for (i = 0, ii = zs.length; i < ii; ++i) {
+    replays = this.replaysByZIndex_[zs[i].toString()];
+    for (j = 0, jj = ol.render.REPLAY_ORDER.length; j < jj; ++j) {
+      replay = replays[ol.render.REPLAY_ORDER[j]];
+      if (goog.isDef(replay)) {
+        replay.replay(context, pixelRatio, transform, viewRotation,
+            skippedFeaturesHash);
+      }
+    }
+  }
+
+  context.restore();
+};
+
+
+/**
+ * @private
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @param {number} viewRotation View rotation.
+ * @param {Object} skippedFeaturesHash Ids of features to skip
+ * @param {function(ol.Feature): T} featureCallback Feature callback.
+ * @return {T|undefined} Callback result.
+ * @template T
+ */
+ol.render.canvas.ReplayGroup.prototype.replayHitDetection_ = function(
+    context, transform, viewRotation, skippedFeaturesHash,
+    featureCallback) {
+  /** @type {Array.<number>} */
+  var zs = goog.array.map(goog.object.getKeys(this.replaysByZIndex_), Number);
+  goog.array.sort(zs, function(a, b) { return b - a; });
+
+  var i, ii, j, replays, replay, result;
+  for (i = 0, ii = zs.length; i < ii; ++i) {
+    replays = this.replaysByZIndex_[zs[i].toString()];
+    for (j = ol.render.REPLAY_ORDER.length - 1; j >= 0; --j) {
+      replay = replays[ol.render.REPLAY_ORDER[j]];
+      if (goog.isDef(replay)) {
+        result = replay.replayHitDetection(context, transform, viewRotation,
+            skippedFeaturesHash, featureCallback);
+        if (result) {
+          return result;
+        }
+      }
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Object.<ol.render.ReplayType,
+ *                function(new: ol.render.canvas.Replay, number, ol.Extent,
+ *                number)>}
+ */
+ol.render.canvas.BATCH_CONSTRUCTORS_ = {
+  'Image': ol.render.canvas.ImageReplay,
+  'LineString': ol.render.canvas.LineStringReplay,
+  'Polygon': ol.render.canvas.PolygonReplay,
+  'Text': ol.render.canvas.TextReplay
+};
diff --git a/src/ol/render/ireplay.js b/src/ol/render/ireplay.js
new file mode 100644
index 0000000..78e2faf
--- /dev/null
+++ b/src/ol/render/ireplay.js
@@ -0,0 +1,51 @@
+goog.provide('ol.render.IReplayGroup');
+
+goog.require('goog.functions');
+goog.require('ol.render.IVectorContext');
+
+
+/**
+ * @enum {string}
+ */
+ol.render.ReplayType = {
+  IMAGE: 'Image',
+  LINE_STRING: 'LineString',
+  POLYGON: 'Polygon',
+  TEXT: 'Text'
+};
+
+
+/**
+ * @const
+ * @type {Array.<ol.render.ReplayType>}
+ */
+ol.render.REPLAY_ORDER = [
+  ol.render.ReplayType.POLYGON,
+  ol.render.ReplayType.LINE_STRING,
+  ol.render.ReplayType.IMAGE,
+  ol.render.ReplayType.TEXT
+];
+
+
+
+/**
+ * @interface
+ */
+ol.render.IReplayGroup = function() {
+};
+
+
+/**
+ * @param {number|undefined} zIndex Z index.
+ * @param {ol.render.ReplayType} replayType Replay type.
+ * @return {ol.render.IVectorContext} Replay.
+ */
+ol.render.IReplayGroup.prototype.getReplay = function(zIndex, replayType) {
+};
+
+
+/**
+ * @return {boolean} Is empty.
+ */
+ol.render.IReplayGroup.prototype.isEmpty = function() {
+};
diff --git a/src/ol/render/ivectorcontext.js b/src/ol/render/ivectorcontext.js
new file mode 100644
index 0000000..3b49151
--- /dev/null
+++ b/src/ol/render/ivectorcontext.js
@@ -0,0 +1,139 @@
+// FIXME remove trailing "Geometry" in method names
+
+goog.provide('ol.render.IVectorContext');
+
+
+
+/**
+ * VectorContext interface. Implemented by
+ * {@link ol.render.canvas.Immediate} and {@link ol.render.webgl.Immediate}.
+ * @interface
+ */
+ol.render.IVectorContext = function() {
+};
+
+
+/**
+ * @param {number} zIndex Z index.
+ * @param {function(ol.render.IVectorContext)} callback Callback.
+ */
+ol.render.IVectorContext.prototype.drawAsync = function(zIndex, callback) {
+};
+
+
+/**
+ * @param {ol.geom.Circle} circleGeometry Circle geometry.
+ * @param {ol.Feature} feature Feature,
+ */
+ol.render.IVectorContext.prototype.drawCircleGeometry =
+    function(circleGeometry, feature) {
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @param {ol.style.Style} style Style.
+ */
+ol.render.IVectorContext.prototype.drawFeature = function(feature, style) {
+};
+
+
+/**
+ * @param {ol.geom.GeometryCollection} geometryCollectionGeometry Geometry
+ *     collection.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.IVectorContext.prototype.drawGeometryCollectionGeometry =
+    function(geometryCollectionGeometry, feature) {
+};
+
+
+/**
+ * @param {ol.geom.Point} pointGeometry Point geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.IVectorContext.prototype.drawPointGeometry =
+    function(pointGeometry, feature) {
+};
+
+
+/**
+ * @param {ol.geom.LineString} lineStringGeometry Line string geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.IVectorContext.prototype.drawLineStringGeometry =
+    function(lineStringGeometry, feature) {
+};
+
+
+/**
+ * @param {ol.geom.MultiLineString} multiLineStringGeometry
+ *     MultiLineString geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.IVectorContext.prototype.drawMultiLineStringGeometry =
+    function(multiLineStringGeometry, feature) {
+};
+
+
+/**
+ * @param {ol.geom.MultiPoint} multiPointGeometry MultiPoint geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.IVectorContext.prototype.drawMultiPointGeometry =
+    function(multiPointGeometry, feature) {
+};
+
+
+/**
+ * @param {ol.geom.MultiPolygon} multiPolygonGeometry MultiPolygon geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.IVectorContext.prototype.drawMultiPolygonGeometry =
+    function(multiPolygonGeometry, feature) {
+};
+
+
+/**
+ * @param {ol.geom.Polygon} polygonGeometry Polygon geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.IVectorContext.prototype.drawPolygonGeometry =
+    function(polygonGeometry, feature) {
+};
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.Feature} feature Feature.
+ */
+ol.render.IVectorContext.prototype.drawText =
+    function(flatCoordinates, offset, end, stride, geometry, feature) {
+};
+
+
+/**
+ * @param {ol.style.Fill} fillStyle Fill style.
+ * @param {ol.style.Stroke} strokeStyle Stroke style.
+ */
+ol.render.IVectorContext.prototype.setFillStrokeStyle =
+    function(fillStyle, strokeStyle) {
+};
+
+
+/**
+ * @param {ol.style.Image} imageStyle Image style.
+ */
+ol.render.IVectorContext.prototype.setImageStyle = function(imageStyle) {
+};
+
+
+/**
+ * @param {ol.style.Text} textStyle Text style.
+ */
+ol.render.IVectorContext.prototype.setTextStyle = function(textStyle) {
+};
diff --git a/src/ol/render/renderevent.js b/src/ol/render/renderevent.js
new file mode 100644
index 0000000..568619c
--- /dev/null
+++ b/src/ol/render/renderevent.js
@@ -0,0 +1,84 @@
+goog.provide('ol.render.Event');
+goog.provide('ol.render.EventType');
+
+goog.require('goog.events.Event');
+goog.require('ol.render.IVectorContext');
+
+
+/**
+ * @enum {string}
+ */
+ol.render.EventType = {
+  /**
+   * @event ol.render.Event#postcompose
+   * @api
+   */
+  POSTCOMPOSE: 'postcompose',
+  /**
+   * @event ol.render.Event#precompose
+   * @api
+   */
+  PRECOMPOSE: 'precompose',
+  /**
+   * @event ol.render.Event#render
+   * @api
+   */
+  RENDER: 'render'
+};
+
+
+
+/**
+ * @constructor
+ * @extends {goog.events.Event}
+ * @implements {oli.render.Event}
+ * @param {ol.render.EventType} type Type.
+ * @param {Object=} opt_target Target.
+ * @param {ol.render.IVectorContext=} opt_vectorContext Vector context.
+ * @param {ol.render.IReplayGroup=} opt_replayGroup Replay group.
+ * @param {olx.FrameState=} opt_frameState Frame state.
+ * @param {?CanvasRenderingContext2D=} opt_context Context.
+ * @param {?ol.webgl.Context=} opt_glContext WebGL Context.
+ */
+ol.render.Event = function(
+    type, opt_target, opt_vectorContext, opt_replayGroup, opt_frameState,
+    opt_context, opt_glContext) {
+
+  goog.base(this, type, opt_target);
+
+  /**
+   * For canvas, this is an instance of {@link ol.render.canvas.Immediate}.
+   * @type {ol.render.IVectorContext|undefined}
+   * @api
+   */
+  this.vectorContext = opt_vectorContext;
+
+  /**
+   * @type {ol.render.IReplayGroup|undefined}
+   */
+  this.replayGroup = opt_replayGroup;
+
+  /**
+   * @type {olx.FrameState|undefined}
+   * @api
+   */
+  this.frameState = opt_frameState;
+
+  /**
+   * Canvas context. Only available when a Canvas renderer is used, null
+   * otherwise.
+   * @type {CanvasRenderingContext2D|null|undefined}
+   * @api
+   */
+  this.context = opt_context;
+
+  /**
+   * WebGL context. Only available when a WebGL renderer is used, null
+   * otherwise.
+   * @type {ol.webgl.Context|null|undefined}
+   * @api
+   */
+  this.glContext = opt_glContext;
+
+};
+goog.inherits(ol.render.Event, goog.events.Event);
diff --git a/src/ol/render/vector.js b/src/ol/render/vector.js
new file mode 100644
index 0000000..e02c7ad
--- /dev/null
+++ b/src/ol/render/vector.js
@@ -0,0 +1,346 @@
+goog.provide('ol.renderer.vector');
+
+goog.require('goog.asserts');
+goog.require('ol.geom.Circle');
+goog.require('ol.geom.GeometryCollection');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.render.IReplayGroup');
+goog.require('ol.style.ImageState');
+goog.require('ol.style.Style');
+
+
+/**
+ * @param {ol.Feature} feature1 Feature 1.
+ * @param {ol.Feature} feature2 Feature 2.
+ * @return {number} Order.
+ */
+ol.renderer.vector.defaultOrder = function(feature1, feature2) {
+  return goog.getUid(feature1) - goog.getUid(feature2);
+};
+
+
+/**
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @return {number} Squared pixel tolerance.
+ */
+ol.renderer.vector.getSquaredTolerance = function(resolution, pixelRatio) {
+  var tolerance = ol.renderer.vector.getTolerance(resolution, pixelRatio);
+  return tolerance * tolerance;
+};
+
+
+/**
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @return {number} Pixel tolerance.
+ */
+ol.renderer.vector.getTolerance = function(resolution, pixelRatio) {
+  return ol.SIMPLIFY_TOLERANCE * resolution / pixelRatio;
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.style.Style} style Style.
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.renderer.vector.renderCircleGeometry_ =
+    function(replayGroup, geometry, style, feature) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.Circle);
+  var fillStyle = style.getFill();
+  var strokeStyle = style.getStroke();
+  if (!goog.isNull(fillStyle) || !goog.isNull(strokeStyle)) {
+    var polygonReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.POLYGON);
+    polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle);
+    polygonReplay.drawCircleGeometry(geometry, feature);
+  }
+  var textStyle = style.getText();
+  if (!goog.isNull(textStyle)) {
+    var textReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.TEXT);
+    textReplay.setTextStyle(textStyle);
+    textReplay.drawText(geometry.getCenter(), 0, 2, 2, geometry, feature);
+  }
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.Feature} feature Feature.
+ * @param {ol.style.Style} style Style.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @param {function(this: T, goog.events.Event)} listener Listener function.
+ * @param {T} thisArg Value to use as `this` when executing `listener`.
+ * @return {boolean} `true` if style is loading.
+ * @template T
+ */
+ol.renderer.vector.renderFeature = function(
+    replayGroup, feature, style, squaredTolerance, listener, thisArg) {
+  var loading = false;
+  var imageStyle, imageState;
+  imageStyle = style.getImage();
+  if (goog.isNull(imageStyle)) {
+    ol.renderer.vector.renderFeature_(
+        replayGroup, feature, style, squaredTolerance);
+  } else {
+    imageState = imageStyle.getImageState();
+    if (imageState == ol.style.ImageState.LOADED ||
+        imageState == ol.style.ImageState.ERROR) {
+      imageStyle.unlistenImageChange(listener, thisArg);
+      if (imageState == ol.style.ImageState.LOADED) {
+        ol.renderer.vector.renderFeature_(
+            replayGroup, feature, style, squaredTolerance);
+      }
+    } else {
+      if (imageState == ol.style.ImageState.IDLE) {
+        imageStyle.load();
+      }
+      imageState = imageStyle.getImageState();
+      goog.asserts.assert(imageState == ol.style.ImageState.LOADING);
+      imageStyle.listenImageChange(listener, thisArg);
+      loading = true;
+    }
+  }
+  return loading;
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.Feature} feature Feature.
+ * @param {ol.style.Style} style Style.
+ * @param {number} squaredTolerance Squared tolerance.
+ * @private
+ */
+ol.renderer.vector.renderFeature_ = function(
+    replayGroup, feature, style, squaredTolerance) {
+  var geometry = style.getGeometryFunction()(feature);
+  if (!goog.isDefAndNotNull(geometry)) {
+    return;
+  }
+  var simplifiedGeometry = geometry.getSimplifiedGeometry(squaredTolerance);
+  var geometryRenderer =
+      ol.renderer.vector.GEOMETRY_RENDERERS_[simplifiedGeometry.getType()];
+  goog.asserts.assert(goog.isDef(geometryRenderer));
+  geometryRenderer(replayGroup, simplifiedGeometry, style, feature);
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.style.Style} style Style.
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.renderer.vector.renderGeometryCollectionGeometry_ =
+    function(replayGroup, geometry, style, feature) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.GeometryCollection);
+  var geometries = geometry.getGeometriesArray();
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    var geometryRenderer =
+        ol.renderer.vector.GEOMETRY_RENDERERS_[geometries[i].getType()];
+    goog.asserts.assert(goog.isDef(geometryRenderer));
+    geometryRenderer(replayGroup, geometries[i], style, feature);
+  }
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.style.Style} style Style.
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.renderer.vector.renderLineStringGeometry_ =
+    function(replayGroup, geometry, style, feature) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.LineString);
+  var strokeStyle = style.getStroke();
+  if (!goog.isNull(strokeStyle)) {
+    var lineStringReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.LINE_STRING);
+    lineStringReplay.setFillStrokeStyle(null, strokeStyle);
+    lineStringReplay.drawLineStringGeometry(geometry, feature);
+  }
+  var textStyle = style.getText();
+  if (!goog.isNull(textStyle)) {
+    var textReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.TEXT);
+    textReplay.setTextStyle(textStyle);
+    textReplay.drawText(geometry.getFlatMidpoint(), 0, 2, 2, geometry, feature);
+  }
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.style.Style} style Style.
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.renderer.vector.renderMultiLineStringGeometry_ =
+    function(replayGroup, geometry, style, feature) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.MultiLineString);
+  var strokeStyle = style.getStroke();
+  if (!goog.isNull(strokeStyle)) {
+    var lineStringReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.LINE_STRING);
+    lineStringReplay.setFillStrokeStyle(null, strokeStyle);
+    lineStringReplay.drawMultiLineStringGeometry(geometry, feature);
+  }
+  var textStyle = style.getText();
+  if (!goog.isNull(textStyle)) {
+    var textReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.TEXT);
+    textReplay.setTextStyle(textStyle);
+    var flatMidpointCoordinates = geometry.getFlatMidpoints();
+    textReplay.drawText(flatMidpointCoordinates, 0,
+        flatMidpointCoordinates.length, 2, geometry, feature);
+  }
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.style.Style} style Style.
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.renderer.vector.renderMultiPolygonGeometry_ =
+    function(replayGroup, geometry, style, feature) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.MultiPolygon);
+  var fillStyle = style.getFill();
+  var strokeStyle = style.getStroke();
+  if (!goog.isNull(strokeStyle) || !goog.isNull(fillStyle)) {
+    var polygonReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.POLYGON);
+    polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle);
+    polygonReplay.drawMultiPolygonGeometry(geometry, feature);
+  }
+  var textStyle = style.getText();
+  if (!goog.isNull(textStyle)) {
+    var textReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.TEXT);
+    textReplay.setTextStyle(textStyle);
+    var flatInteriorPointCoordinates = geometry.getFlatInteriorPoints();
+    textReplay.drawText(flatInteriorPointCoordinates, 0,
+        flatInteriorPointCoordinates.length, 2, geometry, feature);
+  }
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.style.Style} style Style.
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.renderer.vector.renderPointGeometry_ =
+    function(replayGroup, geometry, style, feature) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.Point);
+  var imageStyle = style.getImage();
+  if (!goog.isNull(imageStyle)) {
+    var imageReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.IMAGE);
+    imageReplay.setImageStyle(imageStyle);
+    imageReplay.drawPointGeometry(geometry, feature);
+  }
+  var textStyle = style.getText();
+  if (!goog.isNull(textStyle)) {
+    var textReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.TEXT);
+    textReplay.setTextStyle(textStyle);
+    textReplay.drawText(geometry.getCoordinates(), 0, 2, 2, geometry, feature);
+  }
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.style.Style} style Style.
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.renderer.vector.renderMultiPointGeometry_ =
+    function(replayGroup, geometry, style, feature) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.MultiPoint);
+  var imageStyle = style.getImage();
+  if (!goog.isNull(imageStyle)) {
+    var imageReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.IMAGE);
+    imageReplay.setImageStyle(imageStyle);
+    imageReplay.drawMultiPointGeometry(geometry, feature);
+  }
+  var textStyle = style.getText();
+  if (!goog.isNull(textStyle)) {
+    var textReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.TEXT);
+    textReplay.setTextStyle(textStyle);
+    var flatCoordinates = geometry.getFlatCoordinates();
+    textReplay.drawText(flatCoordinates, 0, flatCoordinates.length,
+        geometry.getStride(), geometry, feature);
+  }
+};
+
+
+/**
+ * @param {ol.render.IReplayGroup} replayGroup Replay group.
+ * @param {ol.geom.Geometry} geometry Geometry.
+ * @param {ol.style.Style} style Style.
+ * @param {ol.Feature} feature Feature.
+ * @private
+ */
+ol.renderer.vector.renderPolygonGeometry_ =
+    function(replayGroup, geometry, style, feature) {
+  goog.asserts.assertInstanceof(geometry, ol.geom.Polygon);
+  var fillStyle = style.getFill();
+  var strokeStyle = style.getStroke();
+  if (!goog.isNull(fillStyle) || !goog.isNull(strokeStyle)) {
+    var polygonReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.POLYGON);
+    polygonReplay.setFillStrokeStyle(fillStyle, strokeStyle);
+    polygonReplay.drawPolygonGeometry(geometry, feature);
+  }
+  var textStyle = style.getText();
+  if (!goog.isNull(textStyle)) {
+    var textReplay = replayGroup.getReplay(
+        style.getZIndex(), ol.render.ReplayType.TEXT);
+    textReplay.setTextStyle(textStyle);
+    textReplay.drawText(
+        geometry.getFlatInteriorPoint(), 0, 2, 2, geometry, feature);
+  }
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Object.<ol.geom.GeometryType,
+ *                function(ol.render.IReplayGroup, ol.geom.Geometry,
+ *                         ol.style.Style, Object)>}
+ */
+ol.renderer.vector.GEOMETRY_RENDERERS_ = {
+  'Point': ol.renderer.vector.renderPointGeometry_,
+  'LineString': ol.renderer.vector.renderLineStringGeometry_,
+  'Polygon': ol.renderer.vector.renderPolygonGeometry_,
+  'MultiPoint': ol.renderer.vector.renderMultiPointGeometry_,
+  'MultiLineString': ol.renderer.vector.renderMultiLineStringGeometry_,
+  'MultiPolygon': ol.renderer.vector.renderMultiPolygonGeometry_,
+  'GeometryCollection': ol.renderer.vector.renderGeometryCollectionGeometry_,
+  'Circle': ol.renderer.vector.renderCircleGeometry_
+};
diff --git a/src/ol/render/webgl/webglimagecolor.glsl b/src/ol/render/webgl/webglimagecolor.glsl
new file mode 100644
index 0000000..56e045f
--- /dev/null
+++ b/src/ol/render/webgl/webglimagecolor.glsl
@@ -0,0 +1,46 @@
+//! NAMESPACE=ol.render.webgl.imagereplay.shader.Color
+//! CLASS=ol.render.webgl.imagereplay.shader.Color
+
+
+//! COMMON
+varying vec2 v_texCoord;
+varying float v_opacity;
+
+//! VERTEX
+attribute vec2 a_position;
+attribute vec2 a_texCoord;
+attribute vec2 a_offsets;
+attribute float a_opacity;
+attribute float a_rotateWithView;
+
+uniform mat4 u_projectionMatrix;
+uniform mat4 u_offsetScaleMatrix;
+uniform mat4 u_offsetRotateMatrix;
+
+void main(void) {
+  mat4 offsetMatrix = u_offsetScaleMatrix;
+  if (a_rotateWithView == 1.0) {
+    offsetMatrix = u_offsetScaleMatrix * u_offsetRotateMatrix;
+  }
+  vec4 offsets = offsetMatrix * vec4(a_offsets, 0., 0.);
+  gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.) + offsets;
+  v_texCoord = a_texCoord;
+  v_opacity = a_opacity;
+}
+
+
+//! FRAGMENT
+// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp
+uniform mat4 u_colorMatrix;
+uniform float u_opacity;
+uniform sampler2D u_image;
+
+void main(void) {
+  vec4 texColor = texture2D(u_image, v_texCoord);
+  float alpha = texColor.a * v_opacity * u_opacity;
+  if (alpha == 0.0) {
+    discard;
+  }
+  gl_FragColor.a = alpha;
+  gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;
+}
diff --git a/src/ol/render/webgl/webglimagecolorshader.js b/src/ol/render/webgl/webglimagecolorshader.js
new file mode 100644
index 0000000..94f1b8a
--- /dev/null
+++ b/src/ol/render/webgl/webglimagecolorshader.js
@@ -0,0 +1,153 @@
+// This file is automatically generated, do not edit
+goog.provide('ol.render.webgl.imagereplay.shader.Color');
+
+goog.require('ol.webgl.shader');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Fragment}
+ * @struct
+ */
+ol.render.webgl.imagereplay.shader.ColorFragment = function() {
+  goog.base(this, ol.render.webgl.imagereplay.shader.ColorFragment.SOURCE);
+};
+goog.inherits(ol.render.webgl.imagereplay.shader.ColorFragment, ol.webgl.shader.Fragment);
+goog.addSingletonGetter(ol.render.webgl.imagereplay.shader.ColorFragment);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.ColorFragment.DEBUG_SOURCE = 'precision mediump float;\nvarying vec2 v_texCoord;\nvarying float v_opacity;\n\n// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp\nuniform mat4 u_colorMatrix;\nuniform float u_opacity;\nuniform sampler2D u_image;\n\nvoid main(void) {\n  vec4 texColor = texture2D(u_image, v_texCoord);\n  float alpha = texColor.a * v_opacity * u_opacity;\n  if (alph [...]
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.ColorFragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;varying float b;uniform mat4 k;uniform float l;uniform sampler2D m;void main(void){vec4 texColor=texture2D(m,a);float alpha=texColor.a*b*l;if(alpha==0.0){discard;}gl_FragColor.a=alpha;gl_FragColor.rgb=(k*vec4(texColor.rgb,1.)).rgb;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.ColorFragment.SOURCE = goog.DEBUG ?
+    ol.render.webgl.imagereplay.shader.ColorFragment.DEBUG_SOURCE :
+    ol.render.webgl.imagereplay.shader.ColorFragment.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Vertex}
+ * @struct
+ */
+ol.render.webgl.imagereplay.shader.ColorVertex = function() {
+  goog.base(this, ol.render.webgl.imagereplay.shader.ColorVertex.SOURCE);
+};
+goog.inherits(ol.render.webgl.imagereplay.shader.ColorVertex, ol.webgl.shader.Vertex);
+goog.addSingletonGetter(ol.render.webgl.imagereplay.shader.ColorVertex);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.ColorVertex.DEBUG_SOURCE = 'varying vec2 v_texCoord;\nvarying float v_opacity;\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nattribute vec2 a_offsets;\nattribute float a_opacity;\nattribute float a_rotateWithView;\n\nuniform mat4 u_projectionMatrix;\nuniform mat4 u_offsetScaleMatrix;\nuniform mat4 u_offsetRotateMatrix;\n\nvoid main(void) {\n  mat4 offsetMatrix = u_offsetScaleMatrix;\n  if (a_rotateWithView == 1.0) {\n    offsetMatrix = u_of [...]
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.ColorVertex.OPTIMIZED_SOURCE = 'varying vec2 a;varying float b;attribute vec2 c;attribute vec2 d;attribute vec2 e;attribute float f;attribute float g;uniform mat4 h;uniform mat4 i;uniform mat4 j;void main(void){mat4 offsetMatrix=i;if(g==1.0){offsetMatrix=i*j;}vec4 offsets=offsetMatrix*vec4(e,0.,0.);gl_Position=h*vec4(c,0.,1.)+offsets;a=d;b=f;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.ColorVertex.SOURCE = goog.DEBUG ?
+    ol.render.webgl.imagereplay.shader.ColorVertex.DEBUG_SOURCE :
+    ol.render.webgl.imagereplay.shader.ColorVertex.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @param {WebGLRenderingContext} gl GL.
+ * @param {WebGLProgram} program Program.
+ * @struct
+ */
+ol.render.webgl.imagereplay.shader.Color.Locations = function(gl, program) {
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_colorMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_colorMatrix' : 'k');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_image = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_image' : 'm');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_offsetRotateMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_offsetRotateMatrix' : 'j');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_offsetScaleMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_offsetScaleMatrix' : 'i');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_opacity = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_opacity' : 'l');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_projectionMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_projectionMatrix' : 'h');
+
+  /**
+   * @type {number}
+   */
+  this.a_offsets = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_offsets' : 'e');
+
+  /**
+   * @type {number}
+   */
+  this.a_opacity = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_opacity' : 'f');
+
+  /**
+   * @type {number}
+   */
+  this.a_position = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_position' : 'c');
+
+  /**
+   * @type {number}
+   */
+  this.a_rotateWithView = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_rotateWithView' : 'g');
+
+  /**
+   * @type {number}
+   */
+  this.a_texCoord = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_texCoord' : 'd');
+};
diff --git a/src/ol/render/webgl/webglimagedefault.glsl b/src/ol/render/webgl/webglimagedefault.glsl
new file mode 100644
index 0000000..15d2bce
--- /dev/null
+++ b/src/ol/render/webgl/webglimagedefault.glsl
@@ -0,0 +1,44 @@
+//! NAMESPACE=ol.render.webgl.imagereplay.shader.Default
+//! CLASS=ol.render.webgl.imagereplay.shader.Default
+
+
+//! COMMON
+varying vec2 v_texCoord;
+varying float v_opacity;
+
+//! VERTEX
+attribute vec2 a_position;
+attribute vec2 a_texCoord;
+attribute vec2 a_offsets;
+attribute float a_opacity;
+attribute float a_rotateWithView;
+
+uniform mat4 u_projectionMatrix;
+uniform mat4 u_offsetScaleMatrix;
+uniform mat4 u_offsetRotateMatrix;
+
+void main(void) {
+  mat4 offsetMatrix = u_offsetScaleMatrix;
+  if (a_rotateWithView == 1.0) {
+    offsetMatrix = u_offsetScaleMatrix * u_offsetRotateMatrix;
+  }
+  vec4 offsets = offsetMatrix * vec4(a_offsets, 0., 0.);
+  gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.) + offsets;
+  v_texCoord = a_texCoord;
+  v_opacity = a_opacity;
+}
+
+
+//! FRAGMENT
+uniform float u_opacity;
+uniform sampler2D u_image;
+
+void main(void) {
+  vec4 texColor = texture2D(u_image, v_texCoord);
+  gl_FragColor.rgb = texColor.rgb;
+  float alpha = texColor.a * v_opacity * u_opacity;
+  if (alpha == 0.0) {
+    discard;
+  }
+  gl_FragColor.a = alpha;
+}
diff --git a/src/ol/render/webgl/webglimagedefaultshader.js b/src/ol/render/webgl/webglimagedefaultshader.js
new file mode 100644
index 0000000..7df0fe2
--- /dev/null
+++ b/src/ol/render/webgl/webglimagedefaultshader.js
@@ -0,0 +1,147 @@
+// This file is automatically generated, do not edit
+goog.provide('ol.render.webgl.imagereplay.shader.Default');
+
+goog.require('ol.webgl.shader');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Fragment}
+ * @struct
+ */
+ol.render.webgl.imagereplay.shader.DefaultFragment = function() {
+  goog.base(this, ol.render.webgl.imagereplay.shader.DefaultFragment.SOURCE);
+};
+goog.inherits(ol.render.webgl.imagereplay.shader.DefaultFragment, ol.webgl.shader.Fragment);
+goog.addSingletonGetter(ol.render.webgl.imagereplay.shader.DefaultFragment);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.DefaultFragment.DEBUG_SOURCE = 'precision mediump float;\nvarying vec2 v_texCoord;\nvarying float v_opacity;\n\nuniform float u_opacity;\nuniform sampler2D u_image;\n\nvoid main(void) {\n  vec4 texColor = texture2D(u_image, v_texCoord);\n  gl_FragColor.rgb = texColor.rgb;\n  float alpha = texColor.a * v_opacity * u_opacity;\n  if (alpha == 0.0) {\n    discard;\n  }\n  gl_FragColor.a = alpha;\n}\n';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.DefaultFragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;varying float b;uniform float k;uniform sampler2D l;void main(void){vec4 texColor=texture2D(l,a);gl_FragColor.rgb=texColor.rgb;float alpha=texColor.a*b*k;if(alpha==0.0){discard;}gl_FragColor.a=alpha;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.DefaultFragment.SOURCE = goog.DEBUG ?
+    ol.render.webgl.imagereplay.shader.DefaultFragment.DEBUG_SOURCE :
+    ol.render.webgl.imagereplay.shader.DefaultFragment.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Vertex}
+ * @struct
+ */
+ol.render.webgl.imagereplay.shader.DefaultVertex = function() {
+  goog.base(this, ol.render.webgl.imagereplay.shader.DefaultVertex.SOURCE);
+};
+goog.inherits(ol.render.webgl.imagereplay.shader.DefaultVertex, ol.webgl.shader.Vertex);
+goog.addSingletonGetter(ol.render.webgl.imagereplay.shader.DefaultVertex);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.DefaultVertex.DEBUG_SOURCE = 'varying vec2 v_texCoord;\nvarying float v_opacity;\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nattribute vec2 a_offsets;\nattribute float a_opacity;\nattribute float a_rotateWithView;\n\nuniform mat4 u_projectionMatrix;\nuniform mat4 u_offsetScaleMatrix;\nuniform mat4 u_offsetRotateMatrix;\n\nvoid main(void) {\n  mat4 offsetMatrix = u_offsetScaleMatrix;\n  if (a_rotateWithView == 1.0) {\n    offsetMatrix = u_ [...]
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.DefaultVertex.OPTIMIZED_SOURCE = 'varying vec2 a;varying float b;attribute vec2 c;attribute vec2 d;attribute vec2 e;attribute float f;attribute float g;uniform mat4 h;uniform mat4 i;uniform mat4 j;void main(void){mat4 offsetMatrix=i;if(g==1.0){offsetMatrix=i*j;}vec4 offsets=offsetMatrix*vec4(e,0.,0.);gl_Position=h*vec4(c,0.,1.)+offsets;a=d;b=f;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.render.webgl.imagereplay.shader.DefaultVertex.SOURCE = goog.DEBUG ?
+    ol.render.webgl.imagereplay.shader.DefaultVertex.DEBUG_SOURCE :
+    ol.render.webgl.imagereplay.shader.DefaultVertex.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @param {WebGLRenderingContext} gl GL.
+ * @param {WebGLProgram} program Program.
+ * @struct
+ */
+ol.render.webgl.imagereplay.shader.Default.Locations = function(gl, program) {
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_image = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_image' : 'l');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_offsetRotateMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_offsetRotateMatrix' : 'j');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_offsetScaleMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_offsetScaleMatrix' : 'i');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_opacity = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_opacity' : 'k');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_projectionMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_projectionMatrix' : 'h');
+
+  /**
+   * @type {number}
+   */
+  this.a_offsets = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_offsets' : 'e');
+
+  /**
+   * @type {number}
+   */
+  this.a_opacity = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_opacity' : 'f');
+
+  /**
+   * @type {number}
+   */
+  this.a_position = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_position' : 'c');
+
+  /**
+   * @type {number}
+   */
+  this.a_rotateWithView = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_rotateWithView' : 'g');
+
+  /**
+   * @type {number}
+   */
+  this.a_texCoord = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_texCoord' : 'd');
+};
diff --git a/src/ol/render/webgl/webglimmediate.js b/src/ol/render/webgl/webglimmediate.js
new file mode 100644
index 0000000..4c07223
--- /dev/null
+++ b/src/ol/render/webgl/webglimmediate.js
@@ -0,0 +1,300 @@
+goog.provide('ol.render.webgl.Immediate');
+goog.require('goog.array');
+goog.require('goog.object');
+goog.require('ol.extent');
+goog.require('ol.render.webgl.ReplayGroup');
+
+
+
+/**
+ * @constructor
+ * @implements {ol.render.IVectorContext}
+ * @param {ol.webgl.Context} context Context.
+ * @param {ol.Coordinate} center Center.
+ * @param {number} resolution Resolution.
+ * @param {number} rotation Rotation.
+ * @param {ol.Size} size Size.
+ * @param {ol.Extent} extent Extent.
+ * @param {number} pixelRatio Pixel ratio.
+ * @struct
+ */
+ol.render.webgl.Immediate = function(context,
+    center, resolution, rotation, size, extent, pixelRatio) {
+
+  /**
+   * @private
+   */
+  this.context_ = context;
+
+  /**
+   * @private
+   */
+  this.center_ = center;
+
+  /**
+   * @private
+   */
+  this.extent_ = extent;
+
+  /**
+   * @private
+   */
+  this.pixelRatio_ = pixelRatio;
+
+  /**
+   * @private
+   */
+  this.size_ = size;
+
+  /**
+   * @private
+   */
+  this.rotation_ = rotation;
+
+  /**
+   * @private
+   */
+  this.resolution_ = resolution;
+
+  /**
+   * @private
+   * @type {ol.style.Image}
+   */
+  this.imageStyle_ = null;
+
+  /**
+   * @private
+   * @type {Object.<string,
+   *        Array.<function(ol.render.webgl.Immediate)>>}
+   */
+  this.callbacksByZIndex_ = {};
+};
+
+
+/**
+ * FIXME: empty description for jsdoc
+ */
+ol.render.webgl.Immediate.prototype.flush = function() {
+  /** @type {Array.<number>} */
+  var zs = goog.array.map(goog.object.getKeys(this.callbacksByZIndex_), Number);
+  goog.array.sort(zs);
+  var i, ii, callbacks, j, jj;
+  for (i = 0, ii = zs.length; i < ii; ++i) {
+    callbacks = this.callbacksByZIndex_[zs[i].toString()];
+    for (j = 0, jj = callbacks.length; j < jj; ++j) {
+      callbacks[j](this);
+    }
+  }
+};
+
+
+/**
+ * @param {number} zIndex Z index.
+ * @param {function(ol.render.webgl.Immediate)} callback Callback.
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawAsync = function(zIndex, callback) {
+  var zIndexKey = zIndex.toString();
+  var callbacks = this.callbacksByZIndex_[zIndexKey];
+  if (goog.isDef(callbacks)) {
+    callbacks.push(callback);
+  } else {
+    this.callbacksByZIndex_[zIndexKey] = [callback];
+  }
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawCircleGeometry =
+    function(circleGeometry, data) {
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawFeature = function(feature, style) {
+  var geometry = style.getGeometryFunction()(feature);
+  if (!goog.isDefAndNotNull(geometry) ||
+      !ol.extent.intersects(this.extent_, geometry.getExtent())) {
+    return;
+  }
+  var zIndex = style.getZIndex();
+  if (!goog.isDef(zIndex)) {
+    zIndex = 0;
+  }
+  this.drawAsync(zIndex, function(render) {
+    render.setFillStrokeStyle(style.getFill(), style.getStroke());
+    render.setImageStyle(style.getImage());
+    render.setTextStyle(style.getText());
+    var type = geometry.getType();
+    var renderGeometry = ol.render.webgl.Immediate.GEOMETRY_RENDERERS_[type];
+    // Do not assert since all kinds of geometries are not handled yet.
+    // In spite, render what we support.
+    if (renderGeometry) {
+      renderGeometry.call(render, geometry, null);
+    }
+  });
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawGeometryCollectionGeometry =
+    function(geometryCollectionGeometry, data) {
+  var geometries = geometryCollectionGeometry.getGeometriesArray();
+  var renderers = ol.render.webgl.Immediate.GEOMETRY_RENDERERS_;
+  var i, ii;
+  for (i = 0, ii = geometries.length; i < ii; ++i) {
+    var geometry = geometries[i];
+    var geometryRenderer = renderers[geometry.getType()];
+    // Do not assert since all kinds of geometries are not handled yet.
+    // In order to support hierarchies, delegate instead what we can to
+    // valid renderers.
+    if (geometryRenderer) {
+      geometryRenderer.call(this, geometry, data);
+    }
+  }
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawPointGeometry =
+    function(pointGeometry, data) {
+  var context = this.context_;
+  var replayGroup = new ol.render.webgl.ReplayGroup(1, this.extent_);
+  var replay = replayGroup.getReplay(0, ol.render.ReplayType.IMAGE);
+  replay.setImageStyle(this.imageStyle_);
+  replay.drawPointGeometry(pointGeometry, data);
+  replay.finish(context);
+  // default colors
+  var opacity = 1;
+  var brightness = 0;
+  var contrast = 1;
+  var hue = 0;
+  var saturation = 1;
+  replay.replay(this.context_, this.center_, this.resolution_, this.rotation_,
+      this.size_, this.extent_, this.pixelRatio_, opacity, brightness,
+      contrast, hue, saturation, {});
+  replay.getDeleteResourcesFunction(context)();
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawLineStringGeometry =
+    function(lineStringGeometry, data) {
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawMultiLineStringGeometry =
+    function(multiLineStringGeometry, data) {
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawMultiPointGeometry =
+    function(multiPointGeometry, data) {
+  var context = this.context_;
+  var replayGroup = new ol.render.webgl.ReplayGroup(1, this.extent_);
+  var replay = replayGroup.getReplay(0, ol.render.ReplayType.IMAGE);
+  replay.setImageStyle(this.imageStyle_);
+  replay.drawMultiPointGeometry(multiPointGeometry, data);
+  replay.finish(context);
+  // default colors
+  var opacity = 1;
+  var brightness = 0;
+  var contrast = 1;
+  var hue = 0;
+  var saturation = 1;
+  replay.replay(this.context_, this.center_, this.resolution_, this.rotation_,
+      this.size_, this.extent_, this.pixelRatio_, opacity, brightness,
+      contrast, hue, saturation, {});
+  replay.getDeleteResourcesFunction(context)();
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawMultiPolygonGeometry =
+    function(multiPolygonGeometry, data) {
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawPolygonGeometry =
+    function(polygonGeometry, data) {
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.drawText =
+    function(flatCoordinates, offset, end, stride, geometry, data) {
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.setFillStrokeStyle =
+    function(fillStyle, strokeStyle) {
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.setImageStyle = function(imageStyle) {
+  this.imageStyle_ = imageStyle;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.render.webgl.Immediate.prototype.setTextStyle = function(textStyle) {
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Object.<ol.geom.GeometryType,
+ *                function(this: ol.render.webgl.Immediate, ol.geom.Geometry,
+ *                         Object)>}
+ */
+ol.render.webgl.Immediate.GEOMETRY_RENDERERS_ = {
+  'Point': ol.render.webgl.Immediate.prototype.drawPointGeometry,
+  'MultiPoint': ol.render.webgl.Immediate.prototype.drawMultiPointGeometry,
+  'GeometryCollection':
+      ol.render.webgl.Immediate.prototype.drawGeometryCollectionGeometry
+};
diff --git a/src/ol/render/webgl/webglreplay.js b/src/ol/render/webgl/webglreplay.js
new file mode 100644
index 0000000..6878500
--- /dev/null
+++ b/src/ol/render/webgl/webglreplay.js
@@ -0,0 +1,822 @@
+goog.provide('ol.render.webgl.ImageReplay');
+goog.provide('ol.render.webgl.ReplayGroup');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.functions');
+goog.require('goog.object');
+goog.require('goog.vec.Mat4');
+goog.require('ol.color.Matrix');
+goog.require('ol.extent');
+goog.require('ol.render.IReplayGroup');
+goog.require('ol.render.webgl.imagereplay.shader.Color');
+goog.require('ol.render.webgl.imagereplay.shader.Default');
+goog.require('ol.vec.Mat4');
+goog.require('ol.webgl.Buffer');
+
+
+
+/**
+ * @constructor
+ * @implements {ol.render.IVectorContext}
+ * @param {number} tolerance Tolerance.
+ * @param {ol.Extent} maxExtent Max extent.
+ * @protected
+ * @struct
+ */
+ol.render.webgl.ImageReplay = function(tolerance, maxExtent) {
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.anchorX_ = undefined;
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.anchorY_ = undefined;
+
+  /**
+   * @private
+   * @type {ol.color.Matrix}
+   */
+  this.colorMatrix_ = new ol.color.Matrix();
+
+  /**
+   * The origin of the coordinate system for the point coordinates sent to
+   * the GPU. To eliminate jitter caused by precision problems in the GPU
+   * we use the "Rendering Relative to Eye" technique described in the "3D
+   * Engine Design for Virtual Globes" book.
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.origin_ = ol.extent.getCenter(maxExtent);
+
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+  this.groupIndices_ = [];
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.height_ = undefined;
+
+  /**
+   * @type {Array.<HTMLCanvasElement|HTMLImageElement|HTMLVideoElement>}
+   * @private
+   */
+  this.images_ = [];
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.imageHeight_ = undefined;
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.imageWidth_ = undefined;
+
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+  this.indices_ = [];
+
+  /**
+   * @type {ol.webgl.Buffer}
+   * @private
+   */
+  this.indicesBuffer_ = null;
+
+  /**
+   * @private
+   * @type {ol.render.webgl.imagereplay.shader.Color.Locations}
+   */
+  this.colorLocations_ = null;
+
+  /**
+   * @private
+   * @type {ol.render.webgl.imagereplay.shader.Default.Locations}
+   */
+  this.defaultLocations_ = null;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.opacity_ = undefined;
+
+  /**
+   * @type {!goog.vec.Mat4.Number}
+   * @private
+   */
+  this.offsetRotateMatrix_ = goog.vec.Mat4.createNumberIdentity();
+
+  /**
+   * @type {!goog.vec.Mat4.Number}
+   * @private
+   */
+  this.offsetScaleMatrix_ = goog.vec.Mat4.createNumberIdentity();
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.originX_ = undefined;
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.originY_ = undefined;
+
+  /**
+   * @type {!goog.vec.Mat4.Number}
+   * @private
+   */
+  this.projectionMatrix_ = goog.vec.Mat4.createNumberIdentity();
+
+  /**
+   * @private
+   * @type {boolean|undefined}
+   */
+  this.rotateWithView_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.rotation_ = undefined;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.scale_ = undefined;
+
+  /**
+   * @type {Array.<WebGLTexture>}
+   * @private
+   */
+  this.textures_ = [];
+
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+  this.vertices_ = [];
+
+  /**
+   * @type {ol.webgl.Buffer}
+   * @private
+   */
+  this.verticesBuffer_ = null;
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.width_ = undefined;
+
+};
+
+
+/**
+ * @param {ol.webgl.Context} context WebGL context.
+ * @return {function()} Delete resources function.
+ */
+ol.render.webgl.ImageReplay.prototype.getDeleteResourcesFunction =
+    function(context) {
+  // We only delete our stuff here. The shaders and the program may
+  // be used by other ImageReplay instances (for other layers). And
+  // they will be deleted when disposing of the ol.webgl.Context
+  // object.
+  goog.asserts.assert(!goog.isNull(this.verticesBuffer_));
+  goog.asserts.assert(!goog.isNull(this.indicesBuffer_));
+  var verticesBuffer = this.verticesBuffer_;
+  var indicesBuffer = this.indicesBuffer_;
+  var textures = this.textures_;
+  var gl = context.getGL();
+  return function() {
+    if (!gl.isContextLost()) {
+      var i, ii;
+      for (i = 0, ii = textures.length; i < ii; ++i) {
+        gl.deleteTexture(textures[i]);
+      }
+    }
+    context.deleteBuffer(verticesBuffer);
+    context.deleteBuffer(indicesBuffer);
+  };
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawAsync = goog.abstractMethod;
+
+
+/**
+ * @param {Array.<number>} flatCoordinates Flat coordinates.
+ * @param {number} offset Offset.
+ * @param {number} end End.
+ * @param {number} stride Stride.
+ * @return {number} My end.
+ * @private
+ */
+ol.render.webgl.ImageReplay.prototype.drawCoordinates_ =
+    function(flatCoordinates, offset, end, stride) {
+  goog.asserts.assert(goog.isDef(this.anchorX_));
+  goog.asserts.assert(goog.isDef(this.anchorY_));
+  goog.asserts.assert(goog.isDef(this.height_));
+  goog.asserts.assert(goog.isDef(this.imageHeight_));
+  goog.asserts.assert(goog.isDef(this.imageWidth_));
+  goog.asserts.assert(goog.isDef(this.opacity_));
+  goog.asserts.assert(goog.isDef(this.originX_));
+  goog.asserts.assert(goog.isDef(this.originY_));
+  goog.asserts.assert(goog.isDef(this.rotateWithView_));
+  goog.asserts.assert(goog.isDef(this.rotation_));
+  goog.asserts.assert(goog.isDef(this.scale_));
+  goog.asserts.assert(goog.isDef(this.width_));
+  var anchorX = this.anchorX_;
+  var anchorY = this.anchorY_;
+  var height = this.height_;
+  var imageHeight = this.imageHeight_;
+  var imageWidth = this.imageWidth_;
+  var opacity = this.opacity_;
+  var originX = this.originX_;
+  var originY = this.originY_;
+  var rotateWithView = this.rotateWithView_ ? 1.0 : 0.0;
+  var rotation = this.rotation_;
+  var scale = this.scale_;
+  var width = this.width_;
+  var cos = Math.cos(rotation);
+  var sin = Math.sin(rotation);
+  var numIndices = this.indices_.length;
+  var numVertices = this.vertices_.length;
+  var i, n, offsetX, offsetY, x, y;
+  for (i = offset; i < end; i += stride) {
+    x = flatCoordinates[i] - this.origin_[0];
+    y = flatCoordinates[i + 1] - this.origin_[1];
+
+    // There are 4 vertices per [x, y] point, one for each corner of the
+    // rectangle we're going to draw. We'd use 1 vertex per [x, y] point if
+    // WebGL supported Geometry Shaders (which can emit new vertices), but that
+    // is not currently the case.
+    //
+    // And each vertex includes 8 values: the x and y coordinates, the x and
+    // y offsets used to calculate the position of the corner, the u and
+    // v texture coordinates for the corner, the opacity, and whether the
+    // the image should be rotated with the view (rotateWithView).
+
+    n = numVertices / 8;
+
+    // bottom-left corner
+    offsetX = -scale * anchorX;
+    offsetY = -scale * (height - anchorY);
+    this.vertices_[numVertices++] = x;
+    this.vertices_[numVertices++] = y;
+    this.vertices_[numVertices++] = offsetX * cos - offsetY * sin;
+    this.vertices_[numVertices++] = offsetX * sin + offsetY * cos;
+    this.vertices_[numVertices++] = originX / imageWidth;
+    this.vertices_[numVertices++] = (originY + height) / imageHeight;
+    this.vertices_[numVertices++] = opacity;
+    this.vertices_[numVertices++] = rotateWithView;
+
+    // bottom-right corner
+    offsetX = scale * (width - anchorX);
+    offsetY = -scale * (height - anchorY);
+    this.vertices_[numVertices++] = x;
+    this.vertices_[numVertices++] = y;
+    this.vertices_[numVertices++] = offsetX * cos - offsetY * sin;
+    this.vertices_[numVertices++] = offsetX * sin + offsetY * cos;
+    this.vertices_[numVertices++] = (originX + width) / imageWidth;
+    this.vertices_[numVertices++] = (originY + height) / imageHeight;
+    this.vertices_[numVertices++] = opacity;
+    this.vertices_[numVertices++] = rotateWithView;
+
+    // top-right corner
+    offsetX = scale * (width - anchorX);
+    offsetY = scale * anchorY;
+    this.vertices_[numVertices++] = x;
+    this.vertices_[numVertices++] = y;
+    this.vertices_[numVertices++] = offsetX * cos - offsetY * sin;
+    this.vertices_[numVertices++] = offsetX * sin + offsetY * cos;
+    this.vertices_[numVertices++] = (originX + width) / imageWidth;
+    this.vertices_[numVertices++] = originY / imageHeight;
+    this.vertices_[numVertices++] = opacity;
+    this.vertices_[numVertices++] = rotateWithView;
+
+    // top-left corner
+    offsetX = -scale * anchorX;
+    offsetY = scale * anchorY;
+    this.vertices_[numVertices++] = x;
+    this.vertices_[numVertices++] = y;
+    this.vertices_[numVertices++] = offsetX * cos - offsetY * sin;
+    this.vertices_[numVertices++] = offsetX * sin + offsetY * cos;
+    this.vertices_[numVertices++] = originX / imageWidth;
+    this.vertices_[numVertices++] = originY / imageHeight;
+    this.vertices_[numVertices++] = opacity;
+    this.vertices_[numVertices++] = rotateWithView;
+
+    this.indices_[numIndices++] = n;
+    this.indices_[numIndices++] = n + 1;
+    this.indices_[numIndices++] = n + 2;
+    this.indices_[numIndices++] = n;
+    this.indices_[numIndices++] = n + 2;
+    this.indices_[numIndices++] = n + 3;
+  }
+
+  return numVertices;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawCircleGeometry = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawFeature = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawGeometryCollectionGeometry =
+    goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawLineStringGeometry =
+    goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawMultiLineStringGeometry =
+    goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawMultiPointGeometry =
+    function(multiPointGeometry, feature) {
+  var flatCoordinates = multiPointGeometry.getFlatCoordinates();
+  var stride = multiPointGeometry.getStride();
+  this.drawCoordinates_(
+      flatCoordinates, 0, flatCoordinates.length, stride);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawMultiPolygonGeometry =
+    goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawPointGeometry =
+    function(pointGeometry, feature) {
+  var flatCoordinates = pointGeometry.getFlatCoordinates();
+  var stride = pointGeometry.getStride();
+  this.drawCoordinates_(
+      flatCoordinates, 0, flatCoordinates.length, stride);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawPolygonGeometry = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.drawText = goog.abstractMethod;
+
+
+/**
+ * @param {ol.webgl.Context} context Context.
+ */
+ol.render.webgl.ImageReplay.prototype.finish = function(context) {
+  var gl = context.getGL();
+
+  this.groupIndices_.push(this.indices_.length);
+  goog.asserts.assert(this.images_.length == this.groupIndices_.length);
+
+  // create, bind, and populate the vertices buffer
+  this.verticesBuffer_ = new ol.webgl.Buffer(this.vertices_);
+  context.bindBuffer(goog.webgl.ARRAY_BUFFER, this.verticesBuffer_);
+
+  var indices = this.indices_;
+  var bits = context.hasOESElementIndexUint ? 32 : 16;
+  goog.asserts.assert(indices[indices.length - 1] < Math.pow(2, bits),
+      'Too large element index detected [%s] (OES_element_index_uint "%s")',
+      indices[indices.length - 1], context.hasOESElementIndexUint);
+
+  // create, bind, and populate the indices buffer
+  this.indicesBuffer_ = new ol.webgl.Buffer(indices);
+  context.bindBuffer(goog.webgl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer_);
+
+  goog.asserts.assert(this.textures_.length === 0);
+
+  // create textures
+  var texture, image, uid;
+  /** @type {Object.<string, WebGLTexture>} */
+  var texturePerImage = {};
+  var i;
+  var ii = this.images_.length;
+  for (i = 0; i < ii; ++i) {
+    image = this.images_[i];
+
+    uid = goog.getUid(image).toString();
+    if (goog.object.containsKey(texturePerImage, uid)) {
+      texture = goog.object.get(texturePerImage, uid);
+    } else {
+      texture = gl.createTexture();
+      gl.bindTexture(goog.webgl.TEXTURE_2D, texture);
+      gl.texParameteri(goog.webgl.TEXTURE_2D,
+          goog.webgl.TEXTURE_WRAP_S, goog.webgl.CLAMP_TO_EDGE);
+      gl.texParameteri(goog.webgl.TEXTURE_2D,
+          goog.webgl.TEXTURE_WRAP_T, goog.webgl.CLAMP_TO_EDGE);
+      gl.texParameteri(goog.webgl.TEXTURE_2D,
+          goog.webgl.TEXTURE_MIN_FILTER, goog.webgl.LINEAR);
+      gl.texParameteri(goog.webgl.TEXTURE_2D,
+          goog.webgl.TEXTURE_MAG_FILTER, goog.webgl.LINEAR);
+      gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA, goog.webgl.RGBA,
+          goog.webgl.UNSIGNED_BYTE, image);
+      goog.object.set(texturePerImage, uid, texture);
+    }
+    this.textures_[i] = texture;
+  }
+
+  goog.asserts.assert(this.textures_.length == this.groupIndices_.length);
+
+  this.anchorX_ = undefined;
+  this.anchorY_ = undefined;
+  this.height_ = undefined;
+  this.images_ = null;
+  this.imageHeight_ = undefined;
+  this.imageWidth_ = undefined;
+  this.indices_ = null;
+  this.opacity_ = undefined;
+  this.originX_ = undefined;
+  this.originY_ = undefined;
+  this.rotateWithView_ = undefined;
+  this.rotation_ = undefined;
+  this.scale_ = undefined;
+  this.vertices_ = null;
+  this.width_ = undefined;
+};
+
+
+/**
+ * @param {ol.webgl.Context} context Context.
+ * @param {ol.Coordinate} center Center.
+ * @param {number} resolution Resolution.
+ * @param {number} rotation Rotation.
+ * @param {ol.Size} size Size.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {number} opacity Global opacity.
+ * @param {number} brightness Global brightness.
+ * @param {number} contrast Global contrast.
+ * @param {number} hue Global hue.
+ * @param {number} saturation Global saturation.
+ * @param {Object} skippedFeaturesHash Ids of features to skip.
+ * @return {T|undefined} Callback result.
+ * @template T
+ */
+ol.render.webgl.ImageReplay.prototype.replay = function(context,
+    center, resolution, rotation, size, pixelRatio,
+    opacity, brightness, contrast, hue, saturation, skippedFeaturesHash) {
+  var gl = context.getGL();
+
+  // bind the vertices buffer
+  goog.asserts.assert(!goog.isNull(this.verticesBuffer_));
+  context.bindBuffer(goog.webgl.ARRAY_BUFFER, this.verticesBuffer_);
+
+  // bind the indices buffer
+  goog.asserts.assert(!goog.isNull(this.indicesBuffer_));
+  context.bindBuffer(goog.webgl.ELEMENT_ARRAY_BUFFER, this.indicesBuffer_);
+
+  var useColor = brightness || contrast != 1 || hue || saturation != 1;
+
+  // get the program
+  var fragmentShader, vertexShader;
+  if (useColor) {
+    fragmentShader =
+        ol.render.webgl.imagereplay.shader.ColorFragment.getInstance();
+    vertexShader =
+        ol.render.webgl.imagereplay.shader.ColorVertex.getInstance();
+  } else {
+    fragmentShader =
+        ol.render.webgl.imagereplay.shader.DefaultFragment.getInstance();
+    vertexShader =
+        ol.render.webgl.imagereplay.shader.DefaultVertex.getInstance();
+  }
+  var program = context.getProgram(fragmentShader, vertexShader);
+
+  // get the locations
+  var locations;
+  if (useColor) {
+    if (goog.isNull(this.colorLocations_)) {
+      locations =
+          new ol.render.webgl.imagereplay.shader.Color.Locations(gl, program);
+      this.colorLocations_ = locations;
+    } else {
+      locations = this.colorLocations_;
+    }
+  } else {
+    if (goog.isNull(this.defaultLocations_)) {
+      locations =
+          new ol.render.webgl.imagereplay.shader.Default.Locations(gl, program);
+      this.defaultLocations_ = locations;
+    } else {
+      locations = this.defaultLocations_;
+    }
+  }
+
+  // use the program (FIXME: use the return value)
+  context.useProgram(program);
+
+  // enable the vertex attrib arrays
+  gl.enableVertexAttribArray(locations.a_position);
+  gl.vertexAttribPointer(locations.a_position, 2, goog.webgl.FLOAT,
+      false, 32, 0);
+
+  gl.enableVertexAttribArray(locations.a_offsets);
+  gl.vertexAttribPointer(locations.a_offsets, 2, goog.webgl.FLOAT,
+      false, 32, 8);
+
+  gl.enableVertexAttribArray(locations.a_texCoord);
+  gl.vertexAttribPointer(locations.a_texCoord, 2, goog.webgl.FLOAT,
+      false, 32, 16);
+
+  gl.enableVertexAttribArray(locations.a_opacity);
+  gl.vertexAttribPointer(locations.a_opacity, 1, goog.webgl.FLOAT,
+      false, 32, 24);
+
+  gl.enableVertexAttribArray(locations.a_rotateWithView);
+  gl.vertexAttribPointer(locations.a_rotateWithView, 1, goog.webgl.FLOAT,
+      false, 32, 28);
+
+  // set the "uniform" values
+  var projectionMatrix = this.projectionMatrix_;
+  ol.vec.Mat4.makeTransform2D(projectionMatrix,
+      0.0, 0.0,
+      2 / (resolution * size[0]),
+      2 / (resolution * size[1]),
+      -rotation,
+      -(center[0] - this.origin_[0]), -(center[1] - this.origin_[1]));
+
+  var offsetScaleMatrix = this.offsetScaleMatrix_;
+  goog.vec.Mat4.makeScale(offsetScaleMatrix, 2 / size[0], 2 / size[1], 1);
+
+  var offsetRotateMatrix = this.offsetRotateMatrix_;
+  goog.vec.Mat4.makeIdentity(offsetRotateMatrix);
+  if (rotation !== 0) {
+    goog.vec.Mat4.rotateZ(offsetRotateMatrix, -rotation);
+  }
+
+  gl.uniformMatrix4fv(locations.u_projectionMatrix, false, projectionMatrix);
+  gl.uniformMatrix4fv(locations.u_offsetScaleMatrix, false, offsetScaleMatrix);
+  gl.uniformMatrix4fv(locations.u_offsetRotateMatrix, false,
+      offsetRotateMatrix);
+  gl.uniform1f(locations.u_opacity, opacity);
+  if (useColor) {
+    gl.uniformMatrix4fv(locations.u_colorMatrix, false,
+        this.colorMatrix_.getMatrix(brightness, contrast, hue, saturation));
+  }
+
+  // draw!
+  goog.asserts.assert(this.textures_.length == this.groupIndices_.length);
+  var i, ii, start;
+  for (i = 0, ii = this.textures_.length, start = 0; i < ii; ++i) {
+    gl.bindTexture(goog.webgl.TEXTURE_2D, this.textures_[i]);
+    var end = this.groupIndices_[i];
+    var numItems = end - start;
+    var offsetInBytes = start * (context.hasOESElementIndexUint ? 4 : 2);
+    var elementType = context.hasOESElementIndexUint ?
+        goog.webgl.UNSIGNED_INT : goog.webgl.UNSIGNED_SHORT;
+    gl.drawElements(goog.webgl.TRIANGLES, numItems, elementType, offsetInBytes);
+    start = end;
+  }
+
+  // disable the vertex attrib arrays
+  gl.disableVertexAttribArray(locations.a_position);
+  gl.disableVertexAttribArray(locations.a_offsets);
+  gl.disableVertexAttribArray(locations.a_texCoord);
+  gl.disableVertexAttribArray(locations.a_opacity);
+  gl.disableVertexAttribArray(locations.a_rotateWithView);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.setFillStrokeStyle = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.setImageStyle = function(imageStyle) {
+  var anchor = imageStyle.getAnchor();
+  goog.asserts.assert(!goog.isNull(anchor));
+  var image = imageStyle.getImage(1);
+  goog.asserts.assert(!goog.isNull(image));
+  var imageSize = imageStyle.getImageSize();
+  goog.asserts.assert(!goog.isNull(imageSize));
+  var opacity = imageStyle.getOpacity();
+  goog.asserts.assert(goog.isDef(opacity));
+  var origin = imageStyle.getOrigin();
+  goog.asserts.assert(!goog.isNull(origin));
+  var rotateWithView = imageStyle.getRotateWithView();
+  goog.asserts.assert(goog.isDef(rotateWithView));
+  var rotation = imageStyle.getRotation();
+  goog.asserts.assert(goog.isDef(rotation));
+  var size = imageStyle.getSize();
+  goog.asserts.assert(!goog.isNull(size));
+  var scale = imageStyle.getScale();
+  goog.asserts.assert(goog.isDef(scale));
+
+  if (this.images_.length === 0) {
+    this.images_.push(image);
+  } else {
+    var currentImage = this.images_[this.images_.length - 1];
+    if (goog.getUid(currentImage) != goog.getUid(image)) {
+      this.groupIndices_.push(this.indices_.length);
+      goog.asserts.assert(this.groupIndices_.length == this.images_.length);
+      this.images_.push(image);
+    }
+  }
+
+  this.anchorX_ = anchor[0];
+  this.anchorY_ = anchor[1];
+  this.height_ = size[1];
+  this.imageHeight_ = imageSize[1];
+  this.imageWidth_ = imageSize[0];
+  this.opacity_ = opacity;
+  this.originX_ = origin[0];
+  this.originY_ = origin[1];
+  this.rotation_ = rotation;
+  this.rotateWithView_ = rotateWithView;
+  this.scale_ = scale;
+  this.width_ = size[0];
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ImageReplay.prototype.setTextStyle = goog.abstractMethod;
+
+
+
+/**
+ * @constructor
+ * @implements {ol.render.IReplayGroup}
+ * @param {number} tolerance Tolerance.
+ * @param {ol.Extent} maxExtent Max extent.
+ * @struct
+ */
+ol.render.webgl.ReplayGroup = function(tolerance, maxExtent) {
+
+  /**
+   * @type {ol.Extent}
+   * @private
+   */
+  this.maxExtent_ = maxExtent;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.tolerance_ = tolerance;
+
+  /**
+   * ImageReplay only is supported at this point.
+   * @type {Object.<ol.render.ReplayType, ol.render.webgl.ImageReplay>}
+   * @private
+   */
+  this.replays_ = {};
+
+};
+
+
+/**
+ * @param {ol.webgl.Context} context WebGL context.
+ * @return {function()} Delete resources function.
+ */
+ol.render.webgl.ReplayGroup.prototype.getDeleteResourcesFunction =
+    function(context) {
+  var functions = [];
+  var replayKey;
+  for (replayKey in this.replays_) {
+    functions.push(
+        this.replays_[replayKey].getDeleteResourcesFunction(context));
+  }
+  return goog.functions.sequence.apply(null, functions);
+};
+
+
+/**
+ * @param {ol.webgl.Context} context Context.
+ */
+ol.render.webgl.ReplayGroup.prototype.finish = function(context) {
+  var replayKey;
+  for (replayKey in this.replays_) {
+    this.replays_[replayKey].finish(context);
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ReplayGroup.prototype.getReplay =
+    function(zIndex, replayType) {
+  var replay = this.replays_[replayType];
+  if (!goog.isDef(replay)) {
+    var constructor = ol.render.webgl.BATCH_CONSTRUCTORS_[replayType];
+    goog.asserts.assert(goog.isDef(constructor));
+    replay = new constructor(this.tolerance_, this.maxExtent_);
+    this.replays_[replayType] = replay;
+  }
+  return replay;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.render.webgl.ReplayGroup.prototype.isEmpty = function() {
+  return goog.object.isEmpty(this.replays_);
+};
+
+
+/**
+ * @param {ol.webgl.Context} context Context.
+ * @param {ol.Coordinate} center Center.
+ * @param {number} resolution Resolution.
+ * @param {number} rotation Rotation.
+ * @param {ol.Size} size Size.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {number} opacity Global opacity.
+ * @param {number} brightness Global brightness.
+ * @param {number} contrast Global contrast.
+ * @param {number} hue Global hue.
+ * @param {number} saturation Global saturation.
+ * @param {Object} skippedFeaturesHash Ids of features to skip.
+ * @return {T|undefined} Callback result.
+ * @template T
+ */
+ol.render.webgl.ReplayGroup.prototype.replay = function(context,
+    center, resolution, rotation, size, pixelRatio,
+    opacity, brightness, contrast, hue, saturation, skippedFeaturesHash) {
+  var i, ii, replay, result;
+  for (i = 0, ii = ol.render.REPLAY_ORDER.length; i < ii; ++i) {
+    replay = this.replays_[ol.render.REPLAY_ORDER[i]];
+    if (goog.isDef(replay)) {
+      result = replay.replay(context,
+          center, resolution, rotation, size, pixelRatio,
+          opacity, brightness, contrast, hue, saturation, skippedFeaturesHash);
+      if (result) {
+        return result;
+      }
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * @const
+ * @private
+ * @type {Object.<ol.render.ReplayType,
+ *                function(new: ol.render.webgl.ImageReplay, number,
+ *                ol.Extent)>}
+ */
+ol.render.webgl.BATCH_CONSTRUCTORS_ = {
+  'Image': ol.render.webgl.ImageReplay
+};
diff --git a/src/ol/renderer/canvas/canvasimagelayerrenderer.js b/src/ol/renderer/canvas/canvasimagelayerrenderer.js
new file mode 100644
index 0000000..6fa2e36
--- /dev/null
+++ b/src/ol/renderer/canvas/canvasimagelayerrenderer.js
@@ -0,0 +1,150 @@
+goog.provide('ol.renderer.canvas.ImageLayer');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.vec.Mat4');
+goog.require('ol.ImageBase');
+goog.require('ol.ImageState');
+goog.require('ol.ViewHint');
+goog.require('ol.extent');
+goog.require('ol.layer.Image');
+goog.require('ol.proj');
+goog.require('ol.renderer.Map');
+goog.require('ol.renderer.canvas.Layer');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.canvas.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Image} imageLayer Single image layer.
+ */
+ol.renderer.canvas.ImageLayer = function(mapRenderer, imageLayer) {
+
+  goog.base(this, mapRenderer, imageLayer);
+
+  /**
+   * @private
+   * @type {?ol.ImageBase}
+   */
+  this.image_ = null;
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.imageTransform_ = goog.vec.Mat4.createNumber();
+
+};
+goog.inherits(ol.renderer.canvas.ImageLayer, ol.renderer.canvas.Layer);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.ImageLayer.prototype.forEachFeatureAtPixel =
+    function(coordinate, frameState, callback, thisArg) {
+  var layer = this.getLayer();
+  var source = layer.getSource();
+  var resolution = frameState.viewState.resolution;
+  var rotation = frameState.viewState.rotation;
+  var skippedFeatureUids = frameState.skippedFeatureUids;
+  return source.forEachFeatureAtPixel(
+      resolution, rotation, coordinate, skippedFeatureUids,
+      /**
+       * @param {ol.Feature} feature Feature.
+       * @return {?} Callback result.
+       */
+      function(feature) {
+        return callback.call(thisArg, feature, layer);
+      });
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.ImageLayer.prototype.getImage = function() {
+  return goog.isNull(this.image_) ?
+      null : this.image_.getImage();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.ImageLayer.prototype.getImageTransform = function() {
+  return this.imageTransform_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.ImageLayer.prototype.prepareFrame =
+    function(frameState, layerState) {
+
+  var pixelRatio = frameState.pixelRatio;
+  var viewState = frameState.viewState;
+  var viewCenter = viewState.center;
+  var viewResolution = viewState.resolution;
+  var viewRotation = viewState.rotation;
+
+  var image;
+  var imageLayer = this.getLayer();
+  goog.asserts.assertInstanceof(imageLayer, ol.layer.Image);
+  var imageSource = imageLayer.getSource();
+
+  var hints = frameState.viewHints;
+
+  var renderedExtent = frameState.extent;
+  if (goog.isDef(layerState.extent)) {
+    renderedExtent = ol.extent.getIntersection(
+        renderedExtent, layerState.extent);
+  }
+
+  if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING] &&
+      !ol.extent.isEmpty(renderedExtent)) {
+    var projection = viewState.projection;
+    var sourceProjection = imageSource.getProjection();
+    if (!goog.isNull(sourceProjection)) {
+      goog.asserts.assert(ol.proj.equivalent(projection, sourceProjection));
+      projection = sourceProjection;
+    }
+    image = imageSource.getImage(
+        renderedExtent, viewResolution, pixelRatio, projection);
+    if (!goog.isNull(image)) {
+      var imageState = image.getState();
+      if (imageState == ol.ImageState.IDLE) {
+        goog.events.listenOnce(image, goog.events.EventType.CHANGE,
+            this.handleImageChange, false, this);
+        image.load();
+      } else if (imageState == ol.ImageState.LOADED) {
+        this.image_ = image;
+      }
+    }
+  }
+
+  if (!goog.isNull(this.image_)) {
+    image = this.image_;
+    var imageExtent = image.getExtent();
+    var imageResolution = image.getResolution();
+    var imagePixelRatio = image.getPixelRatio();
+    var scale = pixelRatio * imageResolution /
+        (viewResolution * imagePixelRatio);
+    ol.vec.Mat4.makeTransform2D(this.imageTransform_,
+        pixelRatio * frameState.size[0] / 2,
+        pixelRatio * frameState.size[1] / 2,
+        scale, scale,
+        viewRotation,
+        imagePixelRatio * (imageExtent[0] - viewCenter[0]) / imageResolution,
+        imagePixelRatio * (viewCenter[1] - imageExtent[3]) / imageResolution);
+    this.updateAttributions(frameState.attributions, image.getAttributions());
+    this.updateLogos(frameState, imageSource);
+  }
+
+  return true;
+};
diff --git a/src/ol/renderer/canvas/canvaslayerrenderer.js b/src/ol/renderer/canvas/canvaslayerrenderer.js
new file mode 100644
index 0000000..74bca84
--- /dev/null
+++ b/src/ol/renderer/canvas/canvaslayerrenderer.js
@@ -0,0 +1,258 @@
+goog.provide('ol.renderer.canvas.Layer');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.vec.Mat4');
+goog.require('ol.dom');
+goog.require('ol.extent');
+goog.require('ol.layer.Layer');
+goog.require('ol.render.Event');
+goog.require('ol.render.EventType');
+goog.require('ol.render.canvas.Immediate');
+goog.require('ol.renderer.Layer');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Layer} layer Layer.
+ */
+ol.renderer.canvas.Layer = function(mapRenderer, layer) {
+
+  goog.base(this, mapRenderer, layer);
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.transform_ = goog.vec.Mat4.createNumber();
+
+};
+goog.inherits(ol.renderer.canvas.Layer, ol.renderer.Layer);
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.layer.LayerState} layerState Layer state.
+ * @param {CanvasRenderingContext2D} context Context.
+ */
+ol.renderer.canvas.Layer.prototype.composeFrame =
+    function(frameState, layerState, context) {
+
+  this.dispatchPreComposeEvent(context, frameState);
+
+  var image = this.getImage();
+  if (!goog.isNull(image)) {
+
+    // clipped rendering if layer extent is set
+    var extent = layerState.extent;
+    var clipped = goog.isDef(extent);
+    if (clipped) {
+      goog.asserts.assert(goog.isDef(extent));
+      var topLeft = ol.extent.getTopLeft(extent);
+      var topRight = ol.extent.getTopRight(extent);
+      var bottomRight = ol.extent.getBottomRight(extent);
+      var bottomLeft = ol.extent.getBottomLeft(extent);
+
+      ol.vec.Mat4.multVec2(frameState.coordinateToPixelMatrix,
+          topLeft, topLeft);
+      ol.vec.Mat4.multVec2(frameState.coordinateToPixelMatrix,
+          topRight, topRight);
+      ol.vec.Mat4.multVec2(frameState.coordinateToPixelMatrix,
+          bottomRight, bottomRight);
+      ol.vec.Mat4.multVec2(frameState.coordinateToPixelMatrix,
+          bottomLeft, bottomLeft);
+
+      context.save();
+      context.beginPath();
+      context.moveTo(topLeft[0], topLeft[1]);
+      context.lineTo(topRight[0], topRight[1]);
+      context.lineTo(bottomRight[0], bottomRight[1]);
+      context.lineTo(bottomLeft[0], bottomLeft[1]);
+      context.clip();
+    }
+
+    var imageTransform = this.getImageTransform();
+    // for performance reasons, context.save / context.restore is not used
+    // to save and restore the transformation matrix and the opacity.
+    // see http://jsperf.com/context-save-restore-versus-variable
+    var alpha = context.globalAlpha;
+    context.globalAlpha = layerState.opacity;
+
+    // for performance reasons, context.setTransform is only used
+    // when the view is rotated. see http://jsperf.com/canvas-transform
+    if (frameState.viewState.rotation === 0) {
+      var dx = goog.vec.Mat4.getElement(imageTransform, 0, 3);
+      var dy = goog.vec.Mat4.getElement(imageTransform, 1, 3);
+      var dw = image.width * goog.vec.Mat4.getElement(imageTransform, 0, 0);
+      var dh = image.height * goog.vec.Mat4.getElement(imageTransform, 1, 1);
+      context.drawImage(image, 0, 0, +image.width, +image.height,
+          Math.round(dx), Math.round(dy), Math.round(dw), Math.round(dh));
+    } else {
+      context.setTransform(
+          goog.vec.Mat4.getElement(imageTransform, 0, 0),
+          goog.vec.Mat4.getElement(imageTransform, 1, 0),
+          goog.vec.Mat4.getElement(imageTransform, 0, 1),
+          goog.vec.Mat4.getElement(imageTransform, 1, 1),
+          goog.vec.Mat4.getElement(imageTransform, 0, 3),
+          goog.vec.Mat4.getElement(imageTransform, 1, 3));
+      context.drawImage(image, 0, 0);
+      context.setTransform(1, 0, 0, 1, 0, 0);
+    }
+    context.globalAlpha = alpha;
+
+    if (clipped) {
+      context.restore();
+    }
+  }
+
+  this.dispatchPostComposeEvent(context, frameState);
+
+};
+
+
+/**
+ * @param {ol.render.EventType} type Event type.
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {goog.vec.Mat4.Number=} opt_transform Transform.
+ * @private
+ */
+ol.renderer.canvas.Layer.prototype.dispatchComposeEvent_ =
+    function(type, context, frameState, opt_transform) {
+  var layer = this.getLayer();
+  if (layer.hasListener(type)) {
+    var transform = goog.isDef(opt_transform) ?
+        opt_transform : this.getTransform(frameState);
+    var render = new ol.render.canvas.Immediate(
+        context, frameState.pixelRatio, frameState.extent, transform,
+        frameState.viewState.rotation);
+    var composeEvent = new ol.render.Event(type, layer, render, null,
+        frameState, context, null);
+    layer.dispatchEvent(composeEvent);
+    render.flush();
+  }
+};
+
+
+/**
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {goog.vec.Mat4.Number=} opt_transform Transform.
+ * @protected
+ */
+ol.renderer.canvas.Layer.prototype.dispatchPostComposeEvent =
+    function(context, frameState, opt_transform) {
+  this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, context,
+      frameState, opt_transform);
+};
+
+
+/**
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {goog.vec.Mat4.Number=} opt_transform Transform.
+ * @protected
+ */
+ol.renderer.canvas.Layer.prototype.dispatchPreComposeEvent =
+    function(context, frameState, opt_transform) {
+  this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, context,
+      frameState, opt_transform);
+};
+
+
+/**
+ * @param {CanvasRenderingContext2D} context Context.
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {goog.vec.Mat4.Number=} opt_transform Transform.
+ * @protected
+ */
+ol.renderer.canvas.Layer.prototype.dispatchRenderEvent =
+    function(context, frameState, opt_transform) {
+  this.dispatchComposeEvent_(ol.render.EventType.RENDER, context,
+      frameState, opt_transform);
+};
+
+
+/**
+ * @return {HTMLCanvasElement|HTMLVideoElement|Image} Canvas.
+ */
+ol.renderer.canvas.Layer.prototype.getImage = goog.abstractMethod;
+
+
+/**
+ * @return {!goog.vec.Mat4.Number} Image transform.
+ */
+ol.renderer.canvas.Layer.prototype.getImageTransform = goog.abstractMethod;
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @protected
+ * @return {!goog.vec.Mat4.Number} Transform.
+ */
+ol.renderer.canvas.Layer.prototype.getTransform = function(frameState) {
+  var viewState = frameState.viewState;
+  var pixelRatio = frameState.pixelRatio;
+  return ol.vec.Mat4.makeTransform2D(this.transform_,
+      pixelRatio * frameState.size[0] / 2,
+      pixelRatio * frameState.size[1] / 2,
+      pixelRatio / viewState.resolution,
+      -pixelRatio / viewState.resolution,
+      -viewState.rotation,
+      -viewState.center[0], -viewState.center[1]);
+};
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.layer.LayerState} layerState Layer state.
+ * @return {boolean} whether composeFrame should be called.
+ */
+ol.renderer.canvas.Layer.prototype.prepareFrame = goog.abstractMethod;
+
+
+/**
+ * @param {ol.Size} size Size.
+ * @return {boolean} True when the canvas with the current size does not exceed
+ *     the maximum dimensions.
+ */
+ol.renderer.canvas.Layer.testCanvasSize = (function() {
+
+  /**
+   * @type {CanvasRenderingContext2D}
+   */
+  var context = null;
+
+  /**
+   * @type {ImageData}
+   */
+  var imageData = null;
+
+  return function(size) {
+    if (goog.isNull(context)) {
+      context = ol.dom.createCanvasContext2D(1, 1);
+      imageData = context.createImageData(1, 1);
+      var data = imageData.data;
+      data[0] = 42;
+      data[1] = 84;
+      data[2] = 126;
+      data[3] = 255;
+    }
+    var canvas = context.canvas;
+    var good = size[0] <= canvas.width && size[1] <= canvas.height;
+    if (!good) {
+      canvas.width = size[0];
+      canvas.height = size[1];
+      var x = size[0] - 1;
+      var y = size[1] - 1;
+      context.putImageData(imageData, x, y);
+      var result = context.getImageData(x, y, 1, 1);
+      good = goog.array.equals(imageData.data, result.data);
+    }
+    return good;
+  };
+})();
diff --git a/src/ol/renderer/canvas/canvasmaprenderer.js b/src/ol/renderer/canvas/canvasmaprenderer.js
new file mode 100644
index 0000000..d057caf
--- /dev/null
+++ b/src/ol/renderer/canvas/canvasmaprenderer.js
@@ -0,0 +1,207 @@
+// FIXME offset panning
+
+goog.provide('ol.renderer.canvas.Map');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.style');
+goog.require('goog.vec.Mat4');
+goog.require('ol');
+goog.require('ol.RendererType');
+goog.require('ol.css');
+goog.require('ol.dom');
+goog.require('ol.layer.Image');
+goog.require('ol.layer.Layer');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.render.Event');
+goog.require('ol.render.EventType');
+goog.require('ol.render.canvas.Immediate');
+goog.require('ol.render.canvas.ReplayGroup');
+goog.require('ol.renderer.Map');
+goog.require('ol.renderer.canvas.ImageLayer');
+goog.require('ol.renderer.canvas.Layer');
+goog.require('ol.renderer.canvas.TileLayer');
+goog.require('ol.renderer.canvas.VectorLayer');
+goog.require('ol.renderer.vector');
+goog.require('ol.source.State');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.Map}
+ * @param {Element} container Container.
+ * @param {ol.Map} map Map.
+ */
+ol.renderer.canvas.Map = function(container, map) {
+
+  goog.base(this, container, map);
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.context_ = ol.dom.createCanvasContext2D();
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.canvas_ = this.context_.canvas;
+
+  this.canvas_.style.width = '100%';
+  this.canvas_.style.height = '100%';
+  this.canvas_.className = ol.css.CLASS_UNSELECTABLE;
+  goog.dom.insertChildAt(container, this.canvas_, 0);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.renderedVisible_ = true;
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.transform_ = goog.vec.Mat4.createNumber();
+
+};
+goog.inherits(ol.renderer.canvas.Map, ol.renderer.Map);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.Map.prototype.createLayerRenderer = function(layer) {
+  if (ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) {
+    return new ol.renderer.canvas.ImageLayer(this, layer);
+  } else if (ol.ENABLE_TILE && layer instanceof ol.layer.Tile) {
+    return new ol.renderer.canvas.TileLayer(this, layer);
+  } else if (ol.ENABLE_VECTOR && layer instanceof ol.layer.Vector) {
+    return new ol.renderer.canvas.VectorLayer(this, layer);
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+};
+
+
+/**
+ * @param {ol.render.EventType} type Event type.
+ * @param {olx.FrameState} frameState Frame state.
+ * @private
+ */
+ol.renderer.canvas.Map.prototype.dispatchComposeEvent_ =
+    function(type, frameState) {
+  var map = this.getMap();
+  var context = this.context_;
+  if (map.hasListener(type)) {
+    var extent = frameState.extent;
+    var pixelRatio = frameState.pixelRatio;
+    var viewState = frameState.viewState;
+    var resolution = viewState.resolution;
+    var rotation = viewState.rotation;
+
+    ol.vec.Mat4.makeTransform2D(this.transform_,
+        this.canvas_.width / 2, this.canvas_.height / 2,
+        pixelRatio / resolution, -pixelRatio / resolution,
+        -rotation,
+        -viewState.center[0], -viewState.center[1]);
+
+    var tolerance = ol.renderer.vector.getTolerance(resolution, pixelRatio);
+    var replayGroup = new ol.render.canvas.ReplayGroup(tolerance, extent,
+        resolution);
+
+    var vectorContext = new ol.render.canvas.Immediate(context, pixelRatio,
+        extent, this.transform_, rotation);
+    var composeEvent = new ol.render.Event(type, map, vectorContext,
+        replayGroup, frameState, context, null);
+    map.dispatchEvent(composeEvent);
+
+    replayGroup.finish();
+    if (!replayGroup.isEmpty()) {
+      replayGroup.replay(context, pixelRatio, this.transform_,
+          rotation, {});
+    }
+    vectorContext.flush();
+    this.replayGroup = replayGroup;
+  }
+};
+
+
+/**
+ * @param {ol.layer.Layer} layer Layer.
+ * @return {ol.renderer.canvas.Layer} Canvas layer renderer.
+ */
+ol.renderer.canvas.Map.prototype.getCanvasLayerRenderer = function(layer) {
+  var layerRenderer = this.getLayerRenderer(layer);
+  goog.asserts.assertInstanceof(layerRenderer, ol.renderer.canvas.Layer);
+  return /** @type {ol.renderer.canvas.Layer} */ (layerRenderer);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.Map.prototype.getType = function() {
+  return ol.RendererType.CANVAS;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.Map.prototype.renderFrame = function(frameState) {
+
+  if (goog.isNull(frameState)) {
+    if (this.renderedVisible_) {
+      goog.style.setElementShown(this.canvas_, false);
+      this.renderedVisible_ = false;
+    }
+    return;
+  }
+
+  var context = this.context_;
+  var width = frameState.size[0] * frameState.pixelRatio;
+  var height = frameState.size[1] * frameState.pixelRatio;
+  if (this.canvas_.width != width || this.canvas_.height != height) {
+    this.canvas_.width = width;
+    this.canvas_.height = height;
+  } else {
+    context.clearRect(0, 0, this.canvas_.width, this.canvas_.height);
+  }
+
+  this.calculateMatrices2D(frameState);
+
+  this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState);
+
+  var layerStatesArray = frameState.layerStatesArray;
+  var viewResolution = frameState.viewState.resolution;
+  var i, ii, layer, layerRenderer, layerState;
+  for (i = 0, ii = layerStatesArray.length; i < ii; ++i) {
+    layerState = layerStatesArray[i];
+    layer = layerState.layer;
+    layerRenderer = this.getLayerRenderer(layer);
+    goog.asserts.assertInstanceof(layerRenderer, ol.renderer.canvas.Layer);
+    if (!ol.layer.Layer.visibleAtResolution(layerState, viewResolution) ||
+        layerState.sourceState != ol.source.State.READY) {
+      continue;
+    }
+    if (layerRenderer.prepareFrame(frameState, layerState)) {
+      layerRenderer.composeFrame(frameState, layerState, context);
+    }
+  }
+
+  this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState);
+
+  if (!this.renderedVisible_) {
+    goog.style.setElementShown(this.canvas_, true);
+    this.renderedVisible_ = true;
+  }
+
+  this.scheduleRemoveUnusedLayerRenderers(frameState);
+  this.scheduleExpireIconCache(frameState);
+};
diff --git a/src/ol/renderer/canvas/canvastilelayerrenderer.js b/src/ol/renderer/canvas/canvastilelayerrenderer.js
new file mode 100644
index 0000000..978aa41
--- /dev/null
+++ b/src/ol/renderer/canvas/canvastilelayerrenderer.js
@@ -0,0 +1,416 @@
+// FIXME find correct globalCompositeOperation
+// FIXME optimize :-)
+
+goog.provide('ol.renderer.canvas.TileLayer');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('goog.vec.Mat4');
+goog.require('ol.Size');
+goog.require('ol.TileRange');
+goog.require('ol.TileState');
+goog.require('ol.dom');
+goog.require('ol.extent');
+goog.require('ol.layer.Tile');
+goog.require('ol.renderer.Map');
+goog.require('ol.renderer.canvas.Layer');
+goog.require('ol.tilecoord');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.canvas.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Tile} tileLayer Tile layer.
+ */
+ol.renderer.canvas.TileLayer = function(mapRenderer, tileLayer) {
+
+  goog.base(this, mapRenderer, tileLayer);
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.canvas_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.canvasSize_ = null;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.canvasTooBig_ = false;
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.context_ = null;
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.imageTransform_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedCanvasZ_ = NaN;
+
+  /**
+   * @private
+   * @type {ol.TileRange}
+   */
+  this.renderedCanvasTileRange_ = null;
+
+  /**
+   * @private
+   * @type {Array.<ol.Tile|undefined>}
+   */
+  this.renderedTiles_ = null;
+
+};
+goog.inherits(ol.renderer.canvas.TileLayer, ol.renderer.canvas.Layer);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.TileLayer.prototype.getImage = function() {
+  return this.canvas_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.TileLayer.prototype.getImageTransform = function() {
+  return this.imageTransform_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.TileLayer.prototype.prepareFrame =
+    function(frameState, layerState) {
+
+  //
+  // Warning! You're entering a dangerous zone!
+  //
+  // The canvas tile layer renderering is highly optimized, hence
+  // the complexity of this function. For best performance we try
+  // to minimize the number of pixels to update on the canvas. This
+  // includes:
+  //
+  // - Only drawing pixels that will be visible.
+  // - Not re-drawing pixels/tiles that are already correct.
+  // - Minimizing calls to clearRect.
+  // - Never shrink the canvas. Just make it bigger when necessary.
+  //   Re-sizing the canvas also clears it, which further means
+  //   re-creating it (expensive).
+  //
+  // The various steps performed by this functions:
+  //
+  // - Create a canvas element if none has been created yet.
+  //
+  // - Make the canvas bigger if it's too small. Note that we never shrink
+  //   the canvas, we just make it bigger when necessary, when rotating for
+  //   example. Note also that the canvas always contains a whole number
+  //   of tiles.
+  //
+  // - Invalidate the canvas tile range (renderedCanvasTileRange_ = null)
+  //   if (1) the canvas has been enlarged, or (2) the zoom level changes,
+  //   or (3) the canvas tile range doesn't contain the required tile
+  //   range. This canvas tile range invalidation thing is related to
+  //   an optimization where we attempt to redraw as few pixels as
+  //   possible on each prepareFrame call.
+  //
+  // - If the canvas tile range has been invalidated we reset
+  //   renderedCanvasTileRange_ and reset the renderedTiles_ array.
+  //   The renderedTiles_ array is the structure used to determine
+  //   the canvas pixels that need not be redrawn from one prepareFrame
+  //   call to another. It records while tile has been rendered at
+  //   which position in the canvas.
+  //
+  // - We then determine the tiles to draw on the canvas. Tiles for
+  //   the target resolution may not be loaded yet. In that case we
+  //   use low-resolution/interim tiles if loaded already. And, if
+  //   for a non-yet-loaded tile we haven't found a corresponding
+  //   low-resolution tile we indicate that the pixels for that
+  //   tile must be cleared on the canvas. Note: determining the
+  //   interim tiles is based on tile extents instead of tile
+  //   coords, this is to be able to handler irregular tile grids.
+  //
+  // - We're now ready to render. We start by calling clearRect
+  //   for the tiles that aren't loaded yet and are not fully covered
+  //   by a low-resolution tile (if they're loaded, we'll draw them;
+  //   if they're fully covered by a low-resolution tile then there's
+  //   no need to clear). We then render the tiles "back to front",
+  //   i.e. starting with the low-resolution tiles.
+  //
+  // - After rendering some bookkeeping is performed (updateUsedTiles,
+  //   etc.). manageTilePyramid is what enqueue tiles in the tile
+  //   queue for loading.
+  //
+  // - The last step involves updating the image transform matrix,
+  //   which will be used by the map renderer for the final
+  //   composition and positioning.
+  //
+
+  var pixelRatio = frameState.pixelRatio;
+  var viewState = frameState.viewState;
+  var projection = viewState.projection;
+
+  var tileLayer = this.getLayer();
+  goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile);
+  var tileSource = tileLayer.getSource();
+  var tileGrid = tileSource.getTileGridForProjection(projection);
+  var tileGutter = tileSource.getGutter();
+  var z = tileGrid.getZForResolution(viewState.resolution);
+  var tilePixelSize =
+      tileSource.getTilePixelSize(z, frameState.pixelRatio, projection);
+  var tilePixelRatio = tilePixelSize / tileGrid.getTileSize(z);
+  var tileResolution = tileGrid.getResolution(z);
+  var tilePixelResolution = tileResolution / tilePixelRatio;
+  var center = viewState.center;
+  var extent;
+  if (tileResolution == viewState.resolution) {
+    center = this.snapCenterToPixel(center, tileResolution, frameState.size);
+    extent = ol.extent.getForViewAndSize(
+        center, tileResolution, viewState.rotation, frameState.size);
+  } else {
+    extent = frameState.extent;
+  }
+
+  if (goog.isDef(layerState.extent)) {
+    extent = ol.extent.getIntersection(extent, layerState.extent);
+  }
+  if (ol.extent.isEmpty(extent)) {
+    // Return false to prevent the rendering of the layer.
+    return false;
+  }
+
+  var tileRange = tileGrid.getTileRangeForExtentAndResolution(
+      extent, tileResolution);
+
+  var canvasWidth = tilePixelSize * tileRange.getWidth();
+  var canvasHeight = tilePixelSize * tileRange.getHeight();
+
+  var canvas, context;
+  if (goog.isNull(this.canvas_)) {
+    goog.asserts.assert(goog.isNull(this.canvasSize_));
+    goog.asserts.assert(goog.isNull(this.context_));
+    goog.asserts.assert(goog.isNull(this.renderedCanvasTileRange_));
+    context = ol.dom.createCanvasContext2D(canvasWidth, canvasHeight);
+    this.canvas_ = context.canvas;
+    this.canvasSize_ = [canvasWidth, canvasHeight];
+    this.context_ = context;
+    this.canvasTooBig_ =
+        !ol.renderer.canvas.Layer.testCanvasSize(this.canvasSize_);
+  } else {
+    goog.asserts.assert(!goog.isNull(this.canvasSize_));
+    goog.asserts.assert(!goog.isNull(this.context_));
+    canvas = this.canvas_;
+    context = this.context_;
+    if (this.canvasSize_[0] < canvasWidth ||
+        this.canvasSize_[1] < canvasHeight ||
+        (this.canvasTooBig_ && (this.canvasSize_[0] > canvasWidth ||
+        this.canvasSize_[1] > canvasHeight))) {
+      // Canvas is too small, resize it. We never shrink the canvas, unless
+      // we know that the current canvas size exceeds the maximum size
+      canvas.width = canvasWidth;
+      canvas.height = canvasHeight;
+      this.canvasSize_ = [canvasWidth, canvasHeight];
+      this.canvasTooBig_ =
+          !ol.renderer.canvas.Layer.testCanvasSize(this.canvasSize_);
+      this.renderedCanvasTileRange_ = null;
+    } else {
+      canvasWidth = this.canvasSize_[0];
+      canvasHeight = this.canvasSize_[1];
+      if (z != this.renderedCanvasZ_ ||
+          !this.renderedCanvasTileRange_.containsTileRange(tileRange)) {
+        this.renderedCanvasTileRange_ = null;
+      }
+    }
+  }
+
+  var canvasTileRange, canvasTileRangeWidth, minX, minY;
+  if (goog.isNull(this.renderedCanvasTileRange_)) {
+    canvasTileRangeWidth = canvasWidth / tilePixelSize;
+    var canvasTileRangeHeight = canvasHeight / tilePixelSize;
+    minX = tileRange.minX -
+        Math.floor((canvasTileRangeWidth - tileRange.getWidth()) / 2);
+    minY = tileRange.minY -
+        Math.floor((canvasTileRangeHeight - tileRange.getHeight()) / 2);
+    this.renderedCanvasZ_ = z;
+    this.renderedCanvasTileRange_ = new ol.TileRange(
+        minX, minX + canvasTileRangeWidth - 1,
+        minY, minY + canvasTileRangeHeight - 1);
+    this.renderedTiles_ =
+        new Array(canvasTileRangeWidth * canvasTileRangeHeight);
+    canvasTileRange = this.renderedCanvasTileRange_;
+  } else {
+    canvasTileRange = this.renderedCanvasTileRange_;
+    canvasTileRangeWidth = canvasTileRange.getWidth();
+  }
+
+  goog.asserts.assert(canvasTileRange.containsTileRange(tileRange));
+
+  /**
+   * @type {Object.<number, Object.<string, ol.Tile>>}
+   */
+  var tilesToDrawByZ = {};
+  tilesToDrawByZ[z] = {};
+  /** @type {Array.<ol.Tile>} */
+  var tilesToClear = [];
+
+  var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
+    return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
+  }, tileSource, pixelRatio, projection);
+  var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
+      tilesToDrawByZ, getTileIfLoaded);
+
+  var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError();
+  if (!goog.isDef(useInterimTilesOnError)) {
+    useInterimTilesOnError = true;
+  }
+
+  var tmpExtent = ol.extent.createEmpty();
+  var tmpTileRange = new ol.TileRange(0, 0, 0, 0);
+  var childTileRange, fullyLoaded, tile, tileState, x, y;
+  for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
+    for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
+
+      tile = tileSource.getTile(z, x, y, pixelRatio, projection);
+      tileState = tile.getState();
+      if (tileState == ol.TileState.LOADED ||
+          tileState == ol.TileState.EMPTY ||
+          (tileState == ol.TileState.ERROR && !useInterimTilesOnError)) {
+        tilesToDrawByZ[z][ol.tilecoord.toString(tile.tileCoord)] = tile;
+        continue;
+      }
+
+      fullyLoaded = tileGrid.forEachTileCoordParentTileRange(
+          tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent);
+      if (!fullyLoaded) {
+        // FIXME we do not need to clear the tile if it is fully covered by its
+        //       children
+        tilesToClear.push(tile);
+        childTileRange = tileGrid.getTileCoordChildTileRange(
+            tile.tileCoord, tmpTileRange, tmpExtent);
+        if (!goog.isNull(childTileRange)) {
+          findLoadedTiles(z + 1, childTileRange);
+        }
+      }
+
+    }
+  }
+
+  var i, ii;
+  for (i = 0, ii = tilesToClear.length; i < ii; ++i) {
+    tile = tilesToClear[i];
+    x = tilePixelSize * (tile.tileCoord[1] - canvasTileRange.minX);
+    y = tilePixelSize * (canvasTileRange.maxY - tile.tileCoord[2]);
+    context.clearRect(x, y, tilePixelSize, tilePixelSize);
+  }
+
+  /** @type {Array.<number>} */
+  var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number);
+  goog.array.sort(zs);
+  var opaque = tileSource.getOpaque();
+  var origin = ol.extent.getTopLeft(tileGrid.getTileCoordExtent(
+      [z, canvasTileRange.minX, canvasTileRange.maxY],
+      tmpExtent));
+  var currentZ, index, scale, tileCoordKey, tileExtent, tilesToDraw;
+  var ix, iy, interimTileExtent, interimTileRange, maxX, maxY;
+  var height, width;
+  for (i = 0, ii = zs.length; i < ii; ++i) {
+    currentZ = zs[i];
+    tilePixelSize =
+        tileSource.getTilePixelSize(currentZ, pixelRatio, projection);
+    tilesToDraw = tilesToDrawByZ[currentZ];
+    if (currentZ == z) {
+      for (tileCoordKey in tilesToDraw) {
+        tile = tilesToDraw[tileCoordKey];
+        index =
+            (tile.tileCoord[2] - canvasTileRange.minY) * canvasTileRangeWidth +
+            (tile.tileCoord[1] - canvasTileRange.minX);
+        if (this.renderedTiles_[index] != tile) {
+          x = tilePixelSize * (tile.tileCoord[1] - canvasTileRange.minX);
+          y = tilePixelSize * (canvasTileRange.maxY - tile.tileCoord[2]);
+          tileState = tile.getState();
+          if (tileState == ol.TileState.EMPTY ||
+              (tileState == ol.TileState.ERROR && !useInterimTilesOnError) ||
+              !opaque) {
+            context.clearRect(x, y, tilePixelSize, tilePixelSize);
+          }
+          if (tileState == ol.TileState.LOADED) {
+            context.drawImage(tile.getImage(),
+                tileGutter, tileGutter, tilePixelSize, tilePixelSize,
+                x, y, tilePixelSize, tilePixelSize);
+          }
+          this.renderedTiles_[index] = tile;
+        }
+      }
+    } else {
+      scale = tileGrid.getResolution(currentZ) / tileResolution;
+      for (tileCoordKey in tilesToDraw) {
+        tile = tilesToDraw[tileCoordKey];
+        tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent);
+        x = (tileExtent[0] - origin[0]) / tilePixelResolution;
+        y = (origin[1] - tileExtent[3]) / tilePixelResolution;
+        width = scale * tilePixelSize;
+        height = scale * tilePixelSize;
+        tileState = tile.getState();
+        if (tileState == ol.TileState.EMPTY || !opaque) {
+          context.clearRect(x, y, width, height);
+        }
+        if (tileState == ol.TileState.LOADED) {
+          context.drawImage(tile.getImage(),
+              tileGutter, tileGutter, tilePixelSize, tilePixelSize,
+              x, y, width, height);
+        }
+        interimTileRange =
+            tileGrid.getTileRangeForExtentAndZ(tileExtent, z, tmpTileRange);
+        minX = Math.max(interimTileRange.minX, canvasTileRange.minX);
+        maxX = Math.min(interimTileRange.maxX, canvasTileRange.maxX);
+        minY = Math.max(interimTileRange.minY, canvasTileRange.minY);
+        maxY = Math.min(interimTileRange.maxY, canvasTileRange.maxY);
+        for (ix = minX; ix <= maxX; ++ix) {
+          for (iy = minY; iy <= maxY; ++iy) {
+            index = (iy - canvasTileRange.minY) * canvasTileRangeWidth +
+                    (ix - canvasTileRange.minX);
+            this.renderedTiles_[index] = undefined;
+          }
+        }
+      }
+    }
+  }
+
+  this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
+  this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio,
+      projection, extent, z, tileLayer.getPreload());
+  this.scheduleExpireCache(frameState, tileSource);
+  this.updateLogos(frameState, tileSource);
+
+  ol.vec.Mat4.makeTransform2D(this.imageTransform_,
+      pixelRatio * frameState.size[0] / 2,
+      pixelRatio * frameState.size[1] / 2,
+      pixelRatio * tilePixelResolution / viewState.resolution,
+      pixelRatio * tilePixelResolution / viewState.resolution,
+      viewState.rotation,
+      (origin[0] - center[0]) / tilePixelResolution,
+      (center[1] - origin[1]) / tilePixelResolution);
+
+  return true;
+};
diff --git a/src/ol/renderer/canvas/canvasvectorlayerrenderer.js b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
new file mode 100644
index 0000000..3fe8912
--- /dev/null
+++ b/src/ol/renderer/canvas/canvasvectorlayerrenderer.js
@@ -0,0 +1,279 @@
+goog.provide('ol.renderer.canvas.VectorLayer');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('ol.ViewHint');
+goog.require('ol.dom');
+goog.require('ol.extent');
+goog.require('ol.layer.Vector');
+goog.require('ol.render.EventType');
+goog.require('ol.render.canvas.ReplayGroup');
+goog.require('ol.renderer.canvas.Layer');
+goog.require('ol.renderer.vector');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.canvas.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Vector} vectorLayer Vector layer.
+ */
+ol.renderer.canvas.VectorLayer = function(mapRenderer, vectorLayer) {
+
+  goog.base(this, mapRenderer, vectorLayer);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.dirty_ = false;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedRevision_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedResolution_ = NaN;
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.renderedExtent_ = ol.extent.createEmpty();
+
+  /**
+   * @private
+   * @type {function(ol.Feature, ol.Feature): number|null}
+   */
+  this.renderedRenderOrder_ = null;
+
+  /**
+   * @private
+   * @type {ol.render.canvas.ReplayGroup}
+   */
+  this.replayGroup_ = null;
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.context_ = ol.dom.createCanvasContext2D();
+
+};
+goog.inherits(ol.renderer.canvas.VectorLayer, ol.renderer.canvas.Layer);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.VectorLayer.prototype.composeFrame =
+    function(frameState, layerState, context) {
+
+  var transform = this.getTransform(frameState);
+
+  this.dispatchPreComposeEvent(context, frameState, transform);
+
+  var replayGroup = this.replayGroup_;
+  if (!goog.isNull(replayGroup) && !replayGroup.isEmpty()) {
+    var layer = this.getLayer();
+    var replayContext;
+    if (layer.hasListener(ol.render.EventType.RENDER)) {
+      // resize and clear
+      this.context_.canvas.width = context.canvas.width;
+      this.context_.canvas.height = context.canvas.height;
+      replayContext = this.context_;
+    } else {
+      replayContext = context;
+    }
+    // for performance reasons, context.save / context.restore is not used
+    // to save and restore the transformation matrix and the opacity.
+    // see http://jsperf.com/context-save-restore-versus-variable
+    var alpha = replayContext.globalAlpha;
+    replayContext.globalAlpha = layerState.opacity;
+    replayGroup.replay(
+        replayContext, frameState.pixelRatio, transform,
+        frameState.viewState.rotation, frameState.skippedFeatureUids);
+
+    if (replayContext != context) {
+      this.dispatchRenderEvent(replayContext, frameState, transform);
+      context.drawImage(replayContext.canvas, 0, 0);
+    }
+    replayContext.globalAlpha = alpha;
+  }
+
+  this.dispatchPostComposeEvent(context, frameState, transform);
+
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.VectorLayer.prototype.forEachFeatureAtPixel =
+    function(coordinate, frameState, callback, thisArg) {
+  if (goog.isNull(this.replayGroup_)) {
+    return undefined;
+  } else {
+    var resolution = frameState.viewState.resolution;
+    var rotation = frameState.viewState.rotation;
+    var layer = this.getLayer();
+    /** @type {Object.<string, boolean>} */
+    var features = {};
+    return this.replayGroup_.forEachGeometryAtPixel(resolution,
+        rotation, coordinate, frameState.skippedFeatureUids,
+        /**
+         * @param {ol.Feature} feature Feature.
+         * @return {?} Callback result.
+         */
+        function(feature) {
+          goog.asserts.assert(goog.isDef(feature));
+          var key = goog.getUid(feature).toString();
+          if (!(key in features)) {
+            features[key] = true;
+            return callback.call(thisArg, feature, layer);
+          }
+        });
+  }
+};
+
+
+/**
+ * Handle changes in image style state.
+ * @param {goog.events.Event} event Image style change event.
+ * @private
+ */
+ol.renderer.canvas.VectorLayer.prototype.handleImageChange_ =
+    function(event) {
+  this.renderIfReadyAndVisible();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.canvas.VectorLayer.prototype.prepareFrame =
+    function(frameState, layerState) {
+
+  var vectorLayer = /** @type {ol.layer.Vector} */ (this.getLayer());
+  goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector);
+  var vectorSource = vectorLayer.getSource();
+
+  this.updateAttributions(
+      frameState.attributions, vectorSource.getAttributions());
+  this.updateLogos(frameState, vectorSource);
+
+  if (!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] ||
+      frameState.viewHints[ol.ViewHint.INTERACTING])) {
+    return true;
+  }
+
+  var frameStateExtent = frameState.extent;
+  var viewState = frameState.viewState;
+  var projection = viewState.projection;
+  var resolution = viewState.resolution;
+  var pixelRatio = frameState.pixelRatio;
+  var vectorLayerRevision = vectorLayer.getRevision();
+  var vectorLayerRenderBuffer = vectorLayer.getRenderBuffer();
+  var vectorLayerRenderOrder = vectorLayer.getRenderOrder();
+
+  if (!goog.isDef(vectorLayerRenderOrder)) {
+    vectorLayerRenderOrder = ol.renderer.vector.defaultOrder;
+  }
+
+  var extent = ol.extent.buffer(frameStateExtent,
+      vectorLayerRenderBuffer * resolution);
+
+  if (!this.dirty_ &&
+      this.renderedResolution_ == resolution &&
+      this.renderedRevision_ == vectorLayerRevision &&
+      this.renderedRenderOrder_ == vectorLayerRenderOrder &&
+      ol.extent.containsExtent(this.renderedExtent_, extent)) {
+    return true;
+  }
+
+  // FIXME dispose of old replayGroup in post render
+  goog.dispose(this.replayGroup_);
+  this.replayGroup_ = null;
+
+  this.dirty_ = false;
+
+  var replayGroup =
+      new ol.render.canvas.ReplayGroup(
+          ol.renderer.vector.getTolerance(resolution, pixelRatio), extent,
+          resolution);
+  vectorSource.loadFeatures(extent, resolution, projection);
+  var renderFeature =
+      /**
+       * @param {ol.Feature} feature Feature.
+       * @this {ol.renderer.canvas.VectorLayer}
+       */
+      function(feature) {
+    var styles;
+    if (goog.isDef(feature.getStyleFunction())) {
+      styles = feature.getStyleFunction().call(feature, resolution);
+    } else if (goog.isDef(vectorLayer.getStyleFunction())) {
+      styles = vectorLayer.getStyleFunction()(feature, resolution);
+    }
+    if (goog.isDefAndNotNull(styles)) {
+      var dirty = this.renderFeature(
+          feature, resolution, pixelRatio, styles, replayGroup);
+      this.dirty_ = this.dirty_ || dirty;
+    }
+  };
+  if (!goog.isNull(vectorLayerRenderOrder)) {
+    /** @type {Array.<ol.Feature>} */
+    var features = [];
+    vectorSource.forEachFeatureInExtentAtResolution(extent, resolution,
+        /**
+         * @param {ol.Feature} feature Feature.
+         */
+        function(feature) {
+          features.push(feature);
+        }, this);
+    goog.array.sort(features, vectorLayerRenderOrder);
+    goog.array.forEach(features, renderFeature, this);
+  } else {
+    vectorSource.forEachFeatureInExtentAtResolution(
+        extent, resolution, renderFeature, this);
+  }
+  replayGroup.finish();
+
+  this.renderedResolution_ = resolution;
+  this.renderedRevision_ = vectorLayerRevision;
+  this.renderedRenderOrder_ = vectorLayerRenderOrder;
+  this.renderedExtent_ = extent;
+  this.replayGroup_ = replayGroup;
+
+  return true;
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {Array.<ol.style.Style>} styles Array of styles
+ * @param {ol.render.canvas.ReplayGroup} replayGroup Replay group.
+ * @return {boolean} `true` if an image is loading.
+ */
+ol.renderer.canvas.VectorLayer.prototype.renderFeature =
+    function(feature, resolution, pixelRatio, styles, replayGroup) {
+  if (!goog.isDefAndNotNull(styles)) {
+    return false;
+  }
+  var i, ii, loading = false;
+  for (i = 0, ii = styles.length; i < ii; ++i) {
+    loading = ol.renderer.vector.renderFeature(
+        replayGroup, feature, styles[i],
+        ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
+        this.handleImageChange_, this) || loading;
+  }
+  return loading;
+};
diff --git a/src/ol/renderer/dom/domimagelayerrenderer.js b/src/ol/renderer/dom/domimagelayerrenderer.js
new file mode 100644
index 0000000..f41162b
--- /dev/null
+++ b/src/ol/renderer/dom/domimagelayerrenderer.js
@@ -0,0 +1,166 @@
+goog.provide('ol.renderer.dom.ImageLayer');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.vec.Mat4');
+goog.require('ol.ImageBase');
+goog.require('ol.ImageState');
+goog.require('ol.ViewHint');
+goog.require('ol.dom');
+goog.require('ol.extent');
+goog.require('ol.layer.Image');
+goog.require('ol.proj');
+goog.require('ol.renderer.dom.Layer');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.dom.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Image} imageLayer Image layer.
+ */
+ol.renderer.dom.ImageLayer = function(mapRenderer, imageLayer) {
+  var target = goog.dom.createElement(goog.dom.TagName.DIV);
+  target.style.position = 'absolute';
+
+  goog.base(this, mapRenderer, imageLayer, target);
+
+  /**
+   * The last rendered image.
+   * @private
+   * @type {?ol.ImageBase}
+   */
+  this.image_ = null;
+
+  /**
+   * @private
+   * @type {goog.vec.Mat4.Number}
+   */
+  this.transform_ = goog.vec.Mat4.createNumberIdentity();
+
+};
+goog.inherits(ol.renderer.dom.ImageLayer, ol.renderer.dom.Layer);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.ImageLayer.prototype.forEachFeatureAtPixel =
+    function(coordinate, frameState, callback, thisArg) {
+  var layer = this.getLayer();
+  var source = layer.getSource();
+  var resolution = frameState.viewState.resolution;
+  var rotation = frameState.viewState.rotation;
+  var skippedFeatureUids = frameState.skippedFeatureUids;
+  return source.forEachFeatureAtPixel(
+      resolution, rotation, coordinate, skippedFeatureUids,
+      /**
+       * @param {ol.Feature} feature Feature.
+       * @return {?} Callback result.
+       */
+      function(feature) {
+        return callback.call(thisArg, feature, layer);
+      });
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.ImageLayer.prototype.clearFrame = function() {
+  goog.dom.removeChildren(this.target);
+  this.image_ = null;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.ImageLayer.prototype.prepareFrame =
+    function(frameState, layerState) {
+
+  var viewState = frameState.viewState;
+  var viewCenter = viewState.center;
+  var viewResolution = viewState.resolution;
+  var viewRotation = viewState.rotation;
+
+  var image = this.image_;
+  var imageLayer = this.getLayer();
+  goog.asserts.assertInstanceof(imageLayer, ol.layer.Image);
+  var imageSource = imageLayer.getSource();
+
+  var hints = frameState.viewHints;
+
+  var renderedExtent = frameState.extent;
+  if (goog.isDef(layerState.extent)) {
+    renderedExtent = ol.extent.getIntersection(
+        renderedExtent, layerState.extent);
+  }
+
+  if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING] &&
+      !ol.extent.isEmpty(renderedExtent)) {
+    var projection = viewState.projection;
+    var sourceProjection = imageSource.getProjection();
+    if (!goog.isNull(sourceProjection)) {
+      goog.asserts.assert(ol.proj.equivalent(projection, sourceProjection));
+      projection = sourceProjection;
+    }
+    var image_ = imageSource.getImage(renderedExtent, viewResolution,
+        frameState.pixelRatio, projection);
+    if (!goog.isNull(image_)) {
+      var imageState = image_.getState();
+      if (imageState == ol.ImageState.IDLE) {
+        goog.events.listenOnce(image_, goog.events.EventType.CHANGE,
+            this.handleImageChange, false, this);
+        image_.load();
+      } else if (imageState == ol.ImageState.LOADED) {
+        image = image_;
+      }
+    }
+  }
+
+  if (!goog.isNull(image)) {
+    var imageExtent = image.getExtent();
+    var imageResolution = image.getResolution();
+    var transform = goog.vec.Mat4.createNumber();
+    ol.vec.Mat4.makeTransform2D(transform,
+        frameState.size[0] / 2, frameState.size[1] / 2,
+        imageResolution / viewResolution, imageResolution / viewResolution,
+        viewRotation,
+        (imageExtent[0] - viewCenter[0]) / imageResolution,
+        (viewCenter[1] - imageExtent[3]) / imageResolution);
+    if (image != this.image_) {
+      var imageElement = image.getImage(this);
+      // Bootstrap sets the style max-width: 100% for all images, which breaks
+      // prevents the image from being displayed in FireFox.  Workaround by
+      // overriding the max-width style.
+      imageElement.style.maxWidth = 'none';
+      imageElement.style.position = 'absolute';
+      goog.dom.removeChildren(this.target);
+      goog.dom.appendChild(this.target, imageElement);
+      this.image_ = image;
+    }
+    this.setTransform_(transform);
+    this.updateAttributions(frameState.attributions, image.getAttributions());
+    this.updateLogos(frameState, imageSource);
+  }
+
+  return true;
+};
+
+
+/**
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @private
+ */
+ol.renderer.dom.ImageLayer.prototype.setTransform_ = function(transform) {
+  if (!ol.vec.Mat4.equals2D(transform, this.transform_)) {
+    ol.dom.transformElement2D(this.target, transform, 6);
+    goog.vec.Mat4.setFromArray(this.transform_, transform);
+  }
+};
diff --git a/src/ol/renderer/dom/domlayerrenderer.js b/src/ol/renderer/dom/domlayerrenderer.js
new file mode 100644
index 0000000..072e324
--- /dev/null
+++ b/src/ol/renderer/dom/domlayerrenderer.js
@@ -0,0 +1,56 @@
+goog.provide('ol.renderer.dom.Layer');
+
+goog.require('goog.dom');
+goog.require('ol.layer.Layer');
+goog.require('ol.renderer.Layer');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Layer} layer Layer.
+ * @param {!Element} target Target.
+ */
+ol.renderer.dom.Layer = function(mapRenderer, layer, target) {
+
+  goog.base(this, mapRenderer, layer);
+
+  /**
+   * @type {!Element}
+   * @protected
+   */
+  this.target = target;
+
+};
+goog.inherits(ol.renderer.dom.Layer, ol.renderer.Layer);
+
+
+/**
+ * Clear rendered elements.
+ */
+ol.renderer.dom.Layer.prototype.clearFrame = goog.nullFunction;
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.layer.LayerState} layerState Layer state.
+ */
+ol.renderer.dom.Layer.prototype.composeFrame = goog.nullFunction;
+
+
+/**
+ * @return {!Element} Target.
+ */
+ol.renderer.dom.Layer.prototype.getTarget = function() {
+  return this.target;
+};
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.layer.LayerState} layerState Layer state.
+ * @return {boolean} whether composeFrame should be called.
+ */
+ol.renderer.dom.Layer.prototype.prepareFrame = goog.abstractMethod;
diff --git a/src/ol/renderer/dom/dommaprenderer.js b/src/ol/renderer/dom/dommaprenderer.js
new file mode 100644
index 0000000..97831d3
--- /dev/null
+++ b/src/ol/renderer/dom/dommaprenderer.js
@@ -0,0 +1,271 @@
+goog.provide('ol.renderer.dom.Map');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.Event');
+goog.require('goog.events.EventType');
+goog.require('goog.functions');
+goog.require('goog.style');
+goog.require('goog.vec.Mat4');
+goog.require('ol');
+goog.require('ol.RendererType');
+goog.require('ol.css');
+goog.require('ol.dom');
+goog.require('ol.layer.Image');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.render.Event');
+goog.require('ol.render.EventType');
+goog.require('ol.render.canvas.Immediate');
+goog.require('ol.render.canvas.ReplayGroup');
+goog.require('ol.renderer.Map');
+goog.require('ol.renderer.dom.ImageLayer');
+goog.require('ol.renderer.dom.Layer');
+goog.require('ol.renderer.dom.TileLayer');
+goog.require('ol.renderer.dom.VectorLayer');
+goog.require('ol.renderer.vector');
+goog.require('ol.source.State');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.Map}
+ * @param {Element} container Container.
+ * @param {ol.Map} map Map.
+ */
+ol.renderer.dom.Map = function(container, map) {
+
+  goog.base(this, container, map);
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.context_ = null;
+  if (!(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE)) {
+    this.context_ = ol.dom.createCanvasContext2D();
+    var canvas = this.context_.canvas;
+    canvas.style.position = 'absolute';
+    canvas.style.width = '100%';
+    canvas.style.height = '100%';
+    canvas.className = ol.css.CLASS_UNSELECTABLE;
+    goog.dom.insertChildAt(container, canvas, 0);
+  }
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.transform_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @type {!Element}
+   * @private
+   */
+  this.layersPane_ = goog.dom.createElement(goog.dom.TagName.DIV);
+  this.layersPane_.className = ol.css.CLASS_UNSELECTABLE;
+  var style = this.layersPane_.style;
+  style.position = 'absolute';
+  style.width = '100%';
+  style.height = '100%';
+
+  // in IE < 9, we need to return false from ondragstart to cancel the default
+  // behavior of dragging images, which is interfering with the custom handler
+  // in the Drag interaction subclasses
+  if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+    this.layersPane_.ondragstart = goog.functions.FALSE;
+    this.layersPane_.onselectstart = goog.functions.FALSE;
+  }
+
+  // prevent the img context menu on mobile devices
+  goog.events.listen(this.layersPane_, goog.events.EventType.TOUCHSTART,
+      goog.events.Event.preventDefault);
+
+  goog.dom.insertChildAt(container, this.layersPane_, 0);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.renderedVisible_ = true;
+
+};
+goog.inherits(ol.renderer.dom.Map, ol.renderer.Map);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.Map.prototype.disposeInternal = function() {
+  goog.dom.removeNode(this.layersPane_);
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.Map.prototype.createLayerRenderer = function(layer) {
+  var layerRenderer;
+  if (ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) {
+    layerRenderer = new ol.renderer.dom.ImageLayer(this, layer);
+  } else if (ol.ENABLE_TILE && layer instanceof ol.layer.Tile) {
+    layerRenderer = new ol.renderer.dom.TileLayer(this, layer);
+  } else if (!(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) &&
+      ol.ENABLE_VECTOR && layer instanceof ol.layer.Vector) {
+    layerRenderer = new ol.renderer.dom.VectorLayer(this, layer);
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+  return layerRenderer;
+};
+
+
+/**
+ * @param {ol.render.EventType} type Event type.
+ * @param {olx.FrameState} frameState Frame state.
+ * @private
+ */
+ol.renderer.dom.Map.prototype.dispatchComposeEvent_ =
+    function(type, frameState) {
+  var map = this.getMap();
+  if (!(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) && map.hasListener(type)) {
+    var extent = frameState.extent;
+    var pixelRatio = frameState.pixelRatio;
+    var viewState = frameState.viewState;
+    var resolution = viewState.resolution;
+    var rotation = viewState.rotation;
+    var context = this.context_;
+    var canvas = context.canvas;
+
+    ol.vec.Mat4.makeTransform2D(this.transform_,
+        canvas.width / 2,
+        canvas.height / 2,
+        pixelRatio / viewState.resolution,
+        -pixelRatio / viewState.resolution,
+        -viewState.rotation,
+        -viewState.center[0], -viewState.center[1]);
+    var vectorContext = new ol.render.canvas.Immediate(context, pixelRatio,
+        extent, this.transform_, rotation);
+    var replayGroup = new ol.render.canvas.ReplayGroup(
+        ol.renderer.vector.getTolerance(resolution, pixelRatio), extent,
+        resolution);
+    var composeEvent = new ol.render.Event(type, map, vectorContext,
+        replayGroup, frameState, context, null);
+    map.dispatchEvent(composeEvent);
+    replayGroup.finish();
+    if (!replayGroup.isEmpty()) {
+      replayGroup.replay(context, pixelRatio, this.transform_, rotation, {});
+    }
+    vectorContext.flush();
+    this.replayGroup = replayGroup;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.Map.prototype.getType = function() {
+  return ol.RendererType.DOM;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.Map.prototype.renderFrame = function(frameState) {
+
+  if (goog.isNull(frameState)) {
+    if (this.renderedVisible_) {
+      goog.style.setElementShown(this.layersPane_, false);
+      this.renderedVisible_ = false;
+    }
+    return;
+  }
+
+  /**
+   * @this {ol.renderer.dom.Map}
+   * @param {Element} elem
+   * @param {number} i
+   */
+  var addChild;
+
+  // appendChild is actually more performant than insertBefore
+  // in IE 7 and 8. http://jsperf.com/reattaching-dom-nodes
+  if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+    addChild =
+        /**
+         * @this {ol.renderer.dom.Map}
+         * @param {Element} elem
+         */ (
+        function(elem) {
+          goog.dom.appendChild(this.layersPane_, elem);
+        });
+  } else {
+    addChild =
+        /**
+         * @this {ol.renderer.dom.Map}
+         * @param {Element} elem
+         * @param {number} i
+         */ (
+        function(elem, i) {
+          goog.dom.insertChildAt(this.layersPane_, elem, i);
+        });
+  }
+
+  var map = this.getMap();
+  if (!(ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) &&
+      (map.hasListener(ol.render.EventType.PRECOMPOSE) ||
+      map.hasListener(ol.render.EventType.POSTCOMPOSE))) {
+    var canvas = this.context_.canvas;
+    canvas.width = frameState.size[0];
+    canvas.height = frameState.size[1];
+  }
+
+  this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState);
+
+  var layerStatesArray = frameState.layerStatesArray;
+  var i, ii, layer, layerRenderer, layerState;
+  for (i = 0, ii = layerStatesArray.length; i < ii; ++i) {
+    layerState = layerStatesArray[i];
+    layer = layerState.layer;
+    layerRenderer = /** @type {ol.renderer.dom.Layer} */ (
+        this.getLayerRenderer(layer));
+    goog.asserts.assertInstanceof(layerRenderer, ol.renderer.dom.Layer);
+    addChild.call(this, layerRenderer.getTarget(), i);
+    if (layerState.sourceState == ol.source.State.READY) {
+      if (layerRenderer.prepareFrame(frameState, layerState)) {
+        layerRenderer.composeFrame(frameState, layerState);
+      }
+    } else {
+      layerRenderer.clearFrame();
+    }
+  }
+
+  var layerStates = frameState.layerStates;
+  var layerKey;
+  for (layerKey in this.getLayerRenderers()) {
+    if (!(layerKey in layerStates)) {
+      layerRenderer = this.getLayerRendererByKey(layerKey);
+      goog.asserts.assertInstanceof(layerRenderer, ol.renderer.dom.Layer);
+      goog.dom.removeNode(layerRenderer.getTarget());
+    }
+  }
+
+  if (!this.renderedVisible_) {
+    goog.style.setElementShown(this.layersPane_, true);
+    this.renderedVisible_ = true;
+  }
+
+  this.calculateMatrices2D(frameState);
+  this.scheduleRemoveUnusedLayerRenderers(frameState);
+  this.scheduleExpireIconCache(frameState);
+
+  this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState);
+};
diff --git a/src/ol/renderer/dom/domtilelayerrenderer.js b/src/ol/renderer/dom/domtilelayerrenderer.js
new file mode 100644
index 0000000..a2fdf6a
--- /dev/null
+++ b/src/ol/renderer/dom/domtilelayerrenderer.js
@@ -0,0 +1,480 @@
+// FIXME probably need to reset TileLayerZ if offsets get too large
+// FIXME when zooming out, preserve higher Z divs to avoid white flash
+
+goog.provide('ol.renderer.dom.TileLayer');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.object');
+goog.require('goog.style');
+goog.require('goog.vec.Mat4');
+goog.require('ol');
+goog.require('ol.Coordinate');
+goog.require('ol.TileCoord');
+goog.require('ol.TileRange');
+goog.require('ol.TileState');
+goog.require('ol.ViewHint');
+goog.require('ol.dom');
+goog.require('ol.dom.BrowserFeature');
+goog.require('ol.extent');
+goog.require('ol.layer.Tile');
+goog.require('ol.renderer.dom.Layer');
+goog.require('ol.tilecoord');
+goog.require('ol.tilegrid.TileGrid');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.dom.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Tile} tileLayer Tile layer.
+ */
+ol.renderer.dom.TileLayer = function(mapRenderer, tileLayer) {
+
+  var target = goog.dom.createElement(goog.dom.TagName.DIV);
+  target.style.position = 'absolute';
+
+  // Needed for IE7-8 to render a transformed element correctly
+  if (ol.dom.BrowserFeature.USE_MS_MATRIX_TRANSFORM) {
+    target.style.width = '100%';
+    target.style.height = '100%';
+  }
+
+  goog.base(this, mapRenderer, tileLayer, target);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.renderedVisible_ = true;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedOpacity_ = 1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedRevision_ = 0;
+
+  /**
+   * @private
+   * @type {Object.<number, ol.renderer.dom.TileLayerZ_>}
+   */
+  this.tileLayerZs_ = {};
+
+};
+goog.inherits(ol.renderer.dom.TileLayer, ol.renderer.dom.Layer);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.TileLayer.prototype.clearFrame = function() {
+  goog.dom.removeChildren(this.target);
+  this.renderedRevision_ = 0;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.TileLayer.prototype.prepareFrame =
+    function(frameState, layerState) {
+
+  if (!layerState.visible) {
+    if (this.renderedVisible_) {
+      goog.style.setElementShown(this.target, false);
+      this.renderedVisible_ = false;
+    }
+    return true;
+  }
+
+  var pixelRatio = frameState.pixelRatio;
+  var viewState = frameState.viewState;
+  var projection = viewState.projection;
+
+  var tileLayer = this.getLayer();
+  goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile);
+  var tileSource = tileLayer.getSource();
+  var tileGrid = tileSource.getTileGridForProjection(projection);
+  var tileGutter = tileSource.getGutter();
+  var z = tileGrid.getZForResolution(viewState.resolution);
+  var tileResolution = tileGrid.getResolution(z);
+  var center = viewState.center;
+  var extent;
+  if (tileResolution == viewState.resolution) {
+    center = this.snapCenterToPixel(center, tileResolution, frameState.size);
+    extent = ol.extent.getForViewAndSize(
+        center, tileResolution, viewState.rotation, frameState.size);
+  } else {
+    extent = frameState.extent;
+  }
+
+  if (goog.isDef(layerState.extent)) {
+    extent = ol.extent.getIntersection(extent, layerState.extent);
+  }
+
+  var tileRange = tileGrid.getTileRangeForExtentAndResolution(
+      extent, tileResolution);
+
+  /** @type {Object.<number, Object.<string, ol.Tile>>} */
+  var tilesToDrawByZ = {};
+  tilesToDrawByZ[z] = {};
+
+  var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
+    return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
+  }, tileSource, pixelRatio, projection);
+  var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
+      tilesToDrawByZ, getTileIfLoaded);
+
+  var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError();
+  if (!goog.isDef(useInterimTilesOnError)) {
+    useInterimTilesOnError = true;
+  }
+
+  var tmpExtent = ol.extent.createEmpty();
+  var tmpTileRange = new ol.TileRange(0, 0, 0, 0);
+  var childTileRange, fullyLoaded, tile, tileState, x, y;
+  for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
+    for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
+
+      tile = tileSource.getTile(z, x, y, pixelRatio, projection);
+      tileState = tile.getState();
+      if (tileState == ol.TileState.LOADED) {
+        tilesToDrawByZ[z][ol.tilecoord.toString(tile.tileCoord)] = tile;
+        continue;
+      } else if (tileState == ol.TileState.EMPTY ||
+                 (tileState == ol.TileState.ERROR &&
+                  !useInterimTilesOnError)) {
+        continue;
+      }
+
+      fullyLoaded = tileGrid.forEachTileCoordParentTileRange(
+          tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent);
+      if (!fullyLoaded) {
+        childTileRange = tileGrid.getTileCoordChildTileRange(
+            tile.tileCoord, tmpTileRange, tmpExtent);
+        if (!goog.isNull(childTileRange)) {
+          findLoadedTiles(z + 1, childTileRange);
+        }
+      }
+
+    }
+
+  }
+
+  // If the tile source revision changes, we destroy the existing DOM structure
+  // so that a new one will be created.  It would be more efficient to modify
+  // the existing structure.
+  var tileLayerZ, tileLayerZKey;
+  if (this.renderedRevision_ != tileSource.getRevision()) {
+    for (tileLayerZKey in this.tileLayerZs_) {
+      tileLayerZ = this.tileLayerZs_[+tileLayerZKey];
+      goog.dom.removeNode(tileLayerZ.target);
+    }
+    this.tileLayerZs_ = {};
+    this.renderedRevision_ = tileSource.getRevision();
+  }
+
+  /** @type {Array.<number>} */
+  var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number);
+  goog.array.sort(zs);
+
+  /** @type {Object.<number, boolean>} */
+  var newTileLayerZKeys = {};
+
+  var iz, iziz, tileCoordKey, tileCoordOrigin, tilesToDraw;
+  for (iz = 0, iziz = zs.length; iz < iziz; ++iz) {
+    tileLayerZKey = zs[iz];
+    if (tileLayerZKey in this.tileLayerZs_) {
+      tileLayerZ = this.tileLayerZs_[tileLayerZKey];
+    } else {
+      tileCoordOrigin =
+          tileGrid.getTileCoordForCoordAndZ(center, tileLayerZKey);
+      tileLayerZ = new ol.renderer.dom.TileLayerZ_(tileGrid, tileCoordOrigin);
+      newTileLayerZKeys[tileLayerZKey] = true;
+      this.tileLayerZs_[tileLayerZKey] = tileLayerZ;
+    }
+    tilesToDraw = tilesToDrawByZ[tileLayerZKey];
+    for (tileCoordKey in tilesToDraw) {
+      tileLayerZ.addTile(tilesToDraw[tileCoordKey], tileGutter);
+    }
+    tileLayerZ.finalizeAddTiles();
+  }
+
+  /** @type {Array.<number>} */
+  var tileLayerZKeys =
+      goog.array.map(goog.object.getKeys(this.tileLayerZs_), Number);
+  goog.array.sort(tileLayerZKeys);
+
+  var i, ii, j, origin, resolution;
+  var transform = goog.vec.Mat4.createNumber();
+  for (i = 0, ii = tileLayerZKeys.length; i < ii; ++i) {
+    tileLayerZKey = tileLayerZKeys[i];
+    tileLayerZ = this.tileLayerZs_[tileLayerZKey];
+    if (!(tileLayerZKey in tilesToDrawByZ)) {
+      goog.dom.removeNode(tileLayerZ.target);
+      delete this.tileLayerZs_[tileLayerZKey];
+      continue;
+    }
+    resolution = tileLayerZ.getResolution();
+    origin = tileLayerZ.getOrigin();
+    ol.vec.Mat4.makeTransform2D(transform,
+        frameState.size[0] / 2, frameState.size[1] / 2,
+        resolution / viewState.resolution,
+        resolution / viewState.resolution,
+        viewState.rotation,
+        (origin[0] - center[0]) / resolution,
+        (center[1] - origin[1]) / resolution);
+    tileLayerZ.setTransform(transform);
+    if (tileLayerZKey in newTileLayerZKeys) {
+      for (j = tileLayerZKey - 1; j >= 0; --j) {
+        if (j in this.tileLayerZs_) {
+          goog.dom.insertSiblingAfter(
+              tileLayerZ.target, this.tileLayerZs_[j].target);
+          break;
+        }
+      }
+      if (j < 0) {
+        goog.dom.insertChildAt(this.target, tileLayerZ.target, 0);
+      }
+    } else {
+      if (!frameState.viewHints[ol.ViewHint.ANIMATING] &&
+          !frameState.viewHints[ol.ViewHint.INTERACTING]) {
+        tileLayerZ.removeTilesOutsideExtent(extent, tmpTileRange);
+      }
+    }
+  }
+
+  if (layerState.opacity != this.renderedOpacity_) {
+    ol.dom.setOpacity(this.target, layerState.opacity);
+    this.renderedOpacity_ = layerState.opacity;
+  }
+
+  if (layerState.visible && !this.renderedVisible_) {
+    goog.style.setElementShown(this.target, true);
+    this.renderedVisible_ = true;
+  }
+
+  this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
+  this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio,
+      projection, extent, z, tileLayer.getPreload());
+  this.scheduleExpireCache(frameState, tileSource);
+  this.updateLogos(frameState, tileSource);
+
+  return true;
+};
+
+
+
+/**
+ * @constructor
+ * @private
+ * @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
+ * @param {ol.TileCoord} tileCoordOrigin Tile coord origin.
+ */
+ol.renderer.dom.TileLayerZ_ = function(tileGrid, tileCoordOrigin) {
+
+  /**
+   * @type {!Element}
+   */
+  this.target = goog.dom.createElement(goog.dom.TagName.DIV);
+  this.target.style.position = 'absolute';
+  this.target.style.width = '100%';
+  this.target.style.height = '100%';
+
+  if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+    /**
+     * Needed due to issues with IE7-8 clipping of transformed elements
+     * Solution is to translate separately from the scaled/rotated elements
+     * @private
+     * @type {!Element}
+     */
+    this.translateTarget_ = goog.dom.createElement(goog.dom.TagName.DIV);
+    this.translateTarget_.style.position = 'absolute';
+    this.translateTarget_.style.width = '100%';
+    this.translateTarget_.style.height = '100%';
+
+    goog.dom.appendChild(this.target, this.translateTarget_);
+  }
+
+  /**
+   * @private
+   * @type {ol.tilegrid.TileGrid}
+   */
+  this.tileGrid_ = tileGrid;
+
+  /**
+   * @private
+   * @type {ol.TileCoord}
+   */
+  this.tileCoordOrigin_ = tileCoordOrigin;
+
+  /**
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.origin_ =
+      ol.extent.getTopLeft(tileGrid.getTileCoordExtent(tileCoordOrigin));
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.resolution_ = tileGrid.getResolution(tileCoordOrigin[0]);
+
+  /**
+   * @private
+   * @type {Object.<string, ol.Tile>}
+   */
+  this.tiles_ = {};
+
+  /**
+   * @private
+   * @type {DocumentFragment}
+   */
+  this.documentFragment_ = null;
+
+  /**
+   * @private
+   * @type {goog.vec.Mat4.Number}
+   */
+  this.transform_ = goog.vec.Mat4.createNumberIdentity();
+
+};
+
+
+/**
+ * @param {ol.Tile} tile Tile.
+ * @param {number} tileGutter Tile gutter.
+ */
+ol.renderer.dom.TileLayerZ_.prototype.addTile = function(tile, tileGutter) {
+  var tileCoord = tile.tileCoord;
+  var tileCoordZ = tileCoord[0];
+  var tileCoordX = tileCoord[1];
+  var tileCoordY = tileCoord[2];
+  goog.asserts.assert(tileCoordZ == this.tileCoordOrigin_[0]);
+  var tileCoordKey = ol.tilecoord.toString(tileCoord);
+  if (tileCoordKey in this.tiles_) {
+    return;
+  }
+  var tileSize = this.tileGrid_.getTileSize(tileCoordZ);
+  var image = tile.getImage(this);
+  var imageStyle = image.style;
+  // Bootstrap sets the style max-width: 100% for all images, which
+  // prevents the tile from being displayed in FireFox.  Workaround
+  // by overriding the max-width style.
+  imageStyle.maxWidth = 'none';
+  var tileElement;
+  var tileElementStyle;
+  if (tileGutter > 0) {
+    tileElement = goog.dom.createElement(goog.dom.TagName.DIV);
+    tileElementStyle = tileElement.style;
+    tileElementStyle.overflow = 'hidden';
+    tileElementStyle.width = tileSize + 'px';
+    tileElementStyle.height = tileSize + 'px';
+    imageStyle.position = 'absolute';
+    imageStyle.left = -tileGutter + 'px';
+    imageStyle.top = -tileGutter + 'px';
+    imageStyle.width = (tileSize + 2 * tileGutter) + 'px';
+    imageStyle.height = (tileSize + 2 * tileGutter) + 'px';
+    goog.dom.appendChild(tileElement, image);
+  } else {
+    imageStyle.width = tileSize + 'px';
+    imageStyle.height = tileSize + 'px';
+    tileElement = image;
+    tileElementStyle = imageStyle;
+  }
+  tileElementStyle.position = 'absolute';
+  tileElementStyle.left =
+      ((tileCoordX - this.tileCoordOrigin_[1]) * tileSize) + 'px';
+  tileElementStyle.top =
+      ((this.tileCoordOrigin_[2] - tileCoordY) * tileSize) + 'px';
+  if (goog.isNull(this.documentFragment_)) {
+    this.documentFragment_ = document.createDocumentFragment();
+  }
+  goog.dom.appendChild(this.documentFragment_, tileElement);
+  this.tiles_[tileCoordKey] = tile;
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.renderer.dom.TileLayerZ_.prototype.finalizeAddTiles = function() {
+  if (!goog.isNull(this.documentFragment_)) {
+    if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+      goog.dom.appendChild(this.translateTarget_, this.documentFragment_);
+    } else {
+      goog.dom.appendChild(this.target, this.documentFragment_);
+    }
+    this.documentFragment_ = null;
+  }
+};
+
+
+/**
+ * @return {ol.Coordinate} Origin.
+ */
+ol.renderer.dom.TileLayerZ_.prototype.getOrigin = function() {
+  return this.origin_;
+};
+
+
+/**
+ * @return {number} Resolution.
+ */
+ol.renderer.dom.TileLayerZ_.prototype.getResolution = function() {
+  return this.resolution_;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object.
+ */
+ol.renderer.dom.TileLayerZ_.prototype.removeTilesOutsideExtent =
+    function(extent, opt_tileRange) {
+  var tileRange = this.tileGrid_.getTileRangeForExtentAndZ(
+      extent, this.tileCoordOrigin_[0], opt_tileRange);
+  /** @type {Array.<ol.Tile>} */
+  var tilesToRemove = [];
+  var tile, tileCoordKey;
+  for (tileCoordKey in this.tiles_) {
+    tile = this.tiles_[tileCoordKey];
+    if (!tileRange.contains(tile.tileCoord)) {
+      tilesToRemove.push(tile);
+    }
+  }
+  var i, ii;
+  for (i = 0, ii = tilesToRemove.length; i < ii; ++i) {
+    tile = tilesToRemove[i];
+    tileCoordKey = ol.tilecoord.toString(tile.tileCoord);
+    goog.dom.removeNode(tile.getImage(this));
+    delete this.tiles_[tileCoordKey];
+  }
+};
+
+
+/**
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ */
+ol.renderer.dom.TileLayerZ_.prototype.setTransform = function(transform) {
+  if (!ol.vec.Mat4.equals2D(transform, this.transform_)) {
+    if (ol.LEGACY_IE_SUPPORT && ol.IS_LEGACY_IE) {
+      ol.dom.transformElement2D(this.target, transform, 6,
+          this.translateTarget_);
+    } else {
+      ol.dom.transformElement2D(this.target, transform, 6);
+    }
+    goog.vec.Mat4.setFromArray(this.transform_, transform);
+  }
+};
diff --git a/src/ol/renderer/dom/domvectorlayerrenderer.js b/src/ol/renderer/dom/domvectorlayerrenderer.js
new file mode 100644
index 0000000..5d2d802
--- /dev/null
+++ b/src/ol/renderer/dom/domvectorlayerrenderer.js
@@ -0,0 +1,319 @@
+goog.provide('ol.renderer.dom.VectorLayer');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.vec.Mat4');
+goog.require('ol.ViewHint');
+goog.require('ol.dom');
+goog.require('ol.extent');
+goog.require('ol.layer.Vector');
+goog.require('ol.render.Event');
+goog.require('ol.render.EventType');
+goog.require('ol.render.canvas.Immediate');
+goog.require('ol.render.canvas.ReplayGroup');
+goog.require('ol.renderer.dom.Layer');
+goog.require('ol.renderer.vector');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.dom.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Vector} vectorLayer Vector layer.
+ */
+ol.renderer.dom.VectorLayer = function(mapRenderer, vectorLayer) {
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.context_ = ol.dom.createCanvasContext2D();
+
+  var target = this.context_.canvas;
+  // Bootstrap sets the style max-width: 100% for all images, which breaks
+  // prevents the image from being displayed in FireFox.  Workaround by
+  // overriding the max-width style.
+  target.style.maxWidth = 'none';
+  target.style.position = 'absolute';
+
+  goog.base(this, mapRenderer, vectorLayer, target);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.dirty_ = false;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedRevision_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedResolution_ = NaN;
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.renderedExtent_ = ol.extent.createEmpty();
+
+  /**
+   * @private
+   * @type {function(ol.Feature, ol.Feature): number|null}
+   */
+  this.renderedRenderOrder_ = null;
+
+  /**
+   * @private
+   * @type {ol.render.canvas.ReplayGroup}
+   */
+  this.replayGroup_ = null;
+
+  /**
+   * @private
+   * @type {goog.vec.Mat4.Number}
+   */
+  this.transform_ = goog.vec.Mat4.createNumber();
+
+};
+goog.inherits(ol.renderer.dom.VectorLayer, ol.renderer.dom.Layer);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.VectorLayer.prototype.composeFrame =
+    function(frameState, layerState) {
+
+  var vectorLayer = /** @type {ol.layer.Vector} */ (this.getLayer());
+  goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector);
+
+  var viewState = frameState.viewState;
+  var viewRotation = viewState.rotation;
+  var pixelRatio = frameState.pixelRatio;
+
+  var transform = ol.vec.Mat4.makeTransform2D(this.transform_,
+      pixelRatio * frameState.size[0] / 2,
+      pixelRatio * frameState.size[1] / 2,
+      pixelRatio / viewState.resolution,
+      -pixelRatio / viewState.resolution,
+      -viewState.rotation,
+      -viewState.center[0], -viewState.center[1]);
+
+  var context = this.context_;
+
+  // Clear the canvas and set the correct size
+  context.canvas.width = frameState.size[0];
+  context.canvas.height = frameState.size[1];
+
+  this.dispatchEvent_(ol.render.EventType.PRECOMPOSE, frameState, transform);
+
+  var replayGroup = this.replayGroup_;
+
+  if (!goog.isNull(replayGroup) && !replayGroup.isEmpty()) {
+
+    context.globalAlpha = layerState.opacity;
+    replayGroup.replay(context, pixelRatio, transform, viewRotation,
+        frameState.skippedFeatureUids);
+
+    this.dispatchEvent_(ol.render.EventType.RENDER, frameState, transform);
+  }
+
+  this.dispatchEvent_(ol.render.EventType.POSTCOMPOSE, frameState, transform);
+};
+
+
+/**
+ * @param {ol.render.EventType} type Event type.
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {goog.vec.Mat4.Number} transform Transform.
+ * @private
+ */
+ol.renderer.dom.VectorLayer.prototype.dispatchEvent_ =
+    function(type, frameState, transform) {
+  var context = this.context_;
+  var layer = this.getLayer();
+  if (layer.hasListener(type)) {
+    var render = new ol.render.canvas.Immediate(
+        context, frameState.pixelRatio, frameState.extent, transform,
+        frameState.viewState.rotation);
+    var event = new ol.render.Event(type, layer, render, null,
+        frameState, context, null);
+    layer.dispatchEvent(event);
+    render.flush();
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.VectorLayer.prototype.forEachFeatureAtPixel =
+    function(coordinate, frameState, callback, thisArg) {
+  if (goog.isNull(this.replayGroup_)) {
+    return undefined;
+  } else {
+    var resolution = frameState.viewState.resolution;
+    var rotation = frameState.viewState.rotation;
+    var layer = this.getLayer();
+    /** @type {Object.<string, boolean>} */
+    var features = {};
+    return this.replayGroup_.forEachGeometryAtPixel(resolution,
+        rotation, coordinate, frameState.skippedFeatureUids,
+        /**
+         * @param {ol.Feature} feature Feature.
+         * @return {?} Callback result.
+         */
+        function(feature) {
+          goog.asserts.assert(goog.isDef(feature));
+          var key = goog.getUid(feature).toString();
+          if (!(key in features)) {
+            features[key] = true;
+            return callback.call(thisArg, feature, layer);
+          }
+        });
+  }
+};
+
+
+/**
+ * Handle changes in image style state.
+ * @param {goog.events.Event} event Image style change event.
+ * @private
+ */
+ol.renderer.dom.VectorLayer.prototype.handleImageChange_ =
+    function(event) {
+  this.renderIfReadyAndVisible();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.dom.VectorLayer.prototype.prepareFrame =
+    function(frameState, layerState) {
+
+  var vectorLayer = /** @type {ol.layer.Vector} */ (this.getLayer());
+  goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector);
+  var vectorSource = vectorLayer.getSource();
+
+  this.updateAttributions(
+      frameState.attributions, vectorSource.getAttributions());
+  this.updateLogos(frameState, vectorSource);
+
+  if (!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] ||
+      frameState.viewHints[ol.ViewHint.INTERACTING])) {
+    return true;
+  }
+
+  var frameStateExtent = frameState.extent;
+  var viewState = frameState.viewState;
+  var projection = viewState.projection;
+  var resolution = viewState.resolution;
+  var pixelRatio = frameState.pixelRatio;
+  var vectorLayerRevision = vectorLayer.getRevision();
+  var vectorLayerRenderBuffer = vectorLayer.getRenderBuffer();
+  var vectorLayerRenderOrder = vectorLayer.getRenderOrder();
+
+  if (!goog.isDef(vectorLayerRenderOrder)) {
+    vectorLayerRenderOrder = ol.renderer.vector.defaultOrder;
+  }
+
+  var extent = ol.extent.buffer(frameStateExtent,
+      vectorLayerRenderBuffer * resolution);
+
+  if (!this.dirty_ &&
+      this.renderedResolution_ == resolution &&
+      this.renderedRevision_ == vectorLayerRevision &&
+      this.renderedRenderOrder_ == vectorLayerRenderOrder &&
+      ol.extent.containsExtent(this.renderedExtent_, extent)) {
+    return true;
+  }
+
+  // FIXME dispose of old replayGroup in post render
+  goog.dispose(this.replayGroup_);
+  this.replayGroup_ = null;
+
+  this.dirty_ = false;
+
+  var replayGroup =
+      new ol.render.canvas.ReplayGroup(
+          ol.renderer.vector.getTolerance(resolution, pixelRatio), extent,
+          resolution);
+  vectorSource.loadFeatures(extent, resolution, projection);
+  var renderFeature =
+      /**
+       * @param {ol.Feature} feature Feature.
+       * @this {ol.renderer.dom.VectorLayer}
+       */
+      function(feature) {
+    var styles;
+    if (goog.isDef(feature.getStyleFunction())) {
+      styles = feature.getStyleFunction().call(feature, resolution);
+    } else if (goog.isDef(vectorLayer.getStyleFunction())) {
+      styles = vectorLayer.getStyleFunction()(feature, resolution);
+    }
+    if (goog.isDefAndNotNull(styles)) {
+      var dirty = this.renderFeature(
+          feature, resolution, pixelRatio, styles, replayGroup);
+      this.dirty_ = this.dirty_ || dirty;
+    }
+  };
+  if (!goog.isNull(vectorLayerRenderOrder)) {
+    /** @type {Array.<ol.Feature>} */
+    var features = [];
+    vectorSource.forEachFeatureInExtentAtResolution(extent, resolution,
+        /**
+         * @param {ol.Feature} feature Feature.
+         */
+        function(feature) {
+          features.push(feature);
+        }, this);
+    goog.array.sort(features, vectorLayerRenderOrder);
+    goog.array.forEach(features, renderFeature, this);
+  } else {
+    vectorSource.forEachFeatureInExtentAtResolution(
+        extent, resolution, renderFeature, this);
+  }
+  replayGroup.finish();
+
+  this.renderedResolution_ = resolution;
+  this.renderedRevision_ = vectorLayerRevision;
+  this.renderedRenderOrder_ = vectorLayerRenderOrder;
+  this.renderedExtent_ = extent;
+  this.replayGroup_ = replayGroup;
+
+  return true;
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {Array.<ol.style.Style>} styles Array of styles
+ * @param {ol.render.canvas.ReplayGroup} replayGroup Replay group.
+ * @return {boolean} `true` if an image is loading.
+ */
+ol.renderer.dom.VectorLayer.prototype.renderFeature =
+    function(feature, resolution, pixelRatio, styles, replayGroup) {
+  if (!goog.isDefAndNotNull(styles)) {
+    return false;
+  }
+  var i, ii, loading = false;
+  for (i = 0, ii = styles.length; i < ii; ++i) {
+    loading = ol.renderer.vector.renderFeature(
+        replayGroup, feature, styles[i],
+        ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
+        this.handleImageChange_, this) || loading;
+  }
+  return loading;
+};
diff --git a/src/ol/renderer/layerrenderer.js b/src/ol/renderer/layerrenderer.js
new file mode 100644
index 0000000..356561b
--- /dev/null
+++ b/src/ol/renderer/layerrenderer.js
@@ -0,0 +1,293 @@
+goog.provide('ol.renderer.Layer');
+
+goog.require('goog.Disposable');
+goog.require('goog.asserts');
+goog.require('ol.ImageState');
+goog.require('ol.TileRange');
+goog.require('ol.TileState');
+goog.require('ol.layer.Layer');
+goog.require('ol.source.Source');
+goog.require('ol.source.State');
+goog.require('ol.source.Tile');
+goog.require('ol.tilecoord');
+
+
+
+/**
+ * @constructor
+ * @extends {goog.Disposable}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Layer} layer Layer.
+ * @suppress {checkStructDictInheritance}
+ * @struct
+ */
+ol.renderer.Layer = function(mapRenderer, layer) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {ol.renderer.Map}
+   */
+  this.mapRenderer_ = mapRenderer;
+
+  /**
+   * @private
+   * @type {ol.layer.Layer}
+   */
+  this.layer_ = layer;
+
+
+};
+goog.inherits(ol.renderer.Layer, goog.Disposable);
+
+
+/**
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {function(this: S, ol.Feature, ol.layer.Layer): T} callback Feature
+ *     callback.
+ * @param {S} thisArg Value to use as `this` when executing `callback`.
+ * @return {T|undefined} Callback result.
+ * @template S,T
+ */
+ol.renderer.Layer.prototype.forEachFeatureAtPixel = goog.nullFunction;
+
+
+/**
+ * @protected
+ * @return {ol.layer.Layer} Layer.
+ */
+ol.renderer.Layer.prototype.getLayer = function() {
+  return this.layer_;
+};
+
+
+/**
+ * @protected
+ * @return {ol.Map} Map.
+ */
+ol.renderer.Layer.prototype.getMap = function() {
+  return this.mapRenderer_.getMap();
+};
+
+
+/**
+ * @protected
+ * @return {ol.renderer.Map} Map renderer.
+ */
+ol.renderer.Layer.prototype.getMapRenderer = function() {
+  return this.mapRenderer_;
+};
+
+
+/**
+ * Handle changes in image state.
+ * @param {goog.events.Event} event Image change event.
+ * @protected
+ */
+ol.renderer.Layer.prototype.handleImageChange = function(event) {
+  var image = /** @type {ol.Image} */ (event.target);
+  if (image.getState() === ol.ImageState.LOADED) {
+    this.renderIfReadyAndVisible();
+  }
+};
+
+
+/**
+ * @protected
+ */
+ol.renderer.Layer.prototype.renderIfReadyAndVisible = function() {
+  var layer = this.getLayer();
+  if (layer.getVisible() && layer.getSourceState() == ol.source.State.READY) {
+    this.getMap().render();
+  }
+};
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.source.Tile} tileSource Tile source.
+ * @protected
+ */
+ol.renderer.Layer.prototype.scheduleExpireCache =
+    function(frameState, tileSource) {
+  if (tileSource.canExpireCache()) {
+    frameState.postRenderFunctions.push(
+        goog.partial(
+            /**
+             * @param {ol.source.Tile} tileSource Tile source.
+             * @param {ol.Map} map Map.
+             * @param {olx.FrameState} frameState Frame state.
+             */
+            function(tileSource, map, frameState) {
+              var tileSourceKey = goog.getUid(tileSource).toString();
+              tileSource.expireCache(frameState.usedTiles[tileSourceKey]);
+            }, tileSource));
+  }
+};
+
+
+/**
+ * @param {Object.<string, ol.Attribution>} attributionsSet Attributions
+ *     set (target).
+ * @param {Array.<ol.Attribution>} attributions Attributions (source).
+ * @protected
+ */
+ol.renderer.Layer.prototype.updateAttributions =
+    function(attributionsSet, attributions) {
+  if (goog.isDefAndNotNull(attributions)) {
+    var attribution, i, ii;
+    for (i = 0, ii = attributions.length; i < ii; ++i) {
+      attribution = attributions[i];
+      attributionsSet[goog.getUid(attribution).toString()] = attribution;
+    }
+  }
+};
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.source.Source} source Source.
+ * @protected
+ */
+ol.renderer.Layer.prototype.updateLogos = function(frameState, source) {
+  var logo = source.getLogo();
+  if (goog.isDef(logo)) {
+    if (goog.isString(logo)) {
+      frameState.logos[logo] = '';
+    } else if (goog.isObject(logo)) {
+      goog.asserts.assertString(logo.href);
+      goog.asserts.assertString(logo.src);
+      frameState.logos[logo.src] = logo.href;
+    }
+  }
+};
+
+
+/**
+ * @param {Object.<string, Object.<string, ol.TileRange>>} usedTiles Used tiles.
+ * @param {ol.source.Tile} tileSource Tile source.
+ * @param {number} z Z.
+ * @param {ol.TileRange} tileRange Tile range.
+ * @protected
+ */
+ol.renderer.Layer.prototype.updateUsedTiles =
+    function(usedTiles, tileSource, z, tileRange) {
+  // FIXME should we use tilesToDrawByZ instead?
+  var tileSourceKey = goog.getUid(tileSource).toString();
+  var zKey = z.toString();
+  if (tileSourceKey in usedTiles) {
+    if (zKey in usedTiles[tileSourceKey]) {
+      usedTiles[tileSourceKey][zKey].extend(tileRange);
+    } else {
+      usedTiles[tileSourceKey][zKey] = tileRange;
+    }
+  } else {
+    usedTiles[tileSourceKey] = {};
+    usedTiles[tileSourceKey][zKey] = tileRange;
+  }
+};
+
+
+/**
+ * @param {function(ol.Tile): boolean} isLoadedFunction Function to
+ *     determine if the tile is loaded.
+ * @param {ol.source.Tile} tileSource Tile source.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @protected
+ * @return {function(number, number, number): ol.Tile} Returns a tile if it is
+ *     loaded.
+ */
+ol.renderer.Layer.prototype.createGetTileIfLoadedFunction =
+    function(isLoadedFunction, tileSource, pixelRatio, projection) {
+  return (
+      /**
+       * @param {number} z Z.
+       * @param {number} x X.
+       * @param {number} y Y.
+       * @return {ol.Tile} Tile.
+       */
+      function(z, x, y) {
+        var tile = tileSource.getTile(z, x, y, pixelRatio, projection);
+        return isLoadedFunction(tile) ? tile : null;
+      });
+};
+
+
+/**
+ * @param {ol.Coordinate} center Center.
+ * @param {number} resolution Resolution.
+ * @param {ol.Size} size Size.
+ * @protected
+ * @return {ol.Coordinate} Snapped center.
+ */
+ol.renderer.Layer.prototype.snapCenterToPixel =
+    function(center, resolution, size) {
+  return [
+    resolution * (Math.round(center[0] / resolution) + (size[0] % 2) / 2),
+    resolution * (Math.round(center[1] / resolution) + (size[1] % 2) / 2)
+  ];
+};
+
+
+/**
+ * Manage tile pyramid.
+ * This function performs a number of functions related to the tiles at the
+ * current zoom and lower zoom levels:
+ * - registers idle tiles in frameState.wantedTiles so that they are not
+ *   discarded by the tile queue
+ * - enqueues missing tiles
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.source.Tile} tileSource Tile source.
+ * @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @param {ol.Extent} extent Extent.
+ * @param {number} currentZ Current Z.
+ * @param {number|undefined} preload Load low resolution tiles up to 'preload'
+ *     levels.
+ * @param {function(this: T, ol.Tile)=} opt_tileCallback Tile callback.
+ * @param {T=} opt_this Object to use as `this` in `opt_tileCallback`.
+ * @protected
+ * @template T
+ */
+ol.renderer.Layer.prototype.manageTilePyramid = function(
+    frameState, tileSource, tileGrid, pixelRatio, projection, extent,
+    currentZ, preload, opt_tileCallback, opt_this) {
+  var tileSourceKey = goog.getUid(tileSource).toString();
+  if (!(tileSourceKey in frameState.wantedTiles)) {
+    frameState.wantedTiles[tileSourceKey] = {};
+  }
+  var wantedTiles = frameState.wantedTiles[tileSourceKey];
+  var tileQueue = frameState.tileQueue;
+  var minZoom = tileGrid.getMinZoom();
+  var tile, tileRange, tileResolution, x, y, z;
+  if (!goog.isDef(preload)) {
+    preload = 0;
+  }
+  for (z = currentZ; z >= minZoom; --z) {
+    tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z, tileRange);
+    tileResolution = tileGrid.getResolution(z);
+    for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
+      for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
+        if (currentZ - z <= preload) {
+          tile = tileSource.getTile(z, x, y, pixelRatio, projection);
+          if (tile.getState() == ol.TileState.IDLE) {
+            wantedTiles[ol.tilecoord.toString(tile.tileCoord)] = true;
+            if (!tileQueue.isKeyQueued(tile.getKey())) {
+              tileQueue.enqueue([tile, tileSourceKey,
+                tileGrid.getTileCoordCenter(tile.tileCoord), tileResolution]);
+            }
+          }
+          if (goog.isDef(opt_tileCallback)) {
+            opt_tileCallback.call(opt_this, tile);
+          }
+        } else {
+          tileSource.useTile(z, x, y);
+        }
+      }
+    }
+  }
+};
diff --git a/src/ol/renderer/maprenderer.js b/src/ol/renderer/maprenderer.js
new file mode 100644
index 0000000..7dd9bc0
--- /dev/null
+++ b/src/ol/renderer/maprenderer.js
@@ -0,0 +1,282 @@
+goog.provide('ol.RendererType');
+goog.provide('ol.renderer.Map');
+
+goog.require('goog.Disposable');
+goog.require('goog.asserts');
+goog.require('goog.dispose');
+goog.require('goog.object');
+goog.require('goog.vec.Mat4');
+goog.require('ol.layer.Layer');
+goog.require('ol.renderer.Layer');
+goog.require('ol.style.IconImageCache');
+goog.require('ol.vec.Mat4');
+
+
+/**
+ * Available renderers: `'canvas'`, `'dom'` or `'webgl'`.
+ * @enum {string}
+ * @api stable
+ */
+ol.RendererType = {
+  CANVAS: 'canvas',
+  DOM: 'dom',
+  WEBGL: 'webgl'
+};
+
+
+
+/**
+ * @constructor
+ * @extends {goog.Disposable}
+ * @param {Element} container Container.
+ * @param {ol.Map} map Map.
+ * @suppress {checkStructDictInheritance}
+ * @struct
+ */
+ol.renderer.Map = function(container, map) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {ol.Map}
+   */
+  this.map_ = map;
+
+  /**
+   * @protected
+   * @type {ol.render.IReplayGroup}
+   */
+  this.replayGroup = null;
+
+  /**
+   * @private
+   * @type {Object.<string, ol.renderer.Layer>}
+   */
+  this.layerRenderers_ = {};
+
+};
+goog.inherits(ol.renderer.Map, goog.Disposable);
+
+
+/**
+ * @param {olx.FrameState} frameState FrameState.
+ * @protected
+ */
+ol.renderer.Map.prototype.calculateMatrices2D = function(frameState) {
+  var viewState = frameState.viewState;
+  var coordinateToPixelMatrix = frameState.coordinateToPixelMatrix;
+  goog.asserts.assert(!goog.isNull(coordinateToPixelMatrix));
+  ol.vec.Mat4.makeTransform2D(coordinateToPixelMatrix,
+      frameState.size[0] / 2, frameState.size[1] / 2,
+      1 / viewState.resolution, -1 / viewState.resolution,
+      -viewState.rotation,
+      -viewState.center[0], -viewState.center[1]);
+  var inverted = goog.vec.Mat4.invert(
+      coordinateToPixelMatrix, frameState.pixelToCoordinateMatrix);
+  goog.asserts.assert(inverted);
+};
+
+
+/**
+ * @param {ol.layer.Layer} layer Layer.
+ * @protected
+ * @return {ol.renderer.Layer} layerRenderer Layer renderer.
+ */
+ol.renderer.Map.prototype.createLayerRenderer = function(layer) {
+  return new ol.renderer.Layer(this, layer);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.Map.prototype.disposeInternal = function() {
+  goog.object.forEach(this.layerRenderers_, goog.dispose);
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {olx.FrameState} frameState Frame state.
+ * @private
+ */
+ol.renderer.Map.expireIconCache_ = function(map, frameState) {
+  ol.style.IconImageCache.getInstance().expire();
+};
+
+
+/**
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {olx.FrameState} frameState FrameState.
+ * @param {function(this: S, ol.Feature, ol.layer.Layer): T} callback Feature
+ *     callback.
+ * @param {S} thisArg Value to use as `this` when executing `callback`.
+ * @param {function(this: U, ol.layer.Layer): boolean} layerFilter Layer filter
+ *     function, only layers which are visible and for which this function
+ *     returns `true` will be tested for features.  By default, all visible
+ *     layers will be tested.
+ * @param {U} thisArg2 Value to use as `this` when executing `layerFilter`.
+ * @return {T|undefined} Callback result.
+ * @template S,T,U
+ */
+ol.renderer.Map.prototype.forEachFeatureAtPixel =
+    function(coordinate, frameState, callback, thisArg,
+        layerFilter, thisArg2) {
+  var result;
+  var viewState = frameState.viewState;
+  var viewResolution = viewState.resolution;
+  var viewRotation = viewState.rotation;
+  if (!goog.isNull(this.replayGroup)) {
+    /** @type {Object.<string, boolean>} */
+    var features = {};
+    result = this.replayGroup.forEachGeometryAtPixel(viewResolution,
+        viewRotation, coordinate, {},
+        /**
+         * @param {ol.Feature} feature Feature.
+         * @return {?} Callback result.
+         */
+        function(feature) {
+          goog.asserts.assert(goog.isDef(feature));
+          var key = goog.getUid(feature).toString();
+          if (!(key in features)) {
+            features[key] = true;
+            return callback.call(thisArg, feature, null);
+          }
+        });
+    if (result) {
+      return result;
+    }
+  }
+  var layerStates = this.map_.getLayerGroup().getLayerStatesArray();
+  var numLayers = layerStates.length;
+  var i;
+  for (i = numLayers - 1; i >= 0; --i) {
+    var layerState = layerStates[i];
+    var layer = layerState.layer;
+    if (ol.layer.Layer.visibleAtResolution(layerState, viewResolution) &&
+        layerFilter.call(thisArg2, layer)) {
+      var layerRenderer = this.getLayerRenderer(layer);
+      result = layerRenderer.forEachFeatureAtPixel(
+          coordinate, frameState, callback, thisArg);
+      if (result) {
+        return result;
+      }
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * @param {ol.layer.Layer} layer Layer.
+ * @protected
+ * @return {ol.renderer.Layer} Layer renderer.
+ */
+ol.renderer.Map.prototype.getLayerRenderer = function(layer) {
+  var layerKey = goog.getUid(layer).toString();
+  if (layerKey in this.layerRenderers_) {
+    return this.layerRenderers_[layerKey];
+  } else {
+    var layerRenderer = this.createLayerRenderer(layer);
+    this.layerRenderers_[layerKey] = layerRenderer;
+    return layerRenderer;
+  }
+};
+
+
+/**
+ * @param {string} layerKey Layer key.
+ * @protected
+ * @return {ol.renderer.Layer} Layer renderer.
+ */
+ol.renderer.Map.prototype.getLayerRendererByKey = function(layerKey) {
+  goog.asserts.assert(layerKey in this.layerRenderers_);
+  return this.layerRenderers_[layerKey];
+};
+
+
+/**
+ * @protected
+ * @return {Object.<number, ol.renderer.Layer>} Layer renderers.
+ */
+ol.renderer.Map.prototype.getLayerRenderers = function() {
+  return this.layerRenderers_;
+};
+
+
+/**
+ * @return {ol.Map} Map.
+ */
+ol.renderer.Map.prototype.getMap = function() {
+  return this.map_;
+};
+
+
+/**
+ * @return {string} Type
+ */
+ol.renderer.Map.prototype.getType = goog.abstractMethod;
+
+
+/**
+ * @param {string} layerKey Layer key.
+ * @return {ol.renderer.Layer} Layer renderer.
+ * @private
+ */
+ol.renderer.Map.prototype.removeLayerRendererByKey_ = function(layerKey) {
+  goog.asserts.assert(layerKey in this.layerRenderers_);
+  var layerRenderer = this.layerRenderers_[layerKey];
+  delete this.layerRenderers_[layerKey];
+  return layerRenderer;
+};
+
+
+/**
+ * Render.
+ * @param {?olx.FrameState} frameState Frame state.
+ */
+ol.renderer.Map.prototype.renderFrame = goog.nullFunction;
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {olx.FrameState} frameState Frame state.
+ * @private
+ */
+ol.renderer.Map.prototype.removeUnusedLayerRenderers_ =
+    function(map, frameState) {
+  var layerKey;
+  for (layerKey in this.layerRenderers_) {
+    if (goog.isNull(frameState) || !(layerKey in frameState.layerStates)) {
+      goog.dispose(this.removeLayerRendererByKey_(layerKey));
+    }
+  }
+};
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @protected
+ */
+ol.renderer.Map.prototype.scheduleExpireIconCache = function(frameState) {
+  frameState.postRenderFunctions.push(ol.renderer.Map.expireIconCache_);
+};
+
+
+/**
+ * @param {!olx.FrameState} frameState Frame state.
+ * @protected
+ */
+ol.renderer.Map.prototype.scheduleRemoveUnusedLayerRenderers =
+    function(frameState) {
+  var layerKey;
+  for (layerKey in this.layerRenderers_) {
+    if (!(layerKey in frameState.layerStates)) {
+      frameState.postRenderFunctions.push(
+          goog.bind(this.removeUnusedLayerRenderers_, this));
+      return;
+    }
+  }
+};
diff --git a/src/ol/renderer/webgl/webglimagelayerrenderer.js b/src/ol/renderer/webgl/webglimagelayerrenderer.js
new file mode 100644
index 0000000..61dd3f6
--- /dev/null
+++ b/src/ol/renderer/webgl/webglimagelayerrenderer.js
@@ -0,0 +1,217 @@
+goog.provide('ol.renderer.webgl.ImageLayer');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.vec.Mat4');
+goog.require('goog.webgl');
+goog.require('ol.Coordinate');
+goog.require('ol.Extent');
+goog.require('ol.ImageBase');
+goog.require('ol.ImageState');
+goog.require('ol.ViewHint');
+goog.require('ol.extent');
+goog.require('ol.layer.Image');
+goog.require('ol.proj');
+goog.require('ol.renderer.webgl.Layer');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.webgl.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Image} imageLayer Tile layer.
+ */
+ol.renderer.webgl.ImageLayer = function(mapRenderer, imageLayer) {
+
+  goog.base(this, mapRenderer, imageLayer);
+
+  /**
+   * The last rendered image.
+   * @private
+   * @type {?ol.ImageBase}
+   */
+  this.image_ = null;
+
+};
+goog.inherits(ol.renderer.webgl.ImageLayer, ol.renderer.webgl.Layer);
+
+
+/**
+ * @param {ol.ImageBase} image Image.
+ * @private
+ * @return {WebGLTexture} Texture.
+ */
+ol.renderer.webgl.ImageLayer.prototype.createTexture_ = function(image) {
+
+  // We meet the conditions to work with non-power of two textures.
+  // http://www.khronos.org/webgl/wiki/WebGL_and_OpenGL_Differences#Non-Power_of_Two_Texture_Support
+  // http://learningwebgl.com/blog/?p=2101
+
+  var imageElement = image.getImage();
+  var gl = this.getWebGLMapRenderer().getGL();
+
+  var texture = gl.createTexture();
+
+  gl.bindTexture(goog.webgl.TEXTURE_2D, texture);
+  gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA,
+      goog.webgl.RGBA, goog.webgl.UNSIGNED_BYTE, imageElement);
+
+  gl.texParameteri(
+      goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_S,
+      goog.webgl.CLAMP_TO_EDGE);
+  gl.texParameteri(
+      goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_T,
+      goog.webgl.CLAMP_TO_EDGE);
+  gl.texParameteri(
+      goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, goog.webgl.LINEAR);
+  gl.texParameteri(
+      goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, goog.webgl.LINEAR);
+
+  return texture;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.ImageLayer.prototype.forEachFeatureAtPixel =
+    function(coordinate, frameState, callback, thisArg) {
+  var layer = this.getLayer();
+  var source = layer.getSource();
+  var resolution = frameState.viewState.resolution;
+  var rotation = frameState.viewState.rotation;
+  var skippedFeatureUids = frameState.skippedFeatureUids;
+  return source.forEachFeatureAtPixel(
+      resolution, rotation, coordinate, skippedFeatureUids,
+
+      /**
+       * @param {ol.Feature} feature Feature.
+       * @return {?} Callback result.
+       */
+      function(feature) {
+        return callback.call(thisArg, feature, layer);
+      });
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.ImageLayer.prototype.prepareFrame =
+    function(frameState, layerState, context) {
+
+  var gl = this.getWebGLMapRenderer().getGL();
+
+  var viewState = frameState.viewState;
+  var viewCenter = viewState.center;
+  var viewResolution = viewState.resolution;
+  var viewRotation = viewState.rotation;
+
+  var image = this.image_;
+  var texture = this.texture;
+  var imageLayer = this.getLayer();
+  goog.asserts.assertInstanceof(imageLayer, ol.layer.Image);
+  var imageSource = imageLayer.getSource();
+
+  var hints = frameState.viewHints;
+
+  var renderedExtent = frameState.extent;
+  if (goog.isDef(layerState.extent)) {
+    renderedExtent = ol.extent.getIntersection(
+        renderedExtent, layerState.extent);
+  }
+  if (!hints[ol.ViewHint.ANIMATING] && !hints[ol.ViewHint.INTERACTING] &&
+      !ol.extent.isEmpty(renderedExtent)) {
+    var projection = viewState.projection;
+    var sourceProjection = imageSource.getProjection();
+    if (!goog.isNull(sourceProjection)) {
+      goog.asserts.assert(ol.proj.equivalent(projection, sourceProjection));
+      projection = sourceProjection;
+    }
+    var image_ = imageSource.getImage(renderedExtent, viewResolution,
+        frameState.pixelRatio, projection);
+    if (!goog.isNull(image_)) {
+      var imageState = image_.getState();
+      if (imageState == ol.ImageState.IDLE) {
+        goog.events.listenOnce(image_, goog.events.EventType.CHANGE,
+            this.handleImageChange, false, this);
+        image_.load();
+      } else if (imageState == ol.ImageState.LOADED) {
+        image = image_;
+        texture = this.createTexture_(image_);
+        if (!goog.isNull(this.texture)) {
+          frameState.postRenderFunctions.push(
+              goog.partial(
+                  /**
+                   * @param {WebGLRenderingContext} gl GL.
+                   * @param {WebGLTexture} texture Texture.
+                   */
+                  function(gl, texture) {
+                    if (!gl.isContextLost()) {
+                      gl.deleteTexture(texture);
+                    }
+                  }, gl, this.texture));
+        }
+      }
+    }
+  }
+
+  if (!goog.isNull(image)) {
+    goog.asserts.assert(!goog.isNull(texture));
+
+    var canvas = this.getWebGLMapRenderer().getContext().getCanvas();
+
+    this.updateProjectionMatrix_(canvas.width, canvas.height,
+        viewCenter, viewResolution, viewRotation, image.getExtent());
+
+    // Translate and scale to flip the Y coord.
+    var texCoordMatrix = this.texCoordMatrix;
+    goog.vec.Mat4.makeIdentity(texCoordMatrix);
+    goog.vec.Mat4.scale(texCoordMatrix, 1, -1, 1);
+    goog.vec.Mat4.translate(texCoordMatrix, 0, -1, 0);
+
+    this.image_ = image;
+    this.texture = texture;
+
+    this.updateAttributions(frameState.attributions, image.getAttributions());
+    this.updateLogos(frameState, imageSource);
+  }
+
+  return true;
+};
+
+
+/**
+ * @param {number} canvasWidth Canvas width.
+ * @param {number} canvasHeight Canvas height.
+ * @param {ol.Coordinate} viewCenter View center.
+ * @param {number} viewResolution View resolution.
+ * @param {number} viewRotation View rotation.
+ * @param {ol.Extent} imageExtent Image extent.
+ * @private
+ */
+ol.renderer.webgl.ImageLayer.prototype.updateProjectionMatrix_ =
+    function(canvasWidth, canvasHeight, viewCenter,
+        viewResolution, viewRotation, imageExtent) {
+
+  var canvasExtentWidth = canvasWidth * viewResolution;
+  var canvasExtentHeight = canvasHeight * viewResolution;
+
+  var projectionMatrix = this.projectionMatrix;
+  goog.vec.Mat4.makeIdentity(projectionMatrix);
+  goog.vec.Mat4.scale(projectionMatrix,
+      2 / canvasExtentWidth, 2 / canvasExtentHeight, 1);
+  goog.vec.Mat4.rotateZ(projectionMatrix, -viewRotation);
+  goog.vec.Mat4.translate(projectionMatrix,
+      imageExtent[0] - viewCenter[0],
+      imageExtent[1] - viewCenter[1],
+      0);
+  goog.vec.Mat4.scale(projectionMatrix,
+      (imageExtent[2] - imageExtent[0]) / 2,
+      (imageExtent[3] - imageExtent[1]) / 2,
+      1);
+  goog.vec.Mat4.translate(projectionMatrix, 1, 1, 0);
+
+};
diff --git a/src/ol/renderer/webgl/webgllayerrenderer.js b/src/ol/renderer/webgl/webgllayerrenderer.js
new file mode 100644
index 0000000..4f09f7b
--- /dev/null
+++ b/src/ol/renderer/webgl/webgllayerrenderer.js
@@ -0,0 +1,306 @@
+goog.provide('ol.renderer.webgl.Layer');
+
+goog.require('goog.vec.Mat4');
+goog.require('goog.webgl');
+goog.require('ol.color.Matrix');
+goog.require('ol.layer.Layer');
+goog.require('ol.render.Event');
+goog.require('ol.render.EventType');
+goog.require('ol.render.webgl.Immediate');
+goog.require('ol.renderer.Layer');
+goog.require('ol.renderer.webgl.map.shader.Color');
+goog.require('ol.renderer.webgl.map.shader.Default');
+goog.require('ol.webgl.Buffer');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Layer} layer Layer.
+ */
+ol.renderer.webgl.Layer = function(mapRenderer, layer) {
+
+  goog.base(this, mapRenderer, layer);
+
+  /**
+   * @private
+   * @type {ol.webgl.Buffer}
+   */
+  this.arrayBuffer_ = new ol.webgl.Buffer([
+    -1, -1, 0, 0,
+    1, -1, 1, 0,
+    -1, 1, 0, 1,
+    1, 1, 1, 1
+  ]);
+
+  /**
+   * @protected
+   * @type {WebGLTexture}
+   */
+  this.texture = null;
+
+  /**
+   * @protected
+   * @type {WebGLFramebuffer}
+   */
+  this.framebuffer = null;
+
+  /**
+   * @protected
+   * @type {number|undefined}
+   */
+  this.framebufferDimension = undefined;
+
+  /**
+   * @protected
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.texCoordMatrix = goog.vec.Mat4.createNumber();
+
+  /**
+   * @protected
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.projectionMatrix = goog.vec.Mat4.createNumberIdentity();
+
+  /**
+   * @private
+   * @type {ol.color.Matrix}
+   */
+  this.colorMatrix_ = new ol.color.Matrix();
+
+  /**
+   * @private
+   * @type {ol.renderer.webgl.map.shader.Color.Locations}
+   */
+  this.colorLocations_ = null;
+
+  /**
+   * @private
+   * @type {ol.renderer.webgl.map.shader.Default.Locations}
+   */
+  this.defaultLocations_ = null;
+
+};
+goog.inherits(ol.renderer.webgl.Layer, ol.renderer.Layer);
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {number} framebufferDimension Framebuffer dimension.
+ * @protected
+ */
+ol.renderer.webgl.Layer.prototype.bindFramebuffer =
+    function(frameState, framebufferDimension) {
+
+  var mapRenderer = this.getWebGLMapRenderer();
+  var gl = mapRenderer.getGL();
+
+  if (!goog.isDef(this.framebufferDimension) ||
+      this.framebufferDimension != framebufferDimension) {
+
+    frameState.postRenderFunctions.push(
+        goog.partial(
+            /**
+             * @param {WebGLRenderingContext} gl GL.
+             * @param {WebGLFramebuffer} framebuffer Framebuffer.
+             * @param {WebGLTexture} texture Texture.
+             */
+            function(gl, framebuffer, texture) {
+              if (!gl.isContextLost()) {
+                gl.deleteFramebuffer(framebuffer);
+                gl.deleteTexture(texture);
+              }
+            }, gl, this.framebuffer, this.texture));
+
+    var texture = gl.createTexture();
+    gl.bindTexture(goog.webgl.TEXTURE_2D, texture);
+    gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA,
+        framebufferDimension, framebufferDimension, 0, goog.webgl.RGBA,
+        goog.webgl.UNSIGNED_BYTE, null);
+    gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER,
+        goog.webgl.LINEAR);
+    gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER,
+        goog.webgl.LINEAR);
+
+    var framebuffer = gl.createFramebuffer();
+    gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer);
+    gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER,
+        goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0);
+
+    this.texture = texture;
+    this.framebuffer = framebuffer;
+    this.framebufferDimension = framebufferDimension;
+
+  } else {
+    gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer);
+  }
+
+};
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.layer.LayerState} layerState Layer state.
+ * @param {ol.webgl.Context} context Context.
+ */
+ol.renderer.webgl.Layer.prototype.composeFrame =
+    function(frameState, layerState, context) {
+
+  this.dispatchComposeEvent_(
+      ol.render.EventType.PRECOMPOSE, context, frameState);
+
+  context.bindBuffer(goog.webgl.ARRAY_BUFFER, this.arrayBuffer_);
+
+  var gl = context.getGL();
+
+  var useColor =
+      layerState.brightness ||
+      layerState.contrast != 1 ||
+      layerState.hue ||
+      layerState.saturation != 1;
+
+  var fragmentShader, vertexShader;
+  if (useColor) {
+    fragmentShader = ol.renderer.webgl.map.shader.ColorFragment.getInstance();
+    vertexShader = ol.renderer.webgl.map.shader.ColorVertex.getInstance();
+  } else {
+    fragmentShader =
+        ol.renderer.webgl.map.shader.DefaultFragment.getInstance();
+    vertexShader = ol.renderer.webgl.map.shader.DefaultVertex.getInstance();
+  }
+
+  var program = context.getProgram(fragmentShader, vertexShader);
+
+  // FIXME colorLocations_ and defaultLocations_ should be shared somehow
+  var locations;
+  if (useColor) {
+    if (goog.isNull(this.colorLocations_)) {
+      locations =
+          new ol.renderer.webgl.map.shader.Color.Locations(gl, program);
+      this.colorLocations_ = locations;
+    } else {
+      locations = this.colorLocations_;
+    }
+  } else {
+    if (goog.isNull(this.defaultLocations_)) {
+      locations =
+          new ol.renderer.webgl.map.shader.Default.Locations(gl, program);
+      this.defaultLocations_ = locations;
+    } else {
+      locations = this.defaultLocations_;
+    }
+  }
+
+  if (context.useProgram(program)) {
+    gl.enableVertexAttribArray(locations.a_position);
+    gl.vertexAttribPointer(
+        locations.a_position, 2, goog.webgl.FLOAT, false, 16, 0);
+    gl.enableVertexAttribArray(locations.a_texCoord);
+    gl.vertexAttribPointer(
+        locations.a_texCoord, 2, goog.webgl.FLOAT, false, 16, 8);
+    gl.uniform1i(locations.u_texture, 0);
+  }
+
+  gl.uniformMatrix4fv(
+      locations.u_texCoordMatrix, false, this.getTexCoordMatrix());
+  gl.uniformMatrix4fv(locations.u_projectionMatrix, false,
+      this.getProjectionMatrix());
+  if (useColor) {
+    gl.uniformMatrix4fv(locations.u_colorMatrix, false,
+        this.colorMatrix_.getMatrix(
+            layerState.brightness,
+            layerState.contrast,
+            layerState.hue,
+            layerState.saturation
+        ));
+  }
+  gl.uniform1f(locations.u_opacity, layerState.opacity);
+  gl.bindTexture(goog.webgl.TEXTURE_2D, this.getTexture());
+  gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4);
+
+  this.dispatchComposeEvent_(
+      ol.render.EventType.POSTCOMPOSE, context, frameState);
+
+};
+
+
+/**
+ * @param {ol.render.EventType} type Event type.
+ * @param {ol.webgl.Context} context WebGL context.
+ * @param {olx.FrameState} frameState Frame state.
+ * @private
+ */
+ol.renderer.webgl.Layer.prototype.dispatchComposeEvent_ =
+    function(type, context, frameState) {
+  var layer = this.getLayer();
+  if (layer.hasListener(type)) {
+    var viewState = frameState.viewState;
+    var resolution = viewState.resolution;
+    var pixelRatio = frameState.pixelRatio;
+    var extent = frameState.extent;
+    var center = viewState.center;
+    var rotation = viewState.rotation;
+    var size = frameState.size;
+
+    var render = new ol.render.webgl.Immediate(
+        context, center, resolution, rotation, size, extent, pixelRatio);
+    var composeEvent = new ol.render.Event(
+        type, layer, render, null, frameState, null, context);
+    layer.dispatchEvent(composeEvent);
+  }
+};
+
+
+/**
+ * @protected
+ * @return {ol.renderer.webgl.Map} MapRenderer.
+ */
+ol.renderer.webgl.Layer.prototype.getWebGLMapRenderer = function() {
+  return /** @type {ol.renderer.webgl.Map} */ (this.getMapRenderer());
+};
+
+
+/**
+ * @return {!goog.vec.Mat4.Number} Matrix.
+ */
+ol.renderer.webgl.Layer.prototype.getTexCoordMatrix = function() {
+  return this.texCoordMatrix;
+};
+
+
+/**
+ * @return {WebGLTexture} Texture.
+ */
+ol.renderer.webgl.Layer.prototype.getTexture = function() {
+  return this.texture;
+};
+
+
+/**
+ * @return {!goog.vec.Mat4.Number} Matrix.
+ */
+ol.renderer.webgl.Layer.prototype.getProjectionMatrix = function() {
+  return this.projectionMatrix;
+};
+
+
+/**
+ * Handle webglcontextlost.
+ */
+ol.renderer.webgl.Layer.prototype.handleWebGLContextLost = function() {
+  this.texture = null;
+  this.framebuffer = null;
+  this.framebufferDimension = undefined;
+};
+
+
+/**
+ * @param {olx.FrameState} frameState Frame state.
+ * @param {ol.layer.LayerState} layerState Layer state.
+ * @param {ol.webgl.Context} context Context.
+ * @return {boolean} whether composeFrame should be called.
+ */
+ol.renderer.webgl.Layer.prototype.prepareFrame = goog.abstractMethod;
diff --git a/src/ol/renderer/webgl/webglmapcolor.glsl b/src/ol/renderer/webgl/webglmapcolor.glsl
new file mode 100644
index 0000000..4ed15cd
--- /dev/null
+++ b/src/ol/renderer/webgl/webglmapcolor.glsl
@@ -0,0 +1,32 @@
+//! NAMESPACE=ol.renderer.webgl.map.shader.Color
+//! CLASS=ol.renderer.webgl.map.shader.Color
+
+
+//! COMMON
+varying vec2 v_texCoord;
+
+
+//! VERTEX
+attribute vec2 a_position;
+attribute vec2 a_texCoord;
+
+uniform mat4 u_texCoordMatrix;
+uniform mat4 u_projectionMatrix;
+
+void main(void) {
+  gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);
+  v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;
+}
+
+
+//! FRAGMENT
+// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp
+uniform mat4 u_colorMatrix;
+uniform float u_opacity;
+uniform sampler2D u_texture;
+
+void main(void) {
+  vec4 texColor = texture2D(u_texture, v_texCoord);
+  gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;
+  gl_FragColor.a = texColor.a * u_opacity;
+}
diff --git a/src/ol/renderer/webgl/webglmapcolorshader.js b/src/ol/renderer/webgl/webglmapcolorshader.js
new file mode 100644
index 0000000..eeff816
--- /dev/null
+++ b/src/ol/renderer/webgl/webglmapcolorshader.js
@@ -0,0 +1,129 @@
+// This file is automatically generated, do not edit
+goog.provide('ol.renderer.webgl.map.shader.Color');
+
+goog.require('ol.webgl.shader');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Fragment}
+ * @struct
+ */
+ol.renderer.webgl.map.shader.ColorFragment = function() {
+  goog.base(this, ol.renderer.webgl.map.shader.ColorFragment.SOURCE);
+};
+goog.inherits(ol.renderer.webgl.map.shader.ColorFragment, ol.webgl.shader.Fragment);
+goog.addSingletonGetter(ol.renderer.webgl.map.shader.ColorFragment);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.ColorFragment.DEBUG_SOURCE = 'precision mediump float;\nvarying vec2 v_texCoord;\n\n\n// @see https://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/filters/skia/SkiaImageFilterBuilder.cpp\nuniform mat4 u_colorMatrix;\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n  vec4 texColor = texture2D(u_texture, v_texCoord);\n  gl_FragColor.rgb = (u_colorMatrix * vec4(texColor.rgb, 1.)).rgb;\n  gl_FragColor.a = te [...]
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.ColorFragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform mat4 f;uniform float g;uniform sampler2D h;void main(void){vec4 texColor=texture2D(h,a);gl_FragColor.rgb=(f*vec4(texColor.rgb,1.)).rgb;gl_FragColor.a=texColor.a*g;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.ColorFragment.SOURCE = goog.DEBUG ?
+    ol.renderer.webgl.map.shader.ColorFragment.DEBUG_SOURCE :
+    ol.renderer.webgl.map.shader.ColorFragment.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Vertex}
+ * @struct
+ */
+ol.renderer.webgl.map.shader.ColorVertex = function() {
+  goog.base(this, ol.renderer.webgl.map.shader.ColorVertex.SOURCE);
+};
+goog.inherits(ol.renderer.webgl.map.shader.ColorVertex, ol.webgl.shader.Vertex);
+goog.addSingletonGetter(ol.renderer.webgl.map.shader.ColorVertex);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.ColorVertex.DEBUG_SOURCE = 'varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n  gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);\n  v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.ColorVertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 b;attribute vec2 c;uniform mat4 d;uniform mat4 e;void main(void){gl_Position=e*vec4(b,0.,1.);a=(d*vec4(c,0.,1.)).st;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.ColorVertex.SOURCE = goog.DEBUG ?
+    ol.renderer.webgl.map.shader.ColorVertex.DEBUG_SOURCE :
+    ol.renderer.webgl.map.shader.ColorVertex.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @param {WebGLRenderingContext} gl GL.
+ * @param {WebGLProgram} program Program.
+ * @struct
+ */
+ol.renderer.webgl.map.shader.Color.Locations = function(gl, program) {
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_colorMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_colorMatrix' : 'f');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_opacity = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_opacity' : 'g');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_projectionMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_projectionMatrix' : 'e');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_texCoordMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_texCoordMatrix' : 'd');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_texture = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_texture' : 'h');
+
+  /**
+   * @type {number}
+   */
+  this.a_position = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_position' : 'b');
+
+  /**
+   * @type {number}
+   */
+  this.a_texCoord = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_texCoord' : 'c');
+};
diff --git a/src/ol/renderer/webgl/webglmapdefault.glsl b/src/ol/renderer/webgl/webglmapdefault.glsl
new file mode 100644
index 0000000..b07838d
--- /dev/null
+++ b/src/ol/renderer/webgl/webglmapdefault.glsl
@@ -0,0 +1,30 @@
+//! NAMESPACE=ol.renderer.webgl.map.shader.Default
+//! CLASS=ol.renderer.webgl.map.shader.Default
+
+
+//! COMMON
+varying vec2 v_texCoord;
+
+
+//! VERTEX
+attribute vec2 a_position;
+attribute vec2 a_texCoord;
+
+uniform mat4 u_texCoordMatrix;
+uniform mat4 u_projectionMatrix;
+
+void main(void) {
+  gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);
+  v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;
+}
+
+
+//! FRAGMENT
+uniform float u_opacity;
+uniform sampler2D u_texture;
+
+void main(void) {
+  vec4 texColor = texture2D(u_texture, v_texCoord);
+  gl_FragColor.rgb = texColor.rgb;
+  gl_FragColor.a = texColor.a * u_opacity;
+}
diff --git a/src/ol/renderer/webgl/webglmapdefaultshader.js b/src/ol/renderer/webgl/webglmapdefaultshader.js
new file mode 100644
index 0000000..47aff44
--- /dev/null
+++ b/src/ol/renderer/webgl/webglmapdefaultshader.js
@@ -0,0 +1,123 @@
+// This file is automatically generated, do not edit
+goog.provide('ol.renderer.webgl.map.shader.Default');
+
+goog.require('ol.webgl.shader');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Fragment}
+ * @struct
+ */
+ol.renderer.webgl.map.shader.DefaultFragment = function() {
+  goog.base(this, ol.renderer.webgl.map.shader.DefaultFragment.SOURCE);
+};
+goog.inherits(ol.renderer.webgl.map.shader.DefaultFragment, ol.webgl.shader.Fragment);
+goog.addSingletonGetter(ol.renderer.webgl.map.shader.DefaultFragment);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.DefaultFragment.DEBUG_SOURCE = 'precision mediump float;\nvarying vec2 v_texCoord;\n\n\nuniform float u_opacity;\nuniform sampler2D u_texture;\n\nvoid main(void) {\n  vec4 texColor = texture2D(u_texture, v_texCoord);\n  gl_FragColor.rgb = texColor.rgb;\n  gl_FragColor.a = texColor.a * u_opacity;\n}\n';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.DefaultFragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform float f;uniform sampler2D g;void main(void){vec4 texColor=texture2D(g,a);gl_FragColor.rgb=texColor.rgb;gl_FragColor.a=texColor.a*f;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.DefaultFragment.SOURCE = goog.DEBUG ?
+    ol.renderer.webgl.map.shader.DefaultFragment.DEBUG_SOURCE :
+    ol.renderer.webgl.map.shader.DefaultFragment.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Vertex}
+ * @struct
+ */
+ol.renderer.webgl.map.shader.DefaultVertex = function() {
+  goog.base(this, ol.renderer.webgl.map.shader.DefaultVertex.SOURCE);
+};
+goog.inherits(ol.renderer.webgl.map.shader.DefaultVertex, ol.webgl.shader.Vertex);
+goog.addSingletonGetter(ol.renderer.webgl.map.shader.DefaultVertex);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.DefaultVertex.DEBUG_SOURCE = 'varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\n\nuniform mat4 u_texCoordMatrix;\nuniform mat4 u_projectionMatrix;\n\nvoid main(void) {\n  gl_Position = u_projectionMatrix * vec4(a_position, 0., 1.);\n  v_texCoord = (u_texCoordMatrix * vec4(a_texCoord, 0., 1.)).st;\n}\n\n\n';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.DefaultVertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 b;attribute vec2 c;uniform mat4 d;uniform mat4 e;void main(void){gl_Position=e*vec4(b,0.,1.);a=(d*vec4(c,0.,1.)).st;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.map.shader.DefaultVertex.SOURCE = goog.DEBUG ?
+    ol.renderer.webgl.map.shader.DefaultVertex.DEBUG_SOURCE :
+    ol.renderer.webgl.map.shader.DefaultVertex.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @param {WebGLRenderingContext} gl GL.
+ * @param {WebGLProgram} program Program.
+ * @struct
+ */
+ol.renderer.webgl.map.shader.Default.Locations = function(gl, program) {
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_opacity = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_opacity' : 'f');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_projectionMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_projectionMatrix' : 'e');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_texCoordMatrix = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_texCoordMatrix' : 'd');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_texture = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_texture' : 'g');
+
+  /**
+   * @type {number}
+   */
+  this.a_position = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_position' : 'b');
+
+  /**
+   * @type {number}
+   */
+  this.a_texCoord = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_texCoord' : 'c');
+};
diff --git a/src/ol/renderer/webgl/webglmaprenderer.js b/src/ol/renderer/webgl/webglmaprenderer.js
new file mode 100644
index 0000000..b597950
--- /dev/null
+++ b/src/ol/renderer/webgl/webglmaprenderer.js
@@ -0,0 +1,540 @@
+// FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE)
+
+goog.provide('ol.renderer.webgl.Map');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.Event');
+goog.require('goog.log');
+goog.require('goog.log.Logger');
+goog.require('goog.object');
+goog.require('goog.style');
+goog.require('goog.webgl');
+goog.require('ol');
+goog.require('ol.RendererType');
+goog.require('ol.css');
+goog.require('ol.dom');
+goog.require('ol.layer.Image');
+goog.require('ol.layer.Layer');
+goog.require('ol.layer.Tile');
+goog.require('ol.layer.Vector');
+goog.require('ol.render.Event');
+goog.require('ol.render.EventType');
+goog.require('ol.render.webgl.Immediate');
+goog.require('ol.render.webgl.ReplayGroup');
+goog.require('ol.renderer.Map');
+goog.require('ol.renderer.vector');
+goog.require('ol.renderer.webgl.ImageLayer');
+goog.require('ol.renderer.webgl.Layer');
+goog.require('ol.renderer.webgl.TileLayer');
+goog.require('ol.renderer.webgl.VectorLayer');
+goog.require('ol.source.State');
+goog.require('ol.structs.LRUCache');
+goog.require('ol.structs.PriorityQueue');
+goog.require('ol.webgl');
+goog.require('ol.webgl.Context');
+goog.require('ol.webgl.WebGLContextEventType');
+
+
+/**
+ * @typedef {{magFilter: number, minFilter: number, texture: WebGLTexture}}
+ */
+ol.renderer.webgl.TextureCacheEntry;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.Map}
+ * @param {Element} container Container.
+ * @param {ol.Map} map Map.
+ */
+ol.renderer.webgl.Map = function(container, map) {
+
+  goog.base(this, container, map);
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.canvas_ = /** @type {HTMLCanvasElement} */
+      (goog.dom.createElement(goog.dom.TagName.CANVAS));
+  this.canvas_.style.width = '100%';
+  this.canvas_.style.height = '100%';
+  this.canvas_.className = ol.css.CLASS_UNSELECTABLE;
+  goog.dom.insertChildAt(container, this.canvas_, 0);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.clipTileCanvasSize_ = 0;
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.clipTileContext_ = ol.dom.createCanvasContext2D();
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.renderedVisible_ = true;
+
+  /**
+   * @private
+   * @type {WebGLRenderingContext}
+   */
+  this.gl_ = ol.webgl.getContext(this.canvas_, {
+    antialias: true,
+    depth: false,
+    failIfMajorPerformanceCaveat: true,
+    preserveDrawingBuffer: false,
+    stencil: true
+  });
+  goog.asserts.assert(!goog.isNull(this.gl_));
+
+  /**
+   * @private
+   * @type {ol.webgl.Context}
+   */
+  this.context_ = new ol.webgl.Context(this.canvas_, this.gl_);
+
+  goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.LOST,
+      this.handleWebGLContextLost, false, this);
+  goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED,
+      this.handleWebGLContextRestored, false, this);
+
+  /**
+   * @private
+   * @type {ol.structs.LRUCache.<ol.renderer.webgl.TextureCacheEntry|null>}
+   */
+  this.textureCache_ = new ol.structs.LRUCache();
+
+  /**
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.focus_ = null;
+
+  /**
+   * @private
+   * @type {ol.structs.PriorityQueue.<Array>}
+   */
+  this.tileTextureQueue_ = new ol.structs.PriorityQueue(
+      goog.bind(
+          /**
+           * @param {Array.<*>} element Element.
+           * @return {number} Priority.
+           * @this {ol.renderer.webgl.Map}
+           */
+          function(element) {
+            var tileCenter = /** @type {ol.Coordinate} */ (element[1]);
+            var tileResolution = /** @type {number} */ (element[2]);
+            var deltaX = tileCenter[0] - this.focus_[0];
+            var deltaY = tileCenter[1] - this.focus_[1];
+            return 65536 * Math.log(tileResolution) +
+                Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution;
+          }, this),
+      /**
+       * @param {Array.<*>} element Element.
+       * @return {string} Key.
+       */
+      function(element) {
+        return /** @type {ol.Tile} */ (element[0]).getKey();
+      });
+
+  /**
+   * @private
+   * @type {ol.PostRenderFunction}
+   */
+  this.loadNextTileTexture_ = goog.bind(
+      function(map, frameState) {
+        if (!this.tileTextureQueue_.isEmpty()) {
+          this.tileTextureQueue_.reprioritize();
+          var element = this.tileTextureQueue_.dequeue();
+          var tile = /** @type {ol.Tile} */ (element[0]);
+          var tileSize = /** @type {number} */ (element[3]);
+          var tileGutter = /** @type {number} */ (element[4]);
+          this.bindTileTexture(
+              tile, tileSize, tileGutter, goog.webgl.LINEAR, goog.webgl.LINEAR);
+        }
+      }, this);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.textureCacheFrameMarkerCount_ = 0;
+
+  this.initializeGL_();
+
+};
+goog.inherits(ol.renderer.webgl.Map, ol.renderer.Map);
+
+
+/**
+ * @param {ol.Tile} tile Tile.
+ * @param {number} tileSize Tile size.
+ * @param {number} tileGutter Tile gutter.
+ * @param {number} magFilter Mag filter.
+ * @param {number} minFilter Min filter.
+ */
+ol.renderer.webgl.Map.prototype.bindTileTexture =
+    function(tile, tileSize, tileGutter, magFilter, minFilter) {
+  var gl = this.getGL();
+  var tileKey = tile.getKey();
+  if (this.textureCache_.containsKey(tileKey)) {
+    var textureCacheEntry = this.textureCache_.get(tileKey);
+    goog.asserts.assert(!goog.isNull(textureCacheEntry));
+    gl.bindTexture(goog.webgl.TEXTURE_2D, textureCacheEntry.texture);
+    if (textureCacheEntry.magFilter != magFilter) {
+      gl.texParameteri(
+          goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, magFilter);
+      textureCacheEntry.magFilter = magFilter;
+    }
+    if (textureCacheEntry.minFilter != minFilter) {
+      gl.texParameteri(
+          goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, minFilter);
+      textureCacheEntry.minFilter = minFilter;
+    }
+  } else {
+    var texture = gl.createTexture();
+    gl.bindTexture(goog.webgl.TEXTURE_2D, texture);
+    if (tileGutter > 0) {
+      var clipTileCanvas = this.clipTileContext_.canvas;
+      var clipTileContext = this.clipTileContext_;
+      if (this.clipTileCanvasSize_ != tileSize) {
+        clipTileCanvas.width = tileSize;
+        clipTileCanvas.height = tileSize;
+        this.clipTileCanvasSize_ = tileSize;
+      } else {
+        clipTileContext.clearRect(0, 0, tileSize, tileSize);
+      }
+      clipTileContext.drawImage(tile.getImage(), tileGutter, tileGutter,
+          tileSize, tileSize, 0, 0, tileSize, tileSize);
+      gl.texImage2D(goog.webgl.TEXTURE_2D, 0,
+          goog.webgl.RGBA, goog.webgl.RGBA,
+          goog.webgl.UNSIGNED_BYTE, clipTileCanvas);
+    } else {
+      gl.texImage2D(goog.webgl.TEXTURE_2D, 0,
+          goog.webgl.RGBA, goog.webgl.RGBA,
+          goog.webgl.UNSIGNED_BYTE, tile.getImage());
+    }
+    gl.texParameteri(
+        goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER, magFilter);
+    gl.texParameteri(
+        goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER, minFilter);
+    gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_S,
+        goog.webgl.CLAMP_TO_EDGE);
+    gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_WRAP_T,
+        goog.webgl.CLAMP_TO_EDGE);
+    this.textureCache_.set(tileKey, {
+      texture: texture,
+      magFilter: magFilter,
+      minFilter: minFilter
+    });
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.Map.prototype.createLayerRenderer = function(layer) {
+  if (ol.ENABLE_IMAGE && layer instanceof ol.layer.Image) {
+    return new ol.renderer.webgl.ImageLayer(this, layer);
+  } else if (ol.ENABLE_TILE && layer instanceof ol.layer.Tile) {
+    return new ol.renderer.webgl.TileLayer(this, layer);
+  } else if (ol.ENABLE_VECTOR && layer instanceof ol.layer.Vector) {
+    return new ol.renderer.webgl.VectorLayer(this, layer);
+  } else {
+    goog.asserts.fail();
+    return null;
+  }
+};
+
+
+/**
+ * @param {ol.render.EventType} type Event type.
+ * @param {olx.FrameState} frameState Frame state.
+ * @private
+ */
+ol.renderer.webgl.Map.prototype.dispatchComposeEvent_ =
+    function(type, frameState) {
+  var map = this.getMap();
+  if (map.hasListener(type)) {
+    var context = this.context_;
+
+    var extent = frameState.extent;
+    var size = frameState.size;
+    var viewState = frameState.viewState;
+    var pixelRatio = frameState.pixelRatio;
+
+    var resolution = viewState.resolution;
+    var center = viewState.center;
+    var rotation = viewState.rotation;
+    var tolerance = ol.renderer.vector.getTolerance(resolution, pixelRatio);
+
+    var vectorContext = new ol.render.webgl.Immediate(context,
+        center, resolution, rotation, size, extent, pixelRatio);
+    var replayGroup = new ol.render.webgl.ReplayGroup(tolerance, extent);
+    var composeEvent = new ol.render.Event(type, map, vectorContext,
+        replayGroup, frameState, null, context);
+    map.dispatchEvent(composeEvent);
+
+    replayGroup.finish(context);
+    if (!replayGroup.isEmpty()) {
+      // use default color values
+      var opacity = 1;
+      var brightness = 0;
+      var contrast = 1;
+      var hue = 0;
+      var saturation = 1;
+      replayGroup.replay(context, center, resolution, rotation, size,
+          pixelRatio, opacity, brightness, contrast, hue, saturation, {});
+    }
+    replayGroup.getDeleteResourcesFunction(context)();
+
+    vectorContext.flush();
+    this.replayGroup = replayGroup;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.Map.prototype.disposeInternal = function() {
+  var gl = this.getGL();
+  if (!gl.isContextLost()) {
+    this.textureCache_.forEach(
+        /**
+         * @param {?ol.renderer.webgl.TextureCacheEntry} textureCacheEntry
+         *     Texture cache entry.
+         */
+        function(textureCacheEntry) {
+          if (!goog.isNull(textureCacheEntry)) {
+            gl.deleteTexture(textureCacheEntry.texture);
+          }
+        });
+  }
+  goog.dispose(this.context_);
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * @param {ol.Map} map Map.
+ * @param {olx.FrameState} frameState Frame state.
+ * @private
+ */
+ol.renderer.webgl.Map.prototype.expireCache_ = function(map, frameState) {
+  var gl = this.getGL();
+  var textureCacheEntry;
+  while (this.textureCache_.getCount() - this.textureCacheFrameMarkerCount_ >
+      ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK) {
+    textureCacheEntry = this.textureCache_.peekLast();
+    if (goog.isNull(textureCacheEntry)) {
+      if (+this.textureCache_.peekLastKey() == frameState.index) {
+        break;
+      } else {
+        --this.textureCacheFrameMarkerCount_;
+      }
+    } else {
+      gl.deleteTexture(textureCacheEntry.texture);
+    }
+    this.textureCache_.pop();
+  }
+};
+
+
+/**
+ * @return {ol.webgl.Context}
+ */
+ol.renderer.webgl.Map.prototype.getContext = function() {
+  return this.context_;
+};
+
+
+/**
+ * @return {WebGLRenderingContext} GL.
+ */
+ol.renderer.webgl.Map.prototype.getGL = function() {
+  return this.gl_;
+};
+
+
+/**
+ * @return {ol.structs.PriorityQueue.<Array>} Tile texture queue.
+ */
+ol.renderer.webgl.Map.prototype.getTileTextureQueue = function() {
+  return this.tileTextureQueue_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.Map.prototype.getType = function() {
+  return ol.RendererType.WEBGL;
+};
+
+
+/**
+ * @param {goog.events.Event} event Event.
+ * @protected
+ */
+ol.renderer.webgl.Map.prototype.handleWebGLContextLost = function(event) {
+  event.preventDefault();
+  this.textureCache_.clear();
+  this.textureCacheFrameMarkerCount_ = 0;
+  goog.object.forEach(this.getLayerRenderers(),
+      /**
+       * @param {ol.renderer.Layer} layerRenderer Layer renderer.
+       * @param {string} key Key.
+       * @param {Object.<string, ol.renderer.Layer>} object Object.
+       */
+      function(layerRenderer, key, object) {
+        goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer);
+        var webGLLayerRenderer = /** @type {ol.renderer.webgl.Layer} */
+            (layerRenderer);
+        webGLLayerRenderer.handleWebGLContextLost();
+      });
+};
+
+
+/**
+ * @protected
+ */
+ol.renderer.webgl.Map.prototype.handleWebGLContextRestored = function() {
+  this.initializeGL_();
+  this.getMap().render();
+};
+
+
+/**
+ * @private
+ */
+ol.renderer.webgl.Map.prototype.initializeGL_ = function() {
+  var gl = this.gl_;
+  gl.activeTexture(goog.webgl.TEXTURE0);
+  gl.blendFuncSeparate(
+      goog.webgl.SRC_ALPHA, goog.webgl.ONE_MINUS_SRC_ALPHA,
+      goog.webgl.ONE, goog.webgl.ONE_MINUS_SRC_ALPHA);
+  gl.disable(goog.webgl.CULL_FACE);
+  gl.disable(goog.webgl.DEPTH_TEST);
+  gl.disable(goog.webgl.SCISSOR_TEST);
+  gl.disable(goog.webgl.STENCIL_TEST);
+};
+
+
+/**
+ * @param {ol.Tile} tile Tile.
+ * @return {boolean} Is tile texture loaded.
+ */
+ol.renderer.webgl.Map.prototype.isTileTextureLoaded = function(tile) {
+  return this.textureCache_.containsKey(tile.getKey());
+};
+
+
+/**
+ * @private
+ * @type {goog.log.Logger}
+ */
+ol.renderer.webgl.Map.prototype.logger_ =
+    goog.log.getLogger('ol.renderer.webgl.Map');
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
+
+  var context = this.getContext();
+  var gl = this.getGL();
+
+  if (gl.isContextLost()) {
+    return false;
+  }
+
+  if (goog.isNull(frameState)) {
+    if (this.renderedVisible_) {
+      goog.style.setElementShown(this.canvas_, false);
+      this.renderedVisible_ = false;
+    }
+    return false;
+  }
+
+  this.focus_ = frameState.focus;
+
+  this.textureCache_.set((-frameState.index).toString(), null);
+  ++this.textureCacheFrameMarkerCount_;
+
+  /** @type {Array.<ol.layer.LayerState>} */
+  var layerStatesToDraw = [];
+  var layerStatesArray = frameState.layerStatesArray;
+  var viewResolution = frameState.viewState.resolution;
+  var i, ii, layerRenderer, layerState;
+  for (i = 0, ii = layerStatesArray.length; i < ii; ++i) {
+    layerState = layerStatesArray[i];
+    if (ol.layer.Layer.visibleAtResolution(layerState, viewResolution) &&
+        layerState.sourceState == ol.source.State.READY) {
+      layerRenderer = this.getLayerRenderer(layerState.layer);
+      goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer);
+      if (layerRenderer.prepareFrame(frameState, layerState, context)) {
+        layerStatesToDraw.push(layerState);
+      }
+    }
+  }
+
+  var width = frameState.size[0] * frameState.pixelRatio;
+  var height = frameState.size[1] * frameState.pixelRatio;
+  if (this.canvas_.width != width || this.canvas_.height != height) {
+    this.canvas_.width = width;
+    this.canvas_.height = height;
+  }
+
+  gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null);
+
+  gl.clearColor(0, 0, 0, 0);
+  gl.clear(goog.webgl.COLOR_BUFFER_BIT);
+  gl.enable(goog.webgl.BLEND);
+  gl.viewport(0, 0, this.canvas_.width, this.canvas_.height);
+
+  this.dispatchComposeEvent_(ol.render.EventType.PRECOMPOSE, frameState);
+
+  for (i = 0, ii = layerStatesToDraw.length; i < ii; ++i) {
+    layerState = layerStatesToDraw[i];
+    layerRenderer = this.getLayerRenderer(layerState.layer);
+    goog.asserts.assertInstanceof(layerRenderer, ol.renderer.webgl.Layer);
+    layerRenderer.composeFrame(frameState, layerState, context);
+  }
+
+  if (!this.renderedVisible_) {
+    goog.style.setElementShown(this.canvas_, true);
+    this.renderedVisible_ = true;
+  }
+
+  this.calculateMatrices2D(frameState);
+
+  if (this.textureCache_.getCount() - this.textureCacheFrameMarkerCount_ >
+      ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK) {
+    frameState.postRenderFunctions.push(goog.bind(this.expireCache_, this));
+  }
+
+  if (!this.tileTextureQueue_.isEmpty()) {
+    frameState.postRenderFunctions.push(this.loadNextTileTexture_);
+    frameState.animate = true;
+  }
+
+  this.dispatchComposeEvent_(ol.render.EventType.POSTCOMPOSE, frameState);
+
+  this.scheduleRemoveUnusedLayerRenderers(frameState);
+  this.scheduleExpireIconCache(frameState);
+
+};
diff --git a/src/ol/renderer/webgl/webgltilelayer.glsl b/src/ol/renderer/webgl/webgltilelayer.glsl
new file mode 100644
index 0000000..5262f97
--- /dev/null
+++ b/src/ol/renderer/webgl/webgltilelayer.glsl
@@ -0,0 +1,25 @@
+//! NAMESPACE=ol.renderer.webgl.tilelayer.shader
+//! CLASS=ol.renderer.webgl.tilelayer.shader.
+
+
+//! COMMON
+varying vec2 v_texCoord;
+
+
+//! VERTEX
+attribute vec2 a_position;
+attribute vec2 a_texCoord;
+uniform vec4 u_tileOffset;
+
+void main(void) {
+  gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);
+  v_texCoord = a_texCoord;
+}
+
+
+//! FRAGMENT
+uniform sampler2D u_texture;
+
+void main(void) {
+  gl_FragColor = texture2D(u_texture, v_texCoord);
+}
diff --git a/src/ol/renderer/webgl/webgltilelayerrenderer.js b/src/ol/renderer/webgl/webgltilelayerrenderer.js
new file mode 100644
index 0000000..005eebc
--- /dev/null
+++ b/src/ol/renderer/webgl/webgltilelayerrenderer.js
@@ -0,0 +1,332 @@
+// FIXME large resolutions lead to too large framebuffers :-(
+// FIXME animated shaders! check in redraw
+
+goog.provide('ol.renderer.webgl.TileLayer');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('goog.vec.Mat4');
+goog.require('goog.vec.Vec4');
+goog.require('goog.webgl');
+goog.require('ol.TileRange');
+goog.require('ol.TileState');
+goog.require('ol.extent');
+goog.require('ol.layer.Tile');
+goog.require('ol.math');
+goog.require('ol.renderer.webgl.Layer');
+goog.require('ol.renderer.webgl.tilelayer.shader');
+goog.require('ol.tilecoord');
+goog.require('ol.webgl.Buffer');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.webgl.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Tile} tileLayer Tile layer.
+ */
+ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) {
+
+  goog.base(this, mapRenderer, tileLayer);
+
+  /**
+   * @private
+   * @type {ol.webgl.shader.Fragment}
+   */
+  this.fragmentShader_ =
+      ol.renderer.webgl.tilelayer.shader.Fragment.getInstance();
+
+  /**
+   * @private
+   * @type {ol.webgl.shader.Vertex}
+   */
+  this.vertexShader_ = ol.renderer.webgl.tilelayer.shader.Vertex.getInstance();
+
+  /**
+   * @private
+   * @type {ol.renderer.webgl.tilelayer.shader.Locations}
+   */
+  this.locations_ = null;
+
+  /**
+   * @private
+   * @type {ol.webgl.Buffer}
+   */
+  this.renderArrayBuffer_ = new ol.webgl.Buffer([
+    0, 0, 0, 1,
+    1, 0, 1, 1,
+    0, 1, 0, 0,
+    1, 1, 1, 0
+  ]);
+
+  /**
+   * @private
+   * @type {ol.TileRange}
+   */
+  this.renderedTileRange_ = null;
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.renderedFramebufferExtent_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedRevision_ = -1;
+
+};
+goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() {
+  var mapRenderer = this.getWebGLMapRenderer();
+  var context = mapRenderer.getContext();
+  context.deleteBuffer(this.renderArrayBuffer_);
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.TileLayer.prototype.handleWebGLContextLost = function() {
+  goog.base(this, 'handleWebGLContextLost');
+  this.locations_ = null;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.TileLayer.prototype.prepareFrame =
+    function(frameState, layerState, context) {
+
+  var mapRenderer = this.getWebGLMapRenderer();
+  var gl = context.getGL();
+
+  var viewState = frameState.viewState;
+  var projection = viewState.projection;
+
+  var tileLayer = this.getLayer();
+  goog.asserts.assertInstanceof(tileLayer, ol.layer.Tile);
+  var tileSource = tileLayer.getSource();
+  var tileGrid = tileSource.getTileGridForProjection(projection);
+  var z = tileGrid.getZForResolution(viewState.resolution);
+  var tileResolution = tileGrid.getResolution(z);
+
+  var tilePixelSize =
+      tileSource.getTilePixelSize(z, frameState.pixelRatio, projection);
+  var pixelRatio = tilePixelSize / tileGrid.getTileSize(z);
+  var tilePixelResolution = tileResolution / pixelRatio;
+  var tileGutter = tileSource.getGutter();
+
+  var center = viewState.center;
+  var extent;
+  if (tileResolution == viewState.resolution) {
+    center = this.snapCenterToPixel(center, tileResolution, frameState.size);
+    extent = ol.extent.getForViewAndSize(
+        center, tileResolution, viewState.rotation, frameState.size);
+  } else {
+    extent = frameState.extent;
+  }
+  var tileRange = tileGrid.getTileRangeForExtentAndResolution(
+      extent, tileResolution);
+
+  var framebufferExtent;
+  if (!goog.isNull(this.renderedTileRange_) &&
+      this.renderedTileRange_.equals(tileRange) &&
+      this.renderedRevision_ == tileSource.getRevision()) {
+    framebufferExtent = this.renderedFramebufferExtent_;
+  } else {
+
+    var tileRangeSize = tileRange.getSize();
+
+    var maxDimension = Math.max(
+        tileRangeSize[0] * tilePixelSize, tileRangeSize[1] * tilePixelSize);
+    var framebufferDimension = ol.math.roundUpToPowerOfTwo(maxDimension);
+    var framebufferExtentDimension = tilePixelResolution * framebufferDimension;
+    var origin = tileGrid.getOrigin(z);
+    var minX = origin[0] + tileRange.minX * tilePixelSize * tilePixelResolution;
+    var minY = origin[1] + tileRange.minY * tilePixelSize * tilePixelResolution;
+    framebufferExtent = [
+      minX, minY,
+      minX + framebufferExtentDimension, minY + framebufferExtentDimension
+    ];
+
+    this.bindFramebuffer(frameState, framebufferDimension);
+    gl.viewport(0, 0, framebufferDimension, framebufferDimension);
+
+    gl.clearColor(0, 0, 0, 0);
+    gl.clear(goog.webgl.COLOR_BUFFER_BIT);
+    gl.disable(goog.webgl.BLEND);
+
+    var program = context.getProgram(this.fragmentShader_, this.vertexShader_);
+    context.useProgram(program);
+    if (goog.isNull(this.locations_)) {
+      this.locations_ =
+          new ol.renderer.webgl.tilelayer.shader.Locations(gl, program);
+    }
+
+    context.bindBuffer(goog.webgl.ARRAY_BUFFER, this.renderArrayBuffer_);
+    gl.enableVertexAttribArray(this.locations_.a_position);
+    gl.vertexAttribPointer(
+        this.locations_.a_position, 2, goog.webgl.FLOAT, false, 16, 0);
+    gl.enableVertexAttribArray(this.locations_.a_texCoord);
+    gl.vertexAttribPointer(
+        this.locations_.a_texCoord, 2, goog.webgl.FLOAT, false, 16, 8);
+    gl.uniform1i(this.locations_.u_texture, 0);
+
+    /**
+     * @type {Object.<number, Object.<string, ol.Tile>>}
+     */
+    var tilesToDrawByZ = {};
+    tilesToDrawByZ[z] = {};
+
+    var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
+      return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED &&
+          mapRenderer.isTileTextureLoaded(tile);
+    }, tileSource, pixelRatio, projection);
+    var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
+        tilesToDrawByZ, getTileIfLoaded);
+
+    var useInterimTilesOnError = tileLayer.getUseInterimTilesOnError();
+    if (!goog.isDef(useInterimTilesOnError)) {
+      useInterimTilesOnError = true;
+    }
+
+    var allTilesLoaded = true;
+    var tmpExtent = ol.extent.createEmpty();
+    var tmpTileRange = new ol.TileRange(0, 0, 0, 0);
+    var childTileRange, fullyLoaded, tile, tileState, x, y, tileExtent;
+    for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
+      for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
+
+        tile = tileSource.getTile(z, x, y, pixelRatio, projection);
+        if (goog.isDef(layerState.extent)) {
+          // ignore tiles outside layer extent
+          tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent);
+          if (!ol.extent.intersects(tileExtent, layerState.extent)) {
+            continue;
+          }
+        }
+        tileState = tile.getState();
+        if (tileState == ol.TileState.LOADED) {
+          if (mapRenderer.isTileTextureLoaded(tile)) {
+            tilesToDrawByZ[z][ol.tilecoord.toString(tile.tileCoord)] = tile;
+            continue;
+          }
+        } else if (tileState == ol.TileState.EMPTY ||
+                   (tileState == ol.TileState.ERROR &&
+                    !useInterimTilesOnError)) {
+          continue;
+        }
+
+        allTilesLoaded = false;
+        fullyLoaded = tileGrid.forEachTileCoordParentTileRange(
+            tile.tileCoord, findLoadedTiles, null, tmpTileRange, tmpExtent);
+        if (!fullyLoaded) {
+          childTileRange = tileGrid.getTileCoordChildTileRange(
+              tile.tileCoord, tmpTileRange, tmpExtent);
+          if (!goog.isNull(childTileRange)) {
+            findLoadedTiles(z + 1, childTileRange);
+          }
+        }
+
+      }
+
+    }
+
+    /** @type {Array.<number>} */
+    var zs = goog.array.map(goog.object.getKeys(tilesToDrawByZ), Number);
+    goog.array.sort(zs);
+    var u_tileOffset = goog.vec.Vec4.createFloat32();
+    var i, ii, sx, sy, tileKey, tilesToDraw, tx, ty;
+    for (i = 0, ii = zs.length; i < ii; ++i) {
+      tilesToDraw = tilesToDrawByZ[zs[i]];
+      for (tileKey in tilesToDraw) {
+        tile = tilesToDraw[tileKey];
+        tileExtent = tileGrid.getTileCoordExtent(tile.tileCoord, tmpExtent);
+        sx = 2 * (tileExtent[2] - tileExtent[0]) /
+            framebufferExtentDimension;
+        sy = 2 * (tileExtent[3] - tileExtent[1]) /
+            framebufferExtentDimension;
+        tx = 2 * (tileExtent[0] - framebufferExtent[0]) /
+            framebufferExtentDimension - 1;
+        ty = 2 * (tileExtent[1] - framebufferExtent[1]) /
+            framebufferExtentDimension - 1;
+        goog.vec.Vec4.setFromValues(u_tileOffset, sx, sy, tx, ty);
+        gl.uniform4fv(this.locations_.u_tileOffset, u_tileOffset);
+        mapRenderer.bindTileTexture(tile, tilePixelSize,
+            tileGutter * pixelRatio, goog.webgl.LINEAR, goog.webgl.LINEAR);
+        gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4);
+      }
+    }
+
+    if (allTilesLoaded) {
+      this.renderedTileRange_ = tileRange;
+      this.renderedFramebufferExtent_ = framebufferExtent;
+      this.renderedRevision_ = tileSource.getRevision();
+    } else {
+      this.renderedTileRange_ = null;
+      this.renderedFramebufferExtent_ = null;
+      this.renderedRevision_ = -1;
+      frameState.animate = true;
+    }
+
+  }
+
+  this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
+  var tileTextureQueue = mapRenderer.getTileTextureQueue();
+  this.manageTilePyramid(
+      frameState, tileSource, tileGrid, pixelRatio, projection, extent, z,
+      tileLayer.getPreload(),
+      /**
+       * @param {ol.Tile} tile Tile.
+       */
+      function(tile) {
+        if (tile.getState() == ol.TileState.LOADED &&
+            !mapRenderer.isTileTextureLoaded(tile) &&
+            !tileTextureQueue.isKeyQueued(tile.getKey())) {
+          tileTextureQueue.enqueue([
+            tile,
+            tileGrid.getTileCoordCenter(tile.tileCoord),
+            tileGrid.getResolution(tile.tileCoord[0]),
+            tilePixelSize, tileGutter * pixelRatio
+          ]);
+        }
+      }, this);
+  this.scheduleExpireCache(frameState, tileSource);
+  this.updateLogos(frameState, tileSource);
+
+  var texCoordMatrix = this.texCoordMatrix;
+  goog.vec.Mat4.makeIdentity(texCoordMatrix);
+  goog.vec.Mat4.translate(texCoordMatrix,
+      (center[0] - framebufferExtent[0]) /
+          (framebufferExtent[2] - framebufferExtent[0]),
+      (center[1] - framebufferExtent[1]) /
+          (framebufferExtent[3] - framebufferExtent[1]),
+      0);
+  if (viewState.rotation !== 0) {
+    goog.vec.Mat4.rotateZ(texCoordMatrix, viewState.rotation);
+  }
+  goog.vec.Mat4.scale(texCoordMatrix,
+      frameState.size[0] * viewState.resolution /
+          (framebufferExtent[2] - framebufferExtent[0]),
+      frameState.size[1] * viewState.resolution /
+          (framebufferExtent[3] - framebufferExtent[1]),
+      1);
+  goog.vec.Mat4.translate(texCoordMatrix,
+      -0.5,
+      -0.5,
+      0);
+
+  return true;
+};
diff --git a/src/ol/renderer/webgl/webgltilelayershader.js b/src/ol/renderer/webgl/webgltilelayershader.js
new file mode 100644
index 0000000..6cbb581
--- /dev/null
+++ b/src/ol/renderer/webgl/webgltilelayershader.js
@@ -0,0 +1,111 @@
+// This file is automatically generated, do not edit
+goog.provide('ol.renderer.webgl.tilelayer.shader');
+
+goog.require('ol.webgl.shader');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Fragment}
+ * @struct
+ */
+ol.renderer.webgl.tilelayer.shader.Fragment = function() {
+  goog.base(this, ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE);
+};
+goog.inherits(ol.renderer.webgl.tilelayer.shader.Fragment, ol.webgl.shader.Fragment);
+goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Fragment);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE = 'precision mediump float;\nvarying vec2 v_texCoord;\n\n\nuniform sampler2D u_texture;\n\nvoid main(void) {\n  gl_FragColor = texture2D(u_texture, v_texCoord);\n}\n';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE = 'precision mediump float;varying vec2 a;uniform sampler2D e;void main(void){gl_FragColor=texture2D(e,a);}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.tilelayer.shader.Fragment.SOURCE = goog.DEBUG ?
+    ol.renderer.webgl.tilelayer.shader.Fragment.DEBUG_SOURCE :
+    ol.renderer.webgl.tilelayer.shader.Fragment.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Vertex}
+ * @struct
+ */
+ol.renderer.webgl.tilelayer.shader.Vertex = function() {
+  goog.base(this, ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE);
+};
+goog.inherits(ol.renderer.webgl.tilelayer.shader.Vertex, ol.webgl.shader.Vertex);
+goog.addSingletonGetter(ol.renderer.webgl.tilelayer.shader.Vertex);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE = 'varying vec2 v_texCoord;\n\n\nattribute vec2 a_position;\nattribute vec2 a_texCoord;\nuniform vec4 u_tileOffset;\n\nvoid main(void) {\n  gl_Position = vec4(a_position * u_tileOffset.xy + u_tileOffset.zw, 0., 1.);\n  v_texCoord = a_texCoord;\n}\n\n\n';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE = 'varying vec2 a;attribute vec2 b;attribute vec2 c;uniform vec4 d;void main(void){gl_Position=vec4(b*d.xy+d.zw,0.,1.);a=c;}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+ol.renderer.webgl.tilelayer.shader.Vertex.SOURCE = goog.DEBUG ?
+    ol.renderer.webgl.tilelayer.shader.Vertex.DEBUG_SOURCE :
+    ol.renderer.webgl.tilelayer.shader.Vertex.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @param {WebGLRenderingContext} gl GL.
+ * @param {WebGLProgram} program Program.
+ * @struct
+ */
+ol.renderer.webgl.tilelayer.shader.Locations = function(gl, program) {
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_texture = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_texture' : 'e');
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.u_tileOffset = gl.getUniformLocation(
+      program, goog.DEBUG ? 'u_tileOffset' : 'd');
+
+  /**
+   * @type {number}
+   */
+  this.a_position = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_position' : 'b');
+
+  /**
+   * @type {number}
+   */
+  this.a_texCoord = gl.getAttribLocation(
+      program, goog.DEBUG ? 'a_texCoord' : 'c');
+};
diff --git a/src/ol/renderer/webgl/webglvectorlayerrenderer.js b/src/ol/renderer/webgl/webglvectorlayerrenderer.js
new file mode 100644
index 0000000..e2a685a
--- /dev/null
+++ b/src/ol/renderer/webgl/webglvectorlayerrenderer.js
@@ -0,0 +1,238 @@
+goog.provide('ol.renderer.webgl.VectorLayer');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('ol.ViewHint');
+goog.require('ol.extent');
+goog.require('ol.layer.Vector');
+goog.require('ol.render.webgl.ReplayGroup');
+goog.require('ol.renderer.vector');
+goog.require('ol.renderer.webgl.Layer');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.renderer.webgl.Layer}
+ * @param {ol.renderer.Map} mapRenderer Map renderer.
+ * @param {ol.layer.Vector} vectorLayer Vector layer.
+ */
+ol.renderer.webgl.VectorLayer = function(mapRenderer, vectorLayer) {
+
+  goog.base(this, mapRenderer, vectorLayer);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.dirty_ = false;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedRevision_ = -1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedResolution_ = NaN;
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.renderedExtent_ = ol.extent.createEmpty();
+
+  /**
+   * @private
+   * @type {function(ol.Feature, ol.Feature): number|null}
+   */
+  this.renderedRenderOrder_ = null;
+
+  /**
+   * @private
+   * @type {ol.render.webgl.ReplayGroup}
+   */
+  this.replayGroup_ = null;
+
+};
+goog.inherits(ol.renderer.webgl.VectorLayer, ol.renderer.webgl.Layer);
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.VectorLayer.prototype.composeFrame =
+    function(frameState, layerState, context) {
+  var viewState = frameState.viewState;
+  var replayGroup = this.replayGroup_;
+  if (!goog.isNull(replayGroup) && !replayGroup.isEmpty()) {
+    replayGroup.replay(context,
+        viewState.center, viewState.resolution, viewState.rotation,
+        frameState.size, frameState.pixelRatio, layerState.opacity,
+        layerState.brightness, layerState.contrast, layerState.hue,
+        layerState.saturation, frameState.skippedFeatureUids);
+  }
+
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.VectorLayer.prototype.disposeInternal = function() {
+  var replayGroup = this.replayGroup_;
+  if (!goog.isNull(replayGroup)) {
+    var mapRenderer = this.getWebGLMapRenderer();
+    var context = mapRenderer.getContext();
+    replayGroup.getDeleteResourcesFunction(context)();
+    this.replayGroup_ = null;
+  }
+  goog.base(this, 'disposeInternal');
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.VectorLayer.prototype.forEachFeatureAtPixel =
+    function(coordinate, frameState, callback, thisArg) {
+};
+
+
+/**
+ * Handle changes in image style state.
+ * @param {goog.events.Event} event Image style change event.
+ * @private
+ */
+ol.renderer.webgl.VectorLayer.prototype.handleImageChange_ =
+    function(event) {
+  this.renderIfReadyAndVisible();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.renderer.webgl.VectorLayer.prototype.prepareFrame =
+    function(frameState, layerState, context) {
+
+  var vectorLayer = /** @type {ol.layer.Vector} */ (this.getLayer());
+  goog.asserts.assertInstanceof(vectorLayer, ol.layer.Vector);
+  var vectorSource = vectorLayer.getSource();
+
+  this.updateAttributions(
+      frameState.attributions, vectorSource.getAttributions());
+  this.updateLogos(frameState, vectorSource);
+
+  if (!this.dirty_ && (frameState.viewHints[ol.ViewHint.ANIMATING] ||
+      frameState.viewHints[ol.ViewHint.INTERACTING])) {
+    return true;
+  }
+
+  var frameStateExtent = frameState.extent;
+  var viewState = frameState.viewState;
+  var projection = viewState.projection;
+  var resolution = viewState.resolution;
+  var pixelRatio = frameState.pixelRatio;
+  var vectorLayerRevision = vectorLayer.getRevision();
+  var vectorLayerRenderBuffer = vectorLayer.getRenderBuffer();
+  var vectorLayerRenderOrder = vectorLayer.getRenderOrder();
+
+  if (!goog.isDef(vectorLayerRenderOrder)) {
+    vectorLayerRenderOrder = ol.renderer.vector.defaultOrder;
+  }
+
+  var extent = ol.extent.buffer(frameStateExtent,
+      vectorLayerRenderBuffer * resolution);
+
+  if (!this.dirty_ &&
+      this.renderedResolution_ == resolution &&
+      this.renderedRevision_ == vectorLayerRevision &&
+      this.renderedRenderOrder_ == vectorLayerRenderOrder &&
+      ol.extent.containsExtent(this.renderedExtent_, extent)) {
+    return true;
+  }
+
+  if (!goog.isNull(this.replayGroup_)) {
+    frameState.postRenderFunctions.push(
+        this.replayGroup_.getDeleteResourcesFunction(context));
+  }
+
+  this.dirty_ = false;
+
+  var replayGroup = new ol.render.webgl.ReplayGroup(
+      ol.renderer.vector.getTolerance(resolution, pixelRatio),
+      extent);
+  vectorSource.loadFeatures(extent, resolution, projection);
+  var renderFeature =
+      /**
+       * @param {ol.Feature} feature Feature.
+       * @this {ol.renderer.webgl.VectorLayer}
+       */
+      function(feature) {
+    var styles;
+    if (goog.isDef(feature.getStyleFunction())) {
+      styles = feature.getStyleFunction().call(feature, resolution);
+    } else if (goog.isDef(vectorLayer.getStyleFunction())) {
+      styles = vectorLayer.getStyleFunction()(feature, resolution);
+    }
+    if (goog.isDefAndNotNull(styles)) {
+      var dirty = this.renderFeature(
+          feature, resolution, pixelRatio, styles, replayGroup);
+      this.dirty_ = this.dirty_ || dirty;
+    }
+  };
+  if (!goog.isNull(vectorLayerRenderOrder)) {
+    /** @type {Array.<ol.Feature>} */
+    var features = [];
+    vectorSource.forEachFeatureInExtentAtResolution(extent, resolution,
+        /**
+         * @param {ol.Feature} feature Feature.
+         */
+        function(feature) {
+          features.push(feature);
+        }, this);
+    goog.array.sort(features, vectorLayerRenderOrder);
+    goog.array.forEach(features, renderFeature, this);
+  } else {
+    vectorSource.forEachFeatureInExtentAtResolution(
+        extent, resolution, renderFeature, this);
+  }
+  replayGroup.finish(context);
+
+  this.renderedResolution_ = resolution;
+  this.renderedRevision_ = vectorLayerRevision;
+  this.renderedRenderOrder_ = vectorLayerRenderOrder;
+  this.renderedExtent_ = extent;
+  this.replayGroup_ = replayGroup;
+
+  return true;
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {Array.<ol.style.Style>} styles Array of styles
+ * @param {ol.render.webgl.ReplayGroup} replayGroup Replay group.
+ * @return {boolean} `true` if an image is loading.
+ */
+ol.renderer.webgl.VectorLayer.prototype.renderFeature =
+    function(feature, resolution, pixelRatio, styles, replayGroup) {
+  if (!goog.isDefAndNotNull(styles)) {
+    return false;
+  }
+  var i, ii, loading = false;
+  for (i = 0, ii = styles.length; i < ii; ++i) {
+    loading = ol.renderer.vector.renderFeature(
+        replayGroup, feature, styles[i],
+        ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
+        this.handleImageChange_, this) || loading;
+  }
+  return loading;
+};
diff --git a/src/ol/resolutionconstraint.js b/src/ol/resolutionconstraint.js
new file mode 100644
index 0000000..a90162d
--- /dev/null
+++ b/src/ol/resolutionconstraint.js
@@ -0,0 +1,76 @@
+goog.provide('ol.ResolutionConstraint');
+goog.provide('ol.ResolutionConstraintType');
+
+goog.require('goog.math');
+goog.require('ol.array');
+
+
+/**
+ * @typedef {function((number|undefined), number, number): (number|undefined)}
+ */
+ol.ResolutionConstraintType;
+
+
+/**
+ * @param {Array.<number>} resolutions Resolutions.
+ * @return {ol.ResolutionConstraintType} Zoom function.
+ */
+ol.ResolutionConstraint.createSnapToResolutions =
+    function(resolutions) {
+  return (
+      /**
+       * @param {number|undefined} resolution Resolution.
+       * @param {number} delta Delta.
+       * @param {number} direction Direction.
+       * @return {number|undefined} Resolution.
+       */
+      function(resolution, delta, direction) {
+        if (goog.isDef(resolution)) {
+          var z =
+              ol.array.linearFindNearest(resolutions, resolution, direction);
+          z = goog.math.clamp(z + delta, 0, resolutions.length - 1);
+          return resolutions[z];
+        } else {
+          return undefined;
+        }
+      });
+};
+
+
+/**
+ * @param {number} power Power.
+ * @param {number} maxResolution Maximum resolution.
+ * @param {number=} opt_maxLevel Maximum level.
+ * @return {ol.ResolutionConstraintType} Zoom function.
+ */
+ol.ResolutionConstraint.createSnapToPower =
+    function(power, maxResolution, opt_maxLevel) {
+  return (
+      /**
+       * @param {number|undefined} resolution Resolution.
+       * @param {number} delta Delta.
+       * @param {number} direction Direction.
+       * @return {number|undefined} Resolution.
+       */
+      function(resolution, delta, direction) {
+        if (goog.isDef(resolution)) {
+          var offset;
+          if (direction > 0) {
+            offset = 0;
+          } else if (direction < 0) {
+            offset = 1;
+          } else {
+            offset = 0.5;
+          }
+          var oldLevel = Math.floor(
+              Math.log(maxResolution / resolution) / Math.log(power) + offset);
+          var newLevel = Math.max(oldLevel + delta, 0);
+          if (goog.isDef(opt_maxLevel)) {
+            newLevel = Math.min(newLevel, opt_maxLevel);
+          }
+          return maxResolution / Math.pow(power, newLevel);
+        } else {
+          return undefined;
+        }
+      });
+};
diff --git a/src/ol/rotationconstraint.js b/src/ol/rotationconstraint.js
new file mode 100644
index 0000000..fc73600
--- /dev/null
+++ b/src/ol/rotationconstraint.js
@@ -0,0 +1,87 @@
+goog.provide('ol.RotationConstraint');
+goog.provide('ol.RotationConstraintType');
+
+goog.require('goog.math');
+
+
+/**
+ * @typedef {function((number|undefined), number): (number|undefined)}
+ */
+ol.RotationConstraintType;
+
+
+/**
+ * @param {number|undefined} rotation Rotation.
+ * @param {number} delta Delta.
+ * @return {number|undefined} Rotation.
+ */
+ol.RotationConstraint.disable = function(rotation, delta) {
+  if (goog.isDef(rotation)) {
+    return 0;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {number|undefined} rotation Rotation.
+ * @param {number} delta Delta.
+ * @return {number|undefined} Rotation.
+ */
+ol.RotationConstraint.none = function(rotation, delta) {
+  if (goog.isDef(rotation)) {
+    return rotation + delta;
+  } else {
+    return undefined;
+  }
+};
+
+
+/**
+ * @param {number} n N.
+ * @return {ol.RotationConstraintType} Rotation constraint.
+ */
+ol.RotationConstraint.createSnapToN = function(n) {
+  var theta = 2 * Math.PI / n;
+  return (
+      /**
+       * @param {number|undefined} rotation Rotation.
+       * @param {number} delta Delta.
+       * @return {number|undefined} Rotation.
+       */
+      function(rotation, delta) {
+        if (goog.isDef(rotation)) {
+          rotation = Math.floor((rotation + delta) / theta + 0.5) * theta;
+          return rotation;
+        } else {
+          return undefined;
+        }
+      });
+};
+
+
+/**
+ * @param {number=} opt_tolerance Tolerance.
+ * @return {ol.RotationConstraintType} Rotation constraint.
+ */
+ol.RotationConstraint.createSnapToZero = function(opt_tolerance) {
+  var tolerance = opt_tolerance || goog.math.toRadians(5);
+  return (
+      /**
+       * @param {number|undefined} rotation Rotation.
+       * @param {number} delta Delta.
+       * @return {number|undefined} Rotation.
+       */
+      function(rotation, delta) {
+        if (goog.isDef(rotation)) {
+          if (Math.abs(rotation + delta) <= tolerance) {
+            return 0;
+          } else {
+            return rotation + delta;
+          }
+        } else {
+          return undefined;
+        }
+      });
+};
diff --git a/src/ol/size.js b/src/ol/size.js
new file mode 100644
index 0000000..2fb84be
--- /dev/null
+++ b/src/ol/size.js
@@ -0,0 +1,21 @@
+goog.provide('ol.Size');
+goog.provide('ol.size');
+
+
+/**
+ * An array of numbers representing a size: `[width, height]`.
+ * @typedef {Array.<number>}
+ * @api stable
+ */
+ol.Size;
+
+
+/**
+ * Compares sizes for equality.
+ * @param {ol.Size} a Size.
+ * @param {ol.Size} b Size.
+ * @return {boolean} Equals.
+ */
+ol.size.equals = function(a, b) {
+  return a[0] == b[0] && a[1] == b[1];
+};
diff --git a/src/ol/source.jsdoc b/src/ol/source.jsdoc
new file mode 100644
index 0000000..7c86502
--- /dev/null
+++ b/src/ol/source.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.source
+ */
diff --git a/src/ol/source/bingmapssource.js b/src/ol/source/bingmapssource.js
new file mode 100644
index 0000000..fdcb439
--- /dev/null
+++ b/src/ol/source/bingmapssource.js
@@ -0,0 +1,178 @@
+goog.provide('ol.source.BingMaps');
+
+goog.require('goog.Uri');
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.net.Jsonp');
+goog.require('ol');
+goog.require('ol.Attribution');
+goog.require('ol.TileRange');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.extent');
+goog.require('ol.proj');
+goog.require('ol.source.State');
+goog.require('ol.source.TileImage');
+goog.require('ol.tilecoord');
+goog.require('ol.tilegrid.XYZ');
+
+
+
+/**
+ * @classdesc
+ * Layer source for Bing Maps tile data.
+ *
+ * @constructor
+ * @extends {ol.source.TileImage}
+ * @param {olx.source.BingMapsOptions} options Bing Maps options.
+ * @api stable
+ */
+ol.source.BingMaps = function(options) {
+
+  goog.base(this, {
+    crossOrigin: 'anonymous',
+    opaque: true,
+    projection: ol.proj.get('EPSG:3857'),
+    state: ol.source.State.LOADING,
+    tileLoadFunction: options.tileLoadFunction
+  });
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.culture_ = goog.isDef(options.culture) ? options.culture : 'en-us';
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxZoom_ = goog.isDef(options.maxZoom) ? options.maxZoom : -1;
+
+  var protocol = ol.IS_HTTPS ? 'https:' : 'http:';
+  var uri = new goog.Uri(
+      protocol + '//dev.virtualearth.net/REST/v1/Imagery/Metadata/' +
+      options.imagerySet);
+
+  var jsonp = new goog.net.Jsonp(uri, 'jsonp');
+  jsonp.send({
+    'include': 'ImageryProviders',
+    'uriScheme': ol.IS_HTTPS ? 'https' : 'http',
+    'key': options.key
+  }, goog.bind(this.handleImageryMetadataResponse, this));
+
+};
+goog.inherits(ol.source.BingMaps, ol.source.TileImage);
+
+
+/**
+ * @const
+ * @type {ol.Attribution}
+ * @api
+ */
+ol.source.BingMaps.TOS_ATTRIBUTION = new ol.Attribution({
+  html: '<a class="ol-attribution-bing-tos" ' +
+      'href="http://www.microsoft.com/maps/product/terms.html">' +
+      'Terms of Use</a>'
+});
+
+
+/**
+ * @param {BingMapsImageryMetadataResponse} response Response.
+ */
+ol.source.BingMaps.prototype.handleImageryMetadataResponse =
+    function(response) {
+
+  if (response.statusCode != 200 ||
+      response.statusDescription != 'OK' ||
+      response.authenticationResultCode != 'ValidCredentials' ||
+      response.resourceSets.length != 1 ||
+      response.resourceSets[0].resources.length != 1) {
+    this.setState(ol.source.State.ERROR);
+    return;
+  }
+
+  var brandLogoUri = response.brandLogoUri;
+  //var copyright = response.copyright;  // FIXME do we need to display this?
+  var resource = response.resourceSets[0].resources[0];
+  goog.asserts.assert(resource.imageWidth == resource.imageHeight);
+  var maxZoom = this.maxZoom_ == -1 ? resource.zoomMax : this.maxZoom_;
+
+  var sourceProjection = this.getProjection();
+  var tileGrid = new ol.tilegrid.XYZ({
+    extent: ol.tilegrid.extentFromProjection(sourceProjection),
+    minZoom: resource.zoomMin,
+    maxZoom: maxZoom,
+    tileSize: resource.imageWidth
+  });
+  this.tileGrid = tileGrid;
+
+  var culture = this.culture_;
+  this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(
+      tileGrid.createTileCoordTransform(),
+      ol.TileUrlFunction.createFromTileUrlFunctions(
+          goog.array.map(
+              resource.imageUrlSubdomains,
+              function(subdomain) {
+                var imageUrl = resource.imageUrl
+                    .replace('{subdomain}', subdomain)
+                    .replace('{culture}', culture);
+                return (
+                    /**
+                     * @param {ol.TileCoord} tileCoord Tile coordinate.
+                     * @param {number} pixelRatio Pixel ratio.
+                     * @param {ol.proj.Projection} projection Projection.
+                     * @return {string|undefined} Tile URL.
+                     */
+                    function(tileCoord, pixelRatio, projection) {
+                      goog.asserts.assert(ol.proj.equivalent(
+                          projection, sourceProjection));
+                      if (goog.isNull(tileCoord)) {
+                        return undefined;
+                      } else {
+                        return imageUrl.replace(
+                            '{quadkey}', ol.tilecoord.quadKey(tileCoord));
+                      }
+                    });
+              })));
+
+  if (resource.imageryProviders) {
+    var transform = ol.proj.getTransformFromProjections(
+        ol.proj.get('EPSG:4326'), this.getProjection());
+
+    var attributions = goog.array.map(
+        resource.imageryProviders,
+        function(imageryProvider) {
+          var html = imageryProvider.attribution;
+          /** @type {Object.<string, Array.<ol.TileRange>>} */
+          var tileRanges = {};
+          goog.array.forEach(
+              imageryProvider.coverageAreas,
+              function(coverageArea) {
+                var minZ = coverageArea.zoomMin;
+                var maxZ = Math.min(coverageArea.zoomMax, maxZoom);
+                var bbox = coverageArea.bbox;
+                var epsg4326Extent = [bbox[1], bbox[0], bbox[3], bbox[2]];
+                var extent = ol.extent.applyTransform(
+                    epsg4326Extent, transform);
+                var tileRange, z, zKey;
+                for (z = minZ; z <= maxZ; ++z) {
+                  zKey = z.toString();
+                  tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
+                  if (zKey in tileRanges) {
+                    tileRanges[zKey].push(tileRange);
+                  } else {
+                    tileRanges[zKey] = [tileRange];
+                  }
+                }
+              });
+          return new ol.Attribution({html: html, tileRanges: tileRanges});
+        });
+    attributions.push(ol.source.BingMaps.TOS_ATTRIBUTION);
+    this.setAttributions(attributions);
+  }
+
+  this.setLogo(brandLogoUri);
+
+  this.setState(ol.source.State.READY);
+
+};
diff --git a/src/ol/source/clustersource.js b/src/ol/source/clustersource.js
new file mode 100644
index 0000000..cb5225c
--- /dev/null
+++ b/src/ol/source/clustersource.js
@@ -0,0 +1,153 @@
+// FIXME keep cluster cache by resolution ?
+// FIXME distance not respected because of the centroid
+
+goog.provide('ol.source.Cluster');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol.Feature');
+goog.require('ol.coordinate');
+goog.require('ol.extent');
+goog.require('ol.geom.Point');
+goog.require('ol.source.Vector');
+
+
+
+/**
+ * @constructor
+ * @param {olx.source.ClusterOptions} options
+ * @extends {ol.source.Vector}
+ * @api
+ */
+ol.source.Cluster = function(options) {
+  goog.base(this, {
+    attributions: options.attributions,
+    extent: options.extent,
+    logo: options.logo,
+    projection: options.projection
+  });
+
+  /**
+   * @type {number|undefined}
+   * @private
+   */
+  this.resolution_ = undefined;
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.distance_ = goog.isDef(options.distance) ? options.distance : 20;
+
+  /**
+   * @type {Array.<ol.Feature>}
+   * @private
+   */
+  this.features_ = [];
+
+  /**
+   * @type {ol.source.Vector}
+   * @private
+   */
+  this.source_ = options.source;
+
+  this.source_.on(goog.events.EventType.CHANGE,
+      ol.source.Cluster.prototype.onSourceChange_, this);
+};
+goog.inherits(ol.source.Cluster, ol.source.Vector);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.Cluster.prototype.loadFeatures = function(extent, resolution,
+    projection) {
+  if (resolution !== this.resolution_) {
+    this.clear();
+    this.resolution_ = resolution;
+    this.source_.loadFeatures(extent, resolution, projection);
+    this.cluster_();
+    this.addFeatures(this.features_);
+  }
+};
+
+
+/**
+ * handle the source changing
+ * @private
+ */
+ol.source.Cluster.prototype.onSourceChange_ = function() {
+  this.clear();
+  this.cluster_();
+  this.addFeatures(this.features_);
+  this.changed();
+};
+
+
+/**
+ * @private
+ */
+ol.source.Cluster.prototype.cluster_ = function() {
+  if (!goog.isDef(this.resolution_)) {
+    return;
+  }
+  goog.array.clear(this.features_);
+  var extent = ol.extent.createEmpty();
+  var mapDistance = this.distance_ * this.resolution_;
+  var features = this.source_.getFeatures();
+
+  /**
+   * @type {Object.<string, boolean>}
+   */
+  var clustered = {};
+
+  for (var i = 0, ii = features.length; i < ii; i++) {
+    var feature = features[i];
+    if (!goog.object.containsKey(clustered, goog.getUid(feature).toString())) {
+      var geometry = feature.getGeometry();
+      goog.asserts.assert(geometry instanceof ol.geom.Point);
+      var coordinates = geometry.getCoordinates();
+      ol.extent.createOrUpdateFromCoordinate(coordinates, extent);
+      ol.extent.buffer(extent, mapDistance, extent);
+
+      var neighbors = this.source_.getFeaturesInExtent(extent);
+      goog.asserts.assert(neighbors.length >= 1);
+      neighbors = goog.array.filter(neighbors, function(neighbor) {
+        var uid = goog.getUid(neighbor).toString();
+        if (!goog.object.containsKey(clustered, uid)) {
+          goog.object.set(clustered, uid, true);
+          return true;
+        } else {
+          return false;
+        }
+      });
+      this.features_.push(this.createCluster_(neighbors));
+    }
+  }
+  goog.asserts.assert(
+      goog.object.getCount(clustered) == this.source_.getFeatures().length);
+};
+
+
+/**
+ * @param {Array.<ol.Feature>} features Features
+ * @return {ol.Feature}
+ * @private
+ */
+ol.source.Cluster.prototype.createCluster_ = function(features) {
+  var length = features.length;
+  var centroid = [0, 0];
+  for (var i = 0; i < length; i++) {
+    var geometry = features[i].getGeometry();
+    goog.asserts.assert(geometry instanceof ol.geom.Point);
+    var coordinates = geometry.getCoordinates();
+    ol.coordinate.add(centroid, coordinates);
+  }
+  ol.coordinate.scale(centroid, 1 / length);
+
+  var cluster = new ol.Feature(new ol.geom.Point(centroid));
+  cluster.set('features', features);
+  return cluster;
+};
diff --git a/src/ol/source/formatvectorsource.js b/src/ol/source/formatvectorsource.js
new file mode 100644
index 0000000..7c94bf5
--- /dev/null
+++ b/src/ol/source/formatvectorsource.js
@@ -0,0 +1,125 @@
+// FIXME consider delaying feature reading so projection can be provided by
+// consumer (e.g. the view)
+
+goog.provide('ol.source.FormatVector');
+
+goog.require('goog.asserts');
+goog.require('goog.dispose');
+goog.require('goog.events');
+goog.require('goog.net.EventType');
+goog.require('goog.net.XhrIo');
+goog.require('goog.net.XhrIo.ResponseType');
+goog.require('goog.userAgent');
+goog.require('ol.format.FormatType');
+goog.require('ol.has');
+goog.require('ol.source.State');
+goog.require('ol.source.Vector');
+goog.require('ol.xml');
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for vector sources in one of the supported formats.
+ *
+ * @constructor
+ * @extends {ol.source.Vector}
+ * @param {olx.source.FormatVectorOptions} options Options.
+ */
+ol.source.FormatVector = function(options) {
+
+  goog.base(this, {
+    attributions: options.attributions,
+    logo: options.logo,
+    projection: options.projection
+  });
+
+  /**
+   * @protected
+   * @type {ol.format.Feature}
+   */
+  this.format = options.format;
+
+};
+goog.inherits(ol.source.FormatVector, ol.source.Vector);
+
+
+/**
+ * @param {goog.Uri|string} url URL.
+ * @param {function(this: T, Array.<ol.Feature>)} success Success Callback.
+ * @param {function(this: T)} error Error callback.
+ * @param {T} thisArg Value to use as `this` when executing `success` or
+ *     `error`.
+ * @template T
+ */
+ol.source.FormatVector.prototype.loadFeaturesFromURL =
+    function(url, success, error, thisArg) {
+  var xhrIo = new goog.net.XhrIo();
+  var type = this.format.getType();
+  var responseType;
+  // FIXME maybe use ResponseType.DOCUMENT?
+  if (type == ol.format.FormatType.BINARY &&
+      ol.has.ARRAY_BUFFER) {
+    responseType = goog.net.XhrIo.ResponseType.ARRAY_BUFFER;
+  } else {
+    responseType = goog.net.XhrIo.ResponseType.TEXT;
+  }
+  xhrIo.setResponseType(responseType);
+  goog.events.listen(xhrIo, goog.net.EventType.COMPLETE,
+      /**
+       * @param {Event} event Event.
+       * @private
+       * @this {ol.source.FormatVector}
+       */
+      function(event) {
+        var xhrIo = event.target;
+        goog.asserts.assertInstanceof(xhrIo, goog.net.XhrIo);
+        if (xhrIo.isSuccess()) {
+          var type = this.format.getType();
+          /** @type {ArrayBuffer|Document|Node|Object|string|undefined} */
+          var source;
+          if (type == ol.format.FormatType.BINARY &&
+              ol.has.ARRAY_BUFFER) {
+            source = xhrIo.getResponse();
+            goog.asserts.assertInstanceof(source, ArrayBuffer);
+          } else if (type == ol.format.FormatType.JSON) {
+            source = xhrIo.getResponseText();
+          } else if (type == ol.format.FormatType.TEXT) {
+            source = xhrIo.getResponseText();
+          } else if (type == ol.format.FormatType.XML) {
+            if (!goog.userAgent.IE) {
+              source = xhrIo.getResponseXml();
+            }
+            if (!goog.isDefAndNotNull(source)) {
+              source = ol.xml.parse(xhrIo.getResponseText());
+            }
+          } else {
+            goog.asserts.fail();
+          }
+          if (goog.isDefAndNotNull(source)) {
+            success.call(thisArg, this.readFeatures(source));
+          } else {
+            this.setState(ol.source.State.ERROR);
+            goog.asserts.fail();
+          }
+        } else {
+          error.call(thisArg);
+        }
+        goog.dispose(xhrIo);
+      }, false, this);
+  xhrIo.send(url);
+};
+
+
+/**
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {Array.<ol.Feature>} Features.
+ * @api
+ */
+ol.source.FormatVector.prototype.readFeatures = function(source) {
+  var format = this.format;
+  var projection = this.getProjection();
+  return format.readFeatures(source, {featureProjection: projection});
+};
diff --git a/src/ol/source/geojsonsource.js b/src/ol/source/geojsonsource.js
new file mode 100644
index 0000000..b1f11c8
--- /dev/null
+++ b/src/ol/source/geojsonsource.js
@@ -0,0 +1,37 @@
+goog.provide('ol.source.GeoJSON');
+
+goog.require('ol.format.GeoJSON');
+goog.require('ol.source.StaticVector');
+
+
+
+/**
+ * @classdesc
+ * Static vector source in GeoJSON format
+ *
+ * @constructor
+ * @extends {ol.source.StaticVector}
+ * @fires ol.source.VectorEvent
+ * @param {olx.source.GeoJSONOptions=} opt_options Options.
+ * @api
+ */
+ol.source.GeoJSON = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    attributions: options.attributions,
+    extent: options.extent,
+    format: new ol.format.GeoJSON({
+      defaultDataProjection: options.defaultProjection
+    }),
+    logo: options.logo,
+    object: options.object,
+    projection: options.projection,
+    text: options.text,
+    url: options.url,
+    urls: options.urls
+  });
+
+};
+goog.inherits(ol.source.GeoJSON, ol.source.StaticVector);
diff --git a/src/ol/source/gpxsource.js b/src/ol/source/gpxsource.js
new file mode 100644
index 0000000..7f45499
--- /dev/null
+++ b/src/ol/source/gpxsource.js
@@ -0,0 +1,36 @@
+goog.provide('ol.source.GPX');
+
+goog.require('ol.format.GPX');
+goog.require('ol.source.StaticVector');
+
+
+
+/**
+ * @classdesc
+ * Static vector source in GPX format
+ *
+ * @constructor
+ * @extends {ol.source.StaticVector}
+ * @fires ol.source.VectorEvent
+ * @param {olx.source.GPXOptions=} opt_options Options.
+ * @api
+ */
+ol.source.GPX = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    attributions: options.attributions,
+    doc: options.doc,
+    extent: options.extent,
+    format: new ol.format.GPX(),
+    logo: options.logo,
+    node: options.node,
+    projection: options.projection,
+    text: options.text,
+    url: options.url,
+    urls: options.urls
+  });
+
+};
+goog.inherits(ol.source.GPX, ol.source.StaticVector);
diff --git a/src/ol/source/igcsource.js b/src/ol/source/igcsource.js
new file mode 100644
index 0000000..ebe220b
--- /dev/null
+++ b/src/ol/source/igcsource.js
@@ -0,0 +1,33 @@
+goog.provide('ol.source.IGC');
+
+goog.require('ol.format.IGC');
+goog.require('ol.source.StaticVector');
+
+
+
+/**
+ * @classdesc
+ * Static vector source in IGC format
+ *
+ * @constructor
+ * @extends {ol.source.StaticVector}
+ * @fires ol.source.VectorEvent
+ * @param {olx.source.IGCOptions=} opt_options Options.
+ * @api
+ */
+ol.source.IGC = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    format: new ol.format.IGC({
+      altitudeMode: options.altitudeMode
+    }),
+    projection: options.projection,
+    text: options.text,
+    url: options.url,
+    urls: options.urls
+  });
+
+};
+goog.inherits(ol.source.IGC, ol.source.StaticVector);
diff --git a/src/ol/source/imagecanvassource.js b/src/ol/source/imagecanvassource.js
new file mode 100644
index 0000000..16e390e
--- /dev/null
+++ b/src/ol/source/imagecanvassource.js
@@ -0,0 +1,91 @@
+goog.provide('ol.source.ImageCanvas');
+
+goog.require('ol.CanvasFunctionType');
+goog.require('ol.ImageCanvas');
+goog.require('ol.extent');
+goog.require('ol.source.Image');
+
+
+
+/**
+ * @classdesc
+ * Base class for image sources where a canvas element is the image.
+ *
+ * @constructor
+ * @extends {ol.source.Image}
+ * @param {olx.source.ImageCanvasOptions} options
+ * @api
+ */
+ol.source.ImageCanvas = function(options) {
+
+  goog.base(this, {
+    attributions: options.attributions,
+    logo: options.logo,
+    projection: options.projection,
+    resolutions: options.resolutions,
+    state: goog.isDef(options.state) ?
+        /** @type {ol.source.State} */ (options.state) : undefined
+  });
+
+  /**
+   * @private
+   * @type {ol.CanvasFunctionType}
+   */
+  this.canvasFunction_ = options.canvasFunction;
+
+  /**
+   * @private
+   * @type {ol.ImageCanvas}
+   */
+  this.canvas_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedRevision_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.ratio_ = goog.isDef(options.ratio) ?
+      options.ratio : 1.5;
+
+};
+goog.inherits(ol.source.ImageCanvas, ol.source.Image);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ImageCanvas.prototype.getImage =
+    function(extent, resolution, pixelRatio, projection) {
+  resolution = this.findNearestResolution(resolution);
+
+  var canvas = this.canvas_;
+  if (!goog.isNull(canvas) &&
+      this.renderedRevision_ == this.getRevision() &&
+      canvas.getResolution() == resolution &&
+      canvas.getPixelRatio() == pixelRatio &&
+      ol.extent.containsExtent(canvas.getExtent(), extent)) {
+    return canvas;
+  }
+
+  extent = extent.slice();
+  ol.extent.scaleFromCenter(extent, this.ratio_);
+  var width = ol.extent.getWidth(extent) / resolution;
+  var height = ol.extent.getHeight(extent) / resolution;
+  var size = [width * pixelRatio, height * pixelRatio];
+
+  var canvasElement = this.canvasFunction_(
+      extent, resolution, pixelRatio, size, projection);
+  if (!goog.isNull(canvasElement)) {
+    canvas = new ol.ImageCanvas(extent, resolution, pixelRatio,
+        this.getAttributions(), canvasElement);
+  }
+  this.canvas_ = canvas;
+  this.renderedRevision_ = this.getRevision();
+
+  return canvas;
+};
diff --git a/src/ol/source/imagemapguidesource.js b/src/ol/source/imagemapguidesource.js
new file mode 100644
index 0000000..3d7c18f
--- /dev/null
+++ b/src/ol/source/imagemapguidesource.js
@@ -0,0 +1,223 @@
+goog.provide('ol.source.ImageMapGuide');
+
+goog.require('goog.object');
+goog.require('goog.uri.utils');
+goog.require('ol.Image');
+goog.require('ol.ImageLoadFunctionType');
+goog.require('ol.ImageUrlFunction');
+goog.require('ol.extent');
+goog.require('ol.source.Image');
+
+
+
+/**
+ * @classdesc
+ * Source for images from Mapguide servers
+ *
+ * @constructor
+ * @extends {ol.source.Image}
+ * @param {olx.source.ImageMapGuideOptions} options Options.
+ * @api stable
+ */
+ol.source.ImageMapGuide = function(options) {
+
+  goog.base(this, {
+    projection: options.projection,
+    resolutions: options.resolutions
+  });
+
+  /**
+   * @private
+   * @type {?string}
+   */
+  this.crossOrigin_ =
+      goog.isDef(options.crossOrigin) ? options.crossOrigin : null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.displayDpi_ = goog.isDef(options.displayDpi) ?
+      options.displayDpi : 96;
+
+  /**
+   * @private
+   * @type {Object}
+   */
+  this.params_ = goog.isDef(options.params) ? options.params : {};
+
+  var imageUrlFunction;
+  if (goog.isDef(options.url)) {
+    imageUrlFunction = ol.ImageUrlFunction.createFromParamsFunction(
+        options.url, this.params_, goog.bind(this.getUrl, this));
+  } else {
+    imageUrlFunction = ol.ImageUrlFunction.nullImageUrlFunction;
+  }
+
+  /**
+   * @private
+   * @type {ol.ImageUrlFunctionType}
+   */
+  this.imageUrlFunction_ = imageUrlFunction;
+
+  /**
+   * @private
+   * @type {ol.ImageLoadFunctionType}
+   */
+  this.imageLoadFunction_ = goog.isDef(options.imageLoadFunction) ?
+      options.imageLoadFunction : ol.source.Image.defaultImageLoadFunction;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.metersPerUnit_ = goog.isDef(options.metersPerUnit) ?
+      options.metersPerUnit : 1;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.ratio_ = goog.isDef(options.ratio) ? options.ratio : 1;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.useOverlay_ = goog.isDef(options.useOverlay) ?
+      options.useOverlay : false;
+
+  /**
+   * @private
+   * @type {ol.Image}
+   */
+  this.image_ = null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedRevision_ = 0;
+
+};
+goog.inherits(ol.source.ImageMapGuide, ol.source.Image);
+
+
+/**
+ * Get the user-provided params, i.e. those passed to the constructor through
+ * the "params" option, and possibly updated using the updateParams method.
+ * @return {Object} Params.
+ * @api stable
+ */
+ol.source.ImageMapGuide.prototype.getParams = function() {
+  return this.params_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ImageMapGuide.prototype.getImage =
+    function(extent, resolution, pixelRatio, projection) {
+  resolution = this.findNearestResolution(resolution);
+  pixelRatio = this.hidpi_ ? pixelRatio : 1;
+
+  var image = this.image_;
+  if (!goog.isNull(image) &&
+      this.renderedRevision_ == this.getRevision() &&
+      image.getResolution() == resolution &&
+      image.getPixelRatio() == pixelRatio &&
+      ol.extent.containsExtent(image.getExtent(), extent)) {
+    return image;
+  }
+
+  if (this.ratio_ != 1) {
+    extent = extent.slice();
+    ol.extent.scaleFromCenter(extent, this.ratio_);
+  }
+  var width = ol.extent.getWidth(extent) / resolution;
+  var height = ol.extent.getHeight(extent) / resolution;
+  var size = [width * pixelRatio, height * pixelRatio];
+
+  var imageUrl = this.imageUrlFunction_(extent, size, projection);
+  if (goog.isDef(imageUrl)) {
+    image = new ol.Image(extent, resolution, pixelRatio,
+        this.getAttributions(), imageUrl, this.crossOrigin_,
+        this.imageLoadFunction_);
+  } else {
+    image = null;
+  }
+  this.image_ = image;
+  this.renderedRevision_ = this.getRevision();
+
+  return image;
+};
+
+
+/**
+ * @param {ol.Extent} extent The map extents.
+ * @param {ol.Size} size the viewport size.
+ * @param {number} metersPerUnit The meters-per-unit value.
+ * @param {number} dpi The display resolution.
+ * @return {number} The computed map scale.
+ */
+ol.source.ImageMapGuide.getScale = function(extent, size, metersPerUnit, dpi) {
+  var mcsW = ol.extent.getWidth(extent);
+  var mcsH = ol.extent.getHeight(extent);
+  var devW = size[0];
+  var devH = size[1];
+  var mpp = 0.0254 / dpi;
+  if (devH * mcsW > devW * mcsH) {
+    return mcsW * metersPerUnit / (devW * mpp); // width limited
+  } else {
+    return mcsH * metersPerUnit / (devH * mpp); // height limited
+  }
+};
+
+
+/**
+ * Update the user-provided params.
+ * @param {Object} params Params.
+ * @api stable
+ */
+ol.source.ImageMapGuide.prototype.updateParams = function(params) {
+  goog.object.extend(this.params_, params);
+  this.changed();
+};
+
+
+/**
+ * @param {string} baseUrl The mapagent url.
+ * @param {Object.<string, string|number>} params Request parameters.
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Size} size Size.
+ * @param {ol.proj.Projection} projection Projection.
+ * @return {string} The mapagent map image request URL.
+ */
+ol.source.ImageMapGuide.prototype.getUrl =
+    function(baseUrl, params, extent, size, projection) {
+  var scale = ol.source.ImageMapGuide.getScale(extent, size,
+      this.metersPerUnit_, this.displayDpi_);
+  var center = ol.extent.getCenter(extent);
+  var baseParams = {
+    'OPERATION': this.useOverlay_ ? 'GETDYNAMICMAPOVERLAYIMAGE' : 'GETMAPIMAGE',
+    'VERSION': '2.0.0',
+    'LOCALE': 'en',
+    'CLIENTAGENT': 'ol.source.ImageMapGuide source',
+    'CLIP': '1',
+    'SETDISPLAYDPI': this.displayDpi_,
+    'SETDISPLAYWIDTH': Math.round(size[0]),
+    'SETDISPLAYHEIGHT': Math.round(size[1]),
+    'SETVIEWSCALE': scale,
+    'SETVIEWCENTERX': center[0],
+    'SETVIEWCENTERY': center[1]
+  };
+  goog.object.extend(baseParams, params);
+  return goog.uri.utils.appendParamsFromMap(baseUrl, baseParams);
+};
diff --git a/src/ol/source/imagesource.js b/src/ol/source/imagesource.js
new file mode 100644
index 0000000..6cab2fe
--- /dev/null
+++ b/src/ol/source/imagesource.js
@@ -0,0 +1,101 @@
+goog.provide('ol.source.Image');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.Attribution');
+goog.require('ol.Extent');
+goog.require('ol.array');
+goog.require('ol.source.Source');
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *            extent: (null|ol.Extent|undefined),
+ *            logo: (string|olx.LogoOptions|undefined),
+ *            projection: ol.proj.ProjectionLike,
+ *            resolutions: (Array.<number>|undefined),
+ *            state: (ol.source.State|undefined)}}
+ */
+ol.source.ImageOptions;
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for sources providing a single image.
+ *
+ * @constructor
+ * @extends {ol.source.Source}
+ * @param {ol.source.ImageOptions} options Single image source options.
+ * @api
+ */
+ol.source.Image = function(options) {
+
+  goog.base(this, {
+    attributions: options.attributions,
+    extent: options.extent,
+    logo: options.logo,
+    projection: options.projection,
+    state: options.state
+  });
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.resolutions_ = goog.isDef(options.resolutions) ?
+      options.resolutions : null;
+  goog.asserts.assert(goog.isNull(this.resolutions_) ||
+      goog.array.isSorted(this.resolutions_,
+          function(a, b) {
+            return b - a;
+          }, true));
+
+};
+goog.inherits(ol.source.Image, ol.source.Source);
+
+
+/**
+ * @return {Array.<number>} Resolutions.
+ */
+ol.source.Image.prototype.getResolutions = function() {
+  return this.resolutions_;
+};
+
+
+/**
+ * @protected
+ * @param {number} resolution Resolution.
+ * @return {number} Resolution.
+ */
+ol.source.Image.prototype.findNearestResolution =
+    function(resolution) {
+  if (!goog.isNull(this.resolutions_)) {
+    var idx = ol.array.linearFindNearest(this.resolutions_, resolution, 0);
+    resolution = this.resolutions_[idx];
+  }
+  return resolution;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @return {ol.ImageBase} Single image.
+ */
+ol.source.Image.prototype.getImage = goog.abstractMethod;
+
+
+/**
+ * Default image load function for image sources that use ol.Image image
+ * instances.
+ * @param {ol.Image} image Image.
+ * @param {string} src Source.
+ */
+ol.source.Image.defaultImageLoadFunction = function(image, src) {
+  image.getImage().src = src;
+};
diff --git a/src/ol/source/imagestaticsource.js b/src/ol/source/imagestaticsource.js
new file mode 100644
index 0000000..04fa00f
--- /dev/null
+++ b/src/ol/source/imagestaticsource.js
@@ -0,0 +1,66 @@
+goog.provide('ol.source.ImageStatic');
+
+goog.require('goog.events');
+goog.require('ol.Image');
+goog.require('ol.extent');
+goog.require('ol.proj');
+goog.require('ol.source.Image');
+
+
+
+/**
+ * @classdesc
+ * A layer source for displaying a single, static image.
+ *
+ * @constructor
+ * @extends {ol.source.Image}
+ * @param {olx.source.ImageStaticOptions} options Options.
+ * @api stable
+ */
+ol.source.ImageStatic = function(options) {
+
+  var attributions = goog.isDef(options.attributions) ?
+      options.attributions : null;
+
+  var imageExtent = options.imageExtent;
+
+  var resolution, resolutions;
+  if (goog.isDef(options.imageSize)) {
+    resolution = ol.extent.getHeight(imageExtent) / options.imageSize[1];
+    resolutions = [resolution];
+  }
+
+  var crossOrigin = goog.isDef(options.crossOrigin) ?
+      options.crossOrigin : null;
+
+  var imageLoadFunction = goog.isDef(options.imageLoadFunction) ?
+      options.imageLoadFunction : ol.source.Image.defaultImageLoadFunction;
+
+  goog.base(this, {
+    attributions: attributions,
+    logo: options.logo,
+    projection: ol.proj.get(options.projection),
+    resolutions: resolutions
+  });
+
+  /**
+   * @private
+   * @type {ol.Image}
+   */
+  this.image_ = new ol.Image(imageExtent, resolution, 1, attributions,
+      options.url, crossOrigin, imageLoadFunction);
+
+};
+goog.inherits(ol.source.ImageStatic, ol.source.Image);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ImageStatic.prototype.getImage =
+    function(extent, resolution, pixelRatio, projection) {
+  if (ol.extent.intersects(extent, this.image_.getExtent())) {
+    return this.image_;
+  }
+  return null;
+};
diff --git a/src/ol/source/imagevectorsource.js b/src/ol/source/imagevectorsource.js
new file mode 100644
index 0000000..ee40500
--- /dev/null
+++ b/src/ol/source/imagevectorsource.js
@@ -0,0 +1,296 @@
+goog.provide('ol.source.ImageVector');
+
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.vec.Mat4');
+goog.require('ol.dom');
+goog.require('ol.extent');
+goog.require('ol.render.canvas.ReplayGroup');
+goog.require('ol.renderer.vector');
+goog.require('ol.source.ImageCanvas');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Style');
+goog.require('ol.vec.Mat4');
+
+
+
+/**
+ * @classdesc
+ * An image source whose images are canvas elements into which vector features
+ * read from a vector source (`ol.source.Vector`) are drawn. An
+ * `ol.source.ImageVector` object is to be used as the `source` of an image
+ * layer (`ol.layer.Image`). Image layers are rotated, scaled, and translated,
+ * as opposed to being re-rendered, during animations and interactions. So, like
+ * any other image layer, an image layer configured with an
+ * `ol.source.ImageVector` will exhibit this behaviour. This is in contrast to a
+ * vector layer, where vector features are re-drawn during animations and
+ * interactions.
+ *
+ * @constructor
+ * @extends {ol.source.ImageCanvas}
+ * @param {olx.source.ImageVectorOptions} options Options.
+ * @api
+ */
+ol.source.ImageVector = function(options) {
+
+  /**
+   * @private
+   * @type {ol.source.Vector}
+   */
+  this.source_ = options.source;
+
+  /**
+   * @private
+   * @type {!goog.vec.Mat4.Number}
+   */
+  this.transform_ = goog.vec.Mat4.createNumber();
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.canvasContext_ = ol.dom.createCanvasContext2D();
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.canvasSize_ = [0, 0];
+
+  /**
+   * @private
+   * @type {ol.render.canvas.ReplayGroup}
+   */
+  this.replayGroup_ = null;
+
+  goog.base(this, {
+    attributions: options.attributions,
+    canvasFunction: goog.bind(this.canvasFunctionInternal_, this),
+    logo: options.logo,
+    projection: options.projection,
+    ratio: options.ratio,
+    resolutions: options.resolutions,
+    state: this.source_.getState()
+  });
+
+  /**
+   * User provided style.
+   * @type {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction}
+   * @private
+   */
+  this.style_ = null;
+
+  /**
+   * Style function for use within the library.
+   * @type {ol.style.StyleFunction|undefined}
+   * @private
+   */
+  this.styleFunction_ = undefined;
+
+  this.setStyle(options.style);
+
+  goog.events.listen(this.source_, goog.events.EventType.CHANGE,
+      this.handleSourceChange_, undefined, this);
+
+};
+goog.inherits(ol.source.ImageVector, ol.source.ImageCanvas);
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.Size} size Size.
+ * @param {ol.proj.Projection} projection Projection;
+ * @return {HTMLCanvasElement} Canvas element.
+ * @private
+ */
+ol.source.ImageVector.prototype.canvasFunctionInternal_ =
+    function(extent, resolution, pixelRatio, size, projection) {
+
+  var replayGroup = new ol.render.canvas.ReplayGroup(
+      ol.renderer.vector.getTolerance(resolution, pixelRatio), extent,
+      resolution);
+
+  this.source_.loadFeatures(extent, resolution, projection);
+
+  var loading = false;
+  this.source_.forEachFeatureInExtentAtResolution(extent, resolution,
+      /**
+       * @param {ol.Feature} feature Feature.
+       */
+      function(feature) {
+        loading = loading ||
+            this.renderFeature_(feature, resolution, pixelRatio, replayGroup);
+      }, this);
+  replayGroup.finish();
+
+  if (loading) {
+    return null;
+  }
+
+  if (this.canvasSize_[0] != size[0] || this.canvasSize_[1] != size[1]) {
+    this.canvasContext_.canvas.width = size[0];
+    this.canvasContext_.canvas.height = size[1];
+    this.canvasSize_[0] = size[0];
+    this.canvasSize_[1] = size[1];
+  } else {
+    this.canvasContext_.clearRect(0, 0, size[0], size[1]);
+  }
+
+  var transform = this.getTransform_(ol.extent.getCenter(extent),
+      resolution, pixelRatio, size);
+  replayGroup.replay(this.canvasContext_, pixelRatio, transform, 0, {});
+
+  this.replayGroup_ = replayGroup;
+
+  return this.canvasContext_.canvas;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ImageVector.prototype.forEachFeatureAtPixel = function(
+    resolution, rotation, coordinate, skippedFeatureUids, callback) {
+  if (goog.isNull(this.replayGroup_)) {
+    return undefined;
+  } else {
+    /** @type {Object.<string, boolean>} */
+    var features = {};
+    return this.replayGroup_.forEachGeometryAtPixel(
+        resolution, 0, coordinate, skippedFeatureUids,
+        /**
+         * @param {ol.Feature} feature Feature.
+         * @return {?} Callback result.
+         */
+        function(feature) {
+          goog.asserts.assert(goog.isDef(feature));
+          var key = goog.getUid(feature).toString();
+          if (!(key in features)) {
+            features[key] = true;
+            return callback(feature);
+          }
+        });
+  }
+};
+
+
+/**
+ * @return {ol.source.Vector} Source.
+ * @api
+ */
+ol.source.ImageVector.prototype.getSource = function() {
+  return this.source_;
+};
+
+
+/**
+ * Get the style for features.  This returns whatever was passed to the `style`
+ * option at construction or to the `setStyle` method.
+ * @return {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction}
+ *     Layer style.
+ * @api stable
+ */
+ol.source.ImageVector.prototype.getStyle = function() {
+  return this.style_;
+};
+
+
+/**
+ * Get the style function.
+ * @return {ol.style.StyleFunction|undefined} Layer style function.
+ * @api stable
+ */
+ol.source.ImageVector.prototype.getStyleFunction = function() {
+  return this.styleFunction_;
+};
+
+
+/**
+ * @param {ol.Coordinate} center Center.
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.Size} size Size.
+ * @return {!goog.vec.Mat4.Number} Transform.
+ * @private
+ */
+ol.source.ImageVector.prototype.getTransform_ =
+    function(center, resolution, pixelRatio, size) {
+  return ol.vec.Mat4.makeTransform2D(this.transform_,
+      size[0] / 2, size[1] / 2,
+      pixelRatio / resolution, -pixelRatio / resolution,
+      0,
+      -center[0], -center[1]);
+};
+
+
+/**
+ * Handle changes in image style state.
+ * @param {goog.events.Event} event Image style change event.
+ * @private
+ */
+ol.source.ImageVector.prototype.handleImageChange_ =
+    function(event) {
+  this.changed();
+};
+
+
+/**
+ * @private
+ */
+ol.source.ImageVector.prototype.handleSourceChange_ = function() {
+  // setState will trigger a CHANGE event, so we always rely
+  // change events by calling setState.
+  this.setState(this.source_.getState());
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @param {number} resolution Resolution.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.render.canvas.ReplayGroup} replayGroup Replay group.
+ * @return {boolean} `true` if an image is loading.
+ * @private
+ */
+ol.source.ImageVector.prototype.renderFeature_ =
+    function(feature, resolution, pixelRatio, replayGroup) {
+  var styles;
+  if (goog.isDef(feature.getStyleFunction())) {
+    styles = feature.getStyleFunction().call(feature, resolution);
+  } else if (goog.isDef(this.styleFunction_)) {
+    styles = this.styleFunction_(feature, resolution);
+  }
+  if (!goog.isDefAndNotNull(styles)) {
+    return false;
+  }
+  var i, ii, loading = false;
+  for (i = 0, ii = styles.length; i < ii; ++i) {
+    loading = ol.renderer.vector.renderFeature(
+        replayGroup, feature, styles[i],
+        ol.renderer.vector.getSquaredTolerance(resolution, pixelRatio),
+        this.handleImageChange_, this) || loading;
+  }
+  return loading;
+};
+
+
+/**
+ * Set the style for features.  This can be a single style object, an array
+ * of styles, or a function that takes a feature and resolution and returns
+ * an array of styles. If it is `undefined` the default style is used. If
+ * it is `null` the layer has no style (a `null` style), so only features
+ * that have their own styles will be rendered in the layer. See
+ * {@link ol.style} for information on the default style.
+ * @param {ol.style.Style|Array.<ol.style.Style>|ol.style.StyleFunction|undefined}
+ *     style Layer style.
+ * @api stable
+ */
+ol.source.ImageVector.prototype.setStyle = function(style) {
+  this.style_ = goog.isDef(style) ? style : ol.style.defaultStyleFunction;
+  this.styleFunction_ = goog.isNull(style) ?
+      undefined : ol.style.createStyleFunction(this.style_);
+  this.changed();
+};
diff --git a/src/ol/source/imagewmssource.js b/src/ol/source/imagewmssource.js
new file mode 100644
index 0000000..4ba801d
--- /dev/null
+++ b/src/ol/source/imagewmssource.js
@@ -0,0 +1,355 @@
+// FIXME cannot be shared between maps with different projections
+
+goog.provide('ol.source.ImageWMS');
+
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('goog.uri.utils');
+goog.require('ol');
+goog.require('ol.Image');
+goog.require('ol.ImageLoadFunctionType');
+goog.require('ol.extent');
+goog.require('ol.proj');
+goog.require('ol.source.Image');
+goog.require('ol.source.wms');
+goog.require('ol.source.wms.ServerType');
+
+
+
+/**
+ * @classdesc
+ * Source for WMS servers providing single, untiled images.
+ *
+ * @constructor
+ * @extends {ol.source.Image}
+ * @param {olx.source.ImageWMSOptions=} opt_options Options.
+ * @api stable
+ */
+ol.source.ImageWMS = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    attributions: options.attributions,
+    logo: options.logo,
+    projection: options.projection,
+    resolutions: options.resolutions
+  });
+
+  /**
+   * @private
+   * @type {?string}
+   */
+  this.crossOrigin_ =
+      goog.isDef(options.crossOrigin) ? options.crossOrigin : null;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.url_ = options.url;
+
+  /**
+   * @private
+   * @type {ol.ImageLoadFunctionType}
+   */
+  this.imageLoadFunction_ = goog.isDef(options.imageLoadFunction) ?
+      options.imageLoadFunction : ol.source.Image.defaultImageLoadFunction;
+
+  /**
+   * @private
+   * @type {Object}
+   */
+  this.params_ = options.params;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.v13_ = true;
+  this.updateV13_();
+
+  /**
+   * @private
+   * @type {ol.source.wms.ServerType|undefined}
+   */
+  this.serverType_ =
+      /** @type {ol.source.wms.ServerType|undefined} */ (options.serverType);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true;
+
+  /**
+   * @private
+   * @type {ol.Image}
+   */
+  this.image_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.imageSize_ = [0, 0];
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.renderedRevision_ = 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.ratio_ = goog.isDef(options.ratio) ? options.ratio : 1.5;
+
+};
+goog.inherits(ol.source.ImageWMS, ol.source.Image);
+
+
+/**
+ * @const
+ * @type {ol.Size}
+ * @private
+ */
+ol.source.ImageWMS.GETFEATUREINFO_IMAGE_SIZE_ = [101, 101];
+
+
+/**
+ * Return the GetFeatureInfo URL for the passed coordinate, resolution, and
+ * projection. Return `undefined` if the GetFeatureInfo URL cannot be
+ * constructed.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} resolution Resolution.
+ * @param {ol.proj.ProjectionLike} projection Projection.
+ * @param {!Object} params GetFeatureInfo params. `INFO_FORMAT` at least should
+ *     be provided. If `QUERY_LAYERS` is not provided then the layers specified
+ *     in the `LAYERS` parameter will be used. `VERSION` should not be
+ *     specified here.
+ * @return {string|undefined} GetFeatureInfo URL.
+ * @api stable
+ */
+ol.source.ImageWMS.prototype.getGetFeatureInfoUrl =
+    function(coordinate, resolution, projection, params) {
+
+  goog.asserts.assert(!('VERSION' in params));
+
+  if (!goog.isDef(this.url_)) {
+    return undefined;
+  }
+
+  var extent = ol.extent.getForViewAndSize(
+      coordinate, resolution, 0,
+      ol.source.ImageWMS.GETFEATUREINFO_IMAGE_SIZE_);
+
+  var baseParams = {
+    'SERVICE': 'WMS',
+    'VERSION': ol.DEFAULT_WMS_VERSION,
+    'REQUEST': 'GetFeatureInfo',
+    'FORMAT': 'image/png',
+    'TRANSPARENT': true,
+    'QUERY_LAYERS': goog.object.get(this.params_, 'LAYERS')
+  };
+  goog.object.extend(baseParams, this.params_, params);
+
+  var x = Math.floor((coordinate[0] - extent[0]) / resolution);
+  var y = Math.floor((extent[3] - coordinate[1]) / resolution);
+  goog.object.set(baseParams, this.v13_ ? 'I' : 'X', x);
+  goog.object.set(baseParams, this.v13_ ? 'J' : 'Y', y);
+
+  return this.getRequestUrl_(
+      extent, ol.source.ImageWMS.GETFEATUREINFO_IMAGE_SIZE_,
+      1, ol.proj.get(projection), baseParams);
+};
+
+
+/**
+ * Get the user-provided params, i.e. those passed to the constructor through
+ * the "params" option, and possibly updated using the updateParams method.
+ * @return {Object} Params.
+ * @api stable
+ */
+ol.source.ImageWMS.prototype.getParams = function() {
+  return this.params_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ImageWMS.prototype.getImage =
+    function(extent, resolution, pixelRatio, projection) {
+
+  if (!goog.isDef(this.url_)) {
+    return null;
+  }
+
+  resolution = this.findNearestResolution(resolution);
+
+  if (pixelRatio != 1 && (!this.hidpi_ || !goog.isDef(this.serverType_))) {
+    pixelRatio = 1;
+  }
+
+  var image = this.image_;
+  if (!goog.isNull(image) &&
+      this.renderedRevision_ == this.getRevision() &&
+      image.getResolution() == resolution &&
+      image.getPixelRatio() == pixelRatio &&
+      ol.extent.containsExtent(image.getExtent(), extent)) {
+    return image;
+  }
+
+  var params = {
+    'SERVICE': 'WMS',
+    'VERSION': ol.DEFAULT_WMS_VERSION,
+    'REQUEST': 'GetMap',
+    'FORMAT': 'image/png',
+    'TRANSPARENT': true
+  };
+  goog.object.extend(params, this.params_);
+
+  extent = extent.slice();
+  var centerX = (extent[0] + extent[2]) / 2;
+  var centerY = (extent[1] + extent[3]) / 2;
+  if (this.ratio_ != 1) {
+    var halfWidth = this.ratio_ * ol.extent.getWidth(extent) / 2;
+    var halfHeight = this.ratio_ * ol.extent.getHeight(extent) / 2;
+    extent[0] = centerX - halfWidth;
+    extent[1] = centerY - halfHeight;
+    extent[2] = centerX + halfWidth;
+    extent[3] = centerY + halfHeight;
+  }
+
+  var imageResolution = resolution / pixelRatio;
+
+  // Compute an integer width and height.
+  var width = Math.ceil(ol.extent.getWidth(extent) / imageResolution);
+  var height = Math.ceil(ol.extent.getHeight(extent) / imageResolution);
+
+  // Modify the extent to match the integer width and height.
+  extent[0] = centerX - imageResolution * width / 2;
+  extent[2] = centerX + imageResolution * width / 2;
+  extent[1] = centerY - imageResolution * height / 2;
+  extent[3] = centerY + imageResolution * height / 2;
+
+  this.imageSize_[0] = width;
+  this.imageSize_[1] = height;
+
+  var url = this.getRequestUrl_(extent, this.imageSize_, pixelRatio,
+      projection, params);
+
+  this.image_ = new ol.Image(extent, resolution, pixelRatio,
+      this.getAttributions(), url, this.crossOrigin_, this.imageLoadFunction_);
+
+  this.renderedRevision_ = this.getRevision();
+
+  return this.image_;
+
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Size} size Size.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @param {Object} params Params.
+ * @return {string} Request URL.
+ * @private
+ */
+ol.source.ImageWMS.prototype.getRequestUrl_ =
+    function(extent, size, pixelRatio, projection, params) {
+
+  goog.asserts.assert(goog.isDef(this.url_));
+
+  params[this.v13_ ? 'CRS' : 'SRS'] = projection.getCode();
+
+  if (!('STYLES' in this.params_)) {
+    /* jshint -W053 */
+    goog.object.set(params, 'STYLES', new String(''));
+    /* jshint +W053 */
+  }
+
+  if (pixelRatio != 1) {
+    switch (this.serverType_) {
+      case ol.source.wms.ServerType.GEOSERVER:
+        var dpi = (90 * pixelRatio + 0.5) | 0;
+        goog.object.set(params, 'FORMAT_OPTIONS', 'dpi:' + dpi);
+        break;
+      case ol.source.wms.ServerType.MAPSERVER:
+        goog.object.set(params, 'MAP_RESOLUTION', 90 * pixelRatio);
+        break;
+      case ol.source.wms.ServerType.CARMENTA_SERVER:
+      case ol.source.wms.ServerType.QGIS:
+        goog.object.set(params, 'DPI', 90 * pixelRatio);
+        break;
+      default:
+        goog.asserts.fail();
+        break;
+    }
+  }
+
+  goog.object.set(params, 'WIDTH', size[0]);
+  goog.object.set(params, 'HEIGHT', size[1]);
+
+  var axisOrientation = projection.getAxisOrientation();
+  var bbox;
+  if (this.v13_ && axisOrientation.substr(0, 2) == 'ne') {
+    bbox = [extent[1], extent[0], extent[3], extent[2]];
+  } else {
+    bbox = extent;
+  }
+  goog.object.set(params, 'BBOX', bbox.join(','));
+
+  return goog.uri.utils.appendParamsFromMap(this.url_, params);
+};
+
+
+/**
+ * Return the URL used for this WMS source.
+ * @return {string|undefined} URL.
+ * @api stable
+ */
+ol.source.ImageWMS.prototype.getUrl = function() {
+  return this.url_;
+};
+
+
+/**
+ * @param {string|undefined} url URL.
+ * @api stable
+ */
+ol.source.ImageWMS.prototype.setUrl = function(url) {
+  if (url != this.url_) {
+    this.url_ = url;
+    this.image_ = null;
+    this.changed();
+  }
+};
+
+
+/**
+ * Update the user-provided params.
+ * @param {Object} params Params.
+ * @api stable
+ */
+ol.source.ImageWMS.prototype.updateParams = function(params) {
+  goog.object.extend(this.params_, params);
+  this.updateV13_();
+  this.image_ = null;
+  this.changed();
+};
+
+
+/**
+ * @private
+ */
+ol.source.ImageWMS.prototype.updateV13_ = function() {
+  var version =
+      goog.object.get(this.params_, 'VERSION', ol.DEFAULT_WMS_VERSION);
+  this.v13_ = goog.string.compareVersions(version, '1.3') >= 0;
+};
diff --git a/src/ol/source/kmlsource.js b/src/ol/source/kmlsource.js
new file mode 100644
index 0000000..13c30f7
--- /dev/null
+++ b/src/ol/source/kmlsource.js
@@ -0,0 +1,38 @@
+goog.provide('ol.source.KML');
+
+goog.require('ol.format.KML');
+goog.require('ol.source.StaticVector');
+
+
+
+/**
+ * @classdesc
+ * Static vector source in KML format
+ *
+ * @constructor
+ * @extends {ol.source.StaticVector}
+ * @fires ol.source.VectorEvent
+ * @param {olx.source.KMLOptions=} opt_options Options.
+ * @api
+ */
+ol.source.KML = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    attributions: options.attributions,
+    doc: options.doc,
+    format: new ol.format.KML({
+      extractStyles: options.extractStyles,
+      defaultStyle: options.defaultStyle
+    }),
+    logo: options.logo,
+    node: options.node,
+    projection: options.projection,
+    text: options.text,
+    url: options.url,
+    urls: options.urls
+  });
+
+};
+goog.inherits(ol.source.KML, ol.source.StaticVector);
diff --git a/src/ol/source/mapquestsource.js b/src/ol/source/mapquestsource.js
new file mode 100644
index 0000000..743bddb
--- /dev/null
+++ b/src/ol/source/mapquestsource.js
@@ -0,0 +1,82 @@
+goog.provide('ol.source.MapQuest');
+
+goog.require('goog.asserts');
+goog.require('ol');
+goog.require('ol.Attribution');
+goog.require('ol.source.OSM');
+goog.require('ol.source.XYZ');
+
+
+
+/**
+ * @classdesc
+ * Layer source for the MapQuest tile server.
+ *
+ * @constructor
+ * @extends {ol.source.XYZ}
+ * @param {olx.source.MapQuestOptions=} opt_options MapQuest options.
+ * @api stable
+ */
+ol.source.MapQuest = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+  goog.asserts.assert(options.layer in ol.source.MapQuestConfig);
+
+  var layerConfig = ol.source.MapQuestConfig[options.layer];
+
+  var protocol = ol.IS_HTTPS ? 'https:' : 'http:';
+  var url = protocol + '//otile{1-4}-s.mqcdn.com/tiles/1.0.0/' +
+      options.layer + '/{z}/{x}/{y}.jpg';
+
+  goog.base(this, {
+    attributions: layerConfig.attributions,
+    crossOrigin: 'anonymous',
+    logo: '//developer.mapquest.com/content/osm/mq_logo.png',
+    maxZoom: layerConfig.maxZoom,
+    opaque: true,
+    tileLoadFunction: options.tileLoadFunction,
+    url: url
+  });
+
+};
+goog.inherits(ol.source.MapQuest, ol.source.XYZ);
+
+
+/**
+ * @const
+ * @type {ol.Attribution}
+ */
+ol.source.MapQuest.TILE_ATTRIBUTION = new ol.Attribution({
+  html: 'Tiles Courtesy of <a href="http://www.mapquest.com/">MapQuest</a>'
+});
+
+
+/**
+ * @type {Object.<string, {maxZoom: number, attributions: (Array.<ol.Attribution>)}>}
+ */
+ol.source.MapQuestConfig = {
+  'osm': {
+    maxZoom: 19,
+    attributions: [
+      ol.source.MapQuest.TILE_ATTRIBUTION,
+      ol.source.OSM.ATTRIBUTION
+    ]
+  },
+  'sat': {
+    maxZoom: 18,
+    attributions: [
+      ol.source.MapQuest.TILE_ATTRIBUTION,
+      new ol.Attribution({
+        html: 'Portions Courtesy NASA/JPL-Caltech and ' +
+            'U.S. Depart. of Agriculture, Farm Service Agency'
+      })
+    ]
+  },
+  'hyb': {
+    maxZoom: 18,
+    attributions: [
+      ol.source.MapQuest.TILE_ATTRIBUTION,
+      ol.source.OSM.ATTRIBUTION
+    ]
+  }
+};
diff --git a/src/ol/source/osmsource.js b/src/ol/source/osmsource.js
new file mode 100644
index 0000000..b100bbb
--- /dev/null
+++ b/src/ol/source/osmsource.js
@@ -0,0 +1,58 @@
+goog.provide('ol.source.OSM');
+
+goog.require('ol');
+goog.require('ol.Attribution');
+goog.require('ol.source.XYZ');
+
+
+
+/**
+ * @classdesc
+ * Layer source for the OpenStreetMap tile server.
+ *
+ * @constructor
+ * @extends {ol.source.XYZ}
+ * @param {olx.source.OSMOptions=} opt_options Open Street Map options.
+ * @api stable
+ */
+ol.source.OSM = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var attributions;
+  if (goog.isDef(options.attributions)) {
+    attributions = options.attributions;
+  } else {
+    attributions = [ol.source.OSM.ATTRIBUTION];
+  }
+
+  var crossOrigin = goog.isDef(options.crossOrigin) ?
+      options.crossOrigin : 'anonymous';
+
+  var protocol = ol.IS_HTTPS ? 'https:' : 'http:';
+  var url = goog.isDef(options.url) ?
+      options.url : protocol + '//{a-c}.tile.openstreetmap.org/{z}/{x}/{y}.png';
+
+  goog.base(this, {
+    attributions: attributions,
+    crossOrigin: crossOrigin,
+    opaque: true,
+    maxZoom: goog.isDef(options.maxZoom) ? options.maxZoom : 19,
+    tileLoadFunction: options.tileLoadFunction,
+    url: url
+  });
+
+};
+goog.inherits(ol.source.OSM, ol.source.XYZ);
+
+
+/**
+ * @const
+ * @type {ol.Attribution}
+ * @api
+ */
+ol.source.OSM.ATTRIBUTION = new ol.Attribution({
+  html: '© ' +
+      '<a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> ' +
+      'contributors.'
+});
diff --git a/src/ol/source/osmxmlsource.js b/src/ol/source/osmxmlsource.js
new file mode 100644
index 0000000..d1ba44f
--- /dev/null
+++ b/src/ol/source/osmxmlsource.js
@@ -0,0 +1,35 @@
+goog.provide('ol.source.OSMXML');
+
+goog.require('ol.format.OSMXML');
+goog.require('ol.source.StaticVector');
+
+
+
+/**
+ * @classdesc
+ * Static vector source in OSMXML format
+ *
+ * @constructor
+ * @extends {ol.source.StaticVector}
+ * @fires ol.source.VectorEvent
+ * @param {olx.source.OSMXMLOptions=} opt_options Options.
+ * @api
+ */
+ol.source.OSMXML = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    attributions: options.attributions,
+    doc: options.doc,
+    format: new ol.format.OSMXML(),
+    logo: options.logo,
+    node: options.node,
+    projection: options.projection,
+    text: options.text,
+    url: options.url,
+    urls: options.urls
+  });
+
+};
+goog.inherits(ol.source.OSMXML, ol.source.StaticVector);
diff --git a/src/ol/source/servervectorsource.js b/src/ol/source/servervectorsource.js
new file mode 100644
index 0000000..d9b988b
--- /dev/null
+++ b/src/ol/source/servervectorsource.js
@@ -0,0 +1,125 @@
+// FIXME cache expiration
+
+goog.provide('ol.source.ServerVector');
+
+goog.require('goog.object');
+goog.require('ol.extent');
+goog.require('ol.loadingstrategy');
+goog.require('ol.source.FormatVector');
+goog.require('ol.structs.RBush');
+
+
+
+/**
+ * @classdesc
+ * A vector source in one of the supported formats, using a custom function to
+ * read in the data from a remote server.
+ *
+ * @constructor
+ * @extends {ol.source.FormatVector}
+ * @param {olx.source.ServerVectorOptions} options Options.
+ * @api
+ */
+ol.source.ServerVector = function(options) {
+
+  goog.base(this, {
+    attributions: options.attributions,
+    format: options.format,
+    logo: options.logo,
+    projection: options.projection
+  });
+
+  /**
+   * @private
+   * @type {ol.structs.RBush.<{extent: ol.Extent}>}
+   */
+  this.loadedExtents_ = new ol.structs.RBush();
+
+  /**
+   * @private
+   * @type {function(this: ol.source.ServerVector, ol.Extent, number,
+   *                 ol.proj.Projection)}
+   */
+  this.loader_ = options.loader;
+
+  /**
+   * @private
+   * @type {function(ol.Extent, number): Array.<ol.Extent>}
+   */
+  this.strategy_ = goog.isDef(options.strategy) ?
+      options.strategy : ol.loadingstrategy.bbox;
+
+  /**
+   * @private
+   * @type {Object.<number|string, boolean>}
+   */
+  this.loadedFeatures_ = {};
+
+};
+goog.inherits(ol.source.ServerVector, ol.source.FormatVector);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ServerVector.prototype.addFeaturesInternal = function(features) {
+  /** @type {Array.<ol.Feature>} */
+  var notLoadedFeatures = [];
+  var i, ii;
+  for (i = 0, ii = features.length; i < ii; ++i) {
+    var feature = features[i];
+    var featureId = feature.getId();
+    if (!goog.isDef(featureId)) {
+      notLoadedFeatures.push(feature);
+    } else if (!(featureId in this.loadedFeatures_)) {
+      notLoadedFeatures.push(feature);
+      this.loadedFeatures_[featureId] = true;
+    }
+  }
+  goog.base(this, 'addFeaturesInternal', notLoadedFeatures);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ServerVector.prototype.clear = function() {
+  goog.object.clear(this.loadedFeatures_);
+  this.loadedExtents_.clear();
+  goog.base(this, 'clear');
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ServerVector.prototype.loadFeatures =
+    function(extent, resolution, projection) {
+  var loadedExtents = this.loadedExtents_;
+  var extentsToLoad = this.strategy_(extent, resolution);
+  var i, ii;
+  for (i = 0, ii = extentsToLoad.length; i < ii; ++i) {
+    var extentToLoad = extentsToLoad[i];
+    var alreadyLoaded = loadedExtents.forEachInExtent(extentToLoad,
+        /**
+         * @param {{extent: ol.Extent}} object Object.
+         * @return {boolean} Contains.
+         */
+        function(object) {
+          return ol.extent.containsExtent(object.extent, extentToLoad);
+        });
+    if (!alreadyLoaded) {
+      this.loader_.call(this, extentToLoad, resolution, projection);
+      loadedExtents.insert(extentToLoad, {extent: extentToLoad.slice()});
+    }
+  }
+};
+
+
+/**
+ * @function
+ * @param {ArrayBuffer|Document|Node|Object|string} source Source.
+ * @return {Array.<ol.Feature>} Features.
+ * @api
+ */
+ol.source.ServerVector.prototype.readFeatures;
diff --git a/src/ol/source/source.js b/src/ol/source/source.js
new file mode 100644
index 0000000..ea2c84c
--- /dev/null
+++ b/src/ol/source/source.js
@@ -0,0 +1,165 @@
+goog.provide('ol.source.Source');
+goog.provide('ol.source.State');
+
+goog.require('goog.events.EventType');
+goog.require('ol.Attribution');
+goog.require('ol.Observable');
+goog.require('ol.proj');
+
+
+/**
+ * State of the source, one of 'undefined', 'loading', 'ready' or 'error'.
+ * @enum {string}
+ * @api
+ */
+ol.source.State = {
+  UNDEFINED: 'undefined',
+  LOADING: 'loading',
+  READY: 'ready',
+  ERROR: 'error'
+};
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *            logo: (string|olx.LogoOptions|undefined),
+ *            projection: ol.proj.ProjectionLike,
+ *            state: (ol.source.State|undefined)}}
+ */
+ol.source.SourceOptions;
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for {@link ol.layer.Layer} sources.
+ *
+ * @constructor
+ * @extends {ol.Observable}
+ * @fires change Triggered when the state of the source changes.
+ * @param {ol.source.SourceOptions} options Source options.
+ * @api stable
+ */
+ol.source.Source = function(options) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {ol.proj.Projection}
+   */
+  this.projection_ = ol.proj.get(options.projection);
+
+  /**
+   * @private
+   * @type {Array.<ol.Attribution>}
+   */
+  this.attributions_ = goog.isDef(options.attributions) ?
+      options.attributions : null;
+
+  /**
+   * @private
+   * @type {string|olx.LogoOptions|undefined}
+   */
+  this.logo_ = options.logo;
+
+  /**
+   * @private
+   * @type {ol.source.State}
+   */
+  this.state_ = goog.isDef(options.state) ?
+      options.state : ol.source.State.READY;
+
+};
+goog.inherits(ol.source.Source, ol.Observable);
+
+
+/**
+ * @param {number} resolution Resolution.
+ * @param {number} rotation Rotation.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {Object.<string, boolean>} skippedFeatureUids Skipped feature uids.
+ * @param {function(ol.Feature): T} callback Feature callback.
+ * @return {T|undefined} Callback result.
+ * @template T
+ */
+ol.source.Source.prototype.forEachFeatureAtPixel =
+    goog.nullFunction;
+
+
+/**
+ * @return {Array.<ol.Attribution>} Attributions.
+ * @api stable
+ */
+ol.source.Source.prototype.getAttributions = function() {
+  return this.attributions_;
+};
+
+
+/**
+ * @return {string|olx.LogoOptions|undefined} Logo.
+ * @api stable
+ */
+ol.source.Source.prototype.getLogo = function() {
+  return this.logo_;
+};
+
+
+/**
+ * @return {ol.proj.Projection} Projection.
+ * @api
+ */
+ol.source.Source.prototype.getProjection = function() {
+  return this.projection_;
+};
+
+
+/**
+ * @return {Array.<number>|undefined} Resolutions.
+ */
+ol.source.Source.prototype.getResolutions = goog.abstractMethod;
+
+
+/**
+ * @return {ol.source.State} State.
+ * @api
+ */
+ol.source.Source.prototype.getState = function() {
+  return this.state_;
+};
+
+
+/**
+ * @param {Array.<ol.Attribution>} attributions Attributions.
+ */
+ol.source.Source.prototype.setAttributions = function(attributions) {
+  this.attributions_ = attributions;
+};
+
+
+/**
+ * @param {string|olx.LogoOptions|undefined} logo Logo.
+ */
+ol.source.Source.prototype.setLogo = function(logo) {
+  this.logo_ = logo;
+};
+
+
+/**
+ * @param {ol.source.State} state State.
+ * @protected
+ */
+ol.source.Source.prototype.setState = function(state) {
+  this.state_ = state;
+  this.changed();
+};
+
+
+/**
+ * @param {ol.proj.Projection} projection Projetion.
+ */
+ol.source.Source.prototype.setProjection = function(projection) {
+  this.projection_ = projection;
+};
diff --git a/src/ol/source/stamensource.js b/src/ol/source/stamensource.js
new file mode 100644
index 0000000..2980756
--- /dev/null
+++ b/src/ol/source/stamensource.js
@@ -0,0 +1,132 @@
+goog.provide('ol.source.Stamen');
+
+goog.require('goog.asserts');
+goog.require('ol');
+goog.require('ol.Attribution');
+goog.require('ol.source.OSM');
+goog.require('ol.source.XYZ');
+
+
+/**
+ * @type {Object.<string, {extension: string, opaque: boolean}>}
+ */
+ol.source.StamenLayerConfig = {
+  'terrain': {
+    extension: 'jpg',
+    opaque: true
+  },
+  'terrain-background': {
+    extension: 'jpg',
+    opaque: true
+  },
+  'terrain-labels': {
+    extension: 'png',
+    opaque: false
+  },
+  'terrain-lines': {
+    extension: 'png',
+    opaque: false
+  },
+  'toner-background': {
+    extension: 'png',
+    opaque: true
+  },
+  'toner': {
+    extension: 'png',
+    opaque: true
+  },
+  'toner-hybrid': {
+    extension: 'png',
+    opaque: false
+  },
+  'toner-labels': {
+    extension: 'png',
+    opaque: false
+  },
+  'toner-lines': {
+    extension: 'png',
+    opaque: false
+  },
+  'toner-lite': {
+    extension: 'png',
+    opaque: true
+  },
+  'watercolor': {
+    extension: 'jpg',
+    opaque: true
+  }
+};
+
+
+/**
+ * @type {Object.<string, {minZoom: number, maxZoom: number}>}
+ */
+ol.source.StamenProviderConfig = {
+  'terrain': {
+    minZoom: 4,
+    maxZoom: 18
+  },
+  'toner': {
+    minZoom: 0,
+    maxZoom: 20
+  },
+  'watercolor': {
+    minZoom: 3,
+    maxZoom: 16
+  }
+};
+
+
+
+/**
+ * @classdesc
+ * Layer source for the Stamen tile server.
+ *
+ * @constructor
+ * @extends {ol.source.XYZ}
+ * @param {olx.source.StamenOptions} options Stamen options.
+ * @api stable
+ */
+ol.source.Stamen = function(options) {
+
+  var i = options.layer.indexOf('-');
+  var provider = i == -1 ? options.layer : options.layer.slice(0, i);
+  goog.asserts.assert(provider in ol.source.StamenProviderConfig);
+  var providerConfig = ol.source.StamenProviderConfig[provider];
+
+  goog.asserts.assert(options.layer in ol.source.StamenLayerConfig);
+  var layerConfig = ol.source.StamenLayerConfig[options.layer];
+
+  var root = ol.IS_HTTPS ? 'https://stamen-tiles-{a-d}.a.ssl.fastly.net/' :
+      'http://{a-d}.tile.stamen.com/';
+  var url = goog.isDef(options.url) ? options.url :
+      root + options.layer + '/{z}/{x}/{y}.' +
+      layerConfig.extension;
+
+  goog.base(this, {
+    attributions: ol.source.Stamen.ATTRIBUTIONS,
+    crossOrigin: 'anonymous',
+    maxZoom: providerConfig.maxZoom,
+    // FIXME uncomment the following when tilegrid supports minZoom
+    //minZoom: providerConfig.minZoom,
+    opaque: layerConfig.opaque,
+    tileLoadFunction: options.tileLoadFunction,
+    url: url
+  });
+
+};
+goog.inherits(ol.source.Stamen, ol.source.XYZ);
+
+
+/**
+ * @const
+ * @type {Array.<ol.Attribution>}
+ */
+ol.source.Stamen.ATTRIBUTIONS = [
+  new ol.Attribution({
+    html: 'Map tiles by <a href="http://stamen.com/">Stamen Design</a>, ' +
+        'under <a href="http://creativecommons.org/licenses/by/3.0/">CC BY' +
+        ' 3.0</a>.'
+  }),
+  ol.source.OSM.ATTRIBUTION
+];
diff --git a/src/ol/source/staticvectorsource.js b/src/ol/source/staticvectorsource.js
new file mode 100644
index 0000000..30b5e33
--- /dev/null
+++ b/src/ol/source/staticvectorsource.js
@@ -0,0 +1,83 @@
+goog.provide('ol.source.StaticVector');
+
+goog.require('ol.source.FormatVector');
+goog.require('ol.source.State');
+
+
+
+/**
+ * @classdesc
+ * A vector source that uses one of the supported formats to read the data from
+ * a file or other static source.
+ *
+ * @constructor
+ * @extends {ol.source.FormatVector}
+ * @fires ol.source.VectorEvent
+ * @param {olx.source.StaticVectorOptions} options Options.
+ * @api
+ */
+ol.source.StaticVector = function(options) {
+
+  goog.base(this, {
+    attributions: options.attributions,
+    format: options.format,
+    logo: options.logo,
+    projection: options.projection
+  });
+
+  if (goog.isDef(options.arrayBuffer)) {
+    this.addFeaturesInternal(this.readFeatures(options.arrayBuffer));
+  }
+
+  if (goog.isDef(options.doc)) {
+    this.addFeaturesInternal(this.readFeatures(options.doc));
+  }
+
+  if (goog.isDef(options.node)) {
+    this.addFeaturesInternal(this.readFeatures(options.node));
+  }
+
+  if (goog.isDef(options.object)) {
+    this.addFeaturesInternal(this.readFeatures(options.object));
+  }
+
+  if (goog.isDef(options.text)) {
+    this.addFeaturesInternal(this.readFeatures(options.text));
+  }
+
+  if (goog.isDef(options.url) || goog.isDef(options.urls)) {
+    this.setState(ol.source.State.LOADING);
+    if (goog.isDef(options.url)) {
+      this.loadFeaturesFromURL(options.url,
+          this.onFeaturesLoadedSuccess_, this.onFeaturesLoadedError_, this);
+    }
+    if (goog.isDef(options.urls)) {
+      var urls = options.urls;
+      var i, ii;
+      for (i = 0, ii = urls.length; i < ii; ++i) {
+        this.loadFeaturesFromURL(urls[i],
+            this.onFeaturesLoadedSuccess_, this.onFeaturesLoadedError_, this);
+      }
+    }
+  }
+
+};
+goog.inherits(ol.source.StaticVector, ol.source.FormatVector);
+
+
+/**
+ * @private
+ */
+ol.source.StaticVector.prototype.onFeaturesLoadedError_ = function() {
+  this.setState(ol.source.State.ERROR);
+};
+
+
+/**
+ * @param {Array.<ol.Feature>} features Features.
+ * @private
+ */
+ol.source.StaticVector.prototype.onFeaturesLoadedSuccess_ = function(features) {
+  this.addFeaturesInternal(features);
+  this.setState(ol.source.State.READY);
+};
diff --git a/src/ol/source/tiledebugsource.js b/src/ol/source/tiledebugsource.js
new file mode 100644
index 0000000..79d05fc
--- /dev/null
+++ b/src/ol/source/tiledebugsource.js
@@ -0,0 +1,130 @@
+goog.provide('ol.source.TileDebug');
+
+goog.require('ol.Tile');
+goog.require('ol.TileCache');
+goog.require('ol.TileCoord');
+goog.require('ol.TileState');
+goog.require('ol.dom');
+goog.require('ol.source.Tile');
+goog.require('ol.tilecoord');
+goog.require('ol.tilegrid.TileGrid');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.Tile}
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
+ * @private
+ */
+ol.DebugTile_ = function(tileCoord, tileGrid) {
+
+  goog.base(this, tileCoord, ol.TileState.LOADED);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.tileSize_ = tileGrid.getTileSize(tileCoord[0]);
+
+  /**
+   * @private
+   * @type {Object.<number, HTMLCanvasElement>}
+   */
+  this.canvasByContext_ = {};
+
+};
+goog.inherits(ol.DebugTile_, ol.Tile);
+
+
+/**
+ * @inheritDoc
+ */
+ol.DebugTile_.prototype.getImage = function(opt_context) {
+  var key = goog.isDef(opt_context) ? goog.getUid(opt_context) : -1;
+  if (key in this.canvasByContext_) {
+    return this.canvasByContext_[key];
+  } else {
+
+    var tileSize = this.tileSize_;
+    var context = ol.dom.createCanvasContext2D(tileSize, tileSize);
+
+    context.strokeStyle = 'black';
+    context.strokeRect(0.5, 0.5, tileSize + 0.5, tileSize + 0.5);
+
+    context.fillStyle = 'black';
+    context.textAlign = 'center';
+    context.textBaseline = 'middle';
+    context.font = '24px sans-serif';
+    context.fillText(ol.tilecoord.toString(this.tileCoord),
+        tileSize / 2, tileSize / 2);
+
+    this.canvasByContext_[key] = context.canvas;
+    return context.canvas;
+
+  }
+};
+
+
+
+/**
+ * @classdesc
+ * A pseudo tile source, which does not fetch tiles from a server, but renders
+ * a grid outline for the tile grid/projection along with the coordinates for
+ * each tile. See examples/canvas-tiles for an example.
+ *
+ * Uses Canvas context2d, so requires Canvas support.
+ *
+ * @constructor
+ * @extends {ol.source.Tile}
+ * @param {olx.source.TileDebugOptions} options Debug tile options.
+ * @api
+ */
+ol.source.TileDebug = function(options) {
+
+  goog.base(this, {
+    opaque: false,
+    projection: options.projection,
+    tileGrid: options.tileGrid
+  });
+
+  /**
+   * @private
+   * @type {ol.TileCache}
+   */
+  this.tileCache_ = new ol.TileCache();
+
+};
+goog.inherits(ol.source.TileDebug, ol.source.Tile);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileDebug.prototype.canExpireCache = function() {
+  return this.tileCache_.canExpireCache();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileDebug.prototype.expireCache = function(usedTiles) {
+  this.tileCache_.expireCache(usedTiles);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileDebug.prototype.getTile = function(z, x, y) {
+  var tileCoordKey = this.getKeyZXY(z, x, y);
+  if (this.tileCache_.containsKey(tileCoordKey)) {
+    return /** @type {!ol.DebugTile_} */ (this.tileCache_.get(tileCoordKey));
+  } else {
+    var tile = new ol.DebugTile_([z, x, y], this.tileGrid);
+    this.tileCache_.set(tileCoordKey, tile);
+    return tile;
+  }
+};
diff --git a/src/ol/source/tileimagesource.js b/src/ol/source/tileimagesource.js
new file mode 100644
index 0000000..600eb69
--- /dev/null
+++ b/src/ol/source/tileimagesource.js
@@ -0,0 +1,178 @@
+goog.provide('ol.source.TileImage');
+
+goog.require('goog.asserts');
+goog.require('ol.ImageTile');
+goog.require('ol.TileCache');
+goog.require('ol.TileCoord');
+goog.require('ol.TileLoadFunctionType');
+goog.require('ol.TileState');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.TileUrlFunctionType');
+goog.require('ol.source.Tile');
+
+
+
+/**
+ * @classdesc
+ * Base class for sources providing images divided into a tile grid.
+ *
+ * @constructor
+ * @extends {ol.source.Tile}
+ * @param {olx.source.TileImageOptions} options Image tile options.
+ * @api
+ */
+ol.source.TileImage = function(options) {
+
+  goog.base(this, {
+    attributions: options.attributions,
+    extent: options.extent,
+    logo: options.logo,
+    opaque: options.opaque,
+    projection: options.projection,
+    state: goog.isDef(options.state) ?
+        /** @type {ol.source.State} */ (options.state) : undefined,
+    tileGrid: options.tileGrid,
+    tilePixelRatio: options.tilePixelRatio
+  });
+
+  /**
+   * @protected
+   * @type {ol.TileUrlFunctionType}
+   */
+  this.tileUrlFunction = goog.isDef(options.tileUrlFunction) ?
+      options.tileUrlFunction :
+      ol.TileUrlFunction.nullTileUrlFunction;
+
+  /**
+   * @protected
+   * @type {?string}
+   */
+  this.crossOrigin =
+      goog.isDef(options.crossOrigin) ? options.crossOrigin : null;
+
+  /**
+   * @protected
+   * @type {ol.TileCache}
+   */
+  this.tileCache = new ol.TileCache();
+
+  /**
+   * @protected
+   * @type {ol.TileLoadFunctionType}
+   */
+  this.tileLoadFunction = goog.isDef(options.tileLoadFunction) ?
+      options.tileLoadFunction : ol.source.TileImage.defaultTileLoadFunction;
+
+  /**
+   * @protected
+   * @type {function(new: ol.ImageTile, ol.TileCoord, ol.TileState, string,
+   *        ?string, ol.TileLoadFunctionType)}
+   */
+  this.tileClass = goog.isDef(options.tileClass) ?
+      options.tileClass : ol.ImageTile;
+
+};
+goog.inherits(ol.source.TileImage, ol.source.Tile);
+
+
+/**
+ * @param {ol.ImageTile} imageTile Image tile.
+ * @param {string} src Source.
+ */
+ol.source.TileImage.defaultTileLoadFunction = function(imageTile, src) {
+  imageTile.getImage().src = src;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileImage.prototype.canExpireCache = function() {
+  return this.tileCache.canExpireCache();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileImage.prototype.expireCache = function(usedTiles) {
+  this.tileCache.expireCache(usedTiles);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileImage.prototype.getTile =
+    function(z, x, y, pixelRatio, projection) {
+  var tileCoordKey = this.getKeyZXY(z, x, y);
+  if (this.tileCache.containsKey(tileCoordKey)) {
+    return /** @type {!ol.Tile} */ (this.tileCache.get(tileCoordKey));
+  } else {
+    goog.asserts.assert(projection);
+    var tileCoord = [z, x, y];
+    var tileUrl = this.tileUrlFunction(tileCoord, pixelRatio, projection);
+    var tile = new this.tileClass(
+        tileCoord,
+        goog.isDef(tileUrl) ? ol.TileState.IDLE : ol.TileState.EMPTY,
+        goog.isDef(tileUrl) ? tileUrl : '',
+        this.crossOrigin,
+        this.tileLoadFunction);
+    this.tileCache.set(tileCoordKey, tile);
+    return tile;
+  }
+};
+
+
+/**
+ * @return {ol.TileLoadFunctionType} TileLoadFunction
+ * @api
+ */
+ol.source.TileImage.prototype.getTileLoadFunction = function() {
+  return this.tileLoadFunction;
+};
+
+
+/**
+ * @return {ol.TileUrlFunctionType} TileUrlFunction
+ * @api
+ */
+ol.source.TileImage.prototype.getTileUrlFunction = function() {
+  return this.tileUrlFunction;
+};
+
+
+/**
+ * @param {ol.TileLoadFunctionType} tileLoadFunction Tile load function.
+ * @api
+ */
+ol.source.TileImage.prototype.setTileLoadFunction = function(tileLoadFunction) {
+  this.tileCache.clear();
+  this.tileLoadFunction = tileLoadFunction;
+  this.changed();
+};
+
+
+/**
+ * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function.
+ * @api
+ */
+ol.source.TileImage.prototype.setTileUrlFunction = function(tileUrlFunction) {
+  // FIXME It should be possible to be more intelligent and avoid clearing the
+  // FIXME cache.  The tile URL function would need to be incorporated into the
+  // FIXME cache key somehow.
+  this.tileCache.clear();
+  this.tileUrlFunction = tileUrlFunction;
+  this.changed();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileImage.prototype.useTile = function(z, x, y) {
+  var tileCoordKey = this.getKeyZXY(z, x, y);
+  if (this.tileCache.containsKey(tileCoordKey)) {
+    this.tileCache.get(tileCoordKey);
+  }
+};
diff --git a/src/ol/source/tilejsonsource.js b/src/ol/source/tilejsonsource.js
new file mode 100644
index 0000000..92982e1
--- /dev/null
+++ b/src/ol/source/tilejsonsource.js
@@ -0,0 +1,111 @@
+// FIXME add some error checking
+// FIXME check order of async callbacks
+
+/**
+ * @see http://mapbox.com/developers/api/
+ */
+
+goog.provide('ol.source.TileJSON');
+goog.provide('ol.tilejson');
+
+goog.require('goog.asserts');
+goog.require('goog.net.Jsonp');
+goog.require('ol.Attribution');
+goog.require('ol.TileRange');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.extent');
+goog.require('ol.proj');
+goog.require('ol.source.State');
+goog.require('ol.source.TileImage');
+goog.require('ol.tilegrid.XYZ');
+
+
+
+/**
+ * @classdesc
+ * Layer source for tile data in TileJSON format.
+ *
+ * @constructor
+ * @extends {ol.source.TileImage}
+ * @param {olx.source.TileJSONOptions} options TileJSON options.
+ * @api stable
+ */
+ol.source.TileJSON = function(options) {
+
+  goog.base(this, {
+    crossOrigin: options.crossOrigin,
+    projection: ol.proj.get('EPSG:3857'),
+    state: ol.source.State.LOADING,
+    tileLoadFunction: options.tileLoadFunction
+  });
+
+  /**
+   * @type {boolean|undefined}
+   * @private
+   */
+  this.wrapX_ = options.wrapX;
+
+  var request = new goog.net.Jsonp(options.url);
+  request.send(undefined, goog.bind(this.handleTileJSONResponse, this));
+
+};
+goog.inherits(ol.source.TileJSON, ol.source.TileImage);
+
+
+/**
+ * @protected
+ * @param {TileJSON} tileJSON Tile JSON.
+ */
+ol.source.TileJSON.prototype.handleTileJSONResponse = function(tileJSON) {
+
+  var epsg4326Projection = ol.proj.get('EPSG:4326');
+
+  var sourceProjection = this.getProjection();
+  var extent;
+  if (goog.isDef(tileJSON.bounds)) {
+    var transform = ol.proj.getTransformFromProjections(
+        epsg4326Projection, sourceProjection);
+    extent = ol.extent.applyTransform(tileJSON.bounds, transform);
+  }
+
+  if (goog.isDef(tileJSON.scheme)) {
+    goog.asserts.assert(tileJSON.scheme == 'xyz');
+  }
+  var minZoom = tileJSON.minzoom || 0;
+  var maxZoom = tileJSON.maxzoom || 22;
+  var tileGrid = new ol.tilegrid.XYZ({
+    extent: ol.tilegrid.extentFromProjection(sourceProjection),
+    maxZoom: maxZoom,
+    minZoom: minZoom
+  });
+  this.tileGrid = tileGrid;
+
+  this.tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(
+      tileGrid.createTileCoordTransform({
+        extent: extent,
+        wrapX: this.wrapX_
+      }),
+      ol.TileUrlFunction.createFromTemplates(tileJSON.tiles));
+
+  if (goog.isDef(tileJSON.attribution)) {
+    var attributionExtent = goog.isDef(extent) ?
+        extent : epsg4326Projection.getExtent();
+    /** @type {Object.<string, Array.<ol.TileRange>>} */
+    var tileRanges = {};
+    var z, zKey;
+    for (z = minZoom; z <= maxZoom; ++z) {
+      zKey = z.toString();
+      tileRanges[zKey] =
+          [tileGrid.getTileRangeForExtentAndZ(attributionExtent, z)];
+    }
+    this.setAttributions([
+      new ol.Attribution({
+        html: tileJSON.attribution,
+        tileRanges: tileRanges
+      })
+    ]);
+  }
+
+  this.setState(ol.source.State.READY);
+
+};
diff --git a/src/ol/source/tilesource.js b/src/ol/source/tilesource.js
new file mode 100644
index 0000000..3457b4c
--- /dev/null
+++ b/src/ol/source/tilesource.js
@@ -0,0 +1,208 @@
+goog.provide('ol.source.Tile');
+goog.provide('ol.source.TileOptions');
+
+goog.require('goog.functions');
+goog.require('ol.Attribution');
+goog.require('ol.Extent');
+goog.require('ol.TileRange');
+goog.require('ol.source.Source');
+goog.require('ol.tilecoord');
+goog.require('ol.tilegrid.TileGrid');
+
+
+/**
+ * @typedef {{attributions: (Array.<ol.Attribution>|undefined),
+ *            extent: (ol.Extent|undefined),
+ *            logo: (string|olx.LogoOptions|undefined),
+ *            opaque: (boolean|undefined),
+ *            tilePixelRatio: (number|undefined),
+ *            projection: ol.proj.ProjectionLike,
+ *            state: (ol.source.State|undefined),
+ *            tileGrid: (ol.tilegrid.TileGrid|undefined)}}
+ */
+ol.source.TileOptions;
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; normally only used for creating subclasses and not
+ * instantiated in apps.
+ * Base class for sources providing images divided into a tile grid.
+ *
+ * @constructor
+ * @extends {ol.source.Source}
+ * @param {ol.source.TileOptions} options Tile source options.
+ * @api
+ */
+ol.source.Tile = function(options) {
+
+  goog.base(this, {
+    attributions: options.attributions,
+    extent: options.extent,
+    logo: options.logo,
+    projection: options.projection,
+    state: options.state
+  });
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.opaque_ = goog.isDef(options.opaque) ? options.opaque : false;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.tilePixelRatio_ = goog.isDef(options.tilePixelRatio) ?
+      options.tilePixelRatio : 1;
+
+  /**
+   * @protected
+   * @type {ol.tilegrid.TileGrid}
+   */
+  this.tileGrid = goog.isDef(options.tileGrid) ? options.tileGrid : null;
+
+};
+goog.inherits(ol.source.Tile, ol.source.Source);
+
+
+/**
+ * @return {boolean} Can expire cache.
+ */
+ol.source.Tile.prototype.canExpireCache = goog.functions.FALSE;
+
+
+/**
+ * @param {Object.<string, ol.TileRange>} usedTiles Used tiles.
+ */
+ol.source.Tile.prototype.expireCache = goog.abstractMethod;
+
+
+/**
+ * Look for loaded tiles over a given tile range and zoom level.  Adds
+ * properties to the provided lookup representing key/tile pairs for already
+ * loaded tiles.
+ *
+ * @param {Object.<number, Object.<string, ol.Tile>>} loadedTilesByZ A lookup of
+ *     loaded tiles by zoom level.
+ * @param {function(number, number, number): ol.Tile} getTileIfLoaded A function
+ *     that returns the tile only if it is fully loaded.
+ * @param {number} z Zoom level.
+ * @param {ol.TileRange} tileRange Tile range.
+ * @return {boolean} The tile range is fully covered with loaded tiles.
+ */
+ol.source.Tile.prototype.findLoadedTiles = function(loadedTilesByZ,
+    getTileIfLoaded, z, tileRange) {
+  // FIXME this could be more efficient about filling partial holes
+  var fullyCovered = true;
+  var tile, tileCoordKey, x, y;
+  for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
+    for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
+      tileCoordKey = this.getKeyZXY(z, x, y);
+      if (loadedTilesByZ[z] && loadedTilesByZ[z][tileCoordKey]) {
+        continue;
+      }
+      tile = getTileIfLoaded(z, x, y);
+      if (!goog.isNull(tile)) {
+        if (!loadedTilesByZ[z]) {
+          loadedTilesByZ[z] = {};
+        }
+        loadedTilesByZ[z][tileCoordKey] = tile;
+      } else {
+        fullyCovered = false;
+      }
+    }
+  }
+  return fullyCovered;
+};
+
+
+/**
+ * @return {number} Gutter.
+ */
+ol.source.Tile.prototype.getGutter = function() {
+  return 0;
+};
+
+
+/**
+ * @param {number} z Z.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @return {string} Key.
+ * @protected
+ */
+ol.source.Tile.prototype.getKeyZXY = ol.tilecoord.getKeyZXY;
+
+
+/**
+ * @return {boolean} Opaque.
+ */
+ol.source.Tile.prototype.getOpaque = function() {
+  return this.opaque_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.Tile.prototype.getResolutions = function() {
+  return this.tileGrid.getResolutions();
+};
+
+
+/**
+ * @param {number} z Tile coordinate z.
+ * @param {number} x Tile coordinate x.
+ * @param {number} y Tile coordinate y.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection=} opt_projection Projection.
+ * @return {!ol.Tile} Tile.
+ */
+ol.source.Tile.prototype.getTile = goog.abstractMethod;
+
+
+/**
+ * @return {ol.tilegrid.TileGrid} Tile grid.
+ * @api stable
+ */
+ol.source.Tile.prototype.getTileGrid = function() {
+  return this.tileGrid;
+};
+
+
+/**
+ * @param {ol.proj.Projection} projection Projection.
+ * @return {ol.tilegrid.TileGrid} Tile grid.
+ */
+ol.source.Tile.prototype.getTileGridForProjection = function(projection) {
+  if (goog.isNull(this.tileGrid)) {
+    return ol.tilegrid.getForProjection(projection);
+  } else {
+    return this.tileGrid;
+  }
+};
+
+
+/**
+ * @param {number} z Z.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @return {number} Tile size.
+ */
+ol.source.Tile.prototype.getTilePixelSize =
+    function(z, pixelRatio, projection) {
+  var tileGrid = this.getTileGridForProjection(projection);
+  return tileGrid.getTileSize(z) * this.tilePixelRatio_;
+};
+
+
+/**
+ * Marks a tile coord as being used, without triggering a load.
+ * @param {number} z Tile coordinate z.
+ * @param {number} x Tile coordinate x.
+ * @param {number} y Tile coordinate y.
+ */
+ol.source.Tile.prototype.useTile = goog.nullFunction;
diff --git a/src/ol/source/tileutfgridsource.js b/src/ol/source/tileutfgridsource.js
new file mode 100644
index 0000000..4a58b2b
--- /dev/null
+++ b/src/ol/source/tileutfgridsource.js
@@ -0,0 +1,406 @@
+goog.provide('ol.source.TileUTFGrid');
+
+goog.require('goog.asserts');
+goog.require('goog.async.nextTick');
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('goog.net.Jsonp');
+goog.require('ol.Attribution');
+goog.require('ol.Tile');
+goog.require('ol.TileCache');
+goog.require('ol.TileState');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.extent');
+goog.require('ol.proj');
+goog.require('ol.source.State');
+goog.require('ol.source.Tile');
+goog.require('ol.tilegrid.XYZ');
+
+
+
+/**
+ * @classdesc
+ * Layer source for UTFGrid interaction data loaded from TileJSON format.
+ *
+ * @constructor
+ * @extends {ol.source.Tile}
+ * @param {olx.source.TileUTFGridOptions} options Source options.
+ * @api
+ */
+ol.source.TileUTFGrid = function(options) {
+  goog.base(this, {
+    projection: ol.proj.get('EPSG:3857'),
+    state: ol.source.State.LOADING
+  });
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.preemptive_ = goog.isDef(options.preemptive) ?
+      options.preemptive : true;
+
+  /**
+   * @private
+   * @type {!ol.TileUrlFunctionType}
+   */
+  this.tileUrlFunction_ = ol.TileUrlFunction.nullTileUrlFunction;
+
+  /**
+   * @private
+   * @type {!ol.TileCache}
+   */
+  this.tileCache_ = new ol.TileCache();
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.template_ = undefined;
+
+  var request = new goog.net.Jsonp(options.url);
+  request.send(undefined, goog.bind(this.handleTileJSONResponse, this));
+};
+goog.inherits(ol.source.TileUTFGrid, ol.source.Tile);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileUTFGrid.prototype.canExpireCache = function() {
+  return this.tileCache_.canExpireCache();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileUTFGrid.prototype.expireCache = function(usedTiles) {
+  this.tileCache_.expireCache(usedTiles);
+};
+
+
+/**
+ * @return {string|undefined} The template from TileJSON.
+ * @api
+ */
+ol.source.TileUTFGrid.prototype.getTemplate = function() {
+  return this.template_;
+};
+
+
+/**
+ * Calls the callback (synchronously by default) with the available data
+ * for given coordinate and resolution (or `null` if not yet loaded or
+ * in case of an error).
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} resolution Resolution.
+ * @param {function(this: T, Object)} callback Callback.
+ * @param {T=} opt_this The object to use as `this` in the callback.
+ * @param {boolean=} opt_request If `true` the callback is always async.
+ *                               The tile data is requested if not yet loaded.
+ * @template T
+ * @api
+ */
+ol.source.TileUTFGrid.prototype.forDataAtCoordinateAndResolution = function(
+    coordinate, resolution, callback, opt_this, opt_request) {
+  if (!goog.isNull(this.tileGrid)) {
+    var tileCoord = this.tileGrid.getTileCoordForCoordAndResolution(
+        coordinate, resolution);
+    var tile = /** @type {!ol.source.TileUTFGridTile_} */(this.getTile(
+        tileCoord[0], tileCoord[1], tileCoord[2], 1, this.getProjection()));
+    tile.forDataAtCoordinate(coordinate, callback, opt_this, opt_request);
+  } else {
+    if (opt_request === true) {
+      goog.async.nextTick(function() {
+        callback.call(opt_this, null);
+      });
+    } else {
+      callback.call(opt_this, null);
+    }
+  }
+};
+
+
+/**
+ * TODO: very similar to ol.source.TileJSON#handleTileJSONResponse
+ * @protected
+ * @param {TileJSON} tileJSON Tile JSON.
+ */
+ol.source.TileUTFGrid.prototype.handleTileJSONResponse = function(tileJSON) {
+
+  var epsg4326Projection = ol.proj.get('EPSG:4326');
+
+  var sourceProjection = this.getProjection();
+  var extent;
+  if (goog.isDef(tileJSON.bounds)) {
+    var transform = ol.proj.getTransformFromProjections(
+        epsg4326Projection, sourceProjection);
+    extent = ol.extent.applyTransform(tileJSON.bounds, transform);
+  }
+
+  if (goog.isDef(tileJSON.scheme)) {
+    goog.asserts.assert(tileJSON.scheme == 'xyz');
+  }
+  var minZoom = tileJSON.minzoom || 0;
+  var maxZoom = tileJSON.maxzoom || 22;
+  var tileGrid = new ol.tilegrid.XYZ({
+    extent: ol.tilegrid.extentFromProjection(sourceProjection),
+    maxZoom: maxZoom,
+    minZoom: minZoom
+  });
+  this.tileGrid = tileGrid;
+
+  this.template_ = tileJSON.template;
+
+  var grids = tileJSON.grids;
+  if (!goog.isDefAndNotNull(grids)) {
+    this.setState(ol.source.State.ERROR);
+    return;
+  }
+
+  this.tileUrlFunction_ = ol.TileUrlFunction.withTileCoordTransform(
+      tileGrid.createTileCoordTransform({
+        extent: extent
+      }),
+      ol.TileUrlFunction.createFromTemplates(grids));
+
+  if (goog.isDef(tileJSON.attribution)) {
+    var attributionExtent = goog.isDef(extent) ?
+        extent : epsg4326Projection.getExtent();
+    /** @type {Object.<string, Array.<ol.TileRange>>} */
+    var tileRanges = {};
+    var z, zKey;
+    for (z = minZoom; z <= maxZoom; ++z) {
+      zKey = z.toString();
+      tileRanges[zKey] =
+          [tileGrid.getTileRangeForExtentAndZ(attributionExtent, z)];
+    }
+    this.setAttributions([
+      new ol.Attribution({
+        html: tileJSON.attribution,
+        tileRanges: tileRanges
+      })
+    ]);
+  }
+
+  this.setState(ol.source.State.READY);
+
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileUTFGrid.prototype.getTile =
+    function(z, x, y, pixelRatio, projection) {
+  var tileCoordKey = this.getKeyZXY(z, x, y);
+  if (this.tileCache_.containsKey(tileCoordKey)) {
+    return /** @type {!ol.Tile} */ (this.tileCache_.get(tileCoordKey));
+  } else {
+    goog.asserts.assert(projection);
+    var tileCoord = [z, x, y];
+    var tileUrl = this.tileUrlFunction_(tileCoord, pixelRatio, projection);
+    var tile = new ol.source.TileUTFGridTile_(
+        tileCoord,
+        goog.isDef(tileUrl) ? ol.TileState.IDLE : ol.TileState.EMPTY,
+        goog.isDef(tileUrl) ? tileUrl : '',
+        this.tileGrid.getTileCoordExtent(tileCoord),
+        this.preemptive_);
+    this.tileCache_.set(tileCoordKey, tile);
+    return tile;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileUTFGrid.prototype.useTile = function(z, x, y) {
+  var tileCoordKey = this.getKeyZXY(z, x, y);
+  if (this.tileCache_.containsKey(tileCoordKey)) {
+    this.tileCache_.get(tileCoordKey);
+  }
+};
+
+
+
+/**
+ * @constructor
+ * @extends {ol.Tile}
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {ol.TileState} state State.
+ * @param {string} src Image source URI.
+ * @param {ol.Extent} extent Extent of the tile.
+ * @param {boolean} preemptive Load the tile when visible (before it's needed).
+ * @private
+ */
+ol.source.TileUTFGridTile_ =
+    function(tileCoord, state, src, extent, preemptive) {
+
+  goog.base(this, tileCoord, state);
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.src_ = src;
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.extent_ = extent;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.preemptive_ = preemptive;
+
+  /**
+   * @private
+   * @type {Array.<string>}
+   */
+  this.grid_ = null;
+
+  /**
+   * @private
+   * @type {Array.<string>}
+   */
+  this.keys_ = null;
+
+  /**
+   * @private
+   * @type {Object.<string, Object>|undefined}
+   */
+  this.data_ = null;
+};
+goog.inherits(ol.source.TileUTFGridTile_, ol.Tile);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileUTFGridTile_.prototype.getImage = function(opt_context) {
+  return null;
+};
+
+
+/**
+ * Synchronously returns data at given coordinate (if available).
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @return {Object}
+ */
+ol.source.TileUTFGridTile_.prototype.getData = function(coordinate) {
+  if (goog.isNull(this.grid_) || goog.isNull(this.keys_) ||
+      goog.isNull(this.data_)) {
+    return null;
+  }
+  var xRelative = (coordinate[0] - this.extent_[0]) /
+      (this.extent_[2] - this.extent_[0]);
+  var yRelative = (coordinate[1] - this.extent_[1]) /
+      (this.extent_[3] - this.extent_[1]);
+
+  var row = this.grid_[Math.floor((1 - yRelative) * this.grid_.length)];
+
+  if (!goog.isString(row)) {
+    return null;
+  }
+
+  var code = row.charCodeAt(Math.floor(xRelative * row.length));
+  if (code >= 93) {
+    code--;
+  }
+  if (code >= 35) {
+    code--;
+  }
+  code -= 32;
+
+  var key = this.keys_[code];
+
+  return goog.isDefAndNotNull(key) ? this.data_[key] : null;
+};
+
+
+/**
+ * Calls the callback (synchronously by default) with the available data
+ * for given coordinate (or `null` if not yet loaded).
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {function(this: T, Object)} callback Callback.
+ * @param {T=} opt_this The object to use as `this` in the callback.
+ * @param {boolean=} opt_request If `true` the callback is always async.
+ *                               The tile data is requested if not yet loaded.
+ * @template T
+ */
+ol.source.TileUTFGridTile_.prototype.forDataAtCoordinate =
+    function(coordinate, callback, opt_this, opt_request) {
+  if (this.state == ol.TileState.IDLE && opt_request === true) {
+    goog.events.listenOnce(this, goog.events.EventType.CHANGE, function(e) {
+      callback.call(opt_this, this.getData(coordinate));
+    }, false, this);
+    this.loadInternal_();
+  } else {
+    if (opt_request === true) {
+      goog.async.nextTick(function() {
+        callback.call(opt_this, this.getData(coordinate));
+      }, this);
+    } else {
+      callback.call(opt_this, this.getData(coordinate));
+    }
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileUTFGridTile_.prototype.getKey = function() {
+  return this.src_;
+};
+
+
+/**
+ * @private
+ */
+ol.source.TileUTFGridTile_.prototype.handleError_ = function() {
+  this.state = ol.TileState.ERROR;
+  this.changed();
+};
+
+
+/**
+ * @param {!UTFGridJSON} json
+ * @private
+ */
+ol.source.TileUTFGridTile_.prototype.handleLoad_ = function(json) {
+  this.grid_ = json.grid;
+  this.keys_ = json.keys;
+  this.data_ = json.data;
+
+  this.state = ol.TileState.EMPTY;
+  this.changed();
+};
+
+
+/**
+ * @private
+ */
+ol.source.TileUTFGridTile_.prototype.loadInternal_ = function() {
+  if (this.state == ol.TileState.IDLE) {
+    this.state = ol.TileState.LOADING;
+    var request = new goog.net.Jsonp(this.src_);
+    request.send(undefined, goog.bind(this.handleLoad_, this),
+                 goog.bind(this.handleError_, this));
+  }
+};
+
+
+/**
+ * Load not yet loaded URI.
+ */
+ol.source.TileUTFGridTile_.prototype.load = function() {
+  if (this.preemptive_) {
+    this.loadInternal_();
+  }
+};
diff --git a/src/ol/source/tilevectorsource.js b/src/ol/source/tilevectorsource.js
new file mode 100644
index 0000000..84eea90
--- /dev/null
+++ b/src/ol/source/tilevectorsource.js
@@ -0,0 +1,311 @@
+goog.provide('ol.source.TileVector');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('ol.TileCoord');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.source.FormatVector');
+goog.require('ol.source.State');
+goog.require('ol.tilegrid.TileGrid');
+
+
+
+/**
+ * @classdesc
+ * A vector source in one of the supported formats, where the data is divided
+ * into tiles in a fixed grid pattern.
+ *
+ * @constructor
+ * @extends {ol.source.FormatVector}
+ * @param {olx.source.TileVectorOptions} options Options.
+ * @api
+ */
+ol.source.TileVector = function(options) {
+
+  goog.base(this, {
+    attributions: options.attributions,
+    format: options.format,
+    logo: options.logo,
+    projection: options.projection
+  });
+
+  /**
+   * @private
+   * @type {ol.tilegrid.TileGrid}
+   */
+  this.tileGrid_ = options.tileGrid;
+
+  /**
+   * @private
+   * @type {ol.TileUrlFunctionType}
+   */
+  this.tileUrlFunction_ = ol.TileUrlFunction.nullTileUrlFunction;
+
+  /**
+   * @private
+   * @type {ol.TileCoordTransformType}
+   */
+  this.tileCoordTransform_ = this.tileGrid_.createTileCoordTransform();
+
+  /**
+   * @private
+   * @type {Object.<string, Array.<ol.Feature>>}
+   */
+  this.tiles_ = {};
+
+  if (goog.isDef(options.tileUrlFunction)) {
+    this.setTileUrlFunction(options.tileUrlFunction);
+  } else if (goog.isDef(options.urls)) {
+    this.setUrls(options.urls);
+  } else if (goog.isDef(options.url)) {
+    this.setUrl(options.url);
+  }
+
+};
+goog.inherits(ol.source.TileVector, ol.source.FormatVector);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.addFeature = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.addFeatures = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.clear = function() {
+  goog.object.clear(this.tiles_);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.forEachFeature = goog.abstractMethod;
+
+
+/**
+ * Iterate through all features whose geometries contain the provided
+ * coordinate at the provided resolution, calling the callback with each
+ * feature. If the callback returns a "truthy" value, iteration will stop and
+ * the function will return the same value.
+ *
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} resolution Resolution.
+ * @param {function(this: T, ol.Feature): S} callback Called with each feature
+ *     whose goemetry contains the provided coordinate.
+ * @param {T=} opt_this The object to use as `this` in the callback.
+ * @return {S|undefined} The return value from the last call to the callback.
+ * @template T,S
+ */
+ol.source.TileVector.prototype.forEachFeatureAtCoordinateAndResolution =
+    function(coordinate, resolution, callback, opt_this) {
+
+  var tileGrid = this.tileGrid_;
+  var tiles = this.tiles_;
+  var tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate,
+      resolution);
+
+  var tileKey = this.getTileKeyZXY_(tileCoord[0], tileCoord[1], tileCoord[2]);
+  var features = tiles[tileKey];
+  if (goog.isDef(features)) {
+    var i, ii;
+    for (i = 0, ii = features.length; i < ii; ++i) {
+      var feature = features[i];
+      var geometry = feature.getGeometry();
+      goog.asserts.assert(goog.isDefAndNotNull(geometry));
+      if (geometry.containsCoordinate(coordinate)) {
+        var result = callback.call(opt_this, feature);
+        if (result) {
+          return result;
+        }
+      }
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.forEachFeatureInExtent = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.forEachFeatureInExtentAtResolution =
+    function(extent, resolution, f, opt_this) {
+  var tileGrid = this.tileGrid_;
+  var tiles = this.tiles_;
+  var z = tileGrid.getZForResolution(resolution);
+  var tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
+  var x, y;
+  for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
+    for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
+      var tileKey = this.getTileKeyZXY_(z, x, y);
+      var features = tiles[tileKey];
+      if (goog.isDef(features)) {
+        var i, ii;
+        for (i = 0, ii = features.length; i < ii; ++i) {
+          var result = f.call(opt_this, features[i]);
+          if (result) {
+            return result;
+          }
+        }
+      }
+    }
+  }
+  return undefined;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.getClosestFeatureToCoordinate =
+    goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.getExtent = goog.abstractMethod;
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.source.TileVector.prototype.getFeatures = function() {
+  var tiles = this.tiles_;
+  var features = [];
+  var tileKey;
+  for (tileKey in tiles) {
+    goog.array.extend(features, tiles[tileKey]);
+  }
+  return features;
+};
+
+
+/**
+ * Get all features whose geometry intersects the provided coordinate for the
+ * provided resolution.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} resolution Resolution.
+ * @return {Array.<ol.Feature>} Features.
+ * @api
+ */
+ol.source.TileVector.prototype.getFeaturesAtCoordinateAndResolution =
+    function(coordinate, resolution) {
+  var features = [];
+  this.forEachFeatureAtCoordinateAndResolution(coordinate, resolution,
+      /**
+       * @param {ol.Feature} feature Feature.
+       */
+      function(feature) {
+        features.push(feature);
+      });
+  return features;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.getFeaturesInExtent = goog.abstractMethod;
+
+
+/**
+ * @param {number} z Z.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @private
+ * @return {string} Tile key.
+ */
+ol.source.TileVector.prototype.getTileKeyZXY_ = function(z, x, y) {
+  return z + '/' + x + '/' + y;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.loadFeatures =
+    function(extent, resolution, projection) {
+  var tileCoordTransform = this.tileCoordTransform_;
+  var tileGrid = this.tileGrid_;
+  var tileUrlFunction = this.tileUrlFunction_;
+  var tiles = this.tiles_;
+  var z = tileGrid.getZForResolution(resolution);
+  var tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
+  var tileCoord = [z, 0, 0];
+  var x, y;
+  /**
+   * @param {string} tileKey Tile key.
+   * @param {Array.<ol.Feature>} features Features.
+   * @this {ol.source.TileVector}
+   */
+  function success(tileKey, features) {
+    tiles[tileKey] = features;
+    this.setState(ol.source.State.READY);
+  }
+  for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
+    for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
+      var tileKey = this.getTileKeyZXY_(z, x, y);
+      if (!(tileKey in tiles)) {
+        tileCoord[0] = z;
+        tileCoord[1] = x;
+        tileCoord[2] = y;
+        tileCoordTransform(tileCoord, projection, tileCoord);
+        var url = tileUrlFunction(tileCoord, 1, projection);
+        if (goog.isDef(url)) {
+          tiles[tileKey] = [];
+          this.loadFeaturesFromURL(url, goog.partial(success, tileKey),
+              goog.nullFunction, this);
+        }
+      }
+    }
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileVector.prototype.removeFeature = goog.abstractMethod;
+
+
+/**
+ * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function.
+ */
+ol.source.TileVector.prototype.setTileUrlFunction = function(tileUrlFunction) {
+  this.tileUrlFunction_ = tileUrlFunction;
+  this.changed();
+};
+
+
+/**
+ * @param {string} url URL.
+ */
+ol.source.TileVector.prototype.setUrl = function(url) {
+  this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(
+      ol.TileUrlFunction.expandUrl(url)));
+};
+
+
+/**
+ * @param {Array.<string>} urls URLs.
+ */
+ol.source.TileVector.prototype.setUrls = function(urls) {
+  this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(urls));
+};
diff --git a/src/ol/source/tilewmssource.js b/src/ol/source/tilewmssource.js
new file mode 100644
index 0000000..fd227e9
--- /dev/null
+++ b/src/ol/source/tilewmssource.js
@@ -0,0 +1,421 @@
+// FIXME add minZoom support
+// FIXME add date line wrap (tile coord transform)
+// FIXME cannot be shared between maps with different projections
+
+goog.provide('ol.source.TileWMS');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.math');
+goog.require('goog.object');
+goog.require('goog.string');
+goog.require('goog.uri.utils');
+goog.require('ol');
+goog.require('ol.TileCoord');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.extent');
+goog.require('ol.proj');
+goog.require('ol.source.TileImage');
+goog.require('ol.source.wms');
+goog.require('ol.source.wms.ServerType');
+goog.require('ol.tilecoord');
+
+
+
+/**
+ * @classdesc
+ * Layer source for tile data from WMS servers.
+ *
+ * @constructor
+ * @extends {ol.source.TileImage}
+ * @param {olx.source.TileWMSOptions=} opt_options Tile WMS options.
+ * @api stable
+ */
+ol.source.TileWMS = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var params = goog.isDef(options.params) ? options.params : {};
+
+  var transparent = goog.object.get(params, 'TRANSPARENT', true);
+
+  goog.base(this, {
+    attributions: options.attributions,
+    crossOrigin: options.crossOrigin,
+    logo: options.logo,
+    opaque: !transparent,
+    projection: options.projection,
+    tileGrid: options.tileGrid,
+    tileLoadFunction: options.tileLoadFunction,
+    tileUrlFunction: goog.bind(this.tileUrlFunction_, this)
+  });
+
+  var urls = options.urls;
+  if (!goog.isDef(urls) && goog.isDef(options.url)) {
+    urls = ol.TileUrlFunction.expandUrl(options.url);
+  }
+
+  /**
+   * @private
+   * @type {!Array.<string>}
+   */
+  this.urls_ = goog.isDefAndNotNull(urls) ? urls : [];
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.gutter_ = goog.isDef(options.gutter) ? options.gutter : 0;
+
+  /**
+   * @private
+   * @type {Object}
+   */
+  this.params_ = params;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.v13_ = true;
+
+  /**
+   * @private
+   * @type {ol.source.wms.ServerType|undefined}
+   */
+  this.serverType_ =
+      /** @type {ol.source.wms.ServerType|undefined} */ (options.serverType);
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.hidpi_ = goog.isDef(options.hidpi) ? options.hidpi : true;
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.coordKeyPrefix_ = '';
+  this.resetCoordKeyPrefix_();
+
+  /**
+   * @private
+   * @type {ol.Extent}
+   */
+  this.tmpExtent_ = ol.extent.createEmpty();
+
+  this.updateV13_();
+
+};
+goog.inherits(ol.source.TileWMS, ol.source.TileImage);
+
+
+/**
+ * Return the GetFeatureInfo URL for the passed coordinate, resolution, and
+ * projection. Return `undefined` if the GetFeatureInfo URL cannot be
+ * constructed.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} resolution Resolution.
+ * @param {ol.proj.ProjectionLike} projection Projection.
+ * @param {!Object} params GetFeatureInfo params. `INFO_FORMAT` at least should
+ *     be provided. If `QUERY_LAYERS` is not provided then the layers specified
+ *     in the `LAYERS` parameter will be used. `VERSION` should not be
+ *     specified here.
+ * @return {string|undefined} GetFeatureInfo URL.
+ * @api stable
+ */
+ol.source.TileWMS.prototype.getGetFeatureInfoUrl =
+    function(coordinate, resolution, projection, params) {
+
+  goog.asserts.assert(!('VERSION' in params));
+
+  var projectionObj = ol.proj.get(projection);
+
+  var tileGrid = this.getTileGrid();
+  if (goog.isNull(tileGrid)) {
+    tileGrid = this.getTileGridForProjection(projectionObj);
+  }
+
+  var tileCoord = tileGrid.getTileCoordForCoordAndResolution(
+      coordinate, resolution);
+
+  if (tileGrid.getResolutions().length <= tileCoord[0]) {
+    return undefined;
+  }
+
+  var tileResolution = tileGrid.getResolution(tileCoord[0]);
+  var tileExtent = tileGrid.getTileCoordExtent(tileCoord, this.tmpExtent_);
+  var tileSize = tileGrid.getTileSize(tileCoord[0]);
+
+  var gutter = this.gutter_;
+  if (gutter !== 0) {
+    tileSize += 2 * gutter;
+    tileExtent = ol.extent.buffer(tileExtent,
+        tileResolution * gutter, tileExtent);
+  }
+
+  var baseParams = {
+    'SERVICE': 'WMS',
+    'VERSION': ol.DEFAULT_WMS_VERSION,
+    'REQUEST': 'GetFeatureInfo',
+    'FORMAT': 'image/png',
+    'TRANSPARENT': true,
+    'QUERY_LAYERS': goog.object.get(this.params_, 'LAYERS')
+  };
+  goog.object.extend(baseParams, this.params_, params);
+
+  var x = Math.floor((coordinate[0] - tileExtent[0]) / tileResolution);
+  var y = Math.floor((tileExtent[3] - coordinate[1]) / tileResolution);
+
+  goog.object.set(baseParams, this.v13_ ? 'I' : 'X', x);
+  goog.object.set(baseParams, this.v13_ ? 'J' : 'Y', y);
+
+  return this.getRequestUrl_(tileCoord, tileSize, tileExtent,
+      1, projectionObj, baseParams);
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileWMS.prototype.getGutter = function() {
+  return this.gutter_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.TileWMS.prototype.getKeyZXY = function(z, x, y) {
+  return this.coordKeyPrefix_ + goog.base(this, 'getKeyZXY', z, x, y);
+};
+
+
+/**
+ * Get the user-provided params, i.e. those passed to the constructor through
+ * the "params" option, and possibly updated using the updateParams method.
+ * @return {Object} Params.
+ * @api stable
+ */
+ol.source.TileWMS.prototype.getParams = function() {
+  return this.params_;
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {number} tileSize Tile size.
+ * @param {ol.Extent} tileExtent Tile extent.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @param {Object} params Params.
+ * @return {string|undefined} Request URL.
+ * @private
+ */
+ol.source.TileWMS.prototype.getRequestUrl_ =
+    function(tileCoord, tileSize, tileExtent,
+        pixelRatio, projection, params) {
+
+  var urls = this.urls_;
+  if (goog.array.isEmpty(urls)) {
+    return undefined;
+  }
+
+  goog.object.set(params, 'WIDTH', tileSize);
+  goog.object.set(params, 'HEIGHT', tileSize);
+
+  params[this.v13_ ? 'CRS' : 'SRS'] = projection.getCode();
+
+  if (!('STYLES' in this.params_)) {
+    /* jshint -W053 */
+    goog.object.set(params, 'STYLES', new String(''));
+    /* jshint +W053 */
+  }
+
+  if (pixelRatio != 1) {
+    switch (this.serverType_) {
+      case ol.source.wms.ServerType.GEOSERVER:
+        var dpi = (90 * pixelRatio + 0.5) | 0;
+        goog.object.set(params, 'FORMAT_OPTIONS', 'dpi:' + dpi);
+        break;
+      case ol.source.wms.ServerType.MAPSERVER:
+        goog.object.set(params, 'MAP_RESOLUTION', 90 * pixelRatio);
+        break;
+      case ol.source.wms.ServerType.CARMENTA_SERVER:
+      case ol.source.wms.ServerType.QGIS:
+        goog.object.set(params, 'DPI', 90 * pixelRatio);
+        break;
+      default:
+        goog.asserts.fail();
+        break;
+    }
+  }
+
+  var axisOrientation = projection.getAxisOrientation();
+  var bbox = tileExtent;
+  if (this.v13_ && axisOrientation.substr(0, 2) == 'ne') {
+    var tmp;
+    tmp = tileExtent[0];
+    bbox[0] = tileExtent[1];
+    bbox[1] = tmp;
+    tmp = tileExtent[2];
+    bbox[2] = tileExtent[3];
+    bbox[3] = tmp;
+  }
+  goog.object.set(params, 'BBOX', bbox.join(','));
+
+  var url;
+  if (urls.length == 1) {
+    url = urls[0];
+  } else {
+    var index = goog.math.modulo(ol.tilecoord.hash(tileCoord), urls.length);
+    url = urls[index];
+  }
+  return goog.uri.utils.appendParamsFromMap(url, params);
+};
+
+
+/**
+ * @param {number} z Z.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @return {number} Size.
+ */
+ol.source.TileWMS.prototype.getTilePixelSize =
+    function(z, pixelRatio, projection) {
+  var tileSize = goog.base(this, 'getTilePixelSize', z, pixelRatio, projection);
+  if (pixelRatio == 1 || !this.hidpi_ || !goog.isDef(this.serverType_)) {
+    return tileSize;
+  } else {
+    return (tileSize * pixelRatio + 0.5) | 0;
+  }
+};
+
+
+/**
+ * Return the URLs used for this WMS source.
+ * @return {!Array.<string>} URLs.
+ * @api stable
+ */
+ol.source.TileWMS.prototype.getUrls = function() {
+  return this.urls_;
+};
+
+
+/**
+ * @private
+ */
+ol.source.TileWMS.prototype.resetCoordKeyPrefix_ = function() {
+  var i = 0;
+  var res = [];
+
+  var j, jj;
+  for (j = 0, jj = this.urls_.length; j < jj; ++j) {
+    res[i++] = this.urls_[j];
+  }
+
+  var key;
+  for (key in this.params_) {
+    res[i++] = key + '-' + this.params_[key];
+  }
+
+  this.coordKeyPrefix_ = res.join('#');
+};
+
+
+/**
+ * @param {string|undefined} url URL.
+ * @api stable
+ */
+ol.source.TileWMS.prototype.setUrl = function(url) {
+  var urls = goog.isDef(url) ? ol.TileUrlFunction.expandUrl(url) : null;
+  this.setUrls(urls);
+};
+
+
+/**
+ * @param {Array.<string>|undefined} urls URLs.
+ * @api stable
+ */
+ol.source.TileWMS.prototype.setUrls = function(urls) {
+  this.urls_ = goog.isDefAndNotNull(urls) ? urls : [];
+  this.resetCoordKeyPrefix_();
+  this.changed();
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @return {string|undefined} Tile URL.
+ * @private
+ */
+ol.source.TileWMS.prototype.tileUrlFunction_ =
+    function(tileCoord, pixelRatio, projection) {
+
+  var tileGrid = this.getTileGrid();
+  if (goog.isNull(tileGrid)) {
+    tileGrid = this.getTileGridForProjection(projection);
+  }
+
+  if (tileGrid.getResolutions().length <= tileCoord[0]) {
+    return undefined;
+  }
+
+  if (pixelRatio != 1 && (!this.hidpi_ || !goog.isDef(this.serverType_))) {
+    pixelRatio = 1;
+  }
+
+  var tileResolution = tileGrid.getResolution(tileCoord[0]);
+  var tileExtent = tileGrid.getTileCoordExtent(
+      tileCoord, this.tmpExtent_);
+  var tileSize = tileGrid.getTileSize(tileCoord[0]);
+
+  var gutter = this.gutter_;
+  if (gutter !== 0) {
+    tileSize += 2 * gutter;
+    tileExtent = ol.extent.buffer(tileExtent,
+        tileResolution * gutter, tileExtent);
+  }
+
+  if (pixelRatio != 1) {
+    tileSize = (tileSize * pixelRatio + 0.5) | 0;
+  }
+
+  var baseParams = {
+    'SERVICE': 'WMS',
+    'VERSION': ol.DEFAULT_WMS_VERSION,
+    'REQUEST': 'GetMap',
+    'FORMAT': 'image/png',
+    'TRANSPARENT': true
+  };
+  goog.object.extend(baseParams, this.params_);
+
+  return this.getRequestUrl_(tileCoord, tileSize, tileExtent,
+      pixelRatio, projection, baseParams);
+};
+
+
+/**
+ * Update the user-provided params.
+ * @param {Object} params Params.
+ * @api stable
+ */
+ol.source.TileWMS.prototype.updateParams = function(params) {
+  goog.object.extend(this.params_, params);
+  this.resetCoordKeyPrefix_();
+  this.updateV13_();
+  this.changed();
+};
+
+
+/**
+ * @private
+ */
+ol.source.TileWMS.prototype.updateV13_ = function() {
+  var version =
+      goog.object.get(this.params_, 'VERSION', ol.DEFAULT_WMS_VERSION);
+  this.v13_ = goog.string.compareVersions(version, '1.3') >= 0;
+};
diff --git a/src/ol/source/topojsonsource.js b/src/ol/source/topojsonsource.js
new file mode 100644
index 0000000..8eec88a
--- /dev/null
+++ b/src/ol/source/topojsonsource.js
@@ -0,0 +1,36 @@
+goog.provide('ol.source.TopoJSON');
+
+goog.require('ol.format.TopoJSON');
+goog.require('ol.source.StaticVector');
+
+
+
+/**
+ * @classdesc
+ * Static vector source in TopoJSON format
+ *
+ * @constructor
+ * @extends {ol.source.StaticVector}
+ * @fires ol.source.VectorEvent
+ * @param {olx.source.TopoJSONOptions=} opt_options Options.
+ * @api
+ */
+ol.source.TopoJSON = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    attributions: options.attributions,
+    extent: options.extent,
+    format: new ol.format.TopoJSON({
+      defaultDataProjection: options.defaultProjection
+    }),
+    logo: options.logo,
+    object: options.object,
+    projection: options.projection,
+    text: options.text,
+    url: options.url
+  });
+
+};
+goog.inherits(ol.source.TopoJSON, ol.source.StaticVector);
diff --git a/src/ol/source/vectorsource.js b/src/ol/source/vectorsource.js
new file mode 100644
index 0000000..de1783e
--- /dev/null
+++ b/src/ol/source/vectorsource.js
@@ -0,0 +1,656 @@
+// FIXME bulk feature upload - suppress events
+// FIXME put features in an ol.Collection
+// FIXME make change-detection more refined (notably, geometry hint)
+
+goog.provide('ol.source.Vector');
+goog.provide('ol.source.VectorEvent');
+goog.provide('ol.source.VectorEventType');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.Event');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol.ObjectEventType');
+goog.require('ol.proj');
+goog.require('ol.source.Source');
+goog.require('ol.structs.RBush');
+
+
+/**
+ * @enum {string}
+ */
+ol.source.VectorEventType = {
+  /**
+   * Triggered when a feature is added to the source.
+   * @event ol.source.VectorEvent#addfeature
+   * @api stable
+   */
+  ADDFEATURE: 'addfeature',
+
+  /**
+   * Triggered when a feature is updated.
+   * @event ol.source.VectorEvent#changefeature
+   * @api
+   */
+  CHANGEFEATURE: 'changefeature',
+
+  /**
+   * Triggered when the clear method is called on the source.
+   * @event ol.source.VectorEvent#clear
+   * @api
+   */
+  CLEAR: 'clear',
+
+  /**
+   * Triggered when a feature is removed from the source.
+   * See {@link ol.source.Vector#clear source.clear()} for exceptions.
+   * @event ol.source.VectorEvent#removefeature
+   * @api stable
+   */
+  REMOVEFEATURE: 'removefeature'
+};
+
+
+
+/**
+ * @classdesc
+ * Provides a source of features for vector layers.
+ *
+ * @constructor
+ * @extends {ol.source.Source}
+ * @fires ol.source.VectorEvent
+ * @param {olx.source.VectorOptions=} opt_options Vector source options.
+ * @api stable
+ */
+ol.source.Vector = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  goog.base(this, {
+    attributions: options.attributions,
+    logo: options.logo,
+    projection: options.projection,
+    state: goog.isDef(options.state) ?
+        /** @type {ol.source.State} */ (options.state) : undefined
+  });
+
+  /**
+   * @private
+   * @type {ol.structs.RBush.<ol.Feature>}
+   */
+  this.rBush_ = new ol.structs.RBush();
+
+  /**
+   * @private
+   * @type {Object.<string, ol.Feature>}
+   */
+  this.nullGeometryFeatures_ = {};
+
+  /**
+   * A lookup of features by id (the return from feature.getId()).
+   * @private
+   * @type {Object.<string, ol.Feature>}
+   */
+  this.idIndex_ = {};
+
+  /**
+   * A lookup of features without id (keyed by goog.getUid(feature)).
+   * @private
+   * @type {Object.<string, ol.Feature>}
+   */
+  this.undefIdIndex_ = {};
+
+  /**
+   * @private
+   * @type {Object.<string, Array.<goog.events.Key>>}
+   */
+  this.featureChangeKeys_ = {};
+
+  if (goog.isDef(options.features)) {
+    this.addFeaturesInternal(options.features);
+  }
+
+};
+goog.inherits(ol.source.Vector, ol.source.Source);
+
+
+/**
+ * Add a single feature to the source.  If you want to add a batch of features
+ * at once, call {@link ol.source.Vector#addFeatures source.addFeatures()}
+ * instead.
+ * @param {ol.Feature} feature Feature to add.
+ * @api stable
+ */
+ol.source.Vector.prototype.addFeature = function(feature) {
+  this.addFeatureInternal(feature);
+  this.changed();
+};
+
+
+/**
+ * Add a feature without firing a `change` event.
+ * @param {ol.Feature} feature Feature.
+ * @protected
+ */
+ol.source.Vector.prototype.addFeatureInternal = function(feature) {
+  var featureKey = goog.getUid(feature).toString();
+  this.setupChangeEvents_(featureKey, feature);
+
+  var geometry = feature.getGeometry();
+  if (goog.isDefAndNotNull(geometry)) {
+    var extent = geometry.getExtent();
+    this.rBush_.insert(extent, feature);
+  } else {
+    this.nullGeometryFeatures_[featureKey] = feature;
+  }
+
+  this.addToIndex_(featureKey, feature);
+  this.dispatchEvent(
+      new ol.source.VectorEvent(ol.source.VectorEventType.ADDFEATURE, feature));
+};
+
+
+/**
+ * @param {string} featureKey
+ * @param {ol.Feature} feature
+ * @private
+ */
+ol.source.Vector.prototype.setupChangeEvents_ = function(featureKey, feature) {
+  goog.asserts.assert(!(featureKey in this.featureChangeKeys_));
+  this.featureChangeKeys_[featureKey] = [
+    goog.events.listen(feature,
+        goog.events.EventType.CHANGE,
+        this.handleFeatureChange_, false, this),
+    goog.events.listen(feature,
+        ol.ObjectEventType.PROPERTYCHANGE,
+        this.handleFeatureChange_, false, this)
+  ];
+};
+
+
+/**
+ * @param {string} featureKey
+ * @param {ol.Feature} feature
+ * @private
+ */
+ol.source.Vector.prototype.addToIndex_ = function(featureKey, feature) {
+  var id = feature.getId();
+  if (goog.isDef(id)) {
+    this.idIndex_[id.toString()] = feature;
+  } else {
+    goog.asserts.assert(!(featureKey in this.undefIdIndex_),
+        'Feature already added to the source');
+    this.undefIdIndex_[featureKey] = feature;
+  }
+};
+
+
+/**
+ * Add a batch of features to the source.
+ * @param {Array.<ol.Feature>} features Features to add.
+ * @api stable
+ */
+ol.source.Vector.prototype.addFeatures = function(features) {
+  this.addFeaturesInternal(features);
+  this.changed();
+};
+
+
+/**
+ * Add features without firing a `change` event.
+ * @param {Array.<ol.Feature>} features Features.
+ * @protected
+ */
+ol.source.Vector.prototype.addFeaturesInternal = function(features) {
+  var featureKey, i, length, feature;
+  var extents = [];
+  var validFeatures = [];
+  for (i = 0, length = features.length; i < length; i++) {
+    feature = features[i];
+    featureKey = goog.getUid(feature).toString();
+    this.setupChangeEvents_(featureKey, feature);
+
+    var geometry = feature.getGeometry();
+    if (goog.isDefAndNotNull(geometry)) {
+      var extent = geometry.getExtent();
+      extents.push(extent);
+      validFeatures.push(feature);
+    } else {
+      this.nullGeometryFeatures_[featureKey] = feature;
+    }
+  }
+  this.rBush_.load(extents, validFeatures);
+
+  for (i = 0, length = features.length; i < length; i++) {
+    feature = features[i];
+    featureKey = goog.getUid(feature).toString();
+    this.addToIndex_(featureKey, feature);
+    this.dispatchEvent(new ol.source.VectorEvent(
+        ol.source.VectorEventType.ADDFEATURE, feature));
+  }
+};
+
+
+/**
+ * Remove all features from the source.
+ * @param {boolean=} opt_fast Skip dispatching of {@link removefeature} events.
+ * @api stable
+ */
+ol.source.Vector.prototype.clear = function(opt_fast) {
+  if (opt_fast) {
+    for (var featureId in this.featureChangeKeys_) {
+      var keys = this.featureChangeKeys_[featureId];
+      goog.array.forEach(keys, goog.events.unlistenByKey);
+    }
+    this.featureChangeKeys_ = {};
+    this.idIndex_ = {};
+    this.undefIdIndex_ = {};
+  } else {
+    var rmFeatureInternal = this.removeFeatureInternal;
+    this.rBush_.forEach(rmFeatureInternal, this);
+    goog.object.forEach(this.nullGeometryFeatures_, rmFeatureInternal, this);
+    goog.asserts.assert(goog.object.isEmpty(this.featureChangeKeys_));
+    goog.asserts.assert(goog.object.isEmpty(this.idIndex_));
+    goog.asserts.assert(goog.object.isEmpty(this.undefIdIndex_));
+  }
+
+  this.rBush_.clear();
+  this.nullGeometryFeatures_ = {};
+
+  var clearEvent = new ol.source.VectorEvent(ol.source.VectorEventType.CLEAR);
+  this.dispatchEvent(clearEvent);
+  this.changed();
+};
+
+
+/**
+ * Iterate through all features on the source, calling the provided callback
+ * with each one.  If the callback returns any "truthy" value, iteration will
+ * stop and the function will return the same value.
+ *
+ * @param {function(this: T, ol.Feature): S} callback Called with each feature
+ *     on the source.  Return a truthy value to stop iteration.
+ * @param {T=} opt_this The object to use as `this` in the callback.
+ * @return {S|undefined} The return value from the last call to the callback.
+ * @template T,S
+ * @api stable
+ */
+ol.source.Vector.prototype.forEachFeature = function(callback, opt_this) {
+  return this.rBush_.forEach(callback, opt_this);
+};
+
+
+/**
+ * Iterate through all features whose geometries contain the provided
+ * coordinate, calling the callback with each feature.  If the callback returns
+ * a "truthy" value, iteration will stop and the function will return the same
+ * value.
+ *
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {function(this: T, ol.Feature): S} callback Called with each feature
+ *     whose goemetry contains the provided coordinate.
+ * @param {T=} opt_this The object to use as `this` in the callback.
+ * @return {S|undefined} The return value from the last call to the callback.
+ * @template T,S
+ */
+ol.source.Vector.prototype.forEachFeatureAtCoordinate =
+    function(coordinate, callback, opt_this) {
+  var extent = [coordinate[0], coordinate[1], coordinate[0], coordinate[1]];
+  return this.forEachFeatureInExtent(extent, function(feature) {
+    var geometry = feature.getGeometry();
+    goog.asserts.assert(goog.isDefAndNotNull(geometry));
+    if (geometry.containsCoordinate(coordinate)) {
+      return callback.call(opt_this, feature);
+    } else {
+      return undefined;
+    }
+  });
+};
+
+
+/**
+ * Iterate through all features whose bounding box intersects the provided
+ * extent (note that the feature's geometry may not intersect the extent),
+ * calling the callback with each feature.  If the callback returns a "truthy"
+ * value, iteration will stop and the function will return the same value.
+ *
+ * If you are interested in features whose geometry intersects an extent, call
+ * the {@link ol.source.Vector#forEachFeatureIntersectingExtent
+ * source.forEachFeatureIntersectingExtent()} method instead.
+ *
+ * @param {ol.Extent} extent Extent.
+ * @param {function(this: T, ol.Feature): S} callback Called with each feature
+ *     whose bounding box intersects the provided extent.
+ * @param {T=} opt_this The object to use as `this` in the callback.
+ * @return {S|undefined} The return value from the last call to the callback.
+ * @template T,S
+ * @api
+ */
+ol.source.Vector.prototype.forEachFeatureInExtent =
+    function(extent, callback, opt_this) {
+  return this.rBush_.forEachInExtent(extent, callback, opt_this);
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} resolution Resolution.
+ * @param {function(this: T, ol.Feature): S} f Callback.
+ * @param {T=} opt_this The object to use as `this` in `f`.
+ * @return {S|undefined}
+ * @template T,S
+ */
+ol.source.Vector.prototype.forEachFeatureInExtentAtResolution =
+    function(extent, resolution, f, opt_this) {
+  return this.forEachFeatureInExtent(extent, f, opt_this);
+};
+
+
+/**
+ * Iterate through all features whose geometry intersects the provided extent,
+ * calling the callback with each feature.  If the callback returns a "truthy"
+ * value, iteration will stop and the function will return the same value.
+ *
+ * If you only want to test for bounding box intersection, call the
+ * {@link ol.source.Vector#forEachFeatureInExtent
+ * source.forEachFeatureInExtent()} method instead.
+ *
+ * @param {ol.Extent} extent Extent.
+ * @param {function(this: T, ol.Feature): S} callback Called with each feature
+ *     whose geometry intersects the provided extent.
+ * @param {T=} opt_this The object to use as `this` in the callback.
+ * @return {S|undefined} The return value from the last call to the callback.
+ * @template T,S
+ * @api
+ */
+ol.source.Vector.prototype.forEachFeatureIntersectingExtent =
+    function(extent, callback, opt_this) {
+  return this.forEachFeatureInExtent(extent,
+      /**
+       * @param {ol.Feature} feature Feature.
+       * @return {S|undefined}
+       * @template S
+       */
+      function(feature) {
+        var geometry = feature.getGeometry();
+        goog.asserts.assert(goog.isDefAndNotNull(geometry));
+        if (geometry.intersectsExtent(extent)) {
+          var result = callback.call(opt_this, feature);
+          if (result) {
+            return result;
+          }
+        }
+      });
+};
+
+
+/**
+ * Get all features on the source.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.source.Vector.prototype.getFeatures = function() {
+  var features = this.rBush_.getAll();
+  if (!goog.object.isEmpty(this.nullGeometryFeatures_)) {
+    goog.array.extend(
+        features, goog.object.getValues(this.nullGeometryFeatures_));
+  }
+  return features;
+};
+
+
+/**
+ * Get all features whose geometry intersects the provided coordinate.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @return {Array.<ol.Feature>} Features.
+ * @api stable
+ */
+ol.source.Vector.prototype.getFeaturesAtCoordinate = function(coordinate) {
+  var features = [];
+  this.forEachFeatureAtCoordinate(coordinate, function(feature) {
+    features.push(feature);
+  });
+  return features;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @return {Array.<ol.Feature>} Features.
+ */
+ol.source.Vector.prototype.getFeaturesInExtent = function(extent) {
+  return this.rBush_.getInExtent(extent);
+};
+
+
+/**
+ * Get the closest feature to the provided coordinate.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @return {ol.Feature} Closest feature.
+ * @api stable
+ */
+ol.source.Vector.prototype.getClosestFeatureToCoordinate =
+    function(coordinate) {
+  // Find the closest feature using branch and bound.  We start searching an
+  // infinite extent, and find the distance from the first feature found.  This
+  // becomes the closest feature.  We then compute a smaller extent which any
+  // closer feature must intersect.  We continue searching with this smaller
+  // extent, trying to find a closer feature.  Every time we find a closer
+  // feature, we update the extent being searched so that any even closer
+  // feature must intersect it.  We continue until we run out of features.
+  var x = coordinate[0];
+  var y = coordinate[1];
+  var closestFeature = null;
+  var closestPoint = [NaN, NaN];
+  var minSquaredDistance = Infinity;
+  var extent = [-Infinity, -Infinity, Infinity, Infinity];
+  this.rBush_.forEachInExtent(extent,
+      /**
+       * @param {ol.Feature} feature Feature.
+       */
+      function(feature) {
+        var geometry = feature.getGeometry();
+        goog.asserts.assert(goog.isDefAndNotNull(geometry));
+        var previousMinSquaredDistance = minSquaredDistance;
+        minSquaredDistance = geometry.closestPointXY(
+            x, y, closestPoint, minSquaredDistance);
+        if (minSquaredDistance < previousMinSquaredDistance) {
+          closestFeature = feature;
+          // This is sneaky.  Reduce the extent that it is currently being
+          // searched while the R-Tree traversal using this same extent object
+          // is still in progress.  This is safe because the new extent is
+          // strictly contained by the old extent.
+          var minDistance = Math.sqrt(minSquaredDistance);
+          extent[0] = x - minDistance;
+          extent[1] = y - minDistance;
+          extent[2] = x + minDistance;
+          extent[3] = y + minDistance;
+        }
+      });
+  return closestFeature;
+};
+
+
+/**
+ * Get the extent of the features currently in the source.
+ * @return {ol.Extent} Extent.
+ * @api stable
+ */
+ol.source.Vector.prototype.getExtent = function() {
+  return this.rBush_.getExtent();
+};
+
+
+/**
+ * Get a feature by its identifier (the value returned by feature.getId()).
+ * Note that the index treats string and numeric identifiers as the same.  So
+ * `source.getFeatureById(2)` will return a feature with id `'2'` or `2`.
+ *
+ * @param {string|number} id Feature identifier.
+ * @return {ol.Feature} The feature (or `null` if not found).
+ * @api stable
+ */
+ol.source.Vector.prototype.getFeatureById = function(id) {
+  var feature = this.idIndex_[id.toString()];
+  return goog.isDef(feature) ? feature : null;
+};
+
+
+/**
+ * @param {goog.events.Event} event Event.
+ * @private
+ */
+ol.source.Vector.prototype.handleFeatureChange_ = function(event) {
+  var feature = /** @type {ol.Feature} */ (event.target);
+  var featureKey = goog.getUid(feature).toString();
+  var geometry = feature.getGeometry();
+  if (!goog.isDefAndNotNull(geometry)) {
+    if (!(featureKey in this.nullGeometryFeatures_)) {
+      this.rBush_.remove(feature);
+      this.nullGeometryFeatures_[featureKey] = feature;
+    }
+  } else {
+    var extent = geometry.getExtent();
+    if (featureKey in this.nullGeometryFeatures_) {
+      delete this.nullGeometryFeatures_[featureKey];
+      this.rBush_.insert(extent, feature);
+    } else {
+      this.rBush_.update(extent, feature);
+    }
+  }
+  var id = feature.getId();
+  var removed;
+  if (goog.isDef(id)) {
+    var sid = id.toString();
+    if (featureKey in this.undefIdIndex_) {
+      delete this.undefIdIndex_[featureKey];
+      this.idIndex_[sid] = feature;
+    } else {
+      if (this.idIndex_[sid] !== feature) {
+        removed = this.removeFromIdIndex_(feature);
+        goog.asserts.assert(removed,
+            'Expected feature to be removed from index');
+        this.idIndex_[sid] = feature;
+      }
+    }
+  } else {
+    if (!(featureKey in this.undefIdIndex_)) {
+      removed = this.removeFromIdIndex_(feature);
+      goog.asserts.assert(removed,
+          'Expected feature to be removed from index');
+      this.undefIdIndex_[featureKey] = feature;
+    } else {
+      goog.asserts.assert(this.undefIdIndex_[featureKey] === feature);
+    }
+  }
+  this.changed();
+  this.dispatchEvent(new ol.source.VectorEvent(
+      ol.source.VectorEventType.CHANGEFEATURE, feature));
+};
+
+
+/**
+ * @return {boolean} Is empty.
+ */
+ol.source.Vector.prototype.isEmpty = function() {
+  return this.rBush_.isEmpty() &&
+      goog.object.isEmpty(this.nullGeometryFeatures_);
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} resolution Resolution.
+ * @param {ol.proj.Projection} projection Projection.
+ */
+ol.source.Vector.prototype.loadFeatures = goog.nullFunction;
+
+
+/**
+ * Remove a single feature from the source.  If you want to remove all features
+ * at once, use the {@link ol.source.Vector#clear source.clear()} method
+ * instead.
+ * @param {ol.Feature} feature Feature to remove.
+ * @api stable
+ */
+ol.source.Vector.prototype.removeFeature = function(feature) {
+  var featureKey = goog.getUid(feature).toString();
+  if (featureKey in this.nullGeometryFeatures_) {
+    delete this.nullGeometryFeatures_[featureKey];
+  } else {
+    this.rBush_.remove(feature);
+  }
+  this.removeFeatureInternal(feature);
+  this.changed();
+};
+
+
+/**
+ * Remove feature without firing a `change` event.
+ * @param {ol.Feature} feature Feature.
+ * @protected
+ */
+ol.source.Vector.prototype.removeFeatureInternal = function(feature) {
+  var featureKey = goog.getUid(feature).toString();
+  goog.asserts.assert(featureKey in this.featureChangeKeys_);
+  goog.array.forEach(this.featureChangeKeys_[featureKey],
+      goog.events.unlistenByKey);
+  delete this.featureChangeKeys_[featureKey];
+  var id = feature.getId();
+  if (goog.isDef(id)) {
+    delete this.idIndex_[id.toString()];
+  } else {
+    delete this.undefIdIndex_[featureKey];
+  }
+  this.dispatchEvent(new ol.source.VectorEvent(
+      ol.source.VectorEventType.REMOVEFEATURE, feature));
+};
+
+
+/**
+ * Remove a feature from the id index.  Called internally when the feature id
+ * may have changed.
+ * @param {ol.Feature} feature The feature.
+ * @return {boolean} Removed the feature from the index.
+ * @private
+ */
+ol.source.Vector.prototype.removeFromIdIndex_ = function(feature) {
+  var removed = false;
+  for (var id in this.idIndex_) {
+    if (this.idIndex_[id] === feature) {
+      delete this.idIndex_[id];
+      removed = true;
+      break;
+    }
+  }
+  return removed;
+};
+
+
+
+/**
+ * @classdesc
+ * Events emitted by {@link ol.source.Vector} instances are instances of this
+ * type.
+ *
+ * @constructor
+ * @extends {goog.events.Event}
+ * @implements {oli.source.VectorEvent}
+ * @param {string} type Type.
+ * @param {ol.Feature=} opt_feature Feature.
+ */
+ol.source.VectorEvent = function(type, opt_feature) {
+
+  goog.base(this, type);
+
+  /**
+   * The feature being added or removed.
+   * @type {ol.Feature|undefined}
+   * @api stable
+   */
+  this.feature = opt_feature;
+
+};
+goog.inherits(ol.source.VectorEvent, goog.events.Event);
diff --git a/src/ol/source/wmssource.js b/src/ol/source/wmssource.js
new file mode 100644
index 0000000..4f69175
--- /dev/null
+++ b/src/ol/source/wmssource.js
@@ -0,0 +1,17 @@
+goog.provide('ol.source.wms');
+goog.provide('ol.source.wms.ServerType');
+
+
+/**
+ * Available server types: `'carmentaserver'`, `'geoserver'`, `'mapserver'`,
+ *     `'qgis'`. These are servers that have vendor parameters beyond the WMS
+ *     specification that OpenLayers can make use of.
+ * @enum {string}
+ * @api
+ */
+ol.source.wms.ServerType = {
+  CARMENTA_SERVER: 'carmentaserver',
+  GEOSERVER: 'geoserver',
+  MAPSERVER: 'mapserver',
+  QGIS: 'qgis'
+};
diff --git a/src/ol/source/wmssource.jsdoc b/src/ol/source/wmssource.jsdoc
new file mode 100644
index 0000000..ad87764
--- /dev/null
+++ b/src/ol/source/wmssource.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.source.wms
+ */
diff --git a/src/ol/source/wmtssource.js b/src/ol/source/wmtssource.js
new file mode 100644
index 0000000..ad45880
--- /dev/null
+++ b/src/ol/source/wmtssource.js
@@ -0,0 +1,337 @@
+goog.provide('ol.source.WMTS');
+goog.provide('ol.source.WMTSRequestEncoding');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.math');
+goog.require('goog.object');
+goog.require('goog.uri.utils');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.TileUrlFunctionType');
+goog.require('ol.extent');
+goog.require('ol.proj');
+goog.require('ol.source.TileImage');
+goog.require('ol.tilecoord');
+goog.require('ol.tilegrid.WMTS');
+
+
+/**
+ * Request encoding. One of 'KVP', 'REST'.
+ * @enum {string}
+ * @api
+ */
+ol.source.WMTSRequestEncoding = {
+  KVP: 'KVP',  // see spec §8
+  REST: 'REST' // see spec §10
+};
+
+
+
+/**
+ * @classdesc
+ * Layer source for tile data from WMTS servers.
+ *
+ * @constructor
+ * @extends {ol.source.TileImage}
+ * @param {olx.source.WMTSOptions} options WMTS options.
+ * @api
+ */
+ol.source.WMTS = function(options) {
+
+  // TODO: add support for TileMatrixLimits
+
+  var version = goog.isDef(options.version) ? options.version : '1.0.0';
+  var format = goog.isDef(options.format) ? options.format : 'image/jpeg';
+
+  /**
+   * @private
+   * @type {Object}
+   */
+  this.dimensions_ = goog.isDef(options.dimensions) ? options.dimensions : {};
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.coordKeyPrefix_ = '';
+  this.resetCoordKeyPrefix_();
+
+  // FIXME: should we guess this requestEncoding from options.url(s)
+  //        structure? that would mean KVP only if a template is not provided.
+  var requestEncoding = goog.isDef(options.requestEncoding) ?
+      /** @type {ol.source.WMTSRequestEncoding} */ (options.requestEncoding) :
+      ol.source.WMTSRequestEncoding.KVP;
+
+  // FIXME: should we create a default tileGrid?
+  // we could issue a getCapabilities xhr to retrieve missing configuration
+  var tileGrid = options.tileGrid;
+
+  var context = {
+    'Layer': options.layer,
+    'Style': options.style,
+    'TileMatrixSet': options.matrixSet
+  };
+
+  if (requestEncoding == ol.source.WMTSRequestEncoding.KVP) {
+    goog.object.extend(context, {
+      'Service': 'WMTS',
+      'Request': 'GetTile',
+      'Version': version,
+      'Format': format
+    });
+  }
+
+  var dimensions = this.dimensions_;
+
+  /**
+   * @param {string} template Template.
+   * @return {ol.TileUrlFunctionType} Tile URL function.
+   */
+  function createFromWMTSTemplate(template) {
+
+    // TODO: we may want to create our own appendParams function so that params
+    // order conforms to wmts spec guidance, and so that we can avoid to escape
+    // special template params
+
+    template = (requestEncoding == ol.source.WMTSRequestEncoding.KVP) ?
+        goog.uri.utils.appendParamsFromMap(template, context) :
+        template.replace(/\{(\w+?)\}/g, function(m, p) {
+          return (p in context) ? context[p] : m;
+        });
+
+    return (
+        /**
+         * @param {ol.TileCoord} tileCoord Tile coordinate.
+         * @param {number} pixelRatio Pixel ratio.
+         * @param {ol.proj.Projection} projection Projection.
+         * @return {string|undefined} Tile URL.
+         */
+        function(tileCoord, pixelRatio, projection) {
+          if (goog.isNull(tileCoord)) {
+            return undefined;
+          } else {
+            var localContext = {
+              'TileMatrix': tileGrid.getMatrixId(tileCoord[0]),
+              'TileCol': tileCoord[1],
+              'TileRow': tileCoord[2]
+            };
+            goog.object.extend(localContext, dimensions);
+            var url = template;
+            if (requestEncoding == ol.source.WMTSRequestEncoding.KVP) {
+              url = goog.uri.utils.appendParamsFromMap(url, localContext);
+            } else {
+              url = url.replace(/\{(\w+?)\}/g, function(m, p) {
+                return localContext[p];
+              });
+            }
+            return url;
+          }
+        });
+  }
+
+  var tileUrlFunction = ol.TileUrlFunction.nullTileUrlFunction;
+  var urls = options.urls;
+  if (!goog.isDef(urls) && goog.isDef(options.url)) {
+    urls = ol.TileUrlFunction.expandUrl(options.url);
+  }
+  if (goog.isDef(urls)) {
+    tileUrlFunction = ol.TileUrlFunction.createFromTileUrlFunctions(
+        goog.array.map(urls, createFromWMTSTemplate));
+  }
+
+  var tmpExtent = ol.extent.createEmpty();
+  var tmpTileCoord = [0, 0, 0];
+  tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(
+      /**
+       * @param {ol.TileCoord} tileCoord Tile coordinate.
+       * @param {ol.proj.Projection} projection Projection.
+       * @param {ol.TileCoord=} opt_tileCoord Tile coordinate.
+       * @return {ol.TileCoord} Tile coordinate.
+       */
+      function(tileCoord, projection, opt_tileCoord) {
+        goog.asserts.assert(!goog.isNull(tileGrid));
+        if (tileGrid.getResolutions().length <= tileCoord[0]) {
+          return null;
+        }
+        var x = tileCoord[1];
+        var y = -tileCoord[2] - 1;
+        var tileExtent = tileGrid.getTileCoordExtent(tileCoord, tmpExtent);
+        var extent = projection.getExtent();
+
+        if (!goog.isNull(extent) && projection.isGlobal()) {
+          var numCols = Math.ceil(
+              ol.extent.getWidth(extent) /
+              ol.extent.getWidth(tileExtent));
+          x = goog.math.modulo(x, numCols);
+          tmpTileCoord[0] = tileCoord[0];
+          tmpTileCoord[1] = x;
+          tmpTileCoord[2] = tileCoord[2];
+          tileExtent = tileGrid.getTileCoordExtent(tmpTileCoord, tmpExtent);
+        }
+        if (!ol.extent.intersects(tileExtent, extent) ||
+            ol.extent.touches(tileExtent, extent)) {
+          return null;
+        }
+        return ol.tilecoord.createOrUpdate(tileCoord[0], x, y, opt_tileCoord);
+      },
+      tileUrlFunction);
+
+  goog.base(this, {
+    attributions: options.attributions,
+    crossOrigin: options.crossOrigin,
+    logo: options.logo,
+    projection: options.projection,
+    tileClass: options.tileClass,
+    tileGrid: tileGrid,
+    tileLoadFunction: options.tileLoadFunction,
+    tilePixelRatio: options.tilePixelRatio,
+    tileUrlFunction: tileUrlFunction
+  });
+
+};
+goog.inherits(ol.source.WMTS, ol.source.TileImage);
+
+
+/**
+ * Get the dimensions, i.e. those passed to the constructor through the
+ * "dimensions" option, and possibly updated using the updateDimensions
+ * method.
+ * @return {Object} Dimensions.
+ * @api
+ */
+ol.source.WMTS.prototype.getDimensions = function() {
+  return this.dimensions_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.WMTS.prototype.getKeyZXY = function(z, x, y) {
+  return this.coordKeyPrefix_ + goog.base(this, 'getKeyZXY', z, x, y);
+};
+
+
+/**
+ * @private
+ */
+ol.source.WMTS.prototype.resetCoordKeyPrefix_ = function() {
+  var i = 0;
+  var res = [];
+  for (var key in this.dimensions_) {
+    res[i++] = key + '-' + this.dimensions_[key];
+  }
+  this.coordKeyPrefix_ = res.join('/');
+};
+
+
+/**
+ * Update the dimensions.
+ * @param {Object} dimensions Dimensions.
+ * @api
+ */
+ol.source.WMTS.prototype.updateDimensions = function(dimensions) {
+  goog.object.extend(this.dimensions_, dimensions);
+  this.resetCoordKeyPrefix_();
+  this.changed();
+};
+
+
+/**
+ * @param {Object} wmtsCap An object representing the capabilities document.
+ * @param {string} layer The layer identifier.
+ * @return {olx.source.WMTSOptions} WMTS source options object.
+ */
+ol.source.WMTS.optionsFromCapabilities = function(wmtsCap, layer) {
+
+  /* jshint -W069 */
+
+  // TODO: add support for TileMatrixLimits
+
+  var layers = wmtsCap['contents']['layers'];
+  var l = goog.array.find(layers, function(elt, index, array) {
+    return elt['identifier'] == layer;
+  });
+  goog.asserts.assert(!goog.isNull(l));
+  goog.asserts.assert(l['tileMatrixSetLinks'].length > 0);
+  var matrixSet = /** @type {string} */
+      (l['tileMatrixSetLinks'][0]['tileMatrixSet']);
+  var format = /** @type {string} */ (l['formats'][0]);
+  var idx = goog.array.findIndex(l['styles'], function(elt, index, array) {
+    return elt['isDefault'];
+  });
+  if (idx < 0) {
+    idx = 0;
+  }
+  var style = /** @type {string} */ (l['styles'][idx]['identifier']);
+
+  var dimensions = {};
+  goog.array.forEach(l['dimensions'], function(elt, index, array) {
+    var key = elt['identifier'];
+    var value = elt['default'];
+    if (goog.isDef(value)) {
+      goog.asserts.assert(goog.array.contains(elt['values'], value));
+    } else {
+      value = elt['values'][0];
+    }
+    goog.asserts.assert(goog.isDef(value));
+    dimensions[key] = value;
+  });
+
+  var matrixSets = wmtsCap['contents']['tileMatrixSets'];
+  goog.asserts.assert(matrixSet in matrixSets);
+  var matrixSetObj = matrixSets[matrixSet];
+
+  var tileGrid = ol.tilegrid.WMTS.createFromCapabilitiesMatrixSet(
+      matrixSetObj);
+
+  var projection = ol.proj.get(matrixSetObj['supportedCRS']);
+
+  var gets = wmtsCap['operationsMetadata']['GetTile']['dcp']['http']['get'];
+  var encodings = goog.object.getKeys(
+      gets[0]['constraints']['GetEncoding']['allowedValues']);
+  goog.asserts.assert(encodings.length > 0);
+
+  var urls;
+  var requestEncoding;
+  switch (encodings[0]) {
+    case 'REST':
+    case 'RESTful':
+      // The OGC documentation is not clear if we should use REST or RESTful,
+      // ArcGis use RESTful, and OpenLayers use REST.
+      requestEncoding = ol.source.WMTSRequestEncoding.REST;
+      goog.asserts.assert(l['resourceUrls'].hasOwnProperty('tile'));
+      goog.asserts.assert(l['resourceUrls']['tile'].hasOwnProperty(format));
+      urls = /** @type {Array.<string>} */
+          (l['resourceUrls']['tile'][format]);
+      break;
+    case 'KVP':
+      requestEncoding = ol.source.WMTSRequestEncoding.KVP;
+      urls = [];
+      goog.array.forEach(gets, function(elt, index, array) {
+        if (elt['constraints']['GetEncoding']['allowedValues'].hasOwnProperty(
+            ol.source.WMTSRequestEncoding.KVP)) {
+          urls.push(/** @type {string} */ (elt['url']));
+        }
+      });
+      goog.asserts.assert(urls.length > 0);
+      break;
+    default:
+      goog.asserts.fail();
+  }
+
+  return {
+    urls: urls,
+    layer: layer,
+    matrixSet: matrixSet,
+    format: format,
+    projection: projection,
+    requestEncoding: requestEncoding,
+    tileGrid: tileGrid,
+    style: style,
+    dimensions: dimensions
+  };
+
+  /* jshint +W069 */
+
+};
diff --git a/src/ol/source/xyzsource.js b/src/ol/source/xyzsource.js
new file mode 100644
index 0000000..1b5d2ec
--- /dev/null
+++ b/src/ol/source/xyzsource.js
@@ -0,0 +1,86 @@
+goog.provide('ol.source.XYZ');
+
+goog.require('ol.Attribution');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.source.TileImage');
+goog.require('ol.tilegrid.XYZ');
+
+
+
+/**
+ * @classdesc
+ * Layer source for tile data with URLs in a set XYZ format.
+ *
+ * @constructor
+ * @extends {ol.source.TileImage}
+ * @param {olx.source.XYZOptions} options XYZ options.
+ * @api stable
+ */
+ol.source.XYZ = function(options) {
+  var projection = goog.isDef(options.projection) ?
+      options.projection : 'EPSG:3857';
+
+  var tileGrid = new ol.tilegrid.XYZ({
+    extent: ol.tilegrid.extentFromProjection(projection),
+    maxZoom: options.maxZoom,
+    tileSize: options.tileSize
+  });
+
+  goog.base(this, {
+    attributions: options.attributions,
+    crossOrigin: options.crossOrigin,
+    logo: options.logo,
+    projection: projection,
+    tileGrid: tileGrid,
+    tileLoadFunction: options.tileLoadFunction,
+    tilePixelRatio: options.tilePixelRatio,
+    tileUrlFunction: ol.TileUrlFunction.nullTileUrlFunction
+  });
+
+  /**
+   * @private
+   * @type {ol.TileCoordTransformType}
+   */
+  this.tileCoordTransform_ = tileGrid.createTileCoordTransform({
+    wrapX: options.wrapX
+  });
+
+  if (goog.isDef(options.tileUrlFunction)) {
+    this.setTileUrlFunction(options.tileUrlFunction);
+  } else if (goog.isDef(options.urls)) {
+    this.setUrls(options.urls);
+  } else if (goog.isDef(options.url)) {
+    this.setUrl(options.url);
+  }
+
+};
+goog.inherits(ol.source.XYZ, ol.source.TileImage);
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.source.XYZ.prototype.setTileUrlFunction = function(tileUrlFunction) {
+  goog.base(this, 'setTileUrlFunction',
+      ol.TileUrlFunction.withTileCoordTransform(
+          this.tileCoordTransform_, tileUrlFunction));
+};
+
+
+/**
+ * @param {string} url URL.
+ * @api stable
+ */
+ol.source.XYZ.prototype.setUrl = function(url) {
+  this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(
+      ol.TileUrlFunction.expandUrl(url)));
+};
+
+
+/**
+ * @param {Array.<string>} urls URLs.
+ */
+ol.source.XYZ.prototype.setUrls = function(urls) {
+  this.setTileUrlFunction(ol.TileUrlFunction.createFromTemplates(urls));
+};
diff --git a/src/ol/source/zoomifysource.js b/src/ol/source/zoomifysource.js
new file mode 100644
index 0000000..7c7bd3d
--- /dev/null
+++ b/src/ol/source/zoomifysource.js
@@ -0,0 +1,185 @@
+goog.provide('ol.source.Zoomify');
+
+goog.require('goog.asserts');
+goog.require('ol');
+goog.require('ol.ImageTile');
+goog.require('ol.TileCoord');
+goog.require('ol.TileState');
+goog.require('ol.TileUrlFunction');
+goog.require('ol.dom');
+goog.require('ol.proj');
+goog.require('ol.source.TileImage');
+goog.require('ol.tilegrid.Zoomify');
+
+
+/**
+ * @enum {string}
+ */
+ol.source.ZoomifyTierSizeCalculation = {
+  DEFAULT: 'default',
+  TRUNCATED: 'truncated'
+};
+
+
+
+/**
+ * @classdesc
+ * Layer source for tile data in Zoomify format.
+ *
+ * @constructor
+ * @extends {ol.source.TileImage}
+ * @param {olx.source.ZoomifyOptions=} opt_options Options.
+ * @api stable
+ */
+ol.source.Zoomify = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var size = options.size;
+  var tierSizeCalculation = goog.isDef(options.tierSizeCalculation) ?
+      options.tierSizeCalculation :
+      ol.source.ZoomifyTierSizeCalculation.DEFAULT;
+
+  var imageWidth = size[0];
+  var imageHeight = size[1];
+  var tierSizeInTiles = [];
+  var tileSize = ol.DEFAULT_TILE_SIZE;
+
+  switch (tierSizeCalculation) {
+    case ol.source.ZoomifyTierSizeCalculation.DEFAULT:
+      while (imageWidth > tileSize || imageHeight > tileSize) {
+        tierSizeInTiles.push([
+          Math.ceil(imageWidth / tileSize),
+          Math.ceil(imageHeight / tileSize)
+        ]);
+        tileSize += tileSize;
+      }
+      break;
+    case ol.source.ZoomifyTierSizeCalculation.TRUNCATED:
+      var width = imageWidth;
+      var height = imageHeight;
+      while (width > tileSize || height > tileSize) {
+        tierSizeInTiles.push([
+          Math.ceil(width / tileSize),
+          Math.ceil(height / tileSize)
+        ]);
+        width >>= 1;
+        height >>= 1;
+      }
+      break;
+    default:
+      goog.asserts.fail();
+      break;
+  }
+
+  tierSizeInTiles.push([1, 1]);
+  tierSizeInTiles.reverse();
+
+  var resolutions = [1];
+  var tileCountUpToTier = [0];
+  var i, ii;
+  for (i = 1, ii = tierSizeInTiles.length; i < ii; i++) {
+    resolutions.push(1 << i);
+    tileCountUpToTier.push(
+        tierSizeInTiles[i - 1][0] * tierSizeInTiles[i - 1][1] +
+        tileCountUpToTier[i - 1]
+    );
+  }
+  resolutions.reverse();
+
+  var tileGrid = new ol.tilegrid.Zoomify({
+    resolutions: resolutions
+  });
+
+  var url = options.url;
+  var tileUrlFunction = ol.TileUrlFunction.withTileCoordTransform(
+      tileGrid.createTileCoordTransform({extent: [0, 0, size[0], size[1]]}),
+      /**
+       * @this {ol.source.TileImage}
+       * @param {ol.TileCoord} tileCoord Tile Coordinate.
+       * @param {number} pixelRatio Pixel ratio.
+       * @param {ol.proj.Projection} projection Projection.
+       * @return {string|undefined} Tile URL.
+       */
+      function(tileCoord, pixelRatio, projection) {
+        if (goog.isNull(tileCoord)) {
+          return undefined;
+        } else {
+          var tileCoordZ = tileCoord[0];
+          var tileCoordX = tileCoord[1];
+          var tileCoordY = tileCoord[2];
+          var tileIndex =
+              tileCoordX +
+              tileCoordY * tierSizeInTiles[tileCoordZ][0] +
+              tileCountUpToTier[tileCoordZ];
+          var tileGroup = (tileIndex / ol.DEFAULT_TILE_SIZE) | 0;
+          return url + 'TileGroup' + tileGroup + '/' +
+              tileCoordZ + '-' + tileCoordX + '-' + tileCoordY + '.jpg';
+        }
+      });
+
+  goog.base(this, {
+    attributions: options.attributions,
+    crossOrigin: options.crossOrigin,
+    logo: options.logo,
+    tileClass: ol.source.ZoomifyTile_,
+    tileGrid: tileGrid,
+    tileUrlFunction: tileUrlFunction
+  });
+
+};
+goog.inherits(ol.source.Zoomify, ol.source.TileImage);
+
+
+
+/**
+ * @constructor
+ * @extends {ol.ImageTile}
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {ol.TileState} state State.
+ * @param {string} src Image source URI.
+ * @param {?string} crossOrigin Cross origin.
+ * @param {ol.TileLoadFunctionType} tileLoadFunction Tile load function.
+ * @private
+ */
+ol.source.ZoomifyTile_ = function(
+    tileCoord, state, src, crossOrigin, tileLoadFunction) {
+
+  goog.base(this, tileCoord, state, src, crossOrigin, tileLoadFunction);
+
+  /**
+   * @private
+   * @type {Object.<string,
+   *                HTMLCanvasElement|HTMLImageElement|HTMLVideoElement>}
+   */
+  this.zoomifyImageByContext_ = {};
+
+};
+goog.inherits(ol.source.ZoomifyTile_, ol.ImageTile);
+
+
+/**
+ * @inheritDoc
+ */
+ol.source.ZoomifyTile_.prototype.getImage = function(opt_context) {
+  var tileSize = ol.DEFAULT_TILE_SIZE;
+  var key = goog.isDef(opt_context) ? goog.getUid(opt_context).toString() : '';
+  if (key in this.zoomifyImageByContext_) {
+    return this.zoomifyImageByContext_[key];
+  } else {
+    var image = goog.base(this, 'getImage', opt_context);
+    if (this.state == ol.TileState.LOADED) {
+      if (image.width == tileSize && image.height == tileSize) {
+        this.zoomifyImageByContext_[key] = image;
+        return image;
+      } else {
+        var context = ol.dom.createCanvasContext2D(tileSize, tileSize);
+        context.drawImage(image, 0, 0);
+        this.zoomifyImageByContext_[key] = context.canvas;
+        return context.canvas;
+      }
+    } else {
+      return image;
+    }
+  }
+};
diff --git a/src/ol/sphere/normal.js b/src/ol/sphere/normal.js
new file mode 100644
index 0000000..70e6f8e
--- /dev/null
+++ b/src/ol/sphere/normal.js
@@ -0,0 +1,11 @@
+goog.provide('ol.sphere.NORMAL');
+
+goog.require('ol.Sphere');
+
+
+/**
+ * The normal sphere.
+ * @const
+ * @type {ol.Sphere}
+ */
+ol.sphere.NORMAL = new ol.Sphere(6370997);
diff --git a/src/ol/sphere/sphere.js b/src/ol/sphere/sphere.js
new file mode 100644
index 0000000..7dd3790
--- /dev/null
+++ b/src/ol/sphere/sphere.js
@@ -0,0 +1,236 @@
+/**
+ * @license
+ * Latitude/longitude spherical geodesy formulae taken from
+ * http://www.movable-type.co.uk/scripts/latlong.html
+ * Licenced under CC-BY-3.0.
+ */
+
+// FIXME add intersection of two paths given start points and bearings
+// FIXME add rhumb lines
+
+goog.provide('ol.Sphere');
+
+goog.require('goog.math');
+
+
+
+/**
+ * @classdesc
+ * Class to create objects that can be used with {@link
+ * ol.geom.Polygon.circular}.
+ *
+ * For example to create a sphere whose radius is equal to the semi-major
+ * axis of the WGS84 ellipsoid:
+ *
+ * ```js
+ * var wgs84Sphere= new ol.Sphere(6378137);
+ * ```
+ *
+ * @constructor
+ * @param {number} radius Radius.
+ * @api
+ */
+ol.Sphere = function(radius) {
+
+  /**
+   * @type {number}
+   */
+  this.radius = radius;
+
+};
+
+
+/**
+ * Returns the distance from c1 to c2 using the spherical law of cosines.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 2.
+ * @return {number} Spherical law of cosines distance.
+ */
+ol.Sphere.prototype.cosineDistance = function(c1, c2) {
+  var lat1 = goog.math.toRadians(c1[1]);
+  var lat2 = goog.math.toRadians(c2[1]);
+  var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
+  return this.radius * Math.acos(
+      Math.sin(lat1) * Math.sin(lat2) +
+      Math.cos(lat1) * Math.cos(lat2) * Math.cos(deltaLon));
+};
+
+
+/**
+ * Returns the distance of c3 from the great circle path defined by c1 and c2.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 2.
+ * @param {ol.Coordinate} c3 Coordinate 3.
+ * @return {number} Cross-track distance.
+ */
+ol.Sphere.prototype.crossTrackDistance = function(c1, c2, c3) {
+  var d13 = this.cosineDistance(c1, c2);
+  var theta12 = goog.math.toRadians(this.initialBearing(c1, c2));
+  var theta13 = goog.math.toRadians(this.initialBearing(c1, c3));
+  return this.radius *
+      Math.asin(Math.sin(d13 / this.radius) * Math.sin(theta13 - theta12));
+};
+
+
+/**
+ * Returns the distance from c1 to c2 using Pythagoras's theorem on an
+ * equirectangular projection.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 2.
+ * @return {number} Equirectangular distance.
+ */
+ol.Sphere.prototype.equirectangularDistance = function(c1, c2) {
+  var lat1 = goog.math.toRadians(c1[1]);
+  var lat2 = goog.math.toRadians(c2[1]);
+  var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
+  var x = deltaLon * Math.cos((lat1 + lat2) / 2);
+  var y = lat2 - lat1;
+  return this.radius * Math.sqrt(x * x + y * y);
+};
+
+
+/**
+ * Returns the final bearing from c1 to c2.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 2.
+ * @return {number} Initial bearing.
+ */
+ol.Sphere.prototype.finalBearing = function(c1, c2) {
+  return (this.initialBearing(c2, c1) + 180) % 360;
+};
+
+
+/**
+ * Returns the distance from c1 to c2 using the haversine formula.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 2.
+ * @return {number} Haversine distance.
+ */
+ol.Sphere.prototype.haversineDistance = function(c1, c2) {
+  var lat1 = goog.math.toRadians(c1[1]);
+  var lat2 = goog.math.toRadians(c2[1]);
+  var deltaLatBy2 = (lat2 - lat1) / 2;
+  var deltaLonBy2 = goog.math.toRadians(c2[0] - c1[0]) / 2;
+  var a = Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) +
+      Math.sin(deltaLonBy2) * Math.sin(deltaLonBy2) *
+      Math.cos(lat1) * Math.cos(lat2);
+  return 2 * this.radius * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
+};
+
+
+/**
+ * Returns the point at `fraction` along the segment of the great circle passing
+ * through c1 and c2.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 2.
+ * @param {number} fraction Fraction.
+ * @return {ol.Coordinate} Coordinate between c1 and c2.
+ */
+ol.Sphere.prototype.interpolate = function(c1, c2, fraction) {
+  var lat1 = goog.math.toRadians(c1[1]);
+  var lon1 = goog.math.toRadians(c1[0]);
+  var lat2 = goog.math.toRadians(c2[1]);
+  var lon2 = goog.math.toRadians(c2[0]);
+  var cosLat1 = Math.cos(lat1);
+  var sinLat1 = Math.sin(lat1);
+  var cosLat2 = Math.cos(lat2);
+  var sinLat2 = Math.sin(lat2);
+  var cosDeltaLon = Math.cos(lon2 - lon1);
+  var d = sinLat1 * sinLat2 + cosLat1 * cosLat2 * cosDeltaLon;
+  if (1 <= d) {
+    return c2.slice();
+  }
+  d = fraction * Math.acos(d);
+  var cosD = Math.cos(d);
+  var sinD = Math.sin(d);
+  var y = Math.sin(lon2 - lon1) * cosLat2;
+  var x = cosLat1 * sinLat2 - sinLat1 * cosLat2 * cosDeltaLon;
+  var theta = Math.atan2(y, x);
+  var lat = Math.asin(sinLat1 * cosD + cosLat1 * sinD * Math.cos(theta));
+  var lon = lon1 + Math.atan2(Math.sin(theta) * sinD * cosLat1,
+                              cosD - sinLat1 * Math.sin(lat));
+  return [goog.math.toDegrees(lon), goog.math.toDegrees(lat)];
+};
+
+
+/**
+ * Returns the initial bearing from c1 to c2.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 2.
+ * @return {number} Initial bearing.
+ */
+ol.Sphere.prototype.initialBearing = function(c1, c2) {
+  var lat1 = goog.math.toRadians(c1[1]);
+  var lat2 = goog.math.toRadians(c2[1]);
+  var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
+  var y = Math.sin(deltaLon) * Math.cos(lat2);
+  var x = Math.cos(lat1) * Math.sin(lat2) -
+      Math.sin(lat1) * Math.cos(lat2) * Math.cos(deltaLon);
+  return goog.math.toDegrees(Math.atan2(y, x));
+};
+
+
+/**
+ * Returns the maximum latitude of the great circle defined by bearing and
+ * latitude.
+ *
+ * @param {number} bearing Bearing.
+ * @param {number} latitude Latitude.
+ * @return {number} Maximum latitude.
+ */
+ol.Sphere.prototype.maximumLatitude = function(bearing, latitude) {
+  return Math.cos(Math.abs(Math.sin(goog.math.toRadians(bearing)) *
+                           Math.cos(goog.math.toRadians(latitude))));
+};
+
+
+/**
+ * Returns the midpoint between c1 and c2.
+ *
+ * @param {ol.Coordinate} c1 Coordinate 1.
+ * @param {ol.Coordinate} c2 Coordinate 2.
+ * @return {ol.Coordinate} Midpoint.
+ */
+ol.Sphere.prototype.midpoint = function(c1, c2) {
+  var lat1 = goog.math.toRadians(c1[1]);
+  var lat2 = goog.math.toRadians(c2[1]);
+  var lon1 = goog.math.toRadians(c1[0]);
+  var deltaLon = goog.math.toRadians(c2[0] - c1[0]);
+  var Bx = Math.cos(lat2) * Math.cos(deltaLon);
+  var By = Math.cos(lat2) * Math.sin(deltaLon);
+  var cosLat1PlusBx = Math.cos(lat1) + Bx;
+  var lat = Math.atan2(Math.sin(lat1) + Math.sin(lat2),
+                       Math.sqrt(cosLat1PlusBx * cosLat1PlusBx + By * By));
+  var lon = lon1 + Math.atan2(By, cosLat1PlusBx);
+  return [goog.math.toDegrees(lon), goog.math.toDegrees(lat)];
+};
+
+
+/**
+ * Returns the coordinate at the given distance and bearing from `c1`.
+ *
+ * @param {ol.Coordinate} c1 The origin point (`[lon, lat]` in degrees).
+ * @param {number} distance The great-circle distance between the origin
+ *     point and the target point.
+ * @param {number} bearing The bearing (in radians).
+ * @return {ol.Coordinate} The target point.
+ */
+ol.Sphere.prototype.offset = function(c1, distance, bearing) {
+  var lat1 = goog.math.toRadians(c1[1]);
+  var lon1 = goog.math.toRadians(c1[0]);
+  var dByR = distance / this.radius;
+  var lat = Math.asin(
+      Math.sin(lat1) * Math.cos(dByR) +
+      Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing));
+  var lon = lon1 + Math.atan2(
+      Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1),
+      Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat));
+  return [goog.math.toDegrees(lon), goog.math.toDegrees(lat)];
+};
diff --git a/src/ol/sphere/wgs84sphere.js b/src/ol/sphere/wgs84sphere.js
new file mode 100644
index 0000000..19624fd
--- /dev/null
+++ b/src/ol/sphere/wgs84sphere.js
@@ -0,0 +1,11 @@
+goog.provide('ol.sphere.WGS84');
+
+goog.require('ol.Sphere');
+
+
+/**
+ * A sphere with radius equal to the semi-major axis of the WGS84 ellipsoid.
+ * @const
+ * @type {ol.Sphere}
+ */
+ol.sphere.WGS84 = new ol.Sphere(6378137);
diff --git a/src/ol/structs/checksum.js b/src/ol/structs/checksum.js
new file mode 100644
index 0000000..ff72308
--- /dev/null
+++ b/src/ol/structs/checksum.js
@@ -0,0 +1,16 @@
+goog.provide('ol.structs.IHasChecksum');
+
+
+
+/**
+ * @interface
+ */
+ol.structs.IHasChecksum = function() {
+};
+
+
+/**
+ * @return {string} The checksum.
+ */
+ol.structs.IHasChecksum.prototype.getChecksum = function() {
+};
diff --git a/src/ol/structs/lrucache.js b/src/ol/structs/lrucache.js
new file mode 100644
index 0000000..d1b1f3a
--- /dev/null
+++ b/src/ol/structs/lrucache.js
@@ -0,0 +1,248 @@
+goog.provide('ol.structs.LRUCache');
+
+goog.require('goog.asserts');
+goog.require('goog.object');
+
+
+
+/**
+ * Implements a Least-Recently-Used cache where the keys do not conflict with
+ * Object's properties (e.g. 'hasOwnProperty' is not allowed as a key). Expiring
+ * items from the cache is the responsibility of the user.
+ * @constructor
+ * @struct
+ * @template T
+ */
+ol.structs.LRUCache = function() {
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.count_ = 0;
+
+  /**
+   * @private
+   * @type {Object.<string, ol.structs.LRUCacheEntry>}
+   */
+  this.entries_ = {};
+
+  /**
+   * @private
+   * @type {?ol.structs.LRUCacheEntry}
+   */
+  this.oldest_ = null;
+
+  /**
+   * @private
+   * @type {?ol.structs.LRUCacheEntry}
+   */
+  this.newest_ = null;
+
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.structs.LRUCache.prototype.assertValid = function() {
+  if (this.count_ === 0) {
+    goog.asserts.assert(goog.object.isEmpty(this.entries_));
+    goog.asserts.assert(goog.isNull(this.oldest_));
+    goog.asserts.assert(goog.isNull(this.newest_));
+  } else {
+    goog.asserts.assert(goog.object.getCount(this.entries_) == this.count_);
+    goog.asserts.assert(!goog.isNull(this.oldest_));
+    goog.asserts.assert(goog.isNull(this.oldest_.older));
+    goog.asserts.assert(!goog.isNull(this.newest_));
+    goog.asserts.assert(goog.isNull(this.newest_.newer));
+    var i, entry;
+    var older = null;
+    i = 0;
+    for (entry = this.oldest_; !goog.isNull(entry); entry = entry.newer) {
+      goog.asserts.assert(entry.older === older);
+      older = entry;
+      ++i;
+    }
+    goog.asserts.assert(i == this.count_);
+    var newer = null;
+    i = 0;
+    for (entry = this.newest_; !goog.isNull(entry); entry = entry.older) {
+      goog.asserts.assert(entry.newer === newer);
+      newer = entry;
+      ++i;
+    }
+    goog.asserts.assert(i == this.count_);
+  }
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.structs.LRUCache.prototype.clear = function() {
+  this.count_ = 0;
+  this.entries_ = {};
+  this.oldest_ = null;
+  this.newest_ = null;
+};
+
+
+/**
+ * @param {string} key Key.
+ * @return {boolean} Contains key.
+ */
+ol.structs.LRUCache.prototype.containsKey = function(key) {
+  return this.entries_.hasOwnProperty(key);
+};
+
+
+/**
+ * @param {function(this: S, T, string, ol.structs.LRUCache): ?} f The function
+ *     to call for every entry from the oldest to the newer. This function takes
+ *     3 arguments (the entry value, the entry key and the LRUCache object).
+ *     The return value is ignored.
+ * @param {S=} opt_this The object to use as `this` in `f`.
+ * @template S
+ */
+ol.structs.LRUCache.prototype.forEach = function(f, opt_this) {
+  var entry = this.oldest_;
+  while (!goog.isNull(entry)) {
+    f.call(opt_this, entry.value_, entry.key_, this);
+    entry = entry.newer;
+  }
+};
+
+
+/**
+ * @param {string} key Key.
+ * @return {T} Value.
+ */
+ol.structs.LRUCache.prototype.get = function(key) {
+  var entry = this.entries_[key];
+  goog.asserts.assert(goog.isDef(entry));
+  if (entry === this.newest_) {
+    return entry.value_;
+  } else if (entry === this.oldest_) {
+    this.oldest_ = this.oldest_.newer;
+    this.oldest_.older = null;
+  } else {
+    entry.newer.older = entry.older;
+    entry.older.newer = entry.newer;
+  }
+  entry.newer = null;
+  entry.older = this.newest_;
+  this.newest_.newer = entry;
+  this.newest_ = entry;
+  return entry.value_;
+};
+
+
+/**
+ * @return {number} Count.
+ */
+ol.structs.LRUCache.prototype.getCount = function() {
+  return this.count_;
+};
+
+
+/**
+ * @return {Array.<string>} Keys.
+ */
+ol.structs.LRUCache.prototype.getKeys = function() {
+  var keys = new Array(this.count_);
+  var i = 0;
+  var entry;
+  for (entry = this.newest_; !goog.isNull(entry); entry = entry.older) {
+    keys[i++] = entry.key_;
+  }
+  goog.asserts.assert(i == this.count_);
+  return keys;
+};
+
+
+/**
+ * @return {Array.<T>} Values.
+ */
+ol.structs.LRUCache.prototype.getValues = function() {
+  var values = new Array(this.count_);
+  var i = 0;
+  var entry;
+  for (entry = this.newest_; !goog.isNull(entry); entry = entry.older) {
+    values[i++] = entry.value_;
+  }
+  goog.asserts.assert(i == this.count_);
+  return values;
+};
+
+
+/**
+ * @return {T} Last value.
+ */
+ol.structs.LRUCache.prototype.peekLast = function() {
+  goog.asserts.assert(!goog.isNull(this.oldest_));
+  return this.oldest_.value_;
+};
+
+
+/**
+ * @return {string} Last key.
+ */
+ol.structs.LRUCache.prototype.peekLastKey = function() {
+  goog.asserts.assert(!goog.isNull(this.oldest_));
+  return this.oldest_.key_;
+};
+
+
+/**
+ * @return {T} value Value.
+ */
+ol.structs.LRUCache.prototype.pop = function() {
+  goog.asserts.assert(!goog.isNull(this.oldest_));
+  goog.asserts.assert(!goog.isNull(this.newest_));
+  var entry = this.oldest_;
+  goog.asserts.assert(entry.key_ in this.entries_);
+  delete this.entries_[entry.key_];
+  if (!goog.isNull(entry.newer)) {
+    entry.newer.older = null;
+  }
+  this.oldest_ = entry.newer;
+  if (goog.isNull(this.oldest_)) {
+    this.newest_ = null;
+  }
+  --this.count_;
+  return entry.value_;
+};
+
+
+/**
+ * @param {string} key Key.
+ * @param {T} value Value.
+ */
+ol.structs.LRUCache.prototype.set = function(key, value) {
+  goog.asserts.assert(!(key in {}));
+  goog.asserts.assert(!(key in this.entries_));
+  var entry = {
+    key_: key,
+    newer: null,
+    older: this.newest_,
+    value_: value
+  };
+  if (goog.isNull(this.newest_)) {
+    this.oldest_ = entry;
+  } else {
+    this.newest_.newer = entry;
+  }
+  this.newest_ = entry;
+  this.entries_[key] = entry;
+  ++this.count_;
+};
+
+
+/**
+ * @typedef {{key_: string,
+ *            newer: ol.structs.LRUCacheEntry,
+ *            older: ol.structs.LRUCacheEntry,
+ *            value_: *}}
+ */
+ol.structs.LRUCacheEntry;
diff --git a/src/ol/structs/priorityqueue.js b/src/ol/structs/priorityqueue.js
new file mode 100644
index 0000000..714c59d
--- /dev/null
+++ b/src/ol/structs/priorityqueue.js
@@ -0,0 +1,291 @@
+goog.provide('ol.structs.PriorityQueue');
+
+goog.require('goog.asserts');
+goog.require('goog.object');
+
+
+
+/**
+ * Priority queue.
+ *
+ * The implementation is inspired from the Closure Library's Heap class and
+ * Python's heapq module.
+ *
+ * @see http://closure-library.googlecode.com/svn/docs/closure_goog_structs_heap.js.source.html
+ * @see http://hg.python.org/cpython/file/2.7/Lib/heapq.py
+ *
+ * @constructor
+ * @param {function(T): number} priorityFunction Priority function.
+ * @param {function(T): string} keyFunction Key function.
+ * @struct
+ * @template T
+ */
+ol.structs.PriorityQueue = function(priorityFunction, keyFunction) {
+
+  /**
+   * @type {function(T): number}
+   * @private
+   */
+  this.priorityFunction_ = priorityFunction;
+
+  /**
+   * @type {function(T): string}
+   * @private
+   */
+  this.keyFunction_ = keyFunction;
+
+  /**
+   * @type {Array.<T>}
+   * @private
+   */
+  this.elements_ = [];
+
+  /**
+   * @type {Array.<number>}
+   * @private
+   */
+  this.priorities_ = [];
+
+  /**
+   * @type {Object.<string, boolean>}
+   * @private
+   */
+  this.queuedElements_ = {};
+
+};
+
+
+/**
+ * @const
+ * @type {number}
+ */
+ol.structs.PriorityQueue.DROP = Infinity;
+
+
+/**
+ * FIXME empty desciption for jsdoc
+ */
+ol.structs.PriorityQueue.prototype.assertValid = function() {
+  var elements = this.elements_;
+  var priorities = this.priorities_;
+  var n = elements.length;
+  goog.asserts.assert(priorities.length == n);
+  var i, priority;
+  for (i = 0; i < (n >> 1) - 1; ++i) {
+    priority = priorities[i];
+    goog.asserts.assert(priority <= priorities[this.getLeftChildIndex_(i)]);
+    goog.asserts.assert(priority <= priorities[this.getRightChildIndex_(i)]);
+  }
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.structs.PriorityQueue.prototype.clear = function() {
+  this.elements_.length = 0;
+  this.priorities_.length = 0;
+  goog.object.clear(this.queuedElements_);
+};
+
+
+/**
+ * Remove and return the highest-priority element. O(log N).
+ * @return {T} Element.
+ */
+ol.structs.PriorityQueue.prototype.dequeue = function() {
+  var elements = this.elements_;
+  goog.asserts.assert(elements.length > 0);
+  var priorities = this.priorities_;
+  var element = elements[0];
+  if (elements.length == 1) {
+    elements.length = 0;
+    priorities.length = 0;
+  } else {
+    elements[0] = elements.pop();
+    priorities[0] = priorities.pop();
+    this.siftUp_(0);
+  }
+  var elementKey = this.keyFunction_(element);
+  goog.asserts.assert(elementKey in this.queuedElements_);
+  delete this.queuedElements_[elementKey];
+  return element;
+};
+
+
+/**
+ * Enqueue an element. O(log N).
+ * @param {T} element Element.
+ */
+ol.structs.PriorityQueue.prototype.enqueue = function(element) {
+  goog.asserts.assert(!(this.keyFunction_(element) in this.queuedElements_));
+  var priority = this.priorityFunction_(element);
+  if (priority != ol.structs.PriorityQueue.DROP) {
+    this.elements_.push(element);
+    this.priorities_.push(priority);
+    this.queuedElements_[this.keyFunction_(element)] = true;
+    this.siftDown_(0, this.elements_.length - 1);
+  }
+};
+
+
+/**
+ * @return {number} Count.
+ */
+ol.structs.PriorityQueue.prototype.getCount = function() {
+  return this.elements_.length;
+};
+
+
+/**
+ * Gets the index of the left child of the node at the given index.
+ * @param {number} index The index of the node to get the left child for.
+ * @return {number} The index of the left child.
+ * @private
+ */
+ol.structs.PriorityQueue.prototype.getLeftChildIndex_ = function(index) {
+  return index * 2 + 1;
+};
+
+
+/**
+ * Gets the index of the right child of the node at the given index.
+ * @param {number} index The index of the node to get the right child for.
+ * @return {number} The index of the right child.
+ * @private
+ */
+ol.structs.PriorityQueue.prototype.getRightChildIndex_ = function(index) {
+  return index * 2 + 2;
+};
+
+
+/**
+ * Gets the index of the parent of the node at the given index.
+ * @param {number} index The index of the node to get the parent for.
+ * @return {number} The index of the parent.
+ * @private
+ */
+ol.structs.PriorityQueue.prototype.getParentIndex_ = function(index) {
+  return (index - 1) >> 1;
+};
+
+
+/**
+ * Make this a heap. O(N).
+ * @private
+ */
+ol.structs.PriorityQueue.prototype.heapify_ = function() {
+  var i;
+  for (i = (this.elements_.length >> 1) - 1; i >= 0; i--) {
+    this.siftUp_(i);
+  }
+};
+
+
+/**
+ * @return {boolean} Is empty.
+ */
+ol.structs.PriorityQueue.prototype.isEmpty = function() {
+  return this.elements_.length === 0;
+};
+
+
+/**
+ * @param {string} key Key.
+ * @return {boolean} Is key queued.
+ */
+ol.structs.PriorityQueue.prototype.isKeyQueued = function(key) {
+  return key in this.queuedElements_;
+};
+
+
+/**
+ * @param {T} element Element.
+ * @return {boolean} Is queued.
+ */
+ol.structs.PriorityQueue.prototype.isQueued = function(element) {
+  return this.isKeyQueued(this.keyFunction_(element));
+};
+
+
+/**
+ * @param {number} index The index of the node to move down.
+ * @private
+ */
+ol.structs.PriorityQueue.prototype.siftUp_ = function(index) {
+  var elements = this.elements_;
+  var priorities = this.priorities_;
+  var count = elements.length;
+  var element = elements[index];
+  var priority = priorities[index];
+  var startIndex = index;
+
+  while (index < (count >> 1)) {
+    var lIndex = this.getLeftChildIndex_(index);
+    var rIndex = this.getRightChildIndex_(index);
+
+    var smallerChildIndex = rIndex < count &&
+        priorities[rIndex] < priorities[lIndex] ?
+        rIndex : lIndex;
+
+    elements[index] = elements[smallerChildIndex];
+    priorities[index] = priorities[smallerChildIndex];
+    index = smallerChildIndex;
+  }
+
+  elements[index] = element;
+  priorities[index] = priority;
+  this.siftDown_(startIndex, index);
+};
+
+
+/**
+ * @param {number} startIndex The index of the root.
+ * @param {number} index The index of the node to move up.
+ * @private
+ */
+ol.structs.PriorityQueue.prototype.siftDown_ = function(startIndex, index) {
+  var elements = this.elements_;
+  var priorities = this.priorities_;
+  var element = elements[index];
+  var priority = priorities[index];
+
+  while (index > startIndex) {
+    var parentIndex = this.getParentIndex_(index);
+    if (priorities[parentIndex] > priority) {
+      elements[index] = elements[parentIndex];
+      priorities[index] = priorities[parentIndex];
+      index = parentIndex;
+    } else {
+      break;
+    }
+  }
+  elements[index] = element;
+  priorities[index] = priority;
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.structs.PriorityQueue.prototype.reprioritize = function() {
+  var priorityFunction = this.priorityFunction_;
+  var elements = this.elements_;
+  var priorities = this.priorities_;
+  var index = 0;
+  var n = elements.length;
+  var element, i, priority;
+  for (i = 0; i < n; ++i) {
+    element = elements[i];
+    priority = priorityFunction(element);
+    if (priority == ol.structs.PriorityQueue.DROP) {
+      delete this.queuedElements_[this.keyFunction_(element)];
+    } else {
+      priorities[index] = priority;
+      elements[index++] = element;
+    }
+  }
+  elements.length = index;
+  priorities.length = index;
+  this.heapify_();
+};
diff --git a/src/ol/structs/rbush.js b/src/ol/structs/rbush.js
new file mode 100644
index 0000000..a9c5cce
--- /dev/null
+++ b/src/ol/structs/rbush.js
@@ -0,0 +1,242 @@
+goog.provide('ol.structs.RBush');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.object');
+goog.require('ol.ext.rbush');
+
+
+
+/**
+ * Wrapper around the RBush by Vladimir Agafonkin.
+ *
+ * @constructor
+ * @param {number=} opt_maxEntries Max entries.
+ * @see https://github.com/mourner/rbush
+ * @struct
+ * @template T
+ */
+ol.structs.RBush = function(opt_maxEntries) {
+
+  /**
+   * @private
+   */
+  this.rbush_ = ol.ext.rbush(opt_maxEntries);
+
+  /**
+   * A mapping between the objects added to this rbush wrapper
+   * and the objects that are actually added to the internal rbush.
+   * @private
+   * @type {Object.<number, Object>}
+   */
+  this.items_ = {};
+
+  if (goog.DEBUG) {
+    /**
+     * @private
+     * @type {number}
+     */
+    this.readers_ = 0;
+  }
+};
+
+
+/**
+ * Insert a value into the RBush.
+ * @param {ol.Extent} extent Extent.
+ * @param {T} value Value.
+ */
+ol.structs.RBush.prototype.insert = function(extent, value) {
+  if (goog.DEBUG && this.readers_) {
+    throw new Error('Can not insert value while reading');
+  }
+  var item = [
+    extent[0],
+    extent[1],
+    extent[2],
+    extent[3],
+    value
+  ];
+  this.rbush_.insert(item);
+  // remember the object that was added to the internal rbush
+  goog.object.add(this.items_, goog.getUid(value).toString(), item);
+};
+
+
+/**
+ * Bulk-insert values into the RBush.
+ * @param {Array.<ol.Extent>} extents Extents.
+ * @param {Array.<T>} values Values.
+ */
+ol.structs.RBush.prototype.load = function(extents, values) {
+  if (goog.DEBUG && this.readers_) {
+    throw new Error('Can not insert values while reading');
+  }
+  goog.asserts.assert(extents.length === values.length);
+
+  var items = new Array(values.length);
+  for (var i = 0, l = values.length; i < l; i++) {
+    var extent = extents[i];
+    var value = values[i];
+
+    var item = [
+      extent[0],
+      extent[1],
+      extent[2],
+      extent[3],
+      value
+    ];
+    items[i] = item;
+    goog.object.add(this.items_, goog.getUid(value).toString(), item);
+  }
+  this.rbush_.load(items);
+};
+
+
+/**
+ * Remove a value from the RBush.
+ * @param {T} value Value.
+ * @return {boolean} Removed.
+ */
+ol.structs.RBush.prototype.remove = function(value) {
+  if (goog.DEBUG && this.readers_) {
+    throw new Error('Can not remove value while reading');
+  }
+  var uid = goog.getUid(value).toString();
+  goog.asserts.assert(goog.object.containsKey(this.items_, uid));
+
+  // get the object in which the value was wrapped when adding to the
+  // internal rbush. then use that object to do the removal.
+  var item = goog.object.get(this.items_, uid);
+  goog.object.remove(this.items_, uid);
+  return this.rbush_.remove(item) !== null;
+};
+
+
+/**
+ * Update the extent of a value in the RBush.
+ * @param {ol.Extent} extent Extent.
+ * @param {T} value Value.
+ */
+ol.structs.RBush.prototype.update = function(extent, value) {
+  this.remove(value);
+  this.insert(extent, value);
+};
+
+
+/**
+ * Return all values in the RBush.
+ * @return {Array.<T>} All.
+ */
+ol.structs.RBush.prototype.getAll = function() {
+  var items = this.rbush_.all();
+  return goog.array.map(items, function(item) {
+    return item[4];
+  });
+};
+
+
+/**
+ * Return all values in the given extent.
+ * @param {ol.Extent} extent Extent.
+ * @return {Array.<T>} All in extent.
+ */
+ol.structs.RBush.prototype.getInExtent = function(extent) {
+  var items = this.rbush_.search(extent);
+  return goog.array.map(items, function(item) {
+    return item[4];
+  });
+};
+
+
+/**
+ * Calls a callback function with each value in the tree.
+ * If the callback returns a truthy value, this value is returned without
+ * checking the rest of the tree.
+ * @param {function(this: S, T): *} callback Callback.
+ * @param {S=} opt_this The object to use as `this` in `callback`.
+ * @return {*} Callback return value.
+ * @template S
+ */
+ol.structs.RBush.prototype.forEach = function(callback, opt_this) {
+  if (goog.DEBUG) {
+    ++this.readers_;
+    try {
+      return this.forEach_(this.getAll(), callback, opt_this);
+    } finally {
+      --this.readers_;
+    }
+  } else {
+    return this.forEach_(this.getAll(), callback, opt_this);
+  }
+};
+
+
+/**
+ * Calls a callback function with each value in the provided extent.
+ * @param {ol.Extent} extent Extent.
+ * @param {function(this: S, T): *} callback Callback.
+ * @param {S=} opt_this The object to use as `this` in `callback`.
+ * @return {*} Callback return value.
+ * @template S
+ */
+ol.structs.RBush.prototype.forEachInExtent =
+    function(extent, callback, opt_this) {
+  if (goog.DEBUG) {
+    ++this.readers_;
+    try {
+      return this.forEach_(this.getInExtent(extent), callback, opt_this);
+    } finally {
+      --this.readers_;
+    }
+  } else {
+    return this.forEach_(this.getInExtent(extent), callback, opt_this);
+  }
+};
+
+
+/**
+ * @param {Array.<T>} values Values.
+ * @param {function(this: S, T): *} callback Callback.
+ * @param {S=} opt_this The object to use as `this` in `callback`.
+ * @private
+ * @return {*} Callback return value.
+ * @template S
+ */
+ol.structs.RBush.prototype.forEach_ = function(values, callback, opt_this) {
+  var result;
+  for (var i = 0, l = values.length; i < l; i++) {
+    result = callback.call(opt_this, values[i]);
+    if (result) {
+      return result;
+    }
+  }
+  return result;
+};
+
+
+/**
+ * @return {boolean} Is empty.
+ */
+ol.structs.RBush.prototype.isEmpty = function() {
+  return goog.object.isEmpty(this.items_);
+};
+
+
+/**
+ * Remove all values from the RBush.
+ */
+ol.structs.RBush.prototype.clear = function() {
+  this.rbush_.clear();
+  this.items_ = {};
+};
+
+
+/**
+ * @param {ol.Extent=} opt_extent Extent.
+ * @return {ol.Extent} Extent.
+ */
+ol.structs.RBush.prototype.getExtent = function(opt_extent) {
+  // FIXME add getExtent() to rbush
+  return this.rbush_.data.bbox;
+};
diff --git a/src/ol/style.jsdoc b/src/ol/style.jsdoc
new file mode 100644
index 0000000..2386a10
--- /dev/null
+++ b/src/ol/style.jsdoc
@@ -0,0 +1,80 @@
+/**
+ * Feature styles.
+ *
+ * If no style is defined, the following default style is used:
+ * ```js
+ *  var fill = new ol.style.Fill({
+ *    color: 'rgba(255,255,255,0.4)'
+ *  });
+ *  var stroke = new ol.style.Stroke({
+ *    color: '#3399CC',
+ *    width: 1.25
+ *  });
+ *  var styles = [
+ *    new ol.style.Style({
+ *      image: new ol.style.Circle({
+ *        fill: fill,
+ *        stroke: stroke,
+ *        radius: 5
+ *      }),
+ *      fill: fill,
+ *      stroke: stroke
+ *    })
+ *  ];
+ * ```
+ *
+ * A separate editing style has the following defaults:
+ * ```js
+ *  var white = [255, 255, 255, 1];
+ *  var blue = [0, 153, 255, 1];
+ *  var width = 3;
+ *  styles[ol.geom.GeometryType.POLYGON] = [
+ *    new ol.style.Style({
+ *      fill: new ol.style.Fill({
+ *        color: [255, 255, 255, 0.5]
+ *      })
+ *    })
+ *  ];
+ *  styles[ol.geom.GeometryType.MULTI_POLYGON] =
+ *      styles[ol.geom.GeometryType.POLYGON];
+ *  styles[ol.geom.GeometryType.LINE_STRING] = [
+ *    new ol.style.Style({
+ *      stroke: new ol.style.Stroke({
+ *        color: white,
+ *        width: width + 2
+ *      })
+ *    }),
+ *    new ol.style.Style({
+ *      stroke: new ol.style.Stroke({
+ *        color: blue,
+ *        width: width
+ *      })
+ *    })
+ *  ];
+ *  styles[ol.geom.GeometryType.MULTI_LINE_STRING] =
+ *      styles[ol.geom.GeometryType.LINE_STRING];
+ *  styles[ol.geom.GeometryType.POINT] = [
+ *    new ol.style.Style({
+ *      image: new ol.style.Circle({
+ *        radius: width * 2,
+ *        fill: new ol.style.Fill({
+ *          color: blue
+ *        }),
+ *        stroke: new ol.style.Stroke({
+ *          color: white,
+ *          width: width / 2
+ *        })
+ *      }),
+ *      zIndex: Infinity
+ *    })
+ *  ];
+ *  styles[ol.geom.GeometryType.MULTI_POINT] =
+ *      styles[ol.geom.GeometryType.POINT];
+ *  styles[ol.geom.GeometryType.GEOMETRY_COLLECTION] =
+ *      styles[ol.geom.GeometryType.POLYGON].concat(
+ *          styles[ol.geom.GeometryType.POINT]
+ *      );
+ *```
+ *
+ * @namespace ol.style
+ */
diff --git a/src/ol/style/atlasmanager.js b/src/ol/style/atlasmanager.js
new file mode 100644
index 0000000..a3cb260
--- /dev/null
+++ b/src/ol/style/atlasmanager.js
@@ -0,0 +1,440 @@
+goog.provide('ol.style.Atlas');
+goog.provide('ol.style.AtlasManager');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.object');
+goog.require('ol');
+
+
+/**
+ * Provides information for an image inside an atlas manager.
+ * `offsetX` and `offsetY` is the position of the image inside
+ * the atlas image `image`.
+ * `hitOffsetX` and `hitOffsetY` ist the position of the hit-detection image
+ * inside the hit-detection atlas image `hitImage` (only when a hit-detection
+ * image was created for this image).
+ * @typedef {{offsetX: number, offsetY: number, image: HTMLCanvasElement,
+ *    hitOffsetX: number, hitOffsetY: number, hitImage: HTMLCanvasElement}}
+ */
+ol.style.AtlasManagerInfo;
+
+
+
+/**
+ * Manages the creation of image atlases.
+ *
+ * Images added to this manager will be inserted into an atlas, which
+ * will be used for rendering.
+ * The `size` given in the constructor is the size for the first
+ * atlas. After that, when new atlases are created, they will have
+ * twice the size as the latest atlas (until `maxSize` is reached).
+ *
+ * If an application uses many images or very large images, it is recommended
+ * to set a higher `size` value to avoid the creation of too many atlases.
+ *
+ * @constructor
+ * @struct
+ * @api
+ * @param {olx.style.AtlasManagerOptions=} opt_options Options.
+ */
+ol.style.AtlasManager = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * The size in pixels of the latest atlas image.
+   * @private
+   * @type {number}
+   */
+  this.currentSize_ = goog.isDef(options.initialSize) ?
+      options.initialSize : ol.INITIAL_ATLAS_SIZE;
+
+  /**
+   * The maximum size in pixels of atlas images.
+   * @private
+   * @type {number}
+   */
+  this.maxSize_ = goog.isDef(options.maxSize) ?
+      options.maxSize : ol.MAX_ATLAS_SIZE != -1 ?
+          ol.MAX_ATLAS_SIZE : goog.isDef(ol.WEBGL_MAX_TEXTURE_SIZE) ?
+              ol.WEBGL_MAX_TEXTURE_SIZE : 2048;
+
+  /**
+   * The size in pixels between images.
+   * @private
+   * @type {number}
+   */
+  this.space_ = goog.isDef(options.space) ? options.space : 1;
+
+  /**
+   * @private
+   * @type {Array.<ol.style.Atlas>}
+   */
+  this.atlases_ = [new ol.style.Atlas(this.currentSize_, this.space_)];
+
+  /**
+   * The size in pixels of the latest atlas image for hit-detection images.
+   * @private
+   * @type {number}
+   */
+  this.currentHitSize_ = this.currentSize_;
+
+  /**
+   * @private
+   * @type {Array.<ol.style.Atlas>}
+   */
+  this.hitAtlases_ = [new ol.style.Atlas(this.currentHitSize_, this.space_)];
+};
+
+
+/**
+ * @param {string} id The identifier of the entry to check.
+ * @return {?ol.style.AtlasManagerInfo} The position and atlas image for the
+ *    entry, or `null` if the entry is not part of the atlas manager.
+ */
+ol.style.AtlasManager.prototype.getInfo = function(id) {
+  /** @type {?ol.style.AtlasInfo} */
+  var info = this.getInfo_(this.atlases_, id);
+
+  if (goog.isNull(info)) {
+    return null;
+  }
+  /** @type {?ol.style.AtlasInfo} */
+  var hitInfo = this.getInfo_(this.hitAtlases_, id);
+
+  return this.mergeInfos_(info, hitInfo);
+};
+
+
+/**
+ * @private
+ * @param {Array.<ol.style.Atlas>} atlases The atlases to search.
+ * @param {string} id The identifier of the entry to check.
+ * @return {?ol.style.AtlasInfo} The position and atlas image for the entry,
+ *    or `null` if the entry is not part of the atlases.
+ */
+ol.style.AtlasManager.prototype.getInfo_ = function(atlases, id) {
+  var atlas, info, i, ii;
+  for (i = 0, ii = atlases.length; i < ii; ++i) {
+    atlas = atlases[i];
+    info = atlas.get(id);
+    if (!goog.isNull(info)) {
+      return info;
+    }
+  }
+  return null;
+};
+
+
+/**
+ * @private
+ * @param {ol.style.AtlasInfo} info The info for the real image.
+ * @param {?ol.style.AtlasInfo} hitInfo The info for the hit-detection
+ *    image.
+ * @return {?ol.style.AtlasManagerInfo} The position and atlas image for the
+ *    entry, or `null` if the entry is not part of the atlases.
+ */
+ol.style.AtlasManager.prototype.mergeInfos_ = function(info, hitInfo) {
+  return /** @type {ol.style.AtlasManagerInfo} */ ({
+    offsetX: info.offsetX,
+    offsetY: info.offsetY,
+    image: info.image,
+    hitOffsetX: goog.isNull(hitInfo) ? undefined : hitInfo.offsetX,
+    hitOffsetY: goog.isNull(hitInfo) ? undefined : hitInfo.offsetY,
+    hitImage: goog.isNull(hitInfo) ? undefined : hitInfo.image
+  });
+};
+
+
+/**
+ * Add an image to the atlas manager.
+ *
+ * If an entry for the given id already exists, the entry will
+ * be overridden (but the space on the atlas graphic will not be freed).
+ *
+ * If `renderHitCallback` is provided, the image (or the hit-detection version
+ * of the image) will be rendered into a separate hit-detection atlas image.
+ *
+ * @param {string} id The identifier of the entry to add.
+ * @param {number} width The width.
+ * @param {number} height The height.
+ * @param {function(CanvasRenderingContext2D, number, number)} renderCallback
+ *    Called to render the new image onto an atlas image.
+ * @param {function(CanvasRenderingContext2D, number, number)=}
+ *    opt_renderHitCallback Called to render a hit-detection image onto a hit
+ *    detection atlas image.
+ * @param {Object=} opt_this Value to use as `this` when executing
+ *    `renderCallback` and `renderHitCallback`.
+ * @return {?ol.style.AtlasManagerInfo}  The position and atlas image for the
+ *    entry, or `null` if the image is too big.
+ */
+ol.style.AtlasManager.prototype.add =
+    function(id, width, height,
+        renderCallback, opt_renderHitCallback, opt_this) {
+  if (width + this.space_ > this.maxSize_ ||
+      height + this.space_ > this.maxSize_) {
+    return null;
+  }
+
+  /** @type {?ol.style.AtlasInfo} */
+  var info = this.add_(false,
+      id, width, height, renderCallback, opt_this);
+  if (goog.isNull(info)) {
+    return null;
+  }
+
+  /** @type {?ol.style.AtlasInfo} */
+  var hitInfo = null;
+  if (goog.isDef(opt_renderHitCallback)) {
+    hitInfo = this.add_(true,
+        id, width, height, opt_renderHitCallback, opt_this);
+  }
+  return this.mergeInfos_(info, hitInfo);
+};
+
+
+/**
+ * @private
+ * @param {boolean} isHitAtlas If the hit-detection atlases are used.
+ * @param {string} id The identifier of the entry to add.
+ * @param {number} width The width.
+ * @param {number} height The height.
+ * @param {function(CanvasRenderingContext2D, number, number)} renderCallback
+ *    Called to render the new image onto an atlas image.
+ * @param {Object=} opt_this Value to use as `this` when executing
+ *    `renderCallback` and `renderHitCallback`.
+ * @return {?ol.style.AtlasInfo}  The position and atlas image for the entry,
+ *    or `null` if the image is too big.
+ */
+ol.style.AtlasManager.prototype.add_ =
+    function(isHitAtlas, id, width, height,
+        renderCallback, opt_this) {
+  var atlases = (isHitAtlas) ? this.hitAtlases_ : this.atlases_;
+  var atlas, info, i, ii;
+  for (i = 0, ii = atlases.length; i < ii; ++i) {
+    atlas = atlases[i];
+    info = atlas.add(id, width, height, renderCallback, opt_this);
+    if (!goog.isNull(info)) {
+      return info;
+    } else if (goog.isNull(info) && i === ii - 1) {
+      // the entry could not be added to one of the existing atlases,
+      // create a new atlas that is twice as big and try to add to this one.
+      var size;
+      if (isHitAtlas) {
+        size = Math.min(this.currentHitSize_ * 2, this.maxSize_);
+        this.currentHitSize_ = size;
+      } else {
+        size = Math.min(this.currentSize_ * 2, this.maxSize_);
+        this.currentSize_ = size;
+      }
+      atlas = new ol.style.Atlas(size, this.space_);
+      atlases.push(atlas);
+      // run the loop another time
+      ++ii;
+    }
+  }
+  goog.asserts.fail();
+};
+
+
+/**
+ * Provides information for an image inside an atlas.
+ * `offsetX` and `offsetY` are the position of the image inside
+ * the atlas image `image`.
+ * @typedef {{offsetX: number, offsetY: number, image: HTMLCanvasElement}}
+ */
+ol.style.AtlasInfo;
+
+
+
+/**
+ * This class facilitates the creation of image atlases.
+ *
+ * Images added to an atlas will be rendered onto a single
+ * atlas canvas. The distribution of images on the canvas is
+ * managed with the bin packing algorithm described in:
+ * http://www.blackpawn.com/texts/lightmaps/
+ *
+ * @constructor
+ * @struct
+ * @param {number} size The size in pixels of the sprite image.
+ * @param {number} space The space in pixels between images.
+ *    Because texture coordinates are float values, the edges of
+ *    images might not be completely correct (in a way that the
+ *    edges overlap when being rendered). To avoid this we add a
+ *    padding around each image.
+ */
+ol.style.Atlas = function(size, space) {
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.space_ = space;
+
+  /**
+   * @private
+   * @type {Array.<ol.style.Atlas.Block>}
+   */
+  this.emptyBlocks_ = [{x: 0, y: 0, width: size, height: size}];
+
+  /**
+   * @private
+   * @type {Object.<string, ol.style.AtlasInfo>}
+   */
+  this.entries_ = {};
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.canvas_ = /** @type {HTMLCanvasElement} */
+      (goog.dom.createElement(goog.dom.TagName.CANVAS));
+  this.canvas_.width = size;
+  this.canvas_.height = size;
+
+  /**
+   * @private
+   * @type {CanvasRenderingContext2D}
+   */
+  this.context_ = /** @type {CanvasRenderingContext2D} */
+      (this.canvas_.getContext('2d'));
+};
+
+
+/**
+ * @param {string} id The identifier of the entry to check.
+ * @return {?ol.style.AtlasInfo}
+ */
+ol.style.Atlas.prototype.get = function(id) {
+  return /** @type {?ol.style.AtlasInfo} */ (
+      goog.object.get(this.entries_, id, null));
+};
+
+
+/**
+ * @param {string} id The identifier of the entry to add.
+ * @param {number} width The width.
+ * @param {number} height The height.
+ * @param {function(CanvasRenderingContext2D, number, number)} renderCallback
+ *    Called to render the new image onto an atlas image.
+ * @param {Object=} opt_this Value to use as `this` when executing
+ *    `renderCallback`.
+ * @return {?ol.style.AtlasInfo} The position and atlas image for the entry.
+ */
+ol.style.Atlas.prototype.add =
+    function(id, width, height, renderCallback, opt_this) {
+  var block, i, ii;
+  for (i = 0, ii = this.emptyBlocks_.length; i < ii; ++i) {
+    block = this.emptyBlocks_[i];
+    if (block.width >= width + this.space_ &&
+        block.height >= height + this.space_) {
+      // we found a block that is big enough for our entry
+      var entry = {
+        offsetX: block.x + this.space_,
+        offsetY: block.y + this.space_,
+        image: this.canvas_
+      };
+      this.entries_[id] = entry;
+
+      // render the image on the atlas image
+      renderCallback.call(opt_this, this.context_,
+          block.x + this.space_, block.y + this.space_);
+
+      // split the block after the insertion, either horizontally or vertically
+      this.split_(i, block, width + this.space_, height + this.space_);
+
+      return entry;
+    }
+  }
+
+  // there is no space for the new entry in this atlas
+  return null;
+};
+
+
+/**
+ * @private
+ * @param {number} index The index of the block.
+ * @param {ol.style.Atlas.Block} block The block to split.
+ * @param {number} width The width of the entry to insert.
+ * @param {number} height The height of the entry to insert.
+ */
+ol.style.Atlas.prototype.split_ =
+    function(index, block, width, height) {
+  var deltaWidth = block.width - width;
+  var deltaHeight = block.height - height;
+
+  /** @type {ol.style.Atlas.Block} */
+  var newBlock1;
+  /** @type {ol.style.Atlas.Block} */
+  var newBlock2;
+
+  if (deltaWidth > deltaHeight) {
+    // split vertically
+    // block right of the inserted entry
+    newBlock1 = {
+      x: block.x + width,
+      y: block.y,
+      width: block.width - width,
+      height: block.height
+    };
+
+    // block below the inserted entry
+    newBlock2 = {
+      x: block.x,
+      y: block.y + height,
+      width: width,
+      height: block.height - height
+    };
+    this.updateBlocks_(index, newBlock1, newBlock2);
+  } else {
+    // split horizontally
+    // block right of the inserted entry
+    newBlock1 = {
+      x: block.x + width,
+      y: block.y,
+      width: block.width - width,
+      height: height
+    };
+
+    // block below the inserted entry
+    newBlock2 = {
+      x: block.x,
+      y: block.y + height,
+      width: block.width,
+      height: block.height - height
+    };
+    this.updateBlocks_(index, newBlock1, newBlock2);
+  }
+};
+
+
+/**
+ * Remove the old block and insert new blocks at the same array position.
+ * The new blocks are inserted at the same position, so that splitted
+ * blocks (that are potentially smaller) are filled first.
+ * @private
+ * @param {number} index The index of the block to remove.
+ * @param {ol.style.Atlas.Block} newBlock1 The 1st block to add.
+ * @param {ol.style.Atlas.Block} newBlock2 The 2nd block to add.
+ */
+ol.style.Atlas.prototype.updateBlocks_ =
+    function(index, newBlock1, newBlock2) {
+  var args = [index, 1];
+  if (newBlock1.width > 0 && newBlock1.height > 0) {
+    args.push(newBlock1);
+  }
+  if (newBlock2.width > 0 && newBlock2.height > 0) {
+    args.push(newBlock2);
+  }
+  this.emptyBlocks_.splice.apply(this.emptyBlocks_, args);
+};
+
+
+/**
+ * @typedef {{x: number, y: number, width: number, height: number}}
+ */
+ol.style.Atlas.Block;
diff --git a/src/ol/style/circlestyle.js b/src/ol/style/circlestyle.js
new file mode 100644
index 0000000..96632d0
--- /dev/null
+++ b/src/ol/style/circlestyle.js
@@ -0,0 +1,458 @@
+goog.provide('ol.style.Circle');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('ol.color');
+goog.require('ol.has');
+goog.require('ol.render.canvas');
+goog.require('ol.structs.IHasChecksum');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Image');
+goog.require('ol.style.ImageState');
+goog.require('ol.style.Stroke');
+
+
+
+/**
+ * @classdesc
+ * Set circle style for vector features.
+ *
+ * @constructor
+ * @param {olx.style.CircleOptions=} opt_options Options.
+ * @extends {ol.style.Image}
+ * @implements {ol.structs.IHasChecksum}
+ * @api
+ */
+ol.style.Circle = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {Array.<string>}
+   */
+  this.checksums_ = null;
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.canvas_ = null;
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.hitDetectionCanvas_ = null;
+
+  /**
+   * @private
+   * @type {ol.style.Fill}
+   */
+  this.fill_ = goog.isDef(options.fill) ? options.fill : null;
+
+  /**
+   * @private
+   * @type {ol.style.Stroke}
+   */
+  this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.radius_ = options.radius;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.origin_ = [0, 0];
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.hitDetectionOrigin_ = [0, 0];
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.anchor_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.size_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.imageSize_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.hitDetectionImageSize_ = null;
+
+  this.render_(options.atlasManager);
+
+  /**
+   * @type {boolean}
+   */
+  var snapToPixel = goog.isDef(options.snapToPixel) ?
+      options.snapToPixel : true;
+
+  goog.base(this, {
+    opacity: 1,
+    rotateWithView: false,
+    rotation: 0,
+    scale: 1,
+    snapToPixel: snapToPixel
+  });
+
+};
+goog.inherits(ol.style.Circle, ol.style.Image);
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.Circle.prototype.getAnchor = function() {
+  return this.anchor_;
+};
+
+
+/**
+ * @return {ol.style.Fill} Fill style.
+ * @api
+ */
+ol.style.Circle.prototype.getFill = function() {
+  return this.fill_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.getHitDetectionImage = function(pixelRatio) {
+  return this.hitDetectionCanvas_;
+};
+
+
+/**
+ * @param {number} pixelRatio Pixel ratio.
+ * @return {HTMLCanvasElement} Canvas element.
+ * @api
+ */
+ol.style.Circle.prototype.getImage = function(pixelRatio) {
+  return this.canvas_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.getImageState = function() {
+  return ol.style.ImageState.LOADED;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.getImageSize = function() {
+  return this.imageSize_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.getHitDetectionImageSize = function() {
+  return this.hitDetectionImageSize_;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.Circle.prototype.getOrigin = function() {
+  return this.origin_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.getHitDetectionOrigin = function() {
+  return this.hitDetectionOrigin_;
+};
+
+
+/**
+ * @return {number} Radius.
+ * @api
+ */
+ol.style.Circle.prototype.getRadius = function() {
+  return this.radius_;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.Circle.prototype.getSize = function() {
+  return this.size_;
+};
+
+
+/**
+ * @return {ol.style.Stroke} Stroke style.
+ * @api
+ */
+ol.style.Circle.prototype.getStroke = function() {
+  return this.stroke_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.listenImageChange = goog.nullFunction;
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.load = goog.nullFunction;
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.unlistenImageChange = goog.nullFunction;
+
+
+/**
+ * @typedef {{strokeStyle: (string|undefined), strokeWidth: number,
+ *   size: number, lineDash: Array.<number>}}
+ */
+ol.style.Circle.RenderOptions;
+
+
+/**
+ * @private
+ * @param {ol.style.AtlasManager|undefined} atlasManager
+ */
+ol.style.Circle.prototype.render_ = function(atlasManager) {
+  var imageSize;
+  var lineDash = null;
+  var strokeStyle;
+  var strokeWidth = 0;
+
+  if (!goog.isNull(this.stroke_)) {
+    strokeStyle = ol.color.asString(this.stroke_.getColor());
+    strokeWidth = this.stroke_.getWidth();
+    if (!goog.isDef(strokeWidth)) {
+      strokeWidth = ol.render.canvas.defaultLineWidth;
+    }
+    lineDash = this.stroke_.getLineDash();
+    if (!ol.has.CANVAS_LINE_DASH) {
+      lineDash = null;
+    }
+  }
+
+
+  var size = 2 * (this.radius_ + strokeWidth) + 1;
+
+  /** @type {ol.style.Circle.RenderOptions} */
+  var renderOptions = {
+    strokeStyle: strokeStyle,
+    strokeWidth: strokeWidth,
+    size: size,
+    lineDash: lineDash
+  };
+
+  if (!goog.isDef(atlasManager)) {
+    // no atlas manager is used, create a new canvas
+    this.canvas_ = /** @type {HTMLCanvasElement} */
+        (goog.dom.createElement(goog.dom.TagName.CANVAS));
+    this.canvas_.height = size;
+    this.canvas_.width = size;
+
+    // canvas.width and height are rounded to the closest integer
+    size = this.canvas_.width;
+    imageSize = size;
+
+    // draw the circle on the canvas
+    var context = /** @type {CanvasRenderingContext2D} */
+        (this.canvas_.getContext('2d'));
+    this.draw_(renderOptions, context, 0, 0);
+
+    this.createHitDetectionCanvas_(renderOptions);
+  } else {
+    // an atlas manager is used, add the symbol to an atlas
+    size = Math.round(size);
+
+    var hasCustomHitDetectionImage = goog.isNull(this.fill_);
+    var renderHitDetectionCallback;
+    if (hasCustomHitDetectionImage) {
+      // render the hit-detection image into a separate atlas image
+      renderHitDetectionCallback =
+          goog.bind(this.drawHitDetectionCanvas_, this, renderOptions);
+    }
+
+    var id = this.getChecksum();
+    var info = atlasManager.add(
+        id, size, size, goog.bind(this.draw_, this, renderOptions),
+        renderHitDetectionCallback);
+    goog.asserts.assert(info !== null, 'circle radius is too large');
+
+    this.canvas_ = info.image;
+    this.origin_ = [info.offsetX, info.offsetY];
+    imageSize = info.image.width;
+
+    if (hasCustomHitDetectionImage) {
+      this.hitDetectionCanvas_ = info.hitImage;
+      this.hitDetectionOrigin_ = [info.hitOffsetX, info.hitOffsetY];
+      this.hitDetectionImageSize_ =
+          [info.hitImage.width, info.hitImage.height];
+    } else {
+      this.hitDetectionCanvas_ = this.canvas_;
+      this.hitDetectionOrigin_ = this.origin_;
+      this.hitDetectionImageSize_ = [imageSize, imageSize];
+    }
+  }
+
+  this.anchor_ = [size / 2, size / 2];
+  this.size_ = [size, size];
+  this.imageSize_ = [imageSize, imageSize];
+};
+
+
+/**
+ * @private
+ * @param {ol.style.Circle.RenderOptions} renderOptions
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} x The origin for the symbol (x).
+ * @param {number} y The origin for the symbol (y).
+ */
+ol.style.Circle.prototype.draw_ = function(renderOptions, context, x, y) {
+  // reset transform
+  context.setTransform(1, 0, 0, 1, 0, 0);
+
+  // then move to (x, y)
+  context.translate(x, y);
+
+  context.beginPath();
+  context.arc(
+      renderOptions.size / 2, renderOptions.size / 2,
+      this.radius_, 0, 2 * Math.PI, true);
+
+  if (!goog.isNull(this.fill_)) {
+    context.fillStyle = ol.color.asString(this.fill_.getColor());
+    context.fill();
+  }
+  if (!goog.isNull(this.stroke_)) {
+    context.strokeStyle = renderOptions.strokeStyle;
+    context.lineWidth = renderOptions.strokeWidth;
+    if (!goog.isNull(renderOptions.lineDash)) {
+      context.setLineDash(renderOptions.lineDash);
+    }
+    context.stroke();
+  }
+  context.closePath();
+};
+
+
+/**
+ * @private
+ * @param {ol.style.Circle.RenderOptions} renderOptions
+ */
+ol.style.Circle.prototype.createHitDetectionCanvas_ = function(renderOptions) {
+  this.hitDetectionImageSize_ = [renderOptions.size, renderOptions.size];
+  if (!goog.isNull(this.fill_)) {
+    this.hitDetectionCanvas_ = this.canvas_;
+    return;
+  }
+
+  // if no fill style is set, create an extra hit-detection image with a
+  // default fill style
+  this.hitDetectionCanvas_ = /** @type {HTMLCanvasElement} */
+      (goog.dom.createElement(goog.dom.TagName.CANVAS));
+  var canvas = this.hitDetectionCanvas_;
+
+  canvas.height = renderOptions.size;
+  canvas.width = renderOptions.size;
+
+  var context = /** @type {CanvasRenderingContext2D} */
+      (canvas.getContext('2d'));
+  this.drawHitDetectionCanvas_(renderOptions, context, 0, 0);
+};
+
+
+/**
+ * @private
+ * @param {ol.style.Circle.RenderOptions} renderOptions
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} x The origin for the symbol (x).
+ * @param {number} y The origin for the symbol (y).
+ */
+ol.style.Circle.prototype.drawHitDetectionCanvas_ =
+    function(renderOptions, context, x, y) {
+  // reset transform
+  context.setTransform(1, 0, 0, 1, 0, 0);
+
+  // then move to (x, y)
+  context.translate(x, y);
+
+  context.beginPath();
+  context.arc(
+      renderOptions.size / 2, renderOptions.size / 2,
+      this.radius_, 0, 2 * Math.PI, true);
+
+  context.fillStyle = ol.render.canvas.defaultFillStyle;
+  context.fill();
+  if (!goog.isNull(this.stroke_)) {
+    context.strokeStyle = renderOptions.strokeStyle;
+    context.lineWidth = renderOptions.strokeWidth;
+    if (!goog.isNull(renderOptions.lineDash)) {
+      context.setLineDash(renderOptions.lineDash);
+    }
+    context.stroke();
+  }
+  context.closePath();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Circle.prototype.getChecksum = function() {
+  var strokeChecksum = !goog.isNull(this.stroke_) ?
+      this.stroke_.getChecksum() : '-';
+  var fillChecksum = !goog.isNull(this.fill_) ?
+      this.fill_.getChecksum() : '-';
+
+  var recalculate = goog.isNull(this.checksums_) ||
+      (strokeChecksum != this.checksums_[1] ||
+      fillChecksum != this.checksums_[2] ||
+      this.radius_ != this.checksums_[3]);
+
+  if (recalculate) {
+    var checksum = 'c' + strokeChecksum + fillChecksum +
+        (goog.isDef(this.radius_) ? this.radius_.toString() : '-');
+    this.checksums_ = [checksum, strokeChecksum, fillChecksum, this.radius_];
+  }
+
+  return this.checksums_[0];
+};
diff --git a/src/ol/style/fillstyle.js b/src/ol/style/fillstyle.js
new file mode 100644
index 0000000..4fd62d7
--- /dev/null
+++ b/src/ol/style/fillstyle.js
@@ -0,0 +1,66 @@
+goog.provide('ol.style.Fill');
+
+goog.require('ol.color');
+goog.require('ol.structs.IHasChecksum');
+
+
+
+/**
+ * @classdesc
+ * Set fill style for vector features.
+ *
+ * @constructor
+ * @param {olx.style.FillOptions=} opt_options Options.
+ * @implements {ol.structs.IHasChecksum}
+ * @api
+ */
+ol.style.Fill = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.Color|string}
+   */
+  this.color_ = goog.isDef(options.color) ? options.color : null;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * @return {ol.Color|string} Color.
+ * @api
+ */
+ol.style.Fill.prototype.getColor = function() {
+  return this.color_;
+};
+
+
+/**
+ * Set the color.
+ *
+ * @param {ol.Color|string} color Color.
+ * @api
+ */
+ol.style.Fill.prototype.setColor = function(color) {
+  this.color_ = color;
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Fill.prototype.getChecksum = function() {
+  if (!goog.isDef(this.checksum_)) {
+    this.checksum_ = 'f' + (!goog.isNull(this.color_) ?
+        ol.color.asString(this.color_) : '-');
+  }
+
+  return this.checksum_;
+};
diff --git a/src/ol/style/iconstyle.js b/src/ol/style/iconstyle.js
new file mode 100644
index 0000000..9913c64
--- /dev/null
+++ b/src/ol/style/iconstyle.js
@@ -0,0 +1,656 @@
+goog.provide('ol.style.Icon');
+goog.provide('ol.style.IconAnchorUnits');
+goog.provide('ol.style.IconImageCache');
+goog.provide('ol.style.IconOrigin');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.events.EventTarget');
+goog.require('goog.events.EventType');
+goog.require('ol.dom');
+goog.require('ol.style.Image');
+goog.require('ol.style.ImageState');
+
+
+/**
+ * Icon anchor units. One of 'fraction', 'pixels'.
+ * @enum {string}
+ * @api
+ */
+ol.style.IconAnchorUnits = {
+  FRACTION: 'fraction',
+  PIXELS: 'pixels'
+};
+
+
+/**
+ * Icon origin. One of 'bottom-left', 'bottom-right', 'top-left', 'top-right'.
+ * @enum {string}
+ * @api
+ */
+ol.style.IconOrigin = {
+  BOTTOM_LEFT: 'bottom-left',
+  BOTTOM_RIGHT: 'bottom-right',
+  TOP_LEFT: 'top-left',
+  TOP_RIGHT: 'top-right'
+};
+
+
+
+/**
+ * @classdesc
+ * Set icon style for vector features.
+ *
+ * @constructor
+ * @param {olx.style.IconOptions=} opt_options Options.
+ * @extends {ol.style.Image}
+ * @api
+ */
+ol.style.Icon = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.anchor_ = goog.isDef(options.anchor) ? options.anchor : [0.5, 0.5];
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.normalizedAnchor_ = null;
+
+  /**
+   * @private
+   * @type {ol.style.IconOrigin}
+   */
+  this.anchorOrigin_ = goog.isDef(options.anchorOrigin) ?
+      options.anchorOrigin : ol.style.IconOrigin.TOP_LEFT;
+
+  /**
+   * @private
+   * @type {ol.style.IconAnchorUnits}
+   */
+  this.anchorXUnits_ = goog.isDef(options.anchorXUnits) ?
+      options.anchorXUnits : ol.style.IconAnchorUnits.FRACTION;
+
+  /**
+   * @private
+   * @type {ol.style.IconAnchorUnits}
+   */
+  this.anchorYUnits_ = goog.isDef(options.anchorYUnits) ?
+      options.anchorYUnits : ol.style.IconAnchorUnits.FRACTION;
+
+  /**
+   * @type {?string}
+   */
+  var crossOrigin =
+      goog.isDef(options.crossOrigin) ? options.crossOrigin : null;
+
+  /**
+   * @type {Image}
+   */
+  var image = goog.isDef(options.img) ? options.img : null;
+
+  /**
+   * @type {string|undefined}
+   */
+  var src = options.src;
+
+  if ((!goog.isDef(src) || src.length === 0) && !goog.isNull(image)) {
+    src = image.src;
+  }
+  goog.asserts.assert(goog.isDef(src) && src.length > 0);
+
+  /**
+   * @type {ol.style.ImageState}
+   */
+  var imageState = goog.isDef(options.src) ?
+      ol.style.ImageState.IDLE : ol.style.ImageState.LOADED;
+
+  /**
+   * @private
+   * @type {ol.style.IconImage_}
+   */
+  this.iconImage_ = ol.style.IconImage_.get(
+      image, src, crossOrigin, imageState);
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.offset_ = goog.isDef(options.offset) ? options.offset : [0, 0];
+
+  /**
+   * @private
+   * @type {ol.style.IconOrigin}
+   */
+  this.offsetOrigin_ = goog.isDef(options.offsetOrigin) ?
+      options.offsetOrigin : ol.style.IconOrigin.TOP_LEFT;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.origin_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.size_ = goog.isDef(options.size) ? options.size : null;
+
+  /**
+   * @type {number}
+   */
+  var opacity = goog.isDef(options.opacity) ? options.opacity : 1;
+
+  /**
+   * @type {boolean}
+   */
+  var rotateWithView = goog.isDef(options.rotateWithView) ?
+      options.rotateWithView : false;
+
+  /**
+   * @type {number}
+   */
+  var rotation = goog.isDef(options.rotation) ? options.rotation : 0;
+
+  /**
+   * @type {number}
+   */
+  var scale = goog.isDef(options.scale) ? options.scale : 1;
+
+  /**
+   * @type {boolean}
+   */
+  var snapToPixel = goog.isDef(options.snapToPixel) ?
+      options.snapToPixel : true;
+
+  goog.base(this, {
+    opacity: opacity,
+    rotation: rotation,
+    scale: scale,
+    snapToPixel: snapToPixel,
+    rotateWithView: rotateWithView
+  });
+
+};
+goog.inherits(ol.style.Icon, ol.style.Image);
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.Icon.prototype.getAnchor = function() {
+  if (!goog.isNull(this.normalizedAnchor_)) {
+    return this.normalizedAnchor_;
+  }
+  var anchor = this.anchor_;
+  var size = this.getSize();
+  if (this.anchorXUnits_ == ol.style.IconAnchorUnits.FRACTION ||
+      this.anchorYUnits_ == ol.style.IconAnchorUnits.FRACTION) {
+    if (goog.isNull(size)) {
+      return null;
+    }
+    anchor = this.anchor_.slice();
+    if (this.anchorXUnits_ == ol.style.IconAnchorUnits.FRACTION) {
+      anchor[0] *= size[0];
+    }
+    if (this.anchorYUnits_ == ol.style.IconAnchorUnits.FRACTION) {
+      anchor[1] *= size[1];
+    }
+  }
+
+  if (this.anchorOrigin_ != ol.style.IconOrigin.TOP_LEFT) {
+    if (goog.isNull(size)) {
+      return null;
+    }
+    if (anchor === this.anchor_) {
+      anchor = this.anchor_.slice();
+    }
+    if (this.anchorOrigin_ == ol.style.IconOrigin.TOP_RIGHT ||
+        this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
+      anchor[0] = -anchor[0] + size[0];
+    }
+    if (this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_LEFT ||
+        this.anchorOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
+      anchor[1] = -anchor[1] + size[1];
+    }
+  }
+  this.normalizedAnchor_ = anchor;
+  return this.normalizedAnchor_;
+};
+
+
+/**
+ * @param {number} pixelRatio Pixel ratio.
+ * @return {Image} Image element.
+ * @api
+ */
+ol.style.Icon.prototype.getImage = function(pixelRatio) {
+  return this.iconImage_.getImage(pixelRatio);
+};
+
+
+/**
+ * Real Image size used.
+ * @return {ol.Size} Size.
+ */
+ol.style.Icon.prototype.getImageSize = function() {
+  return this.iconImage_.getSize();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Icon.prototype.getHitDetectionImageSize = function() {
+  return this.getImageSize();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Icon.prototype.getImageState = function() {
+  return this.iconImage_.getImageState();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Icon.prototype.getHitDetectionImage = function(pixelRatio) {
+  return this.iconImage_.getHitDetectionImage(pixelRatio);
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.Icon.prototype.getOrigin = function() {
+  if (!goog.isNull(this.origin_)) {
+    return this.origin_;
+  }
+  var offset = this.offset_;
+
+  if (this.offsetOrigin_ != ol.style.IconOrigin.TOP_LEFT) {
+    var size = this.getSize();
+    var iconImageSize = this.iconImage_.getSize();
+    if (goog.isNull(size) || goog.isNull(iconImageSize)) {
+      return null;
+    }
+    offset = offset.slice();
+    if (this.offsetOrigin_ == ol.style.IconOrigin.TOP_RIGHT ||
+        this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
+      offset[0] = iconImageSize[0] - size[0] - offset[0];
+    }
+    if (this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_LEFT ||
+        this.offsetOrigin_ == ol.style.IconOrigin.BOTTOM_RIGHT) {
+      offset[1] = iconImageSize[1] - size[1] - offset[1];
+    }
+  }
+  this.origin_ = offset;
+  return this.origin_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Icon.prototype.getHitDetectionOrigin = function() {
+  return this.getOrigin();
+};
+
+
+/**
+ * @return {string|undefined} Image src.
+ * @api
+ */
+ol.style.Icon.prototype.getSrc = function() {
+  return this.iconImage_.getSrc();
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.Icon.prototype.getSize = function() {
+  return goog.isNull(this.size_) ? this.iconImage_.getSize() : this.size_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Icon.prototype.listenImageChange = function(listener, thisArg) {
+  return goog.events.listen(this.iconImage_, goog.events.EventType.CHANGE,
+      listener, false, thisArg);
+};
+
+
+/**
+ * Load not yet loaded URI.
+ */
+ol.style.Icon.prototype.load = function() {
+  this.iconImage_.load();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Icon.prototype.unlistenImageChange = function(listener, thisArg) {
+  goog.events.unlisten(this.iconImage_, goog.events.EventType.CHANGE,
+      listener, false, thisArg);
+};
+
+
+
+/**
+ * @constructor
+ * @param {Image} image Image.
+ * @param {string|undefined} src Src.
+ * @param {?string} crossOrigin Cross origin.
+ * @param {ol.style.ImageState} imageState Image state.
+ * @extends {goog.events.EventTarget}
+ * @private
+ */
+ol.style.IconImage_ = function(image, src, crossOrigin, imageState) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {Image|HTMLCanvasElement}
+   */
+  this.hitDetectionImage_ = null;
+
+  /**
+   * @private
+   * @type {Image}
+   */
+  this.image_ = goog.isNull(image) ? new Image() : image;
+
+  if (!goog.isNull(crossOrigin)) {
+    this.image_.crossOrigin = crossOrigin;
+  }
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.imageListenerKeys_ = null;
+
+  /**
+   * @private
+   * @type {ol.style.ImageState}
+   */
+  this.imageState_ = imageState;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.size_ = null;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.src_ = src;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.tainting_ = false;
+
+};
+goog.inherits(ol.style.IconImage_, goog.events.EventTarget);
+
+
+/**
+ * @param {Image} image Image.
+ * @param {string} src Src.
+ * @param {?string} crossOrigin Cross origin.
+ * @param {ol.style.ImageState} imageState Image state.
+ * @return {ol.style.IconImage_} Icon image.
+ */
+ol.style.IconImage_.get = function(image, src, crossOrigin, imageState) {
+  var iconImageCache = ol.style.IconImageCache.getInstance();
+  var iconImage = iconImageCache.get(src, crossOrigin);
+  if (goog.isNull(iconImage)) {
+    iconImage = new ol.style.IconImage_(image, src, crossOrigin, imageState);
+    iconImageCache.set(src, crossOrigin, iconImage);
+  }
+  return iconImage;
+};
+
+
+/**
+ * @private
+ */
+ol.style.IconImage_.prototype.determineTainting_ = function() {
+  var context = ol.dom.createCanvasContext2D(1, 1);
+  context.drawImage(this.image_, 0, 0);
+  try {
+    context.getImageData(0, 0, 1, 1);
+  } catch (e) {
+    this.tainting_ = true;
+  }
+};
+
+
+/**
+ * @private
+ */
+ol.style.IconImage_.prototype.dispatchChangeEvent_ = function() {
+  this.dispatchEvent(goog.events.EventType.CHANGE);
+};
+
+
+/**
+ * @private
+ */
+ol.style.IconImage_.prototype.handleImageError_ = function() {
+  this.imageState_ = ol.style.ImageState.ERROR;
+  this.unlistenImage_();
+  this.dispatchChangeEvent_();
+};
+
+
+/**
+ * @private
+ */
+ol.style.IconImage_.prototype.handleImageLoad_ = function() {
+  this.imageState_ = ol.style.ImageState.LOADED;
+  this.size_ = [this.image_.width, this.image_.height];
+  this.unlistenImage_();
+  this.determineTainting_();
+  this.dispatchChangeEvent_();
+};
+
+
+/**
+ * @param {number} pixelRatio Pixel ratio.
+ * @return {Image} Image element.
+ */
+ol.style.IconImage_.prototype.getImage = function(pixelRatio) {
+  return this.image_;
+};
+
+
+/**
+ * @return {ol.style.ImageState} Image state.
+ */
+ol.style.IconImage_.prototype.getImageState = function() {
+  return this.imageState_;
+};
+
+
+/**
+ * @param {number} pixelRatio Pixel ratio.
+ * @return {Image|HTMLCanvasElement} Image element.
+ */
+ol.style.IconImage_.prototype.getHitDetectionImage = function(pixelRatio) {
+  if (goog.isNull(this.hitDetectionImage_)) {
+    if (this.tainting_) {
+      var width = this.size_[0];
+      var height = this.size_[1];
+      var context = ol.dom.createCanvasContext2D(width, height);
+      context.fillRect(0, 0, width, height);
+      this.hitDetectionImage_ = context.canvas;
+    } else {
+      this.hitDetectionImage_ = this.image_;
+    }
+  }
+  return this.hitDetectionImage_;
+};
+
+
+/**
+ * @return {ol.Size} Image size.
+ */
+ol.style.IconImage_.prototype.getSize = function() {
+  return this.size_;
+};
+
+
+/**
+ * @return {string|undefined} Image src.
+ */
+ol.style.IconImage_.prototype.getSrc = function() {
+  return this.src_;
+};
+
+
+/**
+ * Load not yet loaded URI.
+ */
+ol.style.IconImage_.prototype.load = function() {
+  if (this.imageState_ == ol.style.ImageState.IDLE) {
+    goog.asserts.assert(goog.isDef(this.src_));
+    goog.asserts.assert(goog.isNull(this.imageListenerKeys_));
+    this.imageState_ = ol.style.ImageState.LOADING;
+    this.imageListenerKeys_ = [
+      goog.events.listenOnce(this.image_, goog.events.EventType.ERROR,
+          this.handleImageError_, false, this),
+      goog.events.listenOnce(this.image_, goog.events.EventType.LOAD,
+          this.handleImageLoad_, false, this)
+    ];
+    try {
+      this.image_.src = this.src_;
+    } catch (e) {
+      this.handleImageError_();
+    }
+  }
+};
+
+
+/**
+ * Discards event handlers which listen for load completion or errors.
+ *
+ * @private
+ */
+ol.style.IconImage_.prototype.unlistenImage_ = function() {
+  goog.asserts.assert(!goog.isNull(this.imageListenerKeys_));
+  goog.array.forEach(this.imageListenerKeys_, goog.events.unlistenByKey);
+  this.imageListenerKeys_ = null;
+};
+
+
+
+/**
+ * @constructor
+ */
+ol.style.IconImageCache = function() {
+
+  /**
+   * @type {Object.<string, ol.style.IconImage_>}
+   * @private
+   */
+  this.cache_ = {};
+
+  /**
+   * @type {number}
+   * @private
+   */
+  this.cacheSize_ = 0;
+
+  /**
+   * @const
+   * @type {number}
+   * @private
+   */
+  this.maxCacheSize_ = 32;
+};
+goog.addSingletonGetter(ol.style.IconImageCache);
+
+
+/**
+ * @param {string} src Src.
+ * @param {?string} crossOrigin Cross origin.
+ * @return {string} Cache key.
+ */
+ol.style.IconImageCache.getKey = function(src, crossOrigin) {
+  goog.asserts.assert(goog.isDef(crossOrigin));
+  return crossOrigin + ':' + src;
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.style.IconImageCache.prototype.clear = function() {
+  this.cache_ = {};
+  this.cacheSize_ = 0;
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.style.IconImageCache.prototype.expire = function() {
+  if (this.cacheSize_ > this.maxCacheSize_) {
+    var i = 0;
+    var key, iconImage;
+    for (key in this.cache_) {
+      iconImage = this.cache_[key];
+      if ((i++ & 3) === 0 && !goog.events.hasListener(iconImage)) {
+        delete this.cache_[key];
+        --this.cacheSize_;
+      }
+    }
+  }
+};
+
+
+/**
+ * @param {string} src Src.
+ * @param {?string} crossOrigin Cross origin.
+ * @return {ol.style.IconImage_} Icon image.
+ */
+ol.style.IconImageCache.prototype.get = function(src, crossOrigin) {
+  var key = ol.style.IconImageCache.getKey(src, crossOrigin);
+  return key in this.cache_ ? this.cache_[key] : null;
+};
+
+
+/**
+ * @param {string} src Src.
+ * @param {?string} crossOrigin Cross origin.
+ * @param {ol.style.IconImage_} iconImage Icon image.
+ */
+ol.style.IconImageCache.prototype.set = function(src, crossOrigin, iconImage) {
+  var key = ol.style.IconImageCache.getKey(src, crossOrigin);
+  this.cache_[key] = iconImage;
+  ++this.cacheSize_;
+};
diff --git a/src/ol/style/imagestyle.js b/src/ol/style/imagestyle.js
new file mode 100644
index 0000000..d34d74c
--- /dev/null
+++ b/src/ol/style/imagestyle.js
@@ -0,0 +1,250 @@
+goog.provide('ol.style.Image');
+goog.provide('ol.style.ImageState');
+
+
+/**
+ * @enum {number}
+ */
+ol.style.ImageState = {
+  IDLE: 0,
+  LOADING: 1,
+  LOADED: 2,
+  ERROR: 3
+};
+
+
+/**
+ * @typedef {{opacity: number,
+ *            rotateWithView: boolean,
+ *            rotation: number,
+ *            scale: number,
+ *            snapToPixel: boolean}}
+ */
+ol.style.ImageOptions;
+
+
+
+/**
+ * @classdesc
+ * Abstract base class; used for creating subclasses and not instantiated in
+ * apps. Base class for {@link ol.style.Icon} and {@link ol.style.Circle}.
+ *
+ * @constructor
+ * @param {ol.style.ImageOptions} options Options.
+ * @api
+ */
+ol.style.Image = function(options) {
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.opacity_ = options.opacity;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.rotateWithView_ = options.rotateWithView;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.rotation_ = options.rotation;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.scale_ = options.scale;
+
+  /**
+   * @private
+   * @type {boolean}
+   */
+  this.snapToPixel_ = options.snapToPixel;
+
+};
+
+
+/**
+ * @return {number} Opacity.
+ * @api
+ */
+ol.style.Image.prototype.getOpacity = function() {
+  return this.opacity_;
+};
+
+
+/**
+ * @return {boolean} Rotate with map.
+ * @api
+ */
+ol.style.Image.prototype.getRotateWithView = function() {
+  return this.rotateWithView_;
+};
+
+
+/**
+ * @return {number} Rotation.
+ * @api
+ */
+ol.style.Image.prototype.getRotation = function() {
+  return this.rotation_;
+};
+
+
+/**
+ * @return {number} Scale.
+ * @api
+ */
+ol.style.Image.prototype.getScale = function() {
+  return this.scale_;
+};
+
+
+/**
+ * @return {boolean} Snap to pixel?
+ * @api
+ */
+ol.style.Image.prototype.getSnapToPixel = function() {
+  return this.snapToPixel_;
+};
+
+
+/**
+ * @function
+ * @return {Array.<number>} Anchor.
+ */
+ol.style.Image.prototype.getAnchor = goog.abstractMethod;
+
+
+/**
+ * @function
+ * @param {number} pixelRatio Pixel ratio.
+ * @return {HTMLCanvasElement|HTMLVideoElement|Image} Image element.
+ * @api
+ */
+ol.style.Image.prototype.getImage = goog.abstractMethod;
+
+
+/**
+ * @param {number} pixelRatio Pixel ratio.
+ * @return {HTMLCanvasElement|HTMLVideoElement|Image} Image element.
+ */
+ol.style.Image.prototype.getHitDetectionImage = goog.abstractMethod;
+
+
+/**
+ * @return {ol.style.ImageState} Image state.
+ */
+ol.style.Image.prototype.getImageState = goog.abstractMethod;
+
+
+/**
+ * @return {ol.Size} Image size.
+ */
+ol.style.Image.prototype.getImageSize = goog.abstractMethod;
+
+
+/**
+ * @return {ol.Size} Size of the hit-detection image.
+ */
+ol.style.Image.prototype.getHitDetectionImageSize = goog.abstractMethod;
+
+
+/**
+ * @function
+ * @return {Array.<number>} Origin.
+ */
+ol.style.Image.prototype.getOrigin = goog.abstractMethod;
+
+
+/**
+ * @function
+ * @return {Array.<number>} Origin for the hit-detection image.
+ */
+ol.style.Image.prototype.getHitDetectionOrigin = goog.abstractMethod;
+
+
+/**
+ * @function
+ * @return {ol.Size} Size.
+ */
+ol.style.Image.prototype.getSize = goog.abstractMethod;
+
+
+/**
+ * Set the opacity.
+ *
+ * @param {number} opacity Opacity.
+ */
+ol.style.Image.prototype.setOpacity = function(opacity) {
+  this.opacity_ = opacity;
+};
+
+
+/**
+ * Set whether to rotate the style with the view.
+ *
+ * @param {boolean} rotateWithView Rotate with map.
+ */
+ol.style.Image.prototype.setRotateWithView = function(rotateWithView) {
+  this.rotateWithView_ = rotateWithView;
+};
+
+
+/**
+ * Set the rotation.
+ *
+ * @param {number} rotation Rotation.
+ * @api
+ */
+ol.style.Image.prototype.setRotation = function(rotation) {
+  this.rotation_ = rotation;
+};
+
+
+/**
+ * Set the scale.
+ *
+ * @param {number} scale Scale.
+ * @api
+ */
+ol.style.Image.prototype.setScale = function(scale) {
+  this.scale_ = scale;
+};
+
+
+/**
+ * Set whether to snap the image to the closest pixel.
+ *
+ * @param {boolean} snapToPixel Snap to pixel?
+ */
+ol.style.Image.prototype.setSnapToPixel = function(snapToPixel) {
+  this.snapToPixel_ = snapToPixel;
+};
+
+
+/**
+ * @param {function(this: T, goog.events.Event)} listener Listener function.
+ * @param {T} thisArg Value to use as `this` when executing `listener`.
+ * @return {goog.events.Key|undefined} Listener key.
+ * @template T
+ */
+ol.style.Image.prototype.listenImageChange = goog.abstractMethod;
+
+
+/**
+ * Load not yet loaded URI.
+ */
+ol.style.Image.prototype.load = goog.abstractMethod;
+
+
+/**
+ * @param {function(this: T, goog.events.Event)} listener Listener function.
+ * @param {T} thisArg Value to use as `this` when executing `listener`.
+ * @template T
+ */
+ol.style.Image.prototype.unlistenImageChange = goog.abstractMethod;
diff --git a/src/ol/style/regularshapestyle.js b/src/ol/style/regularshapestyle.js
new file mode 100644
index 0000000..cde61ff
--- /dev/null
+++ b/src/ol/style/regularshapestyle.js
@@ -0,0 +1,527 @@
+goog.provide('ol.style.RegularShape');
+
+goog.require('goog.asserts');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('ol.color');
+goog.require('ol.has');
+goog.require('ol.render.canvas');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Image');
+goog.require('ol.style.ImageState');
+goog.require('ol.style.Stroke');
+
+
+
+/**
+ * @classdesc
+ * Set regular shape style for vector features. The resulting shape will be
+ * a regular polygon when `radius` is provided, or a star when `radius1` and
+ * `radius2` are provided.
+ *
+ * @constructor
+ * @param {olx.style.RegularShapeOptions} options Options.
+ * @extends {ol.style.Image}
+ * @implements {ol.structs.IHasChecksum}
+ * @api
+ */
+ol.style.RegularShape = function(options) {
+
+  goog.asserts.assert(goog.isDef(options.radius) ||
+      goog.isDef(options.radius1));
+
+  /**
+   * @private
+   * @type {Array.<string>}
+   */
+  this.checksums_ = null;
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.canvas_ = null;
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.hitDetectionCanvas_ = null;
+
+  /**
+   * @private
+   * @type {ol.style.Fill}
+   */
+  this.fill_ = goog.isDef(options.fill) ? options.fill : null;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.origin_ = [0, 0];
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.hitDetectionOrigin_ = [0, 0];
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.points_ = options.points;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.radius_ = /** @type {number} */ (goog.isDef(options.radius) ?
+      options.radius : options.radius1);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.radius2_ =
+      goog.isDef(options.radius2) ? options.radius2 : this.radius_;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.angle_ = goog.isDef(options.angle) ? options.angle : 0;
+
+  /**
+   * @private
+   * @type {ol.style.Stroke}
+   */
+  this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.anchor_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.size_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.imageSize_ = null;
+
+  /**
+   * @private
+   * @type {ol.Size}
+   */
+  this.hitDetectionImageSize_ = null;
+
+  this.render_(options.atlasManager);
+
+  /**
+   * @type {boolean}
+   */
+  var snapToPixel = goog.isDef(options.snapToPixel) ?
+      options.snapToPixel : true;
+
+  goog.base(this, {
+    opacity: 1,
+    rotateWithView: false,
+    rotation: goog.isDef(options.rotation) ? options.rotation : 0,
+    scale: 1,
+    snapToPixel: snapToPixel
+  });
+
+};
+goog.inherits(ol.style.RegularShape, ol.style.Image);
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.RegularShape.prototype.getAnchor = function() {
+  return this.anchor_;
+};
+
+
+/**
+ * @return {number} Shape's rotation in radians.
+ * @api
+ */
+ol.style.RegularShape.prototype.getAngle = function() {
+  return this.angle_;
+};
+
+
+/**
+ * @return {ol.style.Fill} Fill style.
+ * @api
+ */
+ol.style.RegularShape.prototype.getFill = function() {
+  return this.fill_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.getHitDetectionImage = function(pixelRatio) {
+  return this.hitDetectionCanvas_;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.RegularShape.prototype.getImage = function(pixelRatio) {
+  return this.canvas_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.getImageSize = function() {
+  return this.imageSize_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.getHitDetectionImageSize = function() {
+  return this.hitDetectionImageSize_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.getImageState = function() {
+  return ol.style.ImageState.LOADED;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.RegularShape.prototype.getOrigin = function() {
+  return this.origin_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.getHitDetectionOrigin = function() {
+  return this.hitDetectionOrigin_;
+};
+
+
+/**
+ * @return {number} Number of points for stars and regular polygons.
+ * @api
+ */
+ol.style.RegularShape.prototype.getPoints = function() {
+  return this.points_;
+};
+
+
+/**
+ * @return {number} Radius.
+ * @api
+ */
+ol.style.RegularShape.prototype.getRadius = function() {
+  return this.radius_;
+};
+
+
+/**
+ * @return {number} Radius2.
+ * @api
+ */
+ol.style.RegularShape.prototype.getRadius2 = function() {
+  return this.radius2_;
+};
+
+
+/**
+ * @inheritDoc
+ * @api
+ */
+ol.style.RegularShape.prototype.getSize = function() {
+  return this.size_;
+};
+
+
+/**
+ * @return {ol.style.Stroke} Stroke style.
+ * @api
+ */
+ol.style.RegularShape.prototype.getStroke = function() {
+  return this.stroke_;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.listenImageChange = goog.nullFunction;
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.load = goog.nullFunction;
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.unlistenImageChange = goog.nullFunction;
+
+
+/**
+ * @typedef {{strokeStyle: (string|undefined), strokeWidth: number,
+ *   size: number, lineDash: Array.<number>}}
+ */
+ol.style.RegularShape.RenderOptions;
+
+
+/**
+ * @private
+ * @param {ol.style.AtlasManager|undefined} atlasManager
+ */
+ol.style.RegularShape.prototype.render_ = function(atlasManager) {
+  var imageSize;
+  var lineDash = null;
+  var strokeStyle;
+  var strokeWidth = 0;
+
+  if (!goog.isNull(this.stroke_)) {
+    strokeStyle = ol.color.asString(this.stroke_.getColor());
+    strokeWidth = this.stroke_.getWidth();
+    if (!goog.isDef(strokeWidth)) {
+      strokeWidth = ol.render.canvas.defaultLineWidth;
+    }
+    lineDash = this.stroke_.getLineDash();
+    if (!ol.has.CANVAS_LINE_DASH) {
+      lineDash = null;
+    }
+  }
+
+  var size = 2 * (this.radius_ + strokeWidth) + 1;
+
+  /** @type {ol.style.RegularShape.RenderOptions} */
+  var renderOptions = {
+    strokeStyle: strokeStyle,
+    strokeWidth: strokeWidth,
+    size: size,
+    lineDash: lineDash
+  };
+
+  if (!goog.isDef(atlasManager)) {
+    // no atlas manager is used, create a new canvas
+    this.canvas_ = /** @type {HTMLCanvasElement} */
+        (goog.dom.createElement(goog.dom.TagName.CANVAS));
+
+    this.canvas_.height = size;
+    this.canvas_.width = size;
+
+    // canvas.width and height are rounded to the closest integer
+    size = this.canvas_.width;
+    imageSize = size;
+
+    var context = /** @type {CanvasRenderingContext2D} */
+        (this.canvas_.getContext('2d'));
+    this.draw_(renderOptions, context, 0, 0);
+
+    this.createHitDetectionCanvas_(renderOptions);
+  } else {
+    // an atlas manager is used, add the symbol to an atlas
+    size = Math.round(size);
+
+    var hasCustomHitDetectionImage = goog.isNull(this.fill_);
+    var renderHitDetectionCallback;
+    if (hasCustomHitDetectionImage) {
+      // render the hit-detection image into a separate atlas image
+      renderHitDetectionCallback =
+          goog.bind(this.drawHitDetectionCanvas_, this, renderOptions);
+    }
+
+    var id = this.getChecksum();
+    var info = atlasManager.add(
+        id, size, size, goog.bind(this.draw_, this, renderOptions),
+        renderHitDetectionCallback);
+    goog.asserts.assert(!goog.isNull(info), 'shape size is too large');
+
+    this.canvas_ = info.image;
+    this.origin_ = [info.offsetX, info.offsetY];
+    imageSize = info.image.width;
+
+    if (hasCustomHitDetectionImage) {
+      this.hitDetectionCanvas_ = info.hitImage;
+      this.hitDetectionOrigin_ = [info.hitOffsetX, info.hitOffsetY];
+      this.hitDetectionImageSize_ =
+          [info.hitImage.width, info.hitImage.height];
+    } else {
+      this.hitDetectionCanvas_ = this.canvas_;
+      this.hitDetectionOrigin_ = this.origin_;
+      this.hitDetectionImageSize_ = [imageSize, imageSize];
+    }
+  }
+
+  this.anchor_ = [size / 2, size / 2];
+  this.size_ = [size, size];
+  this.imageSize_ = [imageSize, imageSize];
+};
+
+
+/**
+ * @private
+ * @param {ol.style.Circle.RenderOptions} renderOptions
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} x The origin for the symbol (x).
+ * @param {number} y The origin for the symbol (y).
+ */
+ol.style.RegularShape.prototype.draw_ = function(renderOptions, context, x, y) {
+  var i, angle0, radiusC;
+  // reset transform
+  context.setTransform(1, 0, 0, 1, 0, 0);
+
+  // then move to (x, y)
+  context.translate(x, y);
+
+  context.beginPath();
+  if (this.radius2_ !== this.radius_) {
+    this.points_ = 2 * this.points_;
+  }
+  for (i = 0; i <= this.points_; i++) {
+    angle0 = i * 2 * Math.PI / this.points_ - Math.PI / 2 + this.angle_;
+    radiusC = i % 2 === 0 ? this.radius_ : this.radius2_;
+    context.lineTo(renderOptions.size / 2 + radiusC * Math.cos(angle0),
+                   renderOptions.size / 2 + radiusC * Math.sin(angle0));
+  }
+
+  if (!goog.isNull(this.fill_)) {
+    context.fillStyle = ol.color.asString(this.fill_.getColor());
+    context.fill();
+  }
+  if (!goog.isNull(this.stroke_)) {
+    context.strokeStyle = renderOptions.strokeStyle;
+    context.lineWidth = renderOptions.strokeWidth;
+    if (!goog.isNull(renderOptions.lineDash)) {
+      context.setLineDash(renderOptions.lineDash);
+    }
+    context.stroke();
+  }
+  context.closePath();
+};
+
+
+/**
+ * @private
+ * @param {ol.style.RegularShape.RenderOptions} renderOptions
+ */
+ol.style.RegularShape.prototype.createHitDetectionCanvas_ =
+    function(renderOptions) {
+  this.hitDetectionImageSize_ = [renderOptions.size, renderOptions.size];
+  if (!goog.isNull(this.fill_)) {
+    this.hitDetectionCanvas_ = this.canvas_;
+    return;
+  }
+
+  // if no fill style is set, create an extra hit-detection image with a
+  // default fill style
+  this.hitDetectionCanvas_ = /** @type {HTMLCanvasElement} */
+      (goog.dom.createElement(goog.dom.TagName.CANVAS));
+  var canvas = this.hitDetectionCanvas_;
+
+  canvas.height = renderOptions.size;
+  canvas.width = renderOptions.size;
+
+  var context = /** @type {CanvasRenderingContext2D} */
+      (canvas.getContext('2d'));
+  this.drawHitDetectionCanvas_(renderOptions, context, 0, 0);
+};
+
+
+/**
+ * @private
+ * @param {ol.style.RegularShape.RenderOptions} renderOptions
+ * @param {CanvasRenderingContext2D} context
+ * @param {number} x The origin for the symbol (x).
+ * @param {number} y The origin for the symbol (y).
+ */
+ol.style.RegularShape.prototype.drawHitDetectionCanvas_ =
+    function(renderOptions, context, x, y) {
+  // reset transform
+  context.setTransform(1, 0, 0, 1, 0, 0);
+
+  // then move to (x, y)
+  context.translate(x, y);
+
+  context.beginPath();
+  if (this.radius2_ !== this.radius_) {
+    this.points_ = 2 * this.points_;
+  }
+  var i, radiusC, angle0;
+  for (i = 0; i <= this.points_; i++) {
+    angle0 = i * 2 * Math.PI / this.points_ - Math.PI / 2 + this.angle_;
+    radiusC = i % 2 === 0 ? this.radius_ : this.radius2_;
+    context.lineTo(renderOptions.size / 2 + radiusC * Math.cos(angle0),
+                   renderOptions.size / 2 + radiusC * Math.sin(angle0));
+  }
+
+  context.fillStyle = ol.render.canvas.defaultFillStyle;
+  context.fill();
+  if (!goog.isNull(this.stroke_)) {
+    context.strokeStyle = renderOptions.strokeStyle;
+    context.lineWidth = renderOptions.strokeWidth;
+    if (!goog.isNull(renderOptions.lineDash)) {
+      context.setLineDash(renderOptions.lineDash);
+    }
+    context.stroke();
+  }
+  context.closePath();
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.RegularShape.prototype.getChecksum = function() {
+  var strokeChecksum = !goog.isNull(this.stroke_) ?
+      this.stroke_.getChecksum() : '-';
+  var fillChecksum = !goog.isNull(this.fill_) ?
+      this.fill_.getChecksum() : '-';
+
+  var recalculate = goog.isNull(this.checksums_) ||
+      (strokeChecksum != this.checksums_[1] ||
+      fillChecksum != this.checksums_[2] ||
+      this.radius_ != this.checksums_[3] ||
+      this.radius2_ != this.checksums_[4] ||
+      this.angle_ != this.checksums_[5] ||
+      this.points_ != this.checksums_[6]);
+
+  if (recalculate) {
+    var checksum = 'r' + strokeChecksum + fillChecksum +
+        (goog.isDef(this.radius_) ? this.radius_.toString() : '-') +
+        (goog.isDef(this.radius2_) ? this.radius2_.toString() : '-') +
+        (goog.isDef(this.angle_) ? this.angle_.toString() : '-') +
+        (goog.isDef(this.points_) ? this.points_.toString() : '-');
+    this.checksums_ = [checksum, strokeChecksum, fillChecksum,
+      this.radius_, this.radius2_, this.angle_, this.points_];
+  }
+
+  return this.checksums_[0];
+};
diff --git a/src/ol/style/strokestyle.js b/src/ol/style/strokestyle.js
new file mode 100644
index 0000000..a679df2
--- /dev/null
+++ b/src/ol/style/strokestyle.js
@@ -0,0 +1,221 @@
+goog.provide('ol.style.Stroke');
+
+goog.require('goog.crypt');
+goog.require('goog.crypt.Md5');
+goog.require('ol.color');
+goog.require('ol.structs.IHasChecksum');
+
+
+
+/**
+ * @classdesc
+ * Set stroke style for vector features.
+ * Note that the defaults given are the Canvas defaults, which will be used if
+ * option is not defined. The `get` functions return whatever was entered in
+ * the options; they will not return the default.
+ *
+ * @constructor
+ * @param {olx.style.StrokeOptions=} opt_options Options.
+ * @implements {ol.structs.IHasChecksum}
+ * @api
+ */
+ol.style.Stroke = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {ol.Color|string}
+   */
+  this.color_ = goog.isDef(options.color) ? options.color : null;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.lineCap_ = options.lineCap;
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.lineDash_ = goog.isDef(options.lineDash) ? options.lineDash : null;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.lineJoin_ = options.lineJoin;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.miterLimit_ = options.miterLimit;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.width_ = options.width;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * @return {ol.Color|string} Color.
+ * @api
+ */
+ol.style.Stroke.prototype.getColor = function() {
+  return this.color_;
+};
+
+
+/**
+ * @return {string|undefined} Line cap.
+ * @api
+ */
+ol.style.Stroke.prototype.getLineCap = function() {
+  return this.lineCap_;
+};
+
+
+/**
+ * @return {Array.<number>} Line dash.
+ * @api
+ */
+ol.style.Stroke.prototype.getLineDash = function() {
+  return this.lineDash_;
+};
+
+
+/**
+ * @return {string|undefined} Line join.
+ * @api
+ */
+ol.style.Stroke.prototype.getLineJoin = function() {
+  return this.lineJoin_;
+};
+
+
+/**
+ * @return {number|undefined} Miter limit.
+ * @api
+ */
+ol.style.Stroke.prototype.getMiterLimit = function() {
+  return this.miterLimit_;
+};
+
+
+/**
+ * @return {number|undefined} Width.
+ * @api
+ */
+ol.style.Stroke.prototype.getWidth = function() {
+  return this.width_;
+};
+
+
+/**
+ * Set the color.
+ *
+ * @param {ol.Color|string} color Color.
+ * @api
+ */
+ol.style.Stroke.prototype.setColor = function(color) {
+  this.color_ = color;
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * Set the line cap.
+ *
+ * @param {string|undefined} lineCap Line cap.
+ * @api
+ */
+ol.style.Stroke.prototype.setLineCap = function(lineCap) {
+  this.lineCap_ = lineCap;
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * Set the line dash.
+ *
+ * @param {Array.<number>} lineDash Line dash.
+ * @api
+ */
+ol.style.Stroke.prototype.setLineDash = function(lineDash) {
+  this.lineDash_ = lineDash;
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * Set the line join.
+ *
+ * @param {string|undefined} lineJoin Line join.
+ * @api
+ */
+ol.style.Stroke.prototype.setLineJoin = function(lineJoin) {
+  this.lineJoin_ = lineJoin;
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * Set the miter limit.
+ *
+ * @param {number|undefined} miterLimit Miter limit.
+ * @api
+ */
+ol.style.Stroke.prototype.setMiterLimit = function(miterLimit) {
+  this.miterLimit_ = miterLimit;
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * Set the width.
+ *
+ * @param {number|undefined} width Width.
+ * @api
+ */
+ol.style.Stroke.prototype.setWidth = function(width) {
+  this.width_ = width;
+  this.checksum_ = undefined;
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.style.Stroke.prototype.getChecksum = function() {
+  if (!goog.isDef(this.checksum_)) {
+    var raw = 's' +
+        (!goog.isNull(this.color_) ?
+            ol.color.asString(this.color_) : '-') + ',' +
+        (goog.isDef(this.lineCap_) ?
+            this.lineCap_.toString() : '-') + ',' +
+        (!goog.isNull(this.lineDash_) ?
+            this.lineDash_.toString() : '-') + ',' +
+        (goog.isDef(this.lineJoin_) ?
+            this.lineJoin_ : '-') + ',' +
+        (goog.isDef(this.miterLimit_) ?
+            this.miterLimit_.toString() : '-') + ',' +
+        (goog.isDef(this.width_) ?
+            this.width_.toString() : '-');
+
+    var md5 = new goog.crypt.Md5();
+    md5.update(raw);
+    this.checksum_ = goog.crypt.byteArrayToString(md5.digest());
+  }
+
+  return this.checksum_;
+};
diff --git a/src/ol/style/style.js b/src/ol/style/style.js
new file mode 100644
index 0000000..e010186
--- /dev/null
+++ b/src/ol/style/style.js
@@ -0,0 +1,357 @@
+goog.provide('ol.style.Style');
+goog.provide('ol.style.defaultGeometryFunction');
+
+goog.require('goog.asserts');
+goog.require('goog.functions');
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Image');
+goog.require('ol.style.Stroke');
+
+
+
+/**
+ * @classdesc
+ * Container for vector feature rendering styles. Any changes made to the style
+ * or its children through `set*()` methods will not take effect until the
+ * feature, layer or FeatureOverlay that uses the style is re-rendered.
+ *
+ * @constructor
+ * @param {olx.style.StyleOptions=} opt_options Style options.
+ * @api
+ */
+ol.style.Style = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {string|ol.geom.Geometry|ol.style.GeometryFunction}
+   */
+  this.geometry_ = null;
+
+  /**
+   * @private
+   * @type {!ol.style.GeometryFunction}
+   */
+  this.geometryFunction_ = ol.style.defaultGeometryFunction;
+
+  if (goog.isDef(options.geometry)) {
+    this.setGeometry(options.geometry);
+  }
+
+  /**
+   * @private
+   * @type {ol.style.Fill}
+   */
+  this.fill_ = goog.isDef(options.fill) ? options.fill : null;
+
+  /**
+   * @private
+   * @type {ol.style.Image}
+   */
+  this.image_ = goog.isDef(options.image) ? options.image : null;
+
+  /**
+   * @private
+   * @type {ol.style.Stroke}
+   */
+  this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null;
+
+  /**
+   * @private
+   * @type {ol.style.Text}
+   */
+  this.text_ = goog.isDef(options.text) ? options.text : null;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.zIndex_ = options.zIndex;
+
+};
+
+
+/**
+ * @return {string|ol.geom.Geometry|ol.style.GeometryFunction}
+ * Feature property or geometry or function that returns the geometry that will
+ * be rendered with this style.
+ * @api
+ */
+ol.style.Style.prototype.getGeometry = function() {
+  return this.geometry_;
+};
+
+
+/**
+ * @return {!ol.style.GeometryFunction} Function that is called with a feature
+ * and returns the geometry to render instead of the feature's geometry.
+ * @api
+ */
+ol.style.Style.prototype.getGeometryFunction = function() {
+  return this.geometryFunction_;
+};
+
+
+/**
+ * @return {ol.style.Fill} Fill style.
+ * @api
+ */
+ol.style.Style.prototype.getFill = function() {
+  return this.fill_;
+};
+
+
+/**
+ * @return {ol.style.Image} Image style.
+ * @api
+ */
+ol.style.Style.prototype.getImage = function() {
+  return this.image_;
+};
+
+
+/**
+ * @return {ol.style.Stroke} Stroke style.
+ * @api
+ */
+ol.style.Style.prototype.getStroke = function() {
+  return this.stroke_;
+};
+
+
+/**
+ * @return {ol.style.Text} Text style.
+ * @api
+ */
+ol.style.Style.prototype.getText = function() {
+  return this.text_;
+};
+
+
+/**
+ * @return {number|undefined} ZIndex.
+ * @api
+ */
+ol.style.Style.prototype.getZIndex = function() {
+  return this.zIndex_;
+};
+
+
+/**
+ * Set a geometry that is rendered instead of the feature's geometry.
+ *
+ * @param {string|ol.geom.Geometry|ol.style.GeometryFunction} geometry
+ *     Feature property or geometry or function returning a geometry to render
+ *     for this style.
+ * @api
+ */
+ol.style.Style.prototype.setGeometry = function(geometry) {
+  if (goog.isFunction(geometry)) {
+    this.geometryFunction_ = geometry;
+  } else if (goog.isString(geometry)) {
+    this.geometryFunction_ = function(feature) {
+      var result = feature.get(geometry);
+      if (goog.isDefAndNotNull(result)) {
+        goog.asserts.assertInstanceof(result, ol.geom.Geometry);
+      }
+      return result;
+    };
+  } else if (goog.isNull(geometry)) {
+    this.geometryFunction_ = ol.style.defaultGeometryFunction;
+  } else if (goog.isDef(geometry)) {
+    goog.asserts.assertInstanceof(geometry, ol.geom.Geometry);
+    this.geometryFunction_ = function() {
+      return geometry;
+    };
+  }
+  this.geometry_ = geometry;
+};
+
+
+/**
+ * Set the zIndex.
+ *
+ * @param {number|undefined} zIndex ZIndex.
+ * @api
+ */
+ol.style.Style.prototype.setZIndex = function(zIndex) {
+  this.zIndex_ = zIndex;
+};
+
+
+/**
+ * A function that takes an {@link ol.Feature} and a `{number}` representing
+ * the view's resolution. The function should return an array of
+ * {@link ol.style.Style}. This way e.g. a vector layer can be styled.
+ *
+ * @typedef {function(ol.Feature, number): Array.<ol.style.Style>}
+ * @api
+ */
+ol.style.StyleFunction;
+
+
+/**
+ * Convert the provided object into a style function.  Functions passed through
+ * unchanged.  Arrays of ol.style.Style or single style objects wrapped in a
+ * new style function.
+ * @param {ol.style.StyleFunction|Array.<ol.style.Style>|ol.style.Style} obj
+ *     A style function, a single style, or an array of styles.
+ * @return {ol.style.StyleFunction} A style function.
+ */
+ol.style.createStyleFunction = function(obj) {
+  /**
+   * @type {ol.style.StyleFunction}
+   */
+  var styleFunction;
+
+  if (goog.isFunction(obj)) {
+    styleFunction = /** @type {ol.style.StyleFunction} */ (obj);
+  } else {
+    /**
+     * @type {Array.<ol.style.Style>}
+     */
+    var styles;
+    if (goog.isArray(obj)) {
+      styles = obj;
+    } else {
+      goog.asserts.assertInstanceof(obj, ol.style.Style);
+      styles = [obj];
+    }
+    styleFunction = goog.functions.constant(styles);
+  }
+  return styleFunction;
+};
+
+
+/**
+ * @param {ol.Feature} feature Feature.
+ * @param {number} resolution Resolution.
+ * @return {Array.<ol.style.Style>} Style.
+ */
+ol.style.defaultStyleFunction = function(feature, resolution) {
+  var fill = new ol.style.Fill({
+    color: 'rgba(255,255,255,0.4)'
+  });
+  var stroke = new ol.style.Stroke({
+    color: '#3399CC',
+    width: 1.25
+  });
+  var styles = [
+    new ol.style.Style({
+      image: new ol.style.Circle({
+        fill: fill,
+        stroke: stroke,
+        radius: 5
+      }),
+      fill: fill,
+      stroke: stroke
+    })
+  ];
+
+  // Now that we've run it the first time, replace the function with
+  // a constant version. We don't use an immediately-invoked function
+  // and a closure so we don't get an error at script evaluation time in
+  // browsers that do not support Canvas. (ol.style.Circle does
+  // canvas.getContext('2d') at construction time, which will cause an.error
+  // in such browsers.)
+
+  /**
+   * @param {ol.Feature} feature Feature.
+   * @param {number} resolution Resolution.
+   * @return {Array.<ol.style.Style>} Style.
+   */
+  ol.style.defaultStyleFunction = function(feature, resolution) {
+    return styles;
+  };
+
+  return styles;
+};
+
+
+/**
+ * Default styles for editing features.
+ * @return {Object.<ol.geom.GeometryType, Array.<ol.style.Style>>} Styles
+ */
+ol.style.createDefaultEditingStyles = function() {
+  /** @type {Object.<ol.geom.GeometryType, Array.<ol.style.Style>>} */
+  var styles = {};
+  var white = [255, 255, 255, 1];
+  var blue = [0, 153, 255, 1];
+  var width = 3;
+  styles[ol.geom.GeometryType.POLYGON] = [
+    new ol.style.Style({
+      fill: new ol.style.Fill({
+        color: [255, 255, 255, 0.5]
+      })
+    })
+  ];
+  styles[ol.geom.GeometryType.MULTI_POLYGON] =
+      styles[ol.geom.GeometryType.POLYGON];
+
+  styles[ol.geom.GeometryType.LINE_STRING] = [
+    new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: white,
+        width: width + 2
+      })
+    }),
+    new ol.style.Style({
+      stroke: new ol.style.Stroke({
+        color: blue,
+        width: width
+      })
+    })
+  ];
+  styles[ol.geom.GeometryType.MULTI_LINE_STRING] =
+      styles[ol.geom.GeometryType.LINE_STRING];
+
+  styles[ol.geom.GeometryType.POINT] = [
+    new ol.style.Style({
+      image: new ol.style.Circle({
+        radius: width * 2,
+        fill: new ol.style.Fill({
+          color: blue
+        }),
+        stroke: new ol.style.Stroke({
+          color: white,
+          width: width / 2
+        })
+      }),
+      zIndex: Infinity
+    })
+  ];
+  styles[ol.geom.GeometryType.MULTI_POINT] =
+      styles[ol.geom.GeometryType.POINT];
+
+  styles[ol.geom.GeometryType.GEOMETRY_COLLECTION] =
+      styles[ol.geom.GeometryType.POLYGON].concat(
+          styles[ol.geom.GeometryType.POINT]
+      );
+
+  return styles;
+};
+
+
+/**
+ * A function that takes an {@link ol.Feature} as argument and returns an
+ * {@link ol.geom.Geometry} that will be rendered and styled for the feature.
+ *
+ * @typedef {function(ol.Feature): (ol.geom.Geometry|undefined)}
+ * @api
+ */
+ol.style.GeometryFunction;
+
+
+/**
+ * Function that is called with a feature and returns its default geometry.
+ * @param {ol.Feature} feature Feature to get the geometry for.
+ * @return {ol.geom.Geometry|undefined} Geometry to render.
+ */
+ol.style.defaultGeometryFunction = function(feature) {
+  goog.asserts.assert(!goog.isNull(feature));
+  return feature.getGeometry();
+};
diff --git a/src/ol/style/textstyle.js b/src/ol/style/textstyle.js
new file mode 100644
index 0000000..65412df
--- /dev/null
+++ b/src/ol/style/textstyle.js
@@ -0,0 +1,274 @@
+goog.provide('ol.style.Text');
+
+
+
+/**
+ * @classdesc
+ * Set text style for vector features.
+ *
+ * @constructor
+ * @param {olx.style.TextOptions=} opt_options Options.
+ * @api
+ */
+ol.style.Text = function(opt_options) {
+
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.font_ = options.font;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.rotation_ = options.rotation;
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.scale_ = options.scale;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.text_ = options.text;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.textAlign_ = options.textAlign;
+
+  /**
+   * @private
+   * @type {string|undefined}
+   */
+  this.textBaseline_ = options.textBaseline;
+
+  /**
+   * @private
+   * @type {ol.style.Fill}
+   */
+  this.fill_ = goog.isDef(options.fill) ? options.fill : null;
+
+  /**
+   * @private
+   * @type {ol.style.Stroke}
+   */
+  this.stroke_ = goog.isDef(options.stroke) ? options.stroke : null;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.offsetX_ = goog.isDef(options.offsetX) ? options.offsetX : 0;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.offsetY_ = goog.isDef(options.offsetY) ? options.offsetY : 0;
+};
+
+
+/**
+ * @return {string|undefined} Font.
+ * @api
+ */
+ol.style.Text.prototype.getFont = function() {
+  return this.font_;
+};
+
+
+/**
+ * @return {number} Horizontal text offset.
+ * @api
+ */
+ol.style.Text.prototype.getOffsetX = function() {
+  return this.offsetX_;
+};
+
+
+/**
+ * @return {number} Vertical text offset.
+ * @api
+ */
+ol.style.Text.prototype.getOffsetY = function() {
+  return this.offsetY_;
+};
+
+
+/**
+ * @return {ol.style.Fill} Fill style.
+ * @api
+ */
+ol.style.Text.prototype.getFill = function() {
+  return this.fill_;
+};
+
+
+/**
+ * @return {number|undefined} Rotation.
+ * @api
+ */
+ol.style.Text.prototype.getRotation = function() {
+  return this.rotation_;
+};
+
+
+/**
+ * @return {number|undefined} Scale.
+ * @api
+ */
+ol.style.Text.prototype.getScale = function() {
+  return this.scale_;
+};
+
+
+/**
+ * @return {ol.style.Stroke} Stroke style.
+ * @api
+ */
+ol.style.Text.prototype.getStroke = function() {
+  return this.stroke_;
+};
+
+
+/**
+ * @return {string|undefined} Text.
+ * @api
+ */
+ol.style.Text.prototype.getText = function() {
+  return this.text_;
+};
+
+
+/**
+ * @return {string|undefined} Text align.
+ * @api
+ */
+ol.style.Text.prototype.getTextAlign = function() {
+  return this.textAlign_;
+};
+
+
+/**
+ * @return {string|undefined} Text baseline.
+ * @api
+ */
+ol.style.Text.prototype.getTextBaseline = function() {
+  return this.textBaseline_;
+};
+
+
+/**
+ * Set the font.
+ *
+ * @param {string|undefined} font Font.
+ * @api
+ */
+ol.style.Text.prototype.setFont = function(font) {
+  this.font_ = font;
+};
+
+
+/**
+ * Set the x offset.
+ *
+ * @param {number} offsetX Horizontal text offset.
+ */
+ol.style.Text.prototype.setOffsetX = function(offsetX) {
+  this.offsetX_ = offsetX;
+};
+
+
+/**
+ * Set the y offset.
+ *
+ * @param {number} offsetY Vertical text offset.
+ */
+ol.style.Text.prototype.setOffsetY = function(offsetY) {
+  this.offsetY_ = offsetY;
+};
+
+
+/**
+ * Set the fill.
+ *
+ * @param {ol.style.Fill} fill Fill style.
+ * @api
+ */
+ol.style.Text.prototype.setFill = function(fill) {
+  this.fill_ = fill;
+};
+
+
+/**
+ * Set the rotation.
+ *
+ * @param {number|undefined} rotation Rotation.
+ * @api
+ */
+ol.style.Text.prototype.setRotation = function(rotation) {
+  this.rotation_ = rotation;
+};
+
+
+/**
+ * Set the scale.
+ *
+ * @param {number|undefined} scale Scale.
+ * @api
+ */
+ol.style.Text.prototype.setScale = function(scale) {
+  this.scale_ = scale;
+};
+
+
+/**
+ * Set the stroke.
+ *
+ * @param {ol.style.Stroke} stroke Stroke style.
+ * @api
+ */
+ol.style.Text.prototype.setStroke = function(stroke) {
+  this.stroke_ = stroke;
+};
+
+
+/**
+ * Set the text.
+ *
+ * @param {string|undefined} text Text.
+ * @api
+ */
+ol.style.Text.prototype.setText = function(text) {
+  this.text_ = text;
+};
+
+
+/**
+ * Set the text alignment.
+ *
+ * @param {string|undefined} textAlign Text align.
+ * @api
+ */
+ol.style.Text.prototype.setTextAlign = function(textAlign) {
+  this.textAlign_ = textAlign;
+};
+
+
+/**
+ * Set the text baseline.
+ *
+ * @param {string|undefined} textBaseline Text baseline.
+ * @api
+ */
+ol.style.Text.prototype.setTextBaseline = function(textBaseline) {
+  this.textBaseline_ = textBaseline;
+};
diff --git a/src/ol/tile.js b/src/ol/tile.js
new file mode 100644
index 0000000..ddec563
--- /dev/null
+++ b/src/ol/tile.js
@@ -0,0 +1,95 @@
+goog.provide('ol.Tile');
+goog.provide('ol.TileState');
+
+goog.require('goog.events');
+goog.require('goog.events.EventTarget');
+goog.require('goog.events.EventType');
+goog.require('ol.TileCoord');
+
+
+/**
+ * @enum {number}
+ */
+ol.TileState = {
+  IDLE: 0,
+  LOADING: 1,
+  LOADED: 2,
+  ERROR: 3,
+  EMPTY: 4
+};
+
+
+
+/**
+ * @classdesc
+ * Base class for tiles.
+ *
+ * @constructor
+ * @extends {goog.events.EventTarget}
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {ol.TileState} state State.
+ */
+ol.Tile = function(tileCoord, state) {
+
+  goog.base(this);
+
+  /**
+   * @type {ol.TileCoord}
+   */
+  this.tileCoord = tileCoord;
+
+  /**
+   * @protected
+   * @type {ol.TileState}
+   */
+  this.state = state;
+
+};
+goog.inherits(ol.Tile, goog.events.EventTarget);
+
+
+/**
+ * @protected
+ */
+ol.Tile.prototype.changed = function() {
+  this.dispatchEvent(goog.events.EventType.CHANGE);
+};
+
+
+/**
+ * @function
+ * @param {Object=} opt_context Object.
+ * @return {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} Image.
+ */
+ol.Tile.prototype.getImage = goog.abstractMethod;
+
+
+/**
+ * @return {string} Key.
+ */
+ol.Tile.prototype.getKey = function() {
+  return goog.getUid(this).toString();
+};
+
+
+/**
+ * @return {ol.TileCoord}
+ * @api
+ */
+ol.Tile.prototype.getTileCoord = function() {
+  return this.tileCoord;
+};
+
+
+/**
+ * @return {ol.TileState} State.
+ */
+ol.Tile.prototype.getState = function() {
+  return this.state;
+};
+
+
+/**
+ * FIXME empty description for jsdoc
+ */
+ol.Tile.prototype.load = goog.abstractMethod;
diff --git a/src/ol/tilecache.js b/src/ol/tilecache.js
new file mode 100644
index 0000000..931da13
--- /dev/null
+++ b/src/ol/tilecache.js
@@ -0,0 +1,72 @@
+goog.provide('ol.TileCache');
+
+goog.require('goog.asserts');
+goog.require('ol');
+goog.require('ol.TileRange');
+goog.require('ol.structs.LRUCache');
+goog.require('ol.tilecoord');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.structs.LRUCache.<ol.Tile>}
+ * @param {number=} opt_highWaterMark High water mark.
+ * @struct
+ */
+ol.TileCache = function(opt_highWaterMark) {
+
+  goog.base(this);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.highWaterMark_ = goog.isDef(opt_highWaterMark) ?
+      opt_highWaterMark : ol.DEFAULT_TILE_CACHE_HIGH_WATER_MARK;
+
+};
+goog.inherits(ol.TileCache, ol.structs.LRUCache);
+
+
+/**
+ * @return {boolean} Can expire cache.
+ */
+ol.TileCache.prototype.canExpireCache = function() {
+  return this.getCount() > this.highWaterMark_;
+};
+
+
+/**
+ * @param {Object.<string, ol.TileRange>} usedTiles Used tiles.
+ */
+ol.TileCache.prototype.expireCache = function(usedTiles) {
+  var tile, zKey;
+  while (this.canExpireCache()) {
+    tile = /** @type {ol.Tile} */ (this.peekLast());
+    zKey = tile.tileCoord[0].toString();
+    if (zKey in usedTiles && usedTiles[zKey].contains(tile.tileCoord)) {
+      break;
+    } else {
+      this.pop().dispose();
+    }
+  }
+};
+
+
+/**
+ * Remove a tile range from the cache, e.g. to invalidate tiles.
+ * @param {ol.TileRange} tileRange The tile range to prune.
+ */
+ol.TileCache.prototype.pruneTileRange = function(tileRange) {
+  var i = this.getCount(),
+      key;
+  while (i--) {
+    key = this.peekLastKey();
+    if (tileRange.contains(ol.tilecoord.createFromString(key))) {
+      this.pop().dispose();
+    } else {
+      this.get(key);
+    }
+  }
+};
diff --git a/src/ol/tilecoord.js b/src/ol/tilecoord.js
new file mode 100644
index 0000000..25fcaee
--- /dev/null
+++ b/src/ol/tilecoord.js
@@ -0,0 +1,139 @@
+goog.provide('ol.TileCoord');
+goog.provide('ol.tilecoord');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+
+
+/**
+ * An array of three numbers representing the location of a tile in a tile
+ * grid. The order is `z`, `x`, and `y`. `z` is the zoom level.
+ * @typedef {Array.<number>} ol.TileCoord
+ * @api
+ */
+ol.TileCoord;
+
+
+/**
+ * @enum {number}
+ */
+ol.QuadKeyCharCode = {
+  ZERO: '0'.charCodeAt(0),
+  ONE: '1'.charCodeAt(0),
+  TWO: '2'.charCodeAt(0),
+  THREE: '3'.charCodeAt(0)
+};
+
+
+/**
+ * @param {string} quadKey Quad key.
+ * @return {ol.TileCoord} Tile coordinate.
+ */
+ol.tilecoord.createFromQuadKey = function(quadKey) {
+  var z = quadKey.length, x = 0, y = 0;
+  var mask = 1 << (z - 1);
+  var i;
+  for (i = 0; i < z; ++i) {
+    switch (quadKey.charCodeAt(i)) {
+      case ol.QuadKeyCharCode.ONE:
+        x += mask;
+        break;
+      case ol.QuadKeyCharCode.TWO:
+        y += mask;
+        break;
+      case ol.QuadKeyCharCode.THREE:
+        x += mask;
+        y += mask;
+        break;
+    }
+    mask >>= 1;
+  }
+  return [z, x, y];
+};
+
+
+/**
+ * @param {string} str String that follows pattern “z/x/y” where x, y and z are
+ *   numbers.
+ * @return {ol.TileCoord} Tile coord.
+ */
+ol.tilecoord.createFromString = function(str) {
+  var v = str.split('/');
+  goog.asserts.assert(v.length === 3);
+  v = goog.array.map(v, function(e, i, a) {
+    return parseInt(e, 10);
+  });
+  return v;
+};
+
+
+/**
+ * @param {number} z Z.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @param {ol.TileCoord=} opt_tileCoord Tile coordinate.
+ * @return {ol.TileCoord} Tile coordinate.
+ */
+ol.tilecoord.createOrUpdate = function(z, x, y, opt_tileCoord) {
+  if (goog.isDef(opt_tileCoord)) {
+    opt_tileCoord[0] = z;
+    opt_tileCoord[1] = x;
+    opt_tileCoord[2] = y;
+    return opt_tileCoord;
+  } else {
+    return [z, x, y];
+  }
+};
+
+
+/**
+ * @param {number} z Z.
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @return {string} Key.
+ */
+ol.tilecoord.getKeyZXY = function(z, x, y) {
+  return z + '/' + x + '/' + y;
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coord.
+ * @return {number} Hash.
+ */
+ol.tilecoord.hash = function(tileCoord) {
+  return (tileCoord[1] << tileCoord[0]) + tileCoord[2];
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coord.
+ * @return {string} Quad key.
+ */
+ol.tilecoord.quadKey = function(tileCoord) {
+  var z = tileCoord[0];
+  var digits = new Array(z);
+  var mask = 1 << (z - 1);
+  var i, charCode;
+  for (i = 0; i < z; ++i) {
+    charCode = ol.QuadKeyCharCode.ZERO;
+    if (tileCoord[1] & mask) {
+      charCode += 1;
+    }
+    if (tileCoord[2] & mask) {
+      charCode += 2;
+    }
+    digits[i] = String.fromCharCode(charCode);
+    mask >>= 1;
+  }
+  return digits.join('');
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coord.
+ * @return {string} String.
+ */
+ol.tilecoord.toString = function(tileCoord) {
+  return ol.tilecoord.getKeyZXY(tileCoord[0], tileCoord[1], tileCoord[2]);
+};
diff --git a/src/ol/tilegrid.jsdoc b/src/ol/tilegrid.jsdoc
new file mode 100644
index 0000000..5f6ed64
--- /dev/null
+++ b/src/ol/tilegrid.jsdoc
@@ -0,0 +1,3 @@
+/**
+ * @namespace ol.tilegrid
+ */
diff --git a/src/ol/tilegrid/tilegrid.js b/src/ol/tilegrid/tilegrid.js
new file mode 100644
index 0000000..e24e8e0
--- /dev/null
+++ b/src/ol/tilegrid/tilegrid.js
@@ -0,0 +1,505 @@
+goog.provide('ol.tilegrid.TileGrid');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.functions');
+goog.require('ol');
+goog.require('ol.Coordinate');
+goog.require('ol.TileCoord');
+goog.require('ol.TileRange');
+goog.require('ol.array');
+goog.require('ol.extent');
+goog.require('ol.extent.Corner');
+goog.require('ol.proj');
+goog.require('ol.proj.METERS_PER_UNIT');
+goog.require('ol.proj.Projection');
+goog.require('ol.proj.Units');
+goog.require('ol.tilecoord');
+
+
+
+/**
+ * @classdesc
+ * Base class for setting the grid pattern for sources accessing tiled-image
+ * servers.
+ *
+ * @constructor
+ * @param {olx.tilegrid.TileGridOptions} options Tile grid options.
+ * @struct
+ * @api stable
+ */
+ol.tilegrid.TileGrid = function(options) {
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.minZoom = goog.isDef(options.minZoom) ? options.minZoom : 0;
+
+  /**
+   * @private
+   * @type {!Array.<number>}
+   */
+  this.resolutions_ = options.resolutions;
+  goog.asserts.assert(goog.array.isSorted(this.resolutions_, function(a, b) {
+    return b - a;
+  }, true));
+
+  /**
+   * @protected
+   * @type {number}
+   */
+  this.maxZoom = this.resolutions_.length - 1;
+
+  /**
+   * @private
+   * @type {ol.Coordinate}
+   */
+  this.origin_ = goog.isDef(options.origin) ? options.origin : null;
+
+  /**
+   * @private
+   * @type {Array.<ol.Coordinate>}
+   */
+  this.origins_ = null;
+  if (goog.isDef(options.origins)) {
+    this.origins_ = options.origins;
+    goog.asserts.assert(this.origins_.length == this.maxZoom + 1);
+  }
+  goog.asserts.assert(
+      (goog.isNull(this.origin_) && !goog.isNull(this.origins_)) ||
+      (!goog.isNull(this.origin_) && goog.isNull(this.origins_)));
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.tileSizes_ = null;
+  if (goog.isDef(options.tileSizes)) {
+    this.tileSizes_ = options.tileSizes;
+    goog.asserts.assert(this.tileSizes_.length == this.maxZoom + 1);
+  }
+
+  /**
+   * @private
+   * @type {number|undefined}
+   */
+  this.tileSize_ = goog.isDef(options.tileSize) ?
+      options.tileSize :
+      goog.isNull(this.tileSizes_) ? ol.DEFAULT_TILE_SIZE : undefined;
+  goog.asserts.assert(
+      (!goog.isDef(this.tileSize_) && !goog.isNull(this.tileSizes_)) ||
+      (goog.isDef(this.tileSize_) && goog.isNull(this.tileSizes_)));
+
+};
+
+
+/**
+ * @private
+ * @type {ol.TileCoord}
+ */
+ol.tilegrid.TileGrid.tmpTileCoord_ = [0, 0, 0];
+
+
+/**
+ * Returns the identity function. May be overridden in subclasses.
+ * @param {{extent: (ol.Extent|undefined),
+ *          wrapX: (boolean|undefined)}=} opt_options Options.
+ * @return {function(ol.TileCoord, ol.proj.Projection, ol.TileCoord=):
+ *     ol.TileCoord} Tile coordinate transform.
+ */
+ol.tilegrid.TileGrid.prototype.createTileCoordTransform =
+    function(opt_options) {
+  return goog.functions.identity;
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {function(this: T, number, ol.TileRange): boolean} callback Callback.
+ * @param {T=} opt_this The object to use as `this` in `callback`.
+ * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object.
+ * @param {ol.Extent=} opt_extent Temporary ol.Extent object.
+ * @return {boolean} Callback succeeded.
+ * @template T
+ */
+ol.tilegrid.TileGrid.prototype.forEachTileCoordParentTileRange =
+    function(tileCoord, callback, opt_this, opt_tileRange, opt_extent) {
+  var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent);
+  var z = tileCoord[0] - 1;
+  while (z >= this.minZoom) {
+    if (callback.call(opt_this, z,
+        this.getTileRangeForExtentAndZ(tileCoordExtent, z, opt_tileRange))) {
+      return true;
+    }
+    --z;
+  }
+  return false;
+};
+
+
+/**
+ * @return {number} Max zoom.
+ * @api
+ */
+ol.tilegrid.TileGrid.prototype.getMaxZoom = function() {
+  return this.maxZoom;
+};
+
+
+/**
+ * @return {number} Min zoom.
+ * @api
+ */
+ol.tilegrid.TileGrid.prototype.getMinZoom = function() {
+  return this.minZoom;
+};
+
+
+/**
+ * @param {number} z Z.
+ * @return {ol.Coordinate} Origin.
+ * @api stable
+ */
+ol.tilegrid.TileGrid.prototype.getOrigin = function(z) {
+  if (!goog.isNull(this.origin_)) {
+    return this.origin_;
+  } else {
+    goog.asserts.assert(!goog.isNull(this.origins_));
+    goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom);
+    return this.origins_[z];
+  }
+};
+
+
+/**
+ * @param {number} z Z.
+ * @return {number} Resolution.
+ * @api stable
+ */
+ol.tilegrid.TileGrid.prototype.getResolution = function(z) {
+  goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom);
+  return this.resolutions_[z];
+};
+
+
+/**
+ * @return {Array.<number>} Resolutions.
+ * @api stable
+ */
+ol.tilegrid.TileGrid.prototype.getResolutions = function() {
+  return this.resolutions_;
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {ol.TileRange=} opt_tileRange Temporary ol.TileRange object.
+ * @param {ol.Extent=} opt_extent Temporary ol.Extent object.
+ * @return {ol.TileRange} Tile range.
+ */
+ol.tilegrid.TileGrid.prototype.getTileCoordChildTileRange =
+    function(tileCoord, opt_tileRange, opt_extent) {
+  if (tileCoord[0] < this.maxZoom) {
+    var tileCoordExtent = this.getTileCoordExtent(tileCoord, opt_extent);
+    return this.getTileRangeForExtentAndZ(
+        tileCoordExtent, tileCoord[0] + 1, opt_tileRange);
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * @param {number} z Z.
+ * @param {ol.TileRange} tileRange Tile range.
+ * @param {ol.Extent=} opt_extent Temporary ol.Extent object.
+ * @return {ol.Extent} Extent.
+ */
+ol.tilegrid.TileGrid.prototype.getTileRangeExtent =
+    function(z, tileRange, opt_extent) {
+  var origin = this.getOrigin(z);
+  var resolution = this.getResolution(z);
+  var tileSize = this.getTileSize(z);
+  var minX = origin[0] + tileRange.minX * tileSize * resolution;
+  var maxX = origin[0] + (tileRange.maxX + 1) * tileSize * resolution;
+  var minY = origin[1] + tileRange.minY * tileSize * resolution;
+  var maxY = origin[1] + (tileRange.maxY + 1) * tileSize * resolution;
+  return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent);
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} resolution Resolution.
+ * @param {ol.TileRange=} opt_tileRange Temporary tile range object.
+ * @return {ol.TileRange} Tile range.
+ */
+ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndResolution =
+    function(extent, resolution, opt_tileRange) {
+  var tileCoord = ol.tilegrid.TileGrid.tmpTileCoord_;
+  this.getTileCoordForXYAndResolution_(
+      extent[0], extent[1], resolution, false, tileCoord);
+  var minX = tileCoord[1];
+  var minY = tileCoord[2];
+  this.getTileCoordForXYAndResolution_(
+      extent[2], extent[3], resolution, true, tileCoord);
+  return ol.TileRange.createOrUpdate(
+      minX, tileCoord[1], minY, tileCoord[2], opt_tileRange);
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number} z Z.
+ * @param {ol.TileRange=} opt_tileRange Temporary tile range object.
+ * @return {ol.TileRange} Tile range.
+ */
+ol.tilegrid.TileGrid.prototype.getTileRangeForExtentAndZ =
+    function(extent, z, opt_tileRange) {
+  var resolution = this.getResolution(z);
+  return this.getTileRangeForExtentAndResolution(
+      extent, resolution, opt_tileRange);
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @return {ol.Coordinate} Tile center.
+ */
+ol.tilegrid.TileGrid.prototype.getTileCoordCenter = function(tileCoord) {
+  var origin = this.getOrigin(tileCoord[0]);
+  var resolution = this.getResolution(tileCoord[0]);
+  var tileSize = this.getTileSize(tileCoord[0]);
+  return [
+    origin[0] + (tileCoord[1] + 0.5) * tileSize * resolution,
+    origin[1] + (tileCoord[2] + 0.5) * tileSize * resolution
+  ];
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {ol.Extent=} opt_extent Temporary extent object.
+ * @return {ol.Extent} Extent.
+ */
+ol.tilegrid.TileGrid.prototype.getTileCoordExtent =
+    function(tileCoord, opt_extent) {
+  var origin = this.getOrigin(tileCoord[0]);
+  var resolution = this.getResolution(tileCoord[0]);
+  var tileSize = this.getTileSize(tileCoord[0]);
+  var minX = origin[0] + tileCoord[1] * tileSize * resolution;
+  var minY = origin[1] + tileCoord[2] * tileSize * resolution;
+  var maxX = minX + tileSize * resolution;
+  var maxY = minY + tileSize * resolution;
+  return ol.extent.createOrUpdate(minX, minY, maxX, maxY, opt_extent);
+};
+
+
+/**
+ * Get the tile coordinate for the given map coordinate and resolution.  This
+ * method considers that coordinates that intersect tile boundaries should be
+ * assigned the higher tile coordinate.
+ *
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} resolution Resolution.
+ * @param {ol.TileCoord=} opt_tileCoord Destination ol.TileCoord object.
+ * @return {ol.TileCoord} Tile coordinate.
+ * @api
+ */
+ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndResolution = function(
+    coordinate, resolution, opt_tileCoord) {
+  return this.getTileCoordForXYAndResolution_(
+      coordinate[0], coordinate[1], resolution, false, opt_tileCoord);
+};
+
+
+/**
+ * @param {number} x X.
+ * @param {number} y Y.
+ * @param {number} resolution Resolution.
+ * @param {boolean} reverseIntersectionPolicy Instead of letting edge
+ *     intersections go to the higher tile coordinate, let edge intersections
+ *     go to the lower tile coordinate.
+ * @param {ol.TileCoord=} opt_tileCoord Temporary ol.TileCoord object.
+ * @return {ol.TileCoord} Tile coordinate.
+ * @private
+ */
+ol.tilegrid.TileGrid.prototype.getTileCoordForXYAndResolution_ = function(
+    x, y, resolution, reverseIntersectionPolicy, opt_tileCoord) {
+  var z = this.getZForResolution(resolution);
+  var scale = resolution / this.getResolution(z);
+  var origin = this.getOrigin(z);
+  var tileSize = this.getTileSize(z);
+
+  var tileCoordX = scale * (x - origin[0]) / (resolution * tileSize);
+  var tileCoordY = scale * (y - origin[1]) / (resolution * tileSize);
+
+  if (reverseIntersectionPolicy) {
+    tileCoordX = Math.ceil(tileCoordX) - 1;
+    tileCoordY = Math.ceil(tileCoordY) - 1;
+  } else {
+    tileCoordX = Math.floor(tileCoordX);
+    tileCoordY = Math.floor(tileCoordY);
+  }
+
+  return ol.tilecoord.createOrUpdate(z, tileCoordX, tileCoordY, opt_tileCoord);
+};
+
+
+/**
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {number} z Z.
+ * @param {ol.TileCoord=} opt_tileCoord Destination ol.TileCoord object.
+ * @return {ol.TileCoord} Tile coordinate.
+ * @api
+ */
+ol.tilegrid.TileGrid.prototype.getTileCoordForCoordAndZ =
+    function(coordinate, z, opt_tileCoord) {
+  var resolution = this.getResolution(z);
+  return this.getTileCoordForXYAndResolution_(
+      coordinate[0], coordinate[1], resolution, false, opt_tileCoord);
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @return {number} Tile resolution.
+ */
+ol.tilegrid.TileGrid.prototype.getTileCoordResolution = function(tileCoord) {
+  goog.asserts.assert(
+      this.minZoom <= tileCoord[0] && tileCoord[0] <= this.maxZoom);
+  return this.resolutions_[tileCoord[0]];
+};
+
+
+/**
+ * @param {number} z Z.
+ * @return {number} Tile size.
+ * @api stable
+ */
+ol.tilegrid.TileGrid.prototype.getTileSize = function(z) {
+  if (goog.isDef(this.tileSize_)) {
+    return this.tileSize_;
+  } else {
+    goog.asserts.assert(!goog.isNull(this.tileSizes_));
+    goog.asserts.assert(this.minZoom <= z && z <= this.maxZoom);
+    return this.tileSizes_[z];
+  }
+};
+
+
+/**
+ * @param {number} resolution Resolution.
+ * @return {number} Z.
+ */
+ol.tilegrid.TileGrid.prototype.getZForResolution = function(resolution) {
+  return ol.array.linearFindNearest(this.resolutions_, resolution, 0);
+};
+
+
+/**
+ * @param {ol.proj.Projection} projection Projection.
+ * @return {ol.tilegrid.TileGrid} Default tile grid for the passed projection.
+ */
+ol.tilegrid.getForProjection = function(projection) {
+  var tileGrid = projection.getDefaultTileGrid();
+  if (goog.isNull(tileGrid)) {
+    tileGrid = ol.tilegrid.createForProjection(projection);
+    projection.setDefaultTileGrid(tileGrid);
+  }
+  return tileGrid;
+};
+
+
+/**
+ * @param {ol.Extent} extent Extent.
+ * @param {number=} opt_maxZoom Maximum zoom level (default is
+ *     ol.DEFAULT_MAX_ZOOM).
+ * @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE).
+ * @param {ol.extent.Corner=} opt_corner Extent corner (default is
+ *     ol.extent.Corner.BOTTOM_LEFT).
+ * @return {ol.tilegrid.TileGrid} TileGrid instance.
+ */
+ol.tilegrid.createForExtent =
+    function(extent, opt_maxZoom, opt_tileSize, opt_corner) {
+  var tileSize = goog.isDef(opt_tileSize) ?
+      opt_tileSize : ol.DEFAULT_TILE_SIZE;
+
+  var corner = goog.isDef(opt_corner) ?
+      opt_corner : ol.extent.Corner.BOTTOM_LEFT;
+
+  var resolutions = ol.tilegrid.resolutionsFromExtent(
+      extent, opt_maxZoom, tileSize);
+
+  return new ol.tilegrid.TileGrid({
+    origin: ol.extent.getCorner(extent, corner),
+    resolutions: resolutions,
+    tileSize: tileSize
+  });
+};
+
+
+/**
+ * Create a resolutions array from an extent.  A zoom factor of 2 is assumed.
+ * @param {ol.Extent} extent Extent.
+ * @param {number=} opt_maxZoom Maximum zoom level (default is
+ *     ol.DEFAULT_MAX_ZOOM).
+ * @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE).
+ * @return {!Array.<number>} Resolutions array.
+ */
+ol.tilegrid.resolutionsFromExtent =
+    function(extent, opt_maxZoom, opt_tileSize) {
+  var maxZoom = goog.isDef(opt_maxZoom) ?
+      opt_maxZoom : ol.DEFAULT_MAX_ZOOM;
+
+  var height = ol.extent.getHeight(extent);
+  var width = ol.extent.getWidth(extent);
+
+  var tileSize = goog.isDef(opt_tileSize) ?
+      opt_tileSize : ol.DEFAULT_TILE_SIZE;
+  var maxResolution = Math.max(
+      width / tileSize, height / tileSize);
+
+  var length = maxZoom + 1;
+  var resolutions = new Array(length);
+  for (var z = 0; z < length; ++z) {
+    resolutions[z] = maxResolution / Math.pow(2, z);
+  }
+  return resolutions;
+};
+
+
+/**
+ * @param {ol.proj.ProjectionLike} projection Projection.
+ * @param {number=} opt_maxZoom Maximum zoom level (default is
+ *     ol.DEFAULT_MAX_ZOOM).
+ * @param {number=} opt_tileSize Tile size (default uses ol.DEFAULT_TILE_SIZE).
+ * @param {ol.extent.Corner=} opt_corner Extent corner (default is
+ *     ol.extent.Corner.BOTTOM_LEFT).
+ * @return {ol.tilegrid.TileGrid} TileGrid instance.
+ */
+ol.tilegrid.createForProjection =
+    function(projection, opt_maxZoom, opt_tileSize, opt_corner) {
+  var extent = ol.tilegrid.extentFromProjection(projection);
+  return ol.tilegrid.createForExtent(
+      extent, opt_maxZoom, opt_tileSize, opt_corner);
+};
+
+
+/**
+ * Generate a tile grid extent from a projection.  If the projection has an
+ * extent, it is used.  If not, a global extent is assumed.
+ * @param {ol.proj.ProjectionLike} projection Projection.
+ * @return {ol.Extent} Extent.
+ */
+ol.tilegrid.extentFromProjection = function(projection) {
+  projection = ol.proj.get(projection);
+  var extent = projection.getExtent();
+  if (goog.isNull(extent)) {
+    var half = 180 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] /
+        projection.getMetersPerUnit();
+    extent = ol.extent.createOrUpdate(-half, -half, half, half);
+  }
+  return extent;
+};
diff --git a/src/ol/tilegrid/wmtstilegrid.js b/src/ol/tilegrid/wmtstilegrid.js
new file mode 100644
index 0000000..d0298ba
--- /dev/null
+++ b/src/ol/tilegrid/wmtstilegrid.js
@@ -0,0 +1,113 @@
+goog.provide('ol.tilegrid.WMTS');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol.proj');
+goog.require('ol.tilegrid.TileGrid');
+
+
+
+/**
+ * @classdesc
+ * Set the grid pattern for sources accessing WMTS tiled-image servers.
+ *
+ * @constructor
+ * @extends {ol.tilegrid.TileGrid}
+ * @param {olx.tilegrid.WMTSOptions} options WMTS options.
+ * @struct
+ * @api
+ */
+ol.tilegrid.WMTS = function(options) {
+
+  goog.asserts.assert(
+      options.resolutions.length == options.matrixIds.length);
+
+  /**
+   * @private
+   * @type {!Array.<string>}
+   */
+  this.matrixIds_ = options.matrixIds;
+  // FIXME: should the matrixIds become optionnal?
+
+  goog.base(this, {
+    origin: options.origin,
+    origins: options.origins,
+    resolutions: options.resolutions,
+    tileSize: options.tileSize,
+    tileSizes: options.tileSizes
+  });
+
+};
+goog.inherits(ol.tilegrid.WMTS, ol.tilegrid.TileGrid);
+
+
+/**
+ * @param {number} z Z.
+ * @return {string} MatrixId..
+ */
+ol.tilegrid.WMTS.prototype.getMatrixId = function(z) {
+  goog.asserts.assert(0 <= z && z < this.matrixIds_.length);
+  return this.matrixIds_[z];
+};
+
+
+/**
+ * @return {Array.<string>} MatrixIds.
+ * @api
+ */
+ol.tilegrid.WMTS.prototype.getMatrixIds = function() {
+  return this.matrixIds_;
+};
+
+
+/**
+ * @param {Object} matrixSet An object representing a matrixSet in the
+ *     capabilities document.
+ * @return {ol.tilegrid.WMTS} WMTS tileGrid instance.
+ */
+ol.tilegrid.WMTS.createFromCapabilitiesMatrixSet =
+    function(matrixSet) {
+
+  /** @type {!Array.<number>} */
+  var resolutions = [];
+  /** @type {!Array.<string>} */
+  var matrixIds = [];
+  /** @type {!Array.<ol.Coordinate>} */
+  var origins = [];
+  /** @type {!Array.<number>} */
+  var tileSizes = [];
+
+  var supportedCRSPropName = 'supportedCRS';
+  var matrixIdsPropName = 'matrixIds';
+  var identifierPropName = 'identifier';
+  var scaleDenominatorPropName = 'scaleDenominator';
+  var topLeftCornerPropName = 'topLeftCorner';
+  var tileWidthPropName = 'tileWidth';
+  var tileHeightPropName = 'tileHeight';
+
+  var projection = ol.proj.get(matrixSet[supportedCRSPropName]);
+  var metersPerUnit = projection.getMetersPerUnit();
+
+  goog.array.sort(matrixSet[matrixIdsPropName], function(a, b) {
+    return b[scaleDenominatorPropName] - a[scaleDenominatorPropName];
+  });
+
+  goog.array.forEach(matrixSet[matrixIdsPropName],
+      function(elt, index, array) {
+        matrixIds.push(elt[identifierPropName]);
+        origins.push(elt[topLeftCornerPropName]);
+        resolutions.push(elt[scaleDenominatorPropName] * 0.28E-3 /
+            metersPerUnit);
+        var tileWidth = elt[tileWidthPropName];
+        var tileHeight = elt[tileHeightPropName];
+        goog.asserts.assert(tileWidth == tileHeight);
+        tileSizes.push(tileWidth);
+      });
+
+  return new ol.tilegrid.WMTS({
+    origins: origins,
+    resolutions: resolutions,
+    matrixIds: matrixIds,
+    tileSizes: tileSizes
+  });
+};
diff --git a/src/ol/tilegrid/xyztilegrid.js b/src/ol/tilegrid/xyztilegrid.js
new file mode 100644
index 0000000..399df2b
--- /dev/null
+++ b/src/ol/tilegrid/xyztilegrid.js
@@ -0,0 +1,131 @@
+goog.provide('ol.tilegrid.XYZ');
+
+goog.require('goog.math');
+goog.require('ol');
+goog.require('ol.TileCoord');
+goog.require('ol.TileRange');
+goog.require('ol.extent');
+goog.require('ol.extent.Corner');
+goog.require('ol.proj');
+goog.require('ol.proj.EPSG3857');
+goog.require('ol.tilecoord');
+goog.require('ol.tilegrid.TileGrid');
+
+
+
+/**
+ * @classdesc
+ * Set the grid pattern for sources accessing XYZ tiled-image servers.
+ *
+ * @constructor
+ * @extends {ol.tilegrid.TileGrid}
+ * @param {olx.tilegrid.XYZOptions} options XYZ options.
+ * @struct
+ * @api
+ */
+ol.tilegrid.XYZ = function(options) {
+  var extent = goog.isDef(options.extent) ?
+      options.extent : ol.proj.EPSG3857.EXTENT;
+  var resolutions = ol.tilegrid.resolutionsFromExtent(
+      extent, options.maxZoom, options.tileSize);
+
+  goog.base(this, {
+    minZoom: options.minZoom,
+    origin: ol.extent.getCorner(extent, ol.extent.Corner.TOP_LEFT),
+    resolutions: resolutions,
+    tileSize: options.tileSize
+  });
+
+};
+goog.inherits(ol.tilegrid.XYZ, ol.tilegrid.TileGrid);
+
+
+/**
+ * @inheritDoc
+ */
+ol.tilegrid.XYZ.prototype.createTileCoordTransform = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+  var minZ = this.minZoom;
+  var maxZ = this.maxZoom;
+  var wrapX = goog.isDef(options.wrapX) ? options.wrapX : true;
+  /** @type {Array.<ol.TileRange>} */
+  var tileRangeByZ = null;
+  if (goog.isDef(options.extent)) {
+    tileRangeByZ = new Array(maxZ + 1);
+    var z;
+    for (z = 0; z <= maxZ; ++z) {
+      if (z < minZ) {
+        tileRangeByZ[z] = null;
+      } else {
+        tileRangeByZ[z] = this.getTileRangeForExtentAndZ(options.extent, z);
+      }
+    }
+  }
+  return (
+      /**
+       * @param {ol.TileCoord} tileCoord Tile coordinate.
+       * @param {ol.proj.Projection} projection Projection.
+       * @param {ol.TileCoord=} opt_tileCoord Destination tile coordinate.
+       * @return {ol.TileCoord} Tile coordinate.
+       */
+      function(tileCoord, projection, opt_tileCoord) {
+        var z = tileCoord[0];
+        if (z < minZ || maxZ < z) {
+          return null;
+        }
+        var n = Math.pow(2, z);
+        var x = tileCoord[1];
+        if (wrapX) {
+          x = goog.math.modulo(x, n);
+        } else if (x < 0 || n <= x) {
+          return null;
+        }
+        var y = tileCoord[2];
+        if (y < -n || -1 < y) {
+          return null;
+        }
+        if (!goog.isNull(tileRangeByZ)) {
+          if (!tileRangeByZ[z].containsXY(x, y)) {
+            return null;
+          }
+        }
+        return ol.tilecoord.createOrUpdate(z, x, -y - 1, opt_tileCoord);
+      });
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.tilegrid.XYZ.prototype.getTileCoordChildTileRange =
+    function(tileCoord, opt_tileRange) {
+  if (tileCoord[0] < this.maxZoom) {
+    var doubleX = 2 * tileCoord[1];
+    var doubleY = 2 * tileCoord[2];
+    return ol.TileRange.createOrUpdate(
+        doubleX, doubleX + 1,
+        doubleY, doubleY + 1,
+        opt_tileRange);
+  } else {
+    return null;
+  }
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.tilegrid.XYZ.prototype.forEachTileCoordParentTileRange =
+    function(tileCoord, callback, opt_this, opt_tileRange) {
+  var tileRange = ol.TileRange.createOrUpdate(
+      0, tileCoord[1], 0, tileCoord[2], opt_tileRange);
+  var z;
+  for (z = tileCoord[0] - 1; z >= this.minZoom; --z) {
+    tileRange.minX = tileRange.maxX >>= 1;
+    tileRange.minY = tileRange.maxY >>= 1;
+    if (callback.call(opt_this, z, tileRange)) {
+      return true;
+    }
+  }
+  return false;
+};
diff --git a/src/ol/tilegrid/zoomifytilegrid.js b/src/ol/tilegrid/zoomifytilegrid.js
new file mode 100644
index 0000000..379e23c
--- /dev/null
+++ b/src/ol/tilegrid/zoomifytilegrid.js
@@ -0,0 +1,79 @@
+goog.provide('ol.tilegrid.Zoomify');
+
+goog.require('goog.math');
+goog.require('ol.TileCoord');
+goog.require('ol.proj');
+goog.require('ol.tilecoord');
+goog.require('ol.tilegrid.TileGrid');
+
+
+
+/**
+ * @classdesc
+ * Set the grid pattern for sources accessing Zoomify tiled-image servers.
+ *
+ * @constructor
+ * @extends {ol.tilegrid.TileGrid}
+ * @param {olx.tilegrid.ZoomifyOptions=} opt_options Options.
+ * @api
+ */
+ol.tilegrid.Zoomify = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : options;
+  goog.base(this, {
+    origin: [0, 0],
+    resolutions: options.resolutions
+  });
+
+};
+goog.inherits(ol.tilegrid.Zoomify, ol.tilegrid.TileGrid);
+
+
+/**
+ * @inheritDoc
+ */
+ol.tilegrid.Zoomify.prototype.createTileCoordTransform = function(opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+  var minZ = this.minZoom;
+  var maxZ = this.maxZoom;
+  /** @type {Array.<ol.TileRange>} */
+  var tileRangeByZ = null;
+  if (goog.isDef(options.extent)) {
+    tileRangeByZ = new Array(maxZ + 1);
+    var z;
+    for (z = 0; z <= maxZ; ++z) {
+      if (z < minZ) {
+        tileRangeByZ[z] = null;
+      } else {
+        tileRangeByZ[z] = this.getTileRangeForExtentAndZ(options.extent, z);
+      }
+    }
+  }
+  return (
+      /**
+       * @param {ol.TileCoord} tileCoord Tile coordinate.
+       * @param {ol.proj.Projection} projection Projection.
+       * @param {ol.TileCoord=} opt_tileCoord Destination tile coordinate.
+       * @return {ol.TileCoord} Tile coordinate.
+       */
+      function(tileCoord, projection, opt_tileCoord) {
+        var z = tileCoord[0];
+        if (z < minZ || maxZ < z) {
+          return null;
+        }
+        var n = Math.pow(2, z);
+        var x = tileCoord[1];
+        if (x < 0 || n <= x) {
+          return null;
+        }
+        var y = tileCoord[2];
+        if (y < -n || -1 < y) {
+          return null;
+        }
+        if (!goog.isNull(tileRangeByZ)) {
+          if (!tileRangeByZ[z].containsXY(x, -y - 1)) {
+            return null;
+          }
+        }
+        return ol.tilecoord.createOrUpdate(z, x, -y - 1, opt_tileCoord);
+      });
+};
diff --git a/src/ol/tileloadfunction.js b/src/ol/tileloadfunction.js
new file mode 100644
index 0000000..887eda6
--- /dev/null
+++ b/src/ol/tileloadfunction.js
@@ -0,0 +1,11 @@
+goog.provide('ol.TileLoadFunctionType');
+
+
+/**
+ * A function that takes an {@link ol.ImageTile} for the image tile and a
+ * `{string}` for the src as arguments.
+ *
+ * @typedef {function(ol.ImageTile, string)}
+ * @api
+ */
+ol.TileLoadFunctionType;
diff --git a/src/ol/tilequeue.js b/src/ol/tilequeue.js
new file mode 100644
index 0000000..668d396
--- /dev/null
+++ b/src/ol/tilequeue.js
@@ -0,0 +1,93 @@
+goog.provide('ol.TilePriorityFunction');
+goog.provide('ol.TileQueue');
+
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('ol.Coordinate');
+goog.require('ol.structs.PriorityQueue');
+
+
+/**
+ * @typedef {function(ol.Tile, string, ol.Coordinate, number): number}
+ */
+ol.TilePriorityFunction;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.structs.PriorityQueue.<Array>}
+ * @param {ol.TilePriorityFunction} tilePriorityFunction
+ *     Tile priority function.
+ * @param {function(): ?} tileChangeCallback
+ *     Function called on each tile change event.
+ * @struct
+ */
+ol.TileQueue = function(tilePriorityFunction, tileChangeCallback) {
+
+  goog.base(
+      this,
+      /**
+       * @param {Array} element Element.
+       * @return {number} Priority.
+       */
+      function(element) {
+        return tilePriorityFunction.apply(null, element);
+      },
+      /**
+       * @param {Array} element Element.
+       * @return {string} Key.
+       */
+      function(element) {
+        return /** @type {ol.Tile} */ (element[0]).getKey();
+      });
+
+  /**
+   * @private
+   * @type {function(): ?}
+   */
+  this.tileChangeCallback_ = tileChangeCallback;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.tilesLoading_ = 0;
+
+};
+goog.inherits(ol.TileQueue, ol.structs.PriorityQueue);
+
+
+/**
+ * @return {number} Number of tiles loading.
+ */
+ol.TileQueue.prototype.getTilesLoading = function() {
+  return this.tilesLoading_;
+};
+
+
+/**
+ * @protected
+ */
+ol.TileQueue.prototype.handleTileChange = function() {
+  --this.tilesLoading_;
+  this.tileChangeCallback_();
+};
+
+
+/**
+ * @param {number} maxTotalLoading Maximum number tiles to load simultaneously.
+ * @param {number} maxNewLoads Maximum number of new tiles to load.
+ */
+ol.TileQueue.prototype.loadMoreTiles = function(maxTotalLoading, maxNewLoads) {
+  var newLoads = Math.min(
+      maxTotalLoading - this.getTilesLoading(), maxNewLoads, this.getCount());
+  var i, tile;
+  for (i = 0; i < newLoads; ++i) {
+    tile = /** @type {ol.Tile} */ (this.dequeue()[0]);
+    goog.events.listenOnce(tile, goog.events.EventType.CHANGE,
+        this.handleTileChange, false, this);
+    tile.load();
+  }
+  this.tilesLoading_ += newLoads;
+};
diff --git a/src/ol/tilerange.js b/src/ol/tilerange.js
new file mode 100644
index 0000000..2a2b51b
--- /dev/null
+++ b/src/ol/tilerange.js
@@ -0,0 +1,184 @@
+goog.provide('ol.TileRange');
+
+goog.require('goog.asserts');
+goog.require('ol.Size');
+goog.require('ol.TileCoord');
+
+
+
+/**
+ * A representation of a contiguous block of tiles.  A tile range is specified
+ * by its min/max tile coordinates and is inclusive of coordinates.
+ *
+ * @constructor
+ * @param {number} minX Minimum X.
+ * @param {number} maxX Maximum X.
+ * @param {number} minY Minimum Y.
+ * @param {number} maxY Maximum Y.
+ * @struct
+ */
+ol.TileRange = function(minX, maxX, minY, maxY) {
+
+  /**
+   * @type {number}
+   */
+  this.minX = minX;
+
+  /**
+   * @type {number}
+   */
+  this.maxX = maxX;
+
+  /**
+   * @type {number}
+   */
+  this.minY = minY;
+
+  /**
+   * @type {number}
+   */
+  this.maxY = maxY;
+
+};
+
+
+/**
+ * @param {...ol.TileCoord} var_args Tile coordinates.
+ * @return {!ol.TileRange} Bounding tile box.
+ */
+ol.TileRange.boundingTileRange = function(var_args) {
+  var tileCoord0 = /** @type {ol.TileCoord} */ (arguments[0]);
+  var tileCoord0Z = tileCoord0[0];
+  var tileCoord0X = tileCoord0[1];
+  var tileCoord0Y = tileCoord0[2];
+  var tileRange = new ol.TileRange(tileCoord0X, tileCoord0X,
+                                   tileCoord0Y, tileCoord0Y);
+  var i, ii, tileCoord, tileCoordX, tileCoordY, tileCoordZ;
+  for (i = 1, ii = arguments.length; i < ii; ++i) {
+    tileCoord = /** @type {ol.TileCoord} */ (arguments[i]);
+    tileCoordZ = tileCoord[0];
+    tileCoordX = tileCoord[1];
+    tileCoordY = tileCoord[2];
+    goog.asserts.assert(tileCoordZ == tileCoord0Z);
+    tileRange.minX = Math.min(tileRange.minX, tileCoordX);
+    tileRange.maxX = Math.max(tileRange.maxX, tileCoordX);
+    tileRange.minY = Math.min(tileRange.minY, tileCoordY);
+    tileRange.maxY = Math.max(tileRange.maxY, tileCoordY);
+  }
+  return tileRange;
+};
+
+
+/**
+ * @param {number} minX Minimum X.
+ * @param {number} maxX Maximum X.
+ * @param {number} minY Minimum Y.
+ * @param {number} maxY Maximum Y.
+ * @param {ol.TileRange|undefined} tileRange TileRange.
+ * @return {ol.TileRange} Tile range.
+ */
+ol.TileRange.createOrUpdate = function(minX, maxX, minY, maxY, tileRange) {
+  if (goog.isDef(tileRange)) {
+    tileRange.minX = minX;
+    tileRange.maxX = maxX;
+    tileRange.minY = minY;
+    tileRange.maxY = maxY;
+    return tileRange;
+  } else {
+    return new ol.TileRange(minX, maxX, minY, maxY);
+  }
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @return {boolean} Contains tile coordinate.
+ */
+ol.TileRange.prototype.contains = function(tileCoord) {
+  return this.containsXY(tileCoord[1], tileCoord[2]);
+};
+
+
+/**
+ * @param {ol.TileRange} tileRange Tile range.
+ * @return {boolean} Contains.
+ */
+ol.TileRange.prototype.containsTileRange = function(tileRange) {
+  return this.minX <= tileRange.minX && tileRange.maxX <= this.maxX &&
+      this.minY <= tileRange.minY && tileRange.maxY <= this.maxY;
+};
+
+
+/**
+ * @param {number} x Tile coordinate x.
+ * @param {number} y Tile coordinate y.
+ * @return {boolean} Contains coordinate.
+ */
+ol.TileRange.prototype.containsXY = function(x, y) {
+  return this.minX <= x && x <= this.maxX && this.minY <= y && y <= this.maxY;
+};
+
+
+/**
+ * @param {ol.TileRange} tileRange Tile range.
+ * @return {boolean} Equals.
+ */
+ol.TileRange.prototype.equals = function(tileRange) {
+  return this.minX == tileRange.minX && this.minY == tileRange.minY &&
+      this.maxX == tileRange.maxX && this.maxY == tileRange.maxY;
+};
+
+
+/**
+ * @param {ol.TileRange} tileRange Tile range.
+ */
+ol.TileRange.prototype.extend = function(tileRange) {
+  if (tileRange.minX < this.minX) {
+    this.minX = tileRange.minX;
+  }
+  if (tileRange.maxX > this.maxX) {
+    this.maxX = tileRange.maxX;
+  }
+  if (tileRange.minY < this.minY) {
+    this.minY = tileRange.minY;
+  }
+  if (tileRange.maxY > this.maxY) {
+    this.maxY = tileRange.maxY;
+  }
+};
+
+
+/**
+ * @return {number} Height.
+ */
+ol.TileRange.prototype.getHeight = function() {
+  return this.maxY - this.minY + 1;
+};
+
+
+/**
+ * @return {ol.Size} Size.
+ */
+ol.TileRange.prototype.getSize = function() {
+  return [this.getWidth(), this.getHeight()];
+};
+
+
+/**
+ * @return {number} Width.
+ */
+ol.TileRange.prototype.getWidth = function() {
+  return this.maxX - this.minX + 1;
+};
+
+
+/**
+ * @param {ol.TileRange} tileRange Tile range.
+ * @return {boolean} Intersects.
+ */
+ol.TileRange.prototype.intersects = function(tileRange) {
+  return this.minX <= tileRange.maxX &&
+      this.maxX >= tileRange.minX &&
+      this.minY <= tileRange.maxY &&
+      this.maxY >= tileRange.minY;
+};
diff --git a/src/ol/tileurlfunction.js b/src/ol/tileurlfunction.js
new file mode 100644
index 0000000..00b4e82
--- /dev/null
+++ b/src/ol/tileurlfunction.js
@@ -0,0 +1,157 @@
+goog.provide('ol.TileUrlFunction');
+goog.provide('ol.TileUrlFunctionType');
+
+goog.require('goog.array');
+goog.require('goog.math');
+goog.require('ol.TileCoord');
+goog.require('ol.tilecoord');
+
+
+/**
+ * A function that takes an {@link ol.TileCoord} for the tile coordinate,
+ * a `{number}` representing the pixel ratio and an {@link ol.proj.Projection}
+ * for the projection  as arguments and returns a `{string}` or
+ * undefined representing the tile URL.
+ *
+ * @typedef {function(ol.TileCoord, number,
+ *           ol.proj.Projection): (string|undefined)}
+ * @api
+ */
+ol.TileUrlFunctionType;
+
+
+/**
+ * @typedef {function(ol.TileCoord, ol.proj.Projection, ol.TileCoord=):
+ *     ol.TileCoord}
+ */
+ol.TileCoordTransformType;
+
+
+/**
+ * @param {string} template Template.
+ * @return {ol.TileUrlFunctionType} Tile URL function.
+ */
+ol.TileUrlFunction.createFromTemplate = function(template) {
+  var zRegEx = /\{z\}/g;
+  var xRegEx = /\{x\}/g;
+  var yRegEx = /\{y\}/g;
+  var dashYRegEx = /\{-y\}/g;
+  return (
+      /**
+       * @param {ol.TileCoord} tileCoord Tile Coordinate.
+       * @param {number} pixelRatio Pixel ratio.
+       * @param {ol.proj.Projection} projection Projection.
+       * @return {string|undefined} Tile URL.
+       */
+      function(tileCoord, pixelRatio, projection) {
+        if (goog.isNull(tileCoord)) {
+          return undefined;
+        } else {
+          return template.replace(zRegEx, tileCoord[0].toString())
+                         .replace(xRegEx, tileCoord[1].toString())
+                         .replace(yRegEx, tileCoord[2].toString())
+                         .replace(dashYRegEx, function() {
+                           var y = (1 << tileCoord[0]) - tileCoord[2] - 1;
+                           return y.toString();
+                         });
+        }
+      });
+};
+
+
+/**
+ * @param {Array.<string>} templates Templates.
+ * @return {ol.TileUrlFunctionType} Tile URL function.
+ */
+ol.TileUrlFunction.createFromTemplates = function(templates) {
+  return ol.TileUrlFunction.createFromTileUrlFunctions(
+      goog.array.map(templates, ol.TileUrlFunction.createFromTemplate));
+};
+
+
+/**
+ * @param {Array.<ol.TileUrlFunctionType>} tileUrlFunctions Tile URL Functions.
+ * @return {ol.TileUrlFunctionType} Tile URL function.
+ */
+ol.TileUrlFunction.createFromTileUrlFunctions = function(tileUrlFunctions) {
+  if (tileUrlFunctions.length === 1) {
+    return tileUrlFunctions[0];
+  }
+  return (
+      /**
+       * @param {ol.TileCoord} tileCoord Tile Coordinate.
+       * @param {number} pixelRatio Pixel ratio.
+       * @param {ol.proj.Projection} projection Projection.
+       * @return {string|undefined} Tile URL.
+       */
+      function(tileCoord, pixelRatio, projection) {
+        if (goog.isNull(tileCoord)) {
+          return undefined;
+        } else {
+          var h = ol.tilecoord.hash(tileCoord);
+          var index = goog.math.modulo(h, tileUrlFunctions.length);
+          return tileUrlFunctions[index](tileCoord, pixelRatio, projection);
+        }
+      });
+};
+
+
+/**
+ * @param {ol.TileCoord} tileCoord Tile coordinate.
+ * @param {number} pixelRatio Pixel ratio.
+ * @param {ol.proj.Projection} projection Projection.
+ * @return {string|undefined} Tile URL.
+ */
+ol.TileUrlFunction.nullTileUrlFunction =
+    function(tileCoord, pixelRatio, projection) {
+  return undefined;
+};
+
+
+/**
+ * @param {ol.TileCoordTransformType} transformFn Transform function.
+ * @param {ol.TileUrlFunctionType} tileUrlFunction Tile URL function.
+ * @return {ol.TileUrlFunctionType} Tile URL function.
+ */
+ol.TileUrlFunction.withTileCoordTransform =
+    function(transformFn, tileUrlFunction) {
+  var tmpTileCoord = [0, 0, 0];
+  return (
+      /**
+       * @param {ol.TileCoord} tileCoord Tile Coordinate.
+       * @param {number} pixelRatio Pixel ratio.
+       * @param {ol.proj.Projection} projection Projection.
+       * @return {string|undefined} Tile URL.
+       */
+      function(tileCoord, pixelRatio, projection) {
+        if (goog.isNull(tileCoord)) {
+          return undefined;
+        } else {
+          return tileUrlFunction(
+              transformFn(tileCoord, projection, tmpTileCoord),
+              pixelRatio,
+              projection);
+        }
+      });
+};
+
+
+/**
+ * @param {string} url URL.
+ * @return {Array.<string>} Array of urls.
+ */
+ol.TileUrlFunction.expandUrl = function(url) {
+  var urls = [];
+  var match = /\{(\d)-(\d)\}/.exec(url) || /\{([a-z])-([a-z])\}/.exec(url);
+  if (match) {
+    var startCharCode = match[1].charCodeAt(0);
+    var stopCharCode = match[2].charCodeAt(0);
+    var charCode;
+    for (charCode = startCharCode; charCode <= stopCharCode; ++charCode) {
+      urls.push(url.replace(match[0], String.fromCharCode(charCode)));
+    }
+  } else {
+    urls.push(url);
+  }
+  return urls;
+};
diff --git a/src/ol/transformfunction.js b/src/ol/transformfunction.js
new file mode 100644
index 0000000..d734d24
--- /dev/null
+++ b/src/ol/transformfunction.js
@@ -0,0 +1,13 @@
+goog.provide('ol.TransformFunction');
+
+
+/**
+ * A transform function accepts an array of input coordinate values, an optional
+ * output array, and an optional dimension (default should be 2).  The function
+ * transforms the input coordinate values, populates the output array, and
+ * returns the output array.
+ *
+ * @typedef {function(Array.<number>, Array.<number>=, number=): Array.<number>}
+ * @api stable
+ */
+ol.TransformFunction;
diff --git a/src/ol/vec/mat4.js b/src/ol/vec/mat4.js
new file mode 100644
index 0000000..54e7df7
--- /dev/null
+++ b/src/ol/vec/mat4.js
@@ -0,0 +1,82 @@
+goog.provide('ol.vec.Mat4');
+
+goog.require('goog.vec.Mat4');
+
+
+/**
+ * @param {!goog.vec.Mat4.Number} mat Matrix.
+ * @param {number} translateX1 Translate X1.
+ * @param {number} translateY1 Translate Y1.
+ * @param {number} scaleX Scale X.
+ * @param {number} scaleY Scale Y.
+ * @param {number} rotation Rotation.
+ * @param {number} translateX2 Translate X2.
+ * @param {number} translateY2 Translate Y2.
+ * @return {!goog.vec.Mat4.Number} Matrix.
+ */
+ol.vec.Mat4.makeTransform2D = function(mat, translateX1, translateY1,
+    scaleX, scaleY, rotation, translateX2, translateY2) {
+  goog.vec.Mat4.makeIdentity(mat);
+  if (translateX1 !== 0 || translateY1 !== 0) {
+    goog.vec.Mat4.translate(mat, translateX1, translateY1, 0);
+  }
+  if (scaleX != 1 || scaleY != 1) {
+    goog.vec.Mat4.scale(mat, scaleX, scaleY, 1);
+  }
+  if (rotation !== 0) {
+    goog.vec.Mat4.rotateZ(mat, rotation);
+  }
+  if (translateX2 !== 0 || translateY2 !== 0) {
+    goog.vec.Mat4.translate(mat, translateX2, translateY2, 0);
+  }
+  return mat;
+};
+
+
+/**
+ * Returns true if mat1 and mat2 represent the same 2D transformation.
+ * @param {goog.vec.Mat4.Number} mat1 Matrix 1.
+ * @param {goog.vec.Mat4.Number} mat2 Matrix 2.
+ * @return {boolean} Equal 2D.
+ */
+ol.vec.Mat4.equals2D = function(mat1, mat2) {
+  return (
+      goog.vec.Mat4.getElement(mat1, 0, 0) ==
+      goog.vec.Mat4.getElement(mat2, 0, 0) &&
+      goog.vec.Mat4.getElement(mat1, 1, 0) ==
+      goog.vec.Mat4.getElement(mat2, 1, 0) &&
+      goog.vec.Mat4.getElement(mat1, 0, 1) ==
+      goog.vec.Mat4.getElement(mat2, 0, 1) &&
+      goog.vec.Mat4.getElement(mat1, 1, 1) ==
+      goog.vec.Mat4.getElement(mat2, 1, 1) &&
+      goog.vec.Mat4.getElement(mat1, 0, 3) ==
+      goog.vec.Mat4.getElement(mat2, 0, 3) &&
+      goog.vec.Mat4.getElement(mat1, 1, 3) ==
+      goog.vec.Mat4.getElement(mat2, 1, 3));
+};
+
+
+/**
+ * Transforms the given vector with the given matrix storing the resulting,
+ * transformed vector into resultVec. The input vector is multiplied against the
+ * upper 2x4 matrix omitting the projective component.
+ *
+ * @param {goog.vec.Mat4.Number} mat The matrix supplying the transformation.
+ * @param {Array.<number>} vec The 3 element vector to transform.
+ * @param {Array.<number>} resultVec The 3 element vector to receive the results
+ *     (may be vec).
+ * @return {Array.<number>} return resultVec so that operations can be
+ *     chained together.
+ */
+ol.vec.Mat4.multVec2 = function(mat, vec, resultVec) {
+  var m00 = goog.vec.Mat4.getElement(mat, 0, 0);
+  var m10 = goog.vec.Mat4.getElement(mat, 1, 0);
+  var m01 = goog.vec.Mat4.getElement(mat, 0, 1);
+  var m11 = goog.vec.Mat4.getElement(mat, 1, 1);
+  var m03 = goog.vec.Mat4.getElement(mat, 0, 3);
+  var m13 = goog.vec.Mat4.getElement(mat, 1, 3);
+  var x = vec[0], y = vec[1];
+  resultVec[0] = m00 * x + m01 * y + m03;
+  resultVec[1] = m10 * x + m11 * y + m13;
+  return resultVec;
+};
diff --git a/src/ol/view.js b/src/ol/view.js
new file mode 100644
index 0000000..2a02b6b
--- /dev/null
+++ b/src/ol/view.js
@@ -0,0 +1,772 @@
+goog.provide('ol.View');
+goog.provide('ol.ViewHint');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('ol');
+goog.require('ol.CenterConstraint');
+goog.require('ol.Constraints');
+goog.require('ol.Object');
+goog.require('ol.ResolutionConstraint');
+goog.require('ol.RotationConstraint');
+goog.require('ol.RotationConstraintType');
+goog.require('ol.Size');
+goog.require('ol.coordinate');
+goog.require('ol.extent');
+goog.require('ol.proj');
+goog.require('ol.proj.METERS_PER_UNIT');
+goog.require('ol.proj.Projection');
+goog.require('ol.proj.Units');
+
+
+/**
+ * @enum {string}
+ */
+ol.ViewProperty = {
+  CENTER: 'center',
+  RESOLUTION: 'resolution',
+  ROTATION: 'rotation'
+};
+
+
+/**
+ * @enum {number}
+ */
+ol.ViewHint = {
+  ANIMATING: 0,
+  INTERACTING: 1
+};
+
+
+
+/**
+ * @classdesc
+ * An ol.View object represents a simple 2D view of the map.
+ *
+ * This is the object to act upon to change the center, resolution,
+ * and rotation of the map.
+ *
+ * ### The view states
+ *
+ * An `ol.View` is determined by three states: `center`, `resolution`,
+ * and `rotation`. Each state has a corresponding getter and setter, e.g.
+ * `getCenter` and `setCenter` for the `center` state.
+ *
+ * An `ol.View` has a `projection`. The projection determines the
+ * coordinate system of the center, and its units determine the units of the
+ * resolution (projection units per pixel). The default projection is
+ * Spherical Mercator (EPSG:3857).
+ *
+ * ### The constraints
+ *
+ * `setCenter`, `setResolution` and `setRotation` can be used to change the
+ * states of the view. Any value can be passed to the setters. And the value
+ * that is passed to a setter will effectively be the value set in the view,
+ * and returned by the corresponding getter.
+ *
+ * But an `ol.View` object also has a *resolution constraint*, a
+ * *rotation constraint* and a *center constraint*.
+ *
+ * As said above, no constraints are applied when the setters are used to set
+ * new states for the view. Applying constraints is done explicitly through
+ * the use of the `constrain*` functions (`constrainResolution` and
+ * `constrainRotation` and `constrainCenter`).
+ *
+ * The main users of the constraints are the interactions and the
+ * controls. For example, double-clicking on the map changes the view to
+ * the "next" resolution. And releasing the fingers after pinch-zooming
+ * snaps to the closest resolution (with an animation).
+ *
+ * The *resolution constraint* snaps to specific resolutions. It is
+ * determined by the following options: `resolutions`, `maxResolution`,
+ * `maxZoom`, and `zoomFactor`. If `resolutions` is set, the other three
+ * options are ignored. See documentation for each option for more
+ * information.
+ *
+ * The *rotation constraint* snaps to specific angles. It is determined
+ * by the following options: `enableRotation` and `constrainRotation`.
+ * By default the rotation value is snapped to zero when approaching the
+ * horizontal.
+ *
+ * The *center constraint* is determined by the `extent` option. By
+ * default the center is not constrained at all.
+ *
+ * @constructor
+ * @extends {ol.Object}
+ * @param {olx.ViewOptions=} opt_options View options.
+ * @api stable
+ */
+ol.View = function(opt_options) {
+  goog.base(this);
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.hints_ = [0, 0];
+
+  /**
+   * @type {Object.<string, *>}
+   */
+  var properties = {};
+  properties[ol.ViewProperty.CENTER] = goog.isDef(options.center) ?
+      options.center : null;
+
+  /**
+   * @private
+   * @type {ol.proj.Projection}
+   */
+  this.projection_ = ol.proj.createProjection(options.projection, 'EPSG:3857');
+
+  var resolutionConstraintInfo = ol.View.createResolutionConstraint_(
+      options);
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.maxResolution_ = resolutionConstraintInfo.maxResolution;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.minResolution_ = resolutionConstraintInfo.minResolution;
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.minZoom_ = resolutionConstraintInfo.minZoom;
+
+  var centerConstraint = ol.View.createCenterConstraint_(options);
+  var resolutionConstraint = resolutionConstraintInfo.constraint;
+  var rotationConstraint = ol.View.createRotationConstraint_(options);
+
+  /**
+   * @private
+   * @type {ol.Constraints}
+   */
+  this.constraints_ = new ol.Constraints(
+      centerConstraint, resolutionConstraint, rotationConstraint);
+
+  if (goog.isDef(options.resolution)) {
+    properties[ol.ViewProperty.RESOLUTION] = options.resolution;
+  } else if (goog.isDef(options.zoom)) {
+    properties[ol.ViewProperty.RESOLUTION] = this.constrainResolution(
+        this.maxResolution_, options.zoom - this.minZoom_);
+  }
+  properties[ol.ViewProperty.ROTATION] =
+      goog.isDef(options.rotation) ? options.rotation : 0;
+  this.setProperties(properties);
+};
+goog.inherits(ol.View, ol.Object);
+
+
+/**
+ * @param {number} rotation Target rotation.
+ * @param {ol.Coordinate} anchor Rotation anchor.
+ * @return {ol.Coordinate|undefined} Center for rotation and anchor.
+ */
+ol.View.prototype.calculateCenterRotate = function(rotation, anchor) {
+  var center;
+  var currentCenter = this.getCenter();
+  if (goog.isDef(currentCenter)) {
+    center = [currentCenter[0] - anchor[0], currentCenter[1] - anchor[1]];
+    ol.coordinate.rotate(center, rotation - this.getRotation());
+    ol.coordinate.add(center, anchor);
+  }
+  return center;
+};
+
+
+/**
+ * @param {number} resolution Target resolution.
+ * @param {ol.Coordinate} anchor Zoom anchor.
+ * @return {ol.Coordinate|undefined} Center for resolution and anchor.
+ */
+ol.View.prototype.calculateCenterZoom = function(resolution, anchor) {
+  var center;
+  var currentCenter = this.getCenter();
+  var currentResolution = this.getResolution();
+  if (goog.isDef(currentCenter) && goog.isDef(currentResolution)) {
+    var x = anchor[0] -
+        resolution * (anchor[0] - currentCenter[0]) / currentResolution;
+    var y = anchor[1] -
+        resolution * (anchor[1] - currentCenter[1]) / currentResolution;
+    center = [x, y];
+  }
+  return center;
+};
+
+
+/**
+ * Get the constrained center of this view.
+ * @param {ol.Coordinate|undefined} center Center.
+ * @return {ol.Coordinate|undefined} Constrained center.
+ * @api
+ */
+ol.View.prototype.constrainCenter = function(center) {
+  return this.constraints_.center(center);
+};
+
+
+/**
+ * Get the constrained resolution of this view.
+ * @param {number|undefined} resolution Resolution.
+ * @param {number=} opt_delta Delta. Default is `0`.
+ * @param {number=} opt_direction Direction. Default is `0`.
+ * @return {number|undefined} Constrained resolution.
+ * @api
+ */
+ol.View.prototype.constrainResolution = function(
+    resolution, opt_delta, opt_direction) {
+  var delta = opt_delta || 0;
+  var direction = opt_direction || 0;
+  return this.constraints_.resolution(resolution, delta, direction);
+};
+
+
+/**
+ * Get the constrained rotation of this view.
+ * @param {number|undefined} rotation Rotation.
+ * @param {number=} opt_delta Delta. Default is `0`.
+ * @return {number|undefined} Constrained rotation.
+ * @api
+ */
+ol.View.prototype.constrainRotation = function(rotation, opt_delta) {
+  var delta = opt_delta || 0;
+  return this.constraints_.rotation(rotation, delta);
+};
+
+
+/**
+ * @return {ol.Coordinate|undefined} The center of the view.
+ * @observable
+ * @api stable
+ */
+ol.View.prototype.getCenter = function() {
+  return /** @type {ol.Coordinate|undefined} */ (
+      this.get(ol.ViewProperty.CENTER));
+};
+goog.exportProperty(
+    ol.View.prototype,
+    'getCenter',
+    ol.View.prototype.getCenter);
+
+
+/**
+ * @return {Array.<number>} Hint.
+ */
+ol.View.prototype.getHints = function() {
+  return goog.array.clone(this.hints_);
+};
+
+
+/**
+ * Calculate the extent for the current view state and the passed `size`.
+ * `size` is the size in pixels of the box into which the calculated extent
+ * should fit. In most cases you want to get the extent of the entire map,
+ * that is `map.getSize()`.
+ * @param {ol.Size} size Box pixel size.
+ * @return {ol.Extent} Extent.
+ * @api
+ */
+ol.View.prototype.calculateExtent = function(size) {
+  goog.asserts.assert(this.isDef());
+  var center = this.getCenter();
+  var resolution = this.getResolution();
+  var minX = center[0] - resolution * size[0] / 2;
+  var maxX = center[0] + resolution * size[0] / 2;
+  var minY = center[1] - resolution * size[1] / 2;
+  var maxY = center[1] + resolution * size[1] / 2;
+  return [minX, minY, maxX, maxY];
+};
+
+
+/**
+ * @return {ol.proj.Projection} The projection of the view.
+ * @api stable
+ */
+ol.View.prototype.getProjection = function() {
+  return this.projection_;
+};
+
+
+/**
+ * @return {number|undefined} The resolution of the view.
+ * @observable
+ * @api stable
+ */
+ol.View.prototype.getResolution = function() {
+  return /** @type {number|undefined} */ (
+      this.get(ol.ViewProperty.RESOLUTION));
+};
+goog.exportProperty(
+    ol.View.prototype,
+    'getResolution',
+    ol.View.prototype.getResolution);
+
+
+/**
+ * Get the resolution for a provided extent (in map units) and size (in pixels).
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Size} size Box pixel size.
+ * @return {number} The resolution at which the provided extent will render at
+ *     the given size.
+ * @api
+ */
+ol.View.prototype.getResolutionForExtent = function(extent, size) {
+  var xResolution = ol.extent.getWidth(extent) / size[0];
+  var yResolution = ol.extent.getHeight(extent) / size[1];
+  return Math.max(xResolution, yResolution);
+};
+
+
+/**
+ * Return a function that returns a value between 0 and 1 for a
+ * resolution. Exponential scaling is assumed.
+ * @param {number=} opt_power Power.
+ * @return {function(number): number} Resolution for value function.
+ */
+ol.View.prototype.getResolutionForValueFunction = function(opt_power) {
+  var power = opt_power || 2;
+  var maxResolution = this.maxResolution_;
+  var minResolution = this.minResolution_;
+  var max = Math.log(maxResolution / minResolution) / Math.log(power);
+  return (
+      /**
+       * @param {number} value Value.
+       * @return {number} Resolution.
+       */
+      function(value) {
+        var resolution = maxResolution / Math.pow(power, value * max);
+        goog.asserts.assert(resolution >= minResolution &&
+            resolution <= maxResolution);
+        return resolution;
+      });
+};
+
+
+/**
+ * @return {number|undefined} The rotation of the view.
+ * @observable
+ * @api stable
+ */
+ol.View.prototype.getRotation = function() {
+  return /** @type {number|undefined} */ (this.get(ol.ViewProperty.ROTATION));
+};
+goog.exportProperty(
+    ol.View.prototype,
+    'getRotation',
+    ol.View.prototype.getRotation);
+
+
+/**
+ * Return a function that returns a resolution for a value between
+ * 0 and 1. Exponential scaling is assumed.
+ * @param {number=} opt_power Power.
+ * @return {function(number): number} Value for resolution function.
+ */
+ol.View.prototype.getValueForResolutionFunction = function(opt_power) {
+  var power = opt_power || 2;
+  var maxResolution = this.maxResolution_;
+  var minResolution = this.minResolution_;
+  var max = Math.log(maxResolution / minResolution) / Math.log(power);
+  return (
+      /**
+       * @param {number} resolution Resolution.
+       * @return {number} Value.
+       */
+      function(resolution) {
+        var value =
+            (Math.log(maxResolution / resolution) / Math.log(power)) / max;
+        goog.asserts.assert(value >= 0 && value <= 1);
+        return value;
+      });
+};
+
+
+/**
+ * @return {olx.ViewState} View state.
+ */
+ol.View.prototype.getState = function() {
+  goog.asserts.assert(this.isDef());
+  var center = /** @type {ol.Coordinate} */ (this.getCenter());
+  var projection = this.getProjection();
+  var resolution = /** @type {number} */ (this.getResolution());
+  var rotation = this.getRotation();
+  return /** @type {olx.ViewState} */ ({
+    center: center.slice(),
+    projection: goog.isDef(projection) ? projection : null,
+    resolution: resolution,
+    rotation: goog.isDef(rotation) ? rotation : 0
+  });
+};
+
+
+/**
+ * Get the current zoom level. Return undefined if the current
+ * resolution is undefined or not a "constrained resolution".
+ * @return {number|undefined} Zoom.
+ * @api stable
+ */
+ol.View.prototype.getZoom = function() {
+  var offset;
+  var resolution = this.getResolution();
+
+  if (goog.isDef(resolution)) {
+    var res, z = 0;
+    do {
+      res = this.constrainResolution(this.maxResolution_, z);
+      if (res == resolution) {
+        offset = z;
+        break;
+      }
+      ++z;
+    } while (res > this.minResolution_);
+  }
+
+  return goog.isDef(offset) ? this.minZoom_ + offset : offset;
+};
+
+
+/**
+ * Fit the map view to the passed `extent` and `size`. `size` is the size in
+ * pixels of the box to fit the extent into. In most cases you will want to
+ * use the map size, that is `map.getSize()`.
+ * @param {ol.Extent} extent Extent.
+ * @param {ol.Size} size Box pixel size.
+ * @api
+ */
+ol.View.prototype.fitExtent = function(extent, size) {
+  if (!ol.extent.isEmpty(extent)) {
+    this.setCenter(ol.extent.getCenter(extent));
+    var resolution = this.getResolutionForExtent(extent, size);
+    var constrainedResolution = this.constrainResolution(resolution, 0, 0);
+    if (constrainedResolution < resolution) {
+      constrainedResolution =
+          this.constrainResolution(constrainedResolution, -1, 0);
+    }
+    this.setResolution(constrainedResolution);
+  }
+};
+
+
+/**
+ * Fit the given geometry based on the given map size and border.
+ * Take care on the map angle.
+ * @param {ol.geom.SimpleGeometry} geometry Geometry.
+ * @param {ol.Size} size Box pixel size.
+ * @param {olx.view.FitGeometryOptions=} opt_options Options.
+ * @api
+ */
+ol.View.prototype.fitGeometry = function(geometry, size, opt_options) {
+  var options = goog.isDef(opt_options) ? opt_options : {};
+
+  var padding = goog.isDef(options.padding) ? options.padding : [0, 0, 0, 0];
+  var constrainResolution = goog.isDef(options.constrainResolution) ?
+      options.constrainResolution : true;
+  var nearest = goog.isDef(options.nearest) ? options.nearest : false;
+  var minResolution;
+  if (goog.isDef(options.minResolution)) {
+    minResolution = options.minResolution;
+  } else if (goog.isDef(options.maxZoom)) {
+    minResolution = this.constrainResolution(
+        this.maxResolution_, options.maxZoom - this.minZoom_, 0);
+  } else {
+    minResolution = 0;
+  }
+  var coords = geometry.getFlatCoordinates();
+
+  // calculate rotated extent
+  var rotation = this.getRotation();
+  goog.asserts.assert(goog.isDef(rotation));
+  var cosAngle = Math.cos(-rotation);
+  var sinAngle = Math.sin(-rotation);
+  var minRotX = +Infinity;
+  var minRotY = +Infinity;
+  var maxRotX = -Infinity;
+  var maxRotY = -Infinity;
+  var stride = geometry.getStride();
+  for (var i = 0, ii = coords.length; i < ii; i += stride) {
+    var rotX = coords[i] * cosAngle - coords[i + 1] * sinAngle;
+    var rotY = coords[i] * sinAngle + coords[i + 1] * cosAngle;
+    minRotX = Math.min(minRotX, rotX);
+    minRotY = Math.min(minRotY, rotY);
+    maxRotX = Math.max(maxRotX, rotX);
+    maxRotY = Math.max(maxRotY, rotY);
+  }
+
+  // calculate resolution
+  var resolution = this.getResolutionForExtent(
+      [minRotX, minRotY, maxRotX, maxRotY],
+      [size[0] - padding[1] - padding[3], size[1] - padding[0] - padding[2]]);
+  resolution = isNaN(resolution) ? minResolution :
+      Math.max(resolution, minResolution);
+  if (constrainResolution) {
+    var constrainedResolution = this.constrainResolution(resolution, 0, 0);
+    if (!nearest && constrainedResolution < resolution) {
+      constrainedResolution = this.constrainResolution(
+          constrainedResolution, -1, 0);
+    }
+    resolution = constrainedResolution;
+  }
+  this.setResolution(resolution);
+
+  // calculate center
+  sinAngle = -sinAngle; // go back to original rotation
+  var centerRotX = (minRotX + maxRotX) / 2;
+  var centerRotY = (minRotY + maxRotY) / 2;
+  centerRotX += (padding[1] - padding[3]) / 2 * resolution;
+  centerRotY += (padding[0] - padding[2]) / 2 * resolution;
+  var centerX = centerRotX * cosAngle - centerRotY * sinAngle;
+  var centerY = centerRotY * cosAngle + centerRotX * sinAngle;
+
+  this.setCenter([centerX, centerY]);
+};
+
+
+/**
+ * Center on coordinate and view position.
+ * Take care on the map angle.
+ * @param {ol.Coordinate} coordinate Coordinate.
+ * @param {ol.Size} size Box pixel size.
+ * @param {ol.Pixel} position Position on the view to center on.
+ * @api
+ */
+ol.View.prototype.centerOn = function(coordinate, size, position) {
+  // calculate rotated position
+  var rotation = this.getRotation();
+  var cosAngle = Math.cos(-rotation);
+  var sinAngle = Math.sin(-rotation);
+  var rotX = coordinate[0] * cosAngle - coordinate[1] * sinAngle;
+  var rotY = coordinate[1] * cosAngle + coordinate[0] * sinAngle;
+  var resolution = this.getResolution();
+  rotX += (size[0] / 2 - position[0]) * resolution;
+  rotY += (position[1] - size[1] / 2) * resolution;
+
+  // go back to original angle
+  sinAngle = -sinAngle; // go back to original rotation
+  var centerX = rotX * cosAngle - rotY * sinAngle;
+  var centerY = rotY * cosAngle + rotX * sinAngle;
+
+  this.setCenter([centerX, centerY]);
+};
+
+
+/**
+ * @return {boolean} Is defined.
+ */
+ol.View.prototype.isDef = function() {
+  return goog.isDefAndNotNull(this.getCenter()) &&
+      goog.isDef(this.getResolution());
+};
+
+
+/**
+ * Rotate the view around a given coordinate.
+ * @param {number} rotation New rotation value for the view.
+ * @param {ol.Coordinate=} opt_anchor The rotation center.
+ * @api stable
+ */
+ol.View.prototype.rotate = function(rotation, opt_anchor) {
+  if (goog.isDef(opt_anchor)) {
+    var center = this.calculateCenterRotate(rotation, opt_anchor);
+    this.setCenter(center);
+  }
+  this.setRotation(rotation);
+};
+
+
+/**
+ * Set the center of the current view.
+ * @param {ol.Coordinate|undefined} center The center of the view.
+ * @observable
+ * @api stable
+ */
+ol.View.prototype.setCenter = function(center) {
+  this.set(ol.ViewProperty.CENTER, center);
+};
+goog.exportProperty(
+    ol.View.prototype,
+    'setCenter',
+    ol.View.prototype.setCenter);
+
+
+/**
+ * @param {ol.ViewHint} hint Hint.
+ * @param {number} delta Delta.
+ * @return {number} New value.
+ */
+ol.View.prototype.setHint = function(hint, delta) {
+  goog.asserts.assert(0 <= hint && hint < this.hints_.length);
+  this.hints_[hint] += delta;
+  goog.asserts.assert(this.hints_[hint] >= 0);
+  return this.hints_[hint];
+};
+
+
+/**
+ * Set the resolution for this view.
+ * @param {number|undefined} resolution The resolution of the view.
+ * @observable
+ * @api stable
+ */
+ol.View.prototype.setResolution = function(resolution) {
+  this.set(ol.ViewProperty.RESOLUTION, resolution);
+};
+goog.exportProperty(
+    ol.View.prototype,
+    'setResolution',
+    ol.View.prototype.setResolution);
+
+
+/**
+ * Set the rotation for this view.
+ * @param {number|undefined} rotation The rotation of the view.
+ * @observable
+ * @api stable
+ */
+ol.View.prototype.setRotation = function(rotation) {
+  this.set(ol.ViewProperty.ROTATION, rotation);
+};
+goog.exportProperty(
+    ol.View.prototype,
+    'setRotation',
+    ol.View.prototype.setRotation);
+
+
+/**
+ * Zoom to a specific zoom level.
+ * @param {number} zoom Zoom level.
+ * @api stable
+ */
+ol.View.prototype.setZoom = function(zoom) {
+  var resolution = this.constrainResolution(
+      this.maxResolution_, zoom - this.minZoom_, 0);
+  this.setResolution(resolution);
+};
+
+
+/**
+ * @param {olx.ViewOptions} options View options.
+ * @private
+ * @return {ol.CenterConstraintType}
+ */
+ol.View.createCenterConstraint_ = function(options) {
+  if (goog.isDef(options.extent)) {
+    return ol.CenterConstraint.createExtent(options.extent);
+  } else {
+    return ol.CenterConstraint.none;
+  }
+};
+
+
+/**
+ * @private
+ * @param {olx.ViewOptions} options View options.
+ * @return {{constraint: ol.ResolutionConstraintType, maxResolution: number,
+ *     minResolution: number}}
+ */
+ol.View.createResolutionConstraint_ = function(options) {
+  var resolutionConstraint;
+  var maxResolution;
+  var minResolution;
+
+  // TODO: move these to be ol constants
+  // see https://github.com/openlayers/ol3/issues/2076
+  var defaultMaxZoom = 28;
+  var defaultZoomFactor = 2;
+
+  var minZoom = goog.isDef(options.minZoom) ?
+      options.minZoom : ol.DEFAULT_MIN_ZOOM;
+
+  var maxZoom = goog.isDef(options.maxZoom) ?
+      options.maxZoom : defaultMaxZoom;
+
+  var zoomFactor = goog.isDef(options.zoomFactor) ?
+      options.zoomFactor : defaultZoomFactor;
+
+  if (goog.isDef(options.resolutions)) {
+    var resolutions = options.resolutions;
+    maxResolution = resolutions[0];
+    minResolution = resolutions[resolutions.length - 1];
+    resolutionConstraint = ol.ResolutionConstraint.createSnapToResolutions(
+        resolutions);
+  } else {
+    // calculate the default min and max resolution
+    var projection = ol.proj.createProjection(options.projection, 'EPSG:3857');
+    var extent = projection.getExtent();
+    var size = goog.isNull(extent) ?
+        // use an extent that can fit the whole world if need be
+        360 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] /
+            ol.proj.METERS_PER_UNIT[projection.getUnits()] :
+        Math.max(ol.extent.getWidth(extent), ol.extent.getHeight(extent));
+
+    var defaultMaxResolution = size / ol.DEFAULT_TILE_SIZE / Math.pow(
+        defaultZoomFactor, ol.DEFAULT_MIN_ZOOM);
+
+    var defaultMinResolution = defaultMaxResolution / Math.pow(
+        defaultZoomFactor, defaultMaxZoom - ol.DEFAULT_MIN_ZOOM);
+
+    // user provided maxResolution takes precedence
+    maxResolution = options.maxResolution;
+    if (goog.isDef(maxResolution)) {
+      minZoom = 0;
+    } else {
+      maxResolution = defaultMaxResolution / Math.pow(zoomFactor, minZoom);
+    }
+
+    // user provided minResolution takes precedence
+    minResolution = options.minResolution;
+    if (!goog.isDef(minResolution)) {
+      if (goog.isDef(options.maxZoom)) {
+        if (goog.isDef(options.maxResolution)) {
+          minResolution = maxResolution / Math.pow(zoomFactor, maxZoom);
+        } else {
+          minResolution = defaultMaxResolution / Math.pow(zoomFactor, maxZoom);
+        }
+      } else {
+        minResolution = defaultMinResolution;
+      }
+    }
+
+    // given discrete zoom levels, minResolution may be different than provided
+    maxZoom = minZoom + Math.floor(
+        Math.log(maxResolution / minResolution) / Math.log(zoomFactor));
+    minResolution = maxResolution / Math.pow(zoomFactor, maxZoom - minZoom);
+
+    resolutionConstraint = ol.ResolutionConstraint.createSnapToPower(
+        zoomFactor, maxResolution, maxZoom - minZoom);
+  }
+  return {constraint: resolutionConstraint, maxResolution: maxResolution,
+    minResolution: minResolution, minZoom: minZoom};
+};
+
+
+/**
+ * @private
+ * @param {olx.ViewOptions} options View options.
+ * @return {ol.RotationConstraintType} Rotation constraint.
+ */
+ol.View.createRotationConstraint_ = function(options) {
+  var enableRotation = goog.isDef(options.enableRotation) ?
+      options.enableRotation : true;
+  if (enableRotation) {
+    var constrainRotation = options.constrainRotation;
+    if (!goog.isDef(constrainRotation) || constrainRotation === true) {
+      return ol.RotationConstraint.createSnapToZero();
+    } else if (constrainRotation === false) {
+      return ol.RotationConstraint.none;
+    } else if (goog.isNumber(constrainRotation)) {
+      return ol.RotationConstraint.createSnapToN(constrainRotation);
+    } else {
+      goog.asserts.fail();
+      return ol.RotationConstraint.none;
+    }
+  } else {
+    return ol.RotationConstraint.disable;
+  }
+};
diff --git a/src/ol/webgl/buffer.js b/src/ol/webgl/buffer.js
new file mode 100644
index 0000000..a39194c
--- /dev/null
+++ b/src/ol/webgl/buffer.js
@@ -0,0 +1,56 @@
+goog.provide('ol.webgl.Buffer');
+
+goog.require('goog.array');
+goog.require('goog.webgl');
+goog.require('ol');
+
+
+/**
+ * @enum {number}
+ */
+ol.webgl.BufferUsage = {
+  STATIC_DRAW: goog.webgl.STATIC_DRAW,
+  STREAM_DRAW: goog.webgl.STREAM_DRAW,
+  DYNAMIC_DRAW: goog.webgl.DYNAMIC_DRAW
+};
+
+
+
+/**
+ * @constructor
+ * @param {Array.<number>=} opt_arr Array.
+ * @param {number=} opt_usage Usage.
+ * @struct
+ */
+ol.webgl.Buffer = function(opt_arr, opt_usage) {
+
+  /**
+   * @private
+   * @type {Array.<number>}
+   */
+  this.arr_ = goog.isDef(opt_arr) ? opt_arr : [];
+
+  /**
+   * @private
+   * @type {number}
+   */
+  this.usage_ = goog.isDef(opt_usage) ?
+      opt_usage : ol.webgl.BufferUsage.STATIC_DRAW;
+
+};
+
+
+/**
+ * @return {Array.<number>} Array.
+ */
+ol.webgl.Buffer.prototype.getArray = function() {
+  return this.arr_;
+};
+
+
+/**
+ * @return {number} Usage.
+ */
+ol.webgl.Buffer.prototype.getUsage = function() {
+  return this.usage_;
+};
diff --git a/src/ol/webgl/context.js b/src/ol/webgl/context.js
new file mode 100644
index 0000000..6b91f6c
--- /dev/null
+++ b/src/ol/webgl/context.js
@@ -0,0 +1,284 @@
+goog.provide('ol.webgl.Context');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.events');
+goog.require('goog.log');
+goog.require('goog.object');
+goog.require('ol');
+goog.require('ol.webgl.Buffer');
+goog.require('ol.webgl.WebGLContextEventType');
+
+
+/**
+ * @typedef {{buf: ol.webgl.Buffer,
+ *            buffer: WebGLBuffer}}
+ */
+ol.webgl.BufferCacheEntry;
+
+
+
+/**
+ * @classdesc
+ * A WebGL context for accessing low-level WebGL capabilities.
+ *
+ * @constructor
+ * @extends {goog.events.EventTarget}
+ * @param {HTMLCanvasElement} canvas Canvas.
+ * @param {WebGLRenderingContext} gl GL.
+ * @api
+ */
+ol.webgl.Context = function(canvas, gl) {
+
+  /**
+   * @private
+   * @type {HTMLCanvasElement}
+   */
+  this.canvas_ = canvas;
+
+  /**
+   * @private
+   * @type {WebGLRenderingContext}
+   */
+  this.gl_ = gl;
+
+  /**
+   * @private
+   * @type {Object.<number, ol.webgl.BufferCacheEntry>}
+   */
+  this.bufferCache_ = {};
+
+  /**
+   * @private
+   * @type {Object.<number, WebGLShader>}
+   */
+  this.shaderCache_ = {};
+
+  /**
+   * @private
+   * @type {Object.<string, WebGLProgram>}
+   */
+  this.programCache_ = {};
+
+  /**
+   * @private
+   * @type {WebGLProgram}
+   */
+  this.currentProgram_ = null;
+
+  /**
+   * @type {boolean}
+   */
+  this.hasOESElementIndexUint = goog.array.contains(
+      ol.WEBGL_EXTENSIONS, 'OES_element_index_uint');
+
+  // use the OES_element_index_uint extension if available
+  if (this.hasOESElementIndexUint) {
+    var ext = gl.getExtension('OES_element_index_uint');
+    goog.asserts.assert(!goog.isNull(ext));
+  }
+
+  goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.LOST,
+      this.handleWebGLContextLost, false, this);
+  goog.events.listen(this.canvas_, ol.webgl.WebGLContextEventType.RESTORED,
+      this.handleWebGLContextRestored, false, this);
+
+};
+
+
+/**
+ * Just bind the buffer if it's in the cache. Otherwise create
+ * the WebGL buffer, bind it, populate it, and add an entry to
+ * the cache.
+ * @param {number} target Target.
+ * @param {ol.webgl.Buffer} buf Buffer.
+ */
+ol.webgl.Context.prototype.bindBuffer = function(target, buf) {
+  var gl = this.getGL();
+  var arr = buf.getArray();
+  var bufferKey = goog.getUid(buf);
+  if (bufferKey in this.bufferCache_) {
+    var bufferCacheEntry = this.bufferCache_[bufferKey];
+    gl.bindBuffer(target, bufferCacheEntry.buffer);
+  } else {
+    var buffer = gl.createBuffer();
+    gl.bindBuffer(target, buffer);
+    goog.asserts.assert(target == goog.webgl.ARRAY_BUFFER ||
+        target == goog.webgl.ELEMENT_ARRAY_BUFFER);
+    var /** @type {ArrayBufferView} */ arrayBuffer;
+    if (target == goog.webgl.ARRAY_BUFFER) {
+      arrayBuffer = new Float32Array(arr);
+    } else if (target == goog.webgl.ELEMENT_ARRAY_BUFFER) {
+      arrayBuffer = this.hasOESElementIndexUint ?
+          new Uint32Array(arr) : new Uint16Array(arr);
+    } else {
+      goog.asserts.fail();
+    }
+    gl.bufferData(target, arrayBuffer, buf.getUsage());
+    this.bufferCache_[bufferKey] = {
+      buf: buf,
+      buffer: buffer
+    };
+  }
+};
+
+
+/**
+ * @param {ol.webgl.Buffer} buf Buffer.
+ */
+ol.webgl.Context.prototype.deleteBuffer = function(buf) {
+  var gl = this.getGL();
+  var bufferKey = goog.getUid(buf);
+  goog.asserts.assert(bufferKey in this.bufferCache_);
+  var bufferCacheEntry = this.bufferCache_[bufferKey];
+  if (!gl.isContextLost()) {
+    gl.deleteBuffer(bufferCacheEntry.buffer);
+  }
+  delete this.bufferCache_[bufferKey];
+};
+
+
+/**
+ * @inheritDoc
+ */
+ol.webgl.Context.prototype.disposeInternal = function() {
+  var gl = this.getGL();
+  if (!gl.isContextLost()) {
+    goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) {
+      gl.deleteBuffer(bufferCacheEntry.buffer);
+    });
+    goog.object.forEach(this.programCache_, function(program) {
+      gl.deleteProgram(program);
+    });
+    goog.object.forEach(this.shaderCache_, function(shader) {
+      gl.deleteShader(shader);
+    });
+  }
+};
+
+
+/**
+ * @return {HTMLCanvasElement} Canvas.
+ */
+ol.webgl.Context.prototype.getCanvas = function() {
+  return this.canvas_;
+};
+
+
+/**
+ * @return {WebGLRenderingContext} GL.
+ * @api
+ */
+ol.webgl.Context.prototype.getGL = function() {
+  return this.gl_;
+};
+
+
+/**
+ * Get shader from the cache if it's in the cache. Otherwise, create
+ * the WebGL shader, compile it, and add entry to cache.
+ * @param {ol.webgl.Shader} shaderObject Shader object.
+ * @return {WebGLShader} Shader.
+ */
+ol.webgl.Context.prototype.getShader = function(shaderObject) {
+  var shaderKey = goog.getUid(shaderObject);
+  if (shaderKey in this.shaderCache_) {
+    return this.shaderCache_[shaderKey];
+  } else {
+    var gl = this.getGL();
+    var shader = gl.createShader(shaderObject.getType());
+    gl.shaderSource(shader, shaderObject.getSource());
+    gl.compileShader(shader);
+    if (goog.DEBUG) {
+      if (!gl.getShaderParameter(shader, goog.webgl.COMPILE_STATUS) &&
+          !gl.isContextLost()) {
+        goog.log.error(this.logger_, gl.getShaderInfoLog(shader));
+      }
+    }
+    goog.asserts.assert(
+        gl.getShaderParameter(shader, goog.webgl.COMPILE_STATUS) ||
+        gl.isContextLost());
+    this.shaderCache_[shaderKey] = shader;
+    return shader;
+  }
+};
+
+
+/**
+ * Get the program from the cache if it's in the cache. Otherwise create
+ * the WebGL program, attach the shaders to it, and add an entry to the
+ * cache.
+ * @param {ol.webgl.shader.Fragment} fragmentShaderObject Fragment shader.
+ * @param {ol.webgl.shader.Vertex} vertexShaderObject Vertex shader.
+ * @return {WebGLProgram} Program.
+ */
+ol.webgl.Context.prototype.getProgram = function(
+    fragmentShaderObject, vertexShaderObject) {
+  var programKey =
+      goog.getUid(fragmentShaderObject) + '/' + goog.getUid(vertexShaderObject);
+  if (programKey in this.programCache_) {
+    return this.programCache_[programKey];
+  } else {
+    var gl = this.getGL();
+    var program = gl.createProgram();
+    gl.attachShader(program, this.getShader(fragmentShaderObject));
+    gl.attachShader(program, this.getShader(vertexShaderObject));
+    gl.linkProgram(program);
+    if (goog.DEBUG) {
+      if (!gl.getProgramParameter(program, goog.webgl.LINK_STATUS) &&
+          !gl.isContextLost()) {
+        goog.log.error(this.logger_, gl.getProgramInfoLog(program));
+      }
+    }
+    goog.asserts.assert(
+        gl.getProgramParameter(program, goog.webgl.LINK_STATUS) ||
+        gl.isContextLost());
+    this.programCache_[programKey] = program;
+    return program;
+  }
+};
+
+
+/**
+ * FIXME empy description for jsdoc
+ */
+ol.webgl.Context.prototype.handleWebGLContextLost = function() {
+  goog.object.clear(this.bufferCache_);
+  goog.object.clear(this.shaderCache_);
+  goog.object.clear(this.programCache_);
+  this.currentProgram_ = null;
+};
+
+
+/**
+ * FIXME empy description for jsdoc
+ */
+ol.webgl.Context.prototype.handleWebGLContextRestored = function() {
+};
+
+
+/**
+ * Just return false if that program is used already. Other use
+ * that program (call `gl.useProgram`) and make it the "current
+ * program".
+ * @param {WebGLProgram} program Program.
+ * @return {boolean} Changed.
+ * @api
+ */
+ol.webgl.Context.prototype.useProgram = function(program) {
+  if (program == this.currentProgram_) {
+    return false;
+  } else {
+    var gl = this.getGL();
+    gl.useProgram(program);
+    this.currentProgram_ = program;
+    return true;
+  }
+};
+
+
+/**
+ * @private
+ * @type {goog.log.Logger}
+ */
+ol.webgl.Context.prototype.logger_ = goog.log.getLogger('ol.webgl.Context');
diff --git a/src/ol/webgl/shader.js b/src/ol/webgl/shader.js
new file mode 100644
index 0000000..f9a2271
--- /dev/null
+++ b/src/ol/webgl/shader.js
@@ -0,0 +1,84 @@
+goog.provide('ol.webgl.shader');
+
+goog.require('goog.functions');
+goog.require('goog.webgl');
+goog.require('ol.webgl');
+
+
+
+/**
+ * @constructor
+ * @param {string} source Source.
+ * @struct
+ */
+ol.webgl.Shader = function(source) {
+
+  /**
+   * @private
+   * @type {string}
+   */
+  this.source_ = source;
+
+};
+
+
+/**
+ * @return {number} Type.
+ */
+ol.webgl.Shader.prototype.getType = goog.abstractMethod;
+
+
+/**
+ * @return {string} Source.
+ */
+ol.webgl.Shader.prototype.getSource = function() {
+  return this.source_;
+};
+
+
+/**
+ * @return {boolean} Is animated?
+ */
+ol.webgl.Shader.prototype.isAnimated = goog.functions.FALSE;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.Shader}
+ * @param {string} source Source.
+ * @struct
+ */
+ol.webgl.shader.Fragment = function(source) {
+  goog.base(this, source);
+};
+goog.inherits(ol.webgl.shader.Fragment, ol.webgl.Shader);
+
+
+/**
+ * @inheritDoc
+ */
+ol.webgl.shader.Fragment.prototype.getType = function() {
+  return goog.webgl.FRAGMENT_SHADER;
+};
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.Shader}
+ * @param {string} source Source.
+ * @struct
+ */
+ol.webgl.shader.Vertex = function(source) {
+  goog.base(this, source);
+};
+goog.inherits(ol.webgl.shader.Vertex, ol.webgl.Shader);
+
+
+/**
+ * @inheritDoc
+ */
+ol.webgl.shader.Vertex.prototype.getType = function() {
+  return goog.webgl.VERTEX_SHADER;
+};
diff --git a/src/ol/webgl/shader.mustache b/src/ol/webgl/shader.mustache
new file mode 100644
index 0000000..ed62dc9
--- /dev/null
+++ b/src/ol/webgl/shader.mustache
@@ -0,0 +1,103 @@
+// This file is automatically generated, do not edit
+goog.provide('{{namespace}}');
+
+goog.require('ol.webgl.shader');
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Fragment}
+ * @struct
+ */
+{{className}}Fragment = function() {
+  goog.base(this, {{className}}Fragment.SOURCE);
+};
+goog.inherits({{className}}Fragment, ol.webgl.shader.Fragment);
+goog.addSingletonGetter({{className}}Fragment);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+{{className}}Fragment.DEBUG_SOURCE = 'precision mediump float;\n{{{getOriginalFragmentSource}}}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+{{className}}Fragment.OPTIMIZED_SOURCE = 'precision mediump float;{{{getFragmentSource}}}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+{{className}}Fragment.SOURCE = goog.DEBUG ?
+    {{className}}Fragment.DEBUG_SOURCE :
+    {{className}}Fragment.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @extends {ol.webgl.shader.Vertex}
+ * @struct
+ */
+{{className}}Vertex = function() {
+  goog.base(this, {{className}}Vertex.SOURCE);
+};
+goog.inherits({{className}}Vertex, ol.webgl.shader.Vertex);
+goog.addSingletonGetter({{className}}Vertex);
+
+
+/**
+ * @const
+ * @type {string}
+ */
+{{className}}Vertex.DEBUG_SOURCE = '{{{getOriginalVertexSource}}}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+{{className}}Vertex.OPTIMIZED_SOURCE = '{{{getVertexSource}}}';
+
+
+/**
+ * @const
+ * @type {string}
+ */
+{{className}}Vertex.SOURCE = goog.DEBUG ?
+    {{className}}Vertex.DEBUG_SOURCE :
+    {{className}}Vertex.OPTIMIZED_SOURCE;
+
+
+
+/**
+ * @constructor
+ * @param {WebGLRenderingContext} gl GL.
+ * @param {WebGLProgram} program Program.
+ * @struct
+ */
+{{namespace}}.Locations = function(gl, program) {
+{{#getUniforms}}
+
+  /**
+   * @type {WebGLUniformLocation}
+   */
+  this.{{originalName}} = gl.getUniformLocation(
+      program, goog.DEBUG ? '{{originalName}}' : '{{shortName}}');
+{{/getUniforms}}
+{{#getAttributes}}
+
+  /**
+   * @type {number}
+   */
+  this.{{originalName}} = gl.getAttribLocation(
+      program, goog.DEBUG ? '{{originalName}}' : '{{shortName}}');
+{{/getAttributes}}
+};
diff --git a/src/ol/webgl/webgl.js b/src/ol/webgl/webgl.js
new file mode 100644
index 0000000..6b39a1e
--- /dev/null
+++ b/src/ol/webgl/webgl.js
@@ -0,0 +1,44 @@
+goog.provide('ol.webgl');
+goog.provide('ol.webgl.WebGLContextEventType');
+
+
+/**
+ * @const
+ * @private
+ * @type {Array.<string>}
+ */
+ol.webgl.CONTEXT_IDS_ = [
+  'experimental-webgl',
+  'webgl',
+  'webkit-3d',
+  'moz-webgl'
+];
+
+
+/**
+ * @enum {string}
+ */
+ol.webgl.WebGLContextEventType = {
+  LOST: 'webglcontextlost',
+  RESTORED: 'webglcontextrestored'
+};
+
+
+/**
+ * @param {HTMLCanvasElement} canvas Canvas.
+ * @param {Object=} opt_attributes Attributes.
+ * @return {WebGLRenderingContext} WebGL rendering context.
+ */
+ol.webgl.getContext = function(canvas, opt_attributes) {
+  var context, i, ii = ol.webgl.CONTEXT_IDS_.length;
+  for (i = 0; i < ii; ++i) {
+    try {
+      context = canvas.getContext(ol.webgl.CONTEXT_IDS_[i], opt_attributes);
+      if (!goog.isNull(context)) {
+        return /** @type {!WebGLRenderingContext} */ (context);
+      }
+    } catch (e) {
+    }
+  }
+  return null;
+};
diff --git a/src/ol/xml.js b/src/ol/xml.js
new file mode 100644
index 0000000..8f7662d
--- /dev/null
+++ b/src/ol/xml.js
@@ -0,0 +1,751 @@
+// FIXME Remove ol.xml.makeParsersNS, and use ol.xml.makeStructureNS instead.
+
+goog.provide('ol.xml');
+
+goog.require('goog.array');
+goog.require('goog.asserts');
+goog.require('goog.dom.NodeType');
+goog.require('goog.dom.xml');
+goog.require('goog.object');
+goog.require('goog.userAgent');
+
+
+/**
+ * When using {@link ol.xml.makeChildAppender} or
+ * {@link ol.xml.makeSimpleNodeFactory}, the top `objectStack` item needs to
+ * have this structure.
+ * @typedef {{node:Node}}
+ */
+ol.xml.NodeStackItem;
+
+
+/**
+ * @typedef {function(Node, Array.<*>)}
+ */
+ol.xml.Parser;
+
+
+/**
+ * @typedef {function(Node, *, Array.<*>)}
+ */
+ol.xml.Serializer;
+
+
+/**
+ * This document should be used when creating nodes for XML serializations. This
+ * document is also used by {@link ol.xml.createElementNS} and
+ * {@link ol.xml.setAttributeNS}
+ * @const
+ * @type {Document}
+ */
+ol.xml.DOCUMENT = goog.dom.xml.createDocument();
+
+
+/**
+ * @param {string} namespaceURI Namespace URI.
+ * @param {string} qualifiedName Qualified name.
+ * @return {Node} Node.
+ * @private
+ */
+ol.xml.createElementNS_ = function(namespaceURI, qualifiedName) {
+  return ol.xml.DOCUMENT.createElementNS(namespaceURI, qualifiedName);
+};
+
+
+/**
+ * @param {string} namespaceURI Namespace URI.
+ * @param {string} qualifiedName Qualified name.
+ * @return {Node} Node.
+ * @private
+ */
+ol.xml.createElementNSActiveX_ = function(namespaceURI, qualifiedName) {
+  if (goog.isNull(namespaceURI)) {
+    namespaceURI = '';
+  }
+  return ol.xml.DOCUMENT.createNode(1, qualifiedName, namespaceURI);
+};
+
+
+/**
+ * @param {string} namespaceURI Namespace URI.
+ * @param {string} qualifiedName Qualified name.
+ * @return {Node} Node.
+ */
+ol.xml.createElementNS =
+    (document.implementation && document.implementation.createDocument) ?
+        ol.xml.createElementNS_ : ol.xml.createElementNSActiveX_;
+
+
+/**
+ * Recursively grab all text content of child nodes into a single string.
+ * @param {Node} node Node.
+ * @param {boolean} normalizeWhitespace Normalize whitespace: remove all line
+ * breaks.
+ * @return {string} All text content.
+ * @api
+ */
+ol.xml.getAllTextContent = function(node, normalizeWhitespace) {
+  return ol.xml.getAllTextContent_(node, normalizeWhitespace, []).join('');
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {boolean} normalizeWhitespace Normalize whitespace: remove all line
+ * breaks.
+ * @param {Array.<String|string>} accumulator Accumulator.
+ * @private
+ * @return {Array.<String|string>} Accumulator.
+ */
+ol.xml.getAllTextContent_ = function(node, normalizeWhitespace, accumulator) {
+  if (node.nodeType == goog.dom.NodeType.CDATA_SECTION ||
+      node.nodeType == goog.dom.NodeType.TEXT) {
+    if (normalizeWhitespace) {
+      // FIXME understand why goog.dom.getTextContent_ uses String here
+      accumulator.push(String(node.nodeValue).replace(/(\r\n|\r|\n)/g, ''));
+    } else {
+      accumulator.push(node.nodeValue);
+    }
+  } else {
+    var n;
+    for (n = node.firstChild; !goog.isNull(n); n = n.nextSibling) {
+      ol.xml.getAllTextContent_(n, normalizeWhitespace, accumulator);
+    }
+  }
+  return accumulator;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @private
+ * @return {string} Local name.
+ */
+ol.xml.getLocalName_ = function(node) {
+  return node.localName;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @private
+ * @return {string} Local name.
+ */
+ol.xml.getLocalNameIE_ = function(node) {
+  var localName = node.localName;
+  if (goog.isDef(localName)) {
+    return localName;
+  }
+  var baseName = node.baseName;
+  goog.asserts.assert(goog.isDefAndNotNull(baseName));
+  return baseName;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @return {string} Local name.
+ */
+ol.xml.getLocalName = goog.userAgent.IE ?
+    ol.xml.getLocalNameIE_ : ol.xml.getLocalName_;
+
+
+/**
+ * @param {?} value Value.
+ * @private
+ * @return {boolean} Is document.
+ */
+ol.xml.isDocument_ = function(value) {
+  return value instanceof Document;
+};
+
+
+/**
+ * @param {?} value Value.
+ * @private
+ * @return {boolean} Is document.
+ */
+ol.xml.isDocumentIE_ = function(value) {
+  return goog.isObject(value) && value.nodeType == goog.dom.NodeType.DOCUMENT;
+};
+
+
+/**
+ * @param {?} value Value.
+ * @return {boolean} Is document.
+ */
+ol.xml.isDocument = goog.userAgent.IE ?
+    ol.xml.isDocumentIE_ : ol.xml.isDocument_;
+
+
+/**
+ * @param {?} value Value.
+ * @private
+ * @return {boolean} Is node.
+ */
+ol.xml.isNode_ = function(value) {
+  return value instanceof Node;
+};
+
+
+/**
+ * @param {?} value Value.
+ * @private
+ * @return {boolean} Is node.
+ */
+ol.xml.isNodeIE_ = function(value) {
+  return goog.isObject(value) && goog.isDef(value.nodeType);
+};
+
+
+/**
+ * @param {?} value Value.
+ * @return {boolean} Is node.
+ */
+ol.xml.isNode = goog.userAgent.IE ? ol.xml.isNodeIE_ : ol.xml.isNode_;
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @return {string} Value
+ * @private
+ */
+ol.xml.getAttributeNS_ = function(node, namespaceURI, name) {
+  return node.getAttributeNS(namespaceURI, name) || '';
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @return {string} Value
+ * @private
+ */
+ol.xml.getAttributeNSActiveX_ = function(node, namespaceURI, name) {
+  var attributeValue = '';
+  var attributeNode = ol.xml.getAttributeNodeNS(node, namespaceURI, name);
+  if (goog.isDef(attributeNode)) {
+    attributeValue = attributeNode.nodeValue;
+  }
+  return attributeValue;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @return {string} Value
+ */
+ol.xml.getAttributeNS =
+    (document.implementation && document.implementation.createDocument) ?
+        ol.xml.getAttributeNS_ : ol.xml.getAttributeNSActiveX_;
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @return {?Node} Attribute node or null if none found.
+ * @private
+ */
+ol.xml.getAttributeNodeNS_ = function(node, namespaceURI, name) {
+  return node.getAttributeNodeNS(namespaceURI, name);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @return {?Node} Attribute node or null if none found.
+ * @private
+ */
+ol.xml.getAttributeNodeNSActiveX_ = function(node, namespaceURI, name) {
+  var attributeNode = null;
+  var attributes = node.attributes;
+  var potentialNode, fullName;
+  for (var i = 0, len = attributes.length; i < len; ++i) {
+    potentialNode = attributes[i];
+    if (potentialNode.namespaceURI == namespaceURI) {
+      fullName = (potentialNode.prefix) ?
+          (potentialNode.prefix + ':' + name) : name;
+      if (fullName == potentialNode.nodeName) {
+        attributeNode = potentialNode;
+        break;
+      }
+    }
+  }
+  return attributeNode;
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @return {?Node} Attribute node or null if none found.
+ */
+ol.xml.getAttributeNodeNS =
+    (document.implementation && document.implementation.createDocument) ?
+        ol.xml.getAttributeNodeNS_ : ol.xml.getAttributeNodeNSActiveX_;
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @param {string|number} value Value.
+ * @private
+ */
+ol.xml.setAttributeNS_ = function(node, namespaceURI, name, value) {
+  node.setAttributeNS(namespaceURI, name, value);
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @param {string|number} value Value.
+ * @private
+ */
+ol.xml.setAttributeNSActiveX_ = function(node, namespaceURI, name, value) {
+  if (!goog.isNull(namespaceURI)) {
+    var attribute = node.ownerDocument.createNode(2, name, namespaceURI);
+    attribute.nodeValue = value;
+    node.setAttributeNode(attribute);
+  } else {
+    node.setAttribute(name, value);
+  }
+};
+
+
+/**
+ * @param {Node} node Node.
+ * @param {?string} namespaceURI Namespace URI.
+ * @param {string} name Attribute name.
+ * @param {string|number} value Value.
+ */
+ol.xml.setAttributeNS =
+    (document.implementation && document.implementation.createDocument) ?
+        ol.xml.setAttributeNS_ : ol.xml.setAttributeNSActiveX_;
+
+
+/**
+ * Parse an XML string to a XML Document
+ * @param {string} xml XML.
+ * @return {Document} Document.
+ * @api
+ */
+ol.xml.parse = function(xml) {
+  return new DOMParser().parseFromString(xml, 'application/xml');
+};
+
+
+/**
+ * @param {function(this: T, Node, Array.<*>): (Array.<*>|undefined)}
+ *     valueReader Value reader.
+ * @param {T=} opt_this The object to use as `this` in `valueReader`.
+ * @return {ol.xml.Parser} Parser.
+ * @template T
+ */
+ol.xml.makeArrayExtender = function(valueReader, opt_this) {
+  return (
+      /**
+       * @param {Node} node Node.
+       * @param {Array.<*>} objectStack Object stack.
+       */
+      function(node, objectStack) {
+        var value = valueReader.call(opt_this, node, objectStack);
+        if (goog.isDef(value)) {
+          goog.asserts.assert(goog.isArray(value));
+          var array = /** @type {Array.<*>} */
+              (objectStack[objectStack.length - 1]);
+          goog.asserts.assert(goog.isArray(array));
+          goog.array.extend(array, value);
+        }
+      });
+};
+
+
+/**
+ * @param {function(this: T, Node, Array.<*>): *} valueReader Value reader.
+ * @param {T=} opt_this The object to use as `this` in `valueReader`.
+ * @return {ol.xml.Parser} Parser.
+ * @template T
+ */
+ol.xml.makeArrayPusher = function(valueReader, opt_this) {
+  return (
+      /**
+       * @param {Node} node Node.
+       * @param {Array.<*>} objectStack Object stack.
+       */
+      function(node, objectStack) {
+        var value = valueReader.call(goog.isDef(opt_this) ? opt_this : this,
+            node, objectStack);
+        if (goog.isDef(value)) {
+          var array = objectStack[objectStack.length - 1];
+          goog.asserts.assert(goog.isArray(array));
+          array.push(value);
+        }
+      });
+};
+
+
+/**
+ * @param {function(this: T, Node, Array.<*>): *} valueReader Value reader.
+ * @param {T=} opt_this The object to use as `this` in `valueReader`.
+ * @return {ol.xml.Parser} Parser.
+ * @template T
+ */
+ol.xml.makeReplacer = function(valueReader, opt_this) {
+  return (
+      /**
+       * @param {Node} node Node.
+       * @param {Array.<*>} objectStack Object stack.
+       */
+      function(node, objectStack) {
+        var value = valueReader.call(goog.isDef(opt_this) ? opt_this : this,
+            node, objectStack);
+        if (goog.isDef(value)) {
+          objectStack[objectStack.length - 1] = value;
+        }
+      });
+};
+
+
+/**
+ * @param {function(this: T, Node, Array.<*>): *} valueReader Value reader.
+ * @param {string=} opt_property Property.
+ * @param {T=} opt_this The object to use as `this` in `valueReader`.
+ * @return {ol.xml.Parser} Parser.
+ * @template T
+ */
+ol.xml.makeObjectPropertyPusher =
+    function(valueReader, opt_property, opt_this) {
+  goog.asserts.assert(goog.isDef(valueReader));
+  return (
+      /**
+       * @param {Node} node Node.
+       * @param {Array.<*>} objectStack Object stack.
+       */
+      function(node, objectStack) {
+        var value = valueReader.call(goog.isDef(opt_this) ? opt_this : this,
+            node, objectStack);
+        if (goog.isDef(value)) {
+          var object = /** @type {Object} */
+              (objectStack[objectStack.length - 1]);
+          var property = goog.isDef(opt_property) ?
+              opt_property : node.localName;
+          goog.asserts.assert(goog.isObject(object));
+          var array = goog.object.setIfUndefined(object, property, []);
+          array.push(value);
+        }
+      });
+};
+
+
+/**
+ * @param {function(this: T, Node, Array.<*>): *} valueReader Value reader.
+ * @param {string=} opt_property Property.
+ * @param {T=} opt_this The object to use as `this` in `valueReader`.
+ * @return {ol.xml.Parser} Parser.
+ * @template T
+ */
+ol.xml.makeObjectPropertySetter =
+    function(valueReader, opt_property, opt_this) {
+  goog.asserts.assert(goog.isDef(valueReader));
+  return (
+      /**
+       * @param {Node} node Node.
+       * @param {Array.<*>} objectStack Object stack.
+       */
+      function(node, objectStack) {
+        var value = valueReader.call(goog.isDef(opt_this) ? opt_this : this,
+            node, objectStack);
+        if (goog.isDef(value)) {
+          var object = /** @type {Object} */
+              (objectStack[objectStack.length - 1]);
+          var property = goog.isDef(opt_property) ?
+              opt_property : node.localName;
+          goog.asserts.assert(goog.isObject(object));
+          goog.object.set(object, property, value);
+        }
+      });
+};
+
+
+/**
+ * @param {Array.<string>} namespaceURIs Namespace URIs.
+ * @param {Object.<string, ol.xml.Parser>} parsers Parsers.
+ * @param {Object.<string, Object.<string, ol.xml.Parser>>=} opt_parsersNS
+ *     ParsersNS.
+ * @return {Object.<string, Object.<string, ol.xml.Parser>>} Parsers NS.
+ */
+ol.xml.makeParsersNS = function(namespaceURIs, parsers, opt_parsersNS) {
+  return /** @type {Object.<string, Object.<string, ol.xml.Parser>>} */ (
+      ol.xml.makeStructureNS(namespaceURIs, parsers, opt_parsersNS));
+};
+
+
+/**
+ * Creates a serializer that appends nodes written by its `nodeWriter` to its
+ * designated parent. The parent is the `node` of the
+ * {@link ol.xml.NodeStackItem} at the top of the `objectStack`.
+ * @param {function(this: T, Node, V, Array.<*>)}
+ *     nodeWriter Node writer.
+ * @param {T=} opt_this The object to use as `this` in `nodeWriter`.
+ * @return {ol.xml.Serializer} Serializer.
+ * @template T, V
+ */
+ol.xml.makeChildAppender = function(nodeWriter, opt_this) {
+  return function(node, value, objectStack) {
+    nodeWriter.call(goog.isDef(opt_this) ? opt_this : this,
+        node, value, objectStack);
+    var parent = objectStack[objectStack.length - 1];
+    goog.asserts.assert(goog.isObject(parent));
+    var parentNode = parent.node;
+    goog.asserts.assert(ol.xml.isNode(parentNode) ||
+        ol.xml.isDocument(parentNode));
+    parentNode.appendChild(node);
+  };
+};
+
+
+/**
+ * Creates a serializer that calls the provided `nodeWriter` from
+ * {@link ol.xml.serialize}. This can be used by the parent writer to have the
+ * 'nodeWriter' called with an array of values when the `nodeWriter` was
+ * designed to serialize a single item. An example would be a LineString
+ * geometry writer, which could be reused for writing MultiLineString
+ * geometries.
+ * @param {function(this: T, Node, V, Array.<*>)}
+ *     nodeWriter Node writer.
+ * @param {T=} opt_this The object to use as `this` in `nodeWriter`.
+ * @return {ol.xml.Serializer} Serializer.
+ * @template T, V
+ */
+ol.xml.makeArraySerializer = function(nodeWriter, opt_this) {
+  var serializersNS, nodeFactory;
+  return function(node, value, objectStack) {
+    if (!goog.isDef(serializersNS)) {
+      serializersNS = {};
+      var serializers = {};
+      goog.object.set(serializers, node.localName, nodeWriter);
+      goog.object.set(serializersNS, node.namespaceURI, serializers);
+      nodeFactory = ol.xml.makeSimpleNodeFactory(node.localName);
+    }
+    ol.xml.serialize(serializersNS, nodeFactory, value, objectStack);
+  };
+};
+
+
+/**
+ * Creates a node factory which can use the `opt_keys` passed to
+ * {@link ol.xml.serialize} or {@link ol.xml.pushSerializeAndPop} as node names,
+ * or a fixed node name. The namespace of the created nodes can either be fixed,
+ * or the parent namespace will be used.
+ * @param {string=} opt_nodeName Fixed node name which will be used for all
+ *     created nodes. If not provided, the 3rd argument to the resulting node
+ *     factory needs to be provided and will be the nodeName.
+ * @param {string=} opt_namespaceURI Fixed namespace URI which will be used for
+ *     all created nodes. If not provided, the namespace of the parent node will
+ *     be used.
+ * @return {function(*, Array.<*>, string=): (Node|undefined)} Node factory.
+ */
+ol.xml.makeSimpleNodeFactory = function(opt_nodeName, opt_namespaceURI) {
+  var fixedNodeName = opt_nodeName;
+  return (
+      /**
+       * @param {*} value Value.
+       * @param {Array.<*>} objectStack Object stack.
+       * @param {string=} opt_nodeName Node name.
+       * @return {Node} Node.
+       */
+      function(value, objectStack, opt_nodeName) {
+        var context = objectStack[objectStack.length - 1];
+        var node = context.node;
+        goog.asserts.assert(ol.xml.isNode(node) || ol.xml.isDocument(node));
+        var nodeName = fixedNodeName;
+        if (!goog.isDef(nodeName)) {
+          nodeName = opt_nodeName;
+        }
+        var namespaceURI = opt_namespaceURI;
+        if (!goog.isDef(opt_namespaceURI)) {
+          namespaceURI = node.namespaceURI;
+        }
+        goog.asserts.assert(goog.isDef(nodeName));
+        return ol.xml.createElementNS(namespaceURI, nodeName);
+      }
+  );
+};
+
+
+/**
+ * A node factory that creates a node using the parent's `namespaceURI` and the
+ * `nodeName` passed by {@link ol.xml.serialize} or
+ * {@link ol.xml.pushSerializeAndPop} to the node factory.
+ * @const
+ * @type {function(*, Array.<*>, string=): (Node|undefined)}
+ */
+ol.xml.OBJECT_PROPERTY_NODE_FACTORY = ol.xml.makeSimpleNodeFactory();
+
+
+/**
+ * Creates an array of `values` to be used with {@link ol.xml.serialize} or
+ * {@link ol.xml.pushSerializeAndPop}, where `orderedKeys` has to be provided as
+ * `opt_key` argument.
+ * @param {Object.<string, V>} object Key-value pairs for the sequence. Keys can
+ *     be a subset of the `orderedKeys`.
+ * @param {Array.<string>} orderedKeys Keys in the order of the sequence.
+ * @return {Array.<V>} Values in the order of the sequence. The resulting array
+ *     has the same length as the `orderedKeys` array. Values that are not
+ *     present in `object` will be `undefined` in the resulting array.
+ * @template V
+ */
+ol.xml.makeSequence = function(object, orderedKeys) {
+  var length = orderedKeys.length;
+  var sequence = new Array(length);
+  for (var i = 0; i < length; ++i) {
+    sequence[i] = object[orderedKeys[i]];
+  }
+  return sequence;
+};
+
+
+/**
+ * Creates a namespaced structure, using the same values for each namespace.
+ * This can be used as a starting point for versioned parsers, when only a few
+ * values are version specific.
+ * @param {Array.<string>} namespaceURIs Namespace URIs.
+ * @param {T} structure Structure.
+ * @param {Object.<string, T>=} opt_structureNS Namespaced structure to add to.
+ * @return {Object.<string, T>} Namespaced structure.
+ * @template T
+ */
+ol.xml.makeStructureNS = function(namespaceURIs, structure, opt_structureNS) {
+  /**
+   * @type {Object.<string, *>}
+   */
+  var structureNS = goog.isDef(opt_structureNS) ? opt_structureNS : {};
+  var i, ii;
+  for (i = 0, ii = namespaceURIs.length; i < ii; ++i) {
+    structureNS[namespaceURIs[i]] = structure;
+  }
+  return structureNS;
+};
+
+
+/**
+ * @param {Object.<string, Object.<string, ol.xml.Parser>>} parsersNS
+ *     Parsers by namespace.
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {*=} opt_this The object to use as `this`.
+ */
+ol.xml.parseNode = function(parsersNS, node, objectStack, opt_this) {
+  var n;
+  for (n = node.firstElementChild; !goog.isNull(n); n = n.nextElementSibling) {
+    var parsers = parsersNS[n.namespaceURI];
+    if (goog.isDef(parsers)) {
+      var parser = parsers[n.localName];
+      if (goog.isDef(parser)) {
+        parser.call(opt_this, n, objectStack);
+      }
+    }
+  }
+};
+
+
+/**
+ * @param {T} object Object.
+ * @param {Object.<string, Object.<string, ol.xml.Parser>>} parsersNS
+ *     Parsers by namespace.
+ * @param {Node} node Node.
+ * @param {Array.<*>} objectStack Object stack.
+ * @param {*=} opt_this The object to use as `this`.
+ * @return {T|undefined} Object.
+ * @template T
+ */
+ol.xml.pushParseAndPop = function(
+    object, parsersNS, node, objectStack, opt_this) {
+  objectStack.push(object);
+  ol.xml.parseNode(parsersNS, node, objectStack, opt_this);
+  return objectStack.pop();
+};
+
+
+/**
+ * Walks through an array of `values` and calls a serializer for each value.
+ * @param {Object.<string, Object.<string, ol.xml.Serializer>>} serializersNS
+ *     Namespaced serializers.
+ * @param {function(this: T, *, Array.<*>, (string|undefined)): (Node|undefined)} nodeFactory
+ *     Node factory. The `nodeFactory` creates the node whose namespace and name
+ *     will be used to choose a node writer from `serializersNS`. This
+ *     separation allows us to decide what kind of node to create, depending on
+ *     the value we want to serialize. An example for this would be different
+ *     geometry writers based on the geometry type.
+ * @param {Array.<*>} values Values to serialize. An example would be an array
+ *     of {@link ol.Feature} instances.
+ * @param {Array.<*>} objectStack Node stack.
+ * @param {Array.<string>=} opt_keys Keys of the `values`. Will be passed to the
+ *     `nodeFactory`. This is used for serializing object literals where the
+ *     node name relates to the property key. The array length of `opt_keys` has
+ *     to match the length of `values`. For serializing a sequence, `opt_keys`
+ *     determines the order of the sequence.
+ * @param {T=} opt_this The object to use as `this` for the node factory and
+ *     serializers.
+ * @template T
+ */
+ol.xml.serialize = function(
+    serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this) {
+  var length = (goog.isDef(opt_keys) ? opt_keys : values).length;
+  var value, node;
+  for (var i = 0; i < length; ++i) {
+    value = values[i];
+    if (goog.isDef(value)) {
+      node = nodeFactory.call(opt_this, value, objectStack,
+          goog.isDef(opt_keys) ? opt_keys[i] : undefined);
+      if (goog.isDef(node)) {
+        serializersNS[node.namespaceURI][node.localName]
+            .call(opt_this, node, value, objectStack);
+      }
+    }
+  }
+};
+
+
+/**
+ * @param {O} object Object.
+ * @param {Object.<string, Object.<string, ol.xml.Serializer>>} serializersNS
+ *     Namespaced serializers.
+ * @param {function(this: T, *, Array.<*>, (string|undefined)): (Node|undefined)} nodeFactory
+ *     Node factory. The `nodeFactory` creates the node whose namespace and name
+ *     will be used to choose a node writer from `serializersNS`. This
+ *     separation allows us to decide what kind of node to create, depending on
+ *     the value we want to serialize. An example for this would be different
+ *     geometry writers based on the geometry type.
+ * @param {Array.<*>} values Values to serialize. An example would be an array
+ *     of {@link ol.Feature} instances.
+ * @param {Array.<*>} objectStack Node stack.
+ * @param {Array.<string>=} opt_keys Keys of the `values`. Will be passed to the
+ *     `nodeFactory`. This is used for serializing object literals where the
+ *     node name relates to the property key. The array length of `opt_keys` has
+ *     to match the length of `values`. For serializing a sequence, `opt_keys`
+ *     determines the order of the sequence.
+ * @param {T=} opt_this The object to use as `this` for the node factory and
+ *     serializers.
+ * @return {O|undefined} Object.
+ * @template O, T
+ */
+ol.xml.pushSerializeAndPop = function(object,
+    serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this) {
+  objectStack.push(object);
+  ol.xml.serialize(
+      serializersNS, nodeFactory, values, objectStack, opt_keys, opt_this);
+  return objectStack.pop();
+};
diff --git a/src/olx.jsdoc b/src/olx.jsdoc
new file mode 100644
index 0000000..ec70071
--- /dev/null
+++ b/src/olx.jsdoc
@@ -0,0 +1,43 @@
+/**
+ * @namespace olx
+ */
+
+/**
+ * @namespace olx.animation
+ */
+
+/**
+ * @namespace olx.control
+ */
+
+/**
+ * @namespace olx.format
+ */
+
+/**
+ * @namespace olx.interaction
+ */
+
+/**
+ * @namespace olx.layer
+ */
+
+/**
+ * @namespace olx.parser
+ */
+
+/**
+ * @namespace olx.render
+ */
+
+/**
+ * @namespace olx.source
+ */
+
+/**
+ * @namespace olx.style
+ */
+
+/**
+ * @namespace olx.tilegrid
+ */
diff --git a/tasks/.jshintrc b/tasks/.jshintrc
new file mode 100644
index 0000000..143ea62
--- /dev/null
+++ b/tasks/.jshintrc
@@ -0,0 +1,19 @@
+{
+  "curly": true,
+  "eqeqeq": true,
+  "indent": 2,
+  "latedef": true,
+  "newcap": true,
+  "nonew": true,
+  "quotmark": "single",
+  "undef": true,
+  "trailing": true,
+  "maxlen": 80,
+  "globals": {
+    "__dirname": false,
+    "exports": true,
+    "module": false,
+    "process": false,
+    "require": false
+  }
+}
diff --git a/tasks/build-ext.js b/tasks/build-ext.js
new file mode 100644
index 0000000..d7b4ae9
--- /dev/null
+++ b/tasks/build-ext.js
@@ -0,0 +1,97 @@
+var fs = require('fs');
+var path = require('path');
+
+var async = require('async');
+var fse = require('fs-extra');
+
+var pkg = require('../package.json');
+
+var root = path.join(__dirname, '..');
+var buildDir = path.join(root, 'build', 'ol.ext');
+
+
+/**
+ * Get external module metadata.
+ * @return {Array.<Object>} Array of objects representing external modules.
+ */
+function getExternalModules() {
+  return pkg.ext.map(function(name) {
+    return {
+      name: name,
+      main: require.resolve(name)
+    };
+  });
+}
+
+
+/**
+ * Wrap a CommonJS module in Closure Library accessible code.
+ * @param {Object} mod Module metadata.
+ * @param {function(Error, string)} callback Called with any error and the
+ *     wrapped module.
+ */
+function wrapModule(mod, callback) {
+  fs.readFile(mod.main, function(err, data) {
+    if (err) {
+      callback(err);
+      return;
+    }
+    var wrapped = 'goog.provide(\'ol.ext.' + mod.name + '\');\n' +
+        '/** @typedef {function(*)} */\n' +
+        'ol.ext.' + mod.name + ';\n' +
+        '(function() {\n' +
+        'var exports = {};\n' +
+        'var module = {exports: exports};\n' +
+        '/**\n' +
+        ' * @fileoverview\n' +
+        ' * @suppress {accessControls, ambiguousFunctionDecl, ' +
+        'checkDebuggerStatement, checkRegExp, checkTypes, checkVars, const, ' +
+        'constantProperty, deprecated, duplicate, es5Strict, ' +
+        'fileoverviewTags, missingProperties, nonStandardJsDocs, ' +
+        'strictModuleDepCheck, suspiciousCode, undefinedNames, ' +
+        'undefinedVars, unknownDefines, uselessCode, visibility}\n' +
+        ' */\n' + data.toString() + '\n' +
+        'ol.ext.' + mod.name + ' = module.exports;\n' +
+        '})();\n';
+    callback(null, wrapped);
+  });
+}
+
+
+/**
+ * Build external modules.
+ * @param {Array.<Object>} modules External modules.
+ * @param {function(Error)} callback Called with any error.
+ */
+function buildModules(modules, callback) {
+  async.each(modules, function(mod, done) {
+    var output = path.join(buildDir, mod.name) + '.js';
+    async.waterfall([
+      wrapModule.bind(null, mod),
+      fse.outputFile.bind(fse, output)
+    ], done);
+  }, callback);
+}
+
+
+/**
+ * Build all external modules.
+ * @param {function(Error)} callback Called with any error.
+ */
+function main(callback) {
+  var modules = getExternalModules();
+  buildModules(modules, callback);
+}
+
+if (require.main === module) {
+  main(function(err) {
+    if (err) {
+      process.stderr.write(err.message + '\n');
+      process.exit(1);
+    } else {
+      process.exit(0);
+    }
+  });
+}
+
+module.exports = main;
diff --git a/tasks/build.js b/tasks/build.js
new file mode 100644
index 0000000..bbdbee0
--- /dev/null
+++ b/tasks/build.js
@@ -0,0 +1,303 @@
+/**
+ * This task builds OpenLayers with the Closure Compiler.
+ */
+var path = require('path');
+
+var async = require('async');
+var closure = require('closure-util');
+var fse = require('fs-extra');
+var fs = require('graceful-fs');
+var nomnom = require('nomnom');
+var temp = require('temp').track();
+var exec = require('child_process').exec;
+
+var generateExports = require('./generate-exports');
+
+var log = closure.log;
+var root = path.join(__dirname, '..');
+
+var umdWrapper = '(function (root, factory) {\n' +
+    '  if (typeof define === "function" && define.amd) {\n' +
+    '    define([], factory);\n' +
+    '  } else if (typeof exports === "object") {\n' +
+    '    module.exports = factory();\n' +
+    '  } else {\n' +
+    '    root.ol = factory();\n' +
+    '  }\n' +
+    '}(this, function () {\n' +
+    '  var OPENLAYERS = {};\n' +
+    '  %output%\n' +
+    '  return OPENLAYERS.ol;\n' +
+    '}));\n';
+
+
+/**
+ * Apply defaults and assert that a provided config object is valid.
+ * @param {Object} config Build configuration object.
+ * @param {function(Error)} callback Called with an error if config is invalid.
+ */
+function assertValidConfig(config, callback) {
+  process.nextTick(function() {
+    if (!Array.isArray(config.exports)) {
+      callback(new Error('Config missing "exports" array'));
+      return;
+    }
+    if (config.namespace && typeof config.namespace !== 'string') {
+      callback(new Error('Config "namespace" must be a string'));
+      return;
+    }
+    if (config.compile && typeof config.compile !== 'object') {
+      callback(new Error('Config "compile" must be an object'));
+      return;
+    }
+    if (config.jvm && !Array.isArray(config.jvm)) {
+      callback(new Error('Config "jvm" must be an array'));
+      return;
+    }
+    if (config.src && !Array.isArray(config.src)) {
+      callback(new Error('Config "src" must be an array'));
+      return;
+    }
+    if (config.umd) {
+      config.namespace = 'OPENLAYERS';
+      if (config.compile) {
+        config.compile.output_wrapper = umdWrapper;
+      }
+    }
+    callback(null);
+  });
+}
+
+
+/**
+ * Read the build configuration file.
+ * @param {string} configPath Path to config file.
+ * @param {function(Error, Object)} callback Callback.
+ */
+function readConfig(configPath, callback) {
+  fs.readFile(configPath, function(err, data) {
+    if (err) {
+      if (err.code === 'ENOENT') {
+        err = new Error('Unable to find config file: ' + configPath);
+      }
+      callback(err);
+      return;
+    }
+    var config;
+    try {
+      config = JSON.parse(String(data));
+    } catch (err2) {
+      callback(new Error('Trouble parsing config as JSON: ' + err2.message));
+      return;
+    }
+    callback(null, config);
+  });
+}
+
+
+/**
+ * Write the exports code to a temporary file.
+ * @param {string} exports Exports code.
+ * @param {function(Error, string)} callback Called with the path to the temp
+ *     file (or any error).
+ */
+function writeExports(exports, callback) {
+  temp.open({prefix: 'exports', suffix: '.js'}, function(err, info) {
+    if (err) {
+      callback(err);
+      return;
+    }
+    log.verbose('build', 'Writing exports: ' + info.path);
+    fs.writeFile(info.path, exports, function(err) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      fs.close(info.fd, function(err) {
+        if (err) {
+          callback(err);
+          return;
+        }
+        callback(null, info.path);
+      });
+    });
+  });
+}
+
+
+/**
+ * Get the list of sources sorted in dependency order.
+ * @param {Object} config Build configuration object.
+ * @param {string} exports Exports code (with goog.exportSymbol calls).
+ * @param {function(Error, Array.<string>)} callback Called with a list of paths
+ *     or any error.
+ */
+function getDependencies(config, exports, callback) {
+  writeExports(exports, function(err, exportsPath) {
+    if (err) {
+      callback(err);
+      return;
+    }
+    log.info('ol', 'Parsing dependencies');
+    var options;
+    if (config.src) {
+      options = {
+        lib: config.src,
+        cwd: config.cwd
+      };
+    } else {
+      options = {
+        lib: ['src/**/*.js', 'build/ol.ext/*.js'],
+        cwd: root
+      };
+    }
+    closure.getDependencies(options, function(err, paths) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      paths.push(exportsPath);
+      callback(null, paths);
+    });
+  });
+}
+
+
+/**
+ * Concatenate all sources.
+ * @param {Array.<string>} paths List of paths to source files.
+ * @param {function(Error, string)} callback Called with the concatenated
+ *     output or any error.
+ */
+function concatenate(paths, callback) {
+  async.map(paths, fs.readFile, function(err, results) {
+    if (err) {
+      var msg = 'Trouble concatenating sources.  ' + err.message;
+      callback(new Error(msg));
+    } else {
+      var parts = umdWrapper.split('%output%');
+      var src = parts[0] +
+          'var goog = this.goog = {};\n' +
+          'this.CLOSURE_NO_DEPS = true;\n' +
+          results.join('\n') +
+          'OPENLAYERS.ol = ol;\n' +
+          parts[1];
+      callback(null, src);
+    }
+  });
+}
+
+
+/**
+ * Run the compiler.
+ * @param {Object} config Build configuration object.
+ * @param {Array.<string>} paths List of paths to source files.
+ * @param {function(Error, string)} callback Called with the compiled output or
+ *     any error.
+ */
+function build(config, paths, callback) {
+  var options = {
+    compile: config.compile,
+    cwd: config.cwd || root,
+    jvm: config.jvm
+  };
+  if (!options.compile) {
+    log.info('ol', 'No compile options found.  Concatenating ' +
+        paths.length + ' sources');
+    concatenate(paths, callback);
+  } else {
+    log.info('ol', 'Compiling ' + paths.length + ' sources');
+    options.compile.js = paths.concat(options.compile.js || []);
+    closure.compile(options, callback);
+  }
+}
+
+
+/**
+ * Adds a file header with the most recent Git tag.
+ * @param {string} compiledSource The compiled library.
+ * @param {function(Error, string)} callback Called with the output
+ *     ready to be written into a file, or any error.
+ */
+function addHeader(compiledSource, callback) {
+  exec('git describe --tags', function(error, stdout, stderr) {
+    var header = '// OpenLayers 3. See http://openlayers.org/\n';
+    header += '// License: https://raw.githubusercontent.com/openlayers/' +
+        'ol3/master/LICENSE.md\n';
+    if (stdout !== '') {
+      header += '// Version: ' + stdout + '\n';
+    }
+    callback(null, header + compiledSource);
+  });
+}
+
+
+/**
+ * Generate a build of the library.
+ * @param {Object} config Build configuration object.  Must have an "exports"
+ *     array and a "compile" object with options for the compiler.
+ * @param {function(Error, string)} callback Called with the compiled source
+ *     or any error.
+ */
+function main(config, callback) {
+  async.waterfall([
+    assertValidConfig.bind(null, config),
+    generateExports.bind(null, config),
+    getDependencies.bind(null, config),
+    build.bind(null, config),
+    addHeader
+  ], callback);
+}
+
+
+/**
+ * If running this module directly, read the config file and call the main
+ * function.
+ */
+if (require.main === module) {
+  var options = nomnom.options({
+    config: {
+      position: 0,
+      required: true,
+      help: 'Path to JSON config file'
+    },
+    output: {
+      position: 1,
+      required: true,
+      help: 'Output file path'
+    },
+    loglevel: {
+      abbr: 'l',
+      choices: ['silly', 'verbose', 'info', 'warn', 'error'],
+      default: 'info',
+      help: 'Log level',
+      metavar: 'LEVEL'
+    }
+  }).parse();
+
+  /**
+   * Set the log level.
+   * @type {string}
+   */
+  log.level = options.loglevel;
+
+  // read the config, run the main function, and write the output file
+  async.waterfall([
+    readConfig.bind(null, options.config),
+    main,
+    fse.outputFile.bind(fse, options.output)
+  ], function(err) {
+    if (err) {
+      log.error(err.message);
+      process.exit(1);
+    } else {
+      process.exit(0);
+    }
+  });
+}
+
+
+/**
+ * Export main function.
+ */
+module.exports = main;
diff --git a/tasks/changelog.sh b/tasks/changelog.sh
new file mode 100755
index 0000000..1345fba
--- /dev/null
+++ b/tasks/changelog.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+#
+# Generate a Markdown-formatted changelog from merge commits.
+#
+
+set -o errexit
+
+#
+# Regex to match the standard pull request commit message.  Creates capture
+# groups for pull request number, GitHub username, and commit message body.
+#
+MERGE_RE=Merge\ pull\ request\ #\([0-9]+\)\ from\ \([^/]+\)\/[^\ ]+\ \(.*\)
+
+GITHUB_URL=https://github.com
+PULLS_URL=${GITHUB_URL}/openlayers/ol3/pull
+
+display_usage() {
+  cat <<-EOF
+
+  Usage: ${1} <revision range>
+
+  Creates a Markdown-formatted changelog given a revision range.
+
+  E.g.
+      ${1} v3.0.0.. > changelog/v3.1.0.md
+
+  See git-log(1) for details on the revision range syntax.
+
+EOF
+}
+
+#
+# Scan the git log for merge commit messages and output Markdown.  This only
+# follows the first parent of merge commits to avoid merges within a topic
+# branch (instead only showing merges to master).
+#
+main() {
+  git log --first-parent --format='%s %b' ${1} |
+  {
+    while read l; do
+      if [[ ${l} =~ ${MERGE_RE} ]] ; then
+        number="${BASH_REMATCH[1]}"
+        author="${BASH_REMATCH[2]}"
+        summary="${BASH_REMATCH[3]}"
+        echo " * [#${number}](${PULLS_URL}/${number}) - ${summary} ([@${author}](${GITHUB_URL}/${author}))"
+      fi
+    done
+  }
+}
+
+if test ${#} -ne 1; then
+  display_usage ${0}
+  exit 1
+else
+  main ${1}
+fi
diff --git a/tasks/generate-exports.js b/tasks/generate-exports.js
new file mode 100644
index 0000000..630b1a7
--- /dev/null
+++ b/tasks/generate-exports.js
@@ -0,0 +1,244 @@
+var fs = require('fs');
+var path = require('path');
+
+var async = require('async');
+var fse = require('fs-extra');
+var nomnom = require('nomnom');
+
+var generateInfo = require('./generate-info');
+
+
+/**
+ * Get the configuration from the config file.  If configPath is provided
+ * it is assumed to be a JSON file with an 'exports' member that is a list
+ * of symbol names or patterns.
+ *
+ * @param {string} configPath Path to config file.
+ * @param {function(Error, Object)} callback Called with config object.
+ */
+function getConfig(configPath, callback) {
+  if (configPath) {
+    fs.readFile(configPath, function(err, data) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      var obj;
+      try {
+        obj = JSON.parse(String(data));
+      } catch (err2) {
+        callback(new Error('Trouble parsing file as JSON: ' + configPath));
+        return;
+      }
+      var patterns = obj.exports;
+      if (patterns && !Array.isArray(patterns)) {
+        callback(new Error('Expected an exports array, got: ' + patterns));
+        return;
+      }
+      var namespace = obj.namespace;
+      if (namespace && typeof namespace !== 'string') {
+        callback(new Error('Expected an namespace string, got: ' +
+            namespace));
+        return;
+      }
+      callback(null, obj);
+    });
+  } else {
+    process.nextTick(function() {
+      callback(null, {exports: ['*']});
+    });
+  }
+}
+
+
+/**
+ * Read the symbols from info file.
+ * @param {Array.<string>} patterns List of patterns to pass along.
+ * @param {function(Error, Array.<string>, Array.<Object>)} callback Called
+ *     with the patterns and symbols (or any error).
+ */
+function getSymbols(patterns, callback) {
+  generateInfo(function(err) {
+    if (err) {
+      callback(new Error('Trouble generating info: ' + err.message));
+      return;
+    }
+    var symbols = require('../build/info.json').symbols;
+    callback(null, patterns, symbols);
+  });
+}
+
+
+/**
+ * Generate a list of symbol names given a list of patterns.  Patterns may
+ * include a * wildcard at the end of the string, in which case all symbol names
+ * that start with the preceeding string will be matched (e.g 'foo.Bar#*' will
+ * match all symbol names that start with 'foo.Bar#').
+ *
+ * @param {Array.<string>} patterns A list of symbol names to match.  Wildcards
+ *     at the end of a string will match multiple names.
+ * @param {Array.<Object>} symbols List of symbols.
+ * @param {function(Error, Array.<Object>)} callback Called with the filtered
+ *     list of symbols (or any error).
+ */
+function filterSymbols(patterns, symbols, callback) {
+  var matches = [];
+
+  var lookup = {};
+  symbols.forEach(function(symbol) {
+    lookup[symbol.name] = symbol;
+  });
+
+  patterns.forEach(function(name) {
+    var match = false;
+    var pattern = (name.substr(-1) === '*');
+    if (pattern) {
+      name = name.substr(0, name.length - 1);
+      symbols.forEach(function(symbol) {
+        if (symbol.name.indexOf(name) === 0) {
+          matches.push(symbol);
+          match = true;
+        }
+      });
+    } else {
+      var symbol = lookup[name];
+      if (symbol) {
+        matches.push(symbol);
+        match = true;
+      }
+    }
+    if (!match) {
+      var message = 'No matching symbol found: ' + name + (pattern ? '*' : '');
+      callback(new Error(message));
+    }
+  });
+
+  callback(null, matches);
+}
+
+
+/**
+ * Generate goog code to export a named symbol.
+ * @param {string} name Symbol name.
+ * @param {string|undefined} namespace Target object for exported
+ *     symbols.
+ * @return {string} Export code.
+ */
+function formatSymbolExport(name, namespace) {
+  return 'goog.exportSymbol(\n' +
+      '    \'' + name + '\',\n' +
+      '    ' + name +
+      (namespace ? ',\n    ' + namespace : '') + ');\n';
+}
+
+
+/**
+ * Generate goog code to export a property.
+ * @param {string} name Property long name (e.g. foo.Bar#baz).
+ * @return {string} Export code.
+ */
+function formatPropertyExport(name) {
+  var parts = name.split('#');
+  var prototype = parts[0] + '.prototype';
+  var property = parts[1];
+  return 'goog.exportProperty(\n' +
+      '    ' + prototype + ',\n' +
+      '    \'' + property + '\',\n' +
+      '    ' + prototype + '.' + property + ');\n';
+}
+
+
+/**
+ * Generate export code given a list symbol names.
+ * @param {Array.<Object>} symbols List of symbols.
+ * @param {string|undefined} namespace Target object for exported symbols.
+ * @return {string} Export code.
+ */
+function generateExports(symbols, namespace) {
+  var blocks = [];
+  var requires = {};
+  symbols.forEach(function(symbol) {
+    symbol.provides.forEach(function(provide) {
+      requires[provide] = true;
+    });
+    var name = symbol.name;
+    if (name.indexOf('#') > 0) {
+      blocks.push(formatPropertyExport(name));
+    } else {
+      blocks.push(formatSymbolExport(name, namespace));
+    }
+  });
+  blocks.unshift('\n');
+  Object.keys(requires).sort().reverse().forEach(function(name) {
+    blocks.unshift('goog.require(\'' + name + '\');');
+  });
+  blocks.unshift(
+      '/**\n' +
+      ' * @fileoverview Custom exports file.\n' +
+      ' * @suppress {checkVars}\n' +
+      ' */\n');
+  return blocks.join('\n');
+}
+
+
+/**
+ * Generate the exports code.
+ *
+ * @param {Object} config Config object with exports and (optional) namespace.
+ * @param {function(Error, string)} callback Called with the exports code or any
+ *     error generating it.
+ */
+function main(config, callback) {
+  async.waterfall([
+    getSymbols.bind(null, config.exports),
+    filterSymbols,
+    function(symbols, done) {
+      var code, err;
+      try {
+        code = generateExports(symbols, config.namespace);
+      } catch (e) {
+        err = e;
+      }
+      done(err, code);
+    }
+  ], callback);
+}
+
+
+/**
+ * If running this module directly, read the config file, call the main
+ * function, and write the output file.
+ */
+if (require.main === module) {
+  var options = nomnom.options({
+    output: {
+      position: 0,
+      required: true,
+      help: 'Output file path'
+    },
+    config: {
+      abbr: 'c',
+      help: 'Path to JSON config file',
+      metavar: 'CONFIG'
+    }
+  }).parse();
+
+  async.waterfall([
+    getConfig.bind(null, options.config),
+    main,
+    fse.outputFile.bind(fse, options.output)
+  ], function(err) {
+    if (err) {
+      process.stderr.write(err.message + '\n');
+      process.exit(1);
+    } else {
+      process.exit(0);
+    }
+  });
+}
+
+
+/**
+ * Export main function.
+ */
+module.exports = main;
diff --git a/tasks/generate-externs.js b/tasks/generate-externs.js
new file mode 100644
index 0000000..8c02e39
--- /dev/null
+++ b/tasks/generate-externs.js
@@ -0,0 +1,231 @@
+var fs = require('fs');
+var path = require('path');
+
+var async = require('async');
+var fse = require('fs-extra');
+var nomnom = require('nomnom');
+
+var generateInfo = require('./generate-info');
+
+var googRegEx = /^goog\..*$/;
+
+/**
+ * Read the symbols from info file.
+ * @param {funciton(Error, Array.<string>, Array.<Object>)} callback Called
+ *     with the patterns and symbols (or any error).
+ */
+function getInfo(callback) {
+  generateInfo(function(err) {
+    if (err) {
+      callback(new Error('Trouble generating info: ' + err.message));
+      return;
+    }
+    var info = require('../build/info.json');
+    callback(null, info.typedefs, info.symbols, info.externs, info.base);
+  });
+}
+
+
+/**
+ * Generate externs code given a list symbols.
+ * @param {Array.<Object>} typedefs List of typedefs.
+ * @param {Array.<Object>} symbols List of symbols.
+ * @param {Array.<Object>} externs List of externs.
+ * @param {Array.<Object>} base List of base.
+ * @param {string|undefined} namespace Target object for exported symbols.
+ * @return {string} Export code.
+ */
+function generateExterns(typedefs, symbols, externs, base) {
+  var lines = [];
+  var processedSymbols = {};
+  var constructors = {};
+  var constructorOptionsTypes = {};
+
+  function addNamespaces(name) {
+    var parts = name.split('.');
+    parts.pop();
+    var namespace = [];
+    parts.forEach(function(part) {
+      namespace.push(part);
+      var partialNamespace = namespace.join('.');
+      if (!(partialNamespace in processedSymbols ||
+          partialNamespace in constructors)) {
+        lines.push('/**');
+        lines.push(' * @type {Object}');
+        lines.push(' */');
+        lines.push(nameToJS(partialNamespace) + ';');
+        lines.push('\n');
+      }
+    });
+  }
+
+  function nameToJS(name) {
+    processedSymbols[name] = true;
+    if (name.indexOf('.') === -1) {
+      name = 'var ' + name;
+    }
+    return name;
+  }
+
+  // Store in "constructorOptionsTypes" type names that start
+  // with "ol." and end with "Options".
+  function findConstructorOptionsTypes(types) {
+    types.forEach(function(type) {
+      if (type.match(/^ol\..*Options$/)) {
+        constructorOptionsTypes[type] = true;
+      }
+    });
+  }
+
+  function processSymbol(symbol) {
+    addNamespaces(symbol.name.split('#')[0]);
+
+    var name = symbol.name;
+    if (name.indexOf('#') > 0) {
+      name = symbol.name.replace('#', '.prototype.');
+      var constructor = symbol.name.split('#')[0];
+      if (!(constructor in constructors)) {
+        constructors[constructor] = true;
+        lines.push('/**');
+        lines.push(' * @constructor');
+        lines.push(' */');
+        lines.push(nameToJS(constructor) + ' = function() {};');
+        lines.push('\n');
+      }
+    }
+
+    lines.push('/**');
+    if (symbol.kind === 'class') {
+      constructors[name] = true;
+      lines.push(' * @constructor');
+      if (symbol.extends && !googRegEx.test(symbol.extends)) {
+        lines.push(' * @extends {' + symbol.extends + '}');
+      }
+    }
+    if (symbol.types) {
+      lines.push(' * @type {' + symbol.types.join('|') + '}');
+    }
+    var args = [];
+    if (symbol.params) {
+      symbol.params.forEach(function(param) {
+        findConstructorOptionsTypes(param.types);
+        args.push(param.name);
+        lines.push(' * @param {' +
+            (param.variable ? '...' : '') +
+            param.types.join('|') +
+            (param.optional ? '=' : '') + (param.nullable ? '!' : '') +
+            '} ' + param.name);
+      });
+    }
+    if (symbol.returns) {
+      lines.push(' * @return {' +
+          (symbol.returns.nullable ? '!' : '') +
+          symbol.returns.types.join('|') + '}');
+    }
+    if (symbol.template) {
+      lines.push(' * @template ' + symbol.template);
+    }
+    lines.push(' */');
+    if (symbol.kind === 'function' || symbol.kind === 'class') {
+      lines.push(nameToJS(name) + ' = function(' + args.join(', ') + ') {};');
+    } else {
+      lines.push(nameToJS(name) + ';');
+    }
+    lines.push('\n');
+  }
+
+  externs.forEach(processSymbol);
+
+  base.forEach(processSymbol);
+
+  symbols.forEach(processSymbol);
+
+  typedefs.forEach(function(typedef) {
+    // we're about to add a @typedef for "typedef.name" so remove that
+    // type from constructorOptionsTypes
+    delete constructorOptionsTypes[typedef.name];
+
+    addNamespaces(typedef.name);
+    lines.push('/**');
+    lines.push(' * @typedef {' + typedef.types.join('|') + '}');
+    lines.push(' */');
+    lines.push(nameToJS(typedef.name) + ';');
+    lines.push('\n');
+  });
+
+
+  // At this point constructorOptionsTypes includes options types for which we
+  // did not have a @typedef yet. For those we add @typedef {Object}.
+  //
+  // This is used for abstract base classes. Abstract base classes should be
+  // defined as types in the ol externs file. But the corresponding @typedef's
+  // are not marked with an @api annotation because abstract base classes are
+  // not instantiated by applications. Yet, we need to have a type defined
+  // in the ol externs file for these options types. So we just use
+  // @typedef {Object}.
+  Object.keys(constructorOptionsTypes).forEach(function(key) {
+    lines.push('/**');
+    lines.push(' * No `@api` annotation for `' + key + '`, use `Object`.');
+    lines.push(' * @typedef {Object}');
+    lines.push(' */');
+    lines.push(nameToJS(key) + ';');
+    lines.push('\n');
+  });
+
+  return lines.join('\n');
+}
+
+
+/**
+ * Generate the exports code.
+ *
+ * @param {function(Error, string)} callback Called with the exports code or any
+ *     error generating it.
+ */
+function main(callback) {
+  async.waterfall([
+    getInfo,
+    function(typedefs, symbols, externs, base, done) {
+      var code, err;
+      try {
+        code = generateExterns(typedefs, symbols, externs, base);
+      } catch (e) {
+        err = e;
+      }
+      done(err, code);
+    }
+  ], callback);
+}
+
+
+/**
+ * If running this module directly, read the config file, call the main
+ * function, and write the output file.
+ */
+if (require.main === module) {
+  var options = nomnom.options({
+    output: {
+      position: 0,
+      required: true,
+      help: 'Output path for the generated externs file.'
+    }
+  }).parse();
+
+  async.waterfall([
+    main,
+    fse.outputFile.bind(fse, options.output)
+  ], function(err) {
+    if (err) {
+      process.stderr.write(err.message + '\n');
+      process.exit(1);
+    } else {
+      process.exit(0);
+    }
+  });
+}
+
+
+/**
+ * Export main function.
+ */
+module.exports = main;
diff --git a/tasks/generate-info.js b/tasks/generate-info.js
new file mode 100644
index 0000000..d79bb67
--- /dev/null
+++ b/tasks/generate-info.js
@@ -0,0 +1,283 @@
+var fs = require('fs');
+var path = require('path');
+var spawn = require('child_process').spawn;
+
+var async = require('async');
+var fse = require('fs-extra');
+var walk = require('walk').walk;
+
+var sourceDir = path.join(__dirname, '..', 'src');
+var externsDir = path.join(__dirname, '..', 'externs');
+var externsPaths = [
+  path.join(externsDir, 'olx.js'),
+  path.join(externsDir, 'geojson.js')
+];
+var infoPath = path.join(__dirname, '..', 'build', 'info.json');
+var jsdoc = path.join(__dirname, '..', 'node_modules', '.bin', 'jsdoc');
+var jsdocConfig = path.join(
+    __dirname, '..', 'config', 'jsdoc', 'info', 'conf.json');
+
+
+/**
+ * Get the mtime of the info file.
+ * @param {function(Error, Date)} callback Callback called with any
+ *     error and the mtime of the info file (zero date if it doesn't exist).
+ */
+function getInfoTime(callback) {
+  fs.stat(infoPath, function(err, stats) {
+    if (err) {
+      if (err.code === 'ENOENT') {
+        callback(null, new Date(0));
+      } else {
+        callback(err);
+      }
+    } else {
+      callback(null, stats.mtime);
+    }
+  });
+}
+
+
+/**
+ * Test whether any externs are newer than the provided date.
+ * @param {Date} date Modification time of info file.
+ * @param {function(Error, Date, boolen)} callback Called with any
+ *     error, the mtime of the info file (zero date if it doesn't exist), and
+ *     whether any externs are newer than that date.
+ */
+function getNewerExterns(date, callback) {
+  var newer = false;
+  var walker = walk(externsDir);
+  walker.on('file', function(root, stats, next) {
+    var sourcePath = path.join(root, stats.name);
+    externsPaths.forEach(function(path) {
+      if (sourcePath === path && stats.mtime > date) {
+        newer = true;
+      }
+    });
+    next();
+  });
+  walker.on('errors', function() {
+    callback(new Error('Trouble walking ' + externsDir));
+  });
+  walker.on('end', function() {
+    callback(null, date, newer);
+  });
+}
+
+
+/**
+ * Generate a list of all .js paths in the source directory if any are newer
+ * than the provided date.
+ * @param {Date} date Modification time of info file.
+ * @param {boolean} newer Whether any externs are newer than date.
+ * @param {function(Error, Array.<string>)} callback Called with any
+ *     error and the array of source paths (empty if none newer).
+ */
+function getNewer(date, newer, callback) {
+  var paths = [].concat(externsPaths);
+
+  var walker = walk(sourceDir);
+  walker.on('file', function(root, stats, next) {
+    var sourcePath = path.join(root, stats.name);
+    if (/\.js$/.test(sourcePath)) {
+      paths.push(sourcePath);
+      if (stats.mtime > date) {
+        newer = true;
+      }
+    }
+    next();
+  });
+  walker.on('errors', function() {
+    callback(new Error('Trouble walking ' + sourceDir));
+  });
+  walker.on('end', function() {
+    callback(null, newer ? paths : []);
+  });
+}
+
+
+/**
+ * Parse the JSDoc output.
+ * @param {string} output JSDoc output
+ * @return {Object} Symbol and define info.
+ */
+function parseOutput(output) {
+  if (!output) {
+    throw new Error('Expected JSON output');
+  }
+
+  var info;
+  try {
+    info = JSON.parse(String(output));
+  } catch (err) {
+    throw new Error('Failed to parse output as JSON: ' + output);
+  }
+  if (!Array.isArray(info.symbols)) {
+    throw new Error('Expected symbols array: ' + output);
+  }
+  if (!Array.isArray(info.defines)) {
+    throw new Error('Expected defines array: ' + output);
+  }
+
+  return info;
+}
+
+
+/**
+ * Spawn JSDoc.
+ * @param {Array.<string>} paths Paths to source files.
+ * @param {function(Error, string)} callback Callback called with any error and
+ *     the JSDoc output (new metadata).  If provided with an empty list of paths
+ *     the callback will be called with null.
+ */
+function spawnJSDoc(paths, callback) {
+  if (paths.length === 0) {
+    process.nextTick(function() {
+      callback(null, null);
+    });
+    return;
+  }
+
+  var output = '';
+  var errors = '';
+  var cwd = path.join(__dirname, '..');
+  var child = spawn(jsdoc, ['-c', jsdocConfig].concat(paths), {cwd: cwd});
+
+  child.stdout.on('data', function(data) {
+    output += String(data);
+  });
+
+  child.stderr.on('data', function(data) {
+    errors += String(data);
+  });
+
+  child.on('exit', function(code) {
+    if (code) {
+      callback(new Error(errors || 'JSDoc failed with no output'));
+    } else {
+      var info;
+      try {
+        info = parseOutput(output);
+      } catch (err) {
+        callback(err);
+        return;
+      }
+      callback(null, info);
+    }
+  });
+}
+
+
+/**
+ * Given the path to a source file, get the list of provides.
+ * @param {string} srcPath Path to source file.
+ * @param {function(Error, Array.<string>)} callback Called with a list of
+ *     provides or any error.
+ */
+var getProvides = async.memoize(function(srcPath, callback) {
+  fs.readFile(srcPath, function(err, data) {
+    if (err) {
+      callback(err);
+      return;
+    }
+    var provides = [];
+    var matcher = /goog\.provide\('(.*)'\)/;
+    String(data).split('\n').forEach(function(line) {
+      var match = line.match(matcher);
+      if (match) {
+        provides.push(match[1]);
+      }
+    });
+    callback(null, provides);
+  });
+});
+
+
+/**
+ * Add provides data to new symbols.
+ * @param {Object} info Symbols and defines metadata.
+ * @param {function(Error, Object)} callback Updated metadata.
+ */
+function addSymbolProvides(info, callback) {
+  if (!info) {
+    process.nextTick(function() {
+      callback(null, null);
+    });
+    return;
+  }
+
+  function addProvides(symbol, callback) {
+    getProvides(symbol.path, function(err, provides) {
+      if (err) {
+        callback(err);
+        return;
+      }
+      symbol.provides = provides;
+      callback(null, symbol);
+    });
+  }
+
+  async.map(info.symbols, addProvides, function(err, newSymbols) {
+    info.symbols = newSymbols;
+    callback(err, info);
+  });
+}
+
+
+/**
+ * Write symbol and define metadata to the info file.
+ * @param {Object} info Symbol and define metadata.
+ * @param {function(Error)} callback Callback.
+ */
+function writeInfo(info, callback) {
+  if (info) {
+    var str = JSON.stringify(info, null, '  ');
+    fse.outputFile(infoPath, str, callback);
+  } else {
+    process.nextTick(function() {
+      callback(null);
+    });
+  }
+}
+
+
+/**
+ * Determine if source files have been changed, run JSDoc and write updated
+ * info if there are any changes.
+ *
+ * @param {function(Error)} callback Called when the info file has been written
+ *     (or an error occurs).
+ */
+function main(callback) {
+  async.waterfall([
+    getInfoTime,
+    getNewerExterns,
+    getNewer,
+    spawnJSDoc,
+    addSymbolProvides,
+    writeInfo
+  ], callback);
+}
+
+
+/**
+ * If running this module directly, read the config file and call the main
+ * function.
+ */
+if (require.main === module) {
+  main(function(err) {
+    if (err) {
+      process.stderr.write(err.message + '\n');
+      process.exit(1);
+    } else {
+      process.exit(0);
+    }
+  });
+}
+
+
+/**
+ * Export main function.
+ */
+module.exports = main;
diff --git a/tasks/install.js b/tasks/install.js
new file mode 100644
index 0000000..52cce80
--- /dev/null
+++ b/tasks/install.js
@@ -0,0 +1,17 @@
+var async = require('async');
+
+var buildExt = require('./build-ext');
+var parseExamples = require('./parse-examples');
+
+/**
+ * Parse examples and build external modules.
+ */
+async.waterfall([
+  parseExamples,
+  buildExt
+], function(err) {
+  if (err) {
+    process.stderr.write(err + '\n');
+    process.exit(1);
+  }
+});
diff --git a/tasks/parse-examples.js b/tasks/parse-examples.js
new file mode 100644
index 0000000..8315da6
--- /dev/null
+++ b/tasks/parse-examples.js
@@ -0,0 +1,161 @@
+var fs = require('fs');
+var path = require('path');
+
+var async = require('async');
+var Parser = require('htmlparser2').Parser;
+
+
+var exampleDir = path.join(__dirname, '..', 'examples');
+
+
+/**
+ * List all .html files in the example directory (excluding index.html).
+ * @param {function(Error, Array.<string>)} callback Called with any error or
+ *     the list of paths to examples.
+ */
+function listExamples(callback) {
+  fs.readdir(exampleDir, function(err, items) {
+    if (err) {
+      return callback(err);
+    }
+    var examplePaths = items.filter(function(item) {
+      return /\.html$/i.test(item) && item !== 'index.html';
+    }).map(function(item) {
+      return path.join(exampleDir, item);
+    });
+    callback(null, examplePaths);
+  });
+}
+
+
+/**
+ * Parse info from examples.
+ * @param {Array.<string>} examplePaths Paths to examples.
+ * @param {function(Error, Array.<Object>)} callback Called with any error or
+ *     the list of example info objects.
+ */
+function parseExamples(examplePaths, callback) {
+  async.map(examplePaths, function(examplePath, next) {
+    fs.readFile(examplePath, function(err, data) {
+      if (err) {
+        return next(err);
+      }
+      var name = path.basename(examplePath);
+      var info = {
+        link: name,
+        example: name,
+        title: '',
+        shortdesc: '',
+        tags: ''
+      };
+      var key;
+      var openTag;
+      var parser = new Parser({
+        onopentag: function(tag, attrs) {
+          if (attrs.id in info) {
+            key = attrs.id;
+            openTag = tag;
+          }
+        },
+        ontext: function(text) {
+          if (key) {
+            info[key] += text.replace(/\n/g, '').trim() + ' ';
+          }
+        },
+        onclosetag: function(tag) {
+          if (tag === openTag) {
+            info[key] = info[key].trim();
+            key = undefined;
+            openTag = undefined;
+          }
+        },
+        onerror: function(err2) {
+          var message = 'Trouble parsing ' + examplePath + '\n' + err2.message;
+          next(new Error(message));
+        }
+      });
+      parser.write(data.toString('utf8'));
+      parser.end();
+      next(null, info);
+    });
+  }, callback);
+}
+
+
+/**
+ * Create an inverted index of keywords from examples.  Property names are
+ * lowercased words.  Property values are objects mapping example index to word
+ * count.
+ * @param {Array.<Object>} exampleInfos Array of example info objects.
+ * @return {Object} Word index.
+ */
+function createWordIndex(exampleInfos) {
+  var index = {};
+  var keys = ['shortdesc', 'title', 'tags'];
+  exampleInfos.forEach(function(info, i) {
+    keys.forEach(function(key) {
+      var text = info[key];
+      var words = text ? text.split(/\W+/) : [];
+      words.forEach(function(word) {
+        if (word) {
+          word = word.toLowerCase();
+          var counts = index[word];
+          if (counts) {
+            if (index in counts) {
+              counts[i] += 1;
+            } else {
+              counts[i] = 1;
+            }
+          } else {
+            counts = {};
+            counts[i] = 1;
+            index[word] = counts;
+          }
+        }
+      });
+    });
+  });
+  return index;
+}
+
+
+/**
+ * Write the example-list.js file with example info and word index.
+ * @param {Array.<Object>} exampleInfos Array of example info objects.
+ * @param {function(Error)} callback Called with any error.
+ */
+function writeExampleList(exampleInfos, callback) {
+  var info = {
+    examples: exampleInfos,
+    index: createWordIndex(exampleInfos)
+  };
+  var indexPath = path.join(exampleDir, 'example-list.js');
+  var str = 'var info = ' + JSON.stringify(info);
+  fs.writeFile(indexPath, str, callback);
+}
+
+
+/**
+ * List examples, parse them, and write example list.
+ * @param {function(Error)} callback Called with any error.
+ */
+function main(callback) {
+  async.waterfall([
+    listExamples,
+    parseExamples,
+    writeExampleList
+  ], callback);
+}
+
+if (require.main === module) {
+  main(function(err) {
+    if (err) {
+      process.stderr.write(err.message + '\n');
+      process.exit(1);
+    } else {
+      process.exit(0);
+    }
+  });
+}
+
+module.exports = main;
diff --git a/tasks/publish.sh b/tasks/publish.sh
new file mode 100755
index 0000000..faf24b5
--- /dev/null
+++ b/tasks/publish.sh
@@ -0,0 +1,102 @@
+#!/bin/bash
+
+#
+# Run this script to publish a new version of the library to npm.  This requires
+# that you have a clean working directory and have created a tag that matches
+# the version number in package.json.
+#
+set -o errexit
+
+#
+# All profiles to be built.  Must correspond to .json files in the config
+# directory.
+#
+PROFILES="ol ol-debug"
+
+#
+# Destination directory for builds.
+#
+BUILDS=dist
+
+#
+# URL for canonical repo.
+#
+REMOTE=https://github.com/openlayers/ol3.git
+
+#
+# Display usage and exit.
+#
+display_usage() {
+  cat <<-EOF
+
+  Usage: ${1} <version>
+
+  To publish a new release, update the version number in package.json and
+  create a tag for the release.
+
+  The tag name must match the version number prefixed by a "v" (for example,
+  version 3.2.1 would be tagged v3.2.1).
+
+  The tag must be pushed to ${REMOTE} before the release can be published.
+
+EOF
+}
+
+#
+# Exit if the current working tree is not clean.
+#
+assert_clean() {
+  source `git --exec-path`/git-sh-setup && \
+      require_clean_work_tree "publish" "Please commit or stash them."
+}
+
+#
+# Exit if the requested version doesn't match package.json.
+#
+assert_version_match() {
+  v=`grep -o '"version":.*' package.json | sed 's/"version": *"\(.*\)",/\1/'`
+  if test "${1}" != "${v}"; then
+    echo "Version mismatch: requested '${1}', but package.json specifies '${v}'"
+    exit 1
+  fi
+}
+
+#
+# Build all of the distribution profiles.
+#
+build_profiles() {
+  for p in ${@}; do
+    echo building ${BUILDS}/${p}.js
+    node ./tasks/build.js config/${p}.json ${BUILDS}/${p}.js
+  done
+}
+
+#
+# Check out the provided tag.  This ensures that the tag has been pushed to
+# the canonical remote.
+#
+checkout_tag() {
+  git fetch ${REMOTE} refs/tags/v${1}:refs/tags/v${1}
+  git checkout refs/tags/v${1}
+}
+
+#
+# Build all profiles and publish.
+#
+main() {
+  root=$(cd -P -- "$(dirname -- "${0}")" && pwd -P)/..
+  cd ${root}
+  assert_clean
+  checkout_tag ${1}
+  assert_version_match ${1}
+  rm -rf ${BUILDS}
+  build_profiles ${PROFILES}
+  npm publish
+}
+
+if test ${#} -ne 1; then
+  display_usage ${0}
+  exit 1
+else
+  main ${1}
+fi
diff --git a/tasks/readme.md b/tasks/readme.md
new file mode 100644
index 0000000..a08a958
--- /dev/null
+++ b/tasks/readme.md
@@ -0,0 +1,124 @@
+# Tasks
+
+This directory contains utility scripts for working with the library.
+
+
+## `build.js`
+
+Builds the library based on a configuration file.  See the `--help` option for more detail.
+
+    node tasks/build.js --help
+
+### Build configuration files
+
+Build configuration files are JSON files that are used to determine what should be exported from the library and what options should be passed to the compiler.
+
+**Required configuration properties**
+
+  * **exports** - `Array.<string>` An array of symbol names or patterns to be exported (names that are used in your application).  For example, including `"ol.Map"` will export the map namespace including the constructor.  Method names are prefixed with `#`.  So `"ol.Map#getViewport"` will export the map's `getViewport` method.  You can use a `*` at the end to match multiple names.  The pattern `"ol.Map#*"` will export all exportable map methods.  
+   Note that only the 'exportable' names can be listed here, that is, those that are part of the supported API (see apidoc/readme.md for more details). If you want to include a property or method that is not part of the API (and be aware that these may change or be removed), you will have to specifically export these yourself, for example, with `goog.exportProperty`.  
+   Note too that the supplied observable properties together with their accessors, like `getView` in `ol.Map`, are always exported (with `goog.exportProperty` in the source). You do not have to include these, though it does not harm if you do.
+   Finally, although the term 'exports' is not relevant for simple and whitespace builds, you should still list the names you use as you would with advanced. A build will be created with those classes/namespaces that contain these exported methods.
+
+**Optional configuration properties**
+
+  * **compile** - `Object` An object whose properties are [Closure Compiler options](https://github.com/openlayers/closure-util/blob/master/compiler-options.txt).  Property names match the option names without the `--` prefix (e.g. `"compilation_level": "ADVANCED"` would set the `--compilation_level` option).  Where an option can be specified multiple times, use an array for the value (e.g. `"externs": ["one.js", "two.js"]`).  Where an option is used as a flag, use a boolean value (e.g.  [...]
+
+    If the **compile** object is not provided, the build task will generate a "debug" build of the library without any variable naming or other minification.  This is suitable for development or debugging purposes, but should not be used in production.
+
+  * **umd** - `boolean` Optional flag to wrap the build in [UMD syntax](https://github.com/umdjs/umd).  If set to `true`, the build output can be used with a CommonJS module loader (e.g. [Browserify](http://browserify.org/)), an AMD script loader (e.g. [RequireJS](http://requirejs.org/)), or just loaded with a `<script>` tag.  If this option is specified, the **namespace** and any **compile.output_wrapper** options will be ignored.
+
+  * **src** - `Array.<string>` Optional array of [path patterns](https://github.com/isaacs/minimatch/blob/master/README.md) for source files, that is, those that provide the symbols/names included in `exports`.  By default, all of the library source files will be included (`'src/**/*.js'`).  If you want to provide additional source files to be configured together with the library, you need to provide path patterns to your source files *and* the library source files.  Note that these patt [...]
+
+  * **cwd** - `string` Optional path to be used as the current working directory.  All paths in the `compile` object are assumed to be relative to `cwd`.  Default is the root of the ol3 repository.
+
+  * **namespace** - `string` Optional namespace for exporting the `ol` object.  By default, `ol` is assigned to the global object.
+
+  * **jvm** - `Array.<string>` Optional array of [command line options](https://github.com/google/closure-compiler/wiki/FAQ#what-are-the-recommended-java-vm-command-line-options) for the compiler.  By default, the Compiler is run with `['-server', '-XX:+TieredCompilation']`.
+
+The build task generates a list of source files sorted in dependency order and passes these to the compiler.  This takes the place of the `--js` options that you would use when calling the compiler directly.  If you want to add additional source files, typically you would use the `src` array described above.  This works with sources that have `goog.require` and/or `goog.provide` calls (which are used to sort dependencies).  If you want to force the inclusion of files that don't use `goog [...]
+
+Paths in your config file should be relative to the current working directory (when you call `node tasks/build.js`).  Note that this means paths are not necessarily relative to the config file itself.
+
+Below is a complete `build.json` configuration file that would generate a 'full' build including every exportable symbol in the library (much more than you'd ever need).
+
+```json
+{
+  "exports": ["*"],
+  "compile": {
+    "externs": [
+      "externs/bingmaps.js",
+      "externs/geojson.js",
+      "externs/oli.js",
+      "externs/olx.js",
+      "externs/proj4js.js",
+      "externs/tilejson.js",
+      "externs/topojson.js",
+      "externs/vbarray.js"
+    ],
+    "define": [
+      "goog.dom.ASSUME_STANDARDS_MODE=true",
+      "goog.DEBUG=false"
+    ],
+    "compilation_level": "ADVANCED",
+    "output_wrapper": "(function(){%output%})();",
+    "use_types_for_optimization": true,
+    "manage_closure_dependencies": true
+  }
+}
+```
+
+To generate a build named `ol.min.js` with the `build.json`, you would run this:
+
+    node tasks/build.js build.json ol.min.js
+
+To export the `ol` symbol to somewhere other than the global namespace, a `namespace` option is available. This can e.g. be useful for creating an ol3 AMD module, by simply providing a build configuration like the following:
+
+```json
+{
+  "exports": ["*"],
+  "namespace": "AMD",
+  "compile": {
+    "compilation_level": "ADVANCED",
+    "output_wrapper": "define('ol',function(){var AMD={};%output%return AMD.ol;});"
+  }
+}
+```
+
+The `defines` section of `build.json` above lists common settings for the Closure library in production code. The OL3 library also defines constants that can be set in this section at compile time. These are all defined in the `ol.js` source file; see the comments in this file to see what effect setting these would have. Some of them can reduce the size of the build in advanced mode.
+
+## `generate-exports.js`
+
+Called internally to generate a `build/exports.js` file optionally with a limited set of exports.
+
+
+## `generate-externs.js`
+
+Can be called to generate a Closure externs file for the full OpenLayers 3 API.
+See the `--help` option for more detail.
+
+    node tasks/generate-externs.js --help
+
+This is useful for projects that use the Closure Compiler to build, but want to use OpenLayers 3 as external library rather than building together with OpenLayers 3.
+
+
+## `generate-info.js`
+
+Called internally to parse the library for annotations and write out a `build/info.json` file.
+
+
+## `parse-examples.js`
+
+Called after install to generate an example index.  After new examples are added, run `node tasks/parse-examples.js` to regenerate the example index.
+
+
+## `serve.js`
+
+Run a debug server that provides all library sources unminified.  Provides a static server for examples and tests.  See the `--help` option for more detail.
+
+    node tasks/serve.js --help
+
+
+## `test.js`
+
+Run the tests once in a headless browser.  Note that you can also run the tests by running the `serve.js` task and then visiting the root of the test directory in your browser.
diff --git a/tasks/serve.js b/tasks/serve.js
new file mode 100644
index 0000000..a7f792d
--- /dev/null
+++ b/tasks/serve.js
@@ -0,0 +1,100 @@
+/**
+ * This task starts a dev server that provides a script loader for OpenLayers
+ * and Closure Library.  In addition, a static server hosts all files in the
+ * repository.
+ */
+
+var path = require('path');
+var url = require('url');
+
+var closure = require('closure-util');
+var nomnom = require('nomnom');
+
+var log = closure.log;
+
+
+/**
+ * Create a debug server for ol and Closure Library sources.
+ * @param {function(Error, closure.Server)} callback Callback.
+ */
+var createServer = exports.createServer = function(callback) {
+  var server;
+  var manager = new closure.Manager({
+    lib: [
+      'src/**/*.js',
+      'build/ol.ext/*.js',
+      'test/spec/**/*.test.js'
+    ],
+    main: 'examples/*.js'
+  });
+  manager.on('error', function(err) {
+    if (server) {
+      log.error('serve', err.message);
+    } else {
+      callback(err);
+    }
+  });
+  manager.on('ready', function() {
+    server = new closure.Server({
+      manager: manager,
+      loader: /^\/\w+\/loader.js/,
+      getMain: function(req) {
+        var main;
+        var query = url.parse(req.url, true).query;
+        if (query.id) {
+          var referer = req.headers.referer;
+          if (referer) {
+            var from = path.join(process.cwd(),
+                path.dirname(url.parse(referer).pathname));
+            main = path.resolve(from, query.id + '.js');
+          }
+        }
+        return main;
+      }
+    });
+    callback(null, server);
+  });
+};
+
+
+/**
+ * If running this module directly start the server.
+ */
+if (require.main === module) {
+  var options = nomnom.options({
+    port: {
+      abbr: 'p',
+      default: 3000,
+      help: 'Port for incoming connections',
+      metavar: 'PORT'
+    },
+    loglevel: {
+      abbr: 'l',
+      choices: ['silly', 'verbose', 'info', 'warn', 'error'],
+      default: 'info',
+      help: 'Log level',
+      metavar: 'LEVEL'
+    }
+  }).parse();
+
+  /** @type {string} */
+  log.level = options.loglevel;
+
+  log.info('serve', 'Parsing dependencies ...');
+  createServer(function(err, server) {
+    if (err) {
+      log.error('serve', 'Parsing failed');
+      log.error('serve', err.message);
+      process.exit(1);
+    }
+    server.listen(options.port, function() {
+      log.info('serve', 'Listening on http://localhost:' +
+          options.port + '/ (Ctrl+C to stop)');
+    });
+    server.on('error', function(err) {
+      log.error('serve', 'Server failed to start: ' + err.message);
+      process.exit(1);
+    });
+
+  });
+}
diff --git a/tasks/test.js b/tasks/test.js
new file mode 100644
index 0000000..1028659
--- /dev/null
+++ b/tasks/test.js
@@ -0,0 +1,69 @@
+/**
+ * This task starts a dev server that provides a script loader for OpenLayers
+ * and Closure Library and runs tests in PhantomJS.
+ */
+
+var path = require('path');
+var spawn = require('child_process').spawn;
+
+var phantomjs = require('phantomjs');
+
+var serve = require('./serve');
+
+/**
+ * Try listening for incoming connections on a range of ports.
+ * @param {number} min Minimum port to try.
+ * @param {number} max Maximum port to try.
+ * @param {http.Server} server The server.
+ * @param {function(Error)} callback Callback called with any error.
+ */
+function listen(min, max, server, callback) {
+  function _listen(port) {
+    server.once('error', function(err) {
+      if (err.code === 'EADDRINUSE') {
+        ++port;
+        if (port < max) {
+          _listen(port);
+        } else {
+          callback(new Error('Could not find an open port'));
+        }
+      } else {
+        callback(err);
+      }
+    });
+    server.listen(port, callback);
+  }
+  _listen(min);
+}
+
+
+/**
+ * Create the debug server and run tests.
+ */
+serve.createServer(function(err, server) {
+  if (err) {
+    process.stderr.write(err.message + '\n');
+    process.exit(1);
+  }
+
+  listen(3001, 3005, server, function(err) {
+    if (err) {
+      process.stderr.write('Server failed to start: ' + err.message + '\n');
+      process.exit(1);
+    }
+
+    var address = server.address();
+    var url = 'http://' + address.address + ':' + address.port;
+    var args = [
+      path.join(__dirname,
+          '../node_modules/mocha-phantomjs/lib/mocha-phantomjs.coffee'),
+      url + '/test/index.html'
+    ];
+
+    var child = spawn(phantomjs.path, args, {stdio: 'inherit'});
+    child.on('exit', function(code) {
+      process.exit(code);
+    });
+  });
+
+});
diff --git a/test/README.md b/test/README.md
new file mode 100644
index 0000000..36fca8c
--- /dev/null
+++ b/test/README.md
@@ -0,0 +1,34 @@
+## Included in this directory
+
+- index.html - the web page used to run the test suite.
+
+- spec - includes the OpenLayers test/spec files.
+
+- test-extensions.js - includes OpenLayers-specific extensions to the
+  testing frameworks.
+
+
+## Run the test suite
+
+Install the test dependencies (from the root of the repository):
+
+    npm install
+
+Run the tests once with PhantomJS:
+
+    ./build.py test
+
+(Note that for `npm` users, this can also be run as `npm test`.)
+
+Run the tests in a browser:
+
+    ./build.py serve
+
+(Again for `npm` users, this is `npm start`.)
+
+Now visit http://localhost:3000/test/ in your browser.  The tests will re-run
+any time one of the source or spec files changes.
+
+Tip for TDD'ers: to make PhantomJS run the test suite continuously each time
+a spec file is changed you can use nosier (http://pypi.python.org/pypi/nosier)
+and do `nosier -p test -p src "./build.py test"`.
diff --git a/test/index.html b/test/index.html
new file mode 100644
index 0000000..bcabf83
--- /dev/null
+++ b/test/index.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <title>OL Spec Runner</title>
+  <meta charset="utf-8">
+  <link rel="stylesheet" type="text/css" href="../node_modules/mocha/mocha.css">
+</head>
+
+<body>
+  <div id="mocha"></div>
+
+  <script type="text/javascript" src="../node_modules/jquery/dist/jquery.min.js"></script>
+  <script type="text/javascript" src="../node_modules/expect.js/index.js"></script>
+  <script type="text/javascript" src="../node_modules/sinon/pkg/sinon.js"></script>
+  <script type="text/javascript" src="../node_modules/mocha/mocha.js"></script>
+  <script type="text/javascript" src="../node_modules/proj4/dist/proj4.js"></script>
+  <script type="text/javascript" src="test-extensions.js"></script>
+  <script>
+    mocha.setup({
+      ui: 'bdd',
+      bail: false
+    });
+  </script>
+
+  <!-- This script is provided by the debug server (start with `build.py serve`) -->
+  <script type="text/javascript" src="loader.js"></script>
+
+  <script type="text/javascript">
+
+    /**
+     * The goog.dom.ViewportSizeMonitor (used in map.js) creates a global leak
+     * by setting goog.UID_PROPERTY_ on the monitored window.  In order to test
+     * that we don't have other global leaks, we preemptively set the property
+     * so Mocha can compare the global before and after our tests.
+     *
+     * In addition, calling goog.events.listen on the global object (as done
+     * in deviceorientation.js) creates a second leak by setting
+     * goog.events.LISTENER_MAP_PROP_ on the global object.
+     *
+     * We preemptively set both of these properties so Mocha can compare the
+     * global before and after tests.  The call to goog.events.listen also
+     * calls goog.getUid.
+     */
+    goog.events.listen(this, 'test', function() {});
+
+    if (window.mochaPhantomJS) {
+      mochaPhantomJS.run();
+    } else {
+      var runner = mocha.run();
+      if (window.console && console.log) {
+        // write stacks to the console for failed tests
+        runner.on('fail', function(test, err) {
+          if (test.duration > test._timeout) {
+            var titles = [];
+            for (var p = test; p; p = p.parent) {
+              if (p.title) {
+                titles.unshift(p.title);
+              }
+            }
+            console.log('Test timed out:', titles.join(' > '));
+          }
+          console.error(test.err.stack);
+        });
+      }
+    }
+  </script>
+  <!--
+    Tests should not depend on any specific markup and should instead create
+    whatever elements are needed (cleaning up when done).
+  -->
+</body>
+</html>
diff --git a/test/spec/ol/array.test.js b/test/spec/ol/array.test.js
new file mode 100644
index 0000000..4d68a2e
--- /dev/null
+++ b/test/spec/ol/array.test.js
@@ -0,0 +1,101 @@
+goog.provide('ol.test.array');
+
+describe('ol.array', function() {
+
+  describe('binaryFindNearest', function() {
+    it('returns expected value', function() {
+      var arr = [1000, 500, 100];
+
+      expect(ol.array.binaryFindNearest(arr, 10000)).to.eql(0);
+      expect(ol.array.binaryFindNearest(arr, 1000)).to.eql(0);
+      expect(ol.array.binaryFindNearest(arr, 900)).to.eql(0);
+
+      expect(ol.array.binaryFindNearest(arr, 750)).to.eql(1);
+
+      expect(ol.array.binaryFindNearest(arr, 550)).to.eql(1);
+      expect(ol.array.binaryFindNearest(arr, 500)).to.eql(1);
+      expect(ol.array.binaryFindNearest(arr, 450)).to.eql(1);
+
+      expect(ol.array.binaryFindNearest(arr, 300)).to.eql(2);
+
+      expect(ol.array.binaryFindNearest(arr, 200)).to.eql(2);
+      expect(ol.array.binaryFindNearest(arr, 100)).to.eql(2);
+      expect(ol.array.binaryFindNearest(arr, 50)).to.eql(2);
+    });
+  });
+
+  describe('linearFindNearest', function() {
+    it('returns expected value', function() {
+      var arr = [1000, 500, 100];
+
+      expect(ol.array.linearFindNearest(arr, 10000, 0)).to.eql(0);
+      expect(ol.array.linearFindNearest(arr, 10000, 1)).to.eql(0);
+      expect(ol.array.linearFindNearest(arr, 10000, -1)).to.eql(0);
+
+      expect(ol.array.linearFindNearest(arr, 1000, 0)).to.eql(0);
+      expect(ol.array.linearFindNearest(arr, 1000, 1)).to.eql(0);
+      expect(ol.array.linearFindNearest(arr, 1000, -1)).to.eql(0);
+
+      expect(ol.array.linearFindNearest(arr, 900, 0)).to.eql(0);
+      expect(ol.array.linearFindNearest(arr, 900, 1)).to.eql(0);
+      expect(ol.array.linearFindNearest(arr, 900, -1)).to.eql(1);
+
+      expect(ol.array.linearFindNearest(arr, 750, 0)).to.eql(1);
+      expect(ol.array.linearFindNearest(arr, 750, 1)).to.eql(0);
+      expect(ol.array.linearFindNearest(arr, 750, -1)).to.eql(1);
+
+      expect(ol.array.linearFindNearest(arr, 550, 0)).to.eql(1);
+      expect(ol.array.linearFindNearest(arr, 550, 1)).to.eql(0);
+      expect(ol.array.linearFindNearest(arr, 550, -1)).to.eql(1);
+
+      expect(ol.array.linearFindNearest(arr, 500, 0)).to.eql(1);
+      expect(ol.array.linearFindNearest(arr, 500, 1)).to.eql(1);
+      expect(ol.array.linearFindNearest(arr, 500, -1)).to.eql(1);
+
+      expect(ol.array.linearFindNearest(arr, 450, 0)).to.eql(1);
+      expect(ol.array.linearFindNearest(arr, 450, 1)).to.eql(1);
+      expect(ol.array.linearFindNearest(arr, 450, -1)).to.eql(2);
+
+      expect(ol.array.linearFindNearest(arr, 300, 0)).to.eql(2);
+      expect(ol.array.linearFindNearest(arr, 300, 1)).to.eql(1);
+      expect(ol.array.linearFindNearest(arr, 300, -1)).to.eql(2);
+
+      expect(ol.array.linearFindNearest(arr, 200, 0)).to.eql(2);
+      expect(ol.array.linearFindNearest(arr, 200, 1)).to.eql(1);
+      expect(ol.array.linearFindNearest(arr, 200, -1)).to.eql(2);
+
+      expect(ol.array.linearFindNearest(arr, 100, 0)).to.eql(2);
+      expect(ol.array.linearFindNearest(arr, 100, 1)).to.eql(2);
+      expect(ol.array.linearFindNearest(arr, 100, -1)).to.eql(2);
+
+      expect(ol.array.linearFindNearest(arr, 50, 0)).to.eql(2);
+      expect(ol.array.linearFindNearest(arr, 50, 1)).to.eql(2);
+      expect(ol.array.linearFindNearest(arr, 50, -1)).to.eql(2);
+    });
+  });
+
+  describe('reverseSubArray', function() {
+    it('returns expected value', function() {
+      var arr;
+      var expected = [1, 2, 3, 4, 5, 6];
+
+      arr = [1, 5, 4, 3, 2, 6];
+      ol.array.reverseSubArray(arr, 1, 4);
+      expect(arr).to.eql(expected);
+
+      arr = [3, 2, 1, 4, 5, 6];
+      ol.array.reverseSubArray(arr, 0, 2);
+      expect(arr).to.eql(expected);
+
+      arr = [1, 2, 3, 6, 5, 4];
+      ol.array.reverseSubArray(arr, 3, 5);
+      expect(arr).to.eql(expected);
+
+      arr = [6, 5, 4, 3, 2, 1];
+      ol.array.reverseSubArray(arr, 0, 5);
+      expect(arr).to.eql(expected);
+    });
+  });
+});
+
+goog.require('ol.array');
diff --git a/test/spec/ol/collection.test.js b/test/spec/ol/collection.test.js
new file mode 100644
index 0000000..b9e0008
--- /dev/null
+++ b/test/spec/ol/collection.test.js
@@ -0,0 +1,289 @@
+goog.provide('ol.test.Collection');
+
+describe('ol.collection', function() {
+  var collection;
+
+  beforeEach(function() {
+    collection = new ol.Collection();
+  });
+
+  describe('create an empty collection', function() {
+    it('creates an empty collection', function() {
+      expect(collection.getLength()).to.eql(0);
+      expect(collection.getArray()).to.be.empty();
+      expect(collection.item(0)).to.be(undefined);
+    });
+  });
+
+  describe('create a collection from an array', function() {
+    it('creates the expected collection', function() {
+      var array = [0, 1, 2];
+      var collection = new ol.Collection(array);
+      expect(collection.item(0)).to.eql(0);
+      expect(collection.item(1)).to.eql(1);
+      expect(collection.item(2)).to.eql(2);
+    });
+  });
+
+  describe('push to a collection', function() {
+    it('adds elements to the collection', function() {
+      collection.push(1);
+      expect(collection.getLength()).to.eql(1);
+      expect(collection.getArray()).to.eql([1]);
+      expect(collection.item(0)).to.eql(1);
+    });
+  });
+
+  describe('pop from a collection', function() {
+    it('removes elements from the collection', function() {
+      collection.push(1);
+      collection.pop();
+      expect(collection.getLength()).to.eql(0);
+      expect(collection.getArray()).to.be.empty();
+      expect(collection.item(0)).to.be(undefined);
+    });
+  });
+
+  describe('insertAt', function() {
+    it('inserts elements at the correct location', function() {
+      collection = new ol.Collection([0, 2]);
+      collection.insertAt(1, 1);
+      expect(collection.item(0)).to.eql(0);
+      expect(collection.item(1)).to.eql(1);
+      expect(collection.item(2)).to.eql(2);
+    });
+  });
+
+  describe('setAt', function() {
+    it('sets at the correct location', function() {
+      collection.setAt(1, 1);
+      expect(collection.getLength()).to.eql(2);
+      expect(collection.item(0)).to.be(undefined);
+      expect(collection.item(1)).to.eql(1);
+    });
+  });
+
+  describe('removeAt', function() {
+    it('removes elements at the correction', function() {
+      var collection = new ol.Collection([0, 1, 2]);
+      collection.removeAt(1);
+      expect(collection.item(0)).to.eql(0);
+      expect(collection.item(1)).to.eql(2);
+    });
+  });
+
+  describe('forEach', function() {
+    var cb;
+    beforeEach(function() {
+      cb = sinon.spy();
+    });
+    describe('on an empty collection', function() {
+      it('does not call the callback', function() {
+        collection.forEach(cb);
+        expect(cb).to.not.be.called();
+      });
+    });
+    describe('on a non-empty collection', function() {
+      it('does call the callback', function() {
+        collection.push(1);
+        collection.push(2);
+        collection.forEach(cb);
+        expect(cb.callCount).to.eql(2);
+      });
+    });
+    describe('scope', function() {
+      it('callbacks get the correct scope', function() {
+        var collection = new ol.Collection([0]);
+        var that;
+        var uniqueObj = {};
+        collection.forEach(function(elem) {
+          that = this;
+        }, uniqueObj);
+        expect(that).to.be(uniqueObj);
+      });
+    });
+  });
+
+  describe('remove', function() {
+    it('removes the first matching element', function() {
+      var collection = new ol.Collection([0, 1, 2]);
+      expect(collection.remove(1)).to.eql(1);
+      expect(collection.getArray()).to.eql([0, 2]);
+      expect(collection.getLength()).to.eql(2);
+    });
+    it('fires a remove event', function() {
+      var collection = new ol.Collection([0, 1, 2]);
+      var cb = sinon.spy();
+      goog.events.listen(collection, ol.CollectionEventType.REMOVE, cb);
+      expect(collection.remove(1)).to.eql(1);
+      expect(cb).to.be.called();
+      expect(cb.lastCall.args[0].element).to.eql(1);
+    });
+    it('does not remove more than one matching element', function() {
+      var collection = new ol.Collection([0, 1, 1, 2]);
+      expect(collection.remove(1)).to.eql(1);
+      expect(collection.getArray()).to.eql([0, 1, 2]);
+      expect(collection.getLength()).to.eql(3);
+    });
+    it('returns undefined if the element is not found', function() {
+      var collection = new ol.Collection([0, 1, 2]);
+      expect(collection.remove(3)).to.be(undefined);
+      expect(collection.getArray()).to.eql([0, 1, 2]);
+      expect(collection.getLength()).to.eql(3);
+    });
+  });
+
+  describe('setAt and event', function() {
+    it('does dispatch events', function() {
+      var collection = new ol.Collection(['a', 'b']);
+      var added, removed;
+      goog.events.listen(collection, ol.CollectionEventType.ADD, function(e) {
+        added = e.element;
+      });
+      goog.events.listen(
+          collection, ol.CollectionEventType.REMOVE, function(e) {
+            removed = e.element;
+          });
+      collection.setAt(1, 1);
+      expect(added).to.eql(1);
+      expect(removed).to.eql('b');
+    });
+  });
+
+  describe('removeAt and event', function() {
+    it('does dispatch events', function() {
+      var collection = new ol.Collection(['a']);
+      var removed;
+      goog.events.listen(
+          collection, ol.CollectionEventType.REMOVE, function(e) {
+            removed = e.element;
+          });
+      collection.pop();
+      expect(removed).to.eql('a');
+    });
+  });
+
+  describe('insertAt and event', function() {
+    it('does dispatch events', function() {
+      var collection = new ol.Collection([0, 2]);
+      var added;
+      goog.events.listen(
+          collection, ol.CollectionEventType.ADD, function(e) {
+            added = e.element;
+          });
+      collection.insertAt(1, 1);
+      expect(added).to.eql(1);
+    });
+  });
+
+  describe('setAt beyond end', function() {
+    it('triggers events properly', function() {
+      var added = [];
+      goog.events.listen(
+          collection, ol.CollectionEventType.ADD, function(e) {
+            added.push(e.element);
+          });
+      collection.setAt(2, 0);
+      expect(collection.getLength()).to.eql(3);
+      expect(collection.item(0)).to.be(undefined);
+      expect(collection.item(1)).to.be(undefined);
+      expect(collection.item(2)).to.eql(0);
+      expect(added.length).to.eql(3);
+      expect(added[0]).to.eql(undefined);
+      expect(added[1]).to.eql(undefined);
+      expect(added[2]).to.eql(0);
+    });
+  });
+
+  describe('change:length event', function() {
+    var collection, cb;
+    beforeEach(function() {
+      collection = new ol.Collection([0, 1, 2]);
+      cb = sinon.spy();
+      goog.events.listen(collection, 'change:length', cb);
+    });
+
+    describe('insertAt', function() {
+      it('triggers change:length event', function() {
+        collection.insertAt(2, 3);
+        expect(cb).to.be.called();
+      });
+    });
+
+    describe('removeAt', function() {
+      it('triggers change:length event', function() {
+        collection.removeAt(0);
+        expect(cb).to.be.called();
+      });
+    });
+
+    describe('setAt', function() {
+      it('does not trigger change:length event', function() {
+        collection.setAt(1, 1);
+        expect(cb).to.not.be.called();
+      });
+    });
+  });
+
+  describe('add event', function() {
+    it('triggers add when pushing', function() {
+      var collection = new ol.Collection();
+      var elem;
+      goog.events.listen(collection, ol.CollectionEventType.ADD, function(e) {
+        elem = e.element;
+      });
+      collection.push(1);
+      expect(elem).to.eql(1);
+    });
+  });
+
+  describe('remove event', function() {
+    var collection, cb1, cb2;
+    beforeEach(function() {
+      collection = new ol.Collection([1]);
+      cb1 = sinon.spy();
+      cb2 = sinon.spy();
+    });
+    describe('setAt', function() {
+      it('triggers remove', function() {
+        goog.events.listen(collection, ol.CollectionEventType.ADD, cb1);
+        goog.events.listen(collection, ol.CollectionEventType.REMOVE, cb2);
+        collection.setAt(0, 2);
+        expect(cb2.lastCall.args[0].element).to.eql(1);
+        expect(cb1.lastCall.args[0].element).to.eql(2);
+      });
+    });
+    describe('pop', function() {
+      it('triggers remove', function() {
+        goog.events.listen(collection, ol.CollectionEventType.REMOVE, cb1);
+        collection.pop();
+        expect(cb1.lastCall.args[0].element).to.eql(1);
+      });
+    });
+  });
+
+  describe('extending a collection', function() {
+    it('adds elements to end of the collection', function() {
+      collection.extend([1, 2]);
+      expect(collection.getLength()).to.eql(2);
+      expect(collection.getArray()).to.eql([1, 2]);
+      expect(collection.item(0)).to.eql(1);
+      expect(collection.item(1)).to.eql(2);
+    });
+    it('fires events', function() {
+      var collection = new ol.Collection();
+      var elems = [];
+      goog.events.listen(collection, ol.CollectionEventType.ADD, function(e) {
+        elems.push(e.element);
+      });
+      collection.extend([1, 2]);
+      expect(elems).to.eql([1, 2]);
+    });
+  });
+
+});
+
+
+goog.require('goog.events');
+goog.require('ol.Collection');
+goog.require('ol.CollectionEventType');
diff --git a/test/spec/ol/color.test.js b/test/spec/ol/color.test.js
new file mode 100644
index 0000000..3a61bac
--- /dev/null
+++ b/test/spec/ol/color.test.js
@@ -0,0 +1,109 @@
+goog.provide('ol.test.color');
+
+
+describe('ol.color', function() {
+
+  describe('ol.color.fromString', function() {
+
+    before(function() {
+      sinon.spy(ol.color, 'fromStringInternal_');
+    });
+
+    after(function() {
+      ol.color.fromStringInternal_.restore();
+    });
+
+    if (ol.ENABLE_NAMED_COLORS) {
+      it('can parse named colors', function() {
+        expect(ol.color.fromString('red')).to.eql([255, 0, 0, 1]);
+      });
+    }
+
+    it('can parse 3-digit hex colors', function() {
+      expect(ol.color.fromString('#087')).to.eql([0, 136, 119, 1]);
+    });
+
+    it('can parse 6-digit hex colors', function() {
+      expect(ol.color.fromString('#56789a')).to.eql([86, 120, 154, 1]);
+    });
+
+    it('can parse rgb colors', function() {
+      expect(ol.color.fromString('rgb(0, 0, 255)')).to.eql([0, 0, 255, 1]);
+    });
+
+    it('can parse rgba colors', function() {
+      expect(ol.color.fromString('rgba(255, 255, 0, 0.1)')).to.eql(
+          [255, 255, 0, 0.1]);
+    });
+
+    if (ol.ENABLE_NAMED_COLORS) {
+      it('caches parsed values', function() {
+        var count = ol.color.fromStringInternal_.callCount;
+        ol.color.fromString('aquamarine');
+        expect(ol.color.fromStringInternal_.callCount).to.be(count + 1);
+        ol.color.fromString('aquamarine');
+        expect(ol.color.fromStringInternal_.callCount).to.be(count + 1);
+      });
+    }
+
+    it('throws an error on invalid colors', function() {
+      var invalidColors = ['tuesday', '#1234567', 'rgb(255.0,0,0)'];
+      var i, ii;
+      for (i = 0, ii < invalidColors.length; i < ii; ++i) {
+        expect(function() {
+          ol.color.fromString(invalidColors[i]);
+        }).to.throwException();
+      }
+    });
+
+  });
+
+  describe('ol.color.isValid', function() {
+
+    it('identifies valid colors', function() {
+      expect(ol.color.isValid([0, 0, 0, 0])).to.be(true);
+      expect(ol.color.isValid([255, 255, 255, 1])).to.be(true);
+    });
+
+    it('identifies out-of-range channels', function() {
+      expect(ol.color.isValid([-1, 0, 0, 0])).to.be(false);
+      expect(ol.color.isValid([256, 0, 0, 0])).to.be(false);
+      expect(ol.color.isValid([0, -1, 0, 0])).to.be(false);
+      expect(ol.color.isValid([0, 256, 0, 0])).to.be(false);
+      expect(ol.color.isValid([0, 0, -1, 0])).to.be(false);
+      expect(ol.color.isValid([0, 0, 256, 0])).to.be(false);
+      expect(ol.color.isValid([0, 0, -1, 0])).to.be(false);
+      expect(ol.color.isValid([0, 0, 256, 0])).to.be(false);
+      expect(ol.color.isValid([0, 0, 0, -1])).to.be(false);
+      expect(ol.color.isValid([0, 0, 0, 2])).to.be(false);
+    });
+
+  });
+
+  describe('ol.color.normalize', function() {
+
+    it('clamps out-of-range channels', function() {
+      expect(ol.color.normalize([-1, 256, 0, 2])).to.eql([0, 255, 0, 1]);
+    });
+
+    it('rounds color channels to integers', function() {
+      expect(ol.color.normalize([1.2, 2.5, 3.7, 1])).to.eql([1, 3, 4, 1]);
+    });
+
+  });
+
+  describe('ol.color.toString', function() {
+
+    it('converts valid colors', function() {
+      expect(ol.color.toString([1, 2, 3, 0.4])).to.be('rgba(1,2,3,0.4)');
+    });
+
+    it('rounds to integers if needed', function() {
+      expect(ol.color.toString([1.2, 2.5, 3.7, 0.4])).to.be('rgba(1,3,4,0.4)');
+    });
+
+  });
+});
+
+
+goog.require('ol.color');
diff --git a/test/spec/ol/control/control.test.js b/test/spec/ol/control/control.test.js
new file mode 100644
index 0000000..22a555c
--- /dev/null
+++ b/test/spec/ol/control/control.test.js
@@ -0,0 +1,55 @@
+goog.provide('ol.test.control.Control');
+
+describe('ol.control.Control', function() {
+  var map, control;
+
+  beforeEach(function() {
+    map = new ol.Map({
+      target: document.createElement('div')
+    });
+    var element = goog.dom.createDom(goog.dom.TagName.DIV);
+    control = new ol.control.Control({element: element});
+    control.setMap(map);
+  });
+
+  afterEach(function() {
+    goog.dispose(map);
+  });
+
+  describe('dispose', function() {
+    it('removes the control element from its parent', function() {
+      goog.dispose(control);
+      expect(goog.dom.getParentElement(control.element)).to.be(null);
+    });
+  });
+});
+
+describe('ol.control.Control\'s target', function() {
+  describe('target as string or element', function() {
+    it('transforms target from string to element', function() {
+      var target = goog.dom.createDom('div', {'id': 'mycontrol'});
+      document.body.appendChild(target);
+      var ctrl = new ol.control.Control({target: 'mycontrol'});
+      expect(ctrl.target_.id).to.equal('mycontrol');
+      goog.dispose(ctrl);
+    });
+    it('accepts element for target', function() {
+      var target = goog.dom.createDom('div', {'id': 'mycontrol'});
+      document.body.appendChild(target);
+      var ctrl = new ol.control.Control({target: target});
+      expect(ctrl.target_.id).to.equal('mycontrol');
+      goog.dispose(ctrl);
+    });
+    it('ignores non-existing target id', function() {
+      var ctrl = new ol.control.Control({target: 'doesnotexist'});
+      expect(ctrl.target_).to.equal(null);
+      goog.dispose(ctrl);
+    });
+  });
+});
+
+goog.require('goog.dispose');
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('ol.Map');
+goog.require('ol.control.Control');
diff --git a/test/spec/ol/control/zoomslidercontrol.test.js b/test/spec/ol/control/zoomslidercontrol.test.js
new file mode 100644
index 0000000..26dace3
--- /dev/null
+++ b/test/spec/ol/control/zoomslidercontrol.test.js
@@ -0,0 +1,100 @@
+goog.provide('ol.test.control.ZoomSlider');
+
+describe('ol.control.ZoomSlider', function() {
+  var map, target, zoomslider;
+
+  beforeEach(function() {
+    target = document.createElement('div');
+    document.body.appendChild(target);
+    zoomslider = new ol.control.ZoomSlider();
+    map = new ol.Map({
+      target: target,
+      controls: [zoomslider]
+    });
+  });
+
+  afterEach(function() {
+    goog.dispose(zoomslider);
+    goog.dispose(map);
+    document.body.removeChild(target);
+    zoomslider = null;
+    map = null;
+    target = null;
+  });
+
+  describe('DOM creation', function() {
+    it('creates the expected DOM elements', function() {
+      var zoomSliderContainers = goog.dom.getElementsByClass(
+          'ol-zoomslider', target),
+          zoomSliderContainer,
+          zoomSliderThumbs,
+          zoomSliderThumb,
+          hasUnselectableCls;
+
+      expect(zoomSliderContainers.length).to.be(1);
+
+      zoomSliderContainer = zoomSliderContainers[0];
+      expect(zoomSliderContainer instanceof HTMLDivElement).to.be(true);
+
+      hasUnselectableCls = goog.dom.classlist.contains(zoomSliderContainer,
+          'ol-unselectable');
+      expect(hasUnselectableCls).to.be(true);
+
+      zoomSliderThumbs = goog.dom.getElementsByClass('ol-zoomslider-thumb',
+          zoomSliderContainer);
+      expect(zoomSliderThumbs.length).to.be(1);
+
+      zoomSliderThumb = zoomSliderThumbs[0];
+      expect(zoomSliderThumb instanceof HTMLDivElement).to.be(true);
+
+      hasUnselectableCls = goog.dom.classlist.contains(zoomSliderThumb,
+          'ol-unselectable');
+      expect(hasUnselectableCls).to.be(true);
+    });
+
+  });
+
+  describe('dragger setup', function() {
+    it('creates a goog.fx.Dragger', function() {
+      expect(zoomslider.dragger_ instanceof goog.fx.Dragger).to.be(true);
+      expect(zoomslider.dragger_.limits instanceof goog.math.Rect).to.be(true);
+    });
+  });
+
+  describe('#direction_', function() {
+    it('is horizontal for wide containers', function() {
+      var control = new ol.control.ZoomSlider({});
+      control.element.style.width = '1000px';
+      control.element.style.height = '10px';
+      control.setMap(map);
+      control.initSlider_();
+
+      var horizontal = ol.control.ZoomSlider.direction.HORIZONTAL;
+      expect(control.direction_).to.be(horizontal);
+
+      goog.dispose(control);
+    });
+
+    it('is vertical for tall containers', function() {
+      var control = new ol.control.ZoomSlider({});
+      control.element.style.width = '10px';
+      control.element.style.height = '1000px';
+
+      control.setMap(map);
+
+      var vertical = ol.control.ZoomSlider.direction.VERTICAL;
+      expect(control.direction_).to.be(vertical);
+
+      goog.dispose(control);
+    });
+  });
+
+});
+
+goog.require('goog.dispose');
+goog.require('goog.dom');
+goog.require('goog.dom.classlist');
+goog.require('goog.fx.Dragger');
+goog.require('goog.math.Rect');
+goog.require('ol.Map');
+goog.require('ol.control.ZoomSlider');
diff --git a/test/spec/ol/coordinate.test.js b/test/spec/ol/coordinate.test.js
new file mode 100644
index 0000000..e5168a5
--- /dev/null
+++ b/test/spec/ol/coordinate.test.js
@@ -0,0 +1,129 @@
+goog.provide('ol.test.coordinate');
+
+describe('ol.coordinate', function() {
+
+  describe('#add', function() {
+    var coordinate,
+        delta;
+
+    beforeEach(function() {
+      coordinate = [50.73, 7.1];
+      delta = [-2, 3];
+    });
+
+    it('returns a coordinate', function() {
+      var returnedCoordinate = ol.coordinate.add(coordinate, delta);
+      expect(returnedCoordinate).to.be.an('array');
+      expect(returnedCoordinate).to.have.length(2);
+    });
+
+    it('adds the delta', function() {
+      var returnedCoordinate = ol.coordinate.add(coordinate, delta);
+      expect(returnedCoordinate[0]).to.eql(48.73);
+      expect(returnedCoordinate[1]).to.eql(10.1);
+    });
+
+    it('modifies in place', function() {
+      ol.coordinate.add(coordinate, delta);
+      expect(coordinate[0]).to.eql(48.73);
+      expect(coordinate[1]).to.eql(10.1);
+    });
+  });
+
+  describe('#equals', function() {
+    var cologne = [50.93333, 6.95],
+        bonn1 = [50.73, 7.1],
+        bonn2 = [50.73000, 7.10000];
+
+    it('compares correctly', function() {
+      var bonnEqualsBonn = ol.coordinate.equals(bonn1, bonn2),
+          bonnEqualsCologne = ol.coordinate.equals(bonn1, cologne);
+      expect(bonnEqualsBonn).to.be(true);
+      expect(bonnEqualsCologne).to.be(false);
+    });
+  });
+
+  describe('#format', function() {
+    var coordinate;
+    beforeEach(function() {
+      coordinate = [6.6123, 46.7919];
+    });
+
+    it('rounds the values', function() {
+      var string = ol.coordinate.format(coordinate, '{x} {y}', 0);
+      expect(string).to.eql('7 47');
+    });
+
+    it('handles the optional fractionDigits param', function() {
+      var string = ol.coordinate.format(coordinate, '{x} {y}', 3);
+      expect(string).to.eql('6.612 46.792');
+    });
+  });
+
+  describe('#createStringXY', function() {
+    var coordinate,
+        created,
+        formatted;
+    beforeEach(function() {
+      coordinate = [6.6123, 46.7919];
+      created = null;
+      formatted = null;
+    });
+
+    it('returns a CoordinateFormatType', function() {
+      created = ol.coordinate.createStringXY();
+      expect(created).to.be.a('function');
+
+      formatted = created(coordinate);
+      expect(formatted).to.be.a('string');
+      expect(formatted).to.eql('7, 47');
+    });
+
+    it('respects opt_fractionDigits', function() {
+      created = ol.coordinate.createStringXY(3);
+      expect(created).to.be.a('function');
+
+      formatted = created(coordinate);
+      expect(formatted).to.be.a('string');
+      expect(formatted).to.eql('6.612, 46.792');
+    });
+  });
+
+  describe('#closestOnSegment', function() {
+    it('can handle points where the foot of the perpendicular is closest',
+        function() {
+          var point = [2, 5];
+          var segment = [[-5, 0], [10, 0]];
+          expect(ol.coordinate.closestOnSegment(point, segment))
+              .to.eql([2, 0]);
+        });
+    it('can handle points where the foot of the perpendicular is not closest',
+        function() {
+          var point = [0, -6];
+          var segment = [[-5, 0], [0, -1]];
+          expect(ol.coordinate.closestOnSegment(point, segment))
+              .to.eql([0, -1]);
+        });
+  });
+
+  describe('#squaredDistanceToSegment', function() {
+    it('can handle points where the foot of the perpendicular is closest',
+        function() {
+          var point = [2, 5];
+          var segment = [[-5, 0], [10, 0]];
+          expect(ol.coordinate.squaredDistanceToSegment(point, segment))
+              .to.eql(25);
+        });
+    it('can handle points where the foot of the perpendicular is not closest',
+        function() {
+          var point = [0, -6];
+          var segment = [[-5, 0], [0, -1]];
+          expect(ol.coordinate.squaredDistanceToSegment(point, segment))
+              .to.eql(25);
+        });
+
+  });
+
+});
+
+goog.require('ol.coordinate');
diff --git a/test/spec/ol/ellipsoid/ellipsoid.test.js b/test/spec/ol/ellipsoid/ellipsoid.test.js
new file mode 100644
index 0000000..1573c1e
--- /dev/null
+++ b/test/spec/ol/ellipsoid/ellipsoid.test.js
@@ -0,0 +1,358 @@
+goog.provide('ol.test.Ellipsoid');
+
+
+describe('ol.Ellipsoid', function() {
+
+  var expected = [
+    {
+      c1: [0, 0],
+      c2: [0, 0],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [0, 0],
+      c2: [45, 45],
+      vincentyFinalBearing: 54.890773827979565,
+      vincentyInitialBearing: 35.41005890511814,
+      vincentyDistance: 6662472.718217184
+    },
+    {
+      c1: [0, 0],
+      c2: [45, -45],
+      vincentyFinalBearing: 125.10922617202044,
+      vincentyInitialBearing: 144.58994109488185,
+      vincentyDistance: 6662472.718217184
+    },
+    {
+      c1: [0, 0],
+      c2: [-45, -45],
+      vincentyFinalBearing: -125.10922617202044,
+      vincentyInitialBearing: -144.58994109488185,
+      vincentyDistance: 6662472.718217184
+    },
+    {
+      c1: [0, 0],
+      c2: [-45, 45],
+      vincentyFinalBearing: -54.890773827979565,
+      vincentyInitialBearing: -35.41005890511814,
+      vincentyDistance: 6662472.718217184
+    },
+    {
+      c1: [0, 0],
+      c2: [180, 90],
+      vincentyFinalBearing: 180,
+      vincentyInitialBearing: 4.296211503097554e-31,
+      vincentyDistance: 10001965.729311794
+    },
+    {
+      c1: [0, 0],
+      c2: [180, -90],
+      vincentyFinalBearing: 7.0164775638926606e-15,
+      vincentyInitialBearing: 180,
+      vincentyDistance: 10001965.729311794
+    },
+    {
+      c1: [0, 0],
+      c2: [-180, 90],
+      vincentyFinalBearing: -180,
+      vincentyInitialBearing: -4.296211503097554e-31,
+      vincentyDistance: 10001965.729311794
+    },
+    {
+      c1: [0, 0],
+      c2: [-180, 90],
+      vincentyFinalBearing: -180,
+      vincentyInitialBearing: -4.296211503097554e-31,
+      vincentyDistance: 10001965.729311794
+    },
+    {
+      c1: [45, 45],
+      c2: [45, 45],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [45, 45],
+      c2: [45, -45],
+      vincentyFinalBearing: 180,
+      vincentyInitialBearing: 180,
+      vincentyDistance: 9969888.755957305
+    },
+    {
+      c1: [45, 45],
+      c2: [-45, -45],
+      vincentyFinalBearing: -125.10922617202044,
+      vincentyInitialBearing: -125.10922617202044,
+      vincentyDistance: 13324945.436434371
+    },
+    {
+      c1: [45, 45],
+      c2: [-45, 45],
+      vincentyFinalBearing: -125.27390277185786,
+      vincentyInitialBearing: -54.726097228142166,
+      vincentyDistance: 6690232.932559058
+    },
+    {
+      c1: [45, 45],
+      c2: [180, 90],
+      vincentyFinalBearing: 135,
+      vincentyInitialBearing: 3.5023624896823797e-15,
+      vincentyDistance: 5017021.35133314
+    },
+    {
+      c1: [45, 45],
+      c2: [180, -90],
+      vincentyFinalBearing: 45.00000000000001,
+      vincentyInitialBearing: 180,
+      vincentyDistance: 14986910.107290443
+    },
+    {
+      c1: [45, 45],
+      c2: [-180, 90],
+      vincentyFinalBearing: 135.00000000000003,
+      vincentyInitialBearing: 3.5023624896823793e-15,
+      vincentyDistance: 5017021.35133314
+    },
+    {
+      c1: [45, 45],
+      c2: [-180, 90],
+      vincentyFinalBearing: 135.00000000000003,
+      vincentyInitialBearing: 3.5023624896823793e-15,
+      vincentyDistance: 5017021.35133314
+    },
+    {
+      c1: [45, -45],
+      c2: [45, -45],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [45, -45],
+      c2: [-45, -45],
+      vincentyFinalBearing: -54.726097228142166,
+      vincentyInitialBearing: -125.27390277185786,
+      vincentyDistance: 6690232.932559058
+    },
+    {
+      c1: [45, -45],
+      c2: [-45, 45],
+      vincentyFinalBearing: -54.890773827979565,
+      vincentyInitialBearing: -54.890773827979565,
+      vincentyDistance: 13324945.436434371
+    },
+    {
+      c1: [45, -45],
+      c2: [180, 90],
+      vincentyFinalBearing: 135,
+      vincentyInitialBearing: 3.5023624896823797e-15,
+      vincentyDistance: 14986910.107290443
+    },
+    {
+      c1: [45, -45],
+      c2: [180, -90],
+      vincentyFinalBearing: 45.00000000000001,
+      vincentyInitialBearing: 180,
+      vincentyDistance: 5017021.35133314
+    },
+    {
+      c1: [45, -45],
+      c2: [-180, 90],
+      vincentyFinalBearing: 135.00000000000003,
+      vincentyInitialBearing: 3.5023624896823793e-15,
+      vincentyDistance: 14986910.107290443
+    },
+    {
+      c1: [45, -45],
+      c2: [-180, 90],
+      vincentyFinalBearing: 135.00000000000003,
+      vincentyInitialBearing: 3.5023624896823793e-15,
+      vincentyDistance: 14986910.107290443
+    },
+    {
+      c1: [-45, -45],
+      c2: [-45, -45],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [-45, -45],
+      c2: [-45, 45],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 9969888.755957305
+    },
+    {
+      c1: [-45, -45],
+      c2: [180, 90],
+      vincentyFinalBearing: -135.00000000000003,
+      vincentyInitialBearing: -3.5023624896823793e-15,
+      vincentyDistance: 14986910.107290443
+    },
+    {
+      c1: [-45, -45],
+      c2: [180, -90],
+      vincentyFinalBearing: -44.999999999999986,
+      vincentyInitialBearing: -180,
+      vincentyDistance: 5017021.35133314
+    },
+    {
+      c1: [-45, -45],
+      c2: [-180, 90],
+      vincentyFinalBearing: -135,
+      vincentyInitialBearing: -3.5023624896823797e-15,
+      vincentyDistance: 14986910.107290443
+    },
+    {
+      c1: [-45, -45],
+      c2: [-180, 90],
+      vincentyFinalBearing: -135,
+      vincentyInitialBearing: -3.5023624896823797e-15,
+      vincentyDistance: 14986910.107290443
+    },
+    {
+      c1: [-45, 45],
+      c2: [-45, 45],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [-45, 45],
+      c2: [180, 90],
+      vincentyFinalBearing: -135.00000000000003,
+      vincentyInitialBearing: -3.5023624896823793e-15,
+      vincentyDistance: 5017021.35133314
+    },
+    {
+      c1: [-45, 45],
+      c2: [180, -90],
+      vincentyFinalBearing: -44.999999999999986,
+      vincentyInitialBearing: -180,
+      vincentyDistance: 14986910.107290443
+    },
+    {
+      c1: [-45, 45],
+      c2: [-180, 90],
+      vincentyFinalBearing: -135,
+      vincentyInitialBearing: -3.5023624896823797e-15,
+      vincentyDistance: 5017021.35133314
+    },
+    {
+      c1: [-45, 45],
+      c2: [-180, 90],
+      vincentyFinalBearing: -135,
+      vincentyInitialBearing: -3.5023624896823797e-15,
+      vincentyDistance: 5017021.35133314
+    },
+    {
+      c1: [180, 90],
+      c2: [180, 90],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [180, -90],
+      c2: [180, -90],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [-180, 90],
+      c2: [-180, 90],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [-180, 90],
+      c2: [-180, 90],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    },
+    {
+      c1: [-180, 90],
+      c2: [-180, 90],
+      vincentyFinalBearing: 0,
+      vincentyInitialBearing: 0,
+      vincentyDistance: 0
+    }
+  ];
+
+  describe('vincenty', function() {
+
+    it('returns the same distances as Chris Veness\'s reference implementation',
+        function() {
+          var e, i, v;
+          for (i = 0; i < expected.length; ++i) {
+            e = expected[i];
+            v = ol.ellipsoid.WGS84.vincenty(e.c1, e.c2, 1e-12, 100);
+            expect(v.distance).to.roughlyEqual(e.vincentyDistance, 1e-8);
+            expect(v.finalBearing).to.roughlyEqual(
+                e.vincentyFinalBearing, 1e-9);
+            expect(v.initialBearing).to.roughlyEqual(
+                e.vincentyInitialBearing, 1e-9);
+          }
+        });
+
+  });
+
+  describe('vincentyDistance', function() {
+
+    it('returns the same distances as Chris Veness\'s reference implementation',
+        function() {
+          var e, i, vincentyDistance;
+          for (i = 0; i < expected.length; ++i) {
+            e = expected[i];
+            vincentyDistance =
+                ol.ellipsoid.WGS84.vincentyDistance(e.c1, e.c2, 1e-12, 100);
+            expect(vincentyDistance).to.roughlyEqual(e.vincentyDistance, 1e-8);
+          }
+        });
+
+  });
+
+  describe('vincentyFinalBearing', function() {
+
+    it('returns the same distances as Chris Veness\'s reference implementation',
+        function() {
+          var e, i, vincentyFinalBearing;
+          for (i = 0; i < expected.length; ++i) {
+            e = expected[i];
+            vincentyFinalBearing =
+                ol.ellipsoid.WGS84.vincentyFinalBearing(e.c1, e.c2, 1e-12, 100);
+            expect(vincentyFinalBearing).to.roughlyEqual(
+                e.vincentyFinalBearing, 1e-9);
+          }
+        });
+
+  });
+
+  describe('vincentyInitialBearing', function() {
+
+    it('returns the same distances as Chris Veness\'s reference implementation',
+        function() {
+          var e, i, vincentyInitialBearing;
+          for (i = 0; i < expected.length; ++i) {
+            e = expected[i];
+            vincentyInitialBearing = ol.ellipsoid.WGS84.vincentyInitialBearing(
+                e.c1, e.c2, 1e-12, 100);
+            expect(vincentyInitialBearing).to.roughlyEqual(
+                e.vincentyInitialBearing, 1e-9);
+          }
+        });
+
+  });
+
+});
+
+
+goog.require('ol.Ellipsoid');
+goog.require('ol.ellipsoid.WGS84');
diff --git a/test/spec/ol/expect.test.js b/test/spec/ol/expect.test.js
new file mode 100644
index 0000000..66c161a
--- /dev/null
+++ b/test/spec/ol/expect.test.js
@@ -0,0 +1,127 @@
+goog.provide('ol.test.expect.js');
+
+
+describe('expect.js', function() {
+
+  describe('arreqlNaN', function() {
+
+    it('considers NaN in array to be equal', function() {
+      expect([1, NaN, 2]).to.arreqlNaN([1, NaN, 2]);
+      expect([1, NaN, 2]).not.to.arreqlNaN([1, 1.5, 2]);
+    });
+
+    it('allows a mix of number and string', function() {
+      expect([1, NaN, 'foo']).to.arreqlNaN([1, NaN, 'foo']);
+      expect([1, NaN, 'foo']).not.to.arreqlNaN([1, NaN, 'bar']);
+      expect([1, NaN]).not.to.arreqlNaN([1, 'foo']);
+    });
+
+  });
+
+  describe('roughlyEqual', function() {
+
+    it('can tell the difference between 1 and 3', function() {
+      expect(1).not.to.roughlyEqual(3, 1);
+    });
+
+    it('really can tell the difference between 1 and 3', function() {
+      expect(function() {
+        expect(1).to.roughlyEqual(3, 0.5);
+      }).to.throwException();
+    });
+
+    it('thinks that 1 ain\'t so different from 2', function() {
+      expect(1).to.roughlyEqual(2, 1);
+    });
+
+    it('knows that, like, 1 and 2 would, like, totally dig each other',
+        function() {
+          expect(function() {
+            expect(1).to.roughlyEqual(2, 1);
+          }).not.to.throwException();
+        });
+
+  });
+
+  describe('called', function() {
+
+    var telephone;
+    beforeEach(function() {
+      telephone = sinon.spy();
+    });
+
+    it('has caller ID', function() {
+      telephone();
+      expect(telephone).to.be.called();
+    });
+
+    it('also knows when it\'s speaking to the hand', function() {
+      (function() {})();
+      expect(telephone).not.to.be.called();
+    });
+
+    it('reminds you that you forgot', function() {
+      expect(function() {
+        expect(telephone).to.be.called();
+      }).to.throwException();
+    });
+
+    it('gets moody all too quickly', function() {
+      telephone();
+      expect(function() {
+        expect(telephone).not.to.be.called();
+      }).to.throwException();
+    });
+
+  });
+
+  describe('Test equality of XML documents - xmleql', function() {
+
+    it('Test XML document with single root, different prefix', function() {
+      var doc1 = '<bar:foo xmlns:bar="http://foo"></bar:foo>';
+      var doc2 = '<foo xmlns="http://foo"></foo>';
+      expect(goog.dom.xml.loadXml(doc1)).to.xmleql(
+          goog.dom.xml.loadXml(doc2));
+    });
+
+    it('Test XML document with single root, different prefix, prefix true',
+        function() {
+          var doc1 = '<bar:foo xmlns:bar="http://foo"></bar:foo>';
+          var doc2 = '<foo xmlns="http://foo"></foo>';
+          expect(goog.dom.xml.loadXml(doc1)).to.not.xmleql(
+              goog.dom.xml.loadXml(doc2), {prefix: true});
+        });
+
+    it('Test XML document with different root', function() {
+      var doc1 = '<foo></foo>';
+      var doc2 = '<bar></bar>';
+      expect(goog.dom.xml.loadXml(doc1)).to.not.xmleql(
+          goog.dom.xml.loadXml(doc2));
+    });
+
+    it('Test different number of attributes', function() {
+      var doc1 = '<foo attr="bla"></foo>';
+      var doc2 = '<foo></foo>';
+      expect(goog.dom.xml.loadXml(doc1)).to.not.xmleql(
+          goog.dom.xml.loadXml(doc2));
+    });
+
+    it('Test different attribute value', function() {
+      var doc1 = '<foo attr="bla"></foo>';
+      var doc2 = '<foo attr="foo"></foo>';
+      expect(goog.dom.xml.loadXml(doc1)).to.not.xmleql(
+          goog.dom.xml.loadXml(doc2));
+    });
+
+    it('Test different number of children', function() {
+      var doc1 = '<foo><mynode></mynode></foo>';
+      var doc2 = '<foo></foo>';
+      expect(goog.dom.xml.loadXml(doc1)).to.not.xmleql(
+          goog.dom.xml.loadXml(doc2));
+    });
+
+  });
+
+});
+
+goog.require('goog.dom.xml');
diff --git a/test/spec/ol/extent.test.js b/test/spec/ol/extent.test.js
new file mode 100644
index 0000000..ee5c384
--- /dev/null
+++ b/test/spec/ol/extent.test.js
@@ -0,0 +1,568 @@
+goog.provide('ol.test.extent');
+
+describe('ol.extent', function() {
+
+  describe('buffer', function() {
+
+    it('buffers an extent by some value', function() {
+      var extent = [-10, -20, 10, 20];
+      expect(ol.extent.buffer(extent, 15)).to.eql([-25, -35, 25, 35]);
+    });
+
+  });
+
+  describe('clone', function() {
+
+    it('creates a copy of an extent', function() {
+      var extent = ol.extent.createOrUpdate(1, 2, 3, 4);
+      var clone = ol.extent.clone(extent);
+      expect(ol.extent.equals(extent, clone)).to.be(true);
+
+      ol.extent.extendCoordinate(extent, [10, 20]);
+      expect(ol.extent.equals(extent, clone)).to.be(false);
+    });
+
+  });
+
+  describe('getIntersection()', function() {
+    it('returns the intersection of two extents', function() {
+      var world = [-180, -90, 180, 90];
+      var north = [-180, 0, 180, 90];
+      var farNorth = [-180, 45, 180, 90];
+      var east = [0, -90, 180, 90];
+      var farEast = [90, -90, 180, 90];
+      var south = [-180, -90, 180, 0];
+      var farSouth = [-180, -90, 180, -45];
+      var west = [-180, -90, 0, 90];
+      var farWest = [-180, -90, -90, 90];
+      var none = ol.extent.createEmpty();
+      expect(ol.extent.getIntersection(world, none)).to.eql(none);
+      expect(ol.extent.getIntersection(world, north)).to.eql(north);
+      expect(ol.extent.getIntersection(world, east)).to.eql(east);
+      expect(ol.extent.getIntersection(world, south)).to.eql(south);
+      expect(ol.extent.getIntersection(world, west)).to.eql(west);
+      expect(ol.extent.getIntersection(farEast, farWest)).to.eql(none);
+      expect(ol.extent.getIntersection(farNorth, farSouth)).to.eql(none);
+      expect(ol.extent.getIntersection(north, west)).to.eql([-180, 0, 0, 90]);
+      expect(ol.extent.getIntersection(east, south)).to.eql([0, -90, 180, 0]);
+    });
+  });
+
+  describe('containsCoordinate', function() {
+
+    describe('positive', function() {
+      it('returns true', function() {
+        var extent = [1, 2, 3, 4];
+        expect(ol.extent.containsCoordinate(extent, [1, 2])).to.be.ok();
+        expect(ol.extent.containsCoordinate(extent, [1, 3])).to.be.ok();
+        expect(ol.extent.containsCoordinate(extent, [1, 4])).to.be.ok();
+        expect(ol.extent.containsCoordinate(extent, [2, 2])).to.be.ok();
+        expect(ol.extent.containsCoordinate(extent, [2, 3])).to.be.ok();
+        expect(ol.extent.containsCoordinate(extent, [2, 4])).to.be.ok();
+        expect(ol.extent.containsCoordinate(extent, [3, 2])).to.be.ok();
+        expect(ol.extent.containsCoordinate(extent, [3, 3])).to.be.ok();
+        expect(ol.extent.containsCoordinate(extent, [3, 4])).to.be.ok();
+      });
+    });
+
+    describe('negative', function() {
+      it('returns false', function() {
+        var extent = [1, 2, 3, 4];
+        expect(ol.extent.containsCoordinate(extent, [0, 1])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [0, 2])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [0, 3])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [0, 4])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [0, 5])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [1, 1])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [1, 5])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [2, 1])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [2, 5])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [3, 1])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [3, 5])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [4, 1])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [4, 2])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [4, 3])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [4, 4])).to.not.be();
+        expect(ol.extent.containsCoordinate(extent, [4, 5])).to.not.be();
+      });
+    });
+  });
+
+  describe('coordinateRelationship()', function() {
+
+    var extent = [-180, -90, 180, 90];
+    var INTERSECTING = ol.extent.Relationship.INTERSECTING;
+    var ABOVE = ol.extent.Relationship.ABOVE;
+    var RIGHT = ol.extent.Relationship.RIGHT;
+    var BELOW = ol.extent.Relationship.BELOW;
+    var LEFT = ol.extent.Relationship.LEFT;
+
+    it('returns intersecting for within', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [0, 0]);
+      expect(rel).to.be(INTERSECTING);
+    });
+
+    it('returns intersecting for touching top', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [0, 90]);
+      expect(rel).to.be(INTERSECTING);
+    });
+
+    it('returns intersecting for touching right', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [180, 0]);
+      expect(rel).to.be(INTERSECTING);
+    });
+
+    it('returns intersecting for touching bottom', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [0, -90]);
+      expect(rel).to.be(INTERSECTING);
+    });
+
+    it('returns intersecting for touching left', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [-180, 0]);
+      expect(rel).to.be(INTERSECTING);
+    });
+
+    it('above for north', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [0, 100]);
+      expect(rel).to.be(ABOVE);
+    });
+
+    it('above and right for northeast', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [190, 100]);
+      expect(rel & ABOVE).to.be(ABOVE);
+      expect(rel & RIGHT).to.be(RIGHT);
+    });
+
+    it('right for east', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [190, 0]);
+      expect(rel).to.be(RIGHT);
+    });
+
+    it('below and right for southeast', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [190, -100]);
+      expect(rel & BELOW).to.be(BELOW);
+      expect(rel & RIGHT).to.be(RIGHT);
+    });
+
+    it('below for south', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [0, -100]);
+      expect(rel).to.be(BELOW);
+    });
+
+    it('below and left for southwest', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [-190, -100]);
+      expect(rel & BELOW).to.be(BELOW);
+      expect(rel & LEFT).to.be(LEFT);
+    });
+
+    it('left for west', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [-190, 0]);
+      expect(rel).to.be(LEFT);
+    });
+
+    it('above and left for northwest', function() {
+      var rel = ol.extent.coordinateRelationship(extent, [-190, 100]);
+      expect(rel & ABOVE).to.be(ABOVE);
+      expect(rel & LEFT).to.be(LEFT);
+    });
+
+  });
+
+  describe('getCenter', function() {
+    it('returns the expected center', function() {
+      var extent = [1, 2, 3, 4];
+      var center = ol.extent.getCenter(extent);
+      expect(center[0]).to.eql(2);
+      expect(center[1]).to.eql(3);
+    });
+  });
+
+  describe('getCorner', function() {
+    var extent = [1, 2, 3, 4];
+
+    it('gets the bottom left', function() {
+      var corner = ol.extent.Corner.BOTTOM_LEFT;
+      expect(ol.extent.getCorner(extent, corner)).to.eql([1, 2]);
+    });
+
+    it('gets the bottom right', function() {
+      var corner = ol.extent.Corner.BOTTOM_RIGHT;
+      expect(ol.extent.getCorner(extent, corner)).to.eql([3, 2]);
+    });
+
+    it('gets the top left', function() {
+      var corner = ol.extent.Corner.TOP_LEFT;
+      expect(ol.extent.getCorner(extent, corner)).to.eql([1, 4]);
+    });
+
+    it('gets the top right', function() {
+      var corner = ol.extent.Corner.TOP_RIGHT;
+      expect(ol.extent.getCorner(extent, corner)).to.eql([3, 4]);
+    });
+
+  });
+
+  describe('getForViewAndSize', function() {
+
+    it('works for a unit square', function() {
+      var extent = ol.extent.getForViewAndSize(
+          [0, 0], 1, 0, [1, 1]);
+      expect(extent[0]).to.be(-0.5);
+      expect(extent[2]).to.be(0.5);
+      expect(extent[1]).to.be(-0.5);
+      expect(extent[3]).to.be(0.5);
+    });
+
+    it('works for center', function() {
+      var extent = ol.extent.getForViewAndSize(
+          [5, 10], 1, 0, [1, 1]);
+      expect(extent[0]).to.be(4.5);
+      expect(extent[2]).to.be(5.5);
+      expect(extent[1]).to.be(9.5);
+      expect(extent[3]).to.be(10.5);
+    });
+
+    it('works for rotation', function() {
+      var extent = ol.extent.getForViewAndSize(
+          [0, 0], 1, Math.PI / 4, [1, 1]);
+      expect(extent[0]).to.roughlyEqual(-Math.sqrt(0.5), 1e-9);
+      expect(extent[2]).to.roughlyEqual(Math.sqrt(0.5), 1e-9);
+      expect(extent[1]).to.roughlyEqual(-Math.sqrt(0.5), 1e-9);
+      expect(extent[3]).to.roughlyEqual(Math.sqrt(0.5), 1e-9);
+    });
+
+    it('works for resolution', function() {
+      var extent = ol.extent.getForViewAndSize(
+          [0, 0], 2, 0, [1, 1]);
+      expect(extent[0]).to.be(-1);
+      expect(extent[2]).to.be(1);
+      expect(extent[1]).to.be(-1);
+      expect(extent[3]).to.be(1);
+    });
+
+    it('works for size', function() {
+      var extent = ol.extent.getForViewAndSize(
+          [0, 0], 1, 0, [10, 5]);
+      expect(extent[0]).to.be(-5);
+      expect(extent[2]).to.be(5);
+      expect(extent[1]).to.be(-2.5);
+      expect(extent[3]).to.be(2.5);
+    });
+
+  });
+
+  describe('getSize', function() {
+    it('returns the expected size', function() {
+      var extent = [0, 1, 2, 4];
+      var size = ol.extent.getSize(extent);
+      expect(size).to.eql([2, 3]);
+    });
+  });
+
+  describe('intersects', function() {
+
+    it('returns the expected value', function() {
+      var intersects = ol.extent.intersects;
+      var extent = [50, 50, 100, 100];
+      expect(intersects(extent, extent)).to.be(true);
+      expect(intersects(extent, [20, 20, 80, 80])).to.be(true);
+      expect(intersects(extent, [20, 50, 80, 100])).to.be(true);
+      expect(intersects(extent, [20, 80, 80, 120])).to.be(true);
+      expect(intersects(extent, [50, 20, 100, 80])).to.be(true);
+      expect(intersects(extent, [50, 80, 100, 120])).to.be(true);
+      expect(intersects(extent, [80, 20, 120, 80])).to.be(true);
+      expect(intersects(extent, [80, 50, 120, 100])).to.be(true);
+      expect(intersects(extent, [80, 80, 120, 120])).to.be(true);
+      expect(intersects(extent, [20, 20, 120, 120])).to.be(true);
+      expect(intersects(extent, [70, 70, 80, 80])).to.be(true);
+      expect(intersects(extent, [10, 10, 30, 30])).to.be(false);
+      expect(intersects(extent, [30, 10, 70, 30])).to.be(false);
+      expect(intersects(extent, [50, 10, 100, 30])).to.be(false);
+      expect(intersects(extent, [80, 10, 120, 30])).to.be(false);
+      expect(intersects(extent, [120, 10, 140, 30])).to.be(false);
+      expect(intersects(extent, [10, 30, 30, 70])).to.be(false);
+      expect(intersects(extent, [120, 30, 140, 70])).to.be(false);
+      expect(intersects(extent, [10, 50, 30, 100])).to.be(false);
+      expect(intersects(extent, [120, 50, 140, 100])).to.be(false);
+      expect(intersects(extent, [10, 80, 30, 120])).to.be(false);
+      expect(intersects(extent, [120, 80, 140, 120])).to.be(false);
+      expect(intersects(extent, [10, 120, 30, 140])).to.be(false);
+      expect(intersects(extent, [30, 120, 70, 140])).to.be(false);
+      expect(intersects(extent, [50, 120, 100, 140])).to.be(false);
+      expect(intersects(extent, [80, 120, 120, 140])).to.be(false);
+      expect(intersects(extent, [120, 120, 140, 140])).to.be(false);
+    });
+  });
+
+  describe('touches', function() {
+
+    it('returns the expected value', function() {
+      var touches = ol.extent.touches;
+      var extent = [50, 50, 100, 100];
+      expect(touches(extent, [20, 20, 80, 80])).to.be(false);
+      expect(touches(extent, [20, 20, 50, 80])).to.be(true);
+      expect(touches(extent, [20, 20, 50, 40])).to.be(false);
+      expect(touches(extent, [100, 20, 140, 80])).to.be(true);
+      expect(touches(extent, [100, 20, 140, 40])).to.be(false);
+      expect(touches(extent, [20, 20, 80, 50])).to.be(true);
+      expect(touches(extent, [20, 20, 40, 50])).to.be(false);
+      expect(touches(extent, [20, 100, 80, 140])).to.be(true);
+      expect(touches(extent, [20, 100, 40, 140])).to.be(false);
+    });
+  });
+
+  describe('normalize', function() {
+    it('returns the expected coordinate', function() {
+      var extent = [0, 1, 2, 3];
+      var coordinate;
+
+      coordinate = ol.extent.normalize(extent, [1, 2]);
+      expect(coordinate[0]).to.eql(0.5);
+      expect(coordinate[1]).to.eql(0.5);
+
+      coordinate = ol.extent.normalize(extent, [0, 3]);
+      expect(coordinate[0]).to.eql(0);
+      expect(coordinate[1]).to.eql(1);
+
+      coordinate = ol.extent.normalize(extent, [2, 1]);
+      expect(coordinate[0]).to.eql(1);
+      expect(coordinate[1]).to.eql(0);
+
+      coordinate = ol.extent.normalize(extent, [0, 0]);
+      expect(coordinate[0]).to.eql(0);
+      expect(coordinate[1]).to.eql(-0.5);
+
+      coordinate = ol.extent.normalize(extent, [-1, 1]);
+      expect(coordinate[0]).to.eql(-0.5);
+      expect(coordinate[1]).to.eql(0);
+    });
+  });
+
+  describe('scaleFromCenter', function() {
+    it('scales the extent from its center', function() {
+      var extent = [1, 1, 3, 3];
+      ol.extent.scaleFromCenter(extent, 2);
+      expect(extent[0]).to.eql(0);
+      expect(extent[2]).to.eql(4);
+      expect(extent[1]).to.eql(0);
+      expect(extent[3]).to.eql(4);
+    });
+  });
+
+  describe('intersectsSegment()', function() {
+
+    var extent = [-180, -90, 180, 90];
+    var north = [0, 100];
+    var northeast = [190, 100];
+    var east = [190, 0];
+    var southeast = [190, -100];
+    var south = [0, -100];
+    var southwest = [-190, -100];
+    var west = [-190, 0];
+    var northwest = [-190, 100];
+    var center = [0, 0];
+    var top = [0, 90];
+    var right = [180, 0];
+    var bottom = [-90, 0];
+    var left = [-180, 0];
+    var inside = [10, 10];
+
+    it('returns true if contained', function() {
+      var intersects = ol.extent.intersectsSegment(extent, center, inside);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses top', function() {
+      var intersects = ol.extent.intersectsSegment(extent, center, north);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses right', function() {
+      var intersects = ol.extent.intersectsSegment(extent, center, east);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses bottom', function() {
+      var intersects = ol.extent.intersectsSegment(extent, center, south);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses left', function() {
+      var intersects = ol.extent.intersectsSegment(extent, center, west);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns false if above', function() {
+      var intersects = ol.extent.intersectsSegment(extent, northwest, north);
+      expect(intersects).to.be(false);
+    });
+
+    it('returns false if right', function() {
+      var intersects = ol.extent.intersectsSegment(extent, northeast, east);
+      expect(intersects).to.be(false);
+    });
+
+    it('returns false if below', function() {
+      var intersects = ol.extent.intersectsSegment(extent, south, southwest);
+      expect(intersects).to.be(false);
+    });
+
+    it('returns false if left', function() {
+      var intersects = ol.extent.intersectsSegment(extent, west, southwest);
+      expect(intersects).to.be(false);
+    });
+
+    it('returns true if crosses top to bottom', function() {
+      var intersects = ol.extent.intersectsSegment(extent, north, south);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses bottom to top', function() {
+      var intersects = ol.extent.intersectsSegment(extent, south, north);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses left to right', function() {
+      var intersects = ol.extent.intersectsSegment(extent, west, east);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses right to left', function() {
+      var intersects = ol.extent.intersectsSegment(extent, east, west);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses northwest to east', function() {
+      var intersects = ol.extent.intersectsSegment(extent, northwest, east);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if crosses south to west', function() {
+      var intersects = ol.extent.intersectsSegment(extent, south, west);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if touches top', function() {
+      var intersects = ol.extent.intersectsSegment(extent, northwest, top);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if touches right', function() {
+      var intersects = ol.extent.intersectsSegment(extent, southeast, right);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if touches bottom', function() {
+      var intersects = ol.extent.intersectsSegment(extent, bottom, south);
+      expect(intersects).to.be(true);
+    });
+
+    it('returns true if touches left', function() {
+      var intersects = ol.extent.intersectsSegment(extent, left, west);
+      expect(intersects).to.be(true);
+    });
+
+    it('works for zero length inside', function() {
+      var intersects = ol.extent.intersectsSegment(extent, center, center);
+      expect(intersects).to.be(true);
+    });
+
+    it('works for zero length outside', function() {
+      var intersects = ol.extent.intersectsSegment(extent, north, north);
+      expect(intersects).to.be(false);
+    });
+
+  });
+
+  describe('#applyTransform()', function() {
+
+    it('does transform', function() {
+      var transformFn = ol.proj.getTransform('EPSG:4326', 'EPSG:3857');
+      var sourceExtent = [-15, -30, 45, 60];
+      var destinationExtent = ol.extent.applyTransform(
+          sourceExtent, transformFn);
+      expect(destinationExtent).not.to.be(undefined);
+      expect(destinationExtent).not.to.be(null);
+      // FIXME check values with third-party tool
+      expect(destinationExtent[0])
+          .to.roughlyEqual(-1669792.3618991037, 1e-9);
+      expect(destinationExtent[2]).to.roughlyEqual(5009377.085697311, 1e-9);
+      expect(destinationExtent[1]).to.roughlyEqual(-3503549.843504376, 1e-8);
+      expect(destinationExtent[3]).to.roughlyEqual(8399737.889818361, 1e-8);
+    });
+
+    it('takes arbitrary function', function() {
+      var transformFn = function(input, output, opt_dimension) {
+        var dimension = goog.isDef(opt_dimension) ? opt_dimension : 2;
+        if (!goog.isDef(output)) {
+          output = new Array(input.length);
+        }
+        var n = input.length;
+        var i;
+        for (i = 0; i < n; i += dimension) {
+          output[i] = -input[i];
+          output[i + 1] = -input[i + 1];
+        }
+        return output;
+      };
+      var sourceExtent = [-15, -30, 45, 60];
+      var destinationExtent = ol.extent.applyTransform(
+          sourceExtent, transformFn);
+      expect(destinationExtent).not.to.be(undefined);
+      expect(destinationExtent).not.to.be(null);
+      expect(destinationExtent[0]).to.be(-45);
+      expect(destinationExtent[2]).to.be(15);
+      expect(destinationExtent[1]).to.be(-60);
+      expect(destinationExtent[3]).to.be(30);
+    });
+
+  });
+
+  describe('transform2D()', function() {
+
+    var extent;
+    beforeEach(function() {
+      extent = [-180, -90, 180, 90];
+    });
+
+    it('applies a translate transform', function() {
+      var mat = goog.vec.Mat4.createNumber();
+      goog.vec.Mat4.makeTranslate(mat, 10, 20, 0);
+      var transformed = ol.extent.transform2D(extent, mat);
+      expect(transformed).to.eql([-170, -70, 190, 110]);
+    });
+
+    it('applies a rotate transform', function() {
+      var mat = goog.vec.Mat4.createNumber();
+      goog.vec.Mat4.makeRotateZ(mat, Math.PI / 2);
+      var transformed = ol.extent.transform2D(extent, mat);
+      expect(transformed[0]).to.roughlyEqual(-90, 1e-5);
+      expect(transformed[1]).to.roughlyEqual(-180, 1e-5);
+      expect(transformed[2]).to.roughlyEqual(90, 1e-5);
+      expect(transformed[3]).to.roughlyEqual(180, 1e-5);
+    });
+
+    it('does not modify original', function() {
+      var mat = goog.vec.Mat4.createNumber();
+      goog.vec.Mat4.makeRotateZ(mat, Math.PI / 2);
+      ol.extent.transform2D(extent, mat);
+      expect(extent).to.eql([-180, -90, 180, 90]);
+    });
+
+    it('accepts an extent to modify', function() {
+      var mat = goog.vec.Mat4.createNumber();
+      goog.vec.Mat4.makeScale(mat, 2, 0.5);
+      ol.extent.transform2D(extent, mat, extent);
+      expect(extent).to.eql([-360, -45, 360, 45]);
+    });
+
+  });
+
+});
+
+
+goog.require('goog.vec.Mat4');
+goog.require('ol.extent');
+goog.require('ol.extent.Corner');
+goog.require('ol.extent.Relationship');
+goog.require('ol.proj');
diff --git a/test/spec/ol/feature.test.js b/test/spec/ol/feature.test.js
new file mode 100644
index 0000000..ef61378
--- /dev/null
+++ b/test/spec/ol/feature.test.js
@@ -0,0 +1,457 @@
+goog.provide('ol.test.Feature');
+
+describe('ol.Feature', function() {
+
+  describe('constructor', function() {
+
+    it('creates a new feature', function() {
+      var feature = new ol.Feature();
+      expect(feature).to.be.a(ol.Feature);
+    });
+
+    it('takes properties', function() {
+      var feature = new ol.Feature({
+        foo: 'bar'
+      });
+      expect(feature.get('foo')).to.be('bar');
+    });
+
+    it('can store the feature\'s commonly used id', function() {
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      expect(feature.getId()).to.be('foo');
+    });
+
+    it('will set the default geometry', function() {
+      var feature = new ol.Feature({
+        geometry: new ol.geom.Point([10, 20]),
+        foo: 'bar'
+      });
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.a(ol.geom.Point);
+      expect(feature.get('geometry')).to.be(geometry);
+    });
+
+  });
+
+  describe('#get()', function() {
+
+    it('returns values set at construction', function() {
+      var feature = new ol.Feature({
+        a: 'first',
+        b: 'second'
+      });
+      expect(feature.get('a')).to.be('first');
+      expect(feature.get('b')).to.be('second');
+    });
+
+    it('returns undefined for unset attributes', function() {
+      var feature = new ol.Feature();
+      expect(feature.get('a')).to.be(undefined);
+    });
+
+    it('returns values set by set', function() {
+      var feature = new ol.Feature();
+      feature.set('a', 'b');
+      expect(feature.get('a')).to.be('b');
+    });
+
+  });
+
+  describe('#getProperties()', function() {
+
+    it('returns an object with all attributes', function() {
+      var point = new ol.geom.Point([15, 30]);
+      var feature = new ol.Feature({
+        foo: 'bar',
+        ten: 10,
+        geometry: point
+      });
+
+      var attributes = feature.getProperties();
+
+      var keys = goog.object.getKeys(attributes);
+      expect(keys.sort()).to.eql(['foo', 'geometry', 'ten']);
+
+      expect(attributes.foo).to.be('bar');
+      expect(attributes.geometry).to.be(point);
+      expect(attributes.ten).to.be(10);
+    });
+
+    it('is empty by default', function() {
+      var feature = new ol.Feature();
+      var properties = feature.getProperties();
+      expect(goog.object.isEmpty(properties)).to.be(true);
+    });
+
+  });
+
+
+  describe('#getGeometry()', function() {
+
+    var point = new ol.geom.Point([15, 30]);
+
+    it('returns undefined for unset geometry', function() {
+      var feature = new ol.Feature();
+      expect(feature.getGeometry()).to.be(undefined);
+    });
+
+    it('returns null for null geometry (constructor)', function() {
+      var feature = new ol.Feature(null);
+      expect(feature.getGeometry()).to.be(null);
+    });
+
+    it('returns null for null geometry (setGeometry())', function() {
+      var feature = new ol.Feature();
+      feature.setGeometry(null);
+      expect(feature.getGeometry()).to.be(null);
+    });
+
+    it('gets the geometry set at construction', function() {
+      var feature = new ol.Feature({
+        geometry: point
+      });
+      expect(feature.getGeometry()).to.be(point);
+    });
+
+    it('gets any geometry set by setGeometry', function() {
+      var feature = new ol.Feature();
+      feature.setGeometry(point);
+      expect(feature.getGeometry()).to.be(point);
+
+      var point2 = new ol.geom.Point([1, 2]);
+      feature.setGeometry(point2);
+      expect(feature.getGeometry()).to.be(point2);
+    });
+
+  });
+
+  describe('#set()', function() {
+
+    it('sets values', function() {
+      var feature = new ol.Feature({
+        a: 'first',
+        b: 'second'
+      });
+      feature.set('a', 'new');
+      expect(feature.get('a')).to.be('new');
+    });
+
+    it('can be used to set the geometry', function() {
+      var point = new ol.geom.Point([3, 4]);
+      var feature = new ol.Feature({
+        geometry: new ol.geom.Point([1, 2])
+      });
+      feature.set('geometry', point);
+      expect(feature.get('geometry')).to.be(point);
+      expect(feature.getGeometry()).to.be(point);
+    });
+
+    it('can be used to set attributes with arbitrary names', function() {
+
+      var feature = new ol.Feature();
+
+      feature.set('toString', 'string');
+      expect(feature.get('toString')).to.be('string');
+      expect(typeof feature.toString).to.be('function');
+
+      feature.set('getGeometry', 'x');
+      expect(feature.get('getGeometry')).to.be('x');
+
+      feature.set('geometry', new ol.geom.Point([1, 2]));
+      expect(feature.getGeometry()).to.be.a(ol.geom.Point);
+
+    });
+
+  });
+
+  describe('#setGeometry()', function() {
+
+    var point = new ol.geom.Point([15, 30]);
+
+    it('sets the default geometry', function() {
+      var feature = new ol.Feature();
+      feature.setGeometry(point);
+      expect(feature.get('geometry')).to.be(point);
+    });
+
+    it('replaces previous default geometry', function() {
+      var feature = new ol.Feature({
+        geometry: point
+      });
+      expect(feature.getGeometry()).to.be(point);
+
+      var point2 = new ol.geom.Point([1, 2]);
+      feature.setGeometry(point2);
+      expect(feature.getGeometry()).to.be(point2);
+    });
+
+  });
+
+  describe('#setGeometryName()', function() {
+
+    var point = new ol.geom.Point([15, 30]);
+
+    it('sets property where to to look at geometry', function() {
+      var feature = new ol.Feature();
+      feature.setGeometry(point);
+      expect(feature.getGeometry()).to.be(point);
+
+      var point2 = new ol.geom.Point([1, 2]);
+      feature.set('altGeometry', point2);
+      expect(feature.getGeometry()).to.be(point);
+      feature.setGeometryName('altGeometry');
+      expect(feature.getGeometry()).to.be(point2);
+
+      feature.on('change', function() {
+        expect.fail();
+      });
+      point.setCoordinates([0, 2]);
+    });
+
+    it('changes property listener', function(done) {
+      var feature = new ol.Feature();
+      feature.setGeometry(point);
+      var point2 = new ol.geom.Point([1, 2]);
+      feature.set('altGeometry', point2);
+      feature.setGeometryName('altGeometry');
+
+      feature.on('change', function() {
+        done();
+      });
+      point2.setCoordinates([0, 2]);
+    });
+
+    it('can use a different geometry name', function() {
+      var feature = new ol.Feature();
+      feature.setGeometryName('foo');
+      var point = new ol.geom.Point([10, 20]);
+      feature.setGeometry(point);
+      expect(feature.getGeometry()).to.be(point);
+    });
+
+  });
+
+  describe('#setId()', function() {
+
+    it('sets the feature identifier', function() {
+      var feature = new ol.Feature();
+      expect(feature.getId()).to.be(undefined);
+      feature.setId('foo');
+      expect(feature.getId()).to.be('foo');
+    });
+
+    it('accepts a string or number', function() {
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      expect(feature.getId()).to.be('foo');
+      feature.setId(2);
+      expect(feature.getId()).to.be(2);
+    });
+
+    it('dispatches the "change" event', function(done) {
+      var feature = new ol.Feature();
+      feature.on('change', function() {
+        expect(feature.getId()).to.be('foo');
+        done();
+      });
+      feature.setId('foo');
+    });
+
+  });
+
+  describe('#getStyleFunction()', function() {
+
+    var styleFunction = function(resolution) {
+      return null;
+    };
+
+    it('returns undefined after construction', function() {
+      var feature = new ol.Feature();
+      expect(feature.getStyleFunction()).to.be(undefined);
+    });
+
+    it('returns the function passed to setStyle', function() {
+      var feature = new ol.Feature();
+      feature.setStyle(styleFunction);
+      expect(feature.getStyleFunction()).to.be(styleFunction);
+    });
+
+    it('does not get confused with user "styleFunction" property', function() {
+      var feature = new ol.Feature();
+      feature.set('styleFunction', 'foo');
+      expect(feature.getStyleFunction()).to.be(undefined);
+    });
+
+    it('does not get confused with "styleFunction" option', function() {
+      var feature = new ol.Feature({
+        styleFunction: 'foo'
+      });
+      expect(feature.getStyleFunction()).to.be(undefined);
+    });
+
+  });
+
+  describe('#setStyle()', function() {
+
+    var style = new ol.style.Style();
+
+    var styleFunction = function(feature, resolution) {
+      return null;
+    };
+
+    it('accepts a single style', function() {
+      var feature = new ol.Feature();
+      feature.setStyle(style);
+      var func = feature.getStyleFunction();
+      expect(func()).to.eql([style]);
+    });
+
+    it('accepts an array of styles', function() {
+      var feature = new ol.Feature();
+      feature.setStyle([style]);
+      var func = feature.getStyleFunction();
+      expect(func()).to.eql([style]);
+    });
+
+    it('accepts a style function', function() {
+      var feature = new ol.Feature();
+      feature.setStyle(styleFunction);
+      expect(feature.getStyleFunction()).to.be(styleFunction);
+    });
+
+    it('accepts null', function() {
+      var feature = new ol.Feature();
+      feature.setStyle(style);
+      feature.setStyle(null);
+      expect(feature.getStyle()).to.be(null);
+      expect(feature.getStyleFunction()).to.be(undefined);
+    });
+
+    it('dispatches a change event', function(done) {
+      var feature = new ol.Feature();
+      feature.on('change', function() {
+        done();
+      });
+      feature.setStyle(style);
+    });
+
+  });
+
+  describe('#getStyle()', function() {
+
+    var style = new ol.style.Style();
+
+    var styleFunction = function(resolution) {
+      return null;
+    };
+
+    it('returns what is passed to setStyle', function() {
+      var feature = new ol.Feature();
+
+      expect(feature.getStyle()).to.be(null);
+
+      feature.setStyle(style);
+      expect(feature.getStyle()).to.be(style);
+
+      feature.setStyle([style]);
+      expect(feature.getStyle()).to.eql([style]);
+
+      feature.setStyle(styleFunction);
+      expect(feature.getStyle()).to.be(styleFunction);
+
+    });
+
+    it('does not get confused with "style" option to constructor', function() {
+      var feature = new ol.Feature({
+        style: 'foo'
+      });
+
+      expect(feature.getStyle()).to.be(null);
+    });
+
+    it('does not get confused with user set "style" property', function() {
+      var feature = new ol.Feature();
+      feature.set('style', 'foo');
+
+      expect(feature.getStyle()).to.be(null);
+    });
+
+  });
+
+  describe('#clone', function() {
+
+    it('correctly clones features', function() {
+      var feature = new ol.Feature();
+      feature.setProperties({'fookey': 'fooval'});
+      feature.setId(1);
+      feature.setGeometryName('geom');
+      var geometry = new ol.geom.Point([1, 2]);
+      feature.setGeometry(geometry);
+      var style = new ol.style.Style({});
+      feature.setStyle(style);
+      feature.set('barkey', 'barval');
+
+      var clone = feature.clone();
+      expect(clone.get('fookey')).to.be('fooval');
+      expect(clone.getId()).to.be(undefined);
+      expect(clone.getGeometryName()).to.be('geom');
+      var geometryClone = clone.getGeometry();
+      expect(geometryClone).not.to.be(geometry);
+      var coordinates = geometryClone.getFlatCoordinates();
+      expect(coordinates[0]).to.be(1);
+      expect(coordinates[1]).to.be(2);
+      expect(clone.getStyle()).to.be(style);
+      expect(clone.get('barkey')).to.be('barval');
+    });
+
+    it('correctly clones features with no geometry and no style', function() {
+      var feature = new ol.Feature();
+      feature.set('fookey', 'fooval');
+
+      var clone = feature.clone();
+      expect(clone.get('fookey')).to.be('fooval');
+      expect(clone.getGeometry()).to.be(undefined);
+      expect(clone.getStyle()).to.be(null);
+    });
+  });
+
+
+});
+
+describe('ol.feature.createFeatureStyleFunction()', function() {
+  var style = new ol.style.Style();
+
+  it('creates a feature style function from a single style', function() {
+    var styleFunction = ol.feature.createFeatureStyleFunction(style);
+    expect(styleFunction()).to.eql([style]);
+  });
+
+  it('creates a feature style function from an array of styles', function() {
+    var styleFunction = ol.feature.createFeatureStyleFunction([style]);
+    expect(styleFunction()).to.eql([style]);
+  });
+
+  it('passes through a function', function() {
+    var original = function() {
+      return [style];
+    };
+    var styleFunction = ol.feature.createFeatureStyleFunction(original);
+    expect(styleFunction).to.be(original);
+  });
+
+  it('throws on (some) unexpected input', function() {
+    expect(function() {
+      ol.feature.createFeatureStyleFunction({bogus: 'input'});
+    }).to.throwException();
+  });
+
+});
+
+
+goog.require('goog.events');
+goog.require('goog.object');
+goog.require('ol.Feature');
+goog.require('ol.feature');
+goog.require('ol.geom.Point');
+goog.require('ol.style.Style');
diff --git a/test/spec/ol/featureoverlay.test.js b/test/spec/ol/featureoverlay.test.js
new file mode 100644
index 0000000..47aa061
--- /dev/null
+++ b/test/spec/ol/featureoverlay.test.js
@@ -0,0 +1,34 @@
+goog.provide('ol.test.FeatureOverlay');
+
+describe('ol.FeatureOverlay', function() {
+
+  describe('constructor', function() {
+
+    it('creates an new feature overlay', function() {
+      var featureOverlay = new ol.FeatureOverlay();
+      expect(featureOverlay).to.be.a(ol.FeatureOverlay);
+    });
+
+    it('takes features', function() {
+      var featureOverlay = new ol.FeatureOverlay({
+        features: [new ol.Feature(new ol.geom.Point([0, 0]))]
+      });
+      expect(featureOverlay.getFeatures().getLength()).to.be(1);
+    });
+
+    it('takes a style', function() {
+      var style = [new ol.style.Style()];
+      var featureOverlay = new ol.FeatureOverlay({
+        style: [new ol.style.Style()]
+      });
+      expect(featureOverlay.getStyle()).to.eql(style);
+      expect(featureOverlay.getStyleFunction()()).to.eql(style);
+    });
+
+  });
+});
+
+goog.require('ol.Feature');
+goog.require('ol.FeatureOverlay');
+goog.require('ol.geom.Point');
+goog.require('ol.style.Style');
diff --git a/test/spec/ol/format/geojson/countries.geojson b/test/spec/ol/format/geojson/countries.geojson
new file mode 100644
index 0000000..b27f2ec
--- /dev/null
+++ b/test/spec/ol/format/geojson/countries.geojson
@@ -0,0 +1,181 @@
+{"type":"FeatureCollection","features":[
+{"type":"Feature","id":"AFG","properties":{"name":"Afghanistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[62.230651,35.270664],[62.984662,35.404041],[63.193538,35.857166],[63.982896,36.007957],[64.546479,36.312073],[64.746105,37.111818],[65.588948,37.305217],[65.745631,37.661164],[66.217385,37.39379],[66.518607,37.362784],[67.075782,37.356144],[67.83,37.144994],[68.135562,37.023115],[68.859446,37.344336],[69.196273,37.151144],[69.518785,37.608997],[70.116578,37 [...]
+{"type":"Feature","id":"AGO","properties":{"name":"Angola"},"geometry":{"type":"MultiPolygon","coordinates":[[[[16.326528,-5.87747],[16.57318,-6.622645],[16.860191,-7.222298],[17.089996,-7.545689],[17.47297,-8.068551],[18.134222,-7.987678],[18.464176,-7.847014],[19.016752,-7.988246],[19.166613,-7.738184],[19.417502,-7.155429],[20.037723,-7.116361],[20.091622,-6.94309],[20.601823,-6.939318],[20.514748,-7.299606],[21.728111,-7.290872],[21.746456,-7.920085],[21.949131,-8.305901],[21.801801, [...]
+{"type":"Feature","id":"ALB","properties":{"name":"Albania"},"geometry":{"type":"Polygon","coordinates":[[[20.590247,41.855404],[20.463175,41.515089],[20.605182,41.086226],[21.02004,40.842727],[20.99999,40.580004],[20.674997,40.435],[20.615,40.110007],[20.150016,39.624998],[19.98,39.694993],[19.960002,39.915006],[19.406082,40.250773],[19.319059,40.72723],[19.40355,41.409566],[19.540027,41.719986],[19.371769,41.877548],[19.304486,42.195745],[19.738051,42.688247],[19.801613,42.500093],[20. [...]
+{"type":"Feature","id":"ARE","properties":{"name":"United Arab Emirates"},"geometry":{"type":"Polygon","coordinates":[[[51.579519,24.245497],[51.757441,24.294073],[51.794389,24.019826],[52.577081,24.177439],[53.404007,24.151317],[54.008001,24.121758],[54.693024,24.797892],[55.439025,25.439145],[56.070821,26.055464],[56.261042,25.714606],[56.396847,24.924732],[55.886233,24.920831],[55.804119,24.269604],[55.981214,24.130543],[55.528632,23.933604],[55.525841,23.524869],[55.234489,23.110993] [...]
+{"type":"Feature","id":"ARG","properties":{"name":"Argentina"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-65.5,-55.2],[-66.45,-55.25],[-66.95992,-54.89681],[-67.56244,-54.87001],[-68.63335,-54.8695],[-68.63401,-52.63637],[-68.25,-53.1],[-67.75,-53.85],[-66.45,-54.45],[-65.05,-54.7],[-65.5,-55.2]]],[[[-64.964892,-22.075862],[-64.377021,-22.798091],[-63.986838,-21.993644],[-62.846468,-22.034985],[-62.685057,-22.249029],[-60.846565,-23.880713],[-60.028966,-24.032796],[-58.807128,- [...]
+{"type":"Feature","id":"ARM","properties":{"name":"Armenia"},"geometry":{"type":"Polygon","coordinates":[[[43.582746,41.092143],[44.97248,41.248129],[45.179496,40.985354],[45.560351,40.81229],[45.359175,40.561504],[45.891907,40.218476],[45.610012,39.899994],[46.034534,39.628021],[46.483499,39.464155],[46.50572,38.770605],[46.143623,38.741201],[45.735379,39.319719],[45.739978,39.473999],[45.298145,39.471751],[45.001987,39.740004],[44.79399,39.713003],[44.400009,40.005],[43.656436,40.25356 [...]
+{"type":"Feature","id":"ATA","properties":{"name":"Antarctica"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-59.572095,-80.040179],[-59.865849,-80.549657],[-60.159656,-81.000327],[-62.255393,-80.863178],[-64.488125,-80.921934],[-65.741666,-80.588827],[-65.741666,-80.549657],[-66.290031,-80.255773],[-64.037688,-80.294944],[-61.883246,-80.39287],[-61.138976,-79.981371],[-60.610119,-79.628679],[-59.572095,-80.040179]]],[[[-159.208184,-79.497059],[-161.127601,-79.634209],[-162.439847 [...]
+{"type":"Feature","id":"ATF","properties":{"name":"French Southern and Antarctic Lands"},"geometry":{"type":"Polygon","coordinates":[[[68.935,-48.625],[69.58,-48.94],[70.525,-49.065],[70.56,-49.255],[70.28,-49.71],[68.745,-49.775],[68.72,-49.2425],[68.8675,-48.83],[68.935,-48.625]]]}},
+{"type":"Feature","id":"AUS","properties":{"name":"Australia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[145.397978,-40.792549],[146.364121,-41.137695],[146.908584,-41.000546],[147.689259,-40.808258],[148.289068,-40.875438],[148.359865,-42.062445],[148.017301,-42.407024],[147.914052,-43.211522],[147.564564,-42.937689],[146.870343,-43.634597],[146.663327,-43.580854],[146.048378,-43.549745],[145.43193,-42.693776],[145.29509,-42.03361],[144.718071,-41.162552],[144.743755,-40.70397 [...]
+{"type":"Feature","id":"AUT","properties":{"name":"Austria"},"geometry":{"type":"Polygon","coordinates":[[[16.979667,48.123497],[16.903754,47.714866],[16.340584,47.712902],[16.534268,47.496171],[16.202298,46.852386],[16.011664,46.683611],[15.137092,46.658703],[14.632472,46.431817],[13.806475,46.509306],[12.376485,46.767559],[12.153088,47.115393],[11.164828,46.941579],[11.048556,46.751359],[10.442701,46.893546],[9.932448,46.920728],[9.47997,47.10281],[9.632932,47.347601],[9.594226,47.5250 [...]
+{"type":"Feature","id":"AZE","properties":{"name":"Azerbaijan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[45.001987,39.740004],[45.298145,39.471751],[45.739978,39.473999],[45.735379,39.319719],[46.143623,38.741201],[45.457722,38.874139],[44.952688,39.335765],[44.79399,39.713003],[45.001987,39.740004]]],[[[47.373315,41.219732],[47.815666,41.151416],[47.987283,41.405819],[48.584353,41.80887],[49.110264,41.282287],[49.618915,40.572924],[50.08483,40.526157],[50.392821,40.256561],[4 [...]
+{"type":"Feature","id":"BDI","properties":{"name":"Burundi"},"geometry":{"type":"Polygon","coordinates":[[[29.339998,-4.499983],[29.276384,-3.293907],[29.024926,-2.839258],[29.632176,-2.917858],[29.938359,-2.348487],[30.469696,-2.413858],[30.527677,-2.807632],[30.743013,-3.034285],[30.752263,-3.35933],[30.50556,-3.568567],[30.116333,-4.090138],[29.753512,-4.452389],[29.339998,-4.499983]]]}},
+{"type":"Feature","id":"BEL","properties":{"name":"Belgium"},"geometry":{"type":"Polygon","coordinates":[[[3.314971,51.345781],[4.047071,51.267259],[4.973991,51.475024],[5.606976,51.037298],[6.156658,50.803721],[6.043073,50.128052],[5.782417,50.090328],[5.674052,49.529484],[4.799222,49.985373],[4.286023,49.907497],[3.588184,50.378992],[3.123252,50.780363],[2.658422,50.796848],[2.513573,51.148506],[3.314971,51.345781]]]}},
+{"type":"Feature","id":"BEN","properties":{"name":"Benin"},"geometry":{"type":"Polygon","coordinates":[[[2.691702,6.258817],[1.865241,6.142158],[1.618951,6.832038],[1.664478,9.12859],[1.463043,9.334624],[1.425061,9.825395],[1.077795,10.175607],[0.772336,10.470808],[0.899563,10.997339],[1.24347,11.110511],[1.447178,11.547719],[1.935986,11.64115],[2.154474,11.94015],[2.490164,12.233052],[2.848643,12.235636],[3.61118,11.660167],[3.572216,11.327939],[3.797112,10.734746],[3.60007,10.332186],[ [...]
+{"type":"Feature","id":"BFA","properties":{"name":"Burkina Faso"},"geometry":{"type":"Polygon","coordinates":[[[-2.827496,9.642461],[-3.511899,9.900326],[-3.980449,9.862344],[-4.330247,9.610835],[-4.779884,9.821985],[-4.954653,10.152714],[-5.404342,10.370737],[-5.470565,10.95127],[-5.197843,11.375146],[-5.220942,11.713859],[-4.427166,12.542646],[-4.280405,13.228444],[-4.006391,13.472485],[-3.522803,13.337662],[-3.103707,13.541267],[-2.967694,13.79815],[-2.191825,14.246418],[-2.001035,14. [...]
+{"type":"Feature","id":"BGD","properties":{"name":"Bangladesh"},"geometry":{"type":"Polygon","coordinates":[[[92.672721,22.041239],[92.652257,21.324048],[92.303234,21.475485],[92.368554,20.670883],[92.082886,21.192195],[92.025215,21.70157],[91.834891,22.182936],[91.417087,22.765019],[90.496006,22.805017],[90.586957,22.392794],[90.272971,21.836368],[89.847467,22.039146],[89.70205,21.857116],[89.418863,21.966179],[89.031961,22.055708],[88.876312,22.879146],[88.52977,23.631142],[88.69994,24 [...]
+{"type":"Feature","id":"BGR","properties":{"name":"Bulgaria"},"geometry":{"type":"Polygon","coordinates":[[[22.65715,44.234923],[22.944832,43.823785],[23.332302,43.897011],[24.100679,43.741051],[25.569272,43.688445],[26.065159,43.943494],[27.2424,44.175986],[27.970107,43.812468],[28.558081,43.707462],[28.039095,43.293172],[27.673898,42.577892],[27.99672,42.007359],[27.135739,42.141485],[26.117042,41.826905],[26.106138,41.328899],[25.197201,41.234486],[24.492645,41.583896],[23.692074,41.3 [...]
+{"type":"Feature","id":"BHS","properties":{"name":"The Bahamas"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-77.53466,23.75975],[-77.78,23.71],[-78.03405,24.28615],[-78.40848,24.57564],[-78.19087,25.2103],[-77.89,25.17],[-77.54,24.34],[-77.53466,23.75975]]],[[[-77.82,26.58],[-78.91,26.42],[-78.98,26.79],[-78.51,26.87],[-77.85,26.84],[-77.82,26.58]]],[[[-77,26.59],[-77.17255,25.87918],[-77.35641,26.00735],[-77.34,26.53],[-77.78802,26.92516],[-77.79,27.04],[-77,26.59]]]]}},
+{"type":"Feature","id":"BIH","properties":{"name":"Bosnia and Herzegovina"},"geometry":{"type":"Polygon","coordinates":[[[19.005486,44.860234],[19.36803,44.863],[19.11761,44.42307],[19.59976,44.03847],[19.454,43.5681],[19.21852,43.52384],[19.03165,43.43253],[18.70648,43.20011],[18.56,42.65],[17.674922,43.028563],[17.297373,43.446341],[16.916156,43.667722],[16.456443,44.04124],[16.23966,44.351143],[15.750026,44.818712],[15.959367,45.233777],[16.318157,45.004127],[16.534939,45.211608],[17. [...]
+{"type":"Feature","id":"BLR","properties":{"name":"Belarus"},"geometry":{"type":"Polygon","coordinates":[[[23.484128,53.912498],[24.450684,53.905702],[25.536354,54.282423],[25.768433,54.846963],[26.588279,55.167176],[26.494331,55.615107],[27.10246,55.783314],[28.176709,56.16913],[29.229513,55.918344],[29.371572,55.670091],[29.896294,55.789463],[30.873909,55.550976],[30.971836,55.081548],[30.757534,54.811771],[31.384472,54.157056],[31.791424,53.974639],[31.731273,53.794029],[32.405599,53. [...]
+{"type":"Feature","id":"BLZ","properties":{"name":"Belize"},"geometry":{"type":"Polygon","coordinates":[[[-89.14308,17.808319],[-89.150909,17.955468],[-89.029857,18.001511],[-88.848344,17.883198],[-88.490123,18.486831],[-88.300031,18.499982],[-88.296336,18.353273],[-88.106813,18.348674],[-88.123479,18.076675],[-88.285355,17.644143],[-88.197867,17.489475],[-88.302641,17.131694],[-88.239518,17.036066],[-88.355428,16.530774],[-88.551825,16.265467],[-88.732434,16.233635],[-88.930613,15.88727 [...]
+{"type":"Feature","id":"BMU","properties":{"name":"Bermuda"},"geometry":{"type":"Polygon","coordinates":[[[-64.7799734332998,32.3072000581802],[-64.7873319183061,32.3039237143428],[-64.7946942710173,32.3032682700388],[-64.8094297981283,32.3098175728414],[-64.8167896352437,32.3058845718466],[-64.8101968029642,32.3022833180511],[-64.7962291465484,32.2934409732427],[-64.7815086336978,32.2868973114514],[-64.7997025513437,32.2796896417328],[-64.8066707691087,32.2747767569465],[-64.82255878736 [...]
+{"type":"Feature","id":"BOL","properties":{"name":"Bolivia"},"geometry":{"type":"Polygon","coordinates":[[[-62.846468,-22.034985],[-63.986838,-21.993644],[-64.377021,-22.798091],[-64.964892,-22.075862],[-66.273339,-21.83231],[-67.106674,-22.735925],[-67.82818,-22.872919],[-68.219913,-21.494347],[-68.757167,-20.372658],[-68.442225,-19.405068],[-68.966818,-18.981683],[-69.100247,-18.260125],[-69.590424,-17.580012],[-68.959635,-16.500698],[-69.389764,-15.660129],[-69.160347,-15.323974],[-69 [...]
+{"type":"Feature","id":"BRA","properties":{"name":"Brazil"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.2909,-28.852761],[-55.162286,-27.881915],[-54.490725,-27.474757],[-53.648735,-26.923473],[-53.628349,-26.124865],[-54.13005,-25.547639],[-54.625291,-25.739255],[-54.428946,-25.162185],[-54.293476,-24.5708],[-54.29296,-24.021014],[-54.652834,-23.839578],[-55.027902,-24.001274],[-55.400747,-23.956935],[-55.517639,-23.571998],[-55.610683,-22.655619],[-55.7979 [...]
+{"type":"Feature","id":"BRN","properties":{"name":"Brunei"},"geometry":{"type":"Polygon","coordinates":[[[114.204017,4.525874],[114.599961,4.900011],[115.45071,5.44773],[115.4057,4.955228],[115.347461,4.316636],[114.869557,4.348314],[114.659596,4.007637],[114.204017,4.525874]]]}},
+{"type":"Feature","id":"BTN","properties":{"name":"Bhutan"},"geometry":{"type":"Polygon","coordinates":[[[91.696657,27.771742],[92.103712,27.452614],[92.033484,26.83831],[91.217513,26.808648],[90.373275,26.875724],[89.744528,26.719403],[88.835643,27.098966],[88.814248,27.299316],[89.47581,28.042759],[90.015829,28.296439],[90.730514,28.064954],[91.258854,28.040614],[91.696657,27.771742]]]}},
+{"type":"Feature","id":"BWA","properties":{"name":"Botswana"},"geometry":{"type":"Polygon","coordinates":[[[25.649163,-18.536026],[25.850391,-18.714413],[26.164791,-19.293086],[27.296505,-20.39152],[27.724747,-20.499059],[27.727228,-20.851802],[28.02137,-21.485975],[28.794656,-21.639454],[29.432188,-22.091313],[28.017236,-22.827754],[27.11941,-23.574323],[26.786407,-24.240691],[26.485753,-24.616327],[25.941652,-24.696373],[25.765849,-25.174845],[25.664666,-25.486816],[25.025171,-25.71967 [...]
+{"type":"Feature","id":"CAF","properties":{"name":"Central African Republic"},"geometry":{"type":"Polygon","coordinates":[[[15.27946,7.421925],[16.106232,7.497088],[16.290562,7.754307],[16.456185,7.734774],[16.705988,7.508328],[17.96493,7.890914],[18.389555,8.281304],[18.911022,8.630895],[18.81201,8.982915],[19.094008,9.074847],[20.059685,9.012706],[21.000868,9.475985],[21.723822,10.567056],[22.231129,10.971889],[22.864165,11.142395],[22.977544,10.714463],[23.554304,10.089255],[23.55725, [...]
+{"type":"Feature","id":"CAN","properties":{"name":"Canada"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-63.6645,46.55001],[-62.9393,46.41587],[-62.01208,46.44314],[-62.50391,46.03339],[-62.87433,45.96818],[-64.1428,46.39265],[-64.39261,46.72747],[-64.01486,47.03601],[-63.6645,46.55001]]],[[[-61.806305,49.10506],[-62.29318,49.08717],[-63.58926,49.40069],[-64.51912,49.87304],[-64.17322,49.95718],[-62.85829,49.70641],[-61.835585,49.28855],[-61.806305,49.10506]]],[[[-123.510002,48.5 [...]
+{"type":"Feature","id":"CHE","properties":{"name":"Switzerland"},"geometry":{"type":"Polygon","coordinates":[[[9.594226,47.525058],[9.632932,47.347601],[9.47997,47.10281],[9.932448,46.920728],[10.442701,46.893546],[10.363378,46.483571],[9.922837,46.314899],[9.182882,46.440215],[8.966306,46.036932],[8.489952,46.005151],[8.31663,46.163642],[7.755992,45.82449],[7.273851,45.776948],[6.843593,45.991147],[6.5001,46.429673],[6.022609,46.27299],[6.037389,46.725779],[6.768714,47.287708],[6.736571 [...]
+{"type":"Feature","id":"CHL","properties":{"name":"Chile"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-68.63401,-52.63637],[-68.63335,-54.8695],[-67.56244,-54.87001],[-66.95992,-54.89681],[-67.29103,-55.30124],[-68.14863,-55.61183],[-68.639991,-55.580018],[-69.2321,-55.49906],[-69.95809,-55.19843],[-71.00568,-55.05383],[-72.2639,-54.49514],[-73.2852,-53.95752],[-74.66253,-52.83749],[-73.8381,-53.04743],[-72.43418,-53.7154],[-71.10773,-54.07433],[-70.59178,-53.61583],[-70.26748,- [...]
+{"type":"Feature","id":"CHN","properties":{"name":"China"},"geometry":{"type":"MultiPolygon","coordinates":[[[[110.339188,18.678395],[109.47521,18.197701],[108.655208,18.507682],[108.626217,19.367888],[109.119056,19.821039],[110.211599,20.101254],[110.786551,20.077534],[111.010051,19.69593],[110.570647,19.255879],[110.339188,18.678395]]],[[[127.657407,49.76027],[129.397818,49.4406],[130.582293,48.729687],[130.987282,47.790132],[132.506672,47.78897],[133.373596,48.183442],[135.026311,48.4 [...]
+{"type":"Feature","id":"CIV","properties":{"name":"Ivory Coast"},"geometry":{"type":"Polygon","coordinates":[[[-2.856125,4.994476],[-3.311084,4.984296],[-4.00882,5.179813],[-4.649917,5.168264],[-5.834496,4.993701],[-6.528769,4.705088],[-7.518941,4.338288],[-7.712159,4.364566],[-7.635368,5.188159],[-7.539715,5.313345],[-7.570153,5.707352],[-7.993693,6.12619],[-8.311348,6.193033],[-8.60288,6.467564],[-8.385452,6.911801],[-8.485446,7.395208],[-8.439298,7.686043],[-8.280703,7.68718],[-8.2217 [...]
+{"type":"Feature","id":"CMR","properties":{"name":"Cameroon"},"geometry":{"type":"Polygon","coordinates":[[[13.075822,2.267097],[12.951334,2.321616],[12.35938,2.192812],[11.751665,2.326758],[11.276449,2.261051],[9.649158,2.283866],[9.795196,3.073404],[9.404367,3.734527],[8.948116,3.904129],[8.744924,4.352215],[8.488816,4.495617],[8.500288,4.771983],[8.757533,5.479666],[9.233163,6.444491],[9.522706,6.453482],[10.118277,7.03877],[10.497375,7.055358],[11.058788,6.644427],[11.745774,6.981383 [...]
+{"type":"Feature","id":"COD","properties":{"name":"Democratic Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[30.83386,3.509166],[30.773347,2.339883],[31.174149,2.204465],[30.85267,1.849396],[30.468508,1.583805],[30.086154,1.062313],[29.875779,0.59738],[29.819503,-0.20531],[29.587838,-0.587406],[29.579466,-1.341313],[29.291887,-1.620056],[29.254835,-2.21511],[29.117479,-2.292211],[29.024926,-2.839258],[29.276384,-3.293907],[29.339998,-4.499983],[29.519987,-5.419979] [...]
+{"type":"Feature","id":"COG","properties":{"name":"Republic of the Congo"},"geometry":{"type":"Polygon","coordinates":[[[12.995517,-4.781103],[12.62076,-4.438023],[12.318608,-4.60623],[11.914963,-5.037987],[11.093773,-3.978827],[11.855122,-3.426871],[11.478039,-2.765619],[11.820964,-2.514161],[12.495703,-2.391688],[12.575284,-1.948511],[13.109619,-2.42874],[13.992407,-2.470805],[14.29921,-1.998276],[14.425456,-1.333407],[14.316418,-0.552627],[13.843321,0.038758],[14.276266,1.19693],[14.0 [...]
+{"type":"Feature","id":"COL","properties":{"name":"Colombia"},"geometry":{"type":"Polygon","coordinates":[[[-75.373223,-0.152032],[-75.801466,0.084801],[-76.292314,0.416047],[-76.57638,0.256936],[-77.424984,0.395687],[-77.668613,0.825893],[-77.855061,0.809925],[-78.855259,1.380924],[-78.990935,1.69137],[-78.617831,1.766404],[-78.662118,2.267355],[-78.42761,2.629556],[-77.931543,2.696606],[-77.510431,3.325017],[-77.12769,3.849636],[-77.496272,4.087606],[-77.307601,4.667984],[-77.533221,5. [...]
+{"type":"Feature","id":"CRI","properties":{"name":"Costa Rica"},"geometry":{"type":"Polygon","coordinates":[[[-82.965783,8.225028],[-83.508437,8.446927],[-83.711474,8.656836],[-83.596313,8.830443],[-83.632642,9.051386],[-83.909886,9.290803],[-84.303402,9.487354],[-84.647644,9.615537],[-84.713351,9.908052],[-84.97566,10.086723],[-84.911375,9.795992],[-85.110923,9.55704],[-85.339488,9.834542],[-85.660787,9.933347],[-85.797445,10.134886],[-85.791709,10.439337],[-85.659314,10.754331],[-85.94 [...]
+{"type":"Feature","id":"CUB","properties":{"name":"Cuba"},"geometry":{"type":"Polygon","coordinates":[[[-82.268151,23.188611],[-81.404457,23.117271],[-80.618769,23.10598],[-79.679524,22.765303],[-79.281486,22.399202],[-78.347434,22.512166],[-77.993296,22.277194],[-77.146422,21.657851],[-76.523825,21.20682],[-76.19462,21.220565],[-75.598222,21.016624],[-75.67106,20.735091],[-74.933896,20.693905],[-74.178025,20.284628],[-74.296648,20.050379],[-74.961595,19.923435],[-75.63468,19.873774],[-7 [...]
+{"type":"Feature","id":"-99","properties":{"name":"Northern Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[32.73178,35.140026],[32.802474,35.145504],[32.946961,35.386703],[33.667227,35.373216],[34.576474,35.671596],[33.900804,35.245756],[33.973617,35.058506],[33.86644,35.093595],[33.675392,35.017863],[33.525685,35.038688],[33.475817,35.000345],[33.455922,35.101424],[33.383833,35.162712],[33.190977,35.173125],[32.919572,35.087833],[32.73178,35.140026]]]}},
+{"type":"Feature","id":"CYP","properties":{"name":"Cyprus"},"geometry":{"type":"Polygon","coordinates":[[[33.973617,35.058506],[34.004881,34.978098],[32.979827,34.571869],[32.490296,34.701655],[32.256667,35.103232],[32.73178,35.140026],[32.919572,35.087833],[33.190977,35.173125],[33.383833,35.162712],[33.455922,35.101424],[33.475817,35.000345],[33.525685,35.038688],[33.675392,35.017863],[33.86644,35.093595],[33.973617,35.058506]]]}},
+{"type":"Feature","id":"CZE","properties":{"name":"Czech Republic"},"geometry":{"type":"Polygon","coordinates":[[[16.960288,48.596982],[16.499283,48.785808],[16.029647,48.733899],[15.253416,49.039074],[14.901447,48.964402],[14.338898,48.555305],[13.595946,48.877172],[13.031329,49.307068],[12.521024,49.547415],[12.415191,49.969121],[12.240111,50.266338],[12.966837,50.484076],[13.338132,50.733234],[14.056228,50.926918],[14.307013,51.117268],[14.570718,51.002339],[15.016996,51.106674],[15.4 [...]
+{"type":"Feature","id":"DEU","properties":{"name":"Germany"},"geometry":{"type":"Polygon","coordinates":[[[9.921906,54.983104],[9.93958,54.596642],[10.950112,54.363607],[10.939467,54.008693],[11.956252,54.196486],[12.51844,54.470371],[13.647467,54.075511],[14.119686,53.757029],[14.353315,53.248171],[14.074521,52.981263],[14.4376,52.62485],[14.685026,52.089947],[14.607098,51.745188],[15.016996,51.106674],[14.570718,51.002339],[14.307013,51.117268],[14.056228,50.926918],[13.338132,50.73323 [...]
+{"type":"Feature","id":"DJI","properties":{"name":"Djibouti"},"geometry":{"type":"Polygon","coordinates":[[[43.081226,12.699639],[43.317852,12.390148],[43.286381,11.974928],[42.715874,11.735641],[43.145305,11.46204],[42.776852,10.926879],[42.55493,11.10511],[42.31414,11.0342],[41.75557,11.05091],[41.73959,11.35511],[41.66176,11.6312],[42,12.1],[42.35156,12.54223],[42.779642,12.455416],[43.081226,12.699639]]]}},
+{"type":"Feature","id":"DNK","properties":{"name":"Denmark"},"geometry":{"type":"MultiPolygon","coordinates":[[[[12.690006,55.609991],[12.089991,54.800015],[11.043543,55.364864],[10.903914,55.779955],[12.370904,56.111407],[12.690006,55.609991]]],[[[10.912182,56.458621],[10.667804,56.081383],[10.369993,56.190007],[9.649985,55.469999],[9.921906,54.983104],[9.282049,54.830865],[8.526229,54.962744],[8.120311,55.517723],[8.089977,56.540012],[8.256582,56.809969],[8.543438,57.110003],[9.424469, [...]
+{"type":"Feature","id":"DOM","properties":{"name":"Dominican Republic"},"geometry":{"type":"Polygon","coordinates":[[[-71.712361,19.714456],[-71.587304,19.884911],[-70.806706,19.880286],[-70.214365,19.622885],[-69.950815,19.648],[-69.76925,19.293267],[-69.222126,19.313214],[-69.254346,19.015196],[-68.809412,18.979074],[-68.317943,18.612198],[-68.689316,18.205142],[-69.164946,18.422648],[-69.623988,18.380713],[-69.952934,18.428307],[-70.133233,18.245915],[-70.517137,18.184291],[-70.669298 [...]
+{"type":"Feature","id":"DZA","properties":{"name":"Algeria"},"geometry":{"type":"Polygon","coordinates":[[[11.999506,23.471668],[8.572893,21.565661],[5.677566,19.601207],[4.267419,19.155265],[3.158133,19.057364],[3.146661,19.693579],[2.683588,19.85623],[2.060991,20.142233],[1.823228,20.610809],[-1.550055,22.792666],[-4.923337,24.974574],[-8.6844,27.395744],[-8.665124,27.589479],[-8.66559,27.656426],[-8.674116,28.841289],[-7.059228,29.579228],[-6.060632,29.7317],[-5.242129,30.000443],[-4. [...]
+{"type":"Feature","id":"ECU","properties":{"name":"Ecuador"},"geometry":{"type":"Polygon","coordinates":[[[-80.302561,-3.404856],[-79.770293,-2.657512],[-79.986559,-2.220794],[-80.368784,-2.685159],[-80.967765,-2.246943],[-80.764806,-1.965048],[-80.933659,-1.057455],[-80.58337,-0.906663],[-80.399325,-0.283703],[-80.020898,0.36034],[-80.09061,0.768429],[-79.542762,0.982938],[-78.855259,1.380924],[-77.855061,0.809925],[-77.668613,0.825893],[-77.424984,0.395687],[-76.57638,0.256936],[-76.29 [...]
+{"type":"Feature","id":"EGY","properties":{"name":"Egypt"},"geometry":{"type":"Polygon","coordinates":[[[34.9226,29.50133],[34.64174,29.09942],[34.42655,28.34399],[34.15451,27.8233],[33.92136,27.6487],[33.58811,27.97136],[33.13676,28.41765],[32.42323,29.85108],[32.32046,29.76043],[32.73482,28.70523],[33.34876,27.69989],[34.10455,26.14227],[34.47387,25.59856],[34.79507,25.03375],[35.69241,23.92671],[35.49372,23.75237],[35.52598,23.10244],[36.69069,22.20485],[36.86623,22],[32.9,22],[29.02, [...]
+{"type":"Feature","id":"ERI","properties":{"name":"Eritrea"},"geometry":{"type":"Polygon","coordinates":[[[42.35156,12.54223],[42.00975,12.86582],[41.59856,13.45209],[41.155194,13.77332],[40.8966,14.11864],[40.026219,14.519579],[39.34061,14.53155],[39.0994,14.74064],[38.51295,14.50547],[37.90607,14.95943],[37.59377,14.2131],[36.42951,14.42211],[36.323189,14.822481],[36.75386,16.291874],[36.85253,16.95655],[37.16747,17.26314],[37.904,17.42754],[38.41009,17.998307],[38.990623,16.840626],[3 [...]
+{"type":"Feature","id":"ESP","properties":{"name":"Spain"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.984433,42.592775],[-9.392884,43.026625],[-7.97819,43.748338],[-6.754492,43.567909],[-5.411886,43.57424],[-4.347843,43.403449],[-3.517532,43.455901],[-1.901351,43.422802],[-1.502771,43.034014],[0.338047,42.579546],[0.701591,42.795734],[1.826793,42.343385],[2.985999,42.473015],[3.039484,41.89212],[2.091842,41.226089],[0.810525,41.014732],[0.721331,40.678318],[0. [...]
+{"type":"Feature","id":"EST","properties":{"name":"Estonia"},"geometry":{"type":"Polygon","coordinates":[[[24.312863,57.793424],[24.428928,58.383413],[24.061198,58.257375],[23.42656,58.612753],[23.339795,59.18724],[24.604214,59.465854],[25.864189,59.61109],[26.949136,59.445803],[27.981114,59.475388],[28.131699,59.300825],[27.420166,58.724581],[27.716686,57.791899],[27.288185,57.474528],[26.463532,57.476389],[25.60281,57.847529],[25.164594,57.970157],[24.312863,57.793424]]]}},
+{"type":"Feature","id":"ETH","properties":{"name":"Ethiopia"},"geometry":{"type":"Polygon","coordinates":[[[37.90607,14.95943],[38.51295,14.50547],[39.0994,14.74064],[39.34061,14.53155],[40.02625,14.51959],[40.8966,14.11864],[41.1552,13.77333],[41.59856,13.45209],[42.00975,12.86582],[42.35156,12.54223],[42,12.1],[41.66176,11.6312],[41.73959,11.35511],[41.75557,11.05091],[42.31414,11.0342],[42.55493,11.10511],[42.776852,10.926879],[42.55876,10.57258],[42.92812,10.02194],[43.29699,9.54048] [...]
+{"type":"Feature","id":"FIN","properties":{"name":"Finland"},"geometry":{"type":"Polygon","coordinates":[[[28.59193,69.064777],[28.445944,68.364613],[29.977426,67.698297],[29.054589,66.944286],[30.21765,65.80598],[29.54443,64.948672],[30.444685,64.204453],[30.035872,63.552814],[31.516092,62.867687],[31.139991,62.357693],[30.211107,61.780028],[28.069998,60.503517],[26.255173,60.423961],[24.496624,60.057316],[22.869695,59.846373],[22.290764,60.391921],[21.322244,60.72017],[21.544866,61.705 [...]
+{"type":"Feature","id":"FJI","properties":{"name":"Fiji"},"geometry":{"type":"MultiPolygon","coordinates":[[[[178.3736,-17.33992],[178.71806,-17.62846],[178.55271,-18.15059],[177.93266,-18.28799],[177.38146,-18.16432],[177.28504,-17.72465],[177.67087,-17.38114],[178.12557,-17.50481],[178.3736,-17.33992]]],[[[179.364143,-16.801354],[178.725059,-17.012042],[178.596839,-16.63915],[179.096609,-16.433984],[179.413509,-16.379054],[180,-16.067133],[180,-16.555217],[179.364143,-16.801354]]],[[[- [...]
+{"type":"Feature","id":"FLK","properties":{"name":"Falkland Islands"},"geometry":{"type":"Polygon","coordinates":[[[-61.2,-51.85],[-60,-51.25],[-59.15,-51.5],[-58.55,-51.1],[-57.75,-51.55],[-58.05,-51.9],[-59.4,-52.2],[-59.85,-51.85],[-60.7,-52.3],[-61.2,-51.85]]]}},
+{"type":"Feature","id":"FRA","properties":{"name":"France"},"geometry":{"type":"MultiPolygon","coordinates":[[[[9.560016,42.152492],[9.229752,41.380007],[8.775723,41.583612],[8.544213,42.256517],[8.746009,42.628122],[9.390001,43.009985],[9.560016,42.152492]]],[[[3.588184,50.378992],[4.286023,49.907497],[4.799222,49.985373],[5.674052,49.529484],[5.897759,49.442667],[6.18632,49.463803],[6.65823,49.201958],[8.099279,49.017784],[7.593676,48.333019],[7.466759,47.620582],[7.192202,47.449766],[ [...]
+{"type":"Feature","id":"GAB","properties":{"name":"Gabon"},"geometry":{"type":"Polygon","coordinates":[[[11.093773,-3.978827],[10.066135,-2.969483],[9.405245,-2.144313],[8.797996,-1.111301],[8.830087,-0.779074],[9.04842,-0.459351],[9.291351,0.268666],[9.492889,1.01012],[9.830284,1.067894],[11.285079,1.057662],[11.276449,2.261051],[11.751665,2.326758],[12.35938,2.192812],[12.951334,2.321616],[13.075822,2.267097],[13.003114,1.830896],[13.282631,1.314184],[14.026669,1.395677],[14.276266,1.1 [...]
+{"type":"Feature","id":"GBR","properties":{"name":"United Kingdom"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-5.661949,54.554603],[-6.197885,53.867565],[-6.95373,54.073702],[-7.572168,54.059956],[-7.366031,54.595841],[-7.572168,55.131622],[-6.733847,55.17286],[-5.661949,54.554603]]],[[[-3.005005,58.635],[-4.073828,57.553025],[-3.055002,57.690019],[-1.959281,57.6848],[-2.219988,56.870017],[-3.119003,55.973793],[-2.085009,55.909998],[-2.005676,55.804903],[-1.114991,54.624986],[- [...]
+{"type":"Feature","id":"GEO","properties":{"name":"Georgia"},"geometry":{"type":"Polygon","coordinates":[[[41.554084,41.535656],[41.703171,41.962943],[41.45347,42.645123],[40.875469,43.013628],[40.321394,43.128634],[39.955009,43.434998],[40.076965,43.553104],[40.922185,43.382159],[42.394395,43.220308],[43.756017,42.740828],[43.9312,42.554974],[44.537623,42.711993],[45.470279,42.502781],[45.77641,42.092444],[46.404951,41.860675],[46.145432,41.722802],[46.637908,41.181673],[46.501637,41.06 [...]
+{"type":"Feature","id":"GHA","properties":{"name":"Ghana"},"geometry":{"type":"Polygon","coordinates":[[[1.060122,5.928837],[-0.507638,5.343473],[-1.063625,5.000548],[-1.964707,4.710462],[-2.856125,4.994476],[-2.810701,5.389051],[-3.24437,6.250472],[-2.983585,7.379705],[-2.56219,8.219628],[-2.827496,9.642461],[-2.963896,10.395335],[-2.940409,10.96269],[-1.203358,11.009819],[-0.761576,10.93693],[-0.438702,11.098341],[0.023803,11.018682],[-0.049785,10.706918],[0.36758,10.191213],[0.365901, [...]
+{"type":"Feature","id":"GIN","properties":{"name":"Guinea"},"geometry":{"type":"Polygon","coordinates":[[[-8.439298,7.686043],[-8.722124,7.711674],[-8.926065,7.309037],[-9.208786,7.313921],[-9.403348,7.526905],[-9.33728,7.928534],[-9.755342,8.541055],[-10.016567,8.428504],[-10.230094,8.406206],[-10.505477,8.348896],[-10.494315,8.715541],[-10.65477,8.977178],[-10.622395,9.26791],[-10.839152,9.688246],[-11.117481,10.045873],[-11.917277,10.046984],[-12.150338,9.858572],[-12.425929,9.835834] [...]
+{"type":"Feature","id":"GMB","properties":{"name":"Gambia"},"geometry":{"type":"Polygon","coordinates":[[[-16.841525,13.151394],[-16.713729,13.594959],[-15.624596,13.623587],[-15.39877,13.860369],[-15.081735,13.876492],[-14.687031,13.630357],[-14.376714,13.62568],[-14.046992,13.794068],[-13.844963,13.505042],[-14.277702,13.280585],[-14.712197,13.298207],[-15.141163,13.509512],[-15.511813,13.27857],[-15.691001,13.270353],[-15.931296,13.130284],[-16.841525,13.151394]]]}},
+{"type":"Feature","id":"GNB","properties":{"name":"Guinea Bissau"},"geometry":{"type":"Polygon","coordinates":[[[-15.130311,11.040412],[-15.66418,11.458474],[-16.085214,11.524594],[-16.314787,11.806515],[-16.308947,11.958702],[-16.613838,12.170911],[-16.677452,12.384852],[-16.147717,12.547762],[-15.816574,12.515567],[-15.548477,12.62817],[-13.700476,12.586183],[-13.718744,12.247186],[-13.828272,12.142644],[-13.743161,11.811269],[-13.9008,11.678719],[-14.121406,11.677117],[-14.382192,11.5 [...]
+{"type":"Feature","id":"GNQ","properties":{"name":"Equatorial Guinea"},"geometry":{"type":"Polygon","coordinates":[[[9.492889,1.01012],[9.305613,1.160911],[9.649158,2.283866],[11.276449,2.261051],[11.285079,1.057662],[9.830284,1.067894],[9.492889,1.01012]]]}},
+{"type":"Feature","id":"GRC","properties":{"name":"Greece"},"geometry":{"type":"MultiPolygon","coordinates":[[[[23.69998,35.705004],[24.246665,35.368022],[25.025015,35.424996],[25.769208,35.354018],[25.745023,35.179998],[26.290003,35.29999],[26.164998,35.004995],[24.724982,34.919988],[24.735007,35.084991],[23.514978,35.279992],[23.69998,35.705004]]],[[[26.604196,41.562115],[26.294602,40.936261],[26.056942,40.824123],[25.447677,40.852545],[24.925848,40.947062],[23.714811,40.687129],[24.40 [...]
+{"type":"Feature","id":"GRL","properties":{"name":"Greenland"},"geometry":{"type":"Polygon","coordinates":[[[-46.76379,82.62796],[-43.40644,83.22516],[-39.89753,83.18018],[-38.62214,83.54905],[-35.08787,83.64513],[-27.10046,83.51966],[-20.84539,82.72669],[-22.69182,82.34165],[-26.51753,82.29765],[-31.9,82.2],[-31.39646,82.02154],[-27.85666,82.13178],[-24.84448,81.78697],[-22.90328,82.09317],[-22.07175,81.73449],[-23.16961,81.15271],[-20.62363,81.52462],[-15.76818,81.91245],[-12.77018,81. [...]
+{"type":"Feature","id":"GTM","properties":{"name":"Guatemala"},"geometry":{"type":"Polygon","coordinates":[[[-90.095555,13.735338],[-90.608624,13.909771],[-91.23241,13.927832],[-91.689747,14.126218],[-92.22775,14.538829],[-92.20323,14.830103],[-92.087216,15.064585],[-92.229249,15.251447],[-91.74796,16.066565],[-90.464473,16.069562],[-90.438867,16.41011],[-90.600847,16.470778],[-90.711822,16.687483],[-91.08167,16.918477],[-91.453921,17.252177],[-91.002269,17.254658],[-91.00152,17.817595], [...]
+{"type":"Feature","id":"GUF","properties":{"name":"French Guiana"},"geometry":{"type":"Polygon","coordinates":[[[-52.556425,2.504705],[-52.939657,2.124858],[-53.418465,2.053389],[-53.554839,2.334897],[-53.778521,2.376703],[-54.088063,2.105557],[-54.524754,2.311849],[-54.27123,2.738748],[-54.184284,3.194172],[-54.011504,3.62257],[-54.399542,4.212611],[-54.478633,4.896756],[-53.958045,5.756548],[-53.618453,5.646529],[-52.882141,5.409851],[-51.823343,4.565768],[-51.657797,4.156232],[-52.249 [...]
+{"type":"Feature","id":"GUY","properties":{"name":"Guyana"},"geometry":{"type":"Polygon","coordinates":[[[-59.758285,8.367035],[-59.101684,7.999202],[-58.482962,7.347691],[-58.454876,6.832787],[-58.078103,6.809094],[-57.542219,6.321268],[-57.147436,5.97315],[-57.307246,5.073567],[-57.914289,4.812626],[-57.86021,4.576801],[-58.044694,4.060864],[-57.601569,3.334655],[-57.281433,3.333492],[-57.150098,2.768927],[-56.539386,1.899523],[-56.782704,1.863711],[-57.335823,1.948538],[-57.660971,1.6 [...]
+{"type":"Feature","id":"HND","properties":{"name":"Honduras"},"geometry":{"type":"Polygon","coordinates":[[[-87.316654,12.984686],[-87.489409,13.297535],[-87.793111,13.38448],[-87.723503,13.78505],[-87.859515,13.893312],[-88.065343,13.964626],[-88.503998,13.845486],[-88.541231,13.980155],[-88.843073,14.140507],[-89.058512,14.340029],[-89.353326,14.424133],[-89.145535,14.678019],[-89.22522,14.874286],[-89.154811,15.066419],[-88.68068,15.346247],[-88.225023,15.727722],[-88.121153,15.688655 [...]
+{"type":"Feature","id":"HRV","properties":{"name":"Croatia"},"geometry":{"type":"Polygon","coordinates":[[[18.829838,45.908878],[19.072769,45.521511],[19.390476,45.236516],[19.005486,44.860234],[18.553214,45.08159],[17.861783,45.06774],[17.002146,45.233777],[16.534939,45.211608],[16.318157,45.004127],[15.959367,45.233777],[15.750026,44.818712],[16.23966,44.351143],[16.456443,44.04124],[16.916156,43.667722],[17.297373,43.446341],[17.674922,43.028563],[18.56,42.65],[18.450016,42.479991],[1 [...]
+{"type":"Feature","id":"HTI","properties":{"name":"Haiti"},"geometry":{"type":"Polygon","coordinates":[[[-73.189791,19.915684],[-72.579673,19.871501],[-71.712361,19.714456],[-71.624873,19.169838],[-71.701303,18.785417],[-71.945112,18.6169],[-71.687738,18.31666],[-71.708305,18.044997],[-72.372476,18.214961],[-72.844411,18.145611],[-73.454555,18.217906],[-73.922433,18.030993],[-74.458034,18.34255],[-74.369925,18.664908],[-73.449542,18.526053],[-72.694937,18.445799],[-72.334882,18.668422],[ [...]
+{"type":"Feature","id":"HUN","properties":{"name":"Hungary"},"geometry":{"type":"Polygon","coordinates":[[[16.202298,46.852386],[16.534268,47.496171],[16.340584,47.712902],[16.903754,47.714866],[16.979667,48.123497],[17.488473,47.867466],[17.857133,47.758429],[18.696513,47.880954],[18.777025,48.081768],[19.174365,48.111379],[19.661364,48.266615],[19.769471,48.202691],[20.239054,48.327567],[20.473562,48.56285],[20.801294,48.623854],[21.872236,48.319971],[22.085608,48.422264],[22.64082,48. [...]
+{"type":"Feature","id":"IDN","properties":{"name":"Indonesia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[120.715609,-10.239581],[120.295014,-10.25865],[118.967808,-9.557969],[119.90031,-9.36134],[120.425756,-9.665921],[120.775502,-9.969675],[120.715609,-10.239581]]],[[[124.43595,-10.140001],[123.579982,-10.359987],[123.459989,-10.239995],[123.550009,-9.900016],[123.980009,-9.290027],[124.968682,-8.89279],[125.07002,-9.089987],[125.08852,-9.393173],[124.43595,-10.140001]]],[[[11 [...]
+{"type":"Feature","id":"IND","properties":{"name":"India"},"geometry":{"type":"Polygon","coordinates":[[[77.837451,35.49401],[78.912269,34.321936],[78.811086,33.506198],[79.208892,32.994395],[79.176129,32.48378],[78.458446,32.618164],[78.738894,31.515906],[79.721367,30.882715],[81.111256,30.183481],[80.476721,29.729865],[80.088425,28.79447],[81.057203,28.416095],[81.999987,27.925479],[83.304249,27.364506],[84.675018,27.234901],[85.251779,26.726198],[86.024393,26.630985],[87.227472,26.397 [...]
+{"type":"Feature","id":"IRL","properties":{"name":"Ireland"},"geometry":{"type":"Polygon","coordinates":[[[-6.197885,53.867565],[-6.032985,53.153164],[-6.788857,52.260118],[-8.561617,51.669301],[-9.977086,51.820455],[-9.166283,52.864629],[-9.688525,53.881363],[-8.327987,54.664519],[-7.572168,55.131622],[-7.366031,54.595841],[-7.572168,54.059956],[-6.95373,54.073702],[-6.197885,53.867565]]]}},
+{"type":"Feature","id":"IRN","properties":{"name":"Iran"},"geometry":{"type":"Polygon","coordinates":[[[53.921598,37.198918],[54.800304,37.392421],[55.511578,37.964117],[56.180375,37.935127],[56.619366,38.121394],[57.330434,38.029229],[58.436154,37.522309],[59.234762,37.412988],[60.377638,36.527383],[61.123071,36.491597],[61.210817,35.650072],[60.803193,34.404102],[60.52843,33.676446],[60.9637,33.528832],[60.536078,32.981269],[60.863655,32.18292],[60.941945,31.548075],[61.699314,31.37950 [...]
+{"type":"Feature","id":"IRQ","properties":{"name":"Iraq"},"geometry":{"type":"Polygon","coordinates":[[[45.420618,35.977546],[46.07634,35.677383],[46.151788,35.093259],[45.64846,34.748138],[45.416691,33.967798],[46.109362,33.017287],[47.334661,32.469155],[47.849204,31.709176],[47.685286,30.984853],[48.004698,30.985137],[48.014568,30.452457],[48.567971,29.926778],[47.974519,29.975819],[47.302622,30.05907],[46.568713,29.099025],[44.709499,29.178891],[41.889981,31.190009],[40.399994,31.8899 [...]
+{"type":"Feature","id":"ISL","properties":{"name":"Iceland"},"geometry":{"type":"Polygon","coordinates":[[[-14.508695,66.455892],[-14.739637,65.808748],[-13.609732,65.126671],[-14.909834,64.364082],[-17.794438,63.678749],[-18.656246,63.496383],[-19.972755,63.643635],[-22.762972,63.960179],[-21.778484,64.402116],[-23.955044,64.89113],[-22.184403,65.084968],[-22.227423,65.378594],[-24.326184,65.611189],[-23.650515,66.262519],[-22.134922,66.410469],[-20.576284,65.732112],[-19.056842,66.2766 [...]
+{"type":"Feature","id":"ISR","properties":{"name":"Israel"},"geometry":{"type":"Polygon","coordinates":[[[35.719918,32.709192],[35.545665,32.393992],[35.18393,32.532511],[34.974641,31.866582],[35.225892,31.754341],[34.970507,31.616778],[34.927408,31.353435],[35.397561,31.489086],[35.420918,31.100066],[34.922603,29.501326],[34.265433,31.219361],[34.556372,31.548824],[34.488107,31.605539],[34.752587,32.072926],[34.955417,32.827376],[35.098457,33.080539],[35.126053,33.0909],[35.460709,33.08 [...]
+{"type":"Feature","id":"ITA","properties":{"name":"Italy"},"geometry":{"type":"MultiPolygon","coordinates":[[[[15.520376,38.231155],[15.160243,37.444046],[15.309898,37.134219],[15.099988,36.619987],[14.335229,36.996631],[13.826733,37.104531],[12.431004,37.61295],[12.570944,38.126381],[13.741156,38.034966],[14.761249,38.143874],[15.520376,38.231155]]],[[[9.210012,41.209991],[9.809975,40.500009],[9.669519,39.177376],[9.214818,39.240473],[8.806936,38.906618],[8.428302,39.171847],[8.388253,4 [...]
+{"type":"Feature","id":"JAM","properties":{"name":"Jamaica"},"geometry":{"type":"Polygon","coordinates":[[[-77.569601,18.490525],[-76.896619,18.400867],[-76.365359,18.160701],[-76.199659,17.886867],[-76.902561,17.868238],[-77.206341,17.701116],[-77.766023,17.861597],[-78.337719,18.225968],[-78.217727,18.454533],[-77.797365,18.524218],[-77.569601,18.490525]]]}},
+{"type":"Feature","id":"JOR","properties":{"name":"Jordan"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.719918,32.709192],[36.834062,32.312938],[38.792341,33.378686],[39.195468,32.161009],[39.004886,32.010217],[37.002166,31.508413],[37.998849,30.5085],[37.66812,30.338665],[37.503582,30.003776],[36.740528,29.865283],[36.501214,29.505254],[36.068941,29.197495],[34.956037,29.356555],[34.922603,29.501326],[35.420918,31.100066],[35.397561,31.489086],[35.545252,31.78 [...]
+{"type":"Feature","id":"JPN","properties":{"name":"Japan"},"geometry":{"type":"MultiPolygon","coordinates":[[[[134.638428,34.149234],[134.766379,33.806335],[134.203416,33.201178],[133.79295,33.521985],[133.280268,33.28957],[133.014858,32.704567],[132.363115,32.989382],[132.371176,33.463642],[132.924373,34.060299],[133.492968,33.944621],[133.904106,34.364931],[134.638428,34.149234]]],[[[140.976388,37.142074],[140.59977,36.343983],[140.774074,35.842877],[140.253279,35.138114],[138.975528,3 [...]
+{"type":"Feature","id":"KAZ","properties":{"name":"Kazakhstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[70.388965,42.081308],[69.070027,41.384244],[68.632483,40.668681],[68.259896,40.662325],[67.985856,41.135991],[66.714047,41.168444],[66.510649,41.987644],[66.023392,41.994646],[66.098012,42.99766],[64.900824,43.728081],[63.185787,43.650075],[62.0133,43.504477],[61.05832,44.405817],[60.239972,44.784037],[58.689989,45.500014],[58.503127,45.586804],[55.928917,44 [...]
+{"type":"Feature","id":"KEN","properties":{"name":"Kenya"},"geometry":{"type":"Polygon","coordinates":[[[40.993,-0.85829],[41.58513,-1.68325],[40.88477,-2.08255],[40.63785,-2.49979],[40.26304,-2.57309],[40.12119,-3.27768],[39.80006,-3.68116],[39.60489,-4.34653],[39.20222,-4.67677],[37.7669,-3.67712],[37.69869,-3.09699],[34.07262,-1.05982],[33.903711,-0.95],[33.893569,0.109814],[34.18,0.515],[34.6721,1.17694],[35.03599,1.90584],[34.59607,3.05374],[34.47913,3.5556],[34.005,4.249885],[34.62 [...]
+{"type":"Feature","id":"KGZ","properties":{"name":"Kyrgyzstan"},"geometry":{"type":"Polygon","coordinates":[[[70.962315,42.266154],[71.186281,42.704293],[71.844638,42.845395],[73.489758,42.500894],[73.645304,43.091272],[74.212866,43.298339],[75.636965,42.8779],[76.000354,42.988022],[77.658392,42.960686],[79.142177,42.856092],[79.643645,42.496683],[80.25999,42.349999],[80.11943,42.123941],[78.543661,41.582243],[78.187197,41.185316],[76.904484,41.066486],[76.526368,40.427946],[75.467828,40 [...]
+{"type":"Feature","id":"KHM","properties":{"name":"Cambodia"},"geometry":{"type":"Polygon","coordinates":[[[103.49728,10.632555],[103.09069,11.153661],[102.584932,12.186595],[102.348099,13.394247],[102.988422,14.225721],[104.281418,14.416743],[105.218777,14.273212],[106.043946,13.881091],[106.496373,14.570584],[107.382727,14.202441],[107.614548,13.535531],[107.491403,12.337206],[105.810524,11.567615],[106.24967,10.961812],[105.199915,10.88931],[104.334335,10.486544],[103.49728,10.632555]]]}},
+{"type":"Feature","id":"KOR","properties":{"name":"South Korea"},"geometry":{"type":"Polygon","coordinates":[[[128.349716,38.612243],[129.21292,37.432392],[129.46045,36.784189],[129.468304,35.632141],[129.091377,35.082484],[128.18585,34.890377],[127.386519,34.475674],[126.485748,34.390046],[126.37392,34.93456],[126.559231,35.684541],[126.117398,36.725485],[126.860143,36.893924],[126.174759,37.749686],[126.237339,37.840378],[126.68372,37.804773],[127.073309,38.256115],[127.780035,38.30453 [...]
+{"type":"Feature","id":"CS-KM","properties":{"name":"Kosovo"},"geometry":{"type":"Polygon","coordinates":[[[20.76216,42.05186],[20.71731,41.84711],[20.59023,41.85541],[20.52295,42.21787],[20.28374,42.32025],[20.0707,42.58863],[20.25758,42.81275],[20.49679,42.88469],[20.63508,43.21671],[20.81448,43.27205],[20.95651,43.13094],[21.143395,43.068685],[21.27421,42.90959],[21.43866,42.86255],[21.63302,42.67717],[21.77505,42.6827],[21.66292,42.43922],[21.54332,42.32025],[21.576636,42.245224],[21 [...]
+{"type":"Feature","id":"KWT","properties":{"name":"Kuwait"},"geometry":{"type":"Polygon","coordinates":[[[47.974519,29.975819],[48.183189,29.534477],[48.093943,29.306299],[48.416094,28.552004],[47.708851,28.526063],[47.459822,29.002519],[46.568713,29.099025],[47.302622,30.05907],[47.974519,29.975819]]]}},
+{"type":"Feature","id":"LAO","properties":{"name":"Laos"},"geometry":{"type":"Polygon","coordinates":[[[105.218777,14.273212],[105.544338,14.723934],[105.589039,15.570316],[104.779321,16.441865],[104.716947,17.428859],[103.956477,18.240954],[103.200192,18.309632],[102.998706,17.961695],[102.413005,17.932782],[102.113592,18.109102],[101.059548,17.512497],[101.035931,18.408928],[101.282015,19.462585],[100.606294,19.508344],[100.548881,20.109238],[100.115988,20.41785],[100.329101,20.786122] [...]
+{"type":"Feature","id":"LBN","properties":{"name":"Lebanon"},"geometry":{"type":"Polygon","coordinates":[[[35.821101,33.277426],[35.552797,33.264275],[35.460709,33.08904],[35.126053,33.0909],[35.482207,33.90545],[35.979592,34.610058],[35.998403,34.644914],[36.448194,34.593935],[36.61175,34.201789],[36.06646,33.824912],[35.821101,33.277426]]]}},
+{"type":"Feature","id":"LBR","properties":{"name":"Liberia"},"geometry":{"type":"Polygon","coordinates":[[[-7.712159,4.364566],[-7.974107,4.355755],[-9.004794,4.832419],[-9.91342,5.593561],[-10.765384,6.140711],[-11.438779,6.785917],[-11.199802,7.105846],[-11.146704,7.396706],[-10.695595,7.939464],[-10.230094,8.406206],[-10.016567,8.428504],[-9.755342,8.541055],[-9.33728,7.928534],[-9.403348,7.526905],[-9.208786,7.313921],[-8.926065,7.309037],[-8.722124,7.711674],[-8.439298,7.686043],[-8 [...]
+{"type":"Feature","id":"LBY","properties":{"name":"Libya"},"geometry":{"type":"Polygon","coordinates":[[[14.8513,22.86295],[14.143871,22.491289],[13.581425,23.040506],[11.999506,23.471668],[11.560669,24.097909],[10.771364,24.562532],[10.303847,24.379313],[9.948261,24.936954],[9.910693,25.365455],[9.319411,26.094325],[9.716286,26.512206],[9.629056,27.140953],[9.756128,27.688259],[9.683885,28.144174],[9.859998,28.95999],[9.805634,29.424638],[9.48214,30.307556],[9.970017,30.539325],[10.0565 [...]
+{"type":"Feature","id":"LKA","properties":{"name":"Sri Lanka"},"geometry":{"type":"Polygon","coordinates":[[[81.787959,7.523055],[81.637322,6.481775],[81.21802,6.197141],[80.348357,5.96837],[79.872469,6.763463],[79.695167,8.200843],[80.147801,9.824078],[80.838818,9.268427],[81.304319,8.564206],[81.787959,7.523055]]]}},
+{"type":"Feature","id":"LSO","properties":{"name":"Lesotho"},"geometry":{"type":"Polygon","coordinates":[[[28.978263,-28.955597],[29.325166,-29.257387],[29.018415,-29.743766],[28.8484,-30.070051],[28.291069,-30.226217],[28.107205,-30.545732],[27.749397,-30.645106],[26.999262,-29.875954],[27.532511,-29.242711],[28.074338,-28.851469],[28.5417,-28.647502],[28.978263,-28.955597]]]}},
+{"type":"Feature","id":"LTU","properties":{"name":"Lithuania"},"geometry":{"type":"Polygon","coordinates":[[[22.731099,54.327537],[22.651052,54.582741],[22.757764,54.856574],[22.315724,55.015299],[21.268449,55.190482],[21.0558,56.031076],[22.201157,56.337802],[23.878264,56.273671],[24.860684,56.372528],[25.000934,56.164531],[25.533047,56.100297],[26.494331,55.615107],[26.588279,55.167176],[25.768433,54.846963],[25.536354,54.282423],[24.450684,53.905702],[23.484128,53.912498],[23.243987,5 [...]
+{"type":"Feature","id":"LUX","properties":{"name":"Luxembourg"},"geometry":{"type":"Polygon","coordinates":[[[6.043073,50.128052],[6.242751,49.902226],[6.18632,49.463803],[5.897759,49.442667],[5.674052,49.529484],[5.782417,50.090328],[6.043073,50.128052]]]}},
+{"type":"Feature","id":"LVA","properties":{"name":"Latvia"},"geometry":{"type":"Polygon","coordinates":[[[21.0558,56.031076],[21.090424,56.783873],[21.581866,57.411871],[22.524341,57.753374],[23.318453,57.006236],[24.12073,57.025693],[24.312863,57.793424],[25.164594,57.970157],[25.60281,57.847529],[26.463532,57.476389],[27.288185,57.474528],[27.770016,57.244258],[27.855282,56.759326],[28.176709,56.16913],[27.10246,55.783314],[26.494331,55.615107],[25.533047,56.100297],[25.000934,56.16453 [...]
+{"type":"Feature","id":"MAR","properties":{"name":"Morocco"},"geometry":{"type":"Polygon","coordinates":[[[-5.193863,35.755182],[-4.591006,35.330712],[-3.640057,35.399855],[-2.604306,35.179093],[-2.169914,35.168396],[-1.792986,34.527919],[-1.733455,33.919713],[-1.388049,32.864015],[-1.124551,32.651522],[-1.307899,32.262889],[-2.616605,32.094346],[-3.06898,31.724498],[-3.647498,31.637294],[-3.690441,30.896952],[-4.859646,30.501188],[-5.242129,30.000443],[-6.060632,29.7317],[-7.059228,29.5 [...]
+{"type":"Feature","id":"MDA","properties":{"name":"Moldova"},"geometry":{"type":"Polygon","coordinates":[[[26.619337,48.220726],[26.857824,48.368211],[27.522537,48.467119],[28.259547,48.155562],[28.670891,48.118149],[29.122698,47.849095],[29.050868,47.510227],[29.415135,47.346645],[29.559674,46.928583],[29.908852,46.674361],[29.83821,46.525326],[30.024659,46.423937],[29.759972,46.349988],[29.170654,46.379262],[29.072107,46.517678],[28.862972,46.437889],[28.933717,46.25883],[28.659987,45. [...]
+{"type":"Feature","id":"MDG","properties":{"name":"Madagascar"},"geometry":{"type":"Polygon","coordinates":[[[49.543519,-12.469833],[49.808981,-12.895285],[50.056511,-13.555761],[50.217431,-14.758789],[50.476537,-15.226512],[50.377111,-15.706069],[50.200275,-16.000263],[49.860606,-15.414253],[49.672607,-15.710204],[49.863344,-16.451037],[49.774564,-16.875042],[49.498612,-17.106036],[49.435619,-17.953064],[49.041792,-19.118781],[48.548541,-20.496888],[47.930749,-22.391501],[47.547723,-23. [...]
+{"type":"Feature","id":"MEX","properties":{"name":"Mexico"},"geometry":{"type":"Polygon","coordinates":[[[-97.140008,25.869997],[-97.528072,24.992144],[-97.702946,24.272343],[-97.776042,22.93258],[-97.872367,22.444212],[-97.699044,21.898689],[-97.38896,21.411019],[-97.189333,20.635433],[-96.525576,19.890931],[-96.292127,19.320371],[-95.900885,18.828024],[-94.839063,18.562717],[-94.42573,18.144371],[-93.548651,18.423837],[-92.786114,18.524839],[-92.037348,18.704569],[-91.407903,18.876083] [...]
+{"type":"Feature","id":"MKD","properties":{"name":"Macedonia"},"geometry":{"type":"Polygon","coordinates":[[[20.59023,41.85541],[20.71731,41.84711],[20.76216,42.05186],[21.3527,42.2068],[21.576636,42.245224],[21.91708,42.30364],[22.380526,42.32026],[22.881374,41.999297],[22.952377,41.337994],[22.76177,41.3048],[22.597308,41.130487],[22.055378,41.149866],[21.674161,40.931275],[21.02004,40.842727],[20.60518,41.08622],[20.46315,41.51509],[20.59023,41.85541]]]}},
+{"type":"Feature","id":"MLI","properties":{"name":"Mali"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-11.834208,14.799097],[-11.666078,15.388208],[-11.349095,15.411256],[-10.650791,15.132746],[-10.086846,15.330486],[-9.700255,15.264107],[-9.550238,15.486497],[-5.537744,15.50169],[-5.315277,16.201854],[-5.488523,16.325102],[-5.971129,20.640833],[-6.453787,24.956591],[-4.923337,24.974574],[-1.550055,22.792666],[1.823228,20.610809],[2.060991,20.142233],[2.683588,19. [...]
+{"type":"Feature","id":"MMR","properties":{"name":"Myanmar"},"geometry":{"type":"Polygon","coordinates":[[[99.543309,20.186598],[98.959676,19.752981],[98.253724,19.708203],[97.797783,18.62708],[97.375896,18.445438],[97.859123,17.567946],[98.493761,16.837836],[98.903348,16.177824],[98.537376,15.308497],[98.192074,15.123703],[98.430819,14.622028],[99.097755,13.827503],[99.212012,13.269294],[99.196354,12.804748],[99.587286,11.892763],[99.038121,10.960546],[98.553551,9.93296],[98.457174,10.6 [...]
+{"type":"Feature","id":"MNE","properties":{"name":"Montenegro"},"geometry":{"type":"Polygon","coordinates":[[[19.801613,42.500093],[19.738051,42.688247],[19.30449,42.19574],[19.37177,41.87755],[19.16246,41.95502],[18.88214,42.28151],[18.45,42.48],[18.56,42.65],[18.70648,43.20011],[19.03165,43.43253],[19.21852,43.52384],[19.48389,43.35229],[19.63,43.21378],[19.95857,43.10604],[20.3398,42.89852],[20.25758,42.81275],[20.0707,42.58863],[19.801613,42.500093]]]}},
+{"type":"Feature","id":"MNG","properties":{"name":"Mongolia"},"geometry":{"type":"Polygon","coordinates":[[[87.751264,49.297198],[88.805567,49.470521],[90.713667,50.331812],[92.234712,50.802171],[93.104219,50.49529],[94.147566,50.480537],[94.815949,50.013433],[95.814028,49.977467],[97.259728,49.726061],[98.231762,50.422401],[97.82574,51.010995],[98.861491,52.047366],[99.981732,51.634006],[100.88948,51.516856],[102.065223,51.259921],[102.255909,50.510561],[103.676545,50.089966],[104.62155 [...]
+{"type":"Feature","id":"MOZ","properties":{"name":"Mozambique"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[35.312398,-11.439146],[36.514082,-11.720938],[36.775151,-11.594537],[37.471284,-11.568751],[37.827645,-11.268769],[38.427557,-11.285202],[39.52103,-10.896854],[40.316589,-10.317096],[40.478387,-10.765441],[40.437253,-11.761711],[40.560811,-12.639177],[40.59962,-14.201975],[40.775475,-14.691764],[40.477251,-15.406294],[40.089264,-16.100774],[39.452559,-16.720 [...]
+{"type":"Feature","id":"MRT","properties":{"name":"Mauritania"},"geometry":{"type":"Polygon","coordinates":[[[-12.17075,14.616834],[-12.830658,15.303692],[-13.435738,16.039383],[-14.099521,16.304302],[-14.577348,16.598264],[-15.135737,16.587282],[-15.623666,16.369337],[-16.12069,16.455663],[-16.463098,16.135036],[-16.549708,16.673892],[-16.270552,17.166963],[-16.146347,18.108482],[-16.256883,19.096716],[-16.377651,19.593817],[-16.277838,20.092521],[-16.536324,20.567866],[-17.063423,20.99 [...]
+{"type":"Feature","id":"MWI","properties":{"name":"Malawi"},"geometry":{"type":"Polygon","coordinates":[[[34.559989,-11.52002],[34.280006,-12.280025],[34.559989,-13.579998],[34.907151,-13.565425],[35.267956,-13.887834],[35.686845,-14.611046],[35.771905,-15.896859],[35.339063,-16.10744],[35.03381,-16.8013],[34.381292,-16.18356],[34.307291,-15.478641],[34.517666,-15.013709],[34.459633,-14.61301],[34.064825,-14.35995],[33.7897,-14.451831],[33.214025,-13.97186],[32.688165,-13.712858],[32.991 [...]
+{"type":"Feature","id":"MYS","properties":{"name":"Malaysia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[101.075516,6.204867],[101.154219,5.691384],[101.814282,5.810808],[102.141187,6.221636],[102.371147,6.128205],[102.961705,5.524495],[103.381215,4.855001],[103.438575,4.181606],[103.332122,3.726698],[103.429429,3.382869],[103.502448,2.791019],[103.854674,2.515454],[104.247932,1.631141],[104.228811,1.293048],[103.519707,1.226334],[102.573615,1.967115],[101.390638,2.760814],[101. [...]
+{"type":"Feature","id":"NAM","properties":{"name":"Namibia"},"geometry":{"type":"Polygon","coordinates":[[[16.344977,-28.576705],[15.601818,-27.821247],[15.210472,-27.090956],[14.989711,-26.117372],[14.743214,-25.39292],[14.408144,-23.853014],[14.385717,-22.656653],[14.257714,-22.111208],[13.868642,-21.699037],[13.352498,-20.872834],[12.826845,-19.673166],[12.608564,-19.045349],[11.794919,-18.069129],[11.734199,-17.301889],[12.215461,-17.111668],[12.814081,-16.941343],[13.462362,-16.9712 [...]
+{"type":"Feature","id":"NCL","properties":{"name":"New Caledonia"},"geometry":{"type":"Polygon","coordinates":[[[165.77999,-21.080005],[166.599991,-21.700019],[167.120011,-22.159991],[166.740035,-22.399976],[166.189732,-22.129708],[165.474375,-21.679607],[164.829815,-21.14982],[164.167995,-20.444747],[164.029606,-20.105646],[164.459967,-20.120012],[165.020036,-20.459991],[165.460009,-20.800022],[165.77999,-21.080005]]]}},
+{"type":"Feature","id":"NER","properties":{"name":"Niger"},"geometry":{"type":"Polygon","coordinates":[[[2.154474,11.94015],[2.177108,12.625018],[1.024103,12.851826],[0.993046,13.33575],[0.429928,13.988733],[0.295646,14.444235],[0.374892,14.928908],[1.015783,14.968182],[1.385528,15.323561],[2.749993,15.409525],[3.638259,15.56812],[3.723422,16.184284],[4.27021,16.852227],[4.267419,19.155265],[5.677566,19.601207],[8.572893,21.565661],[11.999506,23.471668],[13.581425,23.040506],[14.143871,2 [...]
+{"type":"Feature","id":"NGA","properties":{"name":"Nigeria"},"geometry":{"type":"Polygon","coordinates":[[[8.500288,4.771983],[7.462108,4.412108],[7.082596,4.464689],[6.698072,4.240594],[5.898173,4.262453],[5.362805,4.887971],[5.033574,5.611802],[4.325607,6.270651],[3.57418,6.2583],[2.691702,6.258817],[2.749063,7.870734],[2.723793,8.506845],[2.912308,9.137608],[3.220352,9.444153],[3.705438,10.06321],[3.60007,10.332186],[3.797112,10.734746],[3.572216,11.327939],[3.61118,11.660167],[3.6806 [...]
+{"type":"Feature","id":"NIC","properties":{"name":"Nicaragua"},"geometry":{"type":"Polygon","coordinates":[[[-85.71254,11.088445],[-86.058488,11.403439],[-86.52585,11.806877],[-86.745992,12.143962],[-87.167516,12.458258],[-87.668493,12.90991],[-87.557467,13.064552],[-87.392386,12.914018],[-87.316654,12.984686],[-87.005769,13.025794],[-86.880557,13.254204],[-86.733822,13.263093],[-86.755087,13.754845],[-86.520708,13.778487],[-86.312142,13.771356],[-86.096264,14.038187],[-85.801295,13.8360 [...]
+{"type":"Feature","id":"NLD","properties":{"name":"Netherlands"},"geometry":{"type":"Polygon","coordinates":[[[6.074183,53.510403],[6.90514,53.482162],[7.092053,53.144043],[6.84287,52.22844],[6.589397,51.852029],[5.988658,51.851616],[6.156658,50.803721],[5.606976,51.037298],[4.973991,51.475024],[4.047071,51.267259],[3.314971,51.345755],[3.830289,51.620545],[4.705997,53.091798],[6.074183,53.510403]]]}},
+{"type":"Feature","id":"NOR","properties":{"name":"Norway"},"geometry":{"type":"MultiPolygon","coordinates":[[[[28.165547,71.185474],[31.293418,70.453788],[30.005435,70.186259],[31.101079,69.55808],[29.399581,69.156916],[28.59193,69.064777],[29.015573,69.766491],[27.732292,70.164193],[26.179622,69.825299],[25.689213,69.092114],[24.735679,68.649557],[23.66205,68.891247],[22.356238,68.841741],[21.244936,69.370443],[20.645593,69.106247],[20.025269,69.065139],[19.87856,68.407194],[17.993868, [...]
+{"type":"Feature","id":"NPL","properties":{"name":"Nepal"},"geometry":{"type":"Polygon","coordinates":[[[88.120441,27.876542],[88.043133,27.445819],[88.174804,26.810405],[88.060238,26.414615],[87.227472,26.397898],[86.024393,26.630985],[85.251779,26.726198],[84.675018,27.234901],[83.304249,27.364506],[81.999987,27.925479],[81.057203,28.416095],[80.088425,28.79447],[80.476721,29.729865],[81.111256,30.183481],[81.525804,30.422717],[82.327513,30.115268],[83.337115,29.463732],[83.898993,29.3 [...]
+{"type":"Feature","id":"NZL","properties":{"name":"New Zealand"},"geometry":{"type":"MultiPolygon","coordinates":[[[[173.020375,-40.919052],[173.247234,-41.331999],[173.958405,-40.926701],[174.247587,-41.349155],[174.248517,-41.770008],[173.876447,-42.233184],[173.22274,-42.970038],[172.711246,-43.372288],[173.080113,-43.853344],[172.308584,-43.865694],[171.452925,-44.242519],[171.185138,-44.897104],[170.616697,-45.908929],[169.831422,-46.355775],[169.332331,-46.641235],[168.411354,-46.6 [...]
+{"type":"Feature","id":"OMN","properties":{"name":"Oman"},"geometry":{"type":"MultiPolygon","coordinates":[[[[58.861141,21.114035],[58.487986,20.428986],[58.034318,20.481437],[57.826373,20.243002],[57.665762,19.736005],[57.7887,19.06757],[57.694391,18.94471],[57.234264,18.947991],[56.609651,18.574267],[56.512189,18.087113],[56.283521,17.876067],[55.661492,17.884128],[55.269939,17.632309],[55.2749,17.228354],[54.791002,16.950697],[54.239253,17.044981],[53.570508,16.707663],[53.108573,16.6 [...]
+{"type":"Feature","id":"PAK","properties":{"name":"Pakistan"},"geometry":{"type":"Polygon","coordinates":[[[75.158028,37.133031],[75.896897,36.666806],[76.192848,35.898403],[77.837451,35.49401],[76.871722,34.653544],[75.757061,34.504923],[74.240203,34.748887],[73.749948,34.317699],[74.104294,33.441473],[74.451559,32.7649],[75.258642,32.271105],[74.405929,31.692639],[74.42138,30.979815],[73.450638,29.976413],[72.823752,28.961592],[71.777666,27.91318],[70.616496,27.989196],[69.514393,26.94 [...]
+{"type":"Feature","id":"PAN","properties":{"name":"Panama"},"geometry":{"type":"Polygon","coordinates":[[[-77.881571,7.223771],[-78.214936,7.512255],[-78.429161,8.052041],[-78.182096,8.319182],[-78.435465,8.387705],[-78.622121,8.718124],[-79.120307,8.996092],[-79.557877,8.932375],[-79.760578,8.584515],[-80.164481,8.333316],[-80.382659,8.298409],[-80.480689,8.090308],[-80.00369,7.547524],[-80.276671,7.419754],[-80.421158,7.271572],[-80.886401,7.220541],[-81.059543,7.817921],[-81.189716,7. [...]
+{"type":"Feature","id":"PER","properties":{"name":"Peru"},"geometry":{"type":"Polygon","coordinates":[[[-69.590424,-17.580012],[-69.858444,-18.092694],[-70.372572,-18.347975],[-71.37525,-17.773799],[-71.462041,-17.363488],[-73.44453,-16.359363],[-75.237883,-15.265683],[-76.009205,-14.649286],[-76.423469,-13.823187],[-76.259242,-13.535039],[-77.106192,-12.222716],[-78.092153,-10.377712],[-79.036953,-8.386568],[-79.44592,-7.930833],[-79.760578,-7.194341],[-80.537482,-6.541668],[-81.249996, [...]
+{"type":"Feature","id":"PHL","properties":{"name":"Philippines"},"geometry":{"type":"MultiPolygon","coordinates":[[[[126.376814,8.414706],[126.478513,7.750354],[126.537424,7.189381],[126.196773,6.274294],[125.831421,7.293715],[125.363852,6.786485],[125.683161,6.049657],[125.396512,5.581003],[124.219788,6.161355],[123.93872,6.885136],[124.243662,7.36061],[123.610212,7.833527],[123.296071,7.418876],[122.825506,7.457375],[122.085499,6.899424],[121.919928,7.192119],[122.312359,8.034962],[122 [...]
+{"type":"Feature","id":"PNG","properties":{"name":"Papua New Guinea"},"geometry":{"type":"MultiPolygon","coordinates":[[[[155.880026,-6.819997],[155.599991,-6.919991],[155.166994,-6.535931],[154.729192,-5.900828],[154.514114,-5.139118],[154.652504,-5.042431],[154.759991,-5.339984],[155.062918,-5.566792],[155.547746,-6.200655],[156.019965,-6.540014],[155.880026,-6.819997]]],[[[151.982796,-5.478063],[151.459107,-5.56028],[151.30139,-5.840728],[150.754447,-6.083763],[150.241197,-6.317754],[ [...]
+{"type":"Feature","id":"POL","properties":{"name":"Poland"},"geometry":{"type":"Polygon","coordinates":[[[15.016996,51.106674],[14.607098,51.745188],[14.685026,52.089947],[14.4376,52.62485],[14.074521,52.981263],[14.353315,53.248171],[14.119686,53.757029],[14.8029,54.050706],[16.363477,54.513159],[17.622832,54.851536],[18.620859,54.682606],[18.696255,54.438719],[19.66064,54.426084],[20.892245,54.312525],[22.731099,54.327537],[23.243987,54.220567],[23.484128,53.912498],[23.527536,53.47012 [...]
+{"type":"Feature","id":"PRI","properties":{"name":"Puerto Rico"},"geometry":{"type":"Polygon","coordinates":[[[-66.282434,18.514762],[-65.771303,18.426679],[-65.591004,18.228035],[-65.847164,17.975906],[-66.599934,17.981823],[-67.184162,17.946553],[-67.242428,18.37446],[-67.100679,18.520601],[-66.282434,18.514762]]]}},
+{"type":"Feature","id":"PRK","properties":{"name":"North Korea"},"geometry":{"type":"Polygon","coordinates":[[[130.640016,42.395009],[130.780007,42.220007],[130.400031,42.280004],[129.965949,41.941368],[129.667362,41.601104],[129.705189,40.882828],[129.188115,40.661808],[129.0104,40.485436],[128.633368,40.189847],[127.967414,40.025413],[127.533436,39.75685],[127.50212,39.323931],[127.385434,39.213472],[127.783343,39.050898],[128.349716,38.612243],[128.205746,38.370397],[127.780035,38.304 [...]
+{"type":"Feature","id":"PRT","properties":{"name":"Portugal"},"geometry":{"type":"Polygon","coordinates":[[[-9.034818,41.880571],[-8.671946,42.134689],[-8.263857,42.280469],[-8.013175,41.790886],[-7.422513,41.792075],[-7.251309,41.918346],[-6.668606,41.883387],[-6.389088,41.381815],[-6.851127,41.111083],[-6.86402,40.330872],[-7.026413,40.184524],[-7.066592,39.711892],[-7.498632,39.629571],[-7.098037,39.030073],[-7.374092,38.373059],[-7.029281,38.075764],[-7.166508,37.803894],[-7.537105,3 [...]
+{"type":"Feature","id":"PRY","properties":{"name":"Paraguay"},"geometry":{"type":"Polygon","coordinates":[[[-62.685057,-22.249029],[-62.291179,-21.051635],[-62.265961,-20.513735],[-61.786326,-19.633737],[-60.043565,-19.342747],[-59.115042,-19.356906],[-58.183471,-19.868399],[-58.166392,-20.176701],[-57.870674,-20.732688],[-57.937156,-22.090176],[-56.88151,-22.282154],[-56.473317,-22.0863],[-55.797958,-22.35693],[-55.610683,-22.655619],[-55.517639,-23.571998],[-55.400747,-23.956935],[-55. [...]
+{"type":"Feature","id":"QAT","properties":{"name":"Qatar"},"geometry":{"type":"Polygon","coordinates":[[[50.810108,24.754743],[50.743911,25.482424],[51.013352,26.006992],[51.286462,26.114582],[51.589079,25.801113],[51.6067,25.21567],[51.389608,24.627386],[51.112415,24.556331],[50.810108,24.754743]]]}},
+{"type":"Feature","id":"ROU","properties":{"name":"Romania"},"geometry":{"type":"Polygon","coordinates":[[[22.710531,47.882194],[23.142236,48.096341],[23.760958,47.985598],[24.402056,47.981878],[24.866317,47.737526],[25.207743,47.891056],[25.945941,47.987149],[26.19745,48.220881],[26.619337,48.220726],[26.924176,48.123264],[27.233873,47.826771],[27.551166,47.405117],[28.12803,46.810476],[28.160018,46.371563],[28.054443,45.944586],[28.233554,45.488283],[28.679779,45.304031],[29.149725,45. [...]
+{"type":"Feature","id":"RUS","properties":{"name":"Russia"},"geometry":{"type":"MultiPolygon","coordinates":[[[[143.648007,50.7476],[144.654148,48.976391],[143.173928,49.306551],[142.558668,47.861575],[143.533492,46.836728],[143.505277,46.137908],[142.747701,46.740765],[142.09203,45.966755],[141.906925,46.805929],[142.018443,47.780133],[141.904445,48.859189],[142.1358,49.615163],[142.179983,50.952342],[141.594076,51.935435],[141.682546,53.301966],[142.606934,53.762145],[142.209749,54.225 [...]
+{"type":"Feature","id":"RWA","properties":{"name":"Rwanda"},"geometry":{"type":"Polygon","coordinates":[[[30.419105,-1.134659],[30.816135,-1.698914],[30.758309,-2.28725],[30.469696,-2.413858],[29.938359,-2.348487],[29.632176,-2.917858],[29.024926,-2.839258],[29.117479,-2.292211],[29.254835,-2.21511],[29.291887,-1.620056],[29.579466,-1.341313],[29.821519,-1.443322],[30.419105,-1.134659]]]}},
+{"type":"Feature","id":"ESH","properties":{"name":"Western Sahara"},"geometry":{"type":"Polygon","coordinates":[[[-8.794884,27.120696],[-8.817828,27.656426],[-8.66559,27.656426],[-8.665124,27.589479],[-8.6844,27.395744],[-8.687294,25.881056],[-11.969419,25.933353],[-11.937224,23.374594],[-12.874222,23.284832],[-13.118754,22.77122],[-12.929102,21.327071],[-16.845194,21.333323],[-17.063423,20.999752],[-17.020428,21.42231],[-17.002962,21.420734],[-14.750955,21.5006],[-14.630833,21.86094],[- [...]
+{"type":"Feature","id":"SAU","properties":{"name":"Saudi Arabia"},"geometry":{"type":"Polygon","coordinates":[[[42.779332,16.347891],[42.649573,16.774635],[42.347989,17.075806],[42.270888,17.474722],[41.754382,17.833046],[41.221391,18.6716],[40.939341,19.486485],[40.247652,20.174635],[39.801685,20.338862],[39.139399,21.291905],[39.023696,21.986875],[39.066329,22.579656],[38.492772,23.688451],[38.02386,24.078686],[37.483635,24.285495],[37.154818,24.858483],[37.209491,25.084542],[36.931627 [...]
+{"type":"Feature","id":"SDN","properties":{"name":"Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.824963,9.484061],[33.842131,9.981915],[33.721959,10.325262],[33.206938,10.720112],[33.086766,11.441141],[33.206938,12.179338],[32.743419,12.248008],[32.67475,12.024832],[32.073892,11.97333],[32.314235,11.681484],[32.400072,11.080626],[31.850716,10.531271],[31.352862,9.810241],[30.837841,9.707237],[29.996639,10.290927],[29.618957,10.084919],[29.515953,9.793074], [...]
+{"type":"Feature","id":"SDS","properties":{"name":"South Sudan"},"geometry":{"type":"Polygon","coordinates":[[[33.963393,9.464285],[33.97498,8.68456],[33.8255,8.37916],[33.2948,8.35458],[32.95418,7.78497],[33.56829,7.71334],[34.0751,7.22595],[34.25032,6.82607],[34.70702,6.59422],[35.298007,5.506],[34.620196,4.847123],[34.005,4.249885],[33.39,3.79],[32.68642,3.79232],[31.88145,3.55827],[31.24556,3.7819],[30.83385,3.50917],[29.95349,4.1737],[29.715995,4.600805],[29.159078,4.389267],[28.696 [...]
+{"type":"Feature","id":"SEN","properties":{"name":"Senegal"},"geometry":{"type":"Polygon","coordinates":[[[-16.713729,13.594959],[-17.126107,14.373516],[-17.625043,14.729541],[-17.185173,14.919477],[-16.700706,15.621527],[-16.463098,16.135036],[-16.12069,16.455663],[-15.623666,16.369337],[-15.135737,16.587282],[-14.577348,16.598264],[-14.099521,16.304302],[-13.435738,16.039383],[-12.830658,15.303692],[-12.17075,14.616834],[-12.124887,13.994727],[-11.927716,13.422075],[-11.553398,13.14121 [...]
+{"type":"Feature","id":"SLB","properties":{"name":"Solomon Islands"},"geometry":{"type":"MultiPolygon","coordinates":[[[[162.119025,-10.482719],[162.398646,-10.826367],[161.700032,-10.820011],[161.319797,-10.204751],[161.917383,-10.446701],[162.119025,-10.482719]]],[[[160.852229,-9.872937],[160.462588,-9.89521],[159.849447,-9.794027],[159.640003,-9.63998],[159.702945,-9.24295],[160.362956,-9.400304],[160.688518,-9.610162],[160.852229,-9.872937]]],[[[161.679982,-9.599982],[161.529397,-9.7 [...]
+{"type":"Feature","id":"SLE","properties":{"name":"Sierra Leone"},"geometry":{"type":"Polygon","coordinates":[[[-11.438779,6.785917],[-11.708195,6.860098],[-12.428099,7.262942],[-12.949049,7.798646],[-13.124025,8.163946],[-13.24655,8.903049],[-12.711958,9.342712],[-12.596719,9.620188],[-12.425929,9.835834],[-12.150338,9.858572],[-11.917277,10.046984],[-11.117481,10.045873],[-10.839152,9.688246],[-10.622395,9.26791],[-10.65477,8.977178],[-10.494315,8.715541],[-10.505477,8.348896],[-10.230 [...]
+{"type":"Feature","id":"SLV","properties":{"name":"El Salvador"},"geometry":{"type":"Polygon","coordinates":[[[-87.793111,13.38448],[-87.904112,13.149017],[-88.483302,13.163951],[-88.843228,13.259734],[-89.256743,13.458533],[-89.812394,13.520622],[-90.095555,13.735338],[-90.064678,13.88197],[-89.721934,14.134228],[-89.534219,14.244816],[-89.587343,14.362586],[-89.353326,14.424133],[-89.058512,14.340029],[-88.843073,14.140507],[-88.541231,13.980155],[-88.503998,13.845486],[-88.065343,13.9 [...]
+{"type":"Feature","id":"-99","properties":{"name":"Somaliland"},"geometry":{"type":"Polygon","coordinates":[[[48.93813,9.451749],[48.486736,8.837626],[47.78942,8.003],[46.948328,7.996877],[43.67875,9.18358],[43.296975,9.540477],[42.92812,10.02194],[42.55876,10.57258],[42.776852,10.926879],[43.145305,11.46204],[43.47066,11.27771],[43.666668,10.864169],[44.117804,10.445538],[44.614259,10.442205],[45.556941,10.698029],[46.645401,10.816549],[47.525658,11.127228],[48.021596,11.193064],[48.378 [...]
+{"type":"Feature","id":"SOM","properties":{"name":"Somalia"},"geometry":{"type":"Polygon","coordinates":[[[49.72862,11.5789],[50.25878,11.67957],[50.73202,12.0219],[51.1112,12.02464],[51.13387,11.74815],[51.04153,11.16651],[51.04531,10.6409],[50.83418,10.27972],[50.55239,9.19874],[50.07092,8.08173],[49.4527,6.80466],[48.59455,5.33911],[47.74079,4.2194],[46.56476,2.85529],[45.56399,2.04576],[44.06815,1.05283],[43.13597,0.2922],[42.04157,-0.91916],[41.81095,-1.44647],[41.58513,-1.68325],[4 [...]
+{"type":"Feature","id":"SRB","properties":{"name":"Republic of Serbia"},"geometry":{"type":"Polygon","coordinates":[[[20.874313,45.416375],[21.483526,45.18117],[21.562023,44.768947],[22.145088,44.478422],[22.459022,44.702517],[22.705726,44.578003],[22.474008,44.409228],[22.65715,44.234923],[22.410446,44.008063],[22.500157,43.642814],[22.986019,43.211161],[22.604801,42.898519],[22.436595,42.580321],[22.545012,42.461362],[22.380526,42.32026],[21.91708,42.30364],[21.576636,42.245224],[21.54 [...]
+{"type":"Feature","id":"SUR","properties":{"name":"Suriname"},"geometry":{"type":"Polygon","coordinates":[[[-57.147436,5.97315],[-55.949318,5.772878],[-55.84178,5.953125],[-55.03325,6.025291],[-53.958045,5.756548],[-54.478633,4.896756],[-54.399542,4.212611],[-54.006931,3.620038],[-54.181726,3.18978],[-54.269705,2.732392],[-54.524754,2.311849],[-55.097587,2.523748],[-55.569755,2.421506],[-55.973322,2.510364],[-56.073342,2.220795],[-55.9056,2.021996],[-55.995698,1.817667],[-56.539386,1.899 [...]
+{"type":"Feature","id":"SVK","properties":{"name":"Slovakia"},"geometry":{"type":"Polygon","coordinates":[[[18.853144,49.49623],[18.909575,49.435846],[19.320713,49.571574],[19.825023,49.217125],[20.415839,49.431453],[20.887955,49.328772],[21.607808,49.470107],[22.558138,49.085738],[22.280842,48.825392],[22.085608,48.422264],[21.872236,48.319971],[20.801294,48.623854],[20.473562,48.56285],[20.239054,48.327567],[19.769471,48.202691],[19.661364,48.266615],[19.174365,48.111379],[18.777025,48 [...]
+{"type":"Feature","id":"SVN","properties":{"name":"Slovenia"},"geometry":{"type":"Polygon","coordinates":[[[13.806475,46.509306],[14.632472,46.431817],[15.137092,46.658703],[16.011664,46.683611],[16.202298,46.852386],[16.370505,46.841327],[16.564808,46.503751],[15.768733,46.238108],[15.67153,45.834154],[15.323954,45.731783],[15.327675,45.452316],[14.935244,45.471695],[14.595109,45.634941],[14.411968,45.466166],[13.71506,45.500324],[13.93763,45.591016],[13.69811,46.016778],[13.806475,46.5 [...]
+{"type":"Feature","id":"SWE","properties":{"name":"Sweden"},"geometry":{"type":"Polygon","coordinates":[[[22.183173,65.723741],[21.213517,65.026005],[21.369631,64.413588],[19.778876,63.609554],[17.847779,62.7494],[17.119555,61.341166],[17.831346,60.636583],[18.787722,60.081914],[17.869225,58.953766],[16.829185,58.719827],[16.44771,57.041118],[15.879786,56.104302],[14.666681,56.200885],[14.100721,55.407781],[12.942911,55.361737],[12.625101,56.30708],[11.787942,57.441817],[11.027369,58.856 [...]
+{"type":"Feature","id":"SWZ","properties":{"name":"Swaziland"},"geometry":{"type":"Polygon","coordinates":[[[32.071665,-26.73382],[31.86806,-27.177927],[31.282773,-27.285879],[30.685962,-26.743845],[30.676609,-26.398078],[30.949667,-26.022649],[31.04408,-25.731452],[31.333158,-25.660191],[31.837778,-25.843332],[31.985779,-26.29178],[32.071665,-26.73382]]]}},
+{"type":"Feature","id":"SYR","properties":{"name":"Syria"},"geometry":{"type":"Polygon","coordinates":[[[38.792341,33.378686],[36.834062,32.312938],[35.719918,32.709192],[35.700798,32.716014],[35.836397,32.868123],[35.821101,33.277426],[36.06646,33.824912],[36.61175,34.201789],[36.448194,34.593935],[35.998403,34.644914],[35.905023,35.410009],[36.149763,35.821535],[36.41755,36.040617],[36.685389,36.259699],[36.739494,36.81752],[37.066761,36.623036],[38.167727,36.90121],[38.699891,36.71292 [...]
+{"type":"Feature","id":"TCD","properties":{"name":"Chad"},"geometry":{"type":"Polygon","coordinates":[[[14.495787,12.859396],[14.595781,13.330427],[13.954477,13.353449],[13.956699,13.996691],[13.540394,14.367134],[13.97217,15.68437],[15.247731,16.627306],[15.300441,17.92795],[15.685741,19.95718],[15.903247,20.387619],[15.487148,20.730415],[15.47106,21.04845],[15.096888,21.308519],[14.8513,22.86295],[15.86085,23.40972],[19.84926,21.49509],[23.83766,19.58047],[23.88689,15.61084],[23.02459, [...]
+{"type":"Feature","id":"TGO","properties":{"name":"Togo"},"geometry":{"type":"Polygon","coordinates":[[[1.865241,6.142158],[1.060122,5.928837],[0.836931,6.279979],[0.570384,6.914359],[0.490957,7.411744],[0.712029,8.312465],[0.461192,8.677223],[0.365901,9.465004],[0.36758,10.191213],[-0.049785,10.706918],[0.023803,11.018682],[0.899563,10.997339],[0.772336,10.470808],[1.077795,10.175607],[1.425061,9.825395],[1.463043,9.334624],[1.664478,9.12859],[1.618951,6.832038],[1.865241,6.142158]]]}},
+{"type":"Feature","id":"THA","properties":{"name":"Thailand"},"geometry":{"type":"Polygon","coordinates":[[[102.584932,12.186595],[101.687158,12.64574],[100.83181,12.627085],[100.978467,13.412722],[100.097797,13.406856],[100.018733,12.307001],[99.478921,10.846367],[99.153772,9.963061],[99.222399,9.239255],[99.873832,9.207862],[100.279647,8.295153],[100.459274,7.429573],[101.017328,6.856869],[101.623079,6.740622],[102.141187,6.221636],[101.814282,5.810808],[101.154219,5.691384],[101.07551 [...]
+{"type":"Feature","id":"TJK","properties":{"name":"Tajikistan"},"geometry":{"type":"Polygon","coordinates":[[[71.014198,40.244366],[70.648019,39.935754],[69.55961,40.103211],[69.464887,39.526683],[70.549162,39.604198],[71.784694,39.279463],[73.675379,39.431237],[73.928852,38.505815],[74.257514,38.606507],[74.864816,38.378846],[74.829986,37.990007],[74.980002,37.41999],[73.948696,37.421566],[73.260056,37.495257],[72.63689,37.047558],[72.193041,36.948288],[71.844638,36.738171],[71.448693,3 [...]
+{"type":"Feature","id":"TKM","properties":{"name":"Turkmenistan"},"geometry":{"type":"Polygon","coordinates":[[[61.210817,35.650072],[61.123071,36.491597],[60.377638,36.527383],[59.234762,37.412988],[58.436154,37.522309],[57.330434,38.029229],[56.619366,38.121394],[56.180375,37.935127],[55.511578,37.964117],[54.800304,37.392421],[53.921598,37.198918],[53.735511,37.906136],[53.880929,38.952093],[53.101028,39.290574],[53.357808,39.975286],[52.693973,40.033629],[52.915251,40.876523],[53.858 [...]
+{"type":"Feature","id":"TLS","properties":{"name":"East Timor"},"geometry":{"type":"Polygon","coordinates":[[[124.968682,-8.89279],[125.086246,-8.656887],[125.947072,-8.432095],[126.644704,-8.398247],[126.957243,-8.273345],[127.335928,-8.397317],[126.967992,-8.668256],[125.925885,-9.106007],[125.08852,-9.393173],[125.07002,-9.089987],[124.968682,-8.89279]]]}},
+{"type":"Feature","id":"TTO","properties":{"name":"Trinidad and Tobago"},"geometry":{"type":"Polygon","coordinates":[[[-61.68,10.76],[-61.105,10.89],[-60.895,10.855],[-60.935,10.11],[-61.77,10],[-61.95,10.09],[-61.66,10.365],[-61.68,10.76]]]}},
+{"type":"Feature","id":"TUN","properties":{"name":"Tunisia"},"geometry":{"type":"Polygon","coordinates":[[[9.48214,30.307556],[9.055603,32.102692],[8.439103,32.506285],[8.430473,32.748337],[7.612642,33.344115],[7.524482,34.097376],[8.140981,34.655146],[8.376368,35.479876],[8.217824,36.433177],[8.420964,36.946427],[9.509994,37.349994],[10.210002,37.230002],[10.18065,36.724038],[11.028867,37.092103],[11.100026,36.899996],[10.600005,36.41],[10.593287,35.947444],[10.939519,35.698984],[10.807 [...]
+{"type":"Feature","id":"TUR","properties":{"name":"Turkey"},"geometry":{"type":"MultiPolygon","coordinates":[[[[36.913127,41.335358],[38.347665,40.948586],[39.512607,41.102763],[40.373433,41.013673],[41.554084,41.535656],[42.619549,41.583173],[43.582746,41.092143],[43.752658,40.740201],[43.656436,40.253564],[44.400009,40.005],[44.79399,39.713003],[44.109225,39.428136],[44.421403,38.281281],[44.225756,37.971584],[44.772699,37.170445],[44.293452,37.001514],[43.942259,37.256228],[42.779126, [...]
+{"type":"Feature","id":"TWN","properties":{"name":"Taiwan"},"geometry":{"type":"Polygon","coordinates":[[[121.777818,24.394274],[121.175632,22.790857],[120.74708,21.970571],[120.220083,22.814861],[120.106189,23.556263],[120.69468,24.538451],[121.495044,25.295459],[121.951244,24.997596],[121.777818,24.394274]]]}},
+{"type":"Feature","id":"TZA","properties":{"name":"United Republic of Tanzania"},"geometry":{"type":"Polygon","coordinates":[[[33.903711,-0.95],[34.07262,-1.05982],[37.69869,-3.09699],[37.7669,-3.67712],[39.20222,-4.67677],[38.74054,-5.90895],[38.79977,-6.47566],[39.44,-6.84],[39.47,-7.1],[39.19469,-7.7039],[39.25203,-8.00781],[39.18652,-8.48551],[39.53574,-9.11237],[39.9496,-10.0984],[40.31659,-10.3171],[39.521,-10.89688],[38.427557,-11.285202],[37.82764,-11.26879],[37.47129,-11.56876], [...]
+{"type":"Feature","id":"UGA","properties":{"name":"Uganda"},"geometry":{"type":"Polygon","coordinates":[[[31.86617,-1.02736],[30.76986,-1.01455],[30.419105,-1.134659],[29.821519,-1.443322],[29.579466,-1.341313],[29.587838,-0.587406],[29.8195,-0.2053],[29.875779,0.59738],[30.086154,1.062313],[30.468508,1.583805],[30.85267,1.849396],[31.174149,2.204465],[30.77332,2.33989],[30.83385,3.50917],[31.24556,3.7819],[31.88145,3.55827],[32.68642,3.79232],[33.39,3.79],[34.005,4.249885],[34.47913,3.5 [...]
+{"type":"Feature","id":"UKR","properties":{"name":"Ukraine"},"geometry":{"type":"Polygon","coordinates":[[[31.785998,52.101678],[32.159412,52.061267],[32.412058,52.288695],[32.715761,52.238465],[33.7527,52.335075],[34.391731,51.768882],[34.141978,51.566413],[34.224816,51.255993],[35.022183,51.207572],[35.377924,50.773955],[35.356116,50.577197],[36.626168,50.225591],[37.39346,50.383953],[38.010631,49.915662],[38.594988,49.926462],[40.069058,49.601055],[40.080789,49.30743],[39.674664,48.78 [...]
+{"type":"Feature","id":"URY","properties":{"name":"Uruguay"},"geometry":{"type":"Polygon","coordinates":[[[-57.625133,-30.216295],[-56.976026,-30.109686],[-55.973245,-30.883076],[-55.60151,-30.853879],[-54.572452,-31.494511],[-53.787952,-32.047243],[-53.209589,-32.727666],[-53.650544,-33.202004],[-53.373662,-33.768378],[-53.806426,-34.396815],[-54.935866,-34.952647],[-55.67409,-34.752659],[-56.215297,-34.859836],[-57.139685,-34.430456],[-57.817861,-34.462547],[-58.427074,-33.909454],[-58 [...]
+{"type":"Feature","id":"USA","properties":{"name":"United States of America"},"geometry":{"type":"MultiPolygon","coordinates":[[[[-155.54211,19.08348],[-155.68817,18.91619],[-155.93665,19.05939],[-155.90806,19.33888],[-156.07347,19.70294],[-156.02368,19.81422],[-155.85008,19.97729],[-155.91907,20.17395],[-155.86108,20.26721],[-155.78505,20.2487],[-155.40214,20.07975],[-155.22452,19.99302],[-155.06226,19.8591],[-154.80741,19.50871],[-154.83147,19.45328],[-155.22217,19.23972],[-155.54211,1 [...]
+{"type":"Feature","id":"UZB","properties":{"name":"Uzbekistan"},"geometry":{"type":"Polygon","coordinates":[[[66.518607,37.362784],[66.54615,37.974685],[65.215999,38.402695],[64.170223,38.892407],[63.518015,39.363257],[62.37426,40.053886],[61.882714,41.084857],[61.547179,41.26637],[60.465953,41.220327],[60.083341,41.425146],[59.976422,42.223082],[58.629011,42.751551],[57.78653,42.170553],[56.932215,41.826026],[57.096391,41.32231],[55.968191,41.308642],[55.928917,44.995858],[58.503127,45. [...]
+{"type":"Feature","id":"VEN","properties":{"name":"Venezuela"},"geometry":{"type":"Polygon","coordinates":[[[-71.331584,11.776284],[-71.360006,11.539994],[-71.94705,11.423282],[-71.620868,10.96946],[-71.633064,10.446494],[-72.074174,9.865651],[-71.695644,9.072263],[-71.264559,9.137195],[-71.039999,9.859993],[-71.350084,10.211935],[-71.400623,10.968969],[-70.155299,11.375482],[-70.293843,11.846822],[-69.943245,12.162307],[-69.5843,11.459611],[-68.882999,11.443385],[-68.233271,10.885744],[ [...]
+{"type":"Feature","id":"VNM","properties":{"name":"Vietnam"},"geometry":{"type":"Polygon","coordinates":[[[108.05018,21.55238],[106.715068,20.696851],[105.881682,19.75205],[105.662006,19.058165],[106.426817,18.004121],[107.361954,16.697457],[108.269495,16.079742],[108.877107,15.276691],[109.33527,13.426028],[109.200136,11.666859],[108.36613,11.008321],[107.220929,10.364484],[106.405113,9.53084],[105.158264,8.59976],[104.795185,9.241038],[105.076202,9.918491],[104.334335,10.486544],[105.1 [...]
+{"type":"Feature","id":"VUT","properties":{"name":"Vanuatu"},"geometry":{"type":"MultiPolygon","coordinates":[[[[167.844877,-16.466333],[167.515181,-16.59785],[167.180008,-16.159995],[167.216801,-15.891846],[167.844877,-16.466333]]],[[[167.107712,-14.93392],[167.270028,-15.740021],[167.001207,-15.614602],[166.793158,-15.668811],[166.649859,-15.392704],[166.629137,-14.626497],[167.107712,-14.93392]]]]}},
+{"type":"Feature","id":"PSE","properties":{"name":"West Bank"},"geometry":{"type":"Polygon","coordinates":[[[35.545665,32.393992],[35.545252,31.782505],[35.397561,31.489086],[34.927408,31.353435],[34.970507,31.616778],[35.225892,31.754341],[34.974641,31.866582],[35.18393,32.532511],[35.545665,32.393992]]]}},
+{"type":"Feature","id":"YEM","properties":{"name":"Yemen"},"geometry":{"type":"Polygon","coordinates":[[[53.108573,16.651051],[52.385206,16.382411],[52.191729,15.938433],[52.168165,15.59742],[51.172515,15.17525],[49.574576,14.708767],[48.679231,14.003202],[48.238947,13.94809],[47.938914,14.007233],[47.354454,13.59222],[46.717076,13.399699],[45.877593,13.347764],[45.62505,13.290946],[45.406459,13.026905],[45.144356,12.953938],[44.989533,12.699587],[44.494576,12.721653],[44.175113,12.58595 [...]
+{"type":"Feature","id":"ZAF","properties":{"name":"South Africa"},"geometry":{"type":"Polygon","coordinates":[[[31.521001,-29.257387],[31.325561,-29.401978],[30.901763,-29.909957],[30.622813,-30.423776],[30.055716,-31.140269],[28.925553,-32.172041],[28.219756,-32.771953],[27.464608,-33.226964],[26.419452,-33.61495],[25.909664,-33.66704],[25.780628,-33.944646],[25.172862,-33.796851],[24.677853,-33.987176],[23.594043,-33.794474],[22.988189,-33.916431],[22.574157,-33.864083],[21.542799,-34. [...]
+{"type":"Feature","id":"ZMB","properties":{"name":"Zambia"},"geometry":{"type":"Polygon","coordinates":[[[32.759375,-9.230599],[33.231388,-9.676722],[33.485688,-10.525559],[33.31531,-10.79655],[33.114289,-11.607198],[33.306422,-12.435778],[32.991764,-12.783871],[32.688165,-13.712858],[33.214025,-13.97186],[30.179481,-14.796099],[30.274256,-15.507787],[29.516834,-15.644678],[28.947463,-16.043051],[28.825869,-16.389749],[28.467906,-16.4684],[27.598243,-17.290831],[27.044427,-17.938026],[26 [...]
+{"type":"Feature","id":"ZWE","properties":{"name":"Zimbabwe"},"geometry":{"type":"Polygon","coordinates":[[[31.191409,-22.25151],[30.659865,-22.151567],[30.322883,-22.271612],[29.839037,-22.102216],[29.432188,-22.091313],[28.794656,-21.639454],[28.02137,-21.485975],[27.727228,-20.851802],[27.724747,-20.499059],[27.296505,-20.39152],[26.164791,-19.293086],[25.850391,-18.714413],[25.649163,-18.536026],[25.264226,-17.73654],[26.381935,-17.846042],[26.706773,-17.961229],[27.044427,-17.938026 [...]
+]}
diff --git a/test/spec/ol/format/geojsonformat.test.js b/test/spec/ol/format/geojsonformat.test.js
new file mode 100644
index 0000000..c3f3767
--- /dev/null
+++ b/test/spec/ol/format/geojsonformat.test.js
@@ -0,0 +1,593 @@
+goog.provide('ol.test.reader.GeoJSON');
+
+
+describe('ol.format.GeoJSON', function() {
+
+  var format;
+  beforeEach(function() {
+    format = new ol.format.GeoJSON();
+  });
+
+  var pointGeoJSON = {
+    'type': 'Feature',
+    'geometry': {
+      'type': 'Point',
+      'coordinates': [102.0, 0.5]
+    },
+    'properties': {
+      'prop0': 'value0'
+    }
+  };
+
+  var nullGeometryGeoJSON = {
+    'type': 'Feature',
+    'geometry': null,
+    'properties': {
+      'prop0': 'value0'
+    }
+  };
+
+  var lineStringGeoJSON = {
+    'type': 'Feature',
+    'geometry': {
+      'type': 'LineString',
+      'coordinates': [
+        [102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]
+      ]
+    },
+    'properties': {
+      'prop0': 'value0',
+      'prop1': 0.0
+    }
+  };
+
+  var polygonGeoJSON = {
+    'type': 'Feature',
+    'geometry': {
+      'type': 'Polygon',
+      'coordinates': [[
+        [100.0, 0.0], [100.0, 1.0], [101.0, 1.0], [101.0, 0.0]
+      ]]
+    },
+    'properties': {
+      'prop0': 'value0',
+      'prop1': {'this': 'that'}
+    }
+  };
+
+  var featureCollectionGeoJSON = {
+    'type': 'FeatureCollection',
+    'features': [pointGeoJSON, lineStringGeoJSON, polygonGeoJSON]
+  };
+
+  var data = {
+    'type': 'FeatureCollection',
+    'features': [
+      {
+        'type': 'Feature',
+        'properties': {
+          'LINK_ID': 573730499,
+          'RP_TYPE': 14,
+          'RP_FUNC': 0,
+          'DIRECTION': 2,
+          'LOGKOD': '',
+          'CHANGED': '',
+          'USERID': '',
+          'ST_NAME': '',
+          'L_REFADDR': '',
+          'L_NREFADDR': '',
+          'R_REFADDR': '',
+          'R_NREFADDR': '',
+          'SPEED_CAT': '7',
+          'ZIPCODE': '59330',
+          'SHAPE_LEN': 46.3826
+        },
+        'geometry': {
+          'type': 'LineString',
+          'coordinates': [
+            [1549497.66985, 6403707.96],
+            [1549491.1, 6403710.1],
+            [1549488.03995, 6403716.7504],
+            [1549488.5401, 6403724.5504],
+            [1549494.37985, 6403733.54],
+            [1549499.6799, 6403738.0504],
+            [1549506.22, 6403739.2504]
+          ]
+        }
+      }, {
+        'type': 'Feature',
+        'properties': {
+          'LINK_ID': 30760556,
+          'RP_TYPE': 12,
+          'RP_FUNC': 1,
+          'DIRECTION': 0,
+          'LOGKOD': '',
+          'CHANGED': '',
+          'USERID': '',
+          'ST_NAME': 'BRUNNSGATAN',
+          'L_REFADDR': '24',
+          'L_NREFADDR': '16',
+          'R_REFADDR': '',
+          'R_NREFADDR': '',
+          'SPEED_CAT': '7',
+          'ZIPCODE': '59330',
+          'SHAPE_LEN': 70.3106
+        },
+        'geometry': {
+          'type': 'LineString',
+          'coordinates': [
+            [1549754.2769, 6403854.8024],
+            [1549728.45985, 6403920.2]
+          ]
+        }
+      }
+    ]
+  };
+
+  describe('#readFeature', function() {
+
+    it('can read a single point feature', function() {
+      var feature = format.readFeature(pointGeoJSON);
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.an(ol.geom.Point);
+      expect(geometry.getCoordinates()).to.eql([102.0, 0.5]);
+      expect(feature.get('prop0')).to.be('value0');
+    });
+
+    it('can read a single line string feature', function() {
+      var feature = format.readFeature(lineStringGeoJSON);
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.an(ol.geom.LineString);
+      expect(geometry.getCoordinates()).to.eql(
+          [[102.0, 0.0], [103.0, 1.0], [104.0, 0.0], [105.0, 1.0]]);
+      expect(feature.get('prop0')).to.be('value0');
+      expect(feature.get('prop1')).to.be(0.0);
+    });
+
+    it('can read a single polygon feature', function() {
+      var feature = format.readFeature(polygonGeoJSON);
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.an(ol.geom.Polygon);
+      expect(geometry.getCoordinates()).to.eql([[
+        [100.0, 0.0], [100.0, 1.0], [101.0, 1.0], [101.0, 0.0]
+      ]]);
+      expect(feature.get('prop0')).to.be('value0');
+      expect(feature.get('prop1')).to.eql({'this': 'that'});
+    });
+
+    it('can read a feature with null geometry', function() {
+      var feature = format.readFeature(nullGeometryGeoJSON);
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.eql(null);
+      expect(feature.get('prop0')).to.be('value0');
+    });
+
+    it('can read a feature collection', function() {
+      var features = format.readFeatures(featureCollectionGeoJSON);
+      expect(features).to.have.length(3);
+      expect(features[0].getGeometry()).to.be.an(ol.geom.Point);
+      expect(features[1].getGeometry()).to.be.an(ol.geom.LineString);
+      expect(features[2].getGeometry()).to.be.an(ol.geom.Polygon);
+    });
+
+    it('can read and transform a point', function() {
+      var feature = format.readFeatures(pointGeoJSON, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(feature[0].getGeometry()).to.be.an(ol.geom.Point);
+      expect(feature[0].getGeometry().getCoordinates()).to.eql(
+          ol.proj.transform([102.0, 0.5], 'EPSG:4326', 'EPSG:3857'));
+    });
+
+    it('can read and transform a feature collection', function() {
+      var features = format.readFeatures(featureCollectionGeoJSON, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(features[0].getGeometry()).to.be.an(ol.geom.Point);
+      expect(features[0].getGeometry().getCoordinates()).to.eql(
+          ol.proj.transform([102.0, 0.5], 'EPSG:4326', 'EPSG:3857'));
+      expect(features[1].getGeometry().getCoordinates()).to.eql([
+        ol.proj.transform([102.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
+        ol.proj.transform([103.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
+        ol.proj.transform([104.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
+        ol.proj.transform([105.0, 1.0], 'EPSG:4326', 'EPSG:3857')
+      ]);
+      expect(features[2].getGeometry().getCoordinates()).to.eql([[
+        ol.proj.transform([100.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
+        ol.proj.transform([100.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
+        ol.proj.transform([101.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
+        ol.proj.transform([101.0, 0.0], 'EPSG:4326', 'EPSG:3857')
+      ]]);
+    });
+
+    it('can create a feature with a specific geometryName', function() {
+      var feature = new ol.format.GeoJSON({geometryName: 'the_geom'}).
+          readFeature(pointGeoJSON);
+      expect(feature.getGeometryName()).to.be('the_geom');
+      expect(feature.getGeometry()).to.be.an(ol.geom.Point);
+    });
+
+  });
+
+  describe('#readFeatures', function() {
+
+    it('parses feature collection', function() {
+      var str = JSON.stringify(data),
+          array = format.readFeatures(str);
+
+      expect(array.length).to.be(2);
+
+      var first = array[0];
+      expect(first).to.be.a(ol.Feature);
+      expect(first.get('LINK_ID')).to.be(573730499);
+      var firstGeom = first.getGeometry();
+      expect(firstGeom).to.be.a(ol.geom.LineString);
+
+      var second = array[1];
+      expect(second).to.be.a(ol.Feature);
+      expect(second.get('ST_NAME')).to.be('BRUNNSGATAN');
+      var secondGeom = second.getGeometry();
+      expect(secondGeom).to.be.a(ol.geom.LineString);
+    });
+
+    it('parses countries.geojson', function(done) {
+      afterLoadText('spec/ol/format/geojson/countries.geojson', function(text) {
+        var result = format.readFeatures(text);
+        expect(result.length).to.be(179);
+
+        var first = result[0];
+        expect(first).to.be.a(ol.Feature);
+        expect(first.get('name')).to.be('Afghanistan');
+        expect(first.getId()).to.be('AFG');
+        var firstGeom = first.getGeometry();
+        expect(firstGeom).to.be.a(ol.geom.Polygon);
+        expect(ol.extent.equals(firstGeom.getExtent(),
+            [60.52843, 29.318572, 75.158028, 38.486282]))
+            .to.be(true);
+
+        var last = result[178];
+        expect(last).to.be.a(ol.Feature);
+        expect(last.get('name')).to.be('Zimbabwe');
+        expect(last.getId()).to.be('ZWE');
+        var lastGeom = last.getGeometry();
+        expect(lastGeom).to.be.a(ol.geom.Polygon);
+        expect(ol.extent.equals(lastGeom.getExtent(),
+            [25.264226, -22.271612, 32.849861, -15.507787]))
+            .to.be(true);
+        done();
+      });
+
+    });
+
+    it('generates an array of features for Feature', function() {
+
+      var format = new ol.format.GeoJSON();
+      var json = {
+        type: 'Feature',
+        properties: {
+          bam: 'baz'
+        },
+        geometry: {
+          type: 'LineString',
+          coordinates: [[1, 2], [3, 4]]
+        }
+      };
+      var features = format.readFeatures(json);
+
+      expect(features.length).to.be(1);
+
+      var first = features[0];
+      expect(first).to.be.a(ol.Feature);
+      expect(first.get('bam')).to.be('baz');
+      expect(first.getGeometry()).to.be.a(ol.geom.LineString);
+
+      expect(format.readProjection(json)).to.be(ol.proj.get('EPSG:4326'));
+    });
+
+  });
+
+  describe('#readGeometry', function() {
+
+    it('parses point', function() {
+      var str = JSON.stringify({
+        type: 'Point',
+        coordinates: [10, 20]
+      });
+
+      var obj = format.readGeometry(str);
+      expect(obj).to.be.a(ol.geom.Point);
+      expect(obj.getCoordinates()).to.eql([10, 20]);
+    });
+
+    it('parses linestring', function() {
+      var str = JSON.stringify({
+        type: 'LineString',
+        coordinates: [[10, 20], [30, 40]]
+      });
+
+      var obj = format.readGeometry(str);
+      expect(obj).to.be.a(ol.geom.LineString);
+      expect(obj.getCoordinates()).to.eql([[10, 20], [30, 40]]);
+    });
+
+    it('parses polygon', function() {
+      var outer = [[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]],
+          inner1 = [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]],
+          inner2 = [[8, 8], [9, 8], [9, 9], [8, 9], [8, 8]],
+          str = JSON.stringify({
+            type: 'Polygon',
+            coordinates: [outer, inner1, inner2]
+          });
+
+      var obj = format.readGeometry(str);
+      expect(obj).to.be.a(ol.geom.Polygon);
+      var rings = obj.getLinearRings();
+      expect(rings.length).to.be(3);
+      expect(rings[0]).to.be.a(ol.geom.LinearRing);
+      expect(rings[1]).to.be.a(ol.geom.LinearRing);
+      expect(rings[2]).to.be.a(ol.geom.LinearRing);
+    });
+
+    it('parses geometry collection', function() {
+      var str = JSON.stringify({
+        type: 'GeometryCollection',
+        geometries: [
+          {type: 'Point', coordinates: [10, 20]},
+          {type: 'LineString', coordinates: [[30, 40], [50, 60]]}
+        ]
+      });
+
+      var geometryCollection = format.readGeometry(str);
+      expect(geometryCollection).to.be.an(ol.geom.GeometryCollection);
+      var array = geometryCollection.getGeometries();
+      expect(array.length).to.be(2);
+      expect(array[0]).to.be.a(ol.geom.Point);
+      expect(array[1]).to.be.a(ol.geom.LineString);
+    });
+
+  });
+
+  describe('#readProjection', function() {
+
+    it('reads named crs from top-level object', function() {
+
+      var json = {
+        type: 'FeatureCollection',
+        crs: {
+          type: 'name',
+          properties: {
+            name: 'EPSG:3857'
+          }
+        },
+        features: [{
+          type: 'Feature',
+          properties: {
+            foo: 'bar'
+          },
+          geometry: {
+            type: 'Point',
+            coordinates: [1, 2]
+          }
+        }, {
+          type: 'Feature',
+          properties: {
+            bam: 'baz'
+          },
+          geometry: {
+            type: 'LineString',
+            coordinates: [[1, 2], [3, 4]]
+          }
+        }]
+      };
+      var features = format.readFeatures(json);
+
+      expect(features.length).to.be(2);
+
+      var first = features[0];
+      expect(first).to.be.a(ol.Feature);
+      expect(first.get('foo')).to.be('bar');
+      expect(first.getGeometry()).to.be.a(ol.geom.Point);
+
+      var second = features[1];
+      expect(second).to.be.a(ol.Feature);
+      expect(second.get('bam')).to.be('baz');
+      expect(second.getGeometry()).to.be.a(ol.geom.LineString);
+
+      expect(format.readProjection(json)).to.be(ol.proj.get('EPSG:3857'));
+
+    });
+
+    it('accepts null crs', function() {
+
+      var json = {
+        type: 'FeatureCollection',
+        crs: null,
+        features: [{
+          type: 'Feature',
+          properties: {
+            foo: 'bar'
+          },
+          geometry: {
+            type: 'Point',
+            coordinates: [1, 2]
+          }
+        }, {
+          type: 'Feature',
+          properties: {
+            bam: 'baz'
+          },
+          geometry: {
+            type: 'LineString',
+            coordinates: [[1, 2], [3, 4]]
+          }
+        }]
+      };
+      var features = format.readFeatures(json);
+
+      expect(features.length).to.be(2);
+
+      var first = features[0];
+      expect(first).to.be.a(ol.Feature);
+      expect(first.get('foo')).to.be('bar');
+      expect(first.getGeometry()).to.be.a(ol.geom.Point);
+
+      var second = features[1];
+      expect(second).to.be.a(ol.Feature);
+      expect(second.get('bam')).to.be('baz');
+      expect(second.getGeometry()).to.be.a(ol.geom.LineString);
+
+      expect(format.readProjection(json)).to.be(ol.proj.get('EPSG:4326'));
+
+    });
+
+    it('can read out-of-specification CRS generated by GeoServer', function() {
+      // TODO: remove this when http://jira.codehaus.org/browse/GEOS-5996
+      // is fixed and widely deployed.
+      var json = {
+        crs: {
+          type: 'EPSG',
+          properties: {
+            code: '4326'
+          }
+        }
+      };
+      expect(format.readProjection(json)).to.be(ol.proj.get('EPSG:4326'));
+    });
+
+  });
+
+  describe('#writeFeatures', function() {
+
+    it('encodes feature collection', function() {
+      var str = JSON.stringify(data),
+          array = format.readFeatures(str);
+      var geojson = format.writeFeaturesObject(array);
+      var result = format.readFeatures(geojson);
+      expect(array.length).to.equal(result.length);
+      var got, exp, gotProp, expProp;
+      for (var i = 0, ii = array.length; i < ii; ++i) {
+        got = array[i];
+        exp = result[i];
+        expect(got.getGeometry().getCoordinates()).to.eql(
+            exp.getGeometry().getCoordinates());
+        gotProp = got.getProperties();
+        delete gotProp.geometry;
+        expProp = exp.getProperties();
+        delete expProp.geometry;
+        expect(gotProp).to.eql(expProp);
+      }
+    });
+
+    it('transforms and encodes feature collection', function() {
+      var str = JSON.stringify(data),
+          array = format.readFeatures(str);
+      var geojson = format.writeFeatures(array, {
+        featureProjection: 'EPSG:3857'
+      });
+      var result = format.readFeatures(geojson);
+      var got, exp;
+      for (var i = 0, ii = array.length; i < ii; ++i) {
+        got = array[i];
+        exp = result[i];
+        expect(got.getGeometry().transform('EPSG:3857', 'EPSG:4326')
+            .getCoordinates()).to.eql(exp.getGeometry().getCoordinates());
+      }
+    });
+
+    it('writes out a feature with a different geometryName correctly',
+        function() {
+          var feature = new ol.Feature({'foo': 'bar'});
+          feature.setGeometryName('mygeom');
+          feature.setGeometry(new ol.geom.Point([5, 10]));
+          var geojson = format.writeFeaturesObject([feature]);
+          expect(geojson.features[0].properties.mygeom).to.eql(undefined);
+        });
+
+  });
+
+  describe('#writeGeometry', function() {
+
+    it('encodes point', function() {
+      var point = new ol.geom.Point([10, 20]);
+      var geojson = format.writeGeometry(point);
+      expect(point.getCoordinates()).to.eql(
+          format.readGeometry(geojson).getCoordinates());
+    });
+
+    it('encodes linestring', function() {
+      var linestring = new ol.geom.LineString([[10, 20], [30, 40]]);
+      var geojson = format.writeGeometry(linestring);
+      expect(linestring.getCoordinates()).to.eql(
+          format.readGeometry(geojson).getCoordinates());
+    });
+
+    it('encodes polygon', function() {
+      var outer = [[0, 0], [10, 0], [10, 10], [0, 10], [0, 0]],
+          inner1 = [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]],
+          inner2 = [[8, 8], [9, 8], [9, 9], [8, 9], [8, 8]];
+      var polygon = new ol.geom.Polygon([outer, inner1, inner2]);
+      var geojson = format.writeGeometry(polygon);
+      expect(polygon.getCoordinates()).to.eql(
+          format.readGeometry(geojson).getCoordinates());
+    });
+
+    it('encodes geometry collection', function() {
+      var collection = new ol.geom.GeometryCollection([
+        new ol.geom.Point([10, 20]),
+        new ol.geom.LineString([[30, 40], [50, 60]])
+      ]);
+      var geojson = format.writeGeometry(collection);
+      var got = format.readGeometry(geojson);
+      expect(got).to.be.an(ol.geom.GeometryCollection);
+      var gotGeometries = got.getGeometries();
+      var geometries = collection.getGeometries();
+      expect(geometries.length).to.equal(gotGeometries.length);
+      for (var i = 0, ii = geometries.length; i < ii; ++i) {
+        expect(geometries[i].getCoordinates()).
+            to.eql(gotGeometries[i].getCoordinates());
+      }
+
+    });
+
+    it('encodes a circle as an empty geometry collection', function() {
+      var circle = new ol.geom.Circle([0, 0], 1);
+      var geojson = format.writeGeometryObject(circle);
+      expect(geojson).to.eql({
+        'type': 'GeometryCollection',
+        'geometries': []
+      });
+    });
+
+    it('transforms and encodes a point', function() {
+      var point = new ol.geom.Point([2, 3]);
+      var geojson = format.writeGeometry(point, {
+        featureProjection: 'EPSG:3857'
+      });
+      var newPoint = format.readGeometry(geojson, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(point.getCoordinates()[0]).to.eql(newPoint.getCoordinates()[0]);
+      expect(
+          Math.abs(point.getCoordinates()[1] - newPoint.getCoordinates()[1]))
+          .to.be.lessThan(0.0000001);
+    });
+
+  });
+
+});
+
+
+goog.require('ol.Feature');
+goog.require('ol.extent');
+goog.require('ol.format.GeoJSON');
+goog.require('ol.geom.Circle');
+goog.require('ol.geom.GeometryCollection');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.LinearRing');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.proj');
diff --git a/test/spec/ol/format/gml/more-geoms.xml b/test/spec/ol/format/gml/more-geoms.xml
new file mode 100644
index 0000000..b0fa5c5
--- /dev/null
+++ b/test/spec/ol/format/gml/more-geoms.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="1" timeStamp="2010-01-29T15:10:38.921-07:00"
+        xsi:schemaLocation="http://medford.opengeo.org http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=medford%3Azoning http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"
+        xmlns:ogc="http://www.opengis.net/ogc"
+        xmlns:wfs="http://www.opengis.net/wfs"
+        xmlns:medford="http://opengeo.org/#medford"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns:ows="http://www.opengis.net/ows"
+        xmlns:gml="http://www.opengis.net/gml"
+        xmlns:xlink="http://www.w3.org/1999/xlink">
+    <gml:featureMembers>
+        <medford:zoning gml:id="zoning.1">
+            <medford:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>42.397027571297585 -122.88465674265922 42.39702893980587 -122.88509730796012 42.397029086785146 -122.88511582432085 42.39702379767053 -122.88528111596624 42.39748517484964 -122.88529300380065 42.39748473847452 -122.88509914138723 42.39748482219041 -122.8849959517568 42.397485082635576 -122.8846741899541 42.3974853307826 -122.88436529392652 42.39702663751206 -122.88435664014142 42.397027571297585 -122.88465674265922</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </medford:the_geom>
+            <medford:center>
+                <gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:pos>1 2</gml:pos>
+                </gml:Point>
+            </medford:center>            
+            <medford:objectid>1</medford:objectid>
+            <medford:cityzone>YES</medford:cityzone>
+            <medford:zoning>I-L</medford:zoning>
+            <medford:revdate>2004-04-12T00:00:00-06:00</medford:revdate>
+            <medford:finord></medford:finord>
+            <medford:filenum></medford:filenum>
+            <medford:acres>0.95741118624</medford:acres>
+            <medford:misc></medford:misc>
+            <medford:shape_leng>835.705330224</medford:shape_leng>
+            <medford:perimeter>835.705330224</medford:perimeter>
+            <medford:area>41704.8312728</medford:area>
+            <medford:shape_le_1>835.705330224</medford:shape_le_1>
+            <medford:shape_area>41704.8312728</medford:shape_area>
+            <medford:hectares>0.38745056079</medford:hectares>
+        </medford:zoning>
+    </gml:featureMembers>
+</wfs:FeatureCollection>
diff --git a/test/spec/ol/format/gml/only-boundedby.xml b/test/spec/ol/format/gml/only-boundedby.xml
new file mode 100644
index 0000000..1459a13
--- /dev/null
+++ b/test/spec/ol/format/gml/only-boundedby.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="3" timeStamp="2008-09-12T00:24:21.013-04:00"
+    xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma.openplans.org:80/geoserver/schemas/wfs/1.1.0/wfs.xsd"
+    xmlns:ogc="http://www.opengis.net/ogc" xmlns:opengeo="http://open-geo.com"
+    xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs"
+    xmlns:topp="http://www.openplans.org/topp" xmlns:seb="http://seb.com"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows"
+    xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <gml:featureMembers>
+        <topp:states gml:id="states.1">
+            <gml:boundedBy>
+                <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:lowerCorner>36.986 -91.516</gml:lowerCorner>
+                    <gml:upperCorner>42.509 -87.507</gml:upperCorner>
+                </gml:Envelope>
+            </gml:boundedBy>
+            <topp:STATE_NAME>Illinois</topp:STATE_NAME>
+            <topp:STATE_FIPS>17</topp:STATE_FIPS>
+            <topp:SUB_REGION>E N Cen</topp:SUB_REGION>
+            <topp:STATE_ABBR>IL</topp:STATE_ABBR>
+            <topp:LAND_KM>143986.61</topp:LAND_KM>
+            <topp:WATER_KM>1993.335</topp:WATER_KM>
+            <topp:PERSONS>1.143E7</topp:PERSONS>
+            <topp:FAMILIES>2924880.0</topp:FAMILIES>
+            <topp:HOUSHOLD>4202240.0</topp:HOUSHOLD>
+            <topp:MALE>5552233.0</topp:MALE>
+            <topp:FEMALE>5878369.0</topp:FEMALE>
+            <topp:WORKERS>4199206.0</topp:WORKERS>
+            <topp:DRVALONE>3741715.0</topp:DRVALONE>
+            <topp:CARPOOL>652603.0</topp:CARPOOL>
+            <topp:PUBTRANS>538071.0</topp:PUBTRANS>
+            <topp:EMPLOYED>5417967.0</topp:EMPLOYED>
+            <topp:UNEMPLOY>385040.0</topp:UNEMPLOY>
+            <topp:SERVICE>1360159.0</topp:SERVICE>
+            <topp:MANUAL>828906.0</topp:MANUAL>
+            <topp:P_MALE>0.486</topp:P_MALE>
+            <topp:P_FEMALE>0.514</topp:P_FEMALE>
+            <topp:SAMP_POP>1747776.0</topp:SAMP_POP>
+        </topp:states>
+    </gml:featureMembers>
+</wfs:FeatureCollection>
diff --git a/test/spec/ol/format/gml/repeated-name.xml b/test/spec/ol/format/gml/repeated-name.xml
new file mode 100644
index 0000000..9327515
--- /dev/null
+++ b/test/spec/ol/format/gml/repeated-name.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="1" timeStamp="2010-01-29T15:10:38.921-07:00"
+        xsi:schemaLocation="http://medford.opengeo.org http://localhost:8080/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=medford%3Azoning http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"
+        xmlns:ogc="http://www.opengis.net/ogc"
+        xmlns:wfs="http://www.opengis.net/wfs"
+        xmlns:medford="http://opengeo.org/#medford"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns:ows="http://www.opengis.net/ows"
+        xmlns:gml="http://www.opengis.net/gml"
+        xmlns:xlink="http://www.w3.org/1999/xlink">
+    <gml:featureMembers>
+        <medford:zoning gml:id="zoning.1">
+            <medford:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>42.397027571297585 -122.88465674265922 42.39702893980587 -122.88509730796012 42.397029086785146 -122.88511582432085 42.39702379767053 -122.88528111596624 42.39748517484964 -122.88529300380065 42.39748473847452 -122.88509914138723 42.39748482219041 -122.8849959517568 42.397485082635576 -122.8846741899541 42.3974853307826 -122.88436529392652 42.39702663751206 -122.88435664014142 42.397027571297585 -122.88465674265922</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </medford:the_geom>
+            <medford:objectid>1</medford:objectid>
+            <medford:cityzone>YES</medford:cityzone>
+            <medford:zoning>I-L</medford:zoning>
+            <medford:revdate>2004-04-12T00:00:00-06:00</medford:revdate>
+            <medford:finord></medford:finord>
+            <medford:filenum></medford:filenum>
+            <medford:acres>0.95741118624</medford:acres>
+            <medford:misc></medford:misc>
+            <medford:shape_leng>835.705330224</medford:shape_leng>
+            <medford:perimeter>835.705330224</medford:perimeter>
+            <medford:area>41704.8312728</medford:area>
+            <medford:shape_le_1>835.705330224</medford:shape_le_1>
+            <medford:shape_area>41704.8312728</medford:shape_area>
+            <medford:hectares>0.38745056079</medford:hectares>
+        </medford:zoning>
+    </gml:featureMembers>
+</wfs:FeatureCollection>
diff --git a/test/spec/ol/format/gml/topp-states-gml.xml b/test/spec/ol/format/gml/topp-states-gml.xml
new file mode 100644
index 0000000..2090909
--- /dev/null
+++ b/test/spec/ol/format/gml/topp-states-gml.xml
@@ -0,0 +1,1097 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gml:featureMembers xmlns:gml="http://www.opengis.net/gml"
+    xsi:schemaLocation="http://www.openplans.org/topp http://demo.opengeo.org/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/gml http://schemas.opengis.net/gml/3.2.1/gml.xsd"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.1"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>37.5101 -88.0711 37.5831 -88.1341 37.6281 -88.1571
+                                    37.6601 -88.1591 37.7001 -88.1331 37.7351 -88.0721 37.8051
+                                    -88.0351 37.8171 -88.0861 37.8311 -88.0891 37.8271 -88.0421
+                                    37.8431 -88.0341 37.8671 -88.0751 37.8951 -88.1011 37.9061
+                                    -88.1001 37.8961 -88.0441 37.9051 -88.0261 37.9171 -88.0301
+                                    37.9231 -88.084 37.944 -88.0781 37.9291 -88.0641 37.9341
+                                    -88.0411 37.9561 -88.0421 37.9751 -88.0211 38.0081 -88.0291
+                                    38.0331 -88.0211 38.0381 -88.0411 38.0451 -88.0431 38.0541
+                                    -88.0341 38.0731 -87.9751 38.0961 -87.9641 38.0921 -88.0121
+                                    38.1031 -88.0181 38.1311 -87.9731 38.1361 -87.9501 38.1571
+                                    -87.9311 38.1711 -87.9321 38.2001 -87.9771 38.2341 -87.9861
+                                    38.2411 -87.9801 38.3041 -87.9251 38.3021 -87.9131 38.2811
+                                    -87.9141 38.3001 -87.8881 38.3151 -87.8831 38.3161 -87.8741
+                                    38.2851 -87.8631 38.2861 -87.8501 38.3521 -87.8341 38.3781
+                                    -87.7841 38.4171 -87.7481 38.4451 -87.7381 38.4571 -87.7581
+                                    38.4661 -87.7561 38.4811 -87.6921 38.5041 -87.6791 38.5001
+                                    -87.6531 38.5151 -87.6511 38.5471 -87.6721 38.5731 -87.6521
+                                    38.5931 -87.6401 38.5991 -87.6191 38.6221 -87.6281 38.6421
+                                    -87.6251 38.6721 -87.5881 38.6851 -87.5431 38.7361 -87.5081
+                                    38.7691 -87.5081 38.7761 -87.5191 38.7951 -87.5071 38.8571
+                                    -87.5501 38.8691 -87.5591 38.9041 -87.5391 38.9311 -87.5301
+                                    38.9631 -87.5331 38.9771 -87.5471 38.9941 -87.5911 38.9951
+                                    -87.5811 39.0621 -87.5851 39.0841 -87.6121 39.0881 -87.6301
+                                    39.1031 -87.6311 39.1131 -87.6621 39.1301 -87.6591 39.1461
+                                    -87.6701 39.1681 -87.6441 39.1961 -87.6071 39.1981 -87.5941
+                                    39.2081 -87.5881 39.2481 -87.5841 39.2581 -87.6061 39.2811
+                                    -87.6151 39.2971 -87.6101 39.3071 -87.6251 39.3381 -87.5971
+                                    39.3501 -87.5401 39.4771 -87.5381 39.6091 -87.5351 39.8871
+                                    -87.5351 40.1661 -87.5351 40.4831 -87.5351 40.4941 -87.5371
+                                    40.7451 -87.5321 41.0091 -87.5321 41.1731 -87.5311 41.3011
+                                    -87.5321 41.4691 -87.5321 41.7231 -87.5291 41.8471 -87.6121
+                                    42.0591 -87.6701 42.1561 -87.7601 42.3141 -87.8361 42.4891
+                                    -87.7971 42.4891 -88.1941 42.4911 -88.2971 42.4891 -88.7061
+                                    42.4901 -88.7641 42.4901 -88.9391 42.4971 -89.3591 42.4971
+                                    -89.4001 42.5031 -89.8341 42.5041 -89.9231 42.5081 -90.4191
+                                    42.5091 -90.6381 42.4941 -90.6511 42.4751 -90.6481 42.4601
+                                    -90.6051 42.4211 -90.5631 42.3881 -90.4911 42.3601 -90.4411
+                                    42.3401 -90.4271 42.2631 -90.4171 42.2421 -90.4071 42.2101
+                                    -90.3671 42.1971 -90.3231 42.1591 -90.2301 42.1221 -90.1911
+                                    42.1201 -90.1761 42.1031 -90.1661 42.0611 -90.1681 42.0331
+                                    -90.1501 41.9831 -90.1421 41.9301 -90.1541 41.8061 -90.1951
+                                    41.7811 -90.2551 41.7561 -90.3041 41.7221 -90.3261 41.6491
+                                    -90.3411 41.6021 -90.3391 41.5861 -90.3481 41.5671 -90.4231
+                                    41.5431 -90.4341 41.5271 -90.4541 41.5251 -90.5401 41.5091
+                                    -90.6001 41.4621 -90.6581 41.4501 -90.7081 41.4491 -90.7791
+                                    41.4441 -90.8441 41.4211 -90.9491 41.4311 -91.0001 41.4231
+                                    -91.0271 41.4011 -91.0551 41.3341 -91.0731 41.2671 -91.1021
+                                    41.2311 -91.1011 41.1761 -91.0561 41.1651 -91.0181 41.1441
+                                    -90.9901 41.1041 -90.9571 41.0701 -90.9541 40.9501 -90.9601
+                                    40.9231 -90.9831 40.8791 -91.0491 40.8331 -91.0881 40.7611
+                                    -91.0921 40.7051 -91.1191 40.6821 -91.1291 40.6561 -91.1621
+                                    40.6431 -91.2141 40.6391 -91.2621 40.6031 -91.3751 40.5721
+                                    -91.4111 40.5471 -91.4121 40.5281 -91.3821 40.5031 -91.3741
+                                    40.4471 -91.3851 40.4021 -91.3721 40.3921 -91.3851 40.3861
+                                    -91.4181 40.3711 -91.4481 40.3091 -91.4861 40.2511 -91.4981
+                                    40.2001 -91.5061 40.1341 -91.5161 40.0661 -91.5041 40.0051
+                                    -91.4871 39.9461 -91.4471 39.9211 -91.4301 39.9011 -91.4341
+                                    39.8851 -91.4501 39.8631 -91.4491 39.8031 -91.3811 39.7611
+                                    -91.3731 39.7241 -91.3671 39.6851 -91.3171 39.6001 -91.2031
+                                    39.5521 -91.1561 39.5281 -91.0931 39.4731 -91.0641 39.4441
+                                    -91.0361 39.4001 -90.9471 39.3501 -90.8501 39.2961 -90.7791
+                                    39.2471 -90.7381 39.2241 -90.7321 39.1951 -90.7181 39.1441
+                                    -90.7161 39.0931 -90.6901 39.0581 -90.7071 39.0371 -90.7061
+                                    38.9351 -90.6681 38.8801 -90.6271 38.8711 -90.5701 38.8911
+                                    -90.5301 38.9591 -90.4691 38.9621 -90.4131 38.9241 -90.3191
+                                    38.9241 -90.2781 38.9141 -90.2431 38.8531 -90.1321 38.8301
+                                    -90.1131 38.8001 -90.1211 38.7851 -90.1351 38.7731 -90.1631
+                                    38.7231 -90.1961 38.7001 -90.2021 38.6581 -90.1831 38.6101
+                                    -90.1831 38.5621 -90.2401 38.5321 -90.2611 38.5181 -90.2651
+                                    38.4271 -90.3011 38.3901 -90.3391 38.3651 -90.3581 38.3231
+                                    -90.3691 38.2341 -90.3641 38.1881 -90.3361 38.1661 -90.2891
+                                    38.1221 -90.2541 38.0881 -90.2071 38.0531 -90.1341 38.0321
+                                    -90.1191 37.9931 -90.0411 37.9691 -90.0101 37.9631 -89.9581
+                                    37.9111 -89.9781 37.8781 -89.9371 37.8751 -89.9001 37.8911
+                                    -89.8661 37.9051 -89.8611 37.9051 -89.8511 37.8401 -89.7281
+                                    37.8041 -89.6911 37.7831 -89.6751 37.7451 -89.6661 37.7061
+                                    -89.5811 37.6941 -89.5211 37.6791 -89.5131 37.6501 -89.5191
+                                    37.6151 -89.5131 37.5711 -89.5241 37.4911 -89.4941 37.4531
+                                    -89.4531 37.4111 -89.4271 37.3551 -89.4351 37.3391 -89.4681
+                                    37.3291 -89.5001 37.3041 -89.5131 37.2761 -89.5131 37.2561
+                                    -89.4891 37.2531 -89.4651 37.2241 -89.4681 37.1651 -89.4401
+                                    37.1371 -89.4231 37.0991 -89.3791 37.0491 -89.3821 37.0091
+                                    -89.3101 36.9991 -89.2821 37.0081 -89.2621 37.0271 -89.2641
+                                    37.0601 -89.3091 37.0851 -89.3031 37.0911 -89.2841 37.0871
+                                    -89.2641 37.0411 -89.2371 37.0281 -89.2101 36.9861 -89.1931
+                                    36.9881 -89.1291 36.9981 -89.1501 37.0251 -89.1741 37.0641
+                                    -89.1691 37.0931 -89.1461 37.1121 -89.1161 37.1851 -89.0651
+                                    37.2201 -88.9931 37.2181 -88.9321 37.2021 -88.8631 37.1521
+                                    -88.7461 37.1411 -88.7391 37.1351 -88.6881 37.1091 -88.6141
+                                    37.0721 -88.5591 37.0641 -88.5171 37.0681 -88.4901 37.0721
+                                    -88.4761 37.0981 -88.4501 37.1561 -88.4221 37.2051 -88.4501
+                                    37.2571 -88.5011 37.2961 -88.5111 37.4001 -88.4671 37.4201
+                                    -88.4191 37.4091 -88.3591 37.4421 -88.3111 37.4761 -88.0871
+                                    37.5101 -88.0711</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>Illinois</feature:STATE_NAME>
+        <feature:STATE_FIPS>17</feature:STATE_FIPS>
+        <feature:SUB_REGION>E N Cen</feature:SUB_REGION>
+        <feature:STATE_ABBR>IL</feature:STATE_ABBR>
+        <feature:LAND_KM>143986.61</feature:LAND_KM>
+        <feature:WATER_KM>1993.335</feature:WATER_KM>
+        <feature:PERSONS>1.1431E7</feature:PERSONS>
+        <feature:FAMILIES>2924880.0</feature:FAMILIES>
+        <feature:HOUSHOLD>4202240.0</feature:HOUSHOLD>
+        <feature:MALE>5552233.0</feature:MALE>
+        <feature:FEMALE>5878369.0</feature:FEMALE>
+        <feature:WORKERS>4199206.0</feature:WORKERS>
+        <feature:DRVALONE>3741715.0</feature:DRVALONE>
+        <feature:CARPOOL>652603.0</feature:CARPOOL>
+        <feature:PUBTRANS>538071.0</feature:PUBTRANS>
+        <feature:EMPLOYED>5417967.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>385040.0</feature:UNEMPLOY>
+        <feature:SERVICE>1360159.0</feature:SERVICE>
+        <feature:MANUAL>828906.0</feature:MANUAL>
+        <feature:P_MALE>0.486</feature:P_MALE>
+        <feature:P_FEMALE>0.514</feature:P_FEMALE>
+        <feature:SAMP_POP>1747776.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.2"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>38.9661 -77.0081 38.9931 -77.0421 38.9321 -77.1221
+                                    38.9151 -77.0781 38.8861 -77.0671 38.8621 -77.0391 38.8381
+                                    -77.0401 38.8291 -77.0451 38.8131 -77.0351 38.7881 -77.0451
+                                    38.8891 -76.9111 38.9661 -77.0081</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>District of Columbia</feature:STATE_NAME>
+        <feature:STATE_FIPS>11</feature:STATE_FIPS>
+        <feature:SUB_REGION>S Atl</feature:SUB_REGION>
+        <feature:STATE_ABBR>DC</feature:STATE_ABBR>
+        <feature:LAND_KM>159.055</feature:LAND_KM>
+        <feature:WATER_KM>17.991</feature:WATER_KM>
+        <feature:PERSONS>606900.0</feature:PERSONS>
+        <feature:FAMILIES>122087.0</feature:FAMILIES>
+        <feature:HOUSHOLD>249634.0</feature:HOUSHOLD>
+        <feature:MALE>282970.0</feature:MALE>
+        <feature:FEMALE>323930.0</feature:FEMALE>
+        <feature:WORKERS>229975.0</feature:WORKERS>
+        <feature:DRVALONE>106694.0</feature:DRVALONE>
+        <feature:CARPOOL>36621.0</feature:CARPOOL>
+        <feature:PUBTRANS>111422.0</feature:PUBTRANS>
+        <feature:EMPLOYED>303994.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>23442.0</feature:UNEMPLOY>
+        <feature:SERVICE>65498.0</feature:SERVICE>
+        <feature:MANUAL>22407.0</feature:MANUAL>
+        <feature:P_MALE>0.466</feature:P_MALE>
+        <feature:P_FEMALE>0.534</feature:P_FEMALE>
+        <feature:SAMP_POP>72696.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.3"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>38.5571 -75.7071 38.4631 -75.6991 38.4551 -75.3501
+                                    38.4501 -75.0931 38.4491 -75.0681 38.4491 -75.0451 38.7991
+                                    -75.0831 38.8081 -75.1901 38.9451 -75.3071 39.0121 -75.3241
+                                    39.0731 -75.3971 39.2571 -75.4021 39.3661 -75.5151 39.4631
+                                    -75.5901 39.5661 -75.5621 39.6121 -75.6101 39.7141 -75.4891
+                                    39.7191 -75.4761 39.7411 -75.4751 39.7631 -75.4601 39.7781
+                                    -75.4281 39.7891 -75.4121 39.7981 -75.4201 39.8261 -75.4701
+                                    39.8401 -75.5831 39.8381 -75.6441 39.8201 -75.6951 39.7741
+                                    -75.7451 39.7241 -75.7751 39.7231 -75.7911 39.3831 -75.7721
+                                    39.2951 -75.7641 39.2471 -75.7611 39.1411 -75.7521 38.8301
+                                    -75.7241 38.6491 -75.7111 38.5571 -75.7071</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>Delaware</feature:STATE_NAME>
+        <feature:STATE_FIPS>10</feature:STATE_FIPS>
+        <feature:SUB_REGION>S Atl</feature:SUB_REGION>
+        <feature:STATE_ABBR>DE</feature:STATE_ABBR>
+        <feature:LAND_KM>5062.456</feature:LAND_KM>
+        <feature:WATER_KM>1385.022</feature:WATER_KM>
+        <feature:PERSONS>666168.0</feature:PERSONS>
+        <feature:FAMILIES>175867.0</feature:FAMILIES>
+        <feature:HOUSHOLD>247497.0</feature:HOUSHOLD>
+        <feature:MALE>322968.0</feature:MALE>
+        <feature:FEMALE>343200.0</feature:FEMALE>
+        <feature:WORKERS>247566.0</feature:WORKERS>
+        <feature:DRVALONE>258087.0</feature:DRVALONE>
+        <feature:CARPOOL>42968.0</feature:CARPOOL>
+        <feature:PUBTRANS>8069.0</feature:PUBTRANS>
+        <feature:EMPLOYED>335147.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>13945.0</feature:UNEMPLOY>
+        <feature:SERVICE>87973.0</feature:SERVICE>
+        <feature:MANUAL>44140.0</feature:MANUAL>
+        <feature:P_MALE>0.485</feature:P_MALE>
+        <feature:P_FEMALE>0.515</feature:P_FEMALE>
+        <feature:SAMP_POP>102776.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.4"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>38.4801 -79.2311 38.6581 -79.1271 38.6631 -79.1211
+                                    38.6591 -79.0881 38.7071 -79.0871 38.7611 -79.0561 38.7901
+                                    -79.0551 38.7991 -79.0331 38.8461 -78.9871 38.7631 -78.8661
+                                    38.8331 -78.8161 38.8801 -78.7931 38.9111 -78.7491 38.9291
+                                    -78.7371 38.9301 -78.7241 38.9041 -78.7191 38.9211 -78.6801
+                                    38.9501 -78.6471 38.9791 -78.6311 38.9671 -78.5981 39.0131
+                                    -78.5531 39.0231 -78.5491 39.0351 -78.5641 39.0571 -78.5361
+                                    39.0931 -78.5011 39.1111 -78.4851 39.1181 -78.4481 39.1481
+                                    -78.4301 39.1701 -78.4021 39.1971 -78.4241 39.2121 -78.4231
+                                    39.2441 -78.3991 39.2571 -78.4131 39.3411 -78.3411 39.3501
+                                    -78.3441 39.3611 -78.3651 39.3801 -78.3501 39.4561 -78.3471
+                                    39.4231 -78.2771 39.3911 -78.2291 39.2651 -78.0331 39.1321
+                                    -77.8301 39.1411 -77.8201 39.1961 -77.8051 39.2461 -77.7681
+                                    39.2841 -77.7591 39.3171 -77.7271 39.3261 -77.7501 39.3381
+                                    -77.7541 39.3601 -77.7451 39.3781 -77.7561 39.3961 -77.7371
+                                    39.4031 -77.7411 39.4251 -77.7571 39.4321 -77.8021 39.4391
+                                    -77.8041 39.4501 -77.7961 39.4631 -77.8041 39.4591 -77.7851
+                                    39.4801 -77.7991 39.4981 -77.7711 39.4931 -77.8251 39.5011
+                                    -77.8481 39.5111 -77.8251 39.5291 -77.8291 39.5251 -77.8351
+                                    39.5311 -77.8441 39.5141 -77.8641 39.5451 -77.8691 39.5571
+                                    -77.8901 39.5641 -77.8851 39.5651 -77.8531 39.5721 -77.8401
+                                    39.6051 -77.8421 39.6021 -77.8551 39.6161 -77.8881 39.6001
+                                    -77.8911 39.5961 -77.9031 39.6181 -77.9381 39.6141 -77.9471
+                                    39.5911 -77.9351 39.5851 -77.9451 39.6111 -77.9641 39.5981
+                                    -77.9951 39.6221 -78.0261 39.6751 -78.0941 39.6941 -78.1831
+                                    39.6751 -78.2041 39.6731 -78.2271 39.6581 -78.2291 39.6411
+                                    -78.2571 39.6181 -78.2731 39.6401 -78.3481 39.6321 -78.3571
+                                    39.6311 -78.3771 39.6141 -78.3841 39.6201 -78.4321 39.5871
+                                    -78.4041 39.5921 -78.4501 39.5801 -78.4621 39.5491 -78.4211
+                                    39.5481 -78.4461 39.5331 -78.4561 39.5191 -78.4811 39.5251
+                                    -78.5091 39.5201 -78.5641 39.5351 -78.6041 39.5291 -78.6371
+                                    39.5371 -78.6491 39.5361 -78.6661 39.5591 -78.7161 39.5761
+                                    -78.7321 39.5811 -78.7611 39.6011 -78.7741 39.6081 -78.7361
+                                    39.6211 -78.7301 39.6261 -78.7321 39.6261 -78.7671 39.6441
+                                    -78.7721 39.6301 -78.7981 39.6151 -78.7981 39.5851 -78.8221
+                                    39.5661 -78.8061 39.5631 -78.8381 39.5251 -78.8711 39.4601
+                                    -78.9551 39.4381 -78.9701 39.4831 -79.0491 39.4851 -79.0641
+                                    39.4701 -79.0701 39.4701 -79.1041 39.4641 -79.0961 39.4471
+                                    -79.1041 39.4161 -79.1311 39.4131 -79.1581 39.3931 -79.1631
+                                    39.3481 -79.2601 39.3251 -79.2801 39.3001 -79.2951 39.2911
+                                    -79.3461 39.2691 -79.3851 39.2111 -79.4491 39.2131 -79.4611
+                                    39.1971 -79.4901 39.7201 -79.4811 39.7211 -79.7651 39.7211
+                                    -79.9181 39.7191 -80.4291 39.7211 -80.5241 39.9581 -80.5241
+                                    40.0221 -80.5251 40.1621 -80.5261 40.4021 -80.5231 40.4781
+                                    -80.5241 40.6371 -80.5221 40.6151 -80.5741 40.6191 -80.6111
+                                    40.6131 -80.6371 40.5821 -80.6671 40.5681 -80.6681 40.5391
+                                    -80.6331 40.5041 -80.6251 40.4801 -80.6021 40.3981 -80.6281
+                                    40.3881 -80.6291 40.3731 -80.6091 40.3061 -80.6041 40.2761
+                                    -80.6141 40.2451 -80.6501 40.1941 -80.6781 40.1681 -80.7011
+                                    40.1541 -80.7021 40.0351 -80.7381 39.9831 -80.7391 39.9461
+                                    -80.7631 39.9211 -80.7591 39.9131 -80.7681 39.9191 -80.7961
+                                    39.9151 -80.8081 39.9041 -80.8121 39.8721 -80.7911 39.8561
+                                    -80.7981 39.8391 -80.8261 39.8081 -80.8191 39.7591 -80.8701
+                                    39.7361 -80.8561 39.7181 -80.8321 39.7031 -80.8321 39.6801
+                                    -80.8631 39.6621 -80.8721 39.6241 -80.8811 39.6071 -80.9121
+                                    39.6061 -80.9321 39.5811 -80.9831 39.5441 -81.0321 39.5321
+                                    -81.0371 39.4961 -81.0981 39.4671 -81.1171 39.4371 -81.1801
+                                    39.4151 -81.2001 39.4081 -81.2251 39.3881 -81.2371 39.3861
+                                    -81.2841 39.3531 -81.3381 39.3451 -81.3761 39.4051 -81.4341
+                                    39.4101 -81.4481 39.4061 -81.4651 39.3521 -81.5401 39.3321
+                                    -81.5571 39.2651 -81.5721 39.2701 -81.6671 39.2601 -81.6891
+                                    39.2191 -81.6981 39.2131 -81.7231 39.1751 -81.7591 39.1251
+                                    -81.7441 39.0941 -81.7531 39.0771 -81.7861 39.0761 -81.8191
+                                    39.0661 -81.8241 39.0441 -81.8131 39.0161 -81.7751 38.9681
+                                    -81.7811 38.9301 -81.7621 38.9231 -81.7831 38.9481 -81.8231
+                                    38.9371 -81.8411 38.8851 -81.8661 38.8731 -81.8921 38.8841
+                                    -81.9151 38.8941 -81.9311 38.9321 -81.8981 38.9841 -81.9271
+                                    38.9911 -81.9371 38.9921 -81.9751 39.0151 -81.9991 39.0141
+                                    -82.0431 38.9881 -82.0581 38.9771 -82.0851 38.9521 -82.1011
+                                    38.8991 -82.1391 38.8381 -82.1461 38.8041 -82.1971 38.7781
+                                    -82.2161 38.7101 -82.1841 38.6771 -82.1891 38.6321 -82.1731
+                                    38.5941 -82.1841 38.5841 -82.2131 38.5941 -82.2711 38.5791
+                                    -82.2901 38.4651 -82.3141 38.4411 -82.3291 38.4281 -82.3941
+                                    38.4301 -82.4151 38.4051 -82.4951 38.4001 -82.5471 38.4031
+                                    -82.5751 38.4121 -82.5861 38.3681 -82.5981 38.3071 -82.5721
+                                    38.2921 -82.5801 38.2551 -82.5741 38.2451 -82.5891 38.2381
+                                    -82.6161 38.1931 -82.6061 38.1781 -82.6131 38.1691 -82.6471
+                                    38.1461 -82.6461 38.1091 -82.5931 38.0151 -82.5241 37.9751
+                                    -82.4751 37.9541 -82.4801 37.9421 -82.4931 37.9221 -82.5001
+                                    37.8941 -82.4371 37.8721 -82.4211 37.8111 -82.4051 37.7841
+                                    -82.3391 37.7581 -82.3191 37.7441 -82.3291 37.6681 -82.2951
+                                    37.6561 -82.2381 37.6231 -82.2051 37.6401 -82.1851 37.5931
+                                    -82.1591 37.5901 -82.1311 37.5691 -82.1371 37.5651 -82.1461
+                                    37.5571 -82.1421 37.5481 -82.0841 37.5251 -82.0551 37.5511
+                                    -82.0491 37.5301 -82.0261 37.5431 -81.9761 37.5311 -81.9591
+                                    37.5061 -81.9351 37.4921 -81.9481 37.4821 -81.9761 37.4661
+                                    -81.9881 37.4151 -81.9201 37.3711 -81.9261 37.3401 -81.8971
+                                    37.3251 -81.8631 37.3061 -81.8581 37.2851 -81.8391 37.2791
+                                    -81.8151 37.2871 -81.7921 37.2721 -81.7521 37.2501 -81.7381
+                                    37.2351 -81.7011 37.2041 -81.6661 37.2061 -81.5561 37.2341
+                                    -81.5051 37.2521 -81.4951 37.2541 -81.4751 37.2821 -81.4031
+                                    37.3111 -81.3911 37.3381 -81.3581 37.2931 -81.3121 37.2401
+                                    -81.2231 37.2741 -81.1401 37.2851 -81.0251 37.3061 -80.9861
+                                    37.2961 -80.9781 37.2911 -80.9681 37.3011 -80.9341 37.3391
+                                    -80.8551 37.3501 -80.8481 37.3881 -80.8771 37.4231 -80.8501
+                                    37.4121 -80.7991 37.3911 -80.7991 37.3861 -80.7701 37.3711
+                                    -80.7631 37.3781 -80.7471 37.3871 -80.7461 37.3921 -80.7291
+                                    37.3881 -80.7051 37.4451 -80.5971 37.4691 -80.5421 37.4741
+                                    -80.5081 37.4601 -80.4881 37.4331 -80.4871 37.4221 -80.4741
+                                    37.4341 -80.4251 37.4651 -80.3881 37.4751 -80.3521 37.4911
+                                    -80.3471 37.5111 -80.2881 37.5361 -80.2801 37.5281 -80.3081
+                                    37.5331 -80.3261 37.5661 -80.3161 37.5961 -80.2461 37.6241
+                                    -80.2191 37.6401 -80.2541 37.6401 -80.3011 37.6521 -80.3051
+                                    37.6711 -80.2951 37.6821 -80.3031 37.7251 -80.2501 37.7571
+                                    -80.2541 37.7781 -80.2201 37.8021 -80.2231 37.8421 -80.1711
+                                    37.8601 -80.1721 37.8771 -80.1601 37.8911 -80.1181 37.9141
+                                    -80.1061 37.9551 -80.0551 37.9891 -80.0001 38.0381 -79.9661
+                                    38.0671 -79.9571 38.1031 -79.9281 38.1211 -79.9351 38.1621
+                                    -79.9101 38.1791 -79.9161 38.2501 -79.8311 38.2681 -79.7931
+                                    38.2841 -79.7861 38.2981 -79.8031 38.3141 -79.8001 38.3531
+                                    -79.7641 38.3511 -79.7331 38.3941 -79.7201 38.4301 -79.6841
+                                    38.5001 -79.6921 38.5201 -79.6651 38.5501 -79.6691 38.5921
+                                    -79.6421 38.5531 -79.5361 38.4621 -79.4861 38.4121 -79.3171
+                                    38.4371 -79.2721 38.4801 -79.2311</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>West Virginia</feature:STATE_NAME>
+        <feature:STATE_FIPS>54</feature:STATE_FIPS>
+        <feature:SUB_REGION>S Atl</feature:SUB_REGION>
+        <feature:STATE_ABBR>WV</feature:STATE_ABBR>
+        <feature:LAND_KM>62384.2</feature:LAND_KM>
+        <feature:WATER_KM>375.199</feature:WATER_KM>
+        <feature:PERSONS>1793477.0</feature:PERSONS>
+        <feature:FAMILIES>500259.0</feature:FAMILIES>
+        <feature:HOUSHOLD>688557.0</feature:HOUSHOLD>
+        <feature:MALE>861536.0</feature:MALE>
+        <feature:FEMALE>931941.0</feature:FEMALE>
+        <feature:WORKERS>661702.0</feature:WORKERS>
+        <feature:DRVALONE>493164.0</feature:DRVALONE>
+        <feature:CARPOOL>106918.0</feature:CARPOOL>
+        <feature:PUBTRANS>7237.0</feature:PUBTRANS>
+        <feature:EMPLOYED>671085.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>71142.0</feature:UNEMPLOY>
+        <feature:SERVICE>205950.0</feature:SERVICE>
+        <feature:MANUAL>124172.0</feature:MANUAL>
+        <feature:P_MALE>0.48</feature:P_MALE>
+        <feature:P_FEMALE>0.52</feature:P_FEMALE>
+        <feature:SAMP_POP>317564.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.5"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>38.6491 -75.7111 38.8301 -75.7241 39.1411 -75.7521
+                                    39.2471 -75.7611 39.2951 -75.7641 39.3831 -75.7721 39.7231
+                                    -75.7911 39.7221 -76.1391 39.7211 -76.2331 39.7201 -76.5701
+                                    39.7211 -76.7901 39.7201 -76.9971 39.7201 -77.2211 39.7191
+                                    -77.4641 39.7191 -77.4761 39.7251 -78.0961 39.7241 -78.3341
+                                    39.7231 -78.3851 39.7231 -78.8181 39.7221 -78.9301 39.7191
+                                    -79.3961 39.7201 -79.4811 39.1971 -79.4901 39.2131 -79.4611
+                                    39.2111 -79.4491 39.2691 -79.3851 39.2911 -79.3461 39.3001
+                                    -79.2951 39.3251 -79.2801 39.3481 -79.2601 39.3931 -79.1631
+                                    39.4131 -79.1581 39.4161 -79.1311 39.4471 -79.1041 39.4641
+                                    -79.0961 39.4701 -79.1041 39.4701 -79.0701 39.4851 -79.0641
+                                    39.4831 -79.0491 39.4381 -78.9701 39.4601 -78.9551 39.5251
+                                    -78.8711 39.5631 -78.8381 39.5661 -78.8061 39.5851 -78.8221
+                                    39.6151 -78.7981 39.6301 -78.7981 39.6441 -78.7721 39.6261
+                                    -78.7671 39.6261 -78.7321 39.6211 -78.7301 39.6081 -78.7361
+                                    39.6011 -78.7741 39.5811 -78.7611 39.5761 -78.7321 39.5591
+                                    -78.7161 39.5361 -78.6661 39.5371 -78.6491 39.5291 -78.6371
+                                    39.5351 -78.6041 39.5201 -78.5641 39.5251 -78.5091 39.5191
+                                    -78.4811 39.5331 -78.4561 39.5481 -78.4461 39.5491 -78.4211
+                                    39.5801 -78.4621 39.5921 -78.4501 39.5871 -78.4041 39.6201
+                                    -78.4321 39.6141 -78.3841 39.6311 -78.3771 39.6321 -78.3571
+                                    39.6401 -78.3481 39.6181 -78.2731 39.6411 -78.2571 39.6581
+                                    -78.2291 39.6731 -78.2271 39.6751 -78.2041 39.6941 -78.1831
+                                    39.6751 -78.0941 39.6221 -78.0261 39.5981 -77.9951 39.6111
+                                    -77.9641 39.5851 -77.9451 39.5911 -77.9351 39.6141 -77.9471
+                                    39.6181 -77.9381 39.5961 -77.9031 39.6001 -77.8911 39.6161
+                                    -77.8881 39.6021 -77.8551 39.6051 -77.8421 39.5721 -77.8401
+                                    39.5651 -77.8531 39.5641 -77.8851 39.5571 -77.8901 39.5451
+                                    -77.8691 39.5141 -77.8641 39.5311 -77.8441 39.5251 -77.8351
+                                    39.5291 -77.8291 39.5111 -77.8251 39.5011 -77.8481 39.4931
+                                    -77.8251 39.4981 -77.7711 39.4801 -77.7991 39.4591 -77.7851
+                                    39.4631 -77.8041 39.4501 -77.7961 39.4391 -77.8041 39.4321
+                                    -77.8021 39.4251 -77.7571 39.4031 -77.7411 39.3961 -77.7371
+                                    39.3781 -77.7561 39.3601 -77.7451 39.3381 -77.7541 39.3261
+                                    -77.7501 39.3171 -77.7271 39.3181 -77.6791 39.2991 -77.6161
+                                    39.2981 -77.5681 39.2681 -77.5421 39.2491 -77.4941 39.2291
+                                    -77.4641 39.2181 -77.4611 39.1761 -77.4781 39.1571 -77.5161
+                                    39.1161 -77.5131 39.1031 -77.4791 39.0801 -77.4591 39.0661
+                                    -77.4331 39.0681 -77.3461 39.0621 -77.3241 39.0271 -77.2551
+                                    38.9751 -77.2431 38.9641 -77.1521 38.9321 -77.1221 38.9931
+                                    -77.0421 38.9661 -77.0081 38.8891 -76.9111 38.7881 -77.0451
+                                    38.7181 -77.0461 38.7121 -77.0571 38.7151 -77.0811 38.7031
+                                    -77.0931 38.6771 -77.1251 38.6481 -77.1291 38.4871 -77.2771
+                                    38.4131 -77.2551 38.3901 -77.2201 38.4261 -77.0021 38.3311
+                                    -76.9731 38.2991 -76.9081 38.3911 -76.8641 38.2341 -76.7601
+                                    38.2221 -76.5771 38.0451 -76.3301 38.2131 -76.3431 38.4501
+                                    -76.6471 38.4101 -76.5201 38.3351 -76.4711 38.3201 -76.4211
+                                    38.3461 -76.4051 38.3911 -76.3851 38.5221 -76.5081 38.7091
+                                    -76.5251 38.7581 -76.5491 38.9081 -76.4721 39.1181 -76.4231
+                                    39.1961 -76.5631 39.1581 -76.5951 39.1801 -76.6071 39.1981
+                                    -76.5761 39.2311 -76.5651 39.2591 -76.6041 39.2421 -76.5311
+                                    39.2311 -76.3991 39.3931 -76.3641 39.3741 -76.2261 39.4011
+                                    -76.1541 39.5421 -76.0781 39.5691 -76.0311 39.5241 -75.9741
+                                    39.4711 -75.9521 39.3941 -75.9781 39.3791 -75.8491 39.3581
+                                    -76.0371 39.3211 -76.1121 39.2041 -76.2181 39.1301 -76.2381
+                                    39.0921 -76.2211 39.1181 -76.1111 38.9731 -76.1991 38.9201
+                                    -76.1131 38.9481 -76.0951 38.8981 -76.1021 38.8891 -76.0751
+                                    38.8851 -76.1141 38.7881 -76.1651 38.7651 -76.1951 38.834
+                                    -76.2721 38.6991 -76.3501 38.6791 -76.3371 38.7691 -76.2671
+                                    38.7621 -76.2231 38.7091 -76.1741 38.7071 -76.1241 38.6101
+                                    -76.0751 38.5911 -76.0461 38.6221 -76.0281 38.5711 -76.0311
+                                    38.5951 -76.2511 38.5431 -76.1921 38.4781 -76.2911 38.4361
+                                    -76.2941 38.2581 -76.0651 38.3211 -76.0201 38.2821 -75.9951
+                                    38.2821 -75.9491 38.3751 -75.8861 38.3571 -75.8721 38.2581
+                                    -75.8941 38.2631 -75.7941 38.2401 -75.8611 38.2311 -75.8381
+                                    38.1741 -75.8971 38.0971 -75.7691 37.9791 -75.8651 37.9701
+                                    -75.6481 37.9961 -75.6261 38.0161 -75.3721 38.0681 -75.3731
+                                    38.2011 -75.2621 38.2731 -75.1501 38.3691 -75.1551 38.4501
+                                    -75.0931 38.4551 -75.3501 38.4631 -75.6991 38.5571 -75.7071
+                                    38.6491 -75.7111</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>38.9071 -76.2931 38.9491 -76.2731 38.9231 -76.2461
+                                    38.9781 -76.2481 39.0401 -76.2991 38.9581 -76.3561 38.8541
+                                    -76.3751 38.8751 -76.3291 38.9241 -76.3421 38.9121 -76.3221
+                                    38.9411 -76.3141 38.9561 -76.3391 38.9671 -76.2941 38.9071
+                                    -76.2931</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>38.4491 -75.0681 38.3221 -75.0871 38.4491 -75.0451
+                                    38.4491 -75.0681</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>38.0271 -75.2701 38.0281 -75.2421 38.1241 -75.1731
+                                    38.3201 -75.0941 38.2041 -75.1641 38.0941 -75.2091 38.0371
+                                    -75.2441 38.0271 -75.2701</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>Maryland</feature:STATE_NAME>
+        <feature:STATE_FIPS>24</feature:STATE_FIPS>
+        <feature:SUB_REGION>S Atl</feature:SUB_REGION>
+        <feature:STATE_ABBR>MD</feature:STATE_ABBR>
+        <feature:LAND_KM>25316.345</feature:LAND_KM>
+        <feature:WATER_KM>6188.794</feature:WATER_KM>
+        <feature:PERSONS>4781468.0</feature:PERSONS>
+        <feature:FAMILIES>1245814.0</feature:FAMILIES>
+        <feature:HOUSHOLD>1748991.0</feature:HOUSHOLD>
+        <feature:MALE>2318671.0</feature:MALE>
+        <feature:FEMALE>2462797.0</feature:FEMALE>
+        <feature:WORKERS>1783061.0</feature:WORKERS>
+        <feature:DRVALONE>1732837.0</feature:DRVALONE>
+        <feature:CARPOOL>376449.0</feature:CARPOOL>
+        <feature:PUBTRANS>202169.0</feature:PUBTRANS>
+        <feature:EMPLOYED>2481342.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>111536.0</feature:UNEMPLOY>
+        <feature:SERVICE>586994.0</feature:SERVICE>
+        <feature:MANUAL>260308.0</feature:MANUAL>
+        <feature:P_MALE>0.485</feature:P_MALE>
+        <feature:P_FEMALE>0.515</feature:P_FEMALE>
+        <feature:SAMP_POP>684773.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.6"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>37.6411 -102.0431 37.7341 -102.0431 38.2531 -102.0451
+                                    38.2631 -102.0451 38.6151 -102.0471 38.6921 -102.0471 39.0361
+                                    -102.0481 39.1261 -102.0471 39.5621 -102.0481 39.5681 -102.0481
+                                    39.9981 -102.0511 40.3421 -102.0471 40.4311 -102.0471 40.6971
+                                    -102.0451 40.7431 -102.0461 40.9981 -102.0471 41.0001 -102.6201
+                                    40.9981 -102.6511 41.0001 -103.3821 40.9991 -103.5711 41.0031
+                                    -104.0511 40.9941 -104.9331 40.9961 -105.2781 41.0001 -106.2021
+                                    41.0011 -106.3281 40.9981 -106.8641 41.0001 -107.3031 41.0031
+                                    -107.9181 40.9981 -109.0471 40.6651 -109.0451 40.2101 -109.0501
+                                    39.6571 -109.0511 39.5181 -109.0521 39.3601 -109.0501 38.4941
+                                    -109.0531 38.2441 -109.0551 38.1521 -109.0421 37.8871 -109.0421
+                                    37.6301 -109.0441 36.9961 -109.0471 36.9991 -108.3711 36.9981
+                                    -107.4711 36.9971 -107.4101 36.9991 -106.8891 36.9891 -106.8601
+                                    36.9911 -106.4711 36.9921 -105.9911 36.9941 -105.7121 36.9921
+                                    -105.2121 36.9931 -105.1451 36.9941 -103.9931 36.9991 -103.0771
+                                    36.9981 -102.9971 36.9881 -102.0361 37.3861 -102.0411 37.6411
+                                    -102.0431</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>Colorado</feature:STATE_NAME>
+        <feature:STATE_FIPS>08</feature:STATE_FIPS>
+        <feature:SUB_REGION>Mtn</feature:SUB_REGION>
+        <feature:STATE_ABBR>CO</feature:STATE_ABBR>
+        <feature:LAND_KM>268659.501</feature:LAND_KM>
+        <feature:WATER_KM>960.364</feature:WATER_KM>
+        <feature:PERSONS>3294394.0</feature:PERSONS>
+        <feature:FAMILIES>854214.0</feature:FAMILIES>
+        <feature:HOUSHOLD>1282489.0</feature:HOUSHOLD>
+        <feature:MALE>1631295.0</feature:MALE>
+        <feature:FEMALE>1663099.0</feature:FEMALE>
+        <feature:WORKERS>1233023.0</feature:WORKERS>
+        <feature:DRVALONE>1216639.0</feature:DRVALONE>
+        <feature:CARPOOL>210274.0</feature:CARPOOL>
+        <feature:PUBTRANS>46983.0</feature:PUBTRANS>
+        <feature:EMPLOYED>1633281.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>99438.0</feature:UNEMPLOY>
+        <feature:SERVICE>421079.0</feature:SERVICE>
+        <feature:MANUAL>181760.0</feature:MANUAL>
+        <feature:P_MALE>0.495</feature:P_MALE>
+        <feature:P_FEMALE>0.505</feature:P_FEMALE>
+        <feature:SAMP_POP>512677.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.7"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>36.6551 -86.5101 36.6501 -86.4151 36.6431 -86.1991
+                                    36.6331 -85.9801 36.6261 -85.7851 36.6181 -85.4371 36.6261
+                                    -85.3001 36.6251 -85.2721 36.6201 -84.9981 36.6051 -84.7911
+                                    36.6051 -84.7811 36.5951 -84.2561 36.5951 -84.2541 36.5921
+                                    -84.0061 36.5911 -83.9351 36.5841 -83.6951 36.5981 -83.6751
+                                    36.6161 -83.6461 36.6611 -83.5301 36.6611 -83.4601 36.6721
+                                    -83.4041 36.6881 -83.3851 36.7091 -83.3211 36.7341 -83.2031
+                                    36.7391 -83.1381 36.7511 -83.1241 36.7791 -83.1281 36.8501
+                                    -83.0681 36.8581 -83.0461 36.8631 -82.9501 36.8931 -82.8781
+                                    36.9321 -82.8601 36.9741 -82.8661 37.0051 -82.8121 37.0331
+                                    -82.7231 37.0651 -82.7201 37.0751 -82.7091 37.0931 -82.7211
+                                    37.1091 -82.7191 37.1931 -82.5681 37.1991 -82.5501 37.2501
+                                    -82.4061 37.2601 -82.3531 37.3041 -82.2891 37.5311 -81.9591
+                                    37.5431 -81.9761 37.5301 -82.0261 37.5511 -82.0491 37.5251
+                                    -82.0551 37.5481 -82.0841 37.5571 -82.1421 37.5651 -82.1461
+                                    37.5691 -82.1371 37.5901 -82.1311 37.5931 -82.1591 37.6401
+                                    -82.1851 37.6231 -82.2051 37.6561 -82.2381 37.6681 -82.2951
+                                    37.7441 -82.3291 37.7581 -82.3191 37.7841 -82.3391 37.8111
+                                    -82.4051 37.8721 -82.4211 37.8941 -82.4371 37.9221 -82.5001
+                                    37.9421 -82.4931 37.9541 -82.4801 37.9751 -82.4751 38.0151
+                                    -82.5241 38.1091 -82.5931 38.1461 -82.6461 38.1691 -82.6471
+                                    38.1781 -82.6131 38.1931 -82.6061 38.2381 -82.6161 38.2451
+                                    -82.5891 38.2551 -82.5741 38.2921 -82.5801 38.3071 -82.5721
+                                    38.3681 -82.5981 38.4121 -82.5861 38.4721 -82.6131 38.5021
+                                    -82.6691 38.5391 -82.6951 38.5521 -82.7421 38.5571 -82.8021
+                                    38.5711 -82.8271 38.6001 -82.8531 38.6521 -82.8601 38.6831
+                                    -82.8801 38.7181 -82.8731 38.7421 -82.8901 38.7461 -82.9211
+                                    38.7191 -82.9721 38.7141 -83.0271 38.6851 -83.0601 38.6641
+                                    -83.1111 38.6191 -83.1431 38.6091 -83.1821 38.6241 -83.2451
+                                    38.6091 -83.2721 38.5961 -83.2901 38.5961 -83.3061 38.6061
+                                    -83.3201 38.6311 -83.3301 38.6541 -83.3711 38.6631 -83.4531
+                                    38.6901 -83.5001 38.6961 -83.5261 38.6771 -83.6181 38.6641
+                                    -83.6331 38.6351 -83.6431 38.6231 -83.6551 38.6201 -83.6781
+                                    38.6351 -83.7121 38.6501 -83.7701 38.6931 -83.7901 38.7111
+                                    -83.8371 38.7441 -83.8571 38.7571 -83.9121 38.7771 -83.9621
+                                    38.7631 -84.0531 38.7651 -84.0881 38.7881 -84.1761 38.8121
+                                    -84.2281 38.8741 -84.2351 38.9171 -84.2611 38.9441 -84.2901
+                                    39.0141 -84.3131 39.0371 -84.3451 39.0351 -84.3911 39.0471
+                                    -84.4191 39.0841 -84.4251 39.1111 -84.4441 39.1071 -84.4921
+                                    39.0941 -84.5151 39.0701 -84.5931 39.0741 -84.6221 39.0891
+                                    -84.6671 39.1421 -84.7421 39.1061 -84.7891 39.1021 -84.8111
+                                    39.1031 -84.8271 39.0641 -84.8861 39.0501 -84.8901 39.0321
+                                    -84.8761 39.0051 -84.8441 38.9821 -84.8341 38.9541 -84.8461
+                                    38.9271 -84.8751 38.9091 -84.8751 38.9011 -84.8591 38.8971
+                                    -84.8031 38.8841 -84.7881 38.8661 -84.7871 38.8341 -84.8241
+                                    38.7931 -84.8181 38.7801 -84.9751 38.7641 -85.0251 38.7501
+                                    -85.0681 38.7141 -85.1191 38.6951 -85.1601 38.6951 -85.2051
+                                    38.7441 -85.2711 38.7361 -85.3351 38.7381 -85.4181 38.7241
+                                    -85.4461 38.6941 -85.4531 38.5841 -85.4241 38.5611 -85.4171
+                                    38.5361 -85.4321 38.5181 -85.4661 38.4711 -85.5071 38.4461
+                                    -85.6121 38.3831 -85.6431 38.3371 -85.6541 38.3001 -85.6811
+                                    38.2701 -85.7461 38.2821 -85.7861 38.2861 -85.8061 38.2761
+                                    -85.8391 38.2381 -85.8521 38.1791 -85.9121 38.0641 -85.9141
+                                    38.0331 -85.9301 38.0111 -85.9581 38.0011 -86.0061 37.9921
+                                    -86.0311 37.9661 -86.0521 38.0111 -86.1051 38.0171 -86.1901
+                                    38.0401 -86.2521 38.0581 -86.2771 38.0781 -86.2911 38.1501
+                                    -86.2971 38.1771 -86.3411 38.1931 -86.3641 38.1941 -86.3881
+                                    38.1671 -86.3871 38.1551 -86.3431 38.1431 -86.3351 38.1341
+                                    -86.3441 38.1231 -86.3931 38.1081 -86.4071 38.1291 -86.4521
+                                    38.1291 -86.4641 38.1111 -86.4741 38.0881 -86.4421 38.0751
+                                    -86.4421 38.0591 -86.4581 38.0511 -86.5031 38.0461 -86.5191
+                                    38.0181 -86.5271 37.9871 -86.5301 37.9421 -86.5161 37.9271
+                                    -86.5221 37.9211 -86.5411 37.9251 -86.5811 37.9211 -86.5981
+                                    37.8571 -86.6141 37.8451 -86.6451 37.8471 -86.6651 37.8601
+                                    -86.6701 37.9021 -86.6601 37.9131 -86.6681 37.9111 -86.6891
+                                    37.8941 -86.7281 37.8981 -86.7531 37.9781 -86.8021 37.9911
+                                    -86.8261 37.9861 -86.8631 37.9531 -86.9001 37.9371 -86.9311
+                                    37.9301 -86.9891 37.9241 -87.0131 37.9071 -87.0361 37.8071
+                                    -87.0711 37.7841 -87.1061 37.7891 -87.1311 37.8261 -87.1581
+                                    37.8381 -87.1751 37.8491 -87.2261 37.8701 -87.2721 37.8931
+                                    -87.3101 37.9341 -87.3871 37.9361 -87.4521 37.9151 -87.5041
+                                    37.9711 -87.6041 37.9231 -87.6271 37.8901 -87.5941 37.8641
+                                    -87.5931 37.8431 -87.6071 37.8281 -87.6511 37.8361 -87.6841
+                                    37.8971 -87.6791 37.8991 -87.7091 37.8941 -87.7281 37.8981
+                                    -87.7531 37.8781 -87.8231 37.8901 -87.8571 37.9241 -87.8991
+                                    37.9191 -87.9211 37.9041 -87.9341 37.8751 -87.9361 37.8381
+                                    -87.9101 37.8091 -87.9201 37.7991 -87.9391 37.7761 -87.9581
+                                    37.8011 -88.0111 37.8051 -88.0351 37.7351 -88.0721 37.7001
+                                    -88.1331 37.6601 -88.1591 37.6281 -88.1571 37.5831 -88.1341
+                                    37.5101 -88.0711 37.4761 -88.0871 37.4421 -88.3111 37.4091
+                                    -88.3591 37.4201 -88.4191 37.4001 -88.4671 37.2961 -88.5111
+                                    37.2571 -88.5011 37.2051 -88.4501 37.1561 -88.4221 37.0981
+                                    -88.4501 37.0721 -88.4761 37.0681 -88.4901 37.0641 -88.5171
+                                    37.0721 -88.5591 37.1091 -88.6141 37.1351 -88.6881 37.1411
+                                    -88.7391 37.1521 -88.7461 37.2021 -88.8631 37.2181 -88.9321
+                                    37.2201 -88.9931 37.1851 -89.0651 37.1121 -89.1161 37.0931
+                                    -89.1461 37.0641 -89.1691 37.0251 -89.1741 36.9981 -89.1501
+                                    36.9881 -89.1291 36.9771 -89.1071 36.9531 -89.1041 36.8661
+                                    -89.1291 36.8431 -89.1661 36.8291 -89.1731 36.8041 -89.1641
+                                    36.7921 -89.1251 36.7681 -89.1251 36.7591 -89.1511 36.7601
+                                    -89.1771 36.7271 -89.1961 36.7131 -89.1971 36.6711 -89.1671
+                                    36.6531 -89.1771 36.6311 -89.2001 36.5811 -89.2101 36.5691
+                                    -89.2411 36.5751 -89.2831 36.6221 -89.3221 36.6281 -89.3421
+                                    36.6251 -89.3631 36.6161 -89.3731 36.5101 -89.4181 36.5021
+                                    -89.4141 36.5021 -89.3461 36.4991 -88.8301 36.4991 -88.8261
+                                    36.4981 -88.8101 36.4991 -88.5121 36.4981 -88.4951 36.4961
+                                    -88.0421 36.5381 -88.0351 36.5821 -88.0411 36.6791 -88.0711
+                                    36.6691 -87.8701 36.6411 -87.8531 36.6441 -87.6931 36.6451
+                                    -87.6401 36.6491 -87.3461 36.6511 -87.1121 36.6501 -87.0681
+                                    36.6521 -86.7701 36.6551 -86.5101</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>36.4981 -89.5331 36.4981 -89.4751 36.5041 -89.4811
+                                    36.5251 -89.4711 36.5471 -89.4811 36.5591 -89.4931 36.5641
+                                    -89.5301 36.5571 -89.5561 36.5411 -89.5681 36.5181 -89.5661
+                                    36.4981 -89.5331</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>Kentucky</feature:STATE_NAME>
+        <feature:STATE_FIPS>21</feature:STATE_FIPS>
+        <feature:SUB_REGION>E S Cen</feature:SUB_REGION>
+        <feature:STATE_ABBR>KY</feature:STATE_ABBR>
+        <feature:LAND_KM>103961.904</feature:LAND_KM>
+        <feature:WATER_KM>1772.542</feature:WATER_KM>
+        <feature:PERSONS>4551524.0</feature:PERSONS>
+        <feature:FAMILIES>1237346.0</feature:FAMILIES>
+        <feature:HOUSHOLD>1718663.0</feature:HOUSHOLD>
+        <feature:MALE>2195130.0</feature:MALE>
+        <feature:FEMALE>2356394.0</feature:FEMALE>
+        <feature:WORKERS>1656590.0</feature:WORKERS>
+        <feature:DRVALONE>1502949.0</feature:DRVALONE>
+        <feature:CARPOOL>273091.0</feature:CARPOOL>
+        <feature:PUBTRANS>48158.0</feature:PUBTRANS>
+        <feature:EMPLOYED>1970934.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>148125.0</feature:UNEMPLOY>
+        <feature:SERVICE>556744.0</feature:SERVICE>
+        <feature:MANUAL>361621.0</feature:MANUAL>
+        <feature:P_MALE>0.482</feature:P_MALE>
+        <feature:P_FEMALE>0.518</feature:P_FEMALE>
+        <feature:SAMP_POP>646517.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.8"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>37.0011 -95.0711 37.0001 -95.0321 36.9961 -94.6201
+                                    37.0601 -94.6201 37.3271 -94.6181 37.3601 -94.6181 37.6501
+                                    -94.6181 37.6791 -94.6191 38.0301 -94.6161 38.0551 -94.6171
+                                    38.3921 -94.6181 38.4711 -94.6181 38.7371 -94.6121 38.8371
+                                    -94.6121 39.0441 -94.6091 39.1121 -94.6071 39.1411 -94.6001
+                                    39.1511 -94.6121 39.1581 -94.6461 39.1741 -94.6751 39.1711
+                                    -94.7301 39.1961 -94.7891 39.2111 -94.8201 39.2611 -94.8331
+                                    39.2861 -94.8801 39.3231 -94.9071 39.3401 -94.9111 39.3801
+                                    -94.8981 39.3811 -94.9251 39.4111 -94.9581 39.4391 -94.9851
+                                    39.4621 -95.0401 39.4851 -95.0471 39.5321 -95.1011 39.5601
+                                    -95.1081 39.5861 -95.0531 39.6251 -95.0551 39.6611 -95.0281
+                                    39.6841 -94.9781 39.7321 -94.9611 39.7361 -94.9521 39.7271
+                                    -94.9301 39.7261 -94.9051 39.7391 -94.8771 39.7541 -94.8701
+                                    39.7601 -94.8761 39.7571 -94.9211 39.7751 -94.9341 39.7821
+                                    -94.9331 39.7931 -94.8991 39.8171 -94.8881 39.8281 -94.8981
+                                    39.8331 -94.9231 39.8491 -94.9361 39.8961 -94.9371 39.9001
+                                    -94.9641 39.8961 -95.0211 39.8771 -95.0331 39.8661 -95.0621
+                                    39.8691 -95.1001 39.9081 -95.1501 39.9101 -95.1931 39.9381
+                                    -95.2071 39.9421 -95.2401 39.9991 -95.3081 39.9921 -95.3291
+                                    39.9931 -95.7801 39.9951 -96.0001 39.9941 -96.2401 39.9941
+                                    -96.4531 39.9941 -96.8011 39.9961 -96.9071 39.9971 -97.3611
+                                    39.9991 -97.8161 39.9981 -97.9291 39.9981 -98.2631 39.9971
+                                    -98.5041 39.9981 -98.7201 39.9981 -99.0641 39.9991 -99.1771
+                                    40.0021 -99.6271 40.0001 -100.1801 40.0001 -100.1901 39.9991
+                                    -100.7341 40.0001 -100.7541 40.0011 -101.3211 40.0011 -101.4061
+                                    39.9981 -102.0511 39.5681 -102.0481 39.5621 -102.0481 39.1261
+                                    -102.0471 39.0361 -102.0481 38.6921 -102.0471 38.6151 -102.0471
+                                    38.2631 -102.0451 38.2531 -102.0451 37.7341 -102.0431 37.6411
+                                    -102.0431 37.3861 -102.0411 36.9881 -102.0361 36.9881 -102.0241
+                                    36.9961 -101.5531 36.9971 -101.0711 36.9961 -100.9501 36.9971
+                                    -100.6331 36.9971 -100.0881 36.9951 -99.9981 36.9951 -99.5441
+                                    36.9941 -99.4371 36.9981 -98.9991 36.9981 -98.5391 36.9991
+                                    -98.3461 36.9981 -98.1041 36.9981 -97.8031 36.9961 -97.4651
+                                    36.9991 -97.1371 37.0001 -96.7481 37.0001 -96.5181 36.9981
+                                    -96.0051 37.0001 -95.9571 36.9981 -95.7851 37.0001 -95.5251
+                                    37.0001 -95.4061 37.0011 -95.0711</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>Kansas</feature:STATE_NAME>
+        <feature:STATE_FIPS>20</feature:STATE_FIPS>
+        <feature:SUB_REGION>W N Cen</feature:SUB_REGION>
+        <feature:STATE_ABBR>KS</feature:STATE_ABBR>
+        <feature:LAND_KM>211921.641</feature:LAND_KM>
+        <feature:WATER_KM>1188.865</feature:WATER_KM>
+        <feature:PERSONS>2477574.0</feature:PERSONS>
+        <feature:FAMILIES>658600.0</feature:FAMILIES>
+        <feature:HOUSHOLD>944726.0</feature:HOUSHOLD>
+        <feature:MALE>1214645.0</feature:MALE>
+        <feature:FEMALE>1262929.0</feature:FEMALE>
+        <feature:WORKERS>907383.0</feature:WORKERS>
+        <feature:DRVALONE>928575.0</feature:DRVALONE>
+        <feature:CARPOOL>135598.0</feature:CARPOOL>
+        <feature:PUBTRANS>7585.0</feature:PUBTRANS>
+        <feature:EMPLOYED>1172214.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>57772.0</feature:UNEMPLOY>
+        <feature:SERVICE>346339.0</feature:SERVICE>
+        <feature:MANUAL>166429.0</feature:MANUAL>
+        <feature:P_MALE>0.49</feature:P_MALE>
+        <feature:P_FEMALE>0.51</feature:P_FEMALE>
+        <feature:SAMP_POP>453411.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.9"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>36.5461 -79.1441 36.5431 -78.7961 36.5461 -78.7371
+                                    36.5411 -78.4581 36.5451 -78.3211 36.5521 -78.0511 36.5521
+                                    -77.8981 36.5531 -77.7631 36.5531 -77.3201 36.5561 -77.1771
+                                    36.5541 -76.9241 36.5541 -76.9211 36.5551 -76.5631 36.5551
+                                    -76.4971 36.5561 -76.3301 36.5571 -76.1271 36.5561 -76.0451
+                                    36.6031 -76.0611 36.5561 -76.0271 36.5561 -75.9981 36.7211
+                                    -75.9501 36.5991 -75.8921 36.5561 -75.9011 36.5551 -75.8781
+                                    36.9231 -75.9951 36.9311 -76.1181 36.9041 -76.1911 36.9351
+                                    -76.2021 36.9621 -76.2841 36.9421 -76.3071 36.8281 -76.2921
+                                    36.8451 -76.3171 36.8261 -76.4011 36.8351 -76.3941 36.8601
+                                    -76.3411 36.9131 -76.3481 36.9011 -76.4101 36.8691 -76.5071
+                                    36.7951 -76.5611 36.8411 -76.5601 36.8951 -76.4861 36.9191
+                                    -76.4821 36.9121 -76.5171 36.9611 -76.4891 37.0061 -76.5551
+                                    36.9941 -76.6131 37.0241 -76.5771 37.0541 -76.6651 37.1471
+                                    -76.6711 37.1971 -76.6851 37.1501 -76.7291 37.2071 -76.7971
+                                    37.2011 -76.9001 37.2361 -76.9411 37.2591 -76.8781 37.3221
+                                    -76.8751 37.2431 -76.8571 37.2401 -76.7951 37.1931 -76.7461
+                                    37.2321 -76.6971 37.2251 -76.6481 37.1781 -76.6101 37.1321
+                                    -76.6241 37.0801 -76.5681 37.1171 -76.5641 37.0881 -76.5151
+                                    37.0671 -76.5311 36.9651 -76.4261 36.9901 -76.3841 37.0201
+                                    -76.2931 37.0741 -76.2781 37.1071 -76.3951 37.1221 -76.2851
+                                    37.1771 -76.3371 37.1461 -76.3631 37.1731 -76.3961 37.1521
+                                    -76.4121 37.2071 -76.4241 37.2911 -76.5951 37.3711 -76.6691
+                                    37.4181 -76.7041 37.4121 -76.6531 37.2551 -76.4611 37.2931
+                                    -76.3921 37.3771 -76.4551 37.3731 -76.4031 37.4121 -76.4171
+                                    37.4181 -76.4631 37.4571 -76.4461 37.3931 -76.3391 37.3341
+                                    -76.3001 37.3301 -76.2751 37.3901 -76.2541 37.5151 -76.3551
+                                    37.5151 -76.4341 37.5521 -76.5121 37.5251 -76.3481 37.5511
+                                    -76.3141 37.6411 -76.5691 37.7741 -76.6811 37.7981 -76.7321
+                                    37.9191 -76.8181 37.9161 -76.7711 37.7961 -76.6311 37.7701
+                                    -76.5801 37.6561 -76.5071 37.6221 -76.3441 37.6771 -76.3231
+                                    37.7001 -76.3571 37.7191 -76.3091 37.7981 -76.3241 37.8501
+                                    -76.2511 37.8901 -76.2591 37.9561 -76.3671 38.0121 -76.5241
+                                    38.0031 -76.5731 38.0251 -76.5581 38.0741 -76.5491 38.1201
+                                    -76.5951 38.2021 -76.9361 38.2801 -76.9991 38.3751 -77.0541
+                                    38.3311 -77.2401 38.3431 -77.3211 38.3621 -77.2891 38.4361
+                                    -77.3381 38.5011 -77.3031 38.6501 -77.2271 38.6601 -77.1941
+                                    38.6221 -77.1971 38.6481 -77.1291 38.6771 -77.1251 38.7031
+                                    -77.0931 38.7151 -77.0811 38.7121 -77.0571 38.7181 -77.0461
+                                    38.7881 -77.0451 38.8131 -77.0351 38.8291 -77.0451 38.8381
+                                    -77.0401 38.8621 -77.0391 38.8861 -77.0671 38.9151 -77.0781
+                                    38.9321 -77.1221 38.9641 -77.1521 38.9751 -77.2431 39.0271
+                                    -77.2551 39.0621 -77.3241 39.0681 -77.3461 39.0661 -77.4331
+                                    39.0801 -77.4591 39.1031 -77.4791 39.1161 -77.5131 39.1571
+                                    -77.5161 39.1761 -77.4781 39.2181 -77.4611 39.2291 -77.4641
+                                    39.2491 -77.4941 39.2681 -77.5421 39.2981 -77.5681 39.2991
+                                    -77.6161 39.3181 -77.6791 39.3171 -77.7271 39.2841 -77.7591
+                                    39.2461 -77.7681 39.1961 -77.8051 39.1411 -77.8201 39.1321
+                                    -77.8301 39.2651 -78.0331 39.3911 -78.2291 39.4231 -78.2771
+                                    39.4561 -78.3471 39.3801 -78.3501 39.3611 -78.3651 39.3501
+                                    -78.3441 39.3411 -78.3411 39.2571 -78.4131 39.2441 -78.3991
+                                    39.2121 -78.4231 39.1971 -78.4241 39.1701 -78.4021 39.1481
+                                    -78.4301 39.1181 -78.4481 39.1111 -78.4851 39.0931 -78.5011
+                                    39.0571 -78.5361 39.0351 -78.5641 39.0231 -78.5491 39.0131
+                                    -78.5531 38.9671 -78.5981 38.9791 -78.6311 38.9501 -78.6471
+                                    38.9211 -78.6801 38.9041 -78.7191 38.9301 -78.7241 38.9291
+                                    -78.7371 38.9111 -78.7491 38.8801 -78.7931 38.8331 -78.8161
+                                    38.7631 -78.8661 38.8461 -78.9871 38.7991 -79.0331 38.7901
+                                    -79.0551 38.7611 -79.0561 38.7071 -79.0871 38.6591 -79.0881
+                                    38.6631 -79.1211 38.6581 -79.1271 38.4801 -79.2311 38.4371
+                                    -79.2721 38.4121 -79.3171 38.4621 -79.4861 38.5531 -79.5361
+                                    38.5921 -79.6421 38.5501 -79.6691 38.5201 -79.6651 38.5001
+                                    -79.6921 38.4301 -79.6841 38.3941 -79.7201 38.3511 -79.7331
+                                    38.3531 -79.7641 38.3141 -79.8001 38.2981 -79.8031 38.2841
+                                    -79.7861 38.2681 -79.7931 38.2501 -79.8311 38.1791 -79.9161
+                                    38.1621 -79.9101 38.1211 -79.9351 38.1031 -79.9281 38.0671
+                                    -79.9571 38.0381 -79.9661 37.9891 -80.0001 37.9551 -80.0551
+                                    37.9141 -80.1061 37.8911 -80.1181 37.8771 -80.1601 37.8601
+                                    -80.1721 37.8421 -80.1711 37.8021 -80.2231 37.7781 -80.2201
+                                    37.7571 -80.2541 37.7251 -80.2501 37.6821 -80.3031 37.6711
+                                    -80.2951 37.6521 -80.3051 37.6401 -80.3011 37.6401 -80.2541
+                                    37.6241 -80.2191 37.5961 -80.2461 37.5661 -80.3161 37.5331
+                                    -80.3261 37.5281 -80.3081 37.5361 -80.2801 37.5111 -80.2881
+                                    37.4911 -80.3471 37.4751 -80.3521 37.4651 -80.3881 37.4341
+                                    -80.4251 37.4221 -80.4741 37.4331 -80.4871 37.4601 -80.4881
+                                    37.4741 -80.5081 37.4691 -80.5421 37.4451 -80.5971 37.3881
+                                    -80.7051 37.3921 -80.7291 37.3871 -80.7461 37.3781 -80.7471
+                                    37.3711 -80.7631 37.3861 -80.7701 37.3911 -80.7991 37.4121
+                                    -80.7991 37.4231 -80.8501 37.3881 -80.8771 37.3501 -80.8481
+                                    37.3391 -80.8551 37.3011 -80.9341 37.2911 -80.9681 37.2961
+                                    -80.9781 37.3061 -80.9861 37.2851 -81.0251 37.2741 -81.1401
+                                    37.2401 -81.2231 37.2931 -81.3121 37.3381 -81.3581 37.3111
+                                    -81.3911 37.2821 -81.4031 37.2541 -81.4751 37.2521 -81.4951
+                                    37.2341 -81.5051 37.2061 -81.5561 37.2041 -81.6661 37.2351
+                                    -81.7011 37.2501 -81.7381 37.2721 -81.7521 37.2871 -81.7921
+                                    37.2791 -81.8151 37.2851 -81.8391 37.3061 -81.8581 37.3251
+                                    -81.8631 37.3401 -81.8971 37.3711 -81.9261 37.4151 -81.9201
+                                    37.4661 -81.9881 37.4821 -81.9761 37.4921 -81.9481 37.5061
+                                    -81.9351 37.5311 -81.9591 37.3041 -82.2891 37.2601 -82.3531
+                                    37.2501 -82.4061 37.1991 -82.5501 37.1931 -82.5681 37.1091
+                                    -82.7191 37.0931 -82.7211 37.0751 -82.7091 37.0651 -82.7201
+                                    37.0331 -82.7231 37.0051 -82.8121 36.9741 -82.8661 36.9321
+                                    -82.8601 36.8931 -82.8781 36.8631 -82.9501 36.8581 -83.0461
+                                    36.8501 -83.0681 36.7791 -83.1281 36.7511 -83.1241 36.7391
+                                    -83.1381 36.7341 -83.2031 36.7091 -83.3211 36.6881 -83.3851
+                                    36.6721 -83.4041 36.6611 -83.4601 36.6611 -83.5301 36.6161
+                                    -83.6461 36.5981 -83.6751 36.5981 -83.4641 36.6001 -83.2751
+                                    36.5891 -83.2481 36.5881 -83.2111 36.5911 -82.9861 36.5901
+                                    -82.8491 36.5911 -82.6101 36.5911 -82.2961 36.5931 -82.2161
+                                    36.5951 -82.1541 36.5951 -81.9291 36.6131 -81.9181 36.6111
+                                    -81.8291 36.6071 -81.6521 36.5891 -81.6691 36.5721 -81.3451
+                                    36.5651 -80.9031 36.5631 -80.8381 36.5571 -80.6111 36.5511
+                                    -80.4351 36.5471 -80.0481 36.5451 -80.0241 36.5471 -79.7171
+                                    36.5471 -79.5101 36.5491 -79.2171 36.5461 -79.1441</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>38.0271 -75.2701 37.9181 -75.3461 37.9001 -75.3781
+                                    37.9011 -75.3441 37.8751 -75.3861 37.8881 -75.3391 37.9621
+                                    -75.2981 38.0281 -75.2421 38.0271 -75.2701</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>37.5521 -75.8671 37.5561 -75.9301 37.5211 -75.9541
+                                    37.4791 -75.9651 37.4841 -75.9341 37.3081 -76.0181 37.1261
+                                    -75.9701 37.1421 -75.9311 37.3671 -75.8971 37.4181 -75.8261
+                                    37.4081 -75.7901 37.4261 -75.8201 37.4691 -75.8131 37.4931
+                                    -75.7051 37.5101 -75.7561 37.5581 -75.7271 37.5591 -75.6501
+                                    37.5891 -75.6991 37.6771 -75.5891 37.6971 -75.6171 38.0161
+                                    -75.3721 37.9961 -75.6261 37.9701 -75.6481 37.9411 -75.6581
+                                    37.9301 -75.7331 37.8581 -75.6861 37.8241 -75.6961 37.7891
+                                    -75.7821 37.7111 -75.7991 37.5921 -75.9051 37.5801 -75.8871
+                                    37.5851 -75.9291 37.5611 -75.9411 37.5521 -75.8671</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>Virginia</feature:STATE_NAME>
+        <feature:STATE_FIPS>51</feature:STATE_FIPS>
+        <feature:SUB_REGION>S Atl</feature:SUB_REGION>
+        <feature:STATE_ABBR>VA</feature:STATE_ABBR>
+        <feature:LAND_KM>102537.328</feature:LAND_KM>
+        <feature:WATER_KM>4263.82</feature:WATER_KM>
+        <feature:PERSONS>6180651.0</feature:PERSONS>
+        <feature:FAMILIES>1627615.0</feature:FAMILIES>
+        <feature:HOUSHOLD>2289067.0</feature:HOUSHOLD>
+        <feature:MALE>3030948.0</feature:MALE>
+        <feature:FEMALE>3149703.0</feature:FEMALE>
+        <feature:WORKERS>2343200.0</feature:WORKERS>
+        <feature:DRVALONE>2278600.0</feature:DRVALONE>
+        <feature:CARPOOL>499251.0</feature:CARPOOL>
+        <feature:PUBTRANS>125792.0</feature:PUBTRANS>
+        <feature:EMPLOYED>3025109.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>141926.0</feature:UNEMPLOY>
+        <feature:SERVICE>777181.0</feature:SERVICE>
+        <feature:MANUAL>420070.0</feature:MANUAL>
+        <feature:P_MALE>0.49</feature:P_MALE>
+        <feature:P_FEMALE>0.51</feature:P_FEMALE>
+        <feature:SAMP_POP>898089.0</feature:SAMP_POP>
+    </feature:states>
+    <feature:states xmlns:feature="http://www.openplans.org/topp" fid="states.10"
+        xmlns="http://www.opengis.net/gml">
+        <feature:the_geom>
+            <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                <gml:surfaceMember>
+                    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">
+                        <gml:exterior>
+                            <gml:LinearRing srsName="urn:x-ogc:def:crs:EPSG:4326">
+                                <gml:posList>36.9531 -89.1041 36.9771 -89.1071 36.9881 -89.1291
+                                    36.9861 -89.1931 37.0281 -89.2101 37.0411 -89.2371 37.0871
+                                    -89.2641 37.0911 -89.2841 37.0851 -89.3031 37.0601 -89.3091
+                                    37.0271 -89.2641 37.0081 -89.2621 36.9991 -89.2821 37.0091
+                                    -89.3101 37.0491 -89.3821 37.0991 -89.3791 37.1371 -89.4231
+                                    37.1651 -89.4401 37.2241 -89.4681 37.2531 -89.4651 37.2561
+                                    -89.4891 37.2761 -89.5131 37.3041 -89.5131 37.3291 -89.5001
+                                    37.3391 -89.4681 37.3551 -89.4351 37.4111 -89.4271 37.4531
+                                    -89.4531 37.4911 -89.4941 37.5711 -89.5241 37.6151 -89.5131
+                                    37.6501 -89.5191 37.6791 -89.5131 37.6941 -89.5211 37.7061
+                                    -89.5811 37.7451 -89.6661 37.7831 -89.6751 37.8041 -89.6911
+                                    37.8401 -89.7281 37.9051 -89.8511 37.9051 -89.8611 37.8911
+                                    -89.8661 37.8751 -89.9001 37.8781 -89.9371 37.9111 -89.9781
+                                    37.9631 -89.9581 37.9691 -90.0101 37.9931 -90.0411 38.0321
+                                    -90.1191 38.0531 -90.1341 38.0881 -90.2071 38.1221 -90.2541
+                                    38.1661 -90.2891 38.1881 -90.3361 38.2341 -90.3641 38.3231
+                                    -90.3691 38.3651 -90.3581 38.3901 -90.3391 38.4271 -90.3011
+                                    38.5181 -90.2651 38.5321 -90.2611 38.5621 -90.2401 38.6101
+                                    -90.1831 38.6581 -90.1831 38.7001 -90.2021 38.7231 -90.1961
+                                    38.7731 -90.1631 38.7851 -90.1351 38.8001 -90.1211 38.8301
+                                    -90.1131 38.8531 -90.1321 38.9141 -90.2431 38.9241 -90.2781
+                                    38.9241 -90.3191 38.9621 -90.4131 38.9591 -90.4691 38.8911
+                                    -90.5301 38.8711 -90.5701 38.8801 -90.6271 38.9351 -90.6681
+                                    39.0371 -90.7061 39.0581 -90.7071 39.0931 -90.6901 39.1441
+                                    -90.7161 39.1951 -90.7181 39.2241 -90.7321 39.2471 -90.7381
+                                    39.2961 -90.7791 39.3501 -90.8501 39.4001 -90.9471 39.4441
+                                    -91.0361 39.4731 -91.0641 39.5281 -91.0931 39.5521 -91.1561
+                                    39.6001 -91.2031 39.6851 -91.3171 39.7241 -91.3671 39.7611
+                                    -91.3731 39.8031 -91.3811 39.8631 -91.4491 39.8851 -91.4501
+                                    39.9011 -91.4341 39.9211 -91.4301 39.9461 -91.4471 40.0051
+                                    -91.4871 40.0661 -91.5041 40.1341 -91.5161 40.2001 -91.5061
+                                    40.2511 -91.4981 40.3091 -91.4861 40.3711 -91.4481 40.3901
+                                    -91.4761 40.3901 -91.4901 40.4051 -91.5001 40.4101 -91.5271
+                                    40.4351 -91.5291 40.4411 -91.5381 40.4551 -91.5331 40.4631
+                                    -91.5791 40.4841 -91.5851 40.5041 -91.6161 40.5321 -91.6221
+                                    40.5511 -91.6911 40.5811 -91.6891 40.5931 -91.7161 40.6091
+                                    -91.7411 40.6081 -91.9461 40.6001 -92.1921 40.5991 -92.3611
+                                    40.5911 -92.6461 40.5891 -92.7171 40.5841 -93.1001 40.5801
+                                    -93.3701 40.5801 -93.5621 40.5781 -93.7861 40.5741 -94.0171
+                                    40.5701 -94.2381 40.5741 -94.4841 40.5751 -94.6391 40.5771
+                                    -94.9201 40.5811 -95.2171 40.5841 -95.3821 40.5891 -95.7671
+                                    40.5491 -95.7631 40.5321 -95.7361 40.5241 -95.6911 40.5611
+                                    -95.6871 40.5651 -95.6751 40.5581 -95.6621 40.5301 -95.6571
+                                    40.5121 -95.6841 40.4851 -95.6951 40.3961 -95.6361 40.3581
+                                    -95.6331 40.3461 -95.6151 40.3311 -95.6171 40.3221 -95.6451
+                                    40.3091 -95.6461 40.3091 -95.5951 40.2661 -95.5461 40.2261
+                                    -95.4761 40.2131 -95.4661 40.1731 -95.4601 40.1311 -95.4221
+                                    40.1151 -95.3921 40.0951 -95.3841 40.0801 -95.4031 40.0481
+                                    -95.4131 40.0431 -95.3901 40.0281 -95.3701 40.0241 -95.3441
+                                    39.9991 -95.3081 39.9421 -95.2401 39.9381 -95.2071 39.9101
+                                    -95.1931 39.9081 -95.1501 39.8691 -95.1001 39.8661 -95.0621
+                                    39.8771 -95.0331 39.8961 -95.0211 39.9001 -94.9641 39.8961
+                                    -94.9371 39.8491 -94.9361 39.8331 -94.9231 39.8281 -94.8981
+                                    39.8171 -94.8881 39.7931 -94.8991 39.7821 -94.9331 39.7751
+                                    -94.9341 39.7571 -94.9211 39.7601 -94.8761 39.7541 -94.8701
+                                    39.7391 -94.8771 39.7261 -94.9051 39.7271 -94.9301 39.7361
+                                    -94.9521 39.7321 -94.9611 39.6841 -94.9781 39.6611 -95.0281
+                                    39.6251 -95.0551 39.5861 -95.0531 39.5601 -95.1081 39.5321
+                                    -95.1011 39.4851 -95.0471 39.4621 -95.0401 39.4391 -94.9851
+                                    39.4111 -94.9581 39.3811 -94.9251 39.3801 -94.8981 39.3401
+                                    -94.9111 39.3231 -94.9071 39.2861 -94.8801 39.2611 -94.8331
+                                    39.2111 -94.8201 39.1961 -94.7891 39.1711 -94.7301 39.1741
+                                    -94.6751 39.1581 -94.6461 39.1511 -94.6121 39.1411 -94.6001
+                                    39.1121 -94.6071 39.0441 -94.6091 38.8371 -94.6121 38.7371
+                                    -94.6121 38.4711 -94.6181 38.3921 -94.6181 38.0551 -94.6171
+                                    38.0301 -94.6161 37.6791 -94.6191 37.6501 -94.6181 37.3601
+                                    -94.6181 37.3271 -94.6181 37.0601 -94.6201 36.9961 -94.6201
+                                    36.7631 -94.6211 36.6701 -94.6201 36.4891 -94.6171 36.4901
+                                    -94.0801 36.4891 -93.8571 36.4891 -93.5961 36.4901 -93.3281
+                                    36.4901 -93.2971 36.4891 -92.8521 36.4891 -92.7771 36.4901
+                                    -92.5221 36.4911 -92.1461 36.4911 -92.1271 36.4901 -91.6881
+                                    36.4901 -91.4521 36.4911 -91.4111 36.4871 -91.1331 36.4891
+                                    -90.8041 36.4901 -90.5811 36.4921 -90.2241 36.4911 -90.1501
+                                    36.4571 -90.1371 36.4531 -90.1171 36.4221 -90.1231 36.4041
+                                    -90.1161 36.3971 -90.0801 36.3821 -90.0521 36.3621 -90.0501
+                                    36.3251 -90.0671 36.3001 -90.0491 36.2721 -90.0661 36.2571
+                                    -90.1091 36.2121 -90.1311 36.1961 -90.1611 36.1721 -90.2191
+                                    36.1611 -90.2321 36.1371 -90.2341 36.1181 -90.2631 36.1151
+                                    -90.2841 36.0911 -90.3151 35.9891 -90.3781 35.9911 -90.2831
+                                    35.9961 -89.9631 35.9991 -89.7211 36.0251 -89.6881 36.0821
+                                    -89.6781 36.0991 -89.6671 36.1291 -89.5891 36.1521 -89.5891
+                                    36.1831 -89.6181 36.2201 -89.6761 36.2401 -89.6951 36.2521
+                                    -89.6941 36.2541 -89.6701 36.2401 -89.6181 36.2571 -89.5411
+                                    36.2641 -89.5351 36.2801 -89.5421 36.3081 -89.6061 36.3341
+                                    -89.6221 36.3541 -89.6051 36.3451 -89.5441 36.3551 -89.5191
+                                    36.4011 -89.5201 36.4401 -89.5451 36.4711 -89.5161 36.4981
+                                    -89.5331 36.5181 -89.5661 36.5411 -89.5681 36.5571 -89.5561
+                                    36.5641 -89.5301 36.5591 -89.4931 36.5471 -89.4811 36.5251
+                                    -89.4711 36.5041 -89.4811 36.4981 -89.4751 36.4651 -89.4911
+                                    36.4451 -89.4701 36.4561 -89.4481 36.5021 -89.4141 36.5101
+                                    -89.4181 36.6161 -89.3731 36.6251 -89.3631 36.6281 -89.3421
+                                    36.6221 -89.3221 36.5751 -89.2831 36.5691 -89.2411 36.5811
+                                    -89.2101 36.6311 -89.2001 36.6531 -89.1771 36.6711 -89.1671
+                                    36.7131 -89.1971 36.7271 -89.1961 36.7601 -89.1771 36.7591
+                                    -89.1511 36.7681 -89.1251 36.7921 -89.1251 36.8041 -89.1641
+                                    36.8291 -89.1731 36.8431 -89.1661 36.8661 -89.1291 36.9531
+                                    -89.1041</gml:posList>
+                            </gml:LinearRing>
+                        </gml:exterior>
+                    </gml:Polygon>
+                </gml:surfaceMember>
+            </gml:MultiSurface>
+        </feature:the_geom>
+        <feature:STATE_NAME>Missouri</feature:STATE_NAME>
+        <feature:STATE_FIPS>29</feature:STATE_FIPS>
+        <feature:SUB_REGION>W N Cen</feature:SUB_REGION>
+        <feature:STATE_ABBR>MO</feature:STATE_ABBR>
+        <feature:LAND_KM>178445.951</feature:LAND_KM>
+        <feature:WATER_KM>2100.115</feature:WATER_KM>
+        <feature:PERSONS>5117073.0</feature:PERSONS>
+        <feature:FAMILIES>1368334.0</feature:FAMILIES>
+        <feature:HOUSHOLD>1961206.0</feature:HOUSHOLD>
+        <feature:MALE>2464315.0</feature:MALE>
+        <feature:FEMALE>2652758.0</feature:FEMALE>
+        <feature:WORKERS>1861192.0</feature:WORKERS>
+        <feature:DRVALONE>1816079.0</feature:DRVALONE>
+        <feature:CARPOOL>312042.0</feature:CARPOOL>
+        <feature:PUBTRANS>47129.0</feature:PUBTRANS>
+        <feature:EMPLOYED>2367395.0</feature:EMPLOYED>
+        <feature:UNEMPLOY>155388.0</feature:UNEMPLOY>
+        <feature:SERVICE>659782.0</feature:SERVICE>
+        <feature:MANUAL>386746.0</feature:MANUAL>
+        <feature:P_MALE>0.482</feature:P_MALE>
+        <feature:P_FEMALE>0.518</feature:P_FEMALE>
+        <feature:SAMP_POP>864999.0</feature:SAMP_POP>
+    </feature:states>
+</gml:featureMembers>
diff --git a/test/spec/ol/format/gml/topp-states-wfs.xml b/test/spec/ol/format/gml/topp-states-wfs.xml
new file mode 100644
index 0000000..352a01f
--- /dev/null
+++ b/test/spec/ol/format/gml/topp-states-wfs.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="3" timeStamp="2008-09-12T00:24:21.013-04:00"
+    xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma.openplans.org:80/geoserver/schemas/wfs/1.1.0/wfs.xsd"
+    xmlns:ogc="http://www.opengis.net/ogc" xmlns:opengeo="http://open-geo.com"
+    xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs"
+    xmlns:topp="http://www.openplans.org/topp" xmlns:seb="http://seb.com"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows"
+    xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <gml:featureMembers>
+        <topp:states gml:id="states.1">
+            <gml:boundedBy>
+                <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:lowerCorner>36.986 -91.516</gml:lowerCorner>
+                    <gml:upperCorner>42.509 -87.507</gml:upperCorner>
+                </gml:Envelope>
+            </gml:boundedBy>
+            <topp:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>37.511 -88.071 37.476 -88.087 37.442 -88.311 37.409
+                                        -88.359 37.421 -88.419 37.401 -88.467 37.296 -88.511 37.257
+                                        -88.501 37.205 -88.451 37.156 -88.422 37.098 -88.451 37.072
+                                        -88.476 37.068 -88.491 37.064 -88.517 37.072 -88.559 37.109
+                                        -88.614 37.135 -88.688 37.141 -88.739 37.152 -88.746 37.202
+                                        -88.863 37.218 -88.932 37.221 -88.993 37.185 -89.065 37.112
+                                        -89.116 37.093 -89.146 37.064 -89.169 37.025 -89.174 36.998
+                                        -89.151 36.988 -89.129 36.986 -89.193 37.028 -89.211 37.041
+                                        -89.237 37.087 -89.264 37.091 -89.284 37.085 -89.303 37.061
+                                        -89.309 37.027 -89.264 37.008 -89.262 36.999 -89.282 37.009
+                                        -89.311 37.049 -89.382 37.099 -89.379 37.137 -89.423 37.165
+                                        -89.441 37.224 -89.468 37.253 -89.465 37.256 -89.489 37.276
+                                        -89.513 37.304 -89.513 37.329 -89.501 37.339 -89.468 37.355
+                                        -89.435 37.411 -89.427 37.453 -89.453 37.491 -89.494 37.571
+                                        -89.524 37.615 -89.513 37.651 -89.519 37.679 -89.513 37.694
+                                        -89.521 37.706 -89.581 37.745 -89.666 37.783 -89.675 37.804
+                                        -89.691 37.841 -89.728 37.905 -89.851 37.905 -89.861 37.891
+                                        -89.866 37.875 -89.901 37.878 -89.937 37.911 -89.978 37.963
+                                        -89.958 37.969 -90.011 37.993 -90.041 38.032 -90.119 38.053
+                                        -90.134 38.088 -90.207 38.122 -90.254 38.166 -90.289 38.188
+                                        -90.336 38.234 -90.364 38.323 -90.369 38.365 -90.358 38.391
+                                        -90.339 38.427 -90.301 38.518 -90.265 38.532 -90.261 38.562
+                                        -90.241 38.611 -90.183 38.658 -90.183 38.701 -90.202 38.723
+                                        -90.196 38.773 -90.163 38.785 -90.135 38.801 -90.121 38.831
+                                        -90.113 38.853 -90.132 38.914 -90.243 38.924 -90.278 38.924
+                                        -90.319 38.962 -90.413 38.959 -90.469 38.891 -90.531 38.871
+                                        -90.571 38.881 -90.627 38.935 -90.668 39.037 -90.706 39.058
+                                        -90.707 39.093 -90.691 39.144 -90.716 39.195 -90.718 39.224
+                                        -90.732 39.247 -90.738 39.296 -90.779 39.351 -90.851 39.401
+                                        -90.947 39.444 -91.036 39.473 -91.064 39.528 -91.093 39.552
+                                        -91.156 39.601 -91.203 39.685 -91.317 39.724 -91.367 39.761
+                                        -91.373 39.803 -91.381 39.863 -91.449 39.885 -91.451 39.901
+                                        -91.434 39.921 -91.431 39.946 -91.447 40.005 -91.487 40.066
+                                        -91.504 40.134 -91.516 40.201 -91.506 40.251 -91.498 40.309
+                                        -91.486 40.371 -91.448 40.386 -91.418 40.392 -91.385 40.402
+                                        -91.372 40.447 -91.385 40.503 -91.374 40.528 -91.382 40.547
+                                        -91.412 40.572 -91.411 40.603 -91.375 40.639 -91.262 40.643
+                                        -91.214 40.656 -91.162 40.682 -91.129 40.705 -91.119 40.761
+                                        -91.092 40.833 -91.088 40.879 -91.049 40.923 -90.983 40.951
+                                        -90.961 41.071 -90.954 41.104 -90.957 41.144 -90.991 41.165
+                                        -91.018 41.176 -91.056 41.231 -91.101 41.267 -91.102 41.334
+                                        -91.073 41.401 -91.055 41.423 -91.027 41.431 -91.001 41.421
+                                        -90.949 41.444 -90.844 41.449 -90.779 41.451 -90.708 41.462
+                                        -90.658 41.509 -90.601 41.525 -90.541 41.527 -90.454 41.543
+                                        -90.434 41.567 -90.423 41.586 -90.348 41.602 -90.339 41.649
+                                        -90.341 41.722 -90.326 41.756 -90.304 41.781 -90.255 41.806
+                                        -90.195 41.931 -90.154 41.983 -90.142 42.033 -90.151 42.061
+                                        -90.168 42.103 -90.166 42.121 -90.176 42.122 -90.191 42.159
+                                        -90.231 42.197 -90.323 42.211 -90.367 42.242 -90.407 42.263
+                                        -90.417 42.341 -90.427 42.361 -90.441 42.388 -90.491 42.421
+                                        -90.563 42.461 -90.605 42.475 -90.648 42.494 -90.651 42.509
+                                        -90.638 42.508 -90.419 42.504 -89.923 42.503 -89.834 42.497
+                                        -89.401 42.497 -89.359 42.491 -88.939 42.491 -88.764 42.489
+                                        -88.706 42.491 -88.297 42.489 -88.194 42.489 -87.797 42.314
+                                        -87.836 42.156 -87.761 42.059 -87.671 41.847 -87.612 41.723
+                                        -87.529 41.469 -87.532 41.301 -87.532 41.173 -87.531 41.009
+                                        -87.532 40.745 -87.532 40.494 -87.537 40.483 -87.535 40.166
+                                        -87.535 39.887 -87.535 39.609 -87.535 39.477 -87.538 39.351
+                                        -87.541 39.338 -87.597 39.307 -87.625 39.297 -87.611 39.281
+                                        -87.615 39.258 -87.606 39.248 -87.584 39.208 -87.588 39.198
+                                        -87.594 39.196 -87.607 39.168 -87.644 39.146 -87.671 39.131
+                                        -87.659 39.113 -87.662 39.103 -87.631 39.088 -87.631 39.084
+                                        -87.612 39.062 -87.585 38.995 -87.581 38.994 -87.591 38.977
+                                        -87.547 38.963 -87.533 38.931 -87.531 38.904 -87.539 38.869
+                                        -87.559 38.857 -87.551 38.795 -87.507 38.776 -87.519 38.769
+                                        -87.508 38.736 -87.508 38.685 -87.543 38.672 -87.588 38.642
+                                        -87.625 38.622 -87.628 38.599 -87.619 38.593 -87.641 38.573
+                                        -87.652 38.547 -87.672 38.515 -87.651 38.501 -87.653 38.504
+                                        -87.679 38.481 -87.692 38.466 -87.756 38.457 -87.758 38.445
+                                        -87.738 38.417 -87.748 38.378 -87.784 38.352 -87.834 38.286
+                                        -87.851 38.285 -87.863 38.316 -87.874 38.315 -87.883 38.301
+                                        -87.888 38.281 -87.914 38.302 -87.913 38.304 -87.925 38.241
+                                        -87.981 38.234 -87.986 38.201 -87.977 38.171 -87.932 38.157
+                                        -87.931 38.136 -87.951 38.131 -87.973 38.103 -88.018 38.092
+                                        -88.012 38.096 -87.964 38.073 -87.975 38.054 -88.034 38.045
+                                        -88.043 38.038 -88.041 38.033 -88.021 38.008 -88.029 37.975
+                                        -88.021 37.956 -88.042 37.934 -88.041 37.929 -88.064 37.944
+                                        -88.078 37.923 -88.084 37.917 -88.031 37.905 -88.026 37.896
+                                        -88.044 37.906 -88.101 37.895 -88.101 37.867 -88.075 37.843
+                                        -88.034 37.827 -88.042 37.831 -88.089 37.817 -88.086 37.805
+                                        -88.035 37.735 -88.072 37.701 -88.133 37.661 -88.159 37.628
+                                        -88.157 37.583 -88.134 37.511 -88.071</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </topp:the_geom>
+            <topp:STATE_NAME>Illinois</topp:STATE_NAME>
+            <topp:STATE_FIPS>17</topp:STATE_FIPS>
+            <topp:SUB_REGION>E N Cen</topp:SUB_REGION>
+            <topp:STATE_ABBR>IL</topp:STATE_ABBR>
+            <topp:LAND_KM>143986.61</topp:LAND_KM>
+            <topp:WATER_KM>1993.335</topp:WATER_KM>
+            <topp:PERSONS>1.143E7</topp:PERSONS>
+            <topp:FAMILIES>2924880.0</topp:FAMILIES>
+            <topp:HOUSHOLD>4202240.0</topp:HOUSHOLD>
+            <topp:MALE>5552233.0</topp:MALE>
+            <topp:FEMALE>5878369.0</topp:FEMALE>
+            <topp:WORKERS>4199206.0</topp:WORKERS>
+            <topp:DRVALONE>3741715.0</topp:DRVALONE>
+            <topp:CARPOOL>652603.0</topp:CARPOOL>
+            <topp:PUBTRANS>538071.0</topp:PUBTRANS>
+            <topp:EMPLOYED>5417967.0</topp:EMPLOYED>
+            <topp:UNEMPLOY>385040.0</topp:UNEMPLOY>
+            <topp:SERVICE>1360159.0</topp:SERVICE>
+            <topp:MANUAL>828906.0</topp:MANUAL>
+            <topp:P_MALE>0.486</topp:P_MALE>
+            <topp:P_FEMALE>0.514</topp:P_FEMALE>
+            <topp:SAMP_POP>1747776.0</topp:SAMP_POP>
+        </topp:states>
+        <topp:states gml:id="states.2">
+            <gml:boundedBy>
+                <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:lowerCorner>38.788 -77.122</gml:lowerCorner>
+                    <gml:upperCorner>38.993 -76.911</gml:upperCorner>
+                </gml:Envelope>
+            </gml:boundedBy>
+            <topp:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>38.966 -77.008 38.889 -76.911 38.788 -77.045 38.813
+                                        -77.035 38.829 -77.045 38.838 -77.041 38.862 -77.039 38.886
+                                        -77.067 38.915 -77.078 38.932 -77.122 38.993 -77.042 38.966
+                                        -77.008</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </topp:the_geom>
+            <topp:STATE_NAME>District of Columbia</topp:STATE_NAME>
+            <topp:STATE_FIPS>11</topp:STATE_FIPS>
+            <topp:SUB_REGION>S Atl</topp:SUB_REGION>
+            <topp:STATE_ABBR>DC</topp:STATE_ABBR>
+            <topp:LAND_KM>159.055</topp:LAND_KM>
+            <topp:WATER_KM>17.991</topp:WATER_KM>
+            <topp:PERSONS>606900.0</topp:PERSONS>
+            <topp:FAMILIES>122087.0</topp:FAMILIES>
+            <topp:HOUSHOLD>249634.0</topp:HOUSHOLD>
+            <topp:MALE>282970.0</topp:MALE>
+            <topp:FEMALE>323930.0</topp:FEMALE>
+            <topp:WORKERS>229975.0</topp:WORKERS>
+            <topp:DRVALONE>106694.0</topp:DRVALONE>
+            <topp:CARPOOL>36621.0</topp:CARPOOL>
+            <topp:PUBTRANS>111422.0</topp:PUBTRANS>
+            <topp:EMPLOYED>303994.0</topp:EMPLOYED>
+            <topp:UNEMPLOY>23442.0</topp:UNEMPLOY>
+            <topp:SERVICE>65498.0</topp:SERVICE>
+            <topp:MANUAL>22407.0</topp:MANUAL>
+            <topp:P_MALE>0.466</topp:P_MALE>
+            <topp:P_FEMALE>0.534</topp:P_FEMALE>
+            <topp:SAMP_POP>72696.0</topp:SAMP_POP>
+        </topp:states>
+        <topp:states gml:id="states.3">
+            <gml:boundedBy>
+                <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:lowerCorner>38.449 -75.791</gml:lowerCorner>
+                    <gml:upperCorner>39.841 -75.045</gml:upperCorner>
+                </gml:Envelope>
+            </gml:boundedBy>
+            <topp:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>38.557 -75.707 38.649 -75.711 38.831 -75.724 39.141
+                                        -75.752 39.247 -75.761 39.295 -75.764 39.383 -75.772 39.723
+                                        -75.791 39.724 -75.775 39.774 -75.745 39.821 -75.695 39.838
+                                        -75.644 39.841 -75.583 39.826 -75.471 39.798 -75.421 39.789
+                                        -75.412 39.778 -75.428 39.763 -75.461 39.741 -75.475 39.719
+                                        -75.476 39.714 -75.489 39.612 -75.611 39.566 -75.562 39.463
+                                        -75.591 39.366 -75.515 39.257 -75.402 39.073 -75.397 39.012
+                                        -75.324 38.945 -75.307 38.808 -75.191 38.799 -75.083 38.449
+                                        -75.045 38.449 -75.068 38.451 -75.093 38.455 -75.351 38.463
+                                        -75.699 38.557 -75.707</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </topp:the_geom>
+            <topp:STATE_NAME>Delaware</topp:STATE_NAME>
+            <topp:STATE_FIPS>10</topp:STATE_FIPS>
+            <topp:SUB_REGION>S Atl</topp:SUB_REGION>
+            <topp:STATE_ABBR>DE</topp:STATE_ABBR>
+            <topp:LAND_KM>5062.456</topp:LAND_KM>
+            <topp:WATER_KM>1385.022</topp:WATER_KM>
+            <topp:PERSONS>666168.0</topp:PERSONS>
+            <topp:FAMILIES>175867.0</topp:FAMILIES>
+            <topp:HOUSHOLD>247497.0</topp:HOUSHOLD>
+            <topp:MALE>322968.0</topp:MALE>
+            <topp:FEMALE>343200.0</topp:FEMALE>
+            <topp:WORKERS>247566.0</topp:WORKERS>
+            <topp:DRVALONE>258087.0</topp:DRVALONE>
+            <topp:CARPOOL>42968.0</topp:CARPOOL>
+            <topp:PUBTRANS>8069.0</topp:PUBTRANS>
+            <topp:EMPLOYED>335147.0</topp:EMPLOYED>
+            <topp:UNEMPLOY>13945.0</topp:UNEMPLOY>
+            <topp:SERVICE>87973.0</topp:SERVICE>
+            <topp:MANUAL>44140.0</topp:MANUAL>
+            <topp:P_MALE>0.485</topp:P_MALE>
+            <topp:P_FEMALE>0.515</topp:P_FEMALE>
+            <topp:SAMP_POP>102776.0</topp:SAMP_POP>
+        </topp:states>
+    </gml:featureMembers>
+</wfs:FeatureCollection>
diff --git a/test/spec/ol/format/gmlformat.test.js b/test/spec/ol/format/gmlformat.test.js
new file mode 100644
index 0000000..2ec050b
--- /dev/null
+++ b/test/spec/ol/format/gmlformat.test.js
@@ -0,0 +1,1106 @@
+goog.provide('ol.test.format.GML');
+
+var readGeometry = function(format, text, opt_options) {
+  var doc = ol.xml.parse(text);
+  // we need an intermediate node for testing purposes
+  var node = goog.dom.createElement(goog.dom.TagName.PRE);
+  node.appendChild(doc.documentElement);
+  return format.readGeometryFromNode(node, opt_options);
+};
+
+describe('ol.format.GML2', function() {
+
+  var format, formatWGS84, formatNoSrs;
+  beforeEach(function() {
+    format = new ol.format.GML2({srsName: 'CRS:84'});
+    formatWGS84 = new ol.format.GML2({
+      srsName: 'urn:x-ogc:def:crs:EPSG:4326'
+    });
+    formatNoSrs = new ol.format.GML2();
+  });
+
+
+  describe('#readGeometry', function() {
+
+    describe('gml 2.1.2', function() {
+
+      it('can read a point geometry', function() {
+        var text = '<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+            '  <gml:coordinates>-90,-180</gml:coordinates>' +
+            '</gml:Point>';
+
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([-180, -90, 0]);
+      });
+
+      it('can read a box element', function() {
+        var text = '<gml:Box xmlns:gml="http://www.opengis.net/gml" ' +
+            'srsName="EPSG:4326">' +
+            '  <gml:coordinates>-0.768746,47.003018 ' +
+            '    3.002191,47.925567</gml:coordinates>' +
+            '</gml:Box>';
+
+        var g = readGeometry(format, text);
+        expect(g).to.eql([47.003018, -0.768746, 47.925567, 3.002191]);
+      });
+
+      it('can read a multipolygon with gml:coordinates', function() {
+
+        var text =
+            '<gml:MultiPolygon xmlns:gml="http://www.opengis.net/gml" ' +
+            '        srsName="EPSG:4326">' +
+            '  <gml:polygonMember>' +
+            '    <gml:Polygon>' +
+            '      <gml:outerBoundaryIs>' +
+            '        <gml:LinearRing>' +
+            '          <gml:coordinates>-0.318987,47.003018 ' +
+            '             -0.768746,47.358268 ' +
+            '             -0.574463,47.684285 -0.347374,47.854602 ' +
+            '             -0.006740,47.925567 ' +
+            '             0.135191,47.726864 0.149384,47.599127 0.419052,' +
+            '             47.670092 0.532597,47.428810 ' +
+            '             0.305508,47.443003 0.475824,47.144948 0.064225,' +
+            '             47.201721 ' +
+            '             -0.318987,47.003018 </gml:coordinates>' +
+            '        </gml:LinearRing>' +
+            '      </gml:outerBoundaryIs>' +
+            '      <gml:innerBoundaryIs>' +
+            '        <gml:LinearRing>' +
+            '          <gml:coordinates>-0.035126,47.485582 -0.035126,' +
+            '             47.485582 ' +
+            '             -0.049319,47.641706 -0.233829,47.655899 ' +
+            '             -0.375760,47.457196 ' +
+            '             -0.276408,47.286879 -0.035126,47.485582 ' +
+            '          </gml:coordinates>' +
+            '        </gml:LinearRing>' +
+            '      </gml:innerBoundaryIs>' +
+            '    </gml:Polygon>' +
+            '  </gml:polygonMember>' +
+            '</gml:MultiPolygon>';
+
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiPolygon);
+        expect(g.getCoordinates()).to.eql([
+          [
+            [
+              [47.003018, -0.318987, 0], [47.358268, -0.768746, 0],
+              [47.684285, -0.574463, 0], [47.854602, -0.347374, 0],
+              [47.925567, -0.00674, 0], [47.726864, 0.135191, 0],
+              [47.599127, 0.149384, 0], [47.670092, 0.419052, 0],
+              [47.42881, 0.532597, 0], [47.443003, 0.305508, 0],
+              [47.144948, 0.475824, 0], [47.201721, 0.064225, 0],
+              [47.003018, -0.318987, 0]
+            ],
+            [
+              [47.485582, -0.035126, 0], [47.485582, -0.035126, 0],
+              [47.641706, -0.049319, 0], [47.655899, -0.233829, 0],
+              [47.457196, -0.37576, 0], [47.286879, -0.276408, 0],
+              [47.485582, -0.035126, 0]
+            ]
+          ]
+        ]);
+      });
+    });
+  });
+});
+
+describe('ol.format.GML3', function() {
+
+  var format, formatWGS84, formatNoSrs;
+  beforeEach(function() {
+    format = new ol.format.GML({srsName: 'CRS:84'});
+    formatWGS84 = new ol.format.GML({
+      srsName: 'urn:x-ogc:def:crs:EPSG:4326'
+    });
+    formatNoSrs = new ol.format.GML();
+  });
+
+  describe('#readGeometry', function() {
+
+    describe('point', function() {
+
+      it('can read and write a point geometry', function() {
+        var text =
+            '<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:pos>1 2</gml:pos>' +
+            '</gml:Point>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([1, 2, 0]);
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read a point geometry with scientific notation', function() {
+        var text =
+            '<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:pos>1E7 2</gml:pos>' +
+            '</gml:Point>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([10000000, 2, 0]);
+        text =
+            '<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:pos>1e7 2</gml:pos>' +
+            '</gml:Point>';
+        g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([10000000, 2, 0]);
+      });
+
+      it('can read, transform and write a point geometry', function() {
+        var config = {
+          featureProjection: 'EPSG:3857'
+        };
+        var text =
+            '<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:pos>1 2</gml:pos>' +
+            '</gml:Point>';
+        var g = readGeometry(format, text, config);
+        expect(g).to.be.an(ol.geom.Point);
+        var coordinates = g.getCoordinates();
+        expect(coordinates.splice(0, 2)).to.eql(
+            ol.proj.transform([1, 2], 'CRS:84', 'EPSG:3857'));
+        config.dataProjection = 'CRS:84';
+        var serialized = format.writeGeometryNode(g, config);
+        var pos = serialized.firstElementChild.firstElementChild.textContent;
+        var coordinate = pos.split(' ');
+        expect(coordinate[0]).to.roughlyEqual(1, 1e-9);
+        expect(coordinate[1]).to.roughlyEqual(2, 1e-9);
+      });
+
+      it('can detect SRS, read and transform a point geometry', function() {
+        var config = {
+          featureProjection: 'EPSG:3857'
+        };
+        var text =
+            '<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:pos>1 2</gml:pos>' +
+            '</gml:Point>';
+        var g = readGeometry(formatNoSrs, text, config);
+        expect(g).to.be.an(ol.geom.Point);
+        var coordinates = g.getCoordinates();
+        expect(coordinates.splice(0, 2)).to.eql(
+            ol.proj.transform([1, 2], 'CRS:84', 'EPSG:3857'));
+      });
+
+      it('can read and write a point geometry in EPSG:4326', function() {
+        var text =
+            '<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+            '  <gml:pos>2 1</gml:pos>' +
+            '</gml:Point>';
+        var g = readGeometry(formatWGS84, text);
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([1, 2, 0]);
+        var serialized = formatWGS84.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('linestring', function() {
+
+      it('can read and write a linestring geometry', function() {
+        var text =
+            '<gml:LineString xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:posList>1 2 3 4</gml:posList>' +
+            '</gml:LineString>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.LineString);
+        expect(g.getCoordinates()).to.eql([[1, 2, 0], [3, 4, 0]]);
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read, transform and write a linestring geometry', function() {
+        var config = {
+          dataProjection: 'CRS:84',
+          featureProjection: 'EPSG:3857'
+        };
+        var text =
+            '<gml:LineString xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:posList>1 2 3 4</gml:posList>' +
+            '</gml:LineString>';
+        var g = readGeometry(format, text, config);
+        expect(g).to.be.an(ol.geom.LineString);
+        var coordinates = g.getCoordinates();
+        expect(coordinates[0].slice(0, 2)).to.eql(
+            ol.proj.transform([1, 2], 'CRS:84', 'EPSG:3857'));
+        expect(coordinates[1].slice(0, 2)).to.eql(
+            ol.proj.transform([3, 4], 'CRS:84', 'EPSG:3857'));
+        var serialized = format.writeGeometryNode(g, config);
+        var poss = serialized.firstElementChild.firstElementChild.textContent;
+        var coordinate = poss.split(' ');
+        expect(coordinate[0]).to.roughlyEqual(1, 1e-9);
+        expect(coordinate[1]).to.roughlyEqual(2, 1e-9);
+        expect(coordinate[2]).to.roughlyEqual(3, 1e-9);
+        expect(coordinate[3]).to.roughlyEqual(4, 1e-9);
+      });
+
+      it('can read and write a linestring geometry in EPSG:4326', function() {
+        var text =
+            '<gml:LineString xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+            '  <gml:posList>2 1 4 3</gml:posList>' +
+            '</gml:LineString>';
+        var g = readGeometry(formatWGS84, text);
+        expect(g).to.be.an(ol.geom.LineString);
+        expect(g.getCoordinates()).to.eql([[1, 2, 0], [3, 4, 0]]);
+        var serialized = formatWGS84.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('axis order', function() {
+
+      it('can read and write a linestring geometry with ' +
+          'correct axis order', function() {
+            var text =
+                '<gml:LineString xmlns:gml="http://www.opengis.net/gml" ' +
+                '    srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+                '  <gml:posList>-90 -180 90 180</gml:posList>' +
+                '</gml:LineString>';
+            var g = readGeometry(format, text);
+            expect(g).to.be.an(ol.geom.LineString);
+            expect(g.getCoordinates()).to.eql([[-180, -90, 0], [180, 90, 0]]);
+            var serialized = formatWGS84.writeGeometryNode(g);
+            expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+          });
+
+      it('can read and write a point geometry with correct axis order',
+          function() {
+            var text =
+                '<gml:Point xmlns:gml="http://www.opengis.net/gml" ' +
+                '    srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+                '  <gml:pos>-90 -180</gml:pos>' +
+                '</gml:Point>';
+            var g = readGeometry(format, text);
+            expect(g).to.be.an(ol.geom.Point);
+            expect(g.getCoordinates()).to.eql([-180, -90, 0]);
+            var serialized = formatWGS84.writeGeometryNode(g);
+            expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+          });
+
+      it('can read and write a surface geometry with right axis order',
+          function() {
+            var text =
+                '<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" ' +
+                '    srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+                '  <gml:surfaceMember>' +
+                '    <gml:Polygon srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+                '      <gml:exterior>' +
+                '        <gml:LinearRing srsName=' +
+                '          "urn:x-ogc:def:crs:EPSG:4326">' +
+                '          <gml:posList>38.9661 -77.0081 38.9931 -77.0421 ' +
+                '          38.9321 -77.1221 38.9151 -77.0781 38.8861 ' +
+                '          -77.0671 38.8621 -77.0391 38.8381 -77.0401 ' +
+                '          38.8291 -77.0451 38.8131 -77.0351 38.7881 ' +
+                '          -77.0451 38.8891 -76.9111 38.9661 -77.0081' +
+                '          </gml:posList>' +
+                '        </gml:LinearRing>' +
+                '      </gml:exterior>' +
+                '    </gml:Polygon>' +
+                '  </gml:surfaceMember>' +
+                '</gml:MultiSurface>';
+            var g = readGeometry(format, text);
+            expect(g.getCoordinates()[0][0][0][0]).to.equal(-77.0081);
+            expect(g.getCoordinates()[0][0][0][1]).to.equal(38.9661);
+            format = new ol.format.GML({
+              srsName: 'urn:x-ogc:def:crs:EPSG:4326',
+              surface: false});
+            var serialized = format.writeGeometryNode(g);
+            expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+          });
+
+    });
+
+    describe('linestring 3D', function() {
+
+      it('can read a linestring 3D geometry', function() {
+        var text =
+            '<gml:LineString xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84" srsDimension="3">' +
+            '  <gml:posList>1 2 3 4 5 6</gml:posList>' +
+            '</gml:LineString>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.LineString);
+        expect(g.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
+      });
+
+    });
+
+    describe('linearring', function() {
+
+      it('can read and write a linearring geometry', function() {
+        var text =
+            '<gml:LinearRing xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:posList>1 2 3 4 5 6 1 2</gml:posList>' +
+            '</gml:LinearRing>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.LinearRing);
+        expect(g.getCoordinates()).to.eql(
+            [[1, 2, 0], [3, 4, 0], [5, 6, 0], [1, 2, 0]]);
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('polygon', function() {
+
+      it('can read and write a polygon geometry', function() {
+        var text =
+            '<gml:Polygon xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:exterior>' +
+            '    <gml:LinearRing srsName="CRS:84">' +
+            '      <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '    </gml:LinearRing>' +
+            '  </gml:exterior>' +
+            '  <gml:interior>' +
+            '    <gml:LinearRing srsName="CRS:84">' +
+            '      <gml:posList>2 3 2 5 4 5 2 3</gml:posList>' +
+            '    </gml:LinearRing>' +
+            '  </gml:interior>' +
+            '  <gml:interior>' +
+            '    <gml:LinearRing srsName="CRS:84">' +
+            '      <gml:posList>3 4 3 6 5 6 3 4</gml:posList>' +
+            '    </gml:LinearRing>' +
+            '  </gml:interior>' +
+            '</gml:Polygon>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.Polygon);
+        expect(g.getCoordinates()).to.eql([[[1, 2, 0], [3, 2, 0], [3, 4, 0],
+                [1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
+              [[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]]);
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('surface', function() {
+
+      it('can read and write a surface geometry', function() {
+        var text =
+            '<gml:Surface xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:patches>' +
+            '    <gml:PolygonPatch>' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>2 3 2 5 4 5 2 3</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>3 4 3 6 5 6 3 4</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '    </gml:PolygonPatch>' +
+            '  </gml:patches>' +
+            '</gml:Surface>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.Polygon);
+        expect(g.getCoordinates()).to.eql([[[1, 2, 0], [3, 2, 0], [3, 4, 0],
+                [1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
+              [[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]]);
+        format = new ol.format.GML({srsName: 'CRS:84', surface: true});
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('curve', function() {
+
+      it('can read and write a curve geometry', function() {
+        var text =
+            '<gml:Curve xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:segments>' +
+            '    <gml:LineStringSegment>' +
+            '      <gml:posList>1 2 3 4</gml:posList>' +
+            '    </gml:LineStringSegment>' +
+            '  </gml:segments>' +
+            '</gml:Curve>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.LineString);
+        expect(g.getCoordinates()).to.eql([[1, 2, 0], [3, 4, 0]]);
+        format = new ol.format.GML({srsName: 'CRS:84', curve: true});
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('envelope', function() {
+
+      it('can read an envelope geometry', function() {
+        var text =
+            '<gml:Envelope xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:lowerCorner>1 2</gml:lowerCorner>' +
+            '  <gml:upperCorner>3 4</gml:upperCorner>' +
+            '</gml:Envelope>';
+        var g = readGeometry(format, text);
+        expect(g).to.eql([1, 2, 3, 4]);
+      });
+
+    });
+
+    describe('multipoint', function() {
+
+      it('can read and write a singular multipoint geometry', function() {
+        var text =
+            '<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:pointMember>' +
+            '    <gml:Point srsName="CRS:84">' +
+            '      <gml:pos>1 2</gml:pos>' +
+            '    </gml:Point>' +
+            '  </gml:pointMember>' +
+            '  <gml:pointMember>' +
+            '    <gml:Point srsName="CRS:84">' +
+            '      <gml:pos>2 3</gml:pos>' +
+            '    </gml:Point>' +
+            '  </gml:pointMember>' +
+            '  <gml:pointMember>' +
+            '    <gml:Point srsName="CRS:84">' +
+            '      <gml:pos>3 4</gml:pos>' +
+            '    </gml:Point>' +
+            '  </gml:pointMember>' +
+            '</gml:MultiPoint>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiPoint);
+        expect(g.getCoordinates()).to.eql([[1, 2, 0], [2, 3, 0], [3, 4, 0]]);
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read a plural multipoint geometry', function() {
+        var text =
+            '<gml:MultiPoint xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:pointMembers>' +
+            '    <gml:Point>' +
+            '      <gml:pos>1 2</gml:pos>' +
+            '    </gml:Point>' +
+            '    <gml:Point>' +
+            '      <gml:pos>2 3</gml:pos>' +
+            '    </gml:Point>' +
+            '    <gml:Point>' +
+            '      <gml:pos>3 4</gml:pos>' +
+            '    </gml:Point>' +
+            '  </gml:pointMembers>' +
+            '</gml:MultiPoint>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiPoint);
+        expect(g.getCoordinates()).to.eql([[1, 2, 0], [2, 3, 0], [3, 4, 0]]);
+      });
+
+    });
+
+    describe('multilinestring', function() {
+
+      it('can read and write a singular multilinestring geometry', function() {
+        var text =
+            '<gml:MultiLineString xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:lineStringMember>' +
+            '    <gml:LineString srsName="CRS:84">' +
+            '      <gml:posList>1 2 2 3</gml:posList>' +
+            '    </gml:LineString>' +
+            '  </gml:lineStringMember>' +
+            '  <gml:lineStringMember>' +
+            '    <gml:LineString srsName="CRS:84">' +
+            '      <gml:posList>3 4 4 5</gml:posList>' +
+            '    </gml:LineString>' +
+            '  </gml:lineStringMember>' +
+            '</gml:MultiLineString>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        expect(g.getCoordinates()).to.eql(
+            [[[1, 2, 0], [2, 3, 0]], [[3, 4, 0], [4, 5, 0]]]);
+        format = new ol.format.GML({srsName: 'CRS:84', multiCurve: false});
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read a plural multilinestring geometry', function() {
+        var text =
+            '<gml:MultiLineString xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:lineStringMembers>' +
+            '    <gml:LineString>' +
+            '      <gml:posList>1 2 2 3</gml:posList>' +
+            '    </gml:LineString>' +
+            '    <gml:LineString>' +
+            '      <gml:posList>3 4 4 5</gml:posList>' +
+            '    </gml:LineString>' +
+            '  </gml:lineStringMembers>' +
+            '</gml:MultiLineString>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        expect(g.getCoordinates()).to.eql(
+            [[[1, 2, 0], [2, 3, 0]], [[3, 4, 0], [4, 5, 0]]]);
+      });
+
+    });
+
+    describe('multipolygon', function() {
+
+      it('can read and write a singular multipolygon geometry', function() {
+        var text =
+            '<gml:MultiPolygon xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:polygonMember>' +
+            '    <gml:Polygon srsName="CRS:84">' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>2 3 2 5 4 5 2 3</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>3 4 3 6 5 6 3 4</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '    </gml:Polygon>' +
+            '  </gml:polygonMember>' +
+            '  <gml:polygonMember>' +
+            '    <gml:Polygon srsName="CRS:84">' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '    </gml:Polygon>' +
+            '  </gml:polygonMember>' +
+            '</gml:MultiPolygon>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiPolygon);
+        expect(g.getCoordinates()).to.eql([
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0],
+            [1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
+            [[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]],
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0], [1, 2, 0]]]]);
+        format = new ol.format.GML({srsName: 'CRS:84', multiSurface: false});
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read a plural multipolygon geometry', function() {
+        var text =
+            '<gml:MultiPolygon xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:polygonMembers>' +
+            '    <gml:Polygon>' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing>' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing>' +
+            '          <gml:posList>2 3 2 5 4 5 2 3</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing>' +
+            '          <gml:posList>3 4 3 6 5 6 3 4</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '    </gml:Polygon>' +
+            '    <gml:Polygon>' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing>' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '    </gml:Polygon>' +
+            '  </gml:polygonMembers>' +
+            '</gml:MultiPolygon>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiPolygon);
+        expect(g.getCoordinates()).to.eql([
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0],
+            [1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
+            [[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]],
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0], [1, 2, 0]]]]);
+      });
+
+    });
+
+    describe('multicurve', function() {
+
+      it('can read and write a singular multicurve-linestring geometry',
+          function() {
+            var text =
+                '<gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" ' +
+                '    srsName="CRS:84">' +
+                '  <gml:curveMember>' +
+                '    <gml:LineString srsName="CRS:84">' +
+                '      <gml:posList>1 2 2 3</gml:posList>' +
+                '    </gml:LineString>' +
+                '  </gml:curveMember>' +
+                '  <gml:curveMember>' +
+                '    <gml:LineString srsName="CRS:84">' +
+                '      <gml:posList>3 4 4 5</gml:posList>' +
+                '    </gml:LineString>' +
+                '  </gml:curveMember>' +
+                '</gml:MultiCurve>';
+            var g = readGeometry(format, text);
+            expect(g).to.be.an(ol.geom.MultiLineString);
+            expect(g.getCoordinates()).to.eql(
+                [[[1, 2, 0], [2, 3, 0]], [[3, 4, 0], [4, 5, 0]]]);
+            var serialized = format.writeGeometryNode(g);
+            expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+          });
+
+      it('can read and write a singular multicurve-curve geometry', function() {
+        var text =
+            '<gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:curveMember>' +
+            '    <gml:Curve srsName="CRS:84">' +
+            '      <gml:segments>' +
+            '        <gml:LineStringSegment>' +
+            '          <gml:posList>1 2 2 3</gml:posList>' +
+            '        </gml:LineStringSegment>' +
+            '      </gml:segments>' +
+            '    </gml:Curve>' +
+            '  </gml:curveMember>' +
+            '  <gml:curveMember>' +
+            '    <gml:Curve srsName="CRS:84">' +
+            '      <gml:segments>' +
+            '        <gml:LineStringSegment>' +
+            '          <gml:posList>3 4 4 5</gml:posList>' +
+            '        </gml:LineStringSegment>' +
+            '      </gml:segments>' +
+            '    </gml:Curve>' +
+            '  </gml:curveMember>' +
+            '</gml:MultiCurve>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        expect(g.getCoordinates()).to.eql(
+            [[[1, 2, 0], [2, 3, 0]], [[3, 4, 0], [4, 5, 0]]]);
+        format = new ol.format.GML({srsName: 'CRS:84', curve: true});
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('multisurface', function() {
+
+      it('can read and write a singular multisurface geometry', function() {
+        var text =
+            '<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:surfaceMember>' +
+            '    <gml:Polygon srsName="CRS:84">' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>2 3 2 5 4 5 2 3</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>3 4 3 6 5 6 3 4</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '    </gml:Polygon>' +
+            '  </gml:surfaceMember>' +
+            '  <gml:surfaceMember>' +
+            '    <gml:Polygon srsName="CRS:84">' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing srsName="CRS:84">' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '    </gml:Polygon>' +
+            '  </gml:surfaceMember>' +
+            '</gml:MultiSurface>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiPolygon);
+        expect(g.getCoordinates()).to.eql([
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0],
+            [1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
+            [[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]],
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0], [1, 2, 0]]]]);
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read a plural multisurface geometry', function() {
+        var text =
+            '<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:surfaceMembers>' +
+            '    <gml:Polygon>' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing>' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing>' +
+            '          <gml:posList>2 3 2 5 4 5 2 3</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '      <gml:interior>' +
+            '        <gml:LinearRing>' +
+            '          <gml:posList>3 4 3 6 5 6 3 4</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:interior>' +
+            '    </gml:Polygon>' +
+            '  </gml:surfaceMembers>' +
+            '  <gml:surfaceMembers>' +
+            '    <gml:Polygon>' +
+            '      <gml:exterior>' +
+            '        <gml:LinearRing>' +
+            '          <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '        </gml:LinearRing>' +
+            '      </gml:exterior>' +
+            '    </gml:Polygon>' +
+            '  </gml:surfaceMembers>' +
+            '</gml:MultiSurface>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiPolygon);
+        expect(g.getCoordinates()).to.eql([
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0],
+            [1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
+            [[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]],
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0], [1, 2, 0]]]]);
+      });
+
+      it('can read and write a multisurface-surface geometry', function() {
+        var text =
+            '<gml:MultiSurface xmlns:gml="http://www.opengis.net/gml" ' +
+            '    srsName="CRS:84">' +
+            '  <gml:surfaceMember>' +
+            '    <gml:Surface srsName="CRS:84">' +
+            '      <gml:patches>' +
+            '        <gml:PolygonPatch>' +
+            '          <gml:exterior>' +
+            '            <gml:LinearRing srsName="CRS:84">' +
+            '              <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '            </gml:LinearRing>' +
+            '          </gml:exterior>' +
+            '          <gml:interior>' +
+            '            <gml:LinearRing srsName="CRS:84">' +
+            '              <gml:posList>2 3 2 5 4 5 2 3</gml:posList>' +
+            '            </gml:LinearRing>' +
+            '          </gml:interior>' +
+            '          <gml:interior>' +
+            '            <gml:LinearRing srsName="CRS:84">' +
+            '              <gml:posList>3 4 3 6 5 6 3 4</gml:posList>' +
+            '            </gml:LinearRing>' +
+            '          </gml:interior>' +
+            '        </gml:PolygonPatch>' +
+            '      </gml:patches>' +
+            '    </gml:Surface>' +
+            '  </gml:surfaceMember>' +
+            '  <gml:surfaceMember>' +
+            '    <gml:Surface srsName="CRS:84">' +
+            '      <gml:patches>' +
+            '        <gml:PolygonPatch>' +
+            '          <gml:exterior>' +
+            '            <gml:LinearRing srsName="CRS:84">' +
+            '              <gml:posList>1 2 3 2 3 4 1 2</gml:posList>' +
+            '            </gml:LinearRing>' +
+            '          </gml:exterior>' +
+            '        </gml:PolygonPatch>' +
+            '      </gml:patches>' +
+            '    </gml:Surface>' +
+            '  </gml:surfaceMember>' +
+            '</gml:MultiSurface>';
+        var g = readGeometry(format, text);
+        expect(g).to.be.an(ol.geom.MultiPolygon);
+        expect(g.getCoordinates()).to.eql([
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0],
+            [1, 2, 0]], [[2, 3, 0], [2, 5, 0], [4, 5, 0], [2, 3, 0]],
+            [[3, 4, 0], [3, 6, 0], [5, 6, 0], [3, 4, 0]]],
+          [[[1, 2, 0], [3, 2, 0], [3, 4, 0], [1, 2, 0]]]]);
+        format = new ol.format.GML({srsName: 'CRS:84', surface: true});
+        var serialized = format.writeGeometryNode(g);
+        expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+  });
+
+  describe('when parsing empty attribute', function() {
+    it('generates undefined value', function() {
+      var text =
+          '<gml:featureMembers xmlns:gml="http://www.opengis.net/gml">' +
+          '  <topp:gnis_pop gml:id="gnis_pop.148604" xmlns:topp="' +
+          'http://www.openplans.org/topp">' +
+          '    <gml:name>Aflu</gml:name>' +
+          '    <topp:the_geom>' +
+          '      <gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+          '        <gml:pos>34.12 2.09</gml:pos>' +
+          '      </gml:Point>' +
+          '    </topp:the_geom>' +
+          '    <topp:population>84683</topp:population>' +
+          '    <topp:country>Algeria</topp:country>' +
+          '    <topp:type>place</topp:type>' +
+          '    <topp:name>Aflu</topp:name>' +
+          '    <topp:empty></topp:empty>' +
+          '  </topp:gnis_pop>' +
+          '</gml:featureMembers>';
+      var config = {
+        'featureNS': 'http://www.openplans.org/topp',
+        'featureType': 'gnis_pop'
+      };
+      var features = new ol.format.GML(config).readFeatures(text);
+      var feature = features[0];
+      expect(feature.get('empty')).to.be(undefined);
+    });
+  });
+
+  describe('when parsing TOPP states WFS with autoconfigure', function() {
+    var features, text, gmlFormat;
+    before(function(done) {
+      afterLoadText('spec/ol/format/gml/topp-states-wfs.xml', function(xml) {
+        try {
+          text = xml;
+          gmlFormat = new ol.format.GML();
+          features = gmlFormat.readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates 3 features', function() {
+      expect(features).to.have.length(3);
+    });
+
+    it('creates the right id for the feature', function() {
+      expect(features[0].getId()).to.equal('states.1');
+    });
+
+    it('can reuse the parser for a different featureNS', function() {
+      var text =
+          '<gml:featureMembers xmlns:gml="http://www.opengis.net/gml">' +
+          '  <foo:gnis_pop gml:id="gnis_pop.148604" xmlns:foo="' +
+          'http://foo">' +
+          '    <gml:name>Aflu</gml:name>' +
+          '    <foo:the_geom>' +
+          '      <gml:Point srsName="urn:x-ogc:def:crs:EPSG:4326">' +
+          '        <gml:pos>34.12 2.09</gml:pos>' +
+          '      </gml:Point>' +
+          '    </foo:the_geom>' +
+          '    <foo:population>84683</foo:population>' +
+          '  </foo:gnis_pop>' +
+          '</gml:featureMembers>';
+      features = gmlFormat.readFeatures(text);
+      expect(features).to.have.length(1);
+      expect(features[0].get('population')).to.equal('84683');
+    });
+
+    it('can read an empty collection', function() {
+      var text =
+          '<gml:featureMembers xmlns:gml="http://www.opengis.net/gml">' +
+          '</gml:featureMembers>';
+      features = gmlFormat.readFeatures(text);
+      expect(features).to.have.length(0);
+    });
+
+  });
+
+  describe('when parsing TOPP states GML', function() {
+
+    var features, text, gmlFormat;
+    before(function(done) {
+      afterLoadText('spec/ol/format/gml/topp-states-gml.xml', function(xml) {
+        try {
+          var schemaLoc = 'http://www.openplans.org/topp ' +
+              'http://demo.opengeo.org/geoserver/wfs?service=WFS&version=' +
+              '1.1.0&request=DescribeFeatureType&typeName=topp:states ' +
+              'http://www.opengis.net/gml ' +
+              'http://schemas.opengis.net/gml/3.2.1/gml.xsd';
+          var config = {
+            'featureNS': 'http://www.openplans.org/topp',
+            'featureType': 'states',
+            'multiSurface': true,
+            'srsName': 'urn:x-ogc:def:crs:EPSG:4326',
+            'schemaLocation': schemaLoc
+          };
+          text = xml;
+          gmlFormat = new ol.format.GML(config);
+          features = gmlFormat.readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates 10 features', function() {
+      expect(features).to.have.length(10);
+    });
+
+    it('creates the right id for the feature', function() {
+      expect(features[0].getId()).to.equal('states.1');
+    });
+
+    it('writes back features as GML', function() {
+      this.timeout(4000);
+      var serialized = gmlFormat.writeFeaturesNode(features);
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+
+  });
+
+  describe('when parsing TOPP states GML from WFS', function() {
+
+    var features, feature;
+    before(function(done) {
+      afterLoadText('spec/ol/format/gml/topp-states-wfs.xml', function(xml) {
+        try {
+          var config = {
+            'featureNS': 'http://www.openplans.org/topp',
+            'featureType': 'states'
+          };
+          features = new ol.format.GML(config).readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates 3 features', function() {
+      expect(features).to.have.length(3);
+    });
+
+    it('creates a polygon for Illinois', function() {
+      feature = features[0];
+      expect(feature.getId()).to.equal('states.1');
+      expect(feature.get('STATE_NAME')).to.equal('Illinois');
+      expect(feature.getGeometry()).to.be.an(ol.geom.MultiPolygon);
+    });
+
+  });
+
+  describe('when parsing more than one geometry', function() {
+
+    var features;
+    before(function(done) {
+      afterLoadText('spec/ol/format/gml/more-geoms.xml', function(xml) {
+        try {
+          var config = {
+            'featureNS': 'http://opengeo.org/#medford',
+            'featureType': 'zoning'
+          };
+          features = new ol.format.GML(config).readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates 2 geometries', function() {
+      var feature = features[0];
+      expect(feature.get('center')).to.be.a(ol.geom.Point);
+      expect(feature.get('the_geom')).to.be.a(ol.geom.MultiPolygon);
+    });
+
+  });
+
+  describe('when parsing an attribute name equal to featureType', function() {
+
+    var features;
+    before(function(done) {
+      afterLoadText('spec/ol/format/gml/repeated-name.xml', function(xml) {
+        try {
+          var config = {
+            'featureNS': 'http://opengeo.org/#medford',
+            'featureType': 'zoning'
+          };
+          features = new ol.format.GML(config).readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates the correct attribute value', function() {
+      var feature = features[0];
+      expect(feature.get('zoning')).to.equal('I-L');
+    });
+
+  });
+
+  describe('when parsing only a boundedBy element and no geometry', function() {
+
+    var features;
+    before(function(done) {
+      afterLoadText('spec/ol/format/gml/only-boundedby.xml', function(xml) {
+        try {
+          features = new ol.format.GML().readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates a feature without a geometry', function() {
+      var feature = features[0];
+      expect(feature.getGeometry()).to.be(undefined);
+    });
+
+  });
+
+});
+
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('ol.format.GML');
+goog.require('ol.format.GML2');
+goog.require('ol.format.GML3');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.LinearRing');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.xml');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.proj');
diff --git a/test/spec/ol/format/gpxformat.test.js b/test/spec/ol/format/gpxformat.test.js
new file mode 100644
index 0000000..8f1483f
--- /dev/null
+++ b/test/spec/ol/format/gpxformat.test.js
@@ -0,0 +1,561 @@
+goog.provide('ol.test.format.GPX');
+
+describe('ol.format.GPX', function() {
+
+  var format;
+  beforeEach(function() {
+    format = new ol.format.GPX();
+  });
+
+  describe('readFeatures', function() {
+
+    describe('rte', function() {
+
+      it('can read an empty rte', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <rte/>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.LineString);
+        expect(g.getCoordinates()).to.eql([]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+      });
+
+      it('can read and write various rte attributes', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <rte>' +
+            '    <name>Name</name>' +
+            '    <cmt>Comment</cmt>' +
+            '    <desc>Description</desc>' +
+            '    <src>Source</src>' +
+            '    <link href="http://example.com/">' +
+            '      <text>Link text</text>' +
+            '      <type>Link type</type>' +
+            '    </link>' +
+            '    <number>1</number>' +
+            '    <type>Type</type>' +
+            '  </rte>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('name')).to.be('Name');
+        expect(f.get('cmt')).to.be('Comment');
+        expect(f.get('desc')).to.be('Description');
+        expect(f.get('src')).to.be('Source');
+        expect(f.get('link')).to.be('http://example.com/');
+        expect(f.get('linkText')).to.be('Link text');
+        expect(f.get('linkType')).to.be('Link type');
+        expect(f.get('number')).to.be(1);
+        expect(f.get('type')).to.be('Type');
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read and write a rte with multiple rtepts', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <rte>' +
+            '    <rtept lat="1" lon="2"/>' +
+            '    <rtept lat="3" lon="4"/>' +
+            '  </rte>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.LineString);
+        expect(g.getCoordinates()).to.eql([[2, 1, 0, 0], [4, 3, 0, 0]]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can transform, read and write a rte', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <rte>' +
+            '    <rtept lat="1" lon="2"/>' +
+            '    <rtept lat="5" lon="6"/>' +
+            '  </rte>' +
+            '</gpx>';
+        var fs = format.readFeatures(text, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.LineString);
+        var p1 = ol.proj.transform([2, 1], 'EPSG:4326', 'EPSG:3857');
+        p1.push(0, 0);
+        var p2 = ol.proj.transform([6, 5], 'EPSG:4326', 'EPSG:3857');
+        p2.push(0, 0);
+        expect(g.getCoordinates()).to.eql([p1, p2]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('trk', function() {
+
+      it('can read an empty trk', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <trk/>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        expect(g.getCoordinates()).to.eql([]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+      });
+
+      it('can read and write various trk attributes', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <trk>' +
+            '    <name>Name</name>' +
+            '    <cmt>Comment</cmt>' +
+            '    <desc>Description</desc>' +
+            '    <src>Source</src>' +
+            '    <link href="http://example.com/">' +
+            '      <text>Link text</text>' +
+            '      <type>Link type</type>' +
+            '    </link>' +
+            '    <number>1</number>' +
+            '    <type>Type</type>' +
+            '  </trk>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('name')).to.be('Name');
+        expect(f.get('cmt')).to.be('Comment');
+        expect(f.get('desc')).to.be('Description');
+        expect(f.get('src')).to.be('Source');
+        expect(f.get('link')).to.be('http://example.com/');
+        expect(f.get('linkText')).to.be('Link text');
+        expect(f.get('linkType')).to.be('Link type');
+        expect(f.get('number')).to.be(1);
+        expect(f.get('type')).to.be('Type');
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read and write a trk with an empty trkseg', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <trk>' +
+            '    <trkseg/>' +
+            '  </trk>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        expect(g.getCoordinates()).to.eql([[]]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read/write a trk with a trkseg with multiple trkpts', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <trk>' +
+            '    <trkseg>' +
+            '      <trkpt lat="1" lon="2">' +
+            '        <ele>3</ele>' +
+            '        <time>2010-01-10T09:29:12Z</time>' +
+            '      </trkpt>' +
+            '      <trkpt lat="5" lon="6">' +
+            '        <ele>7</ele>' +
+            '        <time>2010-01-10T09:30:12Z</time>' +
+            '      </trkpt>' +
+            '    </trkseg>' +
+            '  </trk>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        expect(g.getCoordinates()).to.eql([
+          [[2, 1, 3, 1263115752], [6, 5, 7, 1263115812]]
+        ]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can tranform, read and write a trk with a trkseg', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <trk>' +
+            '    <trkseg>' +
+            '      <trkpt lat="1" lon="2">' +
+            '        <ele>3</ele>' +
+            '        <time>2010-01-10T09:29:12Z</time>' +
+            '      </trkpt>' +
+            '      <trkpt lat="5" lon="6">' +
+            '        <ele>7</ele>' +
+            '        <time>2010-01-10T09:30:12Z</time>' +
+            '      </trkpt>' +
+            '    </trkseg>' +
+            '  </trk>' +
+            '</gpx>';
+        var fs = format.readFeatures(text, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        var p1 = ol.proj.transform([2, 1], 'EPSG:4326', 'EPSG:3857');
+        p1.push(3, 1263115752);
+        var p2 = ol.proj.transform([6, 5], 'EPSG:4326', 'EPSG:3857');
+        p2.push(7, 1263115812);
+        expect(g.getCoordinates()).to.eql([[p1, p2]]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read and write a trk with multiple trksegs', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <trk>' +
+            '    <trkseg>' +
+            '      <trkpt lat="1" lon="2">' +
+            '        <ele>3</ele>' +
+            '        <time>2010-01-10T09:29:12Z</time>' +
+            '      </trkpt>' +
+            '      <trkpt lat="5" lon="6">' +
+            '        <ele>7</ele>' +
+            '        <time>2010-01-10T09:30:12Z</time>' +
+            '      </trkpt>' +
+            '    </trkseg>' +
+            '    <trkseg>' +
+            '      <trkpt lat="8" lon="9">' +
+            '        <ele>10</ele>' +
+            '        <time>2010-01-10T09:31:12Z</time>' +
+            '      </trkpt>' +
+            '      <trkpt lat="11" lon="12">' +
+            '        <ele>13</ele>' +
+            '        <time>2010-01-10T09:32:12Z</time>' +
+            '      </trkpt>' +
+            '    </trkseg>' +
+            '  </trk>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        expect(g.getCoordinates()).to.eql([
+          [[2, 1, 3, 1263115752], [6, 5, 7, 1263115812]],
+          [[9, 8, 10, 1263115872], [12, 11, 13, 1263115932]]
+        ]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('wpt', function() {
+
+      it('can read and write a wpt', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <wpt lat="1" lon="2"/>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([2, 1, 0, 0]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can transform, read and write a wpt', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <wpt lat="1" lon="2"/>' +
+            '</gpx>';
+        var fs = format.readFeatures(text, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        var expectedPoint = ol.proj.transform([2, 1], 'EPSG:4326', 'EPSG:3857');
+        expectedPoint.push(0, 0);
+        expect(g.getCoordinates()).to.eql(expectedPoint);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read and write a wpt with ele', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <wpt lat="1" lon="2">' +
+            '    <ele>3</ele>' +
+            '  </wpt>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([2, 1, 3, 0]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read and write a wpt with time', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <wpt lat="1" lon="2">' +
+            '    <time>2010-01-10T09:29:12Z</time>' +
+            '  </wpt>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([2, 1, 0, 1263115752]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read and write a wpt with ele and time', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <wpt lat="1" lon="2">' +
+            '    <ele>3</ele>' +
+            '    <time>2010-01-10T09:29:12Z</time>' +
+            '  </wpt>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([2, 1, 3, 1263115752]);
+        expect(g.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read and write various wpt attributes', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <wpt lat="1" lon="2">' +
+            '    <magvar>11</magvar>' +
+            '    <geoidheight>4</geoidheight>' +
+            '    <name>Name</name>' +
+            '    <cmt>Comment</cmt>' +
+            '    <desc>Description</desc>' +
+            '    <src>Source</src>' +
+            '    <link href="http://example.com/">' +
+            '      <text>Link text</text>' +
+            '      <type>Link type</type>' +
+            '    </link>' +
+            '    <sym>Symbol</sym>' +
+            '    <type>Type</type>' +
+            '    <fix>2d</fix>' +
+            '    <sat>5</sat>' +
+            '    <hdop>6</hdop>' +
+            '    <vdop>7</vdop>' +
+            '    <pdop>8</pdop>' +
+            '    <ageofdgpsdata>9</ageofdgpsdata>' +
+            '    <dgpsid>10</dgpsid>' +
+            '  </wpt>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('magvar')).to.be(11);
+        expect(f.get('geoidheight')).to.be(4);
+        expect(f.get('name')).to.be('Name');
+        expect(f.get('cmt')).to.be('Comment');
+        expect(f.get('desc')).to.be('Description');
+        expect(f.get('src')).to.be('Source');
+        expect(f.get('link')).to.be('http://example.com/');
+        expect(f.get('linkText')).to.be('Link text');
+        expect(f.get('linkType')).to.be('Link type');
+        expect(f.get('sym')).to.be('Symbol');
+        expect(f.get('type')).to.be('Type');
+        expect(f.get('fix')).to.be('2d');
+        expect(f.get('hdop')).to.be(6);
+        expect(f.get('vdop')).to.be(7);
+        expect(f.get('pdop')).to.be(8);
+        expect(f.get('ageofdgpsdata')).to.be(9);
+        expect(f.get('dgpsid')).to.be(10);
+        var serialized = format.writeFeaturesNode(fs);
+        expect(serialized).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('XML namespace support', function() {
+
+      beforeEach(function() {
+        format = new ol.format.GPX();
+      });
+
+      it('can read features with a version 1.0 namespace', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/0">' +
+            '  <wpt/>' +
+            '  <rte/>' +
+            '  <trk/>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(3);
+      });
+
+      it('can read features with a version 1.1 namespace', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <wpt/>' +
+            '  <rte/>' +
+            '  <trk/>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(3);
+      });
+
+      it('can read features with no namespace', function() {
+        var text =
+            '<gpx>' +
+            '  <wpt/>' +
+            '  <rte/>' +
+            '  <trk/>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(3);
+      });
+
+    });
+
+    describe('extensions support', function() {
+
+      beforeEach(function() {
+        format = new ol.format.GPX({
+          readExtensions: function(feature, extensionsNode) {
+            var nodes = extensionsNode.getElementsByTagName('id');
+            var id = nodes.item(0).textContent;
+            feature.setId(id);
+          }
+        });
+      });
+
+      it('can process extensions from wpt', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <wpt>' +
+            '    <extensions>' +
+            '      <id>feature-id</id>' +
+            '    </extensions>' +
+            '  </wpt>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var feature = fs[0];
+        expect(feature.getId()).to.be('feature-id');
+      });
+
+      it('can process extensions from rte', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <rte>' +
+            '    <extensions>' +
+            '      <foo>bar</foo>' +
+            '      <id>feature-id</id>' +
+            '    </extensions>' +
+            '  </rte>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var feature = fs[0];
+        expect(feature.getId()).to.be('feature-id');
+      });
+
+      it('can process extensions from trk, not trkpt', function() {
+        var text =
+            '<gpx xmlns="http://www.topografix.com/GPX/1/1">' +
+            '  <trk>' +
+            '    <extensions>' +
+            '      <id>feature-id</id>' +
+            '    </extensions>' +
+            '    <trkseg>' +
+            '      <trkpt>' +
+            '        <extensions>' +
+            '          <id>another-feature-id</id>' +
+            '        </extensions>' +
+            '      </trkpt>' +
+            '    </trkseg>' +
+            '  </trk>' +
+            '</gpx>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var feature = fs[0];
+        expect(feature.getId()).to.be('feature-id');
+      });
+
+    });
+
+  });
+
+});
+
+
+goog.require('ol.Feature');
+goog.require('ol.format.GPX');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.Point');
+goog.require('ol.proj');
+goog.require('ol.xml');
diff --git a/test/spec/ol/format/igcformat.test.js b/test/spec/ol/format/igcformat.test.js
new file mode 100644
index 0000000..c3b9c88
--- /dev/null
+++ b/test/spec/ol/format/igcformat.test.js
@@ -0,0 +1,121 @@
+goog.provide('ol.test.format.IGC');
+
+
+describe('ol.format.IGC', function() {
+
+  var format;
+  var igc =
+      'AFLY05094\n' +
+      'HFDTE190411\n' +
+      'HFFXA100\n' +
+      'HFPLTPILOT:Tom Payne\n' +
+      'HFGTYGLIDERTYPE:Axis Mercury\n' +
+      'HFGIDGLIDERID:\n' +
+      'HFDTM100GPSDATUM:WGS84\n' +
+      'HFGPSGPS:FURUNO GH-80\n' +
+      'HFRFWFIRMWAREVERSION:1.22\n' +
+      'HFRHWHARDWAREVERSION:1.00\n' +
+      'HFFTYFRTYPE:FLYTEC,5020\n' +
+      'I013638TAS\n' +
+      'B0848484556256N00651095EA0205102039000\n' +
+      'B0855534556037N00651011EA0259302513000\n' +
+      'B0903354554964N00648049EA0272402758000\n' +
+      'GAB890A77AFE5CE63979AF6B1BED7F07D\n' +
+      'G62BB282E44D63A1149EF2F5E8AF6F2F1\n' +
+      'GEC14381987B15F81003EDE1E01A47843\n' +
+      'G60189641B00B00800019000000000000';
+
+  beforeEach(function() {
+    format = new ol.format.IGC();
+  });
+
+  describe('#readFeature', function() {
+    it('does not read invalid features', function() {
+      expect(format.readFeature('invalid')).to.be(null);
+    });
+
+    it('does read a feature', function() {
+      var feature = format.readFeature(igc);
+      expect(feature).to.be.an(ol.Feature);
+      var geom = feature.getGeometry();
+      expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+      expect(geom.getCoordinates()).to.eql([
+        [6.851583333333333, 45.9376, 1303202928],
+        [6.850183333333334, 45.93395, 1303203353],
+        [6.800816666666667, 45.916066666666666, 1303203815]]);
+    });
+
+    it('does transform and read a feature', function() {
+      var feature = format.readFeature(igc, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(feature).to.be.an(ol.Feature);
+      var geom = feature.getGeometry();
+      expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+
+      var expectedPoint1 = ol.proj.transform(
+          [6.851583333333333, 45.9376], 'EPSG:4326', 'EPSG:3857');
+      expectedPoint1.push(1303202928);
+      var expectedPoint2 = ol.proj.transform(
+          [6.850183333333334, 45.93395], 'EPSG:4326', 'EPSG:3857');
+      expectedPoint2.push(1303203353);
+      var expectedPoint3 = ol.proj.transform(
+          [6.800816666666667, 45.916066666666666], 'EPSG:4326', 'EPSG:3857');
+      expectedPoint3.push(1303203815);
+
+      expect(geom.getCoordinates()).to.eql(
+          [expectedPoint1, expectedPoint2, expectedPoint3]);
+    });
+
+  });
+
+  describe('#readFeatures', function() {
+
+    it('does not read invalid features', function() {
+      expect(format.readFeatures('invalid')).to.be.empty();
+    });
+
+    it('does read features', function() {
+      var features = format.readFeatures(igc);
+      expect(features.length).to.eql(1);
+      var feature = features[0];
+      expect(feature).to.be.an(ol.Feature);
+      var geom = feature.getGeometry();
+      expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+      expect(geom.getCoordinates()).to.eql([
+        [6.851583333333333, 45.9376, 1303202928],
+        [6.850183333333334, 45.93395, 1303203353],
+        [6.800816666666667, 45.916066666666666, 1303203815]]);
+    });
+
+    it('does transform and read features', function() {
+      var features = format.readFeatures(igc, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(features.length).to.eql(1);
+      var feature = features[0];
+      expect(feature).to.be.an(ol.Feature);
+      var geom = feature.getGeometry();
+      expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+
+      var expectedPoint1 = ol.proj.transform(
+          [6.851583333333333, 45.9376], 'EPSG:4326', 'EPSG:3857');
+      expectedPoint1.push(1303202928);
+      var expectedPoint2 = ol.proj.transform(
+          [6.850183333333334, 45.93395], 'EPSG:4326', 'EPSG:3857');
+      expectedPoint2.push(1303203353);
+      var expectedPoint3 = ol.proj.transform(
+          [6.800816666666667, 45.916066666666666], 'EPSG:4326', 'EPSG:3857');
+      expectedPoint3.push(1303203815);
+
+      expect(geom.getCoordinates()).to.eql(
+          [expectedPoint1, expectedPoint2, expectedPoint3]);
+    });
+  });
+
+});
+
+goog.require('ol.format.IGC');
+goog.require('ol.Feature');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.proj');
diff --git a/test/spec/ol/format/kml/states.kml b/test/spec/ol/format/kml/states.kml
new file mode 100644
index 0000000..c4ca2a8
--- /dev/null
+++ b/test/spec/ol/format/kml/states.kml
@@ -0,0 +1,4661 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
+<Document>
+	<name>US States</name>
+	<open>1</open>
+	<Style id="Style_5">
+		<IconStyle>
+			<scale>0.4</scale>
+			<Icon>
+				<href>http://maps.google.com/mapfiles/kml/shapes/star.png</href>
+			</Icon>
+		</IconStyle>
+		<LabelStyle>
+			<color>9900ffff</color>
+		</LabelStyle>
+		<LineStyle>
+			<color>ffff00ff</color>
+			<width>2</width>
+		</LineStyle>
+		<PolyStyle>
+			<color>ffff00ff</color>
+			<fill>0</fill>
+		</PolyStyle>
+	</Style>
+	<Placemark id="pm292">
+		<name>Alabama</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   51715.786</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Alabama</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>01</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E S Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>AL</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     4447100</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     4478538</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          86</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          92</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          22</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Alabama</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 14 1819</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1819</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1702</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g985">
+				<coordinates>-86.8263454497332,32.7948233460272,0</coordinates>
+			</Point>
+			<Polygon id="g986">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-85.0700671081992,31.9807030736301,0 -85.0567002477577,32.0173765203509,0 -85.0620107617352,32.0500102920991,0 -85.0566549357244,32.0696439454843,0 -85.046187259254,32.0908949913561,0 -85.0533136579289,32.1266376448382,0 -85.0243823514691,32.1662750781008,0 -85.0078260926386,32.1788785384061,0 -84.9603852752889,32.1919284376309,0 -84.9757438025875,32.2122487204353,0 -84.9283716437355,32.2179784387895,0 -84.9160041260552,32.2285563686775,0 -84.92367962799079,32.2473889995768,0 -84. [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm300">
+		<name>Alaska</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>  576594.104</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Alaska</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>02</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Pacific</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>AK</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>      626932</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>      632783</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>           1</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>         100</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          49</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Alaska</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Jan. 3 1959</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1959</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1784</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g1016">
+				<coordinates>-152.571308132839,64.31717179291989,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g1017">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-161.333785152503,58.73324809322381,0 -161.265686026239,58.7746349508974,0 -161.29973001177,58.8092078992406,0 -160.898880078262,58.8847743885185,0 -160.835706338137,58.8360566348485,0 -160.328871281117,59.0589472427445,0 -160.255289421572,58.9814391788959,0 -160.322214368411,58.94977595668139,0 -160.251928933333,58.8947750733089,0 -160.018038770945,58.8847826021977,0 -159.921353250021,58.7703335410918,0 -159.764983266222,58.85339732881441,0 -159.770814017585,58.9336678800203,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1018">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-172.282642546092,60.3017596593185,0 -172.211808221282,60.316204875602,0 -172.390441016854,60.3928679156909,0 -172.847101990595,60.4839652430026,0 -172.919346731,60.6028543719093,0 -173.04685088018,60.5370151919399,0 -173.051029558487,60.4933969080509,0 -172.601782006627,60.32397371434931,0 -172.282642546092,60.3017596593185,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1019">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-166.111439828761,60.4094701923102,0 -166.398665903988,60.3400243984304,0 -166.498123499017,60.37807097764811,0 -166.810311289524,60.27945769150159,0 -166.84143544507,60.20390387913589,0 -167.453133884145,60.2066788672344,0 -167.318112198797,60.0708487760817,0 -167.128929292756,59.9963962534805,0 -166.104757036993,59.75724250197069,0 -166.118919817195,59.8105716573949,0 -166.267815168744,59.84307908422521,0 -165.61446894417,59.9014123587901,0 -165.542848138141,59.9786315042928,0  [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1020">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-164.178091402927,54.603270997621,0 -163.601959088346,54.6099352379761,0 -163.43838539692,54.6574383835051,0 -163.370852896965,54.7535535436431,0 -163.050602984856,54.6674425084057,0 -163.147018537937,54.7652157933741,0 -163.36197296569,54.7754956428998,0 -163.531996342121,55.045514546807,0 -163.770614294094,55.0552237012459,0 -164.137822791485,54.9649533186511,0 -164.221436864885,54.8866229773527,0 -164.490015256965,54.9155065870599,0 -164.706139301228,54.6674315593203,0 -164.95 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1021">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-166.645219344046,53.5227419042544,0 -166.665820621025,53.5924680707072,0 -166.592700000167,53.5344165169026,0 -166.540213650459,53.6269111248818,0 -166.279117480897,53.67774993367021,0 -166.333594474453,53.7780194934209,0 -166.373841186087,53.7144229393544,0 -166.417176046642,53.7555359837067,0 -166.485803072549,53.6888628054882,0 -166.572714324989,53.70942188291101,0 -166.490200645502,53.7716311101511,0 -166.539118186291,53.7819062132675,0 -166.216945166038,53.9274617985556,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1022">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-166.221353590988,53.7038670268488,0 -166.091950914115,53.83858209335401,0 -166.295237063513,53.7922020429164,0 -166.221353590988,53.7038670268488,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1023">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-167.797253013127,53.4946538567842,0 -168.007523477049,53.5627120027018,0 -168.353939273597,53.4746486015871,0 -168.430644994273,53.3321403605258,0 -168.360903481553,53.2587999987857,0 -168.623432287093,53.2712942239251,0 -168.795959122905,53.1465255981845,0 -168.770404081785,53.0668018455063,0 -168.882379232022,52.9373238815457,0 -169.109577418591,52.8181231444897,0 -168.472312004377,53.0459813460606,0 -168.287531521535,53.23518696940251,0 -167.850843433793,53.37991964170511,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1024">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-174.161329564352,52.4173465495761,0 -174.448532942333,52.3117757493222,0 -174.234619962323,52.2417876137923,0 -174.551313477007,52.17566515917311,0 -174.499368319093,52.1392730972652,0 -174.579630620407,52.0995416658609,0 -174.906888865781,52.1103733142569,0 -175.024350680111,52.0206351056977,0 -175.338269544757,52.0128409429971,0 -174.722148470263,52.00092135872171,0 -174.704053619483,52.0495316507539,0 -174.487641711105,52.0337075891309,0 -174.523535983743,52.0892664372186,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1025">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-176.941084144749,51.58303266917,0 -176.828880061621,51.7127571182365,0 -176.80054534901,51.6027616434207,0 -176.50913716743,51.75194463371049,0 -176.432198194148,51.7288916531697,0 -176.428853207589,51.8350038304907,0 -176.644714643839,51.8558373729491,0 -176.548588214125,51.9086069184368,0 -176.558365467237,51.9822217718073,0 -176.774177292602,51.9438835749084,0 -176.703036371825,51.8513940493333,0 -176.781649967396,51.8233284222627,0 -176.704950850264,51.7819488934334,0 -176.9 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1026">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-177.910314852892,51.59047529544791,0 -177.799758165034,51.7874482254509,0 -177.621987815149,51.85079803240011,0 -177.836720859072,51.830775770348,0 -177.948676873884,51.9177288521087,0 -178.217598362366,51.8752203024868,0 -177.957791024222,51.7632712434191,0 -178.103365061432,51.66325899768641,0 -177.910314852892,51.59047529544791,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1027">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-171.086945737084,63.43185606043301,0 -170.859425829076,63.4610308912222,0 -170.239896450231,63.2816032134783,0 -169.980209408864,63.1419868776933,0 -169.807940259649,63.1243792330727,0 -169.656273367952,62.9432742913594,0 -169.32793382688,63.1821787502079,0 -168.85259065308,63.1544119515347,0 -168.692896091647,63.3021915417681,0 -169.179314089792,63.2980215630981,0 -170.086003347132,63.484942545381,0 -170.034399159545,63.5357720440057,0 -170.068799574734,63.59466343990179,0 -170 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1028">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-146.098975435796,60.3922217464441,0 -146.582871711614,60.48194370056039,0 -146.72619700343,60.37415032487709,0 -146.488146622944,60.3669390883601,0 -146.679533099071,60.2872162096262,0 -146.604255056572,60.2374977564608,0 -146.098975435796,60.3922217464441,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1029">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-146.939832810504,60.2858229675231,0 -147.100356897737,60.2702597192698,0 -147.01098950104,60.3419328800713,0 -147.195544669344,60.3527127132998,0 -147.194998285425,60.2449363025279,0 -147.698932462331,59.998238098762,0 -147.669518563288,59.9696421838658,0 -147.802841413459,59.9207286473767,0 -147.74309966167,59.8932473711633,0 -147.912320410482,59.7901783714493,0 -147.471865010115,59.8679943519137,0 -147.482391033304,59.9457652379755,0 -147.354015157706,59.974650830779,0 -147.36 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1030">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-152.09321930733,58.35956229239359,0 -152.349651908204,58.42067094368999,0 -152.401326751095,58.31511136769269,0 -152.528560208508,58.4128994516293,0 -152.499106717963,58.46206747514319,0 -152.660222888777,58.4765153273738,0 -152.694131998042,58.4217940259965,0 -152.886646268354,58.40679710194,0 -152.765246889149,58.3609633745851,0 -152.762196842929,58.2573461953387,0 -153.01497633051,58.3029033891128,0 -153.108024530252,58.2637421959406,0 -152.906919833977,58.1645579744275,0 -15 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1031">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-133.957575208106,57.2999306224556,0 -133.865044260443,57.3535430899502,0 -133.883659310324,57.4152037032697,0 -133.997003573255,57.4077030325642,0 -133.972832785889,57.4438132059959,0 -134.100063600429,57.463542418998,0 -134.043695992172,57.4749257045984,0 -134.081447329487,57.5010488811349,0 -133.842001299067,57.46020926928861,0 -133.938402776506,57.6207637999747,0 -134.076167554834,57.64493342002491,0 -134.045344599571,57.6832638054914,0 -134.238687661874,57.8585502171943,0 -1 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1032">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-134.517615393878,58.3377167502683,0 -134.684859712071,58.3027160402146,0 -134.609812412179,58.237437904568,0 -134.261496532951,58.194662482636,0 -134.517615393878,58.3377167502683,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1033">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-135.887790019534,57.9876824539146,0 -135.889331207095,57.9882430923176,0 -135.236212858121,57.7796493127647,0 -135.012335588828,57.77660026735799,0 -134.932075089584,57.8066000013056,0 -135.206500034818,57.9418740205317,0 -134.919014995813,57.8393759635417,0 -134.971782736525,57.884930765569,0 -134.907636351669,57.9288225682191,0 -134.943165148215,58.0354884497242,0 -135.4009750495,58.13909549198129,0 -135.649597129609,57.94464407268,0 -135.794325162033,57.98158060065,0 -135.624 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1034">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-153.392819106123,57.1578150625529,0 -153.391170767535,57.20643145913531,0 -152.958362818028,57.2530915629434,0 -153.175313931231,57.2994862801629,0 -153.164205488345,57.3478215097467,0 -152.882211445405,57.34642605123581,0 -152.840561469611,57.2680901886602,0 -152.636131502789,57.31697797220669,0 -152.605271069444,57.3791982816532,0 -152.806662878321,57.4678164159662,0 -153.045573136149,57.43060417565031,0 -152.912502640705,57.4831028238115,0 -152.958891001931,57.5200573093257,0 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1035">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-134.655390098823,56.16266193516189,0 -134.618144450901,56.72075296783309,0 -134.836198024378,57.2477098984344,0 -134.985066734427,57.2943739834285,0 -134.94786612865,57.3204912317811,0 -135.00090756226,57.3424242205839,0 -134.9076129914,57.3293810392095,0 -135.003993227617,57.39937824634809,0 -135.202063988419,57.4243667978265,0 -135.167614227587,57.4782546176544,0 -135.399577332086,57.43853182026469,0 -135.282362988664,57.50353572125369,0 -135.314560394456,57.5324206439867,0 -1 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1036">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-135.702071692228,57.31658350148879,0 -135.848737784871,57.3162950258433,0 -135.819830984012,57.1724005616461,0 -135.710673710214,57.16101811328251,0 -135.825941290601,57.08296744204201,0 -135.839567402382,56.98768513709851,0 -135.630940067482,57.0040823307003,0 -135.547885999691,57.1290749917056,0 -135.626468170496,57.2313048151095,0 -135.557617899884,57.2288021287352,0 -135.702071692228,57.31658350148879,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1037">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-133.053390351289,56.97714702524889,0 -133.295335943079,57.0035431619298,0 -133.263967207313,56.921597824843,0 -133.327012360802,56.99660004634231,0 -133.874777973322,57.0857684838486,0 -134.019794733821,57.0143800263991,0 -133.737848765029,56.8927133973155,0 -133.892286836687,56.89660507320559,0 -133.758142051845,56.8032670452989,0 -133.674524574542,56.8588218466323,0 -133.708694348619,56.6774253399436,0 -133.636774891098,56.5935236773375,0 -133.691770840668,56.5688039494711,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1038">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-133.965053500888,56.0812846387448,0 -133.949532594346,56.1993380950511,0 -133.889538107293,56.2229461297938,0 -133.985913933344,56.2685074429714,0 -133.975081289917,56.3557286565983,0 -133.855639708513,56.2787890098363,0 -133.911217854205,56.4249043104871,0 -133.827331752229,56.4354582647604,0 -133.919269867011,56.5007461483316,0 -133.84536471409,56.5715815218498,0 -133.922319509601,56.61380613150769,0 -133.740357493661,56.5601902175525,0 -133.693143667676,56.5993612801202,0 -13 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1039">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-132.803653271279,56.7860406631428,0 -132.965623026439,56.7960384089399,0 -132.883371065593,56.63658603825431,0 -132.958107536577,56.5938039676218,0 -132.941722525003,56.5093749050577,0 -132.77478501171,56.4943701849766,0 -132.720307664077,56.51104060003691,0 -132.751711841031,56.5524291958232,0 -132.532549684115,56.5774334872854,0 -132.803653271279,56.7860406631428,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1040">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-132.337804742749,56.4796479168462,0 -132.351410271693,56.2779733052681,0 -132.303891788458,56.23185224300391,0 -132.057810279652,56.1110312765749,0 -131.923350207348,56.1968613620864,0 -132.005320495176,56.3363150729862,0 -132.162510728277,56.35271056708941,0 -132.337804742749,56.4796479168462,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1041">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-132.704770567567,56.4557558769931,0 -132.94199544313,56.4474232469974,0 -133.058116273752,56.34186597005931,0 -132.846704640205,56.2313025143395,0 -132.678911140644,56.265194266468,0 -132.615862536329,56.3960369708995,0 -132.704770567567,56.4557558769931,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1042">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-132.473629816734,55.4956310263753,0 -132.679719350735,55.45241862597041,0 -132.511407662042,55.54434856852371,0 -132.564164976718,55.56740551658349,0 -132.54167897639,55.62267443054111,0 -132.170838611909,55.4462957108967,0 -132.145846340898,55.48018516651531,0 -132.292514962732,55.5362972126054,0 -132.381658844606,55.6690745363953,0 -132.43750143704,55.62295141204839,0 -132.494455201912,55.8137888383967,0 -132.727249633493,55.9896261855393,0 -133.07977593669,56.0521307665152,0  [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1043">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-132.391971869653,56.335755916154,0 -132.517527648792,56.33824914076529,0 -132.605023777277,56.2310204946758,0 -132.696154225093,56.22185739992919,0 -132.697527893107,56.1074122964528,0 -132.636704224386,56.0488018182385,0 -132.381659614072,56.0260228574646,0 -132.427256528788,55.9557383376468,0 -132.340003253304,55.91351910572829,0 -132.181674158052,55.9657578776832,0 -132.129461406089,55.9279855386802,0 -132.20165657928,56.0851990051386,0 -132.108892738952,56.1154780279142,0 -1 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1044">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-133.287273107465,56.1285193821479,0 -133.619502154891,56.1304525817666,0 -133.48671406159,56.0857359491733,0 -133.681447788994,56.0660107829683,0 -133.791729083627,55.9207261405941,0 -133.620043513236,55.919061854864,0 -133.478932635933,56.0223882122985,0 -133.319218200846,55.9935160016486,0 -133.287273107465,56.1285193821479,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1045">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-131.606390952927,55.3196460287417,0 -131.523626715678,55.2927065288402,0 -131.468332286741,55.3554813742488,0 -131.52170762436,55.4760277540251,0 -131.445019503467,55.528250482074,0 -131.463631605047,55.3277029912542,0 -131.334456177303,55.4196456731968,0 -131.350571344767,55.64464241181071,0 -131.271713839534,55.4371488045966,0 -131.460852754343,55.2810343109492,0 -131.294748784321,55.2735377996958,0 -131.2275245322,55.40575586235,0 -131.217511188806,55.3052092167966,0 -131.308 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1046">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-131.821140484584,55.4124099903551,0 -131.866945741921,55.3679685469814,0 -131.824461228231,55.2113141461293,0 -131.726683471567,55.1343743438445,0 -131.761688966383,55.247423370327,0 -131.61832179154,55.28326142836379,0 -131.821140484584,55.4124099903551,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1047">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-131.468907428577,55.2354796515061,0 -131.585300708148,55.2515918113963,0 -131.518646304163,55.1282585208495,0 -131.594176648462,55.1063159605734,0 -131.59972753219,54.9949305405507,0 -131.521695860182,55.0327112599271,0 -131.537505218119,55.0907610434156,0 -131.476956765629,55.0004939338339,0 -131.356659978778,55.0352158428158,0 -131.375005668955,55.1965953318301,0 -131.468907428577,55.2354796515061,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1048">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-133.103853177495,55.24520299191451,0 -133.215824492689,55.1696372711329,0 -133.118282231733,55.1015854493073,0 -133.215270801953,55.09463634472111,0 -133.150270403124,54.94379737397,0 -132.90693534583,54.83630882934499,0 -132.955276675812,54.7918753410748,0 -132.841932044642,54.6890880966602,0 -132.670272461523,54.6638099069197,0 -132.758897152011,54.7393706689813,0 -132.716661409724,54.7646540373054,0 -132.756667768137,54.8218741407807,0 -133.081358213392,55.0854740462953,0 -13 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm286">
+		<name>Arizona</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>  113712.679</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Arizona</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>04</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mtn</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>AZ</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     5130632</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     5312024</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          45</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          96</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          48</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Arizona</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Feb. 14 1912</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1912</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1776</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g963">
+				<coordinates>-111.664591949232,34.2916834221835,0</coordinates>
+			</Point>
+			<Polygon id="g964">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-114.520627661734,33.0277074359678,0 -114.46838719789,32.9777894659032,0 -114.476443984447,32.9359088466692,0 -114.461436322021,32.8454225112401,0 -114.52621949202,32.8099123509472,0 -114.535077445153,32.7880470474354,0 -114.530095237266,32.7714115230303,0 -114.543187695964,32.7712322843312,0 -114.543004547133,32.7607497409074,0 -114.561582708233,32.7607536245719,0 -114.560751027253,32.7489359768297,0 -114.572210733513,32.7488292120028,0 -114.571958909536,32.7374388920444,0 -114.6 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm296">
+		<name>Arkansas</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   52913.232</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Arkansas</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>05</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W S Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>AR</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     2673400</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     2706444</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          51</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          96</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          25</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Arkansas</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>June 15 1836</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1836</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1686</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g995">
+				<coordinates>-92.43380149123649,34.8979530772317,0</coordinates>
+			</Point>
+			<Polygon id="g996">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-94.4616914490383,34.1967651932869,0 -94.46858488730931,33.9393114556774,0 -94.4766912623089,33.6320818342933,0 -94.43611697644781,33.6365609097961,0 -94.43653636903311,33.6169611431123,0 -94.45175731380159,33.6044640316868,0 -94.4435324861232,33.5966212153736,0 -94.4286699913841,33.5972585244972,0 -94.4067726989127,33.573604181729,0 -94.39361925175989,33.5750768821217,0 -94.3793139265706,33.5934447272787,0 -94.3708297502542,33.5901604561683,0 -94.3725080674424,33.572780843886,0 - [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm275">
+		<name>California</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   157776.31</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>California</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>06</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Pacific</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>CA</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>    33871648</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>    34516624</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         215</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          81</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          31</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>California</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Sep. 9 1850</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1850</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1769</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g931">
+				<coordinates>-119.601147078817,37.2417411000423,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g932">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-121.66521992838,38.1692852818694,0 -121.659581042989,38.0964650614978,0 -121.554149383557,38.1373615489176,0 -121.57283385306,38.1137988310232,0 -121.54747307428,38.0634732081726,0 -121.56954517723,38.0636676710543,0 -121.576884968613,38.0941384853348,0 -121.657749868484,38.0861008670846,0 -121.69895609777,38.023495913425,0 -122.00062325051,38.0571514373297,0 -122.29552219684,38.0147955029917,0 -122.379683867535,37.9734454214081,0 -122.371497008527,37.9093451727425,0 -122.307553 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g933">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-119.867823257171,34.0752286498425,0 -119.927690399321,34.0591802403193,0 -119.873986855978,34.0318755748591,0 -119.889061793831,34.004669718361,0 -119.847275401387,33.9684159348396,0 -119.712539718279,33.9652843614565,0 -119.539377455034,34.0064960649629,0 -119.523095554405,34.0345906142262,0 -119.572589325174,34.0557811654196,0 -119.667922334498,34.0213434372469,0 -119.867823257171,34.0752286498425,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g934">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-120.167386086026,33.9241621971016,0 -120.109179246126,33.8948139803303,0 -119.963385936243,33.9477631591643,0 -120.046801069367,34.0411052236375,0 -120.238548700773,34.0108852422559,0 -120.167386086026,33.9241621971016,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g935">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-118.594780502018,33.4808183566674,0 -118.556433880183,33.4344825457272,0 -118.481342626159,33.4195524387193,0 -118.455386785543,33.3247859794245,0 -118.304036434067,33.3074940443331,0 -118.294590834254,33.3344480915225,0 -118.362395805209,33.4110113285126,0 -118.594780502018,33.4808183566674,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g936">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-118.350958200555,32.8191952333517,0 -118.541585051028,32.9873842722853,0 -118.571485987943,33.0359715054548,0 -118.599517215117,33.0210219708047,0 -118.511676946737,32.8920762202556,0 -118.420105888582,32.8061145350339,0 -118.350958200555,32.8191952333517,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm281">
+		<name>Colorado</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>  104101.231</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Colorado</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>08</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mtn</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>CO</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     4301261</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     4432642</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          41</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          96</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          38</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Colorado</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Aug. 1 1876</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1876</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1858</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g950">
+				<coordinates>-105.547857280633,38.9972631547834,0</coordinates>
+			</Point>
+			<Polygon id="g951">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-102.044455910114,37.6414742210535,0 -102.04397657417,37.7343986213713,0 -102.046060904132,38.2538220806459,0 -102.045549640322,38.2633436193344,0 -102.047584160548,38.6154993640496,0 -102.047568440936,38.6925505149901,0 -102.048972538957,39.0370029188915,0 -102.047874719263,39.1267534832,0 -102.048801584447,39.5628035180916,0 -102.049442507662,39.5686933622379,0 -102.051535596434,39.9989182728278,0 -102.047544994516,40.3426445008284,0 -102.047620488242,40.4310777832961,0 -102.046 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm269">
+		<name>Connecticut</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    4976.566</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Connecticut</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>09</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>N Eng</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>CT</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     3405565</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     3434012</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         684</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          39</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           5</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Connecticut</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Jan. 9 1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1634</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g917">
+				<coordinates>-72.7247699791,41.6180326565837,0</coordinates>
+			</Point>
+			<Polygon id="g918">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-73.5303920707175,41.5227455563004,0 -73.5442932536742,41.3652984767995,0 -73.5502596731917,41.2936207043954,0 -73.47812075689539,41.2107548889389,0 -73.72523765669671,41.1003542249946,0 -73.65372377552561,41.0126172825253,0 -73.65315146089949,40.9983924455247,0 -73.1044185740856,41.1610394427248,0 -72.906734323612,41.2700631991856,0 -72.5272448622889,41.2637025875984,0 -72.378152966058,41.2781022275496,0 -72.3784123498461,41.3583482711136,0 -72.3263548978381,41.2896412329135,0 -7 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm278">
+		<name>Delaware</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    2054.586</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Delaware</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>10</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>S Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>DE</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>      783600</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>      797556</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         381</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          66</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           1</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Delaware</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 7 1787</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1787</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1638</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g941">
+				<coordinates>-75.5005536711258,38.9951144260073,0</coordinates>
+			</Point>
+			<Polygon id="g942">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-75.70707355672541,38.5575913668919,0 -75.6988024422464,38.4631827108939,0 -75.3498423227975,38.4553227905156,0 -75.0927212334893,38.4505638472484,0 -75.0679246646819,38.4500753640855,0 -75.0456230125111,38.4496021608759,0 -75.0827624797042,38.7999244622257,0 -75.1905708548595,38.8087822508359,0 -75.3075352508581,38.946023931106,0 -75.32448866541441,39.0124989256203,0 -75.3973682707713,39.0731489592767,0 -75.4021224709428,39.2577500046037,0 -75.5152174265202,39.3670516712081,0 -75 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm298">
+		<name>Florida</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   55814.731</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Florida</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>12</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>S Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>FL</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>    15982378</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>    16349220</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         286</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          75</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          27</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Florida</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Mar. 3 1845</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1845</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1565</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g1002">
+				<coordinates>-82.4955741421186,28.6586764601475,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g1003">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-80.7856624086309,28.7851940403771,0 -81.0970545706768,29.3517993174429,0 -81.1098802954354,29.4302392603555,0 -81.2337658332761,29.6690238932245,0 -81.2437844731636,29.7379431267216,0 -81.3164898837488,29.829240288196,0 -81.30275787447,29.9130520156593,0 -81.4327676635006,30.2467817590837,0 -81.4432599879591,30.3571873716918,0 -81.4807983040684,30.3805404131581,0 -81.4575287462075,30.4547642552716,0 -81.51811745977921,30.556212852111,0 -81.4987842593679,30.5986053568678,0 -81.52 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1004">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-86.8338822668909,30.3997351946409,0 -86.92912289596769,30.381394411765,0 -87.0476413823616,30.36940104488521,0 -87.13934916731981,30.3517658849312,0 -87.20214070012931,30.3348345829613,0 -87.2860896885903,30.3397725845478,0 -87.2903241050636,30.3327193793144,0 -87.2670458244246,30.3214318797522,0 -87.2423486031622,30.3214318477782,0 -86.8345841638274,30.3870382775534,0 -86.7929645335572,30.3905649446145,0 -86.73864164395199,30.4025581695707,0 -86.53264296831961,30.3933887813638, [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1005">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-80.73583342138031,28.7888443728242,0 -80.8624380297225,28.9916256739697,0 -80.8990978307606,29.0615113380843,0 -80.9162872259714,29.0718222697753,0 -80.891079384763,29.0133938389067,0 -80.8171798101218,28.895390595308,0 -80.76333034164141,28.8220678253514,0 -80.73583342138031,28.7888443728242,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1006">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-80.7258997483759,28.7843659964936,0 -80.64119767311181,28.6573460126368,0 -80.7540684017207,28.7368838886358,0 -80.7349947909981,28.7066171587924,0 -80.7859302565314,28.6877162616962,0 -80.7804452685255,28.6189606122974,0 -80.6918815595558,28.5883502247698,0 -80.6600431301066,28.6186511090254,0 -80.5991290711823,28.6039228263252,0 -80.5774466899765,28.54865343771141,0 -80.6216302365325,28.4126591437007,0 -80.5876558561293,28.4092601916422,0 -80.5259480649338,28.4634626289081,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1007">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-80.68862382465591,28.5817643631259,0 -80.7210434793205,28.3854010160234,0 -80.605571665409,28.14494461734,0 -80.66711056958739,28.301841271446,0 -80.6627305489283,28.4274102077487,0 -80.60919283666981,28.5735665270911,0 -80.6537947563473,28.6008904599418,0 -80.68862382465591,28.5817643631259,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1008">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-82.1019415480461,26.586077179011,0 -82.1286518307944,26.6936913317227,0 -82.1833101452127,26.6834323648282,0 -82.13570958489,26.6426298555739,0 -82.0974560861241,26.4939425477023,0 -82.06695301795411,26.4975643713843,0 -82.1019415480461,26.586077179011,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1009">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-80.24945367787321,25.354937643044,0 -80.3616011380102,25.2964992519179,0 -80.3302969914516,25.2679815350763,0 -80.3530636815586,25.2115321598761,0 -80.5878197219821,24.9563763998019,0 -80.355665273095,25.1582335995928,0 -80.24945367787321,25.354937643044,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm294">
+		<name>Georgia</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   58629.222</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Georgia</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>13</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>S Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>GA</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     8186453</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     8423422</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         140</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          88</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           4</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Georgia</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Jan. 2 1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1733</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g989">
+				<coordinates>-83.4542258116492,32.6550957052741,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g990">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-85.1301648712312,31.778853672117,0 -85.11528693111811,31.731565957183,0 -85.11867442354141,31.7085715963854,0 -85.1112049587349,31.6842421102739,0 -85.0592853056629,31.6212651525335,0 -85.04272135787051,31.5543898029988,0 -85.0426984349451,31.5196599288858,0 -85.0663120282063,31.4760895555663,0 -85.0614062661802,31.4406634414676,0 -85.0879419916334,31.3672341961667,0 -85.0825631900095,31.33233449639,0 -85.0812280506442,31.3030803697052,0 -85.1033613685017,31.2714361848353,0 -85. [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g991">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-81.48505559674619,30.9038830704629,0 -81.50330537724329,30.8817350483411,0 -81.4698871419111,30.8602588644255,0 -81.4794603415988,30.7368833934474,0 -81.45571660482371,30.7164274298842,0 -81.4030527080982,30.9388031406114,0 -81.41640510474601,30.970600047506,0 -81.48505559674619,30.9038830704629,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm251">
+		<name>Hawaii</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    6380.614</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Hawaii</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>15</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Pacific</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>HI</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1211537</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     1211960</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         190</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          83</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          50</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Hawaii</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Aug. 21 1959</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1959</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1820</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g866">
+				<coordinates>-156.326917860547,20.2401578536914,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g867">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-159.335174733889,21.9483433404175,0 -159.327130348878,22.0446395507162,0 -159.295025589769,22.1248124949548,0 -159.343195828355,22.1970166285359,0 -159.391366885913,22.2291198667724,0 -159.576012589057,22.2131796383001,0 -159.712505933171,22.1490592515515,0 -159.800814224332,22.0366665967853,0 -159.736592652746,21.9644203111023,0 -159.640246973766,21.9483657695954,0 -159.576021285803,21.8841361312636,0 -159.439545188912,21.8680716835921,0 -159.335174733889,21.9483433404175,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g868">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-160.073803556017,22.0041773078075,0 -160.121962433575,21.9639787234984,0 -160.22633646805,21.8915919620539,0 -160.242406159206,21.8032804408925,0 -160.202259673133,21.7953086498352,0 -160.170137686564,21.8675963686431,0 -160.089858388217,21.9158698594272,0 -160.04970969565,21.9881641068501,0 -160.073803556017,22.0041773078075,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g869">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-157.673329876454,21.2980271804006,0 -157.713472767801,21.3863351682207,0 -157.761642948927,21.4585875674916,0 -157.809815119729,21.4345051589313,0 -157.849959026307,21.5067588029631,0 -157.914179741199,21.6352084806278,0 -157.986428112199,21.6994328594403,0 -158.042626247904,21.6753505680564,0 -158.114894071646,21.5790166217416,0 -158.267431808754,21.5870425200507,0 -158.243342775004,21.5388789757719,0 -158.235318726083,21.4746525812457,0 -158.130951115411,21.3542322862678,0 -15 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g870">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-156.717872676999,21.1374197607644,0 -156.942682512532,21.1615268671346,0 -156.958733487556,21.2096935134305,0 -157.006903742467,21.1856106379825,0 -157.167471487889,21.1936404563437,0 -157.23169415835,21.2337763231398,0 -157.247747506123,21.1615304515084,0 -157.303948796958,21.1374484326638,0 -157.287897522787,21.0812505718402,0 -157.071131928318,21.1053309568586,0 -156.886484099806,21.049134117125,0 -156.766048197649,21.0651768177371,0 -156.717872676999,21.1374197607644,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g871">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-156.196045412482,20.6316494073652,0 -156.131808903973,20.6236229186799,0 -156.043511542555,20.6557325999668,0 -155.98731705257,20.7520616316876,0 -156.011392452548,20.8002253216075,0 -156.260263363072,20.9286712687479,0 -156.356603503292,20.9447263610079,0 -156.477022052544,20.8965651391117,0 -156.525191645863,20.9848701637724,0 -156.597439619788,21.0410647054158,0 -156.653636007318,21.0169850495629,0 -156.693782634023,20.9126240100612,0 -156.637586604165,20.8082609120439,0 -156 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g872">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-157.039050670938,20.928706972385,0 -157.055098211979,20.880538425907,0 -156.982826322974,20.8323776268078,0 -156.990863465776,20.7922371514621,0 -156.96676559866,20.7280207316388,0 -156.886487178396,20.7360494091678,0 -156.814225697816,20.7922527172797,0 -156.806205341549,20.8404186121726,0 -156.910585845163,20.9287186176943,0 -157.039050670938,20.928706972385,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g873">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-155.666192321268,18.921786345087,0 -155.537729780537,19.0422106324423,0 -155.521678713445,19.1224845466533,0 -155.304899038619,19.234878398743,0 -155.152372136648,19.2669919638143,0 -155.015881706841,19.3312115354762,0 -154.927581824535,19.4195186485267,0 -154.815187460665,19.4596764207728,0 -154.791096018678,19.5399604106849,0 -154.975762475196,19.6523353631656,0 -154.975763078096,19.7406434419399,0 -155.072105964772,19.7245855257612,0 -155.096185006144,19.8771146284228,0 -155. [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm259">
+		<name>Idaho</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   83343.643</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Idaho</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>16</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mtn</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>ID</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1293953</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     1323472</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          16</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          99</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          43</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Idaho</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>July 3 1890</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1890</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1842</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g892">
+				<coordinates>-114.661865415542,44.3858954726855,0</coordinates>
+			</Point>
+			<Polygon id="g893">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-117.026295220045,43.6790312226004,0 -117.018864363596,41.9947941808341,0 -116.992313337997,41.9947945094663,0 -115.947544658193,41.9945994628996,0 -115.024862911148,41.9965064559528,0 -114.269471632825,41.9959242345073,0 -114.039072662345,41.9953908974688,0 -112.989575449033,42.0011467864027,0 -112.147116504391,41.9990540573659,0 -112.100514491537,42.0023005848578,0 -111.494586313343,42.0001709690538,0 -111.04869741386,41.9962033494069,0 -111.046780328328,42.503251870505,0 -111.0 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm277">
+		<name>Illinois</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   56299.387</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Illinois</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>17</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>IL</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>    12419293</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>    12520522</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         221</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          80</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          21</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Illinois</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 3 1818</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1818</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1720</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g939">
+				<coordinates>-89.20376782672931,40.0640001695085,0</coordinates>
+			</Point>
+			<Polygon id="g940">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-88.0715914713672,37.5110386032244,0 -88.134202057652,37.5836204217666,0 -88.15766418948979,37.628526559458,0 -88.159404386901,37.6607335395919,0 -88.1336703044624,37.7007907786447,0 -88.0725039638053,37.7354461998767,0 -88.0356073439534,37.8057279050194,0 -88.0860624224551,37.8176568675887,0 -88.0892974561442,37.8312944778462,0 -88.04216892231911,37.8275671956745,0 -88.03427224647881,37.8437911301456,0 -88.0757701619268,37.8678545841173,0 -88.101489939404,37.895351144247,0 -88.10 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm272">
+		<name>Indiana</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   36400.304</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Indiana</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>18</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>IN</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     6080485</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     6138368</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         167</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          85</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          19</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Indiana</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 11 1816</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1816</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1733</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g925">
+				<coordinates>-86.27615732038611,39.9127401204667,0</coordinates>
+			</Point>
+			<Polygon id="g926">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-86.3416058899801,38.1772881494571,0 -86.29767433252459,38.1503040958879,0 -86.29144007500941,38.0784895277861,0 -86.277698957837,38.058172975235,0 -86.2521549356747,38.0407215021446,0 -86.1906216841403,38.0177584307759,0 -86.104986573394,38.0113361451773,0 -86.05271568926411,37.9667844806183,0 -86.0316198158307,37.9929506600364,0 -86.0066633201115,38.0017670737263,0 -85.9585820940509,38.0118406095775,0 -85.93087193559511,38.034048876233,0 -85.9147511151841,38.0648748591422,0 -85. [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm264">
+		<name>Iowa</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   56257.965</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Iowa</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>19</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>IA</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     2926324</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     2941287</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          52</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          95</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          29</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Iowa</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 28 1846</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1846</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1788</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g902">
+				<coordinates>-93.5010908992209,42.0759891389773,0</coordinates>
+			</Point>
+			<Polygon id="g903">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-91.12013244580791,40.7054430853053,0 -91.09289515262361,40.7615871092817,0 -91.08905026959479,40.8337674861069,0 -91.0493536735639,40.8796233416421,0 -90.98341896936651,40.9239649616112,0 -90.96085093423019,40.9505415875963,0 -90.95479391031741,41.0703973298849,0 -90.95792988917549,41.1043932523764,0 -90.9904854657331,41.1444046114074,0 -91.0184022505193,41.1658577458188,0 -91.0564663602341,41.176290257977,0 -91.10167201924359,41.2315519929841,0 -91.10249645615799,41.267848188247 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm283">
+		<name>Kansas</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   82196.955</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Kansas</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>20</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>KS</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     2688418</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     2709422</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          33</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          97</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          34</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Kansas</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Jan. 29 1861</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1861</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1727</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g955">
+				<coordinates>-98.38325723326818,38.4826574728393,0</coordinates>
+			</Point>
+			<Polygon id="g956">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-95.07193109811,37.0014780674299,0 -95.0327450815612,37.0007794392778,0 -94.6203796376912,36.9970468237132,0 -94.6206638676799,37.0601475533797,0 -94.6189775221893,37.3277322857884,0 -94.61876444142401,37.360766482215,0 -94.61899604293861,37.650374321953,0 -94.6192936785187,37.6798689280977,0 -94.6167353371693,38.0303877411189,0 -94.61733032638759,38.055784837357,0 -94.61905349915152,38.3920320272517,0 -94.6187177065389,38.4714737258641,0 -94.6131481947747,38.7372224308096,0 -94.6 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm282">
+		<name>Kentucky</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   40319.791</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Kentucky</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>21</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E S Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>KY</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     4041769</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     4081550</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         100</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          91</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          15</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Kentucky</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>June 1 1792</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1792</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1774</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g952">
+				<coordinates>-85.29036641996581,37.5265035728688,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g953">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-86.5106681729942,36.6550742141329,0 -86.4154436379233,36.6509321366908,0 -86.19899252719389,36.6432906639691,0 -85.9806106782448,36.633112657611,0 -85.78547638470199,36.62668526607,0 -85.43737461759029,36.6181989810276,0 -85.3000946381889,36.6261009236939,0 -85.27249827730731,36.6256168039722,0 -84.9984611962111,36.6209826428203,0 -84.7910568723549,36.6054383594152,0 -84.781870784101,36.6050761598833,0 -84.2567774582751,36.5954983253834,0 -84.2544885948187,36.5954525757939,0 -84 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g954">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-89.53327228843381,36.4981701441748,0 -89.4758977248385,36.4986089858186,0 -89.4817572743346,36.5047581085309,0 -89.47144975338379,36.5256163547986,0 -89.4817497774818,36.5478363630808,0 -89.49320183399099,36.5591771346443,0 -89.5304419073772,36.5646166211264,0 -89.55621466216709,36.5578036567361,0 -89.5682312249958,36.5414695145559,0 -89.56706382630919,36.5187993771114,0 -89.53327228843381,36.4981701441748,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm297">
+		<name>Louisiana</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   45835.844</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Louisiana</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>22</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W S Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>LA</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     4468976</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     4484853</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          97</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          91</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          18</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Louisiana</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Apr. 30 1812</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1812</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1699</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g997">
+				<coordinates>-92.0291541159725,31.0957346447301,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g998">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-93.70752396935821,30.2395787754494,0 -93.71500869987879,30.2205134179473,0 -93.7045256592734,30.1810684459083,0 -93.6963314287414,30.1758843689492,0 -93.6998258674993,30.1510169781729,0 -93.6833076816481,30.1484401694217,0 -93.68612303875779,30.1414613621588,0 -93.69880351731489,30.1414346905316,0 -93.6970869015193,30.1181389021031,0 -93.70854664486501,30.1149499108334,0 -93.71602374974782,30.0958787991307,0 -93.71264390010309,30.0607310199356,0 -93.76036751582601,30.00617640306 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g999">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-92.01636774779772,29.5964783637641,0 -91.8490888327989,29.4870829559889,0 -91.7581129254523,29.4945134800923,0 -91.7649642707533,29.5342538256937,0 -91.7016159510209,29.5772668066965,0 -91.7698472437407,29.578615482821,0 -91.9025489396354,29.6509308946661,0 -92.01636774779772,29.5964783637641,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1000">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-91.34131892626149,29.3419108937759,0 -91.2761625423135,29.25402793048981,0 -91.1283068078309,29.2269993791403,0 -91.13469314485428,29.2599248605,0 -91.1636630060186,29.2452673853848,0 -91.15259233129218,29.2665337371954,0 -91.1950590671176,29.2736729306416,0 -91.20046067885291,29.3079853608587,0 -91.1880244437628,29.2847581611053,0 -91.17122390642319,29.2836766605259,0 -91.16156452373758,29.3237204954792,0 -91.18927563760259,29.2976114923275,0 -91.2265537135592,29.3813995046563, [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1001">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-90.93457446121511,29.2590942309103,0 -90.99895334439211,29.3238000878402,0 -91.0073689638633,29.29754411189,0 -91.12751345160631,29.2935143884148,0 -91.1225616613936,29.2270851971627,0 -91.0555572747286,29.1909157285932,0 -91.06768935479481,29.2531193516372,0 -91.03310393919099,29.2756292528086,0 -91.04444877298839,29.2112586059428,0 -90.9945661692945,29.2248021337252,0 -91.00324045917338,29.1843167033403,0 -90.96202532966269,29.18579944909,0 -90.9449811331143,29.226391967718,0  [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm254">
+		<name>Maine</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   32161.925</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Maine</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>23</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>N Eng</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>ME</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1274923</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     1284576</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          40</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          97</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          23</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Maine</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Mar. 15 1820</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1820</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1624</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g880">
+				<coordinates>-69.2342803140978,45.3894093487898,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g881">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-69.7772762645906,44.0741483198713,0 -69.76675520614469,44.0477322592984,0 -69.8000128595467,44.0268667288672,0 -69.7776729844266,43.7912707228193,0 -69.7503594273371,43.7617041140593,0 -69.724671298031,43.7844771657636,0 -69.7485283916032,43.8933754295128,0 -69.7206355796789,43.9379795478678,0 -69.6129323231589,44.0336128548498,0 -69.65524480155101,43.980249889013,0 -69.6644528704785,43.8522244586918,0 -69.5893265387295,43.844862803005,0 -69.48323307140311,43.8871600746258,0 -69 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g882">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-68.3879209893914,44.3772530708835,0 -68.4028903244654,44.2708014569031,0 -68.3207117037137,44.2250794730622,0 -68.3047050923042,44.2900314435771,0 -68.1647687868107,44.3344957275365,0 -68.238709216076,44.4375633361586,0 -68.35544950530149,44.4288577749373,0 -68.3502537650533,44.3989509513447,0 -68.3879209893914,44.3772530708835,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm280">
+		<name>Maryland</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    9739.872</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Maryland</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>24</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>S Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>MD</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     5296486</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     5362491</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         544</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          52</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           7</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Maryland</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Apr. 28 1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1634</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g945">
+				<coordinates>-76.8193852682105,39.0640555384767,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g946">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-75.7107127327496,38.6496658557662,0 -75.7245906263035,38.8302832999716,0 -75.7525764003551,39.1416603330929,0 -75.7613129328181,39.2478639325384,0 -75.7643192412212,39.2959598236098,0 -75.77235374667779,39.3831185391944,0 -75.7910945763195,39.7238660373362,0 -76.1392231665553,39.7222292808326,0 -76.23312186464131,39.7218535861041,0 -76.56983441657761,39.7202653698966,0 -76.79049160379709,39.7212561436081,0 -76.99681222135089,39.7208916577077,0 -77.2210508745187,39.7206793349451, [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g947">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-76.2928041305598,38.9078367280903,0 -76.27318950163161,38.9493434073476,0 -76.246408808548,38.9236940972491,0 -76.2478217695177,38.9790095805696,0 -76.2994902315763,39.0407073059323,0 -76.3564746271561,38.958299911005,0 -76.37524061903341,38.8542185416326,0 -76.32938725969851,38.8760038237182,0 -76.3422215756121,38.9241707280608,0 -76.3223079602806,38.9122005623908,0 -76.31412982025771,38.9420383665643,0 -76.3387433583291,38.9567741081102,0 -76.2941866944134,38.9676801350473,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g948">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-75.0679246646819,38.4500753640855,0 -75.0873204261931,38.3230592800575,0 -75.0456230125111,38.4496021608759,0 -75.0679246646819,38.4500753640855,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g949">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-75.2703576848931,38.0277091732938,0 -75.2422192799713,38.0286475070447,0 -75.17281187763599,38.1243063358622,0 -75.0940269654088,38.3203165911443,0 -75.164373449629,38.2049624515,0 -75.2093886849695,38.0942969089551,0 -75.2440961931471,38.0380238346228,0 -75.2703576848931,38.0277091732938,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm265">
+		<name>Massachusetts</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    8172.561</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Massachusetts</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>25</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>N Eng</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>MA</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     6349097</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     6406858</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         777</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          31</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           6</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Massachusetts</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Feb. 6 1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1620</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g904">
+				<coordinates>-71.80258992883,42.2568345174596,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g905">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-71.31932779027051,41.7721958646078,0 -71.2666285816007,41.7497430522047,0 -71.22897615917781,41.7076939683673,0 -71.1988086806704,41.6785003452843,0 -71.1412126344661,41.6552730544524,0 -71.1171327154705,41.4930619563068,0 -71.0011847867691,41.5201241035125,0 -70.8921284437165,41.6339125917583,0 -70.8394306808208,41.6266919415081,0 -70.6197608834614,41.7356361919149,0 -70.6648878020878,41.5561271066309,0 -70.6371390963447,41.5398046803128,0 -70.43291891916461,41.569755900056,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g906">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-70.6043308335024,41.4296630739879,0 -70.60584217854981,41.4746632583726,0 -70.66748797346899,41.4549372973785,0 -70.7517695470512,41.3821690323835,0 -70.77092662880651,41.3249804137282,0 -70.78252415013171,41.352517678155,0 -70.8439198398732,41.3485988852067,0 -70.7697130665689,41.298163904796,0 -70.7386765301454,41.3341551752324,0 -70.486141190082,41.3415610204116,0 -70.5151571489217,41.3986601230011,0 -70.575857359437,41.4102856936161,0 -70.5528317397027,41.4173887728697,0 -70 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g907">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-70.03171640756911,41.3119311871487,0 -70.09787203770659,41.2776309471401,0 -70.2070964296735,41.2940877852649,0 -70.21326869354419,41.270204935144,0 -70.10310570522719,41.2382796862047,0 -69.96844433867869,41.2518167689829,0 -69.96598006456441,41.2948911801898,0 -70.04926441844221,41.3919612498596,0 -70.0344859690813,41.3497184956242,0 -70.0876332277476,41.2968486962802,0 -70.0266199082301,41.3372104301762,0 -70.00650844928499,41.3247747653595,0 -70.03171640756911,41.3119311871487,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm299">
+		<name>Michigan</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   57899.398</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Michigan</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>26</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>MI</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     9938444</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     9997284</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         172</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          85</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          26</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Michigan</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Jan. 26 1837</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1837</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1668</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g1010">
+				<coordinates>-85.4386025294334,44.3365484429102,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g1011">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-88.4975275282269,48.1737953051637,0 -89.1560989935608,47.93922809600121,0 -89.20178730153791,47.883856943529,0 -89.19291626356561,47.8446133573585,0 -89.1398848301356,47.8240760135492,0 -89.0286226647864,47.8506552310947,0 -88.9015476276433,47.9602485109714,0 -88.62532706800501,48.0331676704744,0 -88.4975275282269,48.1737953051637,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1012">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-88.50068113271711,47.2901802187495,0 -88.5956323026243,47.243592963422,0 -88.59426204335659,47.1347650286244,0 -88.47066419275591,47.1114725925833,0 -88.4128433970392,46.9880945574411,0 -88.2222796851962,47.20075228444591,0 -87.9170421798346,47.35800703474979,0 -87.73751047538521,47.3930248530549,0 -87.70438353060609,47.4159502393094,0 -87.78812041255949,47.4707930407946,0 -88.2113917997532,47.4478349809783,0 -88.43790109187169,47.35589615672669,0 -88.50068113271711,47.2901802187495,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1013">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-85.8598446689146,45.9694694332197,0 -85.6553812556068,45.9728707038144,0 -85.5095462997763,46.10191144051079,0 -85.378242862305,46.1000474968113,0 -85.0616297207559,46.0247516443713,0 -84.8510998289,45.8906367080231,0 -84.7317322269644,45.85567967180521,0 -84.68902263973691,46.0359181647936,0 -84.6168451285152,46.0382300997572,0 -84.50163489117131,45.9783426043905,0 -84.35448508342451,45.99919002614029,0 -84.1132725571978,45.97853868939439,0 -83.9064607016374,45.9602396119094,0  [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1014">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-83.8546801700959,46.0140316422695,0 -83.8858916672003,45.9708524498185,0 -83.8528104836337,45.9974492109717,0 -83.804881070028,45.936764510125,0 -83.629704837753,45.9535961546271,0 -83.57981373770861,45.9175013541361,0 -83.5161593405338,45.9257147658035,0 -83.4731894201386,45.987547805609,0 -83.5339910274221,46.0117900707978,0 -83.58949805959941,46.0885184421793,0 -83.6498875534141,46.1039714892754,0 -83.732448534534,46.08410814655849,0 -83.68031444287379,46.07179455246539,0 -83 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g1015">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-86.8348296412819,41.7655047552312,0 -86.5251809764443,41.7655403363901,0 -86.2345652919433,41.7648642479853,0 -86.0683022053847,41.7646284325784,0 -85.79922697228621,41.7635349679273,0 -85.65945882918869,41.7626275140628,0 -85.29720963584781,41.7635810035748,0 -85.1931406144237,41.7628675471372,0 -84.8260080463026,41.7618751066694,0 -84.7884777858482,41.7609594561938,0 -84.79037747295131,41.6974947329852,0 -84.38439324270421,41.7071503370832,0 -84.35920849224161,41.7080391705922 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm261">
+		<name>Minnesota</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    84520.49</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Minnesota</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>27</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>MN</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     4919479</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     4992492</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          58</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          95</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          32</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Minnesota</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>May 11 1858</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1858</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1805</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g896">
+				<coordinates>-94.3059456842785,46.315646568988,0</coordinates>
+			</Point>
+			<Polygon id="g897">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-91.7303661652997,43.4995717605756,0 -91.61109897494811,43.5006261853338,0 -91.22356677965871,43.5008086595185,0 -91.2405580213774,43.5487125887566,0 -91.23298990442041,43.5988900700786,0 -91.25838918935199,43.6773222933277,0 -91.2589159418758,43.722395792303,0 -91.25110489264939,43.7880757984421,0 -91.2919479787799,43.8471907610578,0 -91.37335730440661,43.9471911008781,0 -91.42590181819401,43.9856198570706,0 -91.5284201557391,44.0342152895652,0 -91.5691620630017,44.0349552968239, [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm293">
+		<name>Mississippi</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   47618.965</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Mississippi</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>28</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E S Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>MS</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     2844658</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     2871527</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          60</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          95</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          20</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Mississippi</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 10 1817</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1817</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1699</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g987">
+				<coordinates>-89.6640053796168,32.7591641085257,0</coordinates>
+			</Point>
+			<Polygon id="g988">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-88.4508031165511,31.4356176907354,0 -88.465096841429,31.7022450293789,0 -88.4729519210596,31.8888768167036,0 -88.4377242279507,32.2277556143888,0 -88.4257919971009,32.3092243032455,0 -88.3938325168417,32.5804702260594,0 -88.3480414662251,32.9247582205318,0 -88.33946633175739,32.9874972113755,0 -88.3048295831961,33.2888943469818,0 -88.2745866910838,33.5388014650338,0 -88.24819560524909,33.7427263969428,0 -88.20264467082561,34.0591222846376,0 -88.19934924265689,34.0904480664289,0 - [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm285">
+		<name>Missouri</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   69832.746</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Missouri</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>29</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>MO</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     5595211</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     5646796</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          80</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          93</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          24</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Missouri</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Aug. 10 1821</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1821</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1735</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g961">
+				<coordinates>-92.4801886377418,38.3639901274756,0</coordinates>
+			</Point>
+			<Polygon id="g962">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-89.1050338653654,36.9539220770253,0 -89.1072162055416,36.9775040571059,0 -89.1299298602513,36.9881656914537,0 -89.1935842098097,36.9868222806571,0 -89.2101262118458,37.0290237051986,0 -89.2377536103058,37.0417835282019,0 -89.26413039669779,37.0871742876795,0 -89.28431079352841,37.0912941061444,0 -89.30336936544271,37.0854347008365,0 -89.3097775142834,37.0609596218128,0 -89.26431960659031,37.0277834462293,0 -89.26207602720631,37.0087367322465,0 -89.28284342367,36.9992571418446,0 - [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm253">
+		<name>Montana</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>  147244.653</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Montana</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>30</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mtn</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>MT</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>      902195</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>      908325</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>           6</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>         100</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          41</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Montana</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Nov. 8 1889</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1889</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1809</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g878">
+				<coordinates>-109.652533686894,47.0322664572934,0</coordinates>
+			</Point>
+			<Polygon id="g879">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-111.475425113078,44.7021622259545,0 -111.44363207933,44.7131796185895,0 -111.395084047622,44.7088695111883,0 -111.384959585063,44.7376939086963,0 -111.372309536392,44.7450870429474,0 -111.349977174405,44.7261775679182,0 -111.31922172667,44.7278640397875,0 -111.315475367488,44.7051930233212,0 -111.295668417103,44.6829380106443,0 -111.270207923466,44.6738019972086,0 -111.270665480153,44.6422120666433,0 -111.223971342305,44.6269081075219,0 -111.219797798385,44.6179816965382,0 -111.2 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm266">
+		<name>Nebraska</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   77330.258</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Nebraska</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>31</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>NE</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1711263</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     1722445</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          22</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          98</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          37</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Nebraska</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Mar. 1 1867</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1867</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1823</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g908">
+				<coordinates>-99.8078006001403,41.5231582790057,0</coordinates>
+			</Point>
+			<Polygon id="g909">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-101.407393337781,40.0010037120327,0 -101.32214863482,40.0018210447365,0 -100.754855877507,40.000198282162,0 -100.735049472397,39.9991723116564,0 -100.191111650703,40.0005855247365,0 -100.180910663243,40.0004787238625,0 -99.6278593903364,40.0029878613976,0 -99.1782010360044,39.9995770488454,0 -99.06474699472069,39.9983379848291,0 -98.72063235128408,39.9984613082759,0 -98.5044791617254,39.9971296815045,0 -98.264165776521,39.9984347815801,0 -97.9295887050275,39.9984528583572,0 -97.8 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm273">
+		<name>Nevada</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>  110669.975</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Nevada</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>32</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mtn</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>NV</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1998257</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     2112980</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          18</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          98</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          36</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Nevada</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Oct. 31 1864</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1864</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1849</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g927">
+				<coordinates>-116.650735151808,39.3520158009473,0</coordinates>
+			</Point>
+			<Polygon id="g928">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-119.152450421001,38.4118009590513,0 -118.417419755966,37.886676748621,0 -117.838686423167,37.4572982397149,0 -117.160423771838,36.9595941441766,0 -115.885769343921,36.0012259572722,0 -115.626197382816,35.7956983148418,0 -114.621068606189,34.9989144286133,0 -114.633779872695,35.0418633504303,0 -114.595631971944,35.0760579746697,0 -114.6359090842,35.1186557767895,0 -114.626440825485,35.1339067529871,0 -114.582616239058,35.1325604694084,0 -114.572255261053,35.1400677445931,0 -114.56 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm263">
+		<name>New Hampshire</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    9259.527</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>New Hampshire</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>33</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>N Eng</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>NH</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1235786</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     1258315</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         133</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          88</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           9</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>New Hampshire</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>June 21 1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1623</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g900">
+				<coordinates>-71.577769589032,43.6851910338169,0</coordinates>
+			</Point>
+			<Polygon id="g901">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-72.2799169173511,42.720467037784,0 -71.9302165845551,42.7072094199587,0 -71.90094191420261,42.7053786149513,0 -71.287194447592,42.6986034465098,0 -71.2524115796458,42.7260689220942,0 -71.24047922287529,42.7435552404171,0 -71.1863474665185,42.7387606265609,0 -71.18106084331041,42.807317168902,0 -71.12060440995749,42.8182808692669,0 -71.065564728038,42.8043197291356,0 -71.02542615731881,42.8511713651458,0 -70.9213361332524,42.885149233192,0 -70.8981116667382,42.8868774762984,0 -70. [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm271">
+		<name>New Jersey</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    7507.502</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>New Jersey</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>34</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mid Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>NJ</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     8414350</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     8504437</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>        1121</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>           0</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           3</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>New Jersey</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 18 1787</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1787</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1660</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g923">
+				<coordinates>-74.6766277762304,40.1983130309155,0</coordinates>
+			</Point>
+			<Polygon id="g924">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-75.4892806606894,39.7148582186458,0 -75.5702341870436,39.6177349634268,0 -75.516688883565,39.5665684164947,0 -75.55276304016741,39.4905143065581,0 -75.4156722746602,39.3749718418896,0 -75.11995811220299,39.1846917807584,0 -75.0144070769606,39.1983638371173,0 -74.91665434173351,39.1706385416843,0 -74.8902020440427,39.1138602238713,0 -74.9681254179213,38.9717387716416,0 -74.87630095715041,38.956682397615,0 -74.8792536134529,38.9898436138584,0 -74.80229182967069,39.026373568453,0 -7 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm291">
+		<name>New Mexico</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>  121757.343</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>New Mexico</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>35</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mtn</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>NM</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1819046</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     1839139</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          15</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          99</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          47</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>New Mexico</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Jan. 6 1912</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1912</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1610</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g983">
+				<coordinates>-106.102403151381,34.4234110071301,0</coordinates>
+			</Point>
+			<Polygon id="g984">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-109.049495308693,32.4420444958635,0 -109.045615049533,31.3434530504803,0 -108.210647795015,31.3438536159949,0 -108.203254915468,31.7869032382901,0 -107.283567177026,31.7850830856735,0 -106.539514775671,31.7863052774039,0 -106.614986549809,31.8178343839605,0 -106.61612370633,31.8447405331725,0 -106.64407909206,31.8952054369513,0 -106.633748923526,31.9141010099202,0 -106.632605287073,31.97221998842531,0 -106.650061890884,31.9803297275266,0 -106.623625658904,32.0010887853062,0 -106. [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm267">
+		<name>New York</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   48561.751</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>New York</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>36</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mid Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>NY</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>    18976457</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>    19123358</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         391</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          65</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          11</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>New York</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>July 26 1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1614</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g910">
+				<coordinates>-75.51225742270179,42.9466608265549,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g911">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-79.7632349654056,42.2673270883975,0 -79.76165964707261,42.0031057341519,0 -79.6123674903386,42.0005849142235,0 -79.0594888967335,42.0011576593905,0 -78.9185382675857,41.999846787447,0 -78.3050882311977,41.999420608423,0 -78.2042620524614,41.9982004349665,0 -77.745007937534,41.9973331826449,0 -77.6128475772834,41.9988295851283,0 -76.96857370314299,42.0029809748211,0 -76.92839533835389,42.0025345979743,0 -76.5639147893755,42.0030114109064,0 -76.1450203202792,42.0006545080767,0 -76 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g912">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-73.7522089773056,40.5945872168727,0 -73.4225260722185,40.6613251474997,0 -72.5211641762305,40.8150415787904,0 -71.9187022869602,41.0305740631358,0 -71.869986721423,41.0745076818864,0 -71.92370021338689,41.084871803273,0 -72.07701114487909,41.0005742896832,0 -72.20335052497531,41.0353739275596,0 -72.29308242777471,41.0240174407749,0 -72.4761091088628,40.9201483179884,0 -72.60481541607391,40.9053005940406,0 -72.5509712260717,40.9661799196018,0 -72.4163456562061,41.0260401128234,0  [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g913">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-73.2930589706138,40.6263822132856,0 -73.2490511730599,40.6254244342199,0 -73.03093394571719,40.6713410120228,0 -72.9563156920831,40.7000387409497,0 -72.7640253118572,40.7583922849051,0 -72.7573264947801,40.7679595170533,0 -72.7821991206641,40.7641333101321,0 -72.8769060551186,40.7373463357701,0 -73.05102282397201,40.6751671223298,0 -73.240437212291,40.6330765843302,0 -73.2911438669417,40.6330768861726,0 -73.2930589706138,40.6263822132856,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g914">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-74.23693964924441,40.5060032905632,0 -74.1936418338484,40.510561942058,0 -74.12299972778629,40.5447412254891,0 -74.0591936862929,40.6017089956228,0 -74.07286605953171,40.6495633368533,0 -74.1662980145054,40.6244971306027,0 -74.2369398627783,40.5379049676837,0 -74.23693964924441,40.5060032905632,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm288">
+		<name>North Carolina</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   49048.024</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>North Carolina</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>37</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>S Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>NC</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     8049313</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     8225753</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         164</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          85</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          12</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>North Carolina</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Nov. 21 1789</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1789</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1660</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g967">
+				<coordinates>-79.4013155346895,35.5472650672799,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g968">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-83.9884542500545,34.9891518047362,0 -83.93789913149431,34.9894775119032,0 -83.5492972918908,34.9896284845873,0 -83.5128876420542,34.9921157535224,0 -83.1061569738507,35.000366708131,0 -83.0071465788827,35.0242932065357,0 -82.8875562556649,35.055473206413,0 -82.7712011457841,35.0855376628965,0 -82.6972082635003,35.0913494747721,0 -82.6878846328013,35.0979182706584,0 -82.6859002249553,35.1215804311176,0 -82.65434412549401,35.1195740504075,0 -82.5698759075391,35.1496073738685,0 -82 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g969">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-76.0268192353758,36.5568700359695,0 -75.97593627376701,36.5180793801967,0 -75.9769275698946,36.4781707412753,0 -75.92445033891821,36.4741316082296,0 -75.9115647487463,36.5426843995728,0 -75.9983147031585,36.5568053577451,0 -76.0268192353758,36.5568700359695,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g970">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-75.90163103703659,36.5563523255124,0 -75.7828060806813,36.2253555177264,0 -75.7404920642807,36.0504887346377,0 -75.7023588136975,36.050028033628,0 -75.5445786711917,35.7885380495047,0 -75.77278830494819,36.2294182919327,0 -75.877811084643,36.5560283058652,0 -75.90163103703659,36.5563523255124,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g971">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-75.4908240267188,35.6706779442836,0 -75.4750201903482,35.5646750837636,0 -75.52108025462761,35.2815348139534,0 -75.6911717207235,35.2351648510944,0 -75.7488987595512,35.1900017864003,0 -75.52589357232451,35.2280944215419,0 -75.4565804266586,35.6175774238916,0 -75.5332327857941,35.7690344819007,0 -75.4908240267188,35.6706779442836,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g972">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-76.0166279556301,35.0696051226092,0 -76.0024976111832,35.0696053699945,0 -75.90356247916451,35.1326642006003,0 -75.811150308907,35.1641942791106,0 -75.76331155591871,35.1924582338,0 -75.85354935458651,35.1674551809437,0 -75.97531321026131,35.1163551414779,0 -76.0166279556301,35.0696051226092,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g973">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-76.5439188750827,34.5879943309158,0 -76.4689040756159,34.6934466158692,0 -76.2873389732944,34.8771752332838,0 -76.37431856243209,34.8130336904105,0 -76.43193837858991,34.7608479437727,0 -76.484125508936,34.697795135324,0 -76.53739566964271,34.6140864557391,0 -76.5547914497339,34.6108248279411,0 -76.5439188750827,34.5879943309158,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm255">
+		<name>North Dakota</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   70812.056</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>North Dakota</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>38</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>ND</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>      642200</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>      639099</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>           9</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          99</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          39</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>North Dakota</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Nov. 2 1889</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1889</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1812</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g883">
+				<coordinates>-100.470755004497,47.44607757471681,0</coordinates>
+			</Point>
+			<Polygon id="g884">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-98.7304369014178,45.938271038568,0 -98.0147097100399,45.9314979679384,0 -97.97872180427929,45.9308221521123,0 -97.2333099148663,45.9365026737778,0 -96.56692152993792,45.9341104552974,0 -96.56180218014301,45.947683082204,0 -96.57621526476891,46.0212796299197,0 -96.5519309951806,46.0955288981098,0 -96.5711660882375,46.1771746587376,0 -96.58789029848551,46.1919183501241,0 -96.586456172813,46.2154130412247,0 -96.59818306918299,46.2386825873787,0 -96.60207424773671,46.3363242033822,0  [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm276">
+		<name>Ohio</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   41193.957</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Ohio</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>39</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>OH</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>    11353140</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>    11381725</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         276</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          75</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          17</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Ohio</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Mar. 1 1803</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1803</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1788</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g937">
+				<coordinates>-82.78739067313241,40.2875354201742,0</coordinates>
+			</Point>
+			<Polygon id="g938">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-83.2727548748104,38.6092569222626,0 -83.24501356062839,38.6241723630441,0 -83.1819390743195,38.6098410346599,0 -83.1431499750977,38.6193396966029,0 -83.11124311365749,38.6648333651597,0 -83.0608799170539,38.6857264630017,0 -83.0269434347116,38.7145119991138,0 -82.97248310332699,38.7196429959584,0 -82.9213038087217,38.7464144846546,0 -82.8903122480228,38.7427754690297,0 -82.8731911677823,38.7190064779649,0 -82.880011744564,38.6833013226062,0 -82.8600294858941,38.6523951466567,0 -8 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm287">
+		<name>Oklahoma</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   70003.325</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Oklahoma</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>40</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W S Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>OK</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     3450654</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     3477711</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          49</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          96</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          46</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Oklahoma</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Nov. 16 1907</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1907</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1889</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g965">
+				<coordinates>-97.50945859429611,35.583978004302,0</coordinates>
+			</Point>
+			<Polygon id="g966">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-94.4393221493475,34.9291508772006,0 -94.4285520120899,35.4005462695086,0 -94.46848521103668,35.6410882624306,0 -94.48593482605899,35.7603104941298,0 -94.5424172738563,36.1068358038929,0 -94.55311361988042,36.1645252110653,0 -94.60745283215459,36.4787903547,0 -94.6172570958511,36.4894141614003,0 -94.6210734035526,36.670542870082,0 -94.6216844155007,36.7636077108139,0 -94.6203796376912,36.9970468237132,0 -95.0327450815612,37.0007794392778,0 -95.07193109811,37.0014780674299,0 -95.40 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm262">
+		<name>Oregon</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   97073.594</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Oregon</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>41</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Pacific</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>OR</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     3421399</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     3470714</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          35</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          97</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          33</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Oregon</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Feb. 14 1859</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1859</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1811</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g898">
+				<coordinates>-120.55462738557,43.9315095486322,0</coordinates>
+			</Point>
+			<Polygon id="g899">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-121.441508911406,41.9943345308753,0 -120.871908519109,41.9876721779537,0 -119.993459369715,41.9892049531992,0 -119.351692186077,41.9888529749781,0 -119.3109421304,41.989135387281,0 -118.185316829038,41.9966370981387,0 -117.018864363596,41.9947941808341,0 -117.026295220045,43.6790312226004,0 -117.023794477971,43.7537015926794,0 -117.037117330473,43.800141963624,0 -117.027626548295,43.8315678483138,0 -117.010505344258,43.8397697264411,0 -117.016220426787,43.8529724419634,0 -116.985 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm268">
+		<name>Pennsylvania</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   45360.118</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Pennsylvania</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>42</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mid Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>PA</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>    12281054</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>    12295580</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         271</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          76</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           2</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Pennsylvania</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 12 1787</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1787</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1682</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g915">
+				<coordinates>-77.80284541879691,40.8748890585198,0</coordinates>
+			</Point>
+			<Polygon id="g916">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-77.4757933985606,39.7196232012639,0 -77.46443302065821,39.7200734721353,0 -77.2210508745187,39.7206793349451,0 -76.99681222135089,39.7208916577077,0 -76.79049160379709,39.7212561436081,0 -76.56983441657761,39.7202653698966,0 -76.23312186464131,39.7218535861041,0 -76.1392231665553,39.7222292808326,0 -75.7910945763195,39.7238660373362,0 -75.77492719598079,39.7245527846646,0 -75.7455920038355,39.7749293983367,0 -75.6947708516454,39.8204574523468,0 -75.6439943147472,39.8383065472094, [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm270">
+		<name>Rhode Island</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    1044.881</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Rhode Island</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>44</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>N Eng</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>RI</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1048319</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     1060126</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>        1003</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          11</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          13</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Rhode Island</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>May 29 1790</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1790</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1636</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g919">
+				<coordinates>-71.5610444257682,41.6817724921721,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g920">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-71.7901942031214,41.6013068793249,0 -71.80274343080561,41.4158290540058,0 -71.8459956537022,41.4038545416488,0 -71.8368696812943,41.3419614666217,0 -71.8477722040922,41.3253484832964,0 -71.86667844289499,41.3227696452715,0 -71.7222643227053,41.3272643121839,0 -71.4898880400565,41.3920853196251,0 -71.427318519639,41.4866893796323,0 -71.4192468515383,41.652212232924,0 -71.3690125475302,41.703291101903,0 -71.39358059765451,41.7611558353253,0 -71.3673874451962,41.7413502009833,0 -71 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g921">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-71.1988086806704,41.6785003452843,0 -71.19993716526071,41.4633184834306,0 -71.1171327154705,41.4930619563068,0 -71.1412126344661,41.6552730544524,0 -71.1988086806704,41.6785003452843,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g922">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-71.26916945491151,41.6212683171833,0 -71.34952503325521,41.4458577414548,0 -71.2880071528611,41.4836193369166,0 -71.23867323404551,41.4748497781272,0 -71.219446800556,41.635642312712,0 -71.26916945491151,41.6212683171833,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm295">
+		<name>South Carolina</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   30867.398</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>South Carolina</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>45</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>S Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>SC</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     4012012</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     4077608</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         130</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          88</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>           8</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>South Carolina</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>May 23 1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1670</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g992">
+				<coordinates>-80.9010200865815,33.9187422703577,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g993">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-81.7595935205582,33.1953809754874,0 -81.76340826403511,33.1698348857377,0 -81.740374666284,33.1446970762157,0 -81.7042792512713,33.1229388681766,0 -81.610962223749,33.087875452303,0 -81.59582519226061,33.07079003117,0 -81.56003498198071,33.0608149350319,0 -81.54765985031411,33.0436837254085,0 -81.5296007135576,33.0439278437875,0 -81.50874915476361,33.0127933490709,0 -81.49273484682441,33.0048133137248,0 -81.4978997781492,32.9596759183359,0 -81.509839970123,32.9554188973732,0 -81 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g994">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-80.76780496320789,32.2586481788875,0 -80.81926682117491,32.1046981906837,0 -80.6666165553831,32.2201132440769,0 -80.7190834927722,32.2722047351394,0 -80.76780496320789,32.2586481788875,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm256">
+		<name>South Dakota</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   77195.055</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>South Dakota</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>46</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>SD</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>      754844</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>      761023</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          10</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          99</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          40</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>South Dakota</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Nov. 2 1889</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1889</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1859</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g885">
+				<coordinates>-100.235288914651,44.4333181443813,0</coordinates>
+			</Point>
+			<Polygon id="g886">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-102.788384569614,42.9953035756879,0 -102.086700926634,42.9898870255377,0 -101.231737199277,42.986842959129,0 -100.198142131775,42.9910950186342,0 -99.5327903284941,42.9923349632849,0 -99.2539717111969,42.9923894733936,0 -98.49765138471959,42.9917787984063,0 -98.45744405402161,42.9371607787996,0 -98.39120469509791,42.9201358627386,0 -98.31033957471961,42.881794760613,0 -98.16782662350252,42.839571032558,0 -98.14486904619621,42.8357947189847,0 -98.12311692331768,42.8202235933653,0  [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm289">
+		<name>Tennessee</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   42091.813</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Tennessee</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>47</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E S Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>TN</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     5689283</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     5773929</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         135</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          88</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          16</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Tennessee</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>June 1 1796</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1796</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1769</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g974">
+				<coordinates>-86.33406700652679,35.8467078879312,0</coordinates>
+			</Point>
+			<Polygon id="g975">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-83.9546078411811,35.4555443092538,0 -83.9099126259032,35.4765642431448,0 -83.88112540362761,35.5106719867731,0 -83.8300980940741,35.519149329024,0 -83.77577472166,35.5526929432439,0 -83.6727662732265,35.5650623686071,0 -83.6137506282731,35.5718308753539,0 -83.56092262748621,35.5552687853695,0 -83.5056836752714,35.5596454175324,0 -83.4581731409302,35.5973733030352,0 -83.38697214372481,35.625313192169,0 -83.34290282423361,35.6533554944088,0 -83.2982915815667,35.6564233114235,0 -83. [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm290">
+		<name>Texas</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>  264435.873</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Texas</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>48</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>W S Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>TX</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>    20851820</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>    21355648</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          79</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          93</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          28</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Texas</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Dec. 29 1845</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1845</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1682</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g976">
+				<coordinates>-99.35209639268049,31.4911603586956,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g977">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-105.998886788462,31.3939400532755,0 -105.770249888887,31.1709088557221,0 -105.603733779011,31.0865586055778,0 -105.554896847903,30.9984186198314,0 -105.409575297759,30.9026451075813,0 -105.390821398517,30.8532172879141,0 -105.314288579451,30.8166446407658,0 -105.288103873955,30.8320861368967,0 -105.258691517007,30.7977908877393,0 -105.214844038146,30.8122235644227,0 -105.061059930982,30.6880108106866,0 -104.99803900743,30.6844748196833,0 -104.98742571177,30.6414670328309,0 -104. [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g978">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-94.9136282621775,29.2578100398598,0 -95.1056216301692,29.097200689859,0 -94.7486000214909,29.3197268614603,0 -94.76757511948669,29.3426867459739,0 -94.9136282621775,29.2578100398598,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g979">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-96.3981329846783,28.3461287087049,0 -96.4228065972943,28.3917207565152,0 -96.46330511935079,28.3261156347832,0 -96.5323911551759,28.3185285307139,0 -96.73916908683449,28.1838232573772,0 -96.80410430551582,28.1724500303063,0 -96.8348893723486,28.0666156829267,0 -96.3981329846783,28.3461287087049,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g980">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-96.9402302798725,28.0462270302125,0 -96.9732659036783,28.0011489857445,0 -96.9496523808798,27.984822817519,0 -97.0246956229941,27.9146817066477,0 -97.04987231164419,27.8412581171011,0 -96.85406998557561,28.0496963225627,0 -96.8376894806861,28.102132800665,0 -96.87268627929731,28.1316953484598,0 -96.9402302798725,28.0462270302125,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g981">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-97.35938018577079,27.2840405219699,0 -97.22398277664181,27.5743234820277,0 -97.0538319312447,27.8307777532106,0 -97.11330369706262,27.8195211793271,0 -97.07556056160431,27.8115793410343,0 -97.1704476930157,27.7077710590242,0 -97.20384878985288,27.6123791179091,0 -97.258949516966,27.6520617389151,0 -97.24893903086139,27.5814491265614,0 -97.3357694916682,27.4411382648402,0 -97.3763559674414,27.2849654048289,0 -97.37964318959401,27.2107771788891,0 -97.35938018577079,27.2840405219699,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g982">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-97.3013873602593,26.6013653134077,0 -97.278803221449,26.54030732592871,0 -97.26750343475641,26.4792510973309,0 -97.2515039997564,26.419651853089,0 -97.2265626157341,26.3489005354442,0 -97.2091667971749,26.2508939353731,0 -97.1795864974542,26.0722765736308,0 -97.17204837189529,26.0780766616552,0 -97.1952427262928,26.2595930779644,0 -97.2323612890346,26.4184902532441,0 -97.29609239794908,26.60101247555321,0 -97.35828321012912,26.8029999986179,0 -97.38159323348002,26.9493542503129, [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm274">
+		<name>Utah</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   84871.909</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Utah</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>49</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mtn</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>UT</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     2233169</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     2282755</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          26</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          98</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          45</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Utah</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Jan. 4 1896</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1896</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1847</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g929">
+				<coordinates>-111.676053595522,39.3225122931614,0</coordinates>
+			</Point>
+			<Polygon id="g930">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-114.047272999176,38.1376524399918,0 -114.047260595159,37.5984784866001,0 -114.043939384154,36.9965379371421,0 -112.899983474169,36.9962268765574,0 -112.542521578828,36.9979944864436,0 -112.2372578615,36.9954921751891,0 -111.356163994142,37.0017097524257,0 -110.740062961138,37.002488042411,0 -110.484088956249,37.0039260237973,0 -110.452235819472,36.9917463039985,0 -109.997076712711,36.9920675592929,0 -109.048480115363,36.9966409005893,0 -109.045602480021,37.6308206068713,0 -109.04 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm260">
+		<name>Vermont</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>    9603.272</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Vermont</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>50</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>N Eng</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>VT</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>      608827</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>      615035</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          63</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          94</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          14</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Vermont</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Mar. 4 1791</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1791</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1724</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g894">
+				<coordinates>-72.660656242184,44.072240587832,0</coordinates>
+			</Point>
+			<Polygon id="g895">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-73.2580598287651,42.7460586400616,0 -73.0196951738304,42.7403966786337,0 -72.92299742922531,42.7373644761782,0 -72.4557700038868,42.7258525290855,0 -72.4621713056893,42.7468405310802,0 -72.4793225257782,42.7615879021402,0 -72.50726952905301,42.7687326904009,0 -72.5130680088012,42.7892594013534,0 -72.538916970841,42.8077338159119,0 -72.5534284639708,42.8606431711067,0 -72.5248100213574,42.9126141761107,0 -72.5202170578448,42.9516725271887,0 -72.5042636319545,42.9655846501003,0 -72 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm284">
+		<name>Virginia</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   39819.882</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Virginia</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>51</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>S Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>VA</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     7078515</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     7203904</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>         178</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          84</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          10</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Virginia</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>June 25 1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1788</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1607</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g957">
+				<coordinates>-78.85159444011779,37.5186355576459,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g958">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-79.1440627705841,36.5461983712091,0 -78.7964284068279,36.5436739120265,0 -78.73711601969831,36.5462146723402,0 -78.45852951752001,36.5416234739225,0 -78.320969632811,36.5456755672774,0 -78.05138167562831,36.5526213891494,0 -77.89856872882319,36.553092111532,0 -77.7636386364742,36.5535891128352,0 -77.3197463656757,36.5540684074889,0 -77.1770420007847,36.5564375496145,0 -76.92381636627491,36.5542979883089,0 -76.92131386587209,36.554309439951,0 -76.5632556818254,36.5554041975692,0  [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g959">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-75.2703576848931,38.0277091732938,0 -75.346327896565,37.918920332121,0 -75.378212765399,37.9010985070504,0 -75.3444511672005,37.9020368659196,0 -75.385720705723,37.8757771334347,0 -75.33882056571559,37.8889069720989,0 -75.2984965865935,37.9629981027088,0 -75.2422192799713,38.0286475070447,0 -75.2703576848931,38.0277091732938,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g960">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-75.86702474819541,37.5523144055129,0 -75.9304116573134,37.5570210112286,0 -75.9543606031818,37.5219645287005,0 -75.9651025972256,37.4794849231046,0 -75.934103509734,37.4847761076545,0 -76.0181268821546,37.3089179962228,0 -75.9706381994593,37.126374539951,0 -75.9310399788387,37.1426441413889,0 -75.89676220343181,37.3675306353841,0 -75.8263260377899,37.4182847768698,0 -75.79042061875479,37.4082451150763,0 -75.8201385645026,37.4263412953845,0 -75.81267774258821,37.4691794212934,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm252">
+		<name>Washington</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   67290.061</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Washington</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>53</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Pacific</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>WA</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     5894121</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     5984144</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          88</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          92</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          42</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Washington</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>Nov. 11 1889</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1889</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1811</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g874">
+				<coordinates>-120.428027450366,47.3767619529735,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g875">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-122.402015585862,48.22521655119059,0 -122.368333031748,48.1281417374007,0 -122.216991980112,48.0074395523983,0 -122.230120864997,47.9691133009971,0 -122.302922293019,47.9502148146411,0 -122.394492319816,47.7741760704507,0 -122.414815251142,47.6641799154458,0 -122.382220450337,47.59540904242241,0 -122.392633724016,47.510242430349,0 -122.319738644767,47.3901148739843,0 -122.325376306437,47.34432342914171,0 -122.420837154063,47.3188444009071,0 -122.44160451791,47.30112502870991,0 - [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g876">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-122.967978342058,48.44379450851021,0 -123.018882894721,48.489605170453,0 -123.022271121816,48.513359682583,0 -122.967980000613,48.52693332233629,0 -123.008698759605,48.5337193215567,0 -123.01209491531,48.5574777421133,0 -123.103721392859,48.6083771191688,0 -123.141053808089,48.6236471212389,0 -123.169899337157,48.5625647146223,0 -123.159719925101,48.52184222365381,0 -123.09523286813,48.479422815339,0 -122.967978342058,48.44379450851021,0 
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g877">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-122.733187500894,48.27664717795621,0 -122.768778263979,48.218818397347,0 -122.695554282422,48.1811852523447,0 -122.608628397127,48.0314307595447,0 -122.544961263666,47.9675310410809,0 -122.471616565863,47.9875090940392,0 -122.442787963967,47.9180562701758,0 -122.386960910805,47.9045490614351,0 -122.355399949048,47.9638860565509,0 -122.379993925152,48.0321462908929,0 -122.49621274531,48.0940709834622,0 -122.546202729793,48.0768581941955,0 -122.610925345361,48.2063213486201,0 -122 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm279">
+		<name>West Virginia</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   24228.552</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>West Virginia</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>54</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>S Atl</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>WV</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     1808344</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     1802611</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          75</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          93</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          35</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>West Virginia</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>June 20 1863</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1863</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1727</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g943">
+				<coordinates>-80.614059565661,38.6412110051568,0</coordinates>
+			</Point>
+			<Polygon id="g944">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-79.2316628792895,38.4804961745132,0 -79.1274272802501,38.6582438834526,0 -79.1210641516119,38.6637673801701,0 -79.088546586161,38.6592052271367,0 -79.0872342316746,38.7072686901771,0 -79.0565552787527,38.7620536715536,0 -79.05480043932219,38.7906328948264,0 -79.03374251686721,38.7999596842489,0 -78.9874530865749,38.8467613817813,0 -78.86656063074361,38.7634041325478,0 -78.81586084106471,38.8337457622327,0 -78.7930553345461,38.8802192733,0 -78.7492528843455,38.9114914729758,0 -78. [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm258">
+		<name>Wisconsin</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   56088.178</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Wisconsin</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>55</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>E N Cen</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>WI</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>     5363675</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>     5408886</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>          96</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>          92</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          30</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Wisconsin</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>May 29 1848</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1848</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1766</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g889">
+				<coordinates>-90.006191227598,44.6331178864174,0</coordinates>
+			</Point>
+			<MultiGeometry>
+				<Polygon id="g890">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-87.74855485166989,44.9616167936432,0 -87.6203354938252,44.9919977731043,0 -87.6185214385406,45.0568068963915,0 -87.58127586164061,45.0946399102465,0 -87.6648864796573,45.1090540526029,0 -87.6728141404664,45.1406726367061,0 -87.72966881168701,45.1766048406442,0 -87.7361999812867,45.1990723551736,0 -87.72162823196,45.2116719436728,0 -87.71966802928161,45.23677159669181,0 -87.7051420461443,45.2470862859939,0 -87.7044714190303,45.2722051755656,0 -87.645362038293,45.34816920676,0 -87 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+				<Polygon id="g891">
+					<outerBoundaryIs>
+						<LinearRing>
+							<coordinates>
+								-87.0345243941477,45.29040569681539,0 -87.0660643522929,45.29646276758369,0 -87.17791321565861,45.1549729181694,0 -87.2309150393896,45.1750634565753,0 -87.28348460482739,45.05261932024141,0 -87.3421608618244,45.0152129710161,0 -87.4054197495813,44.9111998705663,0 -87.3787368982934,44.8377427071621,0 -87.3111236315354,44.7987737179537,0 -87.2056505657533,44.8732394343083,0 -87.168787947216,44.9333234999383,0 -87.1786927530738,44.9828064333324,0 -87.1125569146153,45.0647632237614,0 [...]
+							</coordinates>
+						</LinearRing>
+					</outerBoundaryIs>
+				</Polygon>
+			</MultiGeometry>
+		</MultiGeometry>
+	</Placemark>
+	<Placemark id="pm257">
+		<name>Wyoming</name>
+		<Snippet maxLines="0">empty</Snippet>
+		<description><![CDATA[<table cellpadding="1" cellspacing="1">
+<tr>
+<td>states.AREA:</td>
+<td>   97803.199</td>
+</tr>
+<tr>
+<td>states.STATE_NAME:</td>
+<td>Wyoming</td>
+</tr>
+<tr>
+<td>states.STATE_FIPS:</td>
+<td>56</td>
+</tr>
+<tr>
+<td>states.SUB_REGION:</td>
+<td>Mtn</td>
+</tr>
+<tr>
+<td>states.STATE_ABBR:</td>
+<td>WY</td>
+</tr>
+<tr>
+<td>states.POP2000:</td>
+<td>      493782</td>
+</tr>
+<tr>
+<td>states.POP2001:</td>
+<td>      495345</td>
+</tr>
+<tr>
+<td>states.POP00_SQMI:</td>
+<td>           5</td>
+</tr>
+<tr>
+<td>states.DEN_0_100:</td>
+<td>         100</td>
+</tr>
+<tr>
+<td>USStates.ID:</td>
+<td>          44</td>
+</tr>
+<tr>
+<td>USStates.State_Name:</td>
+<td>Wyoming</td>
+</tr>
+<tr>
+<td>USStates.Date_Entered:</td>
+<td>July 10 1890</td>
+</tr>
+<tr>
+<td>USStates.Year_Entered:</td>
+<td>1890</td>
+</tr>
+<tr>
+<td>USStates.Year_Settled:</td>
+<td>1834</td>
+</tr>
+</table>]]></description>
+		<styleUrl>#Style_5</styleUrl>
+		<MultiGeometry>
+			<Point id="g887">
+				<coordinates>-107.553081008537,42.9982837598069,0</coordinates>
+			</Point>
+			<Polygon id="g888">
+				<outerBoundaryIs>
+					<LinearRing>
+						<coordinates>
+							-104.053615199998,41.698218257724,0 -104.053513414154,41.9998153422964,0 -104.056219380476,42.6146696865973,0 -104.056198856311,43.0030623563908,0 -104.059157507468,43.4791339417582,0 -104.057913943497,43.5037122621461,0 -104.059479420181,43.8529065675403,0 -104.059731381692,44.1458254687842,0 -104.061036140765,44.1818252843501,0 -104.059465130268,44.5743526100096,0 -104.059842395291,44.9973362616199,0 -105.041795987521,45.0010758746085,0 -105.08500310735,44.9998170469188,0 -106.0 [...]
+						</coordinates>
+					</LinearRing>
+				</outerBoundaryIs>
+			</Polygon>
+		</MultiGeometry>
+	</Placemark>
+</Document>
+</kml>
diff --git a/test/spec/ol/format/kmlformat.test.js b/test/spec/ol/format/kmlformat.test.js
new file mode 100644
index 0000000..447ee87
--- /dev/null
+++ b/test/spec/ol/format/kmlformat.test.js
@@ -0,0 +1,2503 @@
+goog.provide('ol.test.format.KML');
+
+
+describe('ol.format.KML', function() {
+
+  var format;
+  beforeEach(function() {
+    format = new ol.format.KML();
+  });
+
+  describe('#readFeatures', function() {
+
+    describe('id', function() {
+
+      it('can read a Feature\'s id', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark id="foo"/>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.getId()).to.be('foo');
+      });
+
+      it('treats a missing id as undefined', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark/>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.getId()).to.be(undefined);
+      });
+
+      it('can write a Feature', function() {
+        var features = [new ol.Feature()];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark/>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write a Feature as string', function() {
+        var features = [new ol.Feature()];
+        var node = format.writeFeatures(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark/>' +
+            '</kml>';
+        expect(ol.xml.parse(node)).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write a Feature\'s id', function() {
+        var feature = new ol.Feature();
+        feature.setId('foo');
+        var features = [feature];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark id="foo"/>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('geometry', function() {
+
+      it('treats a missing geometry as null', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark/>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be(null);
+      });
+
+      it('can write feature with null geometries', function() {
+        var features = [new ol.Feature(null)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark/>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read Point geometries', function() {
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2,3</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([1, 2, 3]);
+      });
+
+      it('can transform and read Point geometries', function() {
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2,3</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        var expectedPoint = ol.proj.transform([1, 2], 'EPSG:4326', 'EPSG:3857');
+        expectedPoint.push(3);
+        expect(g.getCoordinates()).to.eql(expectedPoint);
+      });
+
+      it('can read a single Point geometry', function() {
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2,3</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        var f = format.readFeature(text);
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        expect(g.getCoordinates()).to.eql([1, 2, 3]);
+      });
+
+      it('can transform and read a single Point geometry', function() {
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2,3</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        var f = format.readFeature(text, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        var expectedPoint = ol.proj.transform([1, 2], 'EPSG:4326', 'EPSG:3857');
+        expectedPoint.push(3);
+        expect(g.getCoordinates()).to.eql(expectedPoint);
+      });
+
+      it('can write XY Point geometries', function() {
+        var layout = ol.geom.GeometryLayout.XY;
+        var point = new ol.geom.Point([1, 2], layout);
+        var features = [new ol.Feature(point)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYZ Point geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var point = new ol.geom.Point([1, 2, 3], layout);
+        var features = [new ol.Feature(point)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2,3</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can transform and write XYZ Point geometries', function() {
+        ol.proj.addProjection(new ol.proj.Projection({code: 'double'}));
+        ol.proj.addCoordinateTransforms('EPSG:4326', 'double',
+            function(coordinate) {
+              return [2 * coordinate[0], 2 * coordinate[1]];
+            },
+            function(coordinate) {
+              return [coordinate[0] / 2, coordinate[1] / 2];
+            });
+
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var point = new ol.geom.Point([1, 2, 3], layout).transform(
+            'EPSG:4326', 'double');
+        var features = [new ol.Feature(point)];
+        var node = format.writeFeaturesNode(features, {
+          featureProjection: 'double'
+        });
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2,3</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+
+        ol.proj.removeTransform(
+            ol.proj.get('EPSG:4326'), ol.proj.get('double'));
+        ol.proj.removeTransform(
+            ol.proj.get('double'), ol.proj.get('EPSG:4326'));
+      });
+
+      it('can write XYM Point geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYM;
+        var point = new ol.geom.Point([1, 2, 100], layout);
+        var features = [new ol.Feature(point)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYZM Point geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZM;
+        var point = new ol.geom.Point([1, 2, 3, 100], layout);
+        var features = [new ol.Feature(point)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2,3</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read LineString geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <LineString>' +
+            '      <coordinates>1,2,3 4,5,6</coordinates>' +
+            '    </LineString>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.LineString);
+        expect(g.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
+      });
+
+      it('can write XY LineString geometries', function() {
+        var layout = ol.geom.GeometryLayout.XY;
+        var lineString = new ol.geom.LineString([[1, 2], [3, 4]], layout);
+        var features = [new ol.Feature(lineString)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <LineString>' +
+            '      <coordinates>1,2 3,4</coordinates>' +
+            '    </LineString>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYZ LineString geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var lineString = new ol.geom.LineString(
+            [[1, 2, 3], [4, 5, 6]], layout);
+        var features = [new ol.Feature(lineString)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <LineString>' +
+            '      <coordinates>1,2,3 4,5,6</coordinates>' +
+            '    </LineString>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYM LineString geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYM;
+        var lineString = new ol.geom.LineString(
+            [[1, 2, 100], [3, 4, 200]], layout);
+        var features = [new ol.Feature(lineString)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <LineString>' +
+            '      <coordinates>1,2 3,4</coordinates>' +
+            '    </LineString>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYZM LineString geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZM;
+        var lineString = new ol.geom.LineString(
+            [[1, 2, 3, 100], [4, 5, 6, 200]], layout);
+        var features = [new ol.Feature(lineString)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <LineString>' +
+            '      <coordinates>1,2,3 4,5,6</coordinates>' +
+            '    </LineString>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read LinearRing geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <LinearRing>' +
+            '      <coordinates>1,2,3 4,5,6 7,8,9</coordinates>' +
+            '    </LinearRing>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Polygon);
+        expect(g.getCoordinates()).to.eql([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]);
+      });
+
+      it('can write XY LinearRing geometries', function() {
+        var layout = ol.geom.GeometryLayout.XY;
+        var linearRing = new ol.geom.LinearRing(
+            [[1, 2], [3, 4], [1, 2]], layout);
+        var features = [new ol.Feature(linearRing)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <LinearRing>' +
+            '      <coordinates>1,2 3,4 1,2</coordinates>' +
+            '    </LinearRing>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYZ LinearRing geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var linearRing = new ol.geom.LinearRing(
+            [[1, 2, 3], [4, 5, 6], [1, 2, 3]], layout);
+        var features = [new ol.Feature(linearRing)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <LinearRing>' +
+            '      <coordinates>1,2,3 4,5,6 1,2,3</coordinates>' +
+            '    </LinearRing>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYM LinearRing geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYM;
+        var linearRing = new ol.geom.LinearRing(
+            [[1, 2, 100], [3, 4, 200], [1, 2, 100]], layout);
+        var features = [new ol.Feature(linearRing)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <LinearRing>' +
+            '      <coordinates>1,2 3,4 1,2</coordinates>' +
+            '    </LinearRing>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYZM LinearRing geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZM;
+        var linearRing = new ol.geom.LinearRing(
+            [[1, 2, 3, 100], [4, 5, 6, 200], [1, 2, 3, 100]], layout);
+        var features = [new ol.Feature(linearRing)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <LinearRing>' +
+            '      <coordinates>1,2,3 4,5,6 1,2,3</coordinates>' +
+            '    </LinearRing>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read Polygon geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <outerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>0,0,1 0,5,1 5,5,2 5,0,3</coordinates>' +
+            '        </LinearRing>' +
+            '      </outerBoundaryIs>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Polygon);
+        expect(g.getCoordinates()).to.eql(
+            [[[0, 0, 1], [0, 5, 1], [5, 5, 2], [5, 0, 3]]]);
+      });
+
+      it('can write XY Polygon geometries', function() {
+        var layout = ol.geom.GeometryLayout.XY;
+        var polygon = new ol.geom.Polygon(
+            [[[0, 0], [0, 2], [2, 2], [2, 0], [0, 0]]], layout);
+        var features = [new ol.Feature(polygon)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <outerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>0,0 0,2 2,2 2,0 0,0</coordinates>' +
+            '        </LinearRing>' +
+            '      </outerBoundaryIs>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYZ Polygon geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var polygon = new ol.geom.Polygon(
+            [[[0, 0, 1], [0, 2, 2], [2, 2, 3], [2, 0, 4], [0, 0, 5]]], layout);
+        var features = [new ol.Feature(polygon)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <outerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>' +
+            '            0,0,1 0,2,2 2,2,3 2,0,4 0,0,5' +
+            '          </coordinates>' +
+            '        </LinearRing>' +
+            '      </outerBoundaryIs>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYM Polygon geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYM;
+        var polygon = new ol.geom.Polygon(
+            [[[0, 0, 1], [0, 2, 1], [2, 2, 1], [2, 0, 1], [0, 0, 1]]], layout);
+        var features = [new ol.Feature(polygon)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <outerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>' +
+            '            0,0 0,2 2,2 2,0 0,0' +
+            '          </coordinates>' +
+            '        </LinearRing>' +
+            '      </outerBoundaryIs>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write XYZM Polygon geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZM;
+        var polygon = new ol.geom.Polygon(
+            [[[0, 0, 1, 1], [0, 2, 2, 1], [2, 2, 3, 1],
+              [2, 0, 4, 1], [0, 0, 5, 1]]], layout);
+        var features = [new ol.Feature(polygon)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <outerBoundaryIs>' +
+            '        <LinearRing>' +
+            '        <coordinates>0,0,1 0,2,2 2,2,3 2,0,4 0,0,5</coordinates>' +
+            '        </LinearRing>' +
+            '      </outerBoundaryIs>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read complex Polygon geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <innerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>1,1,0 1,2,0 2,2,0 2,1,0</coordinates>' +
+            '        </LinearRing>' +
+            '      </innerBoundaryIs>' +
+            '      <innerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>3,3,0 3,4,0 4,4,0 4,3,0</coordinates>' +
+            '        </LinearRing>' +
+            '      </innerBoundaryIs>' +
+            '      <outerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>0,0,1 0,5,1 5,5,2 5,0,3</coordinates>' +
+            '        </LinearRing>' +
+            '      </outerBoundaryIs>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Polygon);
+        expect(g.getCoordinates()).to.eql(
+            [[[0, 0, 1], [0, 5, 1], [5, 5, 2], [5, 0, 3]],
+             [[1, 1, 0], [1, 2, 0], [2, 2, 0], [2, 1, 0]],
+             [[3, 3, 0], [3, 4, 0], [4, 4, 0], [4, 3, 0]]]);
+      });
+
+      it('can write complex Polygon geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var polygon = new ol.geom.Polygon(
+            [[[0, 0, 1], [0, 5, 1], [5, 5, 2], [5, 0, 3]],
+             [[1, 1, 0], [1, 2, 0], [2, 2, 0], [2, 1, 0]],
+             [[3, 3, 0], [3, 4, 0], [4, 4, 0], [4, 3, 0]]], layout);
+        var features = [new ol.Feature(polygon)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <innerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>1,1,0 1,2,0 2,2,0 2,1,0</coordinates>' +
+            '        </LinearRing>' +
+            '      </innerBoundaryIs>' +
+            '      <innerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>3,3,0 3,4,0 4,4,0 4,3,0</coordinates>' +
+            '        </LinearRing>' +
+            '      </innerBoundaryIs>' +
+            '      <outerBoundaryIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>0,0,1 0,5,1 5,5,2 5,0,3</coordinates>' +
+            '        </LinearRing>' +
+            '      </outerBoundaryIs>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read MultiPoint geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <Point>' +
+            '        <coordinates>1,2,3</coordinates>' +
+            '      </Point>' +
+            '      <Point>' +
+            '        <coordinates>4,5,6</coordinates>' +
+            '      </Point>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiPoint);
+        expect(g.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
+      });
+
+      it('can write MultiPoint geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var multiPoint = new ol.geom.MultiPoint(
+            [[1, 2, 3], [4, 5, 6]], layout);
+        var features = [new ol.Feature(multiPoint)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <Point>' +
+            '        <coordinates>1,2,3</coordinates>' +
+            '      </Point>' +
+            '      <Point>' +
+            '        <coordinates>4,5,6</coordinates>' +
+            '      </Point>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read MultiLineString geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <LineString>' +
+            '        <coordinates>1,2,3 4,5,6</coordinates>' +
+            '      </LineString>' +
+            '      <LineString>' +
+            '        <coordinates>7,8,9 10,11,12</coordinates>' +
+            '      </LineString>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        expect(g.getCoordinates()).to.eql(
+            [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]);
+      });
+
+      it('can write MultiLineString geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var multiLineString = new ol.geom.MultiLineString(
+            [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]], layout);
+        var features = [new ol.Feature(multiLineString)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <LineString>' +
+            '        <coordinates>1,2,3 4,5,6</coordinates>' +
+            '      </LineString>' +
+            '      <LineString>' +
+            '        <coordinates>7,8,9 10,11,12</coordinates>' +
+            '      </LineString>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read MultiPolygon geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <Polygon>' +
+            '        <outerBoundaryIs>' +
+            '          <LinearRing>' +
+            '            <coordinates>0,0,0 0,1,0 1,1,0 1,0,0</coordinates>' +
+            '          </LinearRing>' +
+            '        </outerBoundaryIs>' +
+            '      </Polygon>' +
+            '      <Polygon>' +
+            '        <outerBoundaryIs>' +
+            '          <LinearRing>' +
+            '            <coordinates>3,0,0 3,1,0 4,1,0 4,0,0</coordinates>' +
+            '          </LinearRing>' +
+            '        </outerBoundaryIs>' +
+            '      </Polygon>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiPolygon);
+        expect(g.getCoordinates()).to.eql(
+            [[[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]]],
+             [[[3, 0, 0], [3, 1, 0], [4, 1, 0], [4, 0, 0]]]]);
+      });
+
+      it('can write MultiPolygon geometries', function() {
+        var layout = ol.geom.GeometryLayout.XYZ;
+        var multiPolygon = new ol.geom.MultiPolygon(
+            [[[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]]],
+             [[[3, 0, 0], [3, 1, 0], [4, 1, 0], [4, 0, 0]]]], layout);
+        var features = [new ol.Feature(multiPolygon)];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <Polygon>' +
+            '        <outerBoundaryIs>' +
+            '          <LinearRing>' +
+            '            <coordinates>0,0,0 0,1,0 1,1,0 1,0,0</coordinates>' +
+            '          </LinearRing>' +
+            '        </outerBoundaryIs>' +
+            '      </Polygon>' +
+            '      <Polygon>' +
+            '        <outerBoundaryIs>' +
+            '          <LinearRing>' +
+            '            <coordinates>3,0,0 3,1,0 4,1,0 4,0,0</coordinates>' +
+            '          </LinearRing>' +
+            '        </outerBoundaryIs>' +
+            '      </Polygon>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can read empty GeometryCollection geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.GeometryCollection);
+        expect(g.getGeometries()).to.be.empty();
+      });
+
+      it('can read heterogenous GeometryCollection geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <Point>' +
+            '        <coordinates>1,2,3</coordinates>' +
+            '      </Point>' +
+            '      <LineString>' +
+            '        <coordinates>1,2,3 4,5,6</coordinates>' +
+            '      </LineString>' +
+            '      <LinearRing>' +
+            '        <coordinates>1,2,3 4,5,6 7,8,9</coordinates>' +
+            '      </LinearRing>' +
+            '      <Polygon>' +
+            '        <outerBoundaryIs>' +
+            '          <LinearRing>' +
+            '            <coordinates>0,0,0 0,1,0 1,1,0 1,0,0</coordinates>' +
+            '          </LinearRing>' +
+            '        </outerBoundaryIs>' +
+            '      </Polygon>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.GeometryCollection);
+        var gs = g.getGeometries();
+        expect(gs).to.have.length(4);
+        expect(gs[0]).to.be.an(ol.geom.Point);
+        expect(gs[1]).to.be.an(ol.geom.LineString);
+        expect(gs[2]).to.be.an(ol.geom.Polygon);
+        expect(gs[3]).to.be.an(ol.geom.Polygon);
+      });
+
+      it('can read nested GeometryCollection geometries', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <MultiGeometry>' +
+            '      </MultiGeometry>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.GeometryCollection);
+        var gs = g.getGeometries();
+        expect(gs).to.have.length(1);
+        expect(gs[0]).to.be.an(ol.geom.GeometryCollection);
+      });
+
+      it('can read gx:Track', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2"' +
+            '     xmlns:gx="http://www.google.com/kml/ext/2.2">' +
+            '  <Placemark>' +
+            '    <gx:Track>' +
+            '      <when>2014-01-06T19:38:55Z</when>' +
+            '      <when>2014-01-06T19:39:03Z</when>' +
+            '      <when>2014-01-06T19:39:10Z</when>' +
+            '      <gx:coord>8.1 46.1 1909.9</gx:coord>' +
+            '      <gx:coord>8.2 46.2 1925.2</gx:coord>' +
+            '      <gx:coord>8.3 46.3 1926.2</gx:coord>' +
+            '    </gx:Track>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.LineString);
+      });
+
+      it('can read gx:MultiTrack', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2"' +
+            '     xmlns:gx="http://www.google.com/kml/ext/2.2">' +
+            '  <Placemark>' +
+            '    <gx:MultiTrack>' +
+            '      <gx:Track>' +
+            '        <when>2014-01-06T19:38:55Z</when>' +
+            '        <gx:coord>8.1 46.1 1909.9</gx:coord>' +
+            '      </gx:Track>' +
+            '      <gx:Track>' +
+            '        <when>2014-01-06T19:38:55Z</when>' +
+            '        <when>2014-01-06T19:39:10Z</when>' +
+            '        <gx:coord>8.1 46.1 1909.9</gx:coord>' +
+            '        <gx:coord>8.2 46.2 1925.2</gx:coord>' +
+            '      </gx:Track>' +
+            '    </gx:MultiTrack>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.MultiLineString);
+        var gs = g.getLineStrings();
+        expect(gs).to.have.length(2);
+        expect(gs[0]).to.be.an(ol.geom.LineString);
+      });
+
+      it('can read dateTime', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2"' +
+            '     xmlns:gx="http://www.google.com/kml/ext/2.2">' +
+            '  <Placemark>' +
+            '    <gx:Track>' +
+            '      <when>2014</when>' +
+            '      <when>2014-02</when>' +
+            '      <when>2014-02-06</when>' +
+            '      <when>2014-02-06T19:39:03Z</when>' +
+            '      <when>2014-02-06T19:39:10+03:00</when>' +
+            '      <gx:coord>8.1 46.1 1909.9</gx:coord>' +
+            '      <gx:coord>8.2 46.2 1925.2</gx:coord>' +
+            '      <gx:coord>8.3 46.3 1926.2</gx:coord>' +
+            '      <gx:coord>8.4 46.4 1927.2</gx:coord>' +
+            '      <gx:coord>8.5 46.5 1928.2</gx:coord>' +
+            '    </gx:Track>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        var f = fs[0];
+        var g = f.getGeometry();
+        var flatCoordinates = g.flatCoordinates;
+        expect(flatCoordinates[3]).to.be.eql(Date.UTC(2014, 0, 1, 0, 0, 0));
+        expect(flatCoordinates[7]).to.be.eql(Date.UTC(2014, 1, 1, 0, 0, 0));
+        expect(flatCoordinates[11]).to.be.eql(Date.UTC(2014, 1, 6, 0, 0, 0));
+        expect(flatCoordinates[15]).to.be.eql(Date.UTC(2014, 1, 6, 19, 39, 3));
+        expect(flatCoordinates[19]).to.be.eql(
+            Date.UTC(2014, 1, 6, 19, 39, 10) + 3 * 60
+        );
+      });
+
+    });
+
+    describe('attributes', function() {
+
+      it('can read boolean attributes', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <open>1</open>' +
+            '    <visibility>0</visibility>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('open')).to.be(true);
+        expect(f.get('visibility')).to.be(false);
+      });
+
+      it('can read string attributes', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <address>My address</address>' +
+            '    <description>My description</description>' +
+            '    <name>My name</name>' +
+            '    <phoneNumber>My phone number</phoneNumber>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('address')).to.be('My address');
+        expect(f.get('description')).to.be('My description');
+        expect(f.get('name')).to.be('My name');
+        expect(f.get('phoneNumber')).to.be('My phone number');
+      });
+
+      it('strips leading and trailing whitespace in strings', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <description>\n\nMy  description\n\n</description>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('description')).to.be('My  description');
+      });
+
+      it('can read CDATA sections in strings', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <name><![CDATA[My name in CDATA]]></name>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('name')).to.be('My name in CDATA');
+      });
+
+      it('strips leading and trailing whitespace around CDATA', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <name>\n\n<![CDATA[My name in CDATA]]>\n\n</name>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('name')).to.be('My name in CDATA');
+      });
+
+      it('can write Feature\'s string attributes', function() {
+        var feature = new ol.Feature();
+        feature.set('address', 'My address');
+        feature.set('description', 'My description');
+        feature.set('name', 'My name');
+        feature.set('phoneNumber', 'My phone number');
+        var features = [feature];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <name>My name</name>' +
+            '    <address>My address</address>' +
+            '    <phoneNumber>My phone number</phoneNumber>' +
+            '    <description>My description</description>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write Feature\'s boolean attributes', function() {
+        var feature = new ol.Feature();
+        feature.set('open', true);
+        feature.set('visibility', false);
+        var features = [feature];
+        var node = format.writeFeaturesNode(features);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <open>1</open>' +
+            '    <visibility>0</visibility>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('extended data', function() {
+
+      it('can read ExtendedData', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark xmlns="http://earth.google.com/kml/2.2">' +
+            '    <ExtendedData>' +
+            '      <Data name="foo">' +
+            '        <value>bar</value>' +
+            '      </Data>' +
+            '    </ExtendedData>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('foo')).to.be('bar');
+      });
+
+      it('can read SchemaData', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark xmlns="http://earth.google.com/kml/2.2">' +
+            '    <ExtendedData>' +
+            '      <SchemaData schemaUrl="#mySchema">' +
+            '        <SimpleData name="capital">London</SimpleData>' +
+            '        <SimpleData name="population">60000000</SimpleData>' +
+            '      </SchemaData>' +
+            '    </ExtendedData>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('capital')).to.be('London');
+        expect(f.get('population')).to.be('60000000');
+      });
+    });
+
+    describe('styles', function() {
+
+      it('applies the default style if no style is defined', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        expect(style.getFill()).to.be(ol.format.KML.DEFAULT_FILL_STYLE_);
+        expect(style.getFill().getColor()).to.eql([255, 255, 255, 1]);
+        expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_);
+        // FIXME check image style
+        expect(style.getStroke()).to.be(ol.format.KML.DEFAULT_STROKE_STYLE_);
+        expect(style.getStroke().getColor()).to.eql([255, 255, 255, 1]);
+        expect(style.getStroke().getWidth()).to.be(1);
+      });
+
+      it('can read a feature\'s IconStyle', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <IconStyle>' +
+            '        <Icon>' +
+            '          <href>http://foo.png</href>' +
+            '        </Icon>' +
+            '      </IconStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        expect(style.getFill()).to.be(ol.format.KML.DEFAULT_FILL_STYLE_);
+        expect(style.getStroke()).to.be(ol.format.KML.DEFAULT_STROKE_STYLE_);
+        var imageStyle = style.getImage();
+        expect(imageStyle).to.be.an(ol.style.Icon);
+        expect(imageStyle.getSrc()).to.eql('http://foo.png');
+        expect(imageStyle.getAnchor()).to.be(null);
+        expect(imageStyle.getOrigin()).to.be(null);
+        expect(imageStyle.getRotation()).to.eql(0);
+        expect(imageStyle.getSize()).to.be(null);
+        expect(style.getText()).to.be(ol.format.KML.DEFAULT_TEXT_STYLE_);
+        expect(style.getZIndex()).to.be(undefined);
+      });
+
+      it('can read a complex feature\'s IconStyle', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2"' +
+            '     xmlns:gx="http://www.google.com/kml/ext/2.2">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <IconStyle>' +
+            '        <Icon>' +
+            '          <href>http://foo.png</href>' +
+            '          <gx:x>24</gx:x>' +
+            '          <gx:y>36</gx:y>' +
+            '          <gx:w>48</gx:w>' +
+            '          <gx:h>48</gx:h>' +
+            '        </Icon>' +
+            '        <hotSpot x="0.5" y="12" xunits="fraction" ' +
+            '                 yunits="pixels"/>' +
+            '      </IconStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        expect(style.getFill()).to.be(ol.format.KML.DEFAULT_FILL_STYLE_);
+        expect(style.getStroke()).to.be(ol.format.KML.DEFAULT_STROKE_STYLE_);
+        var imageStyle = style.getImage();
+        imageStyle.iconImage_.size_ = [144, 192];
+        expect(imageStyle.getSize()).to.eql([48, 48]);
+        expect(imageStyle.getAnchor()).to.eql([24, 36]);
+        expect(imageStyle.getOrigin()).to.eql([24, 108]);
+        expect(imageStyle.getRotation()).to.eql(0);
+        expect(style.getText()).to.be(ol.format.KML.DEFAULT_TEXT_STYLE_);
+        expect(style.getZIndex()).to.be(undefined);
+      });
+
+      it('can read a feature\'s LabelStyle', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <LabelStyle>' +
+            '        <color>12345678</color>' +
+            '        <scale>0.25</scale>' +
+            '      </LabelStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        expect(style.getFill()).to.be(ol.format.KML.DEFAULT_FILL_STYLE_);
+        expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_);
+        expect(style.getStroke()).to.be(ol.format.KML.DEFAULT_STROKE_STYLE_);
+        var textStyle = style.getText();
+        expect(textStyle).to.be.an(ol.style.Text);
+        expect(textStyle.getScale()).to.be(0.5);
+        var textFillStyle = textStyle.getFill();
+        expect(textFillStyle).to.be.an(ol.style.Fill);
+        expect(textFillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+        expect(style.getZIndex()).to.be(undefined);
+      });
+
+      it('can read a feature\'s LineStyle', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <LineStyle>' +
+            '        <color>12345678</color>' +
+            '        <width>9</width>' +
+            '      </LineStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        expect(style.getFill()).to.be(ol.format.KML.DEFAULT_FILL_STYLE_);
+        expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_);
+        var strokeStyle = style.getStroke();
+        expect(strokeStyle).to.be.an(ol.style.Stroke);
+        expect(strokeStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+        expect(strokeStyle.getWidth()).to.be(9);
+        expect(style.getText()).to.be(ol.format.KML.DEFAULT_TEXT_STYLE_);
+        expect(style.getZIndex()).to.be(undefined);
+      });
+
+      it('can read a feature\'s PolyStyle', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <PolyStyle>' +
+            '        <color>12345678</color>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        var fillStyle = style.getFill();
+        expect(fillStyle).to.be.an(ol.style.Fill);
+        expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+        expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_);
+        expect(style.getStroke()).to.be(ol.format.KML.DEFAULT_STROKE_STYLE_);
+        expect(style.getText()).to.be(ol.format.KML.DEFAULT_TEXT_STYLE_);
+        expect(style.getZIndex()).to.be(undefined);
+      });
+
+      it('can read a feature\'s LineStyle and PolyStyle', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <LineStyle>' +
+            '        <color>12345678</color>' +
+            '        <width>9</width>' +
+            '      </LineStyle>' +
+            '      <PolyStyle>' +
+            '        <color>12345678</color>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+
+
+
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        var fillStyle = style.getFill();
+        expect(fillStyle).to.be.an(ol.style.Fill);
+        expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+        expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_);
+        var strokeStyle = style.getStroke();
+        expect(strokeStyle).to.be.an(ol.style.Stroke);
+        expect(strokeStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+        expect(strokeStyle.getWidth()).to.be(9);
+        expect(style.getText()).to.be(ol.format.KML.DEFAULT_TEXT_STYLE_);
+        expect(style.getZIndex()).to.be(undefined);
+      });
+
+      it('disables the fill when fill is \'0\'', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <LineStyle>' +
+            '        <color>12345678</color>' +
+            '        <width>9</width>' +
+            '      </LineStyle>' +
+            '      <PolyStyle>' +
+            '        <color>12345678</color>' +
+            '        <fill>0</fill>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        expect(style.getFill()).to.be(null);
+        expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_);
+        var strokeStyle = style.getStroke();
+        expect(strokeStyle).to.be.an(ol.style.Stroke);
+        expect(strokeStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+        expect(strokeStyle.getWidth()).to.be(9);
+        expect(style.getText()).to.be(ol.format.KML.DEFAULT_TEXT_STYLE_);
+        expect(style.getZIndex()).to.be(undefined);
+      });
+
+      it('disables the stroke when outline is \'0\'', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <LineStyle>' +
+            '        <color>12345678</color>' +
+            '        <width>9</width>' +
+            '      </LineStyle>' +
+            '      <PolyStyle>' +
+            '        <color>12345678</color>' +
+            '        <outline>0</outline>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        var fillStyle = style.getFill();
+        expect(fillStyle).to.be.an(ol.style.Fill);
+        expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+        expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_);
+        expect(style.getStroke()).to.be(null);
+        expect(style.getText()).to.be(ol.format.KML.DEFAULT_TEXT_STYLE_);
+        expect(style.getZIndex()).to.be(undefined);
+      });
+
+      it('disables both fill and stroke when fill and outline are \'0\'',
+          function() {
+            var text =
+                '<kml xmlns="http://earth.google.com/kml/2.2">' +
+                '  <Placemark>' +
+                '    <Style>' +
+                '      <LineStyle>' +
+                '        <color>12345678</color>' +
+                '        <width>9</width>' +
+                '      </LineStyle>' +
+                '      <PolyStyle>' +
+                '        <color>12345678</color>' +
+                '        <fill>0</fill>' +
+                '        <outline>0</outline>' +
+                '      </PolyStyle>' +
+                '    </Style>' +
+                '  </Placemark>' +
+                '</kml>';
+            var fs = format.readFeatures(text);
+            expect(fs).to.have.length(1);
+            var f = fs[0];
+            expect(f).to.be.an(ol.Feature);
+            var styleFunction = f.getStyleFunction();
+            expect(styleFunction).not.to.be(undefined);
+            var styleArray = styleFunction.call(f, 0);
+            expect(styleArray).to.be.an(Array);
+            expect(styleArray).to.have.length(1);
+            var style = styleArray[0];
+            expect(style).to.be.an(ol.style.Style);
+            expect(style.getFill()).to.be(null);
+            expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_);
+            expect(style.getStroke()).to.be(null);
+            expect(style.getText()).to.be(ol.format.KML.DEFAULT_TEXT_STYLE_);
+            expect(style.getZIndex()).to.be(undefined);
+          });
+
+      it('can write an feature\'s icon style', function() {
+        var style = new ol.style.Style({
+          image: new ol.style.Icon({
+            anchor: [0.25, 36],
+            anchorOrigin: ol.style.IconOrigin.TOP_LEFT,
+            anchorXUnits: 'fraction',
+            anchorYUnits: 'pixels',
+            crossOrigin: 'anonymous',
+            offset: [96, 96],
+            offsetOrigin: ol.style.IconOrigin.TOP_LEFT,
+            rotation: 45,
+            scale: 0.5,
+            size: [48, 48],
+            src: 'http://foo.png'
+          })
+        });
+        var imageStyle = style.getImage();
+        imageStyle.iconImage_.size_ = [192, 144]; // sprite de 12 images(4*3)
+        var feature = new ol.Feature();
+        feature.setStyle([style]);
+        var node = format.writeFeaturesNode([feature]);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <IconStyle>' +
+            '        <scale>0.25</scale>' +
+            '        <heading>45</heading>' +
+            '        <Icon>' +
+            '          <href>http://foo.png</href>' +
+            '          <gx:x>96</gx:x>' +
+            '          <gx:y>0</gx:y>' +
+            '          <gx:w>48</gx:w>' +
+            '          <gx:h>48</gx:h>' +
+            '        </Icon>' +
+            '        <hotSpot x="12" y="12" xunits="pixels" ' +
+            '                 yunits="pixels"/>' +
+            '      </IconStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write an feature\'s text style', function() {
+        var style = new ol.style.Style({
+          text: new ol.style.Text({
+            scale: 0.5,
+            text: 'foo',
+            fill: new ol.style.Fill({
+              color: 'rgb(12, 34, 223)'
+            })
+          })
+        });
+        var feature = new ol.Feature();
+        feature.setStyle([style]);
+        var node = format.writeFeaturesNode([feature]);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <name>foo</name>' +
+            '    <Style>' +
+            '      <LabelStyle>' +
+            '        <color>ffdf220c</color>' +
+            '        <scale>0.25</scale>' +
+            '      </LabelStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write an feature\'s stroke style', function() {
+        var style = new ol.style.Style({
+          stroke: new ol.style.Stroke({
+            color: '#112233',
+            width: 2
+          })
+        });
+        var feature = new ol.Feature();
+        feature.setStyle([style]);
+        var node = format.writeFeaturesNode([feature]);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <LineStyle>' +
+            '        <color>ff332211</color>' +
+            '        <width>2</width>' +
+            '      </LineStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+      it('can write an feature\'s fill style', function() {
+        var style = new ol.style.Style({
+          fill: new ol.style.Fill({
+            color: 'rgba(12, 34, 223, 0.7)'
+          })
+        });
+        var feature = new ol.Feature();
+        feature.setStyle([style]);
+        var node = format.writeFeaturesNode([feature]);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Placemark>' +
+            '    <Style>' +
+            '      <PolyStyle>' +
+            '        <color>b2df220c</color>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '  </Placemark>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+    });
+
+    describe('style maps', function() {
+
+      it('can read a normal style', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Placemark id="a">' +
+            '      <StyleMap>' +
+            '        <Pair>' +
+            '          <key>normal</key>' +
+            '          <Style>' +
+            '            <PolyStyle>' +
+            '              <color>00000000</color>' +
+            '            </PolyStyle>' +
+            '          </Style>' +
+            '        </Pair>' +
+            '      </StyleMap>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var s = styleArray[0];
+        expect(s).to.be.an(ol.style.Style);
+        expect(s.getFill()).not.to.be(null);
+        expect(s.getFill().getColor()).to.eql([0, 0, 0, 0]);
+      });
+
+      it('ignores highlight styles', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Placemark>' +
+            '      <StyleMap>' +
+            '        <Pair>' +
+            '          <key>highlighted</key>' +
+            '          <Style>' +
+            '            <PolyStyle>' +
+            '              <color>00000000</color>' +
+            '            </PolyStyle>' +
+            '          </Style>' +
+            '        </Pair>' +
+            '      </StyleMap>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var s = styleArray[0];
+        expect(s).to.be.an(ol.style.Style);
+        expect(s).to.be(ol.format.KML.DEFAULT_STYLE_);
+
+      });
+
+      it('uses normal styles instead of highlight styles', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Placemark id="a">' +
+            '      <StyleMap>' +
+            '        <Pair>' +
+            '          <key>normal</key>' +
+            '          <Style>' +
+            '            <PolyStyle>' +
+            '              <color>00000000</color>' +
+            '            </PolyStyle>' +
+            '          </Style>' +
+            '        </Pair>' +
+            '        <Pair>' +
+            '          <key>highlighted</key>' +
+            '          <Style>' +
+            '            <PolyStyle>' +
+            '              <color>ffffffff</color>' +
+            '            </PolyStyle>' +
+            '          </Style>' +
+            '        </Pair>' +
+            '      </StyleMap>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var s = styleArray[0];
+        expect(s).to.be.an(ol.style.Style);
+        expect(s.getFill()).not.to.be(null);
+        expect(s.getFill().getColor()).to.eql([0, 0, 0, 0]);
+      });
+
+      it('can read normal styleUrls', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Style id="foo">' +
+            '      <PolyStyle>' +
+            '        <color>00000000</color>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '    <Placemark>' +
+            '      <StyleMap>' +
+            '        <Pair>' +
+            '          <key>normal</key>' +
+            '          <styleUrl>#foo</styleUrl>' +
+            '        </Pair>' +
+            '      </StyleMap>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var s = styleArray[0];
+        expect(s).to.be.an(ol.style.Style);
+        expect(s.getFill()).not.to.be(null);
+        expect(s.getFill().getColor()).to.eql([0, 0, 0, 0]);
+      });
+
+      it('ignores highlighted styleUrls', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Style id="foo">' +
+            '      <PolyStyle>' +
+            '        <color>00000000</color>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '    <Placemark>' +
+            '      <StyleMap>' +
+            '        <Pair>' +
+            '          <key>highlighted</key>' +
+            '          <styleUrl>#foo</styleUrl>' +
+            '        </Pair>' +
+            '      </StyleMap>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var s = styleArray[0];
+        expect(s).to.be.an(ol.style.Style);
+        expect(s).to.be(ol.format.KML.DEFAULT_STYLE_);
+      });
+
+      it('can use Styles in StyleMaps before they are defined', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <StyleMap id="fooMap">' +
+            '      <Pair>' +
+            '        <key>normal</key>' +
+            '        <styleUrl>#foo</styleUrl>' +
+            '       </Pair>' +
+            '    </StyleMap>' +
+            '    <Style id="foo">' +
+            '      <PolyStyle>' +
+            '        <color>12345678</color>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '    <Placemark>' +
+            '      <styleUrl>#fooMap</styleUrl>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var s = styleArray[0];
+        expect(s).to.be.an(ol.style.Style);
+        expect(s.getFill()).not.to.be(null);
+        expect(s.getFill().getColor()).to.eql([120, 86, 52, 18 / 255]);
+      });
+
+    });
+
+    describe('shared styles', function() {
+
+      it('can apply a shared style to a feature', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Style id="foo">' +
+            '      <PolyStyle>' +
+            '        <color>12345678</color>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '    <Placemark>' +
+            '      <styleUrl>#foo</styleUrl>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        var fillStyle = style.getFill();
+        expect(fillStyle).to.be.an(ol.style.Fill);
+        expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+      });
+
+      it('can read a shared style from a Folder', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Folder>' +
+            '      <Style id="foo">' +
+            '        <PolyStyle>' +
+            '          <color>12345678</color>' +
+            '        </PolyStyle>' +
+            '      </Style>' +
+            '    </Folder>' +
+            '    <Placemark>' +
+            '      <styleUrl>#foo</styleUrl>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var styleFunction = f.getStyleFunction();
+        expect(styleFunction).not.to.be(undefined);
+        var styleArray = styleFunction.call(f, 0);
+        expect(styleArray).to.be.an(Array);
+        expect(styleArray).to.have.length(1);
+        var style = styleArray[0];
+        expect(style).to.be.an(ol.style.Style);
+        var fillStyle = style.getFill();
+        expect(fillStyle).to.be.an(ol.style.Fill);
+        expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]);
+      });
+
+      it('can apply a shared style to multiple features', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Style id="foo">' +
+            '      <PolyStyle>' +
+            '        <color>12345678</color>' +
+            '      </PolyStyle>' +
+            '    </Style>' +
+            '    <Placemark id="a">' +
+            '      <styleUrl>#foo</styleUrl>' +
+            '    </Placemark>' +
+            '    <Placemark id="b">' +
+            '      <styleUrl>#foo</styleUrl>' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(2);
+        var f1 = fs[0];
+        expect(f1).to.be.an(ol.Feature);
+        var styleFunction1 = f1.getStyleFunction();
+        expect(styleFunction1).not.to.be(undefined);
+        var styleArray1 = styleFunction1.call(f1, 0);
+        expect(styleArray1).to.be.an(Array);
+        var f2 = fs[1];
+        expect(f2).to.be.an(ol.Feature);
+        var styleFunction2 = f2.getStyleFunction();
+        expect(styleFunction2).not.to.be(undefined);
+        var styleArray2 = styleFunction2.call(f2, 0);
+        expect(styleArray2).to.be.an(Array);
+        expect(styleArray1).to.be(styleArray2);
+      });
+
+    });
+
+    describe('multiple features', function() {
+
+      it('returns no features from an empty Document', function() {
+        var text =
+            '<Document xmlns="http://earth.google.com/kml/2.2">' +
+            '</Document>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.be.empty();
+      });
+
+      it('can read a single feature from a Document', function() {
+        var text =
+            '<Document xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '  </Placemark>' +
+            '</Document>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        expect(fs[0]).to.be.an(ol.Feature);
+      });
+
+      it('can transform and read a single feature from a Document', function() {
+        var text =
+            '<Document xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>1,2,3</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</Document>';
+        var fs = format.readFeatures(text, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.Point);
+        var expectedPoint = ol.proj.transform([1, 2], 'EPSG:4326', 'EPSG:3857');
+        expectedPoint.push(3);
+        expect(g.getCoordinates()).to.eql(expectedPoint);
+      });
+
+      it('can read a multiple features from a Document', function() {
+        var text =
+            '<Document xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark id="1">' +
+            '  </Placemark>' +
+            '  <Placemark id="2">' +
+            '  </Placemark>' +
+            '</Document>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(2);
+        expect(fs[0]).to.be.an(ol.Feature);
+        expect(fs[0].getId()).to.be('1');
+        expect(fs[1]).to.be.an(ol.Feature);
+        expect(fs[1].getId()).to.be('2');
+      });
+
+      it('returns no features from an empty Folder', function() {
+        var text =
+            '<Folder xmlns="http://earth.google.com/kml/2.2">' +
+            '</Folder>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.be.empty();
+      });
+
+      it('can read a single feature from a Folder', function() {
+        var text =
+            '<Folder xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark>' +
+            '  </Placemark>' +
+            '</Folder>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        expect(fs[0]).to.be.an(ol.Feature);
+      });
+
+      it('can read a multiple features from a Folder', function() {
+        var text =
+            '<Folder xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark id="1">' +
+            '  </Placemark>' +
+            '  <Placemark id="2">' +
+            '  </Placemark>' +
+            '</Folder>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(2);
+        expect(fs[0]).to.be.an(ol.Feature);
+        expect(fs[0].getId()).to.be('1');
+        expect(fs[1]).to.be.an(ol.Feature);
+        expect(fs[1].getId()).to.be('2');
+      });
+
+      it('can read features from Folders nested in Documents', function() {
+        var text =
+            '<Document xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Folder>' +
+            '    <Placemark>' +
+            '    </Placemark>' +
+            '  </Folder>' +
+            '</Document>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        expect(fs[0]).to.be.an(ol.Feature);
+      });
+
+      it('can read features from Folders nested in Folders', function() {
+        var text =
+            '<Folder xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Folder>' +
+            '    <Placemark>' +
+            '    </Placemark>' +
+            '  </Folder>' +
+            '</Folder>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        expect(fs[0]).to.be.an(ol.Feature);
+      });
+
+      it('can read a single feature', function() {
+        var text =
+            '<Placemark xmlns="http://earth.google.com/kml/2.2">' +
+            '</Placemark>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(1);
+        expect(fs[0]).to.be.an(ol.Feature);
+      });
+
+      it('can read features at multiple levels', function() {
+        var text =
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Document>' +
+            '    <Placemark id="a"/>' +
+            '    <Folder>' +
+            '      <Placemark id="b"/>' +
+            '      <Folder>' +
+            '        <Placemark id="c"/>' +
+            '      </Folder>' +
+            '      <Placemark id="d"/>' +
+            '    </Folder>' +
+            '    <Placemark id="e"/>' +
+            '  </Document>' +
+            '</kml>';
+        var fs = format.readFeatures(text);
+        expect(fs).to.have.length(5);
+        expect(fs[0]).to.be.an(ol.Feature);
+        expect(fs[0].getId()).to.be('a');
+        expect(fs[1]).to.be.an(ol.Feature);
+        expect(fs[1].getId()).to.be('b');
+        expect(fs[2]).to.be.an(ol.Feature);
+        expect(fs[2].getId()).to.be('c');
+        expect(fs[3]).to.be.an(ol.Feature);
+        expect(fs[3].getId()).to.be('d');
+        expect(fs[4]).to.be.an(ol.Feature);
+        expect(fs[4].getId()).to.be('e');
+      });
+
+      it('supports common namespaces', function() {
+        expect(format.readFeatures(
+            '<kml xmlns="http://earth.google.com/kml/2.0">' +
+            '  <Placemark/>' +
+            '</kml>')).to.have.length(1);
+        expect(format.readFeatures(
+            '<kml xmlns="http://earth.google.com/kml/2.2">' +
+            '  <Placemark/>' +
+            '</kml>')).to.have.length(1);
+        expect(format.readFeatures(
+            '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+            '  <Placemark/>' +
+            '</kml>')).to.have.length(1);
+      });
+
+      it('ignores unknown namespaces', function() {
+        expect(format.readFeatures(
+            '<kml xmlns="http://example.com/notkml/1.0">' +
+            '  <Placemark/>' +
+            '</kml>')).to.be.empty();
+      });
+
+      it('can write multiple features', function() {
+        var feature1 = new ol.Feature();
+        feature1.setId('1');
+        var feature2 = new ol.Feature();
+        feature2.setId('2');
+        var node = format.writeFeaturesNode([feature1, feature2]);
+        var text =
+            '<kml xmlns="http://www.opengis.net/kml/2.2"' +
+            ' xmlns:gx="http://www.google.com/kml/ext/2.2"' +
+            ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            ' xsi:schemaLocation="http://www.opengis.net/kml/2.2' +
+            ' https://developers.google.com/kml/schema/kml22gx.xsd">' +
+            '  <Document>' +
+            '    <Placemark id="1">' +
+            '    </Placemark>' +
+            '    <Placemark id="2">' +
+            '    </Placemark>' +
+            '  </Document>' +
+            '</kml>';
+        expect(node).to.xmleql(ol.xml.parse(text));
+      });
+
+    });
+
+    describe('error handling', function() {
+
+      it('should ignore invalid coordinates', function() {
+        var doc = goog.dom.xml.loadXml('<coordinates>INVALID</coordinates>');
+        var node = doc.firstChild;
+        expect(ol.format.KML.readFlatCoordinates_(node)).to.be(undefined);
+      });
+
+      it('should ignore Points with invalid coordinates', function() {
+        var kml =
+            '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>INVALID COORDINATES</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(kml);
+        expect(fs).to.be.an(Array);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.getGeometry()).to.be(null);
+      });
+
+      it('should ignore LineStrings with invalid coordinates', function() {
+        var kml =
+            '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Point>' +
+            '      <coordinates>INVALID COORDINATES</coordinates>' +
+            '    </Point>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(kml);
+        expect(fs).to.be.an(Array);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.getGeometry()).to.be(null);
+      });
+
+      it('should ignore Polygons with no rings', function() {
+        var kml =
+            '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <coordinates>INVALID COORDINATES</coordinates>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(kml);
+        expect(fs).to.be.an(Array);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.getGeometry()).to.be(null);
+      });
+
+      it('should ignore Polygons with no outer ring', function() {
+        var kml =
+            '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+            '  <Placemark>' +
+            '    <Polygon>' +
+            '      <innerRingIs>' +
+            '        <LinearRing>' +
+            '          <coordinates>1,2,3 4,5,6 7,8,9</coordinates>' +
+            '        </LinearRing>' +
+            '      </innerRingIs>' +
+            '    </Polygon>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(kml);
+        expect(fs).to.be.an(Array);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.getGeometry()).to.be(null);
+      });
+
+      it('should ignore geometries with invalid coordinates', function() {
+        var kml =
+            '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+            '  <Placemark>' +
+            '    <MultiGeometry>' +
+            '      <Point>' +
+            '        <coordinates>INVALID COORDINATES</coordinates>' +
+            '      </Point>' +
+            '    </MultiGeometry>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(kml);
+        expect(fs).to.be.an(Array);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        var g = f.getGeometry();
+        expect(g).to.be.an(ol.geom.GeometryCollection);
+        expect(g.getGeometries()).to.be.empty();
+      });
+
+      it('should ignore invalid booleans', function() {
+        var kml =
+            '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+            '  <Placemark>' +
+            '    <visibility>foo</visibility>' +
+            '  </Placemark>' +
+            '</kml>';
+        var fs = format.readFeatures(kml);
+        expect(fs).to.be.an(Array);
+        expect(fs).to.have.length(1);
+        var f = fs[0];
+        expect(f).to.be.an(ol.Feature);
+        expect(f.get('visibility')).to.be(undefined);
+      });
+
+      it('parse all valid features in a Folder, without error', function() {
+        var kml =
+            '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+            '  <Placemark id="a"/>' +
+            '  <Folder>' +
+            '    <Placemark id="b"/>' +
+            '    <Placemark id="c">' +
+            '      <visibility>foo</visibility>' +
+            '    </Placemark>' +
+            '    <Placemark id="d"/>' +
+            '  </Folder>' +
+            '  <Placemark id="e"/>' +
+            '</kml>';
+        var fs = format.readFeatures(kml);
+        expect(fs).to.be.an(Array);
+        expect(fs).to.have.length(5);
+        expect(fs[0]).to.be.an(ol.Feature);
+        expect(fs[0].getId()).to.be('a');
+        expect(fs[1]).to.be.an(ol.Feature);
+        expect(fs[1].getId()).to.be('b');
+        expect(fs[2]).to.be.an(ol.Feature);
+        expect(fs[2].getId()).to.be('c');
+        expect(fs[3]).to.be.an(ol.Feature);
+        expect(fs[3].getId()).to.be('d');
+        expect(fs[4]).to.be.an(ol.Feature);
+        expect(fs[4].getId()).to.be('e');
+      });
+
+    });
+
+  });
+
+  describe('when parsing states.kml', function() {
+
+    var features;
+    before(function(done) {
+      afterLoadText('spec/ol/format/kml/states.kml', function(xml) {
+        try {
+          features = format.readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates 50 features', function() {
+      expect(features).to.have.length(50);
+    });
+
+    it('creates features with heterogenous geometry collections', function() {
+      // FIXME decide if we should instead create features with multiple geoms
+      var feature = features[0];
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.an(ol.geom.GeometryCollection);
+    });
+
+    it('creates a Point and a MultiPolygon for Alaska', function() {
+      var alaska = goog.array.find(features, function(feature) {
+        return feature.get('name') === 'Alaska';
+      });
+      expect(alaska).to.be.an(ol.Feature);
+      var geometry = alaska.getGeometry();
+      expect(geometry).to.be.an(ol.geom.GeometryCollection);
+      var components = geometry.getGeometries();
+      expect(components).to.have.length(2);
+      expect(components[0]).to.be.an(ol.geom.Point);
+      expect(components[1]).to.be.an(ol.geom.MultiPolygon);
+    });
+
+  });
+
+  describe('#readName', function() {
+
+    it('returns undefined if there is no name', function() {
+      var kml =
+          '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+          '  <Document>' +
+          '    <Folder>' +
+          '     <Placemark/>' +
+          '    </Folder>' +
+          '  </Document>' +
+          '</kml>';
+      expect(format.readName(kml)).to.be(undefined);
+    });
+
+    it('returns the name of the first Document', function() {
+      var kml =
+          '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+          '  <Document>' +
+          '    <name>Document name</name>' +
+          '  </Document>' +
+          '</kml>';
+      expect(format.readName(kml)).to.be('Document name');
+    });
+
+    it('returns the name of the first Folder', function() {
+      var kml =
+          '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+          '  <Folder>' +
+          '    <name>Folder name</name>' +
+          '  </Folder>' +
+          '</kml>';
+      expect(format.readName(kml)).to.be('Folder name');
+    });
+
+    it('returns the name of the first Placemark', function() {
+      var kml =
+          '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+          '  <Placemark>' +
+          '    <name>Placemark name</name>' +
+          '  </Placemark>' +
+          '</kml>';
+      expect(format.readName(kml)).to.be('Placemark name');
+    });
+
+    it('searches breadth-first', function() {
+      var kml =
+          '<kml xmlns="http://www.opengis.net/kml/2.2">' +
+          '  <Document>' +
+          '    <Placemark>' +
+          '      <name>Placemark name</name>' +
+          '    </Placemark>' +
+          '    <name>Document name</name>' +
+          '  </Document>' +
+          '</kml>';
+      expect(format.readName(kml)).to.be('Document name');
+    });
+
+  });
+
+});
+
+
+goog.require('goog.array');
+goog.require('goog.dom.xml');
+goog.require('ol.Feature');
+goog.require('ol.format.KML');
+goog.require('ol.geom.GeometryCollection');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.LinearRing');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Icon');
+goog.require('ol.style.IconOrigin');
+goog.require('ol.proj');
+goog.require('ol.proj.Projection');
+goog.require('ol.style.Stroke');
+goog.require('ol.style.Style');
+goog.require('ol.style.Text');
+goog.require('ol.xml');
diff --git a/test/spec/ol/format/osmxmlformat.test.js b/test/spec/ol/format/osmxmlformat.test.js
new file mode 100644
index 0000000..025db6e
--- /dev/null
+++ b/test/spec/ol/format/osmxmlformat.test.js
@@ -0,0 +1,105 @@
+goog.provide('ol.test.format.OSMXML');
+
+
+describe('ol.format.OSMXML', function() {
+
+  var format;
+  beforeEach(function() {
+    format = new ol.format.OSMXML();
+  });
+
+  describe('#readFeatures', function() {
+
+    it('can read an empty document', function() {
+      var text =
+          '<?xml version="1.0" encoding="UTF-8"?>' +
+          '<osm version="0.6" generator="my hand">' +
+          '</osm>';
+      var fs = format.readFeatures(text);
+      expect(fs).to.have.length(0);
+    });
+
+    it('can read nodes', function() {
+      var text =
+          '<?xml version="1.0" encoding="UTF-8"?>' +
+          '<osm version="0.6" generator="my hand">' +
+          '  <node id="1" lat="1" lon="2">' +
+          '    <tag k="name" v="1"/>' +
+          '  </node>' +
+          '  <node id="2" lat="3" lon="4">' +
+          '    <tag k="name" v="2"/>' +
+          '  </node>' +
+          '</osm>';
+      var fs = format.readFeatures(text);
+      expect(fs).to.have.length(2);
+      var f = fs[0];
+      expect(f).to.be.an(ol.Feature);
+      var g = f.getGeometry();
+      expect(g).to.be.an(ol.geom.Point);
+      expect(g.getCoordinates()).to.eql([2, 1]);
+    });
+
+    it('can read nodes and ways', function() {
+      var text =
+          '<?xml version="1.0" encoding="UTF-8"?>' +
+          '<osm version="0.6" generator="my hand">' +
+          '  <node id="1" lat="1" lon="2">' +
+          '    <tag k="name" v="1"/>' +
+          '  </node>' +
+          '  <node id="2" lat="3" lon="4">' +
+          '    <tag k="name" v="2"/>' +
+          '  </node>' +
+          '  <way id="3">' +
+          '    <tag k="name" v="3"/>' +
+          '    <nd ref="1" />' +
+          '    <nd ref="2" />' +
+          '  </way>' +
+          '</osm>';
+      var fs = format.readFeatures(text);
+      expect(fs).to.have.length(3);
+      var point = fs[0];
+      expect(point).to.be.an(ol.Feature);
+      var g = point.getGeometry();
+      expect(g).to.be.an(ol.geom.Point);
+      expect(g.getCoordinates()).to.eql([2, 1]);
+      var line = fs[2];
+      expect(line).to.be.an(ol.Feature);
+      g = line.getGeometry();
+      expect(g).to.be.an(ol.geom.LineString);
+      expect(g.getCoordinates()).to.eql([[2, 1], [4, 3]]);
+    });
+
+    it('can transform and read nodes', function() {
+      var text =
+          '<?xml version="1.0" encoding="UTF-8"?>' +
+          '<osm version="0.6" generator="my hand">' +
+          '  <node id="1" lat="1" lon="2">' +
+          '    <tag k="name" v="1"/>' +
+          '  </node>' +
+          '  <node id="2" lat="3" lon="4">' +
+          '    <tag k="name" v="2"/>' +
+          '  </node>' +
+          '</osm>';
+      var fs = format.readFeatures(text, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(fs).to.have.length(2);
+      var f = fs[0];
+      expect(f).to.be.an(ol.Feature);
+      var g = f.getGeometry();
+      expect(g).to.be.an(ol.geom.Point);
+      expect(g.getCoordinates()).to.eql(
+          ol.proj.transform([2, 1], 'EPSG:4326', 'EPSG:3857'));
+    });
+
+  });
+
+});
+
+
+goog.require('goog.dom.xml');
+goog.require('ol.Feature');
+goog.require('ol.format.OSMXML');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.LineString');
+goog.require('ol.proj');
diff --git a/test/spec/ol/format/owsformat.test.js b/test/spec/ol/format/owsformat.test.js
new file mode 100644
index 0000000..03adf24
--- /dev/null
+++ b/test/spec/ol/format/owsformat.test.js
@@ -0,0 +1,154 @@
+goog.provide('ol.test.format.OWS');
+
+goog.require('ol.xml');
+
+describe('ol.format.OWS 1.1', function() {
+
+  var parser = new ol.format.OWS();
+
+  it('should read ServiceProvider tag properly', function() {
+    var doc = ol.xml.parse(
+        '<ows:GetCapabilities xmlns:ows="http://www.opengis.net/ows/1.1" ' +
+        'xmlns:xlink="http://www.w3.org/1999/xlink" >' +
+        '<ows:ServiceProvider>' +
+        '<ows:ProviderName>MiraMon</ows:ProviderName>' +
+                    '<ows:ProviderSite ' +
+                    'xlink:href="http://www.creaf.uab.es/miramon"/>' +
+                    '<ows:ServiceContact>' +
+                        '<ows:IndividualName>Joan Maso Pau' +
+                        '</ows:IndividualName>' +
+                        '<ows:PositionName>Senior Software Engineer' +
+                        '</ows:PositionName>' +
+                        '<ows:ContactInfo>' +
+                            '<ows:Phone>' +
+                                '<ows:Voice>+34 93 581 1312</ows:Voice>' +
+                                '<ows:Facsimile>+34 93 581 4151' +
+                                '</ows:Facsimile>' +
+                            '</ows:Phone>' +
+                            '<ows:Address>' +
+                                '<ows:DeliveryPoint>Fac Ciencies UAB' +
+                                '</ows:DeliveryPoint>' +
+                                '<ows:City>Bellaterra</ows:City>' +
+                                '<ows:AdministrativeArea>Barcelona' +
+                                '</ows:AdministrativeArea>' +
+                                '<ows:PostalCode>08193</ows:PostalCode>' +
+                                '<ows:Country>Spain</ows:Country>' +
+                                '<ows:ElectronicMailAddress>joan.maso at uab.es' +
+                                '</ows:ElectronicMailAddress>' +
+                            '</ows:Address>' +
+                        '</ows:ContactInfo>' +
+                    '</ows:ServiceContact>' +
+                '</ows:ServiceProvider>' +
+            '</ows:GetCapabilities>'
+        );
+
+    var obj = parser.read(doc);
+    expect(obj).to.be.ok();
+    var serviceProvider = obj.serviceProvider;
+    expect(serviceProvider).to.be.ok();
+    expect(serviceProvider.providerName).to.eql('MiraMon');
+    var url = 'http://www.creaf.uab.es/miramon';
+    expect(serviceProvider.providerSite).to.eql(url);
+    var name = 'Joan Maso Pau';
+    expect(serviceProvider.serviceContact.individualName).to.eql(name);
+    var position = 'Senior Software Engineer';
+    expect(serviceProvider.serviceContact.positionName).to.eql(position);
+  });
+
+  it('should read ServiceIdentification tag properly', function() {
+    var doc = ol.xml.parse(
+        '<ows:GetCapabilities xmlns:ows="http://www.opengis.net/ows/1.1" ' +
+        'xmlns:xlink="http://www.w3.org/1999/xlink" >' +
+        '<ows:ServiceIdentification>' +
+            '<ows:Title>Web Map Tile Service</ows:Title>' +
+            '<ows:Abstract>Service that contrains the map access interface ' +
+            'to some TileMatrixSets</ows:Abstract>' +
+            '<ows:Keywords>' +
+                '<ows:Keyword>tile</ows:Keyword>' +
+                '<ows:Keyword>tile matrix set</ows:Keyword>' +
+                '<ows:Keyword>map</ows:Keyword>' +
+            '</ows:Keywords>' +
+            '<ows:ServiceType>OGC WMTS</ows:ServiceType>' +
+            '<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>' +
+            '<ows:Fees>none</ows:Fees>' +
+            '<ows:AccessConstraints>none</ows:AccessConstraints>' +
+        '</ows:ServiceIdentification>' +
+        '</ows:GetCapabilities>'
+        );
+    var obj = parser.readFromNode(doc.firstChild);
+    expect(obj).to.be.ok();
+
+    var serviceIdentification = obj.serviceIdentification;
+    expect(serviceIdentification).to.be.ok();
+    expect(serviceIdentification.title).to.eql('Web Map Tile Service');
+    expect(serviceIdentification.serviceTypeVersion).to.eql('1.0.0');
+    expect(serviceIdentification.serviceType).to.eql('OGC WMTS');
+  });
+
+  it('should read OperationsMetadata tag properly', function() {
+    var doc = ol.xml.parse(
+        '<ows:GetCapabilities xmlns:ows="http://www.opengis.net/ows/1.1" ' +
+        'xmlns:xlink="http://www.w3.org/1999/xlink" >' +
+        '<ows:OperationsMetadata>' +
+            '<ows:Operation name="GetCapabilities">' +
+                '<ows:DCP>' +
+                    '<ows:HTTP>' +
+                        '<ows:Get xlink:href=' +
+                        '"http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?">' +
+                            '<ows:Constraint name="GetEncoding">' +
+                                '<ows:AllowedValues>' +
+                                    '<ows:Value>KVP</ows:Value>' +
+                                '</ows:AllowedValues>' +
+                            '</ows:Constraint>' +
+                        '</ows:Get>' +
+                    '</ows:HTTP>' +
+                '</ows:DCP>' +
+            '</ows:Operation>' +
+            '<ows:Operation name="GetTile">' +
+                '<ows:DCP>' +
+                    '<ows:HTTP>' +
+                        '<ows:Get xlink:href="http://www.miramon.uab.es/cgi-' +
+                        'bin/MiraMon5_0.cgi?"/>' +
+                        '<ows:Get xlink:href="http://www.miramon.uab.es/cgi-' +
+                        'bin/MiraMon6_0.cgi?"/>' +
+                        '<ows:Post xlink:href="http://www.miramon.uab.es/cgi-' +
+                        'bin/MiraMon7_0.cgi?"/>' +
+                    '</ows:HTTP>' +
+                '</ows:DCP>' +
+            '</ows:Operation>' +
+            '<ows:Operation name="GetFeatureInfo">' +
+                '<ows:DCP>' +
+                    '<ows:HTTP>' +
+                        '<ows:Get xlink:href="http://www.miramon.uab.es/cgi-' +
+                        'bin/MiraMon5_0.cgi?"/>' +
+                    '</ows:HTTP>' +
+                '</ows:DCP>' +
+            '</ows:Operation>' +
+        '</ows:OperationsMetadata>' +
+        '</ows:GetCapabilities>'
+        );
+    var obj = parser.readFromNode(doc.firstChild);
+    expect(obj).to.be.ok();
+
+    var operationsMetadata = obj.operationsMetadata;
+    expect(operationsMetadata).to.be.ok();
+    var dcp = operationsMetadata.GetCapabilities.dcp;
+    var url = 'http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?';
+    expect(dcp.http.get[0].url).to.eql(url);
+    dcp = operationsMetadata.GetCapabilities.dcp;
+    expect(dcp.http.get[0].constraints.GetEncoding.allowedValues).to.eql(
+        {'KVP': true});
+    url = 'http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?';
+    dcp = operationsMetadata.GetFeatureInfo.dcp;
+    expect(dcp.http.get[0].url).to.eql(url);
+    dcp = operationsMetadata.GetFeatureInfo.dcp;
+    expect(dcp.http.get[0].constraints).to.be(undefined);
+    url = 'http://www.miramon.uab.es/cgi-bin/MiraMon5_0.cgi?';
+    expect(operationsMetadata.GetTile.dcp.http.get[0].url).to.eql(url);
+    dcp = operationsMetadata.GetTile.dcp;
+    expect(dcp.http.get[0].constraints).to.be(undefined);
+  });
+
+});
+
+goog.require('ol.format.OWS');
diff --git a/test/spec/ol/format/polylineformat.test.js b/test/spec/ol/format/polylineformat.test.js
new file mode 100644
index 0000000..1137d7c
--- /dev/null
+++ b/test/spec/ol/format/polylineformat.test.js
@@ -0,0 +1,383 @@
+goog.provide('ol.test.format.Polyline');
+
+describe('ol.format.Polyline', function() {
+
+  var format;
+  var points;
+  var flatPoints, encodedFlatPoints;
+  var floats, smallFloats, encodedFloats;
+  var signedIntegers, encodedSignedIntegers;
+  var unsignedIntegers, encodedUnsignedIntegers;
+
+  function resetTestingData() {
+    format = new ol.format.Polyline();
+    points = [[-120.20000, 38.50000],
+              [-120.95000, 40.70000],
+              [-126.45300, 43.25200]];
+    flatPoints = [-120.20000, 38.50000,
+                  -120.95000, 40.70000,
+                  -126.45300, 43.25200];
+    flippedFlatPoints = [38.50000, -120.20000,
+                         40.70000, -120.95000,
+                         43.25200, -126.45300];
+    encodedFlatPoints = '_p~iF~ps|U_ulLnnqC_mqNvxq`@';
+    points3857 = [
+      ol.proj.transform([-120.20000, 38.50000], 'EPSG:4326', 'EPSG:3857'),
+      ol.proj.transform([-120.95000, 40.70000], 'EPSG:4326', 'EPSG:3857'),
+      ol.proj.transform([-126.45300, 43.25200], 'EPSG:4326', 'EPSG:3857')];
+
+    floats = [0.00, 0.15, -0.01, -0.16, 0.16, 0.01];
+    smallFloats = [0.00000, 0.00015, -0.00001, -0.00016, 0.00016, 0.00001];
+    encodedFloats = '?]@^_ at A';
+
+    signedIntegers = [0, 15, -1, -16, 16, 1];
+    encodedSignedIntegers = '?]@^_ at A';
+
+    unsignedIntegers = [0, 30, 1, 31, 32, 2, 174];
+    encodedUnsignedIntegers = '?]@^_ at AmD';
+  }
+
+  // Reset testing data
+  beforeEach(resetTestingData);
+
+
+  describe('encodeDeltas', function() {
+    it('returns expected value', function() {
+      var encodeDeltas = ol.format.Polyline.encodeDeltas;
+
+      expect(encodeDeltas(flippedFlatPoints, 2)).to.eql(encodedFlatPoints);
+    });
+  });
+
+  describe('decodeDeltas', function() {
+    it('returns expected value', function() {
+      var decodeDeltas = ol.format.Polyline.decodeDeltas;
+
+      expect(decodeDeltas(encodedFlatPoints, 2)).to.eql(flippedFlatPoints);
+    });
+  });
+
+
+
+  describe('encodeFloats', function() {
+    it('returns expected value', function() {
+      var encodeFloats = ol.format.Polyline.encodeFloats;
+
+      expect(encodeFloats(smallFloats)).to.eql(encodedFloats);
+
+      resetTestingData();
+      expect(encodeFloats(smallFloats, 1e5)).to.eql(encodedFloats);
+
+      expect(encodeFloats(floats, 1e2)).to.eql(encodedFloats);
+    });
+  });
+
+  describe('decodeFloats', function() {
+    it('returns expected value', function() {
+      var decodeFloats = ol.format.Polyline.decodeFloats;
+
+      expect(decodeFloats(encodedFloats)).to.eql(smallFloats);
+      expect(decodeFloats(encodedFloats, 1e5)).to.eql(smallFloats);
+      expect(decodeFloats(encodedFloats, 1e2)).to.eql(floats);
+    });
+  });
+
+
+
+  describe('encodeSignedIntegers', function() {
+    it('returns expected value', function() {
+      var encodeSignedIntegers = ol.format.Polyline.encodeSignedIntegers;
+
+      expect(encodeSignedIntegers(
+          signedIntegers)).to.eql(encodedSignedIntegers);
+    });
+  });
+
+  describe('decodeSignedIntegers', function() {
+    it('returns expected value', function() {
+      var decodeSignedIntegers = ol.format.Polyline.decodeSignedIntegers;
+
+      expect(decodeSignedIntegers(
+          encodedSignedIntegers)).to.eql(signedIntegers);
+    });
+  });
+
+
+
+  describe('encodeUnsignedIntegers', function() {
+    it('returns expected value', function() {
+      var encodeUnsignedIntegers = ol.format.Polyline.encodeUnsignedIntegers;
+
+      expect(encodeUnsignedIntegers(
+          unsignedIntegers)).to.eql(encodedUnsignedIntegers);
+    });
+  });
+
+  describe('decodeUnsignedIntegers', function() {
+    it('returns expected value', function() {
+      var decodeUnsignedIntegers = ol.format.Polyline.decodeUnsignedIntegers;
+
+      expect(decodeUnsignedIntegers(
+          encodedUnsignedIntegers)).to.eql(unsignedIntegers);
+    });
+  });
+
+
+
+  describe('encodeFloat', function() {
+    it('returns expected value', function() {
+      var encodeFloats = ol.format.Polyline.encodeFloats;
+
+      expect(encodeFloats([0.00000])).to.eql('?');
+      expect(encodeFloats([-0.00001])).to.eql('@');
+      expect(encodeFloats([0.00001])).to.eql('A');
+      expect(encodeFloats([-0.00002])).to.eql('B');
+      expect(encodeFloats([0.00002])).to.eql('C');
+      expect(encodeFloats([0.00015])).to.eql(']');
+      expect(encodeFloats([-0.00016])).to.eql('^');
+
+      expect(encodeFloats([-0.1], 10)).to.eql('@');
+      expect(encodeFloats([0.1], 10)).to.eql('A');
+
+      expect(encodeFloats([16 * 32 / 1e5])).to.eql('__@');
+      expect(encodeFloats([16 * 32 * 32 / 1e5])).to.eql('___@');
+
+      // from the "Encoded Polyline Algorithm Format" page at Google
+      expect(encodeFloats([-179.9832104])).to.eql('`~oia@');
+    });
+  });
+
+  describe('decodeFloat', function() {
+    it('returns expected value', function() {
+      var decodeFloats = ol.format.Polyline.decodeFloats;
+
+      expect(decodeFloats('?')).to.eql([0.00000]);
+      expect(decodeFloats('@')).to.eql([-0.00001]);
+      expect(decodeFloats('A')).to.eql([0.00001]);
+      expect(decodeFloats('B')).to.eql([-0.00002]);
+      expect(decodeFloats('C')).to.eql([0.00002]);
+      expect(decodeFloats(']')).to.eql([0.00015]);
+      expect(decodeFloats('^')).to.eql([-0.00016]);
+
+      expect(decodeFloats('@', 10)).to.eql([-0.1]);
+      expect(decodeFloats('A', 10)).to.eql([0.1]);
+
+      expect(decodeFloats('__@')).to.eql([16 * 32 / 1e5]);
+      expect(decodeFloats('___@')).to.eql([16 * 32 * 32 / 1e5]);
+
+      // from the "Encoded Polyline Algorithm Format" page at Google
+      expect(decodeFloats('`~oia@')).to.eql([-179.98321]);
+    });
+  });
+
+
+
+  describe('encodeSignedInteger', function() {
+    it('returns expected value', function() {
+      var encodeSignedIntegers = ol.format.Polyline.encodeSignedIntegers;
+
+      expect(encodeSignedIntegers([0])).to.eql('?');
+      expect(encodeSignedIntegers([-1])).to.eql('@');
+      expect(encodeSignedIntegers([1])).to.eql('A');
+      expect(encodeSignedIntegers([-2])).to.eql('B');
+      expect(encodeSignedIntegers([2])).to.eql('C');
+      expect(encodeSignedIntegers([15])).to.eql(']');
+      expect(encodeSignedIntegers([-16])).to.eql('^');
+
+      expect(encodeSignedIntegers([16])).to.eql('_@');
+      expect(encodeSignedIntegers([16 * 32])).to.eql('__@');
+      expect(encodeSignedIntegers([16 * 32 * 32])).to.eql('___@');
+    });
+  });
+
+  describe('decodeSignedInteger', function() {
+    it('returns expected value', function() {
+      var decodeSignedIntegers = ol.format.Polyline.decodeSignedIntegers;
+
+      expect(decodeSignedIntegers('?')).to.eql([0]);
+      expect(decodeSignedIntegers('@')).to.eql([-1]);
+      expect(decodeSignedIntegers('A')).to.eql([1]);
+      expect(decodeSignedIntegers('B')).to.eql([-2]);
+      expect(decodeSignedIntegers('C')).to.eql([2]);
+      expect(decodeSignedIntegers(']')).to.eql([15]);
+      expect(decodeSignedIntegers('^')).to.eql([-16]);
+
+      expect(decodeSignedIntegers('_@')).to.eql([16]);
+      expect(decodeSignedIntegers('__@')).to.eql([16 * 32]);
+      expect(decodeSignedIntegers('___@')).to.eql([16 * 32 * 32]);
+    });
+  });
+
+
+
+  describe('encodeUnsignedInteger', function() {
+    it('returns expected value', function() {
+      var encodeUnsignedInteger = ol.format.Polyline.encodeUnsignedInteger;
+
+      expect(encodeUnsignedInteger(0)).to.eql('?');
+      expect(encodeUnsignedInteger(1)).to.eql('@');
+      expect(encodeUnsignedInteger(2)).to.eql('A');
+      expect(encodeUnsignedInteger(30)).to.eql(']');
+      expect(encodeUnsignedInteger(31)).to.eql('^');
+      expect(encodeUnsignedInteger(32)).to.eql('_@');
+
+      expect(encodeUnsignedInteger(32 * 32)).to.eql('__@');
+      expect(encodeUnsignedInteger(5 * 32 * 32)).to.eql('__D');
+      expect(encodeUnsignedInteger(32 * 32 * 32)).to.eql('___@');
+
+      // from the "Encoded Polyline Algorithm Format" page at Google
+      expect(encodeUnsignedInteger(174)).to.eql('mD');
+    });
+  });
+
+  describe('decodeUnsignedInteger', function() {
+    it('returns expected value', function() {
+      var decodeUnsignedIntegers = ol.format.Polyline.decodeUnsignedIntegers;
+
+      expect(decodeUnsignedIntegers('?')).to.eql([0]);
+      expect(decodeUnsignedIntegers('@')).to.eql([1]);
+      expect(decodeUnsignedIntegers('A')).to.eql([2]);
+      expect(decodeUnsignedIntegers(']')).to.eql([30]);
+      expect(decodeUnsignedIntegers('^')).to.eql([31]);
+      expect(decodeUnsignedIntegers('_@')).to.eql([32]);
+
+      expect(decodeUnsignedIntegers('__@')).to.eql([32 * 32]);
+      expect(decodeUnsignedIntegers('__D')).to.eql([5 * 32 * 32]);
+      expect(decodeUnsignedIntegers('___@')).to.eql([32 * 32 * 32]);
+
+      // from the "Encoded Polyline Algorithm Format" page at Google
+      expect(decodeUnsignedIntegers('mD')).to.eql([174]);
+    });
+  });
+
+  describe('#readFeature', function() {
+
+    it('returns the expected feature', function() {
+      var feature = format.readFeature(encodedFlatPoints);
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.an(ol.geom.LineString);
+      expect(geometry.getFlatCoordinates()).to.eql(flatPoints);
+    });
+
+    it('transforms and returns the expected feature', function() {
+      var feature = format.readFeature(encodedFlatPoints, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.an(ol.geom.LineString);
+      expect(geometry.getCoordinates()).to.eql(points3857);
+    });
+
+  });
+
+  describe('#readFeatures', function() {
+
+    it('returns the expected feature', function() {
+      var features = format.readFeatures(encodedFlatPoints);
+      expect(features).to.be.an(Array);
+      expect(features).to.have.length(1);
+      var feature = features[0];
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.an(ol.geom.LineString);
+      expect(geometry.getFlatCoordinates()).to.eql(flatPoints);
+    });
+
+    it('transforms and returns the expected features', function() {
+      var features = format.readFeatures(encodedFlatPoints, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(features).to.be.an(Array);
+      expect(features).to.have.length(1);
+      var feature = features[0];
+      expect(feature).to.be.an(ol.Feature);
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.an(ol.geom.LineString);
+      expect(geometry.getCoordinates()).to.eql(points3857);
+    });
+
+  });
+
+  describe('#readGeometry', function() {
+
+    it('returns the expected geometry', function() {
+      var geometry = format.readGeometry(encodedFlatPoints);
+      expect(geometry).to.be.an(ol.geom.LineString);
+      expect(geometry.getFlatCoordinates()).to.eql(flatPoints);
+    });
+
+    it('transforms and returns the expected geometry', function() {
+      var geometry = format.readGeometry(encodedFlatPoints, {
+        featureProjection: 'EPSG:3857'
+      });
+      expect(geometry).to.be.an(ol.geom.LineString);
+      expect(geometry.getCoordinates()).to.eql(points3857);
+    });
+
+  });
+
+  describe('#readProjection', function() {
+
+    it('returns the expected projection', function() {
+      var projection = format.readProjection(encodedFlatPoints);
+      expect(projection).to.be(ol.proj.get('EPSG:4326'));
+    });
+
+  });
+
+  describe('#writeFeature', function() {
+
+    it('returns the expected text', function() {
+      var feature = new ol.Feature(new ol.geom.LineString(points));
+      expect(format.writeFeature(feature)).to.be(encodedFlatPoints);
+    });
+
+    it('transforms and returns the expected text', function() {
+      var feature = new ol.Feature(new ol.geom.LineString(points3857));
+      expect(format.writeFeature(feature, {
+        featureProjection: 'EPSG:3857'
+      })).to.be(encodedFlatPoints);
+    });
+
+  });
+
+  describe('#writeFeature', function() {
+
+    it('returns the expected text', function() {
+      var features = [new ol.Feature(new ol.geom.LineString(points))];
+      expect(format.writeFeatures(features)).to.be(encodedFlatPoints);
+    });
+
+    it('transforms and returns the expected text', function() {
+      var features = [new ol.Feature(new ol.geom.LineString(points3857))];
+      expect(format.writeFeatures(features, {
+        featureProjection: 'EPSG:3857'
+      })).to.be(encodedFlatPoints);
+    });
+
+  });
+
+  describe('#writeGeometry', function() {
+
+    it('returns the expected text', function() {
+      var geometry = new ol.geom.LineString(points);
+      expect(format.writeGeometry(geometry)).to.be(encodedFlatPoints);
+    });
+
+    it('transforms and returns the expected text', function() {
+      var geometry = new ol.geom.LineString(points3857);
+      expect(format.writeGeometry(geometry, {
+        featureProjection: 'EPSG:3857'
+      })).to.be(encodedFlatPoints);
+    });
+
+  });
+
+});
+
+goog.require('ol.Feature');
+goog.require('ol.format.Polyline');
+goog.require('ol.geom.LineString');
+goog.require('ol.proj');
diff --git a/test/spec/ol/format/topojson.test.js b/test/spec/ol/format/topojson.test.js
new file mode 100644
index 0000000..47f0ac7
--- /dev/null
+++ b/test/spec/ol/format/topojson.test.js
@@ -0,0 +1,162 @@
+goog.provide('ol.test.format.TopoJSON');
+
+var aruba = {
+  type: 'Topology',
+  transform: {
+    scale: [0.036003600360036005, 0.017361589674592462],
+    translate: [-180, -89.99892578124998]
+  },
+  objects: {
+    aruba: {
+      type: 'Polygon',
+      properties: {
+        prop0: 'value0'
+      },
+      arcs: [[0]],
+      id: 533
+    }
+  },
+  arcs: [
+    [[3058, 5901], [0, -2], [-2, 1], [-1, 3], [-2, 3], [0, 3], [1, 1], [1, -3],
+      [2, -5], [1, -1]]
+  ]
+};
+
+
+describe('ol.format.TopoJSON', function() {
+
+  var format;
+  before(function() {
+    format = new ol.format.TopoJSON();
+  });
+
+  describe('constructor', function() {
+    it('creates a new format', function() {
+      expect(format).to.be.a(ol.format.Feature);
+      expect(format).to.be.a(ol.format.TopoJSON);
+    });
+  });
+
+  describe('#readFeaturesFromTopology_()', function() {
+
+    it('creates an array of features from a topology', function() {
+      var features = format.readFeaturesFromObject(aruba);
+      expect(features).to.have.length(1);
+
+      var feature = features[0];
+      expect(feature).to.be.a(ol.Feature);
+
+      var geometry = feature.getGeometry();
+      expect(geometry).to.be.a(ol.geom.Polygon);
+
+      // Parses identifier
+      expect(feature.getId()).to.be(533);
+      // Parses properties
+      expect(feature.get('prop0')).to.be('value0');
+
+      expect(geometry.getExtent()).to.eql([
+        -70.08100810081008, 12.417091709170947,
+        -69.9009900990099, 12.608069195591469
+      ]);
+    });
+
+  });
+
+  describe('#readFeatures()', function() {
+
+    it('parses simple.json', function(done) {
+      afterLoadText('spec/ol/format/topojson/simple.json', function(text) {
+        var features = format.readFeatures(text);
+        expect(features.length).to.be(3);
+
+        var point = features[0].getGeometry();
+        expect(point.getType()).to.be('Point');
+        expect(point.getFlatCoordinates()).to.eql([102, 0.5]);
+
+        var line = features[1].getGeometry();
+        expect(line.getType()).to.be('LineString');
+        expect(line.getFlatCoordinates()).to.eql([
+          102, 0, 103, 1, 104, 0, 105, 1
+        ]);
+
+        var polygon = features[2].getGeometry();
+        expect(polygon.getType()).to.be('Polygon');
+        expect(polygon.getFlatCoordinates()).to.eql([
+          100, 0, 100, 1, 101, 1, 101, 0, 100, 0
+        ]);
+
+        done();
+      });
+    });
+
+    it('parses simple.json and transforms', function(done) {
+      afterLoadText('spec/ol/format/topojson/simple.json', function(text) {
+        var features = format.readFeatures(text, {
+          featureProjection: 'EPSG:3857'
+        });
+        expect(features.length).to.be(3);
+
+        var point = features[0].getGeometry();
+        expect(point.getType()).to.be('Point');
+        expect(features[0].getGeometry().getCoordinates()).to.eql(
+            ol.proj.transform([102.0, 0.5], 'EPSG:4326', 'EPSG:3857'));
+
+        var line = features[1].getGeometry();
+        expect(line.getType()).to.be('LineString');
+        expect(line.getCoordinates()).to.eql([
+          ol.proj.transform([102.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
+          ol.proj.transform([103.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
+          ol.proj.transform([104.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
+          ol.proj.transform([105.0, 1.0], 'EPSG:4326', 'EPSG:3857')
+        ]);
+
+        var polygon = features[2].getGeometry();
+        expect(polygon.getType()).to.be('Polygon');
+        expect(polygon.getCoordinates()).to.eql([[
+          ol.proj.transform([100.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
+          ol.proj.transform([100.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
+          ol.proj.transform([101.0, 1.0], 'EPSG:4326', 'EPSG:3857'),
+          ol.proj.transform([101.0, 0.0], 'EPSG:4326', 'EPSG:3857'),
+          ol.proj.transform([100.0, 0.0], 'EPSG:4326', 'EPSG:3857')
+        ]]);
+
+        done();
+      });
+    });
+
+    it('parses world-110m.json', function(done) {
+      afterLoadText('spec/ol/format/topojson/world-110m.json', function(text) {
+
+        var features = format.readFeatures(text);
+        expect(features.length).to.be(178);
+
+        var first = features[0];
+        expect(first).to.be.a(ol.Feature);
+        var firstGeom = first.getGeometry();
+        expect(firstGeom).to.be.a(ol.geom.MultiPolygon);
+        expect(firstGeom.getExtent()).to.eql(
+            [-180, -85.60903777459777, 180, 83.64513000000002]);
+
+        var last = features[177];
+        expect(last).to.be.a(ol.Feature);
+        var lastGeom = last.getGeometry();
+        expect(lastGeom).to.be.a(ol.geom.Polygon);
+        expect(lastGeom.getExtent()).to.eql([
+          25.26325263252633, -22.271802279310577,
+          32.848528485284874, -15.50833810039586
+        ]);
+
+        done();
+      });
+    });
+
+  });
+
+});
+
+goog.require('ol.Feature');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Polygon');
+goog.require('ol.format.Feature');
+goog.require('ol.proj');
+goog.require('ol.format.TopoJSON');
diff --git a/test/spec/ol/format/topojson/simple.json b/test/spec/ol/format/topojson/simple.json
new file mode 100644
index 0000000..70a9f14
--- /dev/null
+++ b/test/spec/ol/format/topojson/simple.json
@@ -0,0 +1,39 @@
+{
+  "type": "Topology",
+  "objects": {
+    "example": {
+      "type": "GeometryCollection",
+      "geometries": [
+        {
+          "type": "Point",
+          "properties": {
+            "prop0": "value0"
+          },
+          "coordinates": [102, 0.5]
+        },
+        {
+          "type": "LineString",
+          "properties": {
+            "prop0": "value0",
+            "prop1": 0
+          },
+          "arcs": [0]
+        },
+        {
+          "type": "Polygon",
+          "properties": {
+            "prop0": "value0",
+            "prop1": {
+              "this": "that"
+            }
+          },
+          "arcs": [[-2]]
+        }
+      ]
+    }
+  },
+  "arcs": [
+    [[102, 0], [103, 1], [104, 0], [105, 1]],
+    [[100, 0], [101, 0], [101, 1], [100, 1], [100, 0]]
+  ]
+}
\ No newline at end of file
diff --git a/test/spec/ol/format/topojson/world-110m.json b/test/spec/ol/format/topojson/world-110m.json
new file mode 100644
index 0000000..2f4dd1f
--- /dev/null
+++ b/test/spec/ol/format/topojson/world-110m.json
@@ -0,0 +1 @@
+{"type":"Topology","transform":{"scale":[0.0036000360003600037,0.0016925586033320111],"translate":[-180,-85.60903777459777]},"objects":{"land":{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7,8,9]],[[10,11]],[[12]],[[13]],[[14]],[[15]],[[16]],[[17]],[[18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29,30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42,43]],[[44]],[[45]],[[46]],[[47,48,49,50]],[[5 [...]
diff --git a/test/spec/ol/format/wfs/GetFeatureMultiple.xml b/test/spec/ol/format/wfs/GetFeatureMultiple.xml
new file mode 100644
index 0000000..10dcdb2
--- /dev/null
+++ b/test/spec/ol/format/wfs/GetFeatureMultiple.xml
@@ -0,0 +1,4 @@
+<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <wfs:Query typeName="topp:states" xmlns:topp="http://www.openplans.org/topp"/>
+    <wfs:Query typeName="topp:cities" xmlns:topp="http://www.openplans.org/topp"/>
+</wfs:GetFeature>
diff --git a/test/spec/ol/format/wfs/Native.xml b/test/spec/ol/format/wfs/Native.xml
new file mode 100644
index 0000000..d3ff10f
--- /dev/null
+++ b/test/spec/ol/format/wfs/Native.xml
@@ -0,0 +1 @@
+<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><wfs:Native vendorId="ORACLE" safeToIgnore="true">ALTER SESSION ENABLE PARALLEL DML</wfs:Native><wfs:Native vendorId="ORACLE" safeToIgnore="false">Another native line goes here</wfs:Native></wfs:Transaction>
diff --git a/test/spec/ol/format/wfs/NumberOfFeatures.xml b/test/spec/ol/format/wfs/NumberOfFeatures.xml
new file mode 100644
index 0000000..dcc67c3
--- /dev/null
+++ b/test/spec/ol/format/wfs/NumberOfFeatures.xml
@@ -0,0 +1,9 @@
+<?xml version='1.0' encoding="ISO-8859-1" ?>
+<wfs:FeatureCollection
+   xmlns:rws="http://mapserver.gis.umn.edu/mapserver"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://intranet.rijkswaterstaat.nl/services/geoservices/nwb_wegen?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=feature:AAA64&OUTPUTFORMAT=text/xml; subtype=gml/3.1.1  http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" numberOfFeatures="625">
+</wfs:FeatureCollection>
diff --git a/test/spec/ol/format/wfs/TransactionMulti.xml b/test/spec/ol/format/wfs/TransactionMulti.xml
new file mode 100644
index 0000000..1154cb3
--- /dev/null
+++ b/test/spec/ol/format/wfs/TransactionMulti.xml
@@ -0,0 +1,45 @@
+<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
+    <wfs:Insert>
+        <feature:states xmlns:feature="http://www.openplans.org/topp">
+            <feature:the_geom>
+                <gml:MultiPoint xmlns:gml="http://www.opengis.net/gml">
+                    <gml:pointMember>
+                        <gml:Point>
+                            <gml:pos>1 2</gml:pos>
+                        </gml:Point>
+                    </gml:pointMember>
+                </gml:MultiPoint>
+            </feature:the_geom>
+            <feature:foo>bar</feature:foo>
+        </feature:states>
+    </wfs:Insert>
+    <wfs:Update xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+        <wfs:Property>
+            <wfs:Name>the_geom</wfs:Name>
+            <wfs:Value>
+                <gml:MultiPoint xmlns:gml="http://www.opengis.net/gml">
+                    <gml:pointMember>
+                        <gml:Point>
+                            <gml:pos>1 2</gml:pos>
+                        </gml:Point>
+                    </gml:pointMember>
+                </gml:MultiPoint>
+            </wfs:Value>
+        </wfs:Property>
+        <wfs:Property>
+            <wfs:Name>foo</wfs:Name>
+            <wfs:Value>bar</wfs:Value>
+        </wfs:Property>
+        <wfs:Property>
+            <wfs:Name>nul</wfs:Name>
+        </wfs:Property>
+        <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:FeatureId fid="fid.42"/>
+        </ogc:Filter>
+    </wfs:Update>
+    <wfs:Delete xmlns:wfs="http://www.opengis.net/wfs" typeName="topp:states" xmlns:topp="http://www.openplans.org/topp">
+        <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
+            <ogc:FeatureId fid="fid.37"/>
+        </ogc:Filter>
+    </wfs:Delete>
+</wfs:Transaction>
diff --git a/test/spec/ol/format/wfs/TransactionResponse.xml b/test/spec/ol/format/wfs/TransactionResponse.xml
new file mode 100644
index 0000000..6a64bdd
--- /dev/null
+++ b/test/spec/ol/format/wfs/TransactionResponse.xml
@@ -0,0 +1,16 @@
+<wfs:TransactionResponse version="1.1.0" xmlns:ogc="http://www.opengis.net/ogc" xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:sf="http://www.openplans.org/spearfish" xmlns:ows="http://www.opengis.net/ows" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <wfs:TransactionSummary>
+        <wfs:totalInserted>0</wfs:totalInserted>
+        <wfs:totalUpdated>1</wfs:totalUpdated>
+        <wfs:totalDeleted>0</wfs:totalDeleted>
+    </wfs:TransactionSummary>
+    <wfs:TransactionResults/>
+    <wfs:InsertResults>
+        <wfs:Feature>
+            <ogc:FeatureId fid="parcelle.40"/>
+        </wfs:Feature>
+        <wfs:Feature>
+            <ogc:FeatureId fid="parcelle.41"/>
+        </wfs:Feature>
+    </wfs:InsertResults>
+</wfs:TransactionResponse>
diff --git a/test/spec/ol/format/wfs/TransactionSrs.xml b/test/spec/ol/format/wfs/TransactionSrs.xml
new file mode 100644
index 0000000..14d1090
--- /dev/null
+++ b/test/spec/ol/format/wfs/TransactionSrs.xml
@@ -0,0 +1 @@
+<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" service="WFS" version="1.1.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><wfs:Insert><feature:FAULTS xmlns:feature="http://foo"><feature:the_geom><gml:MultiCurve xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:900913"><gml:curveMember><gml:LineString srsName="EPSG:900913"><gml:posList>-5178372.1885436 1992365.7775042 -4434792 [...]
diff --git a/test/spec/ol/format/wfs/TransactionUpdate.xml b/test/spec/ol/format/wfs/TransactionUpdate.xml
new file mode 100644
index 0000000..9155d91
--- /dev/null
+++ b/test/spec/ol/format/wfs/TransactionUpdate.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Transaction xmlns="http://www.opengis.net/wfs" service="WFS" version="1.1.0"
+    xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <Update typeName="foo:FAULTS" xmlns:foo="http://foo">
+        <Property>
+            <Name>the_geom</Name>
+            <Value><MultiLineString xmlns="http://www.opengis.net/gml" srsName="EPSG:900913">
+                    <lineStringMember>
+                        <LineString srsName="EPSG:900913">
+                            <posList>-12279454 6741885 -12064207
+                                6732101 -11941908 6595126
+                                -12240318 6507071 -12416429
+                                6604910</posList>
+                        </LineString>
+                    </lineStringMember>
+                </MultiLineString></Value>
+        </Property>
+        <Filter xmlns="http://www.opengis.net/ogc">
+            <FeatureId fid="FAULTS.4455"/>
+        </Filter>
+    </Update>
+</Transaction>
diff --git a/test/spec/ol/format/wfs/boundedBy.xml b/test/spec/ol/format/wfs/boundedBy.xml
new file mode 100644
index 0000000..4daeb2e
--- /dev/null
+++ b/test/spec/ol/format/wfs/boundedBy.xml
@@ -0,0 +1,47 @@
+<wfs:FeatureCollection
+   xmlns:rws="http://mapserver.gis.umn.edu/mapserver"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://ontwikkel.intranet.rijkswaterstaat.nl/services/geoservices/ov_zonering?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=AAA212&OUTPUTFORMAT=text/xml; subtype=gml/3.1.1  http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
+      <gml:boundedBy>
+        <gml:Envelope srsName="EPSG:28992">
+                <gml:lowerCorner>3197.880000 306457.313000</gml:lowerCorner>
+                <gml:upperCorner>280339.156000 613850.438000</gml:upperCorner>
+        </gml:Envelope>
+      </gml:boundedBy>
+    <gml:featureMember>
+
+      <rws:AAA212 gml:id="AAA212.791">
+        <gml:boundedBy>
+                <gml:Envelope srsName="EPSG:28992">
+                        <gml:lowerCorner>196507.469000 502347.938000</gml:lowerCorner>
+                        <gml:upperCorner>202430.844000 510383.719000</gml:upperCorner>
+                </gml:Envelope>
+        </gml:boundedBy>
+        <rws:geometry>
+
+          <gml:MultiSurface srsName="EPSG:28992">
+            <gml:surfaceMembers>
+              <gml:Polygon>
+                <gml:exterior>
+                  <gml:LinearRing>
+                    <gml:posList srsDimension="2">200448.047000 510383.719000 198475.031000 509253.875000 198477.422000 507339.688000 196507.469000 505841.969000 196507.625000 504980.281000 196621.359000 505029.969000 196825.328000 505114.000000 197310.031000 505183.469000 197636.609000 505148.750000 197837.594000 505061.563000 197941.031000 504953.688000 198003.094000 504817.719000 198023.781000 504721.688000 198016.391000 504597.531000 197907.234000 504363.219000 197716.734000 504013.9 [...]
+                  </gml:LinearRing>
+                </gml:exterior>
+
+              </gml:Polygon>
+            </gml:surfaceMembers>
+          </gml:MultiSurface>
+        </rws:geometry>
+        <rws:OBJECTID>791</rws:OBJECTID>
+        <rws:HECTARES>1800.89</rws:HECTARES>
+        <rws:ZONENR>4620</rws:ZONENR>
+
+        <rws:NULZONES> </rws:NULZONES>
+        <rws:AREA>0</rws:AREA>
+        <rws:PERIMETER>24305.1</rws:PERIMETER>
+      </rws:AAA212>
+    </gml:featureMember>
+</wfs:FeatureCollection>
diff --git a/test/spec/ol/format/wfs/mapserver.xml b/test/spec/ol/format/wfs/mapserver.xml
new file mode 100644
index 0000000..c71781c
--- /dev/null
+++ b/test/spec/ol/format/wfs/mapserver.xml
@@ -0,0 +1,197 @@
+<?xml version='1.0' encoding="UTF-8" ?>
+<wfs:FeatureCollection
+   xmlns:ms="http://mapserver.gis.umn.edu/mapserver"
+   xmlns:gml="http://www.opengis.net/gml"
+   xmlns:wfs="http://www.opengis.net/wfs"
+   xmlns:ogc="http://www.opengis.net/ogc"
+   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+   xsi:schemaLocation="http://mapserver.gis.umn.edu/mapserver http://localhost/cgi-bin/mtbows?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&TYPENAME=ms:Historische_Messtischblaetter_WFS&OUTPUTFORMAT=text/xml;%20subtype=gml/3.1.1  http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">
+      <gml:boundedBy>
+      	<gml:Envelope srsName="EPSG:900913">
+      		<gml:lowerCorner>10.499999 50.599998</gml:lowerCorner>
+      		<gml:upperCorner>11.500001 51.000004</gml:upperCorner>
+      	</gml:Envelope>
+      </gml:boundedBy>
+    <gml:featureMember>
+      <ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055885">
+        <gml:boundedBy>
+        	<gml:Envelope srsName="EPSG:900913">
+        		<gml:lowerCorner>1205816.630831 6585772.755548</gml:lowerCorner>
+        		<gml:upperCorner>1224367.576331 6603402.922801</gml:upperCorner>
+        	</gml:Envelope>
+        </gml:boundedBy>
+        <ms:msGeometry>
+          <gml:Polygon srsName="EPSG:900913">
+            <gml:exterior>
+              <gml:LinearRing>
+                <gml:posList srsDimension="2">1205816.939380 6585772.755548 1205816.630831 6603402.592694 1224367.261890 6603402.922801 1224367.576331 6585773.084486 1205816.939380 6585772.755548 </gml:posList>
+              </gml:LinearRing>
+            </gml:exterior>
+          </gml:Polygon>
+        </ms:msGeometry>
+        <ms:mtbid>71055885</ms:mtbid>
+        <ms:blattnr>51_31</ms:blattnr>
+        <ms:time>1936</ms:time>
+        <ms:titel>Arnstadt</ms:titel>
+        <ms:permalink>http://digital.slub-dresden.de/id335959709</ms:permalink>
+        <ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5131.jpg</ms:original>
+        <ms:dateiname>df_dk_0010001_5131</ms:dateiname>
+      </ms:Historische_Messtischblaetter_WFS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055703">
+        <gml:boundedBy>
+        	<gml:Envelope srsName="EPSG:900913">
+        		<gml:lowerCorner>1224366.733352 6603402.922797</gml:lowerCorner>
+        		<gml:upperCorner>1242917.681900 6621070.996395</gml:upperCorner>
+        	</gml:Envelope>
+        </gml:boundedBy>
+        <ms:msGeometry>
+          <gml:Polygon srsName="EPSG:900913">
+            <gml:exterior>
+              <gml:LinearRing>
+                <gml:posList srsDimension="2">1224367.049596 6603402.922797 1224366.733352 6621070.658850 1242917.359733 6621070.996395 1242917.681900 6603403.259147 1224367.049596 6603402.922797 </gml:posList>
+              </gml:LinearRing>
+            </gml:exterior>
+          </gml:Polygon>
+        </ms:msGeometry>
+        <ms:mtbid>71055703</ms:mtbid>
+        <ms:blattnr>50_32</ms:blattnr>
+        <ms:time>1878</ms:time>
+        <ms:titel>Erfurt</ms:titel>
+        <ms:permalink>http://digital.slub-dresden.de/id335958907</ms:permalink>
+        <ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5032_1878.jpg</ms:original>
+        <ms:dateiname>df_dk_0010001_5032_1878</ms:dateiname>
+      </ms:Historische_Messtischblaetter_WFS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055704">
+        <gml:boundedBy>
+        	<gml:Envelope srsName="EPSG:900913">
+        		<gml:lowerCorner>1224366.733352 6603402.922797</gml:lowerCorner>
+        		<gml:upperCorner>1242917.681900 6621070.996395</gml:upperCorner>
+        	</gml:Envelope>
+        </gml:boundedBy>
+        <ms:msGeometry>
+          <gml:Polygon srsName="EPSG:900913">
+            <gml:exterior>
+              <gml:LinearRing>
+                <gml:posList srsDimension="2">1224367.049596 6603402.922797 1224366.733352 6621070.658850 1242917.359733 6621070.996395 1242917.681900 6603403.259147 1224367.049596 6603402.922797 </gml:posList>
+              </gml:LinearRing>
+            </gml:exterior>
+          </gml:Polygon>
+        </ms:msGeometry>
+        <ms:mtbid>71055704</ms:mtbid>
+        <ms:blattnr>50_32</ms:blattnr>
+        <ms:time>1905</ms:time>
+        <ms:titel>Erfurt</ms:titel>
+        <ms:permalink>http://digital.slub-dresden.de/id335958915</ms:permalink>
+        <ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5032_1905.jpg</ms:original>
+        <ms:dateiname>df_dk_0010001_5032_1905</ms:dateiname>
+      </ms:Historische_Messtischblaetter_WFS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055696">
+        <gml:boundedBy>
+        	<gml:Envelope srsName="EPSG:900913">
+        		<gml:lowerCorner>1168715.286189 6603401.951223</gml:lowerCorner>
+        		<gml:upperCorner>1187266.213287 6621070.002563</gml:upperCorner>
+        	</gml:Envelope>
+        </gml:boundedBy>
+        <ms:msGeometry>
+          <gml:Polygon srsName="EPSG:900913">
+            <gml:exterior>
+              <gml:LinearRing>
+                <gml:posList srsDimension="2">1168715.584649 6603401.951223 1168715.286189 6621069.683820 1187265.908897 6621070.002563 1187266.213287 6603402.268837 1168715.584649 6603401.951223 </gml:posList>
+              </gml:LinearRing>
+            </gml:exterior>
+          </gml:Polygon>
+        </ms:msGeometry>
+        <ms:mtbid>71055696</ms:mtbid>
+        <ms:blattnr>50_29</ms:blattnr>
+        <ms:time>1918</ms:time>
+        <ms:titel>Fröttstädt</ms:titel>
+        <ms:permalink>http://digital.slub-dresden.de/id335969488</ms:permalink>
+        <ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5029_1918.jpg</ms:original>
+        <ms:dateiname>df_dk_0010001_5029_1918</ms:dateiname>
+      </ms:Historische_Messtischblaetter_WFS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055699">
+        <gml:boundedBy>
+        	<gml:Envelope srsName="EPSG:900913">
+        		<gml:lowerCorner>1187265.802750 6603402.268835</gml:lowerCorner>
+        		<gml:upperCorner>1205816.736977 6621070.327575</gml:upperCorner>
+        	</gml:Envelope>
+        </gml:boundedBy>
+        <ms:msGeometry>
+          <gml:Polygon srsName="EPSG:900913">
+            <gml:exterior>
+              <gml:LinearRing>
+                <gml:posList srsDimension="2">1187266.107140 6603402.268835 1187265.802750 6621070.002561 1205816.426659 6621070.327575 1205816.736977 6603402.592696 1187266.107140 6603402.268835 </gml:posList>
+              </gml:LinearRing>
+            </gml:exterior>
+          </gml:Polygon>
+        </ms:msGeometry>
+        <ms:mtbid>71055699</ms:mtbid>
+        <ms:blattnr>50_30</ms:blattnr>
+        <ms:time>1936</ms:time>
+        <ms:titel>Gotha</ms:titel>
+        <ms:permalink>http://digital.slub-dresden.de/id335958877</ms:permalink>
+        <ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5030_1929.jpg</ms:original>
+        <ms:dateiname>df_dk_0010001_5030_1929</ms:dateiname>
+      </ms:Historische_Messtischblaetter_WFS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71056242">
+        <gml:boundedBy>
+        	<gml:Envelope srsName="EPSG:900913">
+        		<gml:lowerCorner>1205817.246161 6550626.582163</gml:lowerCorner>
+        		<gml:upperCorner>1224368.199845 6568181.598557</gml:upperCorner>
+        	</gml:Envelope>
+        </gml:boundedBy>
+        <ms:msGeometry>
+          <gml:Polygon srsName="EPSG:900913">
+            <gml:exterior>
+              <gml:LinearRing>
+                <gml:posList srsDimension="2">1205817.551211 6550626.582163 1205817.246161 6568181.270783 1224367.888970 6568181.598557 1224368.199845 6550626.908779 1205817.551211 6550626.582163 </gml:posList>
+              </gml:LinearRing>
+            </gml:exterior>
+          </gml:Polygon>
+        </ms:msGeometry>
+        <ms:mtbid>71056242</ms:mtbid>
+        <ms:blattnr>53_31</ms:blattnr>
+        <ms:time>1905</ms:time>
+        <ms:titel>Ilmenau</ms:titel>
+        <ms:permalink>http://digital.slub-dresden.de/id335961355</ms:permalink>
+        <ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5331_1905.jpg</ms:original>
+        <ms:dateiname>df_dk_0010001_5331_1905</ms:dateiname>
+      </ms:Historische_Messtischblaetter_WFS>
+    </gml:featureMember>
+    <gml:featureMember>
+      <ms:Historische_Messtischblaetter_WFS gml:id="Historische_Messtischblaetter_WFS.71055889">
+        <gml:boundedBy>
+        	<gml:Envelope srsName="EPSG:900913">
+        		<gml:lowerCorner>1242917.575754 6585773.419639</gml:lowerCorner>
+        		<gml:upperCorner>1261468.535543 6603403.601734</gml:upperCorner>
+        	</gml:Envelope>
+        </gml:boundedBy>
+        <ms:msGeometry>
+          <gml:Polygon srsName="EPSG:900913">
+            <gml:exterior>
+              <gml:LinearRing>
+                <gml:posList srsDimension="2">1242917.896084 6585773.419639 1242917.575754 6603403.259145 1261468.209327 6603403.601734 1261468.535543 6585773.761014 1242917.896084 6585773.419639 </gml:posList>
+              </gml:LinearRing>
+            </gml:exterior>
+          </gml:Polygon>
+        </ms:msGeometry>
+        <ms:mtbid>71055889</ms:mtbid>
+        <ms:blattnr>51_33</ms:blattnr>
+        <ms:time>1888</ms:time>
+        <ms:titel>Kranichfeld</ms:titel>
+        <ms:permalink>http://digital.slub-dresden.de/id335959733</ms:permalink>
+        <ms:original>http://fotothek.slub-dresden.de/fotos/df/dk/0010000/df_dk_0010001_5133_1873.jpg</ms:original>
+        <ms:dateiname>df_dk_0010001_5133_1873</ms:dateiname>
+      </ms:Historische_Messtischblaetter_WFS>
+    </gml:featureMember>
+</wfs:FeatureCollection>
diff --git a/test/spec/ol/format/wfs/polygonv2.xml b/test/spec/ol/format/wfs/polygonv2.xml
new file mode 100644
index 0000000..a8140cd
--- /dev/null
+++ b/test/spec/ol/format/wfs/polygonv2.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<wfs:FeatureCollection xmlns:ms="http://mapserver.gis.umn.edu/mapserver" xmlns:wfs="http://www.opengis.net/wfs" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd                         http://mapserver.gis.umn.edu/mapserver http://aneto.oco/cgi-bin/worldwfs?SERVICE=WFS&VERSION=1.0.0&REQUEST=DescribeFea [...]
+    <gml:boundedBy>
+        <gml:Box srsName="EPSG:4326">
+            <gml:coordinates>-0.768746,47.003018 3.002191,47.925567</gml:coordinates>
+        </gml:Box>
+    </gml:boundedBy>
+    <gml:featureMember>
+        <ms:polygon fid="1">
+            <gml:boundedBy>
+                <gml:Box srsName="EPSG:4326">
+                    <gml:coordinates>-0.768746,47.003018 0.532597,47.925567</gml:coordinates>
+                </gml:Box>
+            </gml:boundedBy>
+            <ms:msGeometry>
+                <gml:MultiPolygon srsName="EPSG:4326">
+                    <gml:polygonMember>
+                        <gml:Polygon>
+                            <gml:outerBoundaryIs>
+                                <gml:LinearRing>
+                                    <gml:coordinates>-0.318987,47.003018 -0.768746,47.358268 -0.574463,47.684285 -0.347374,47.854602 -0.006740,47.925567 0.135191,47.726864 0.149384,47.599127 0.419052,47.670092 0.532597,47.428810 0.305508,47.443003 0.475824,47.144948 0.064225,47.201721 -0.318987,47.003018 </gml:coordinates>
+                                </gml:LinearRing>
+                            </gml:outerBoundaryIs>
+                            <gml:innerBoundaryIs>
+                                <gml:LinearRing>
+                                    <gml:coordinates>-0.035126,47.485582 -0.035126,47.485582 -0.049319,47.641706 -0.233829,47.655899 -0.375760,47.457196 -0.276408,47.286879 -0.035126,47.485582 </gml:coordinates>
+                                </gml:LinearRing>
+                            </gml:innerBoundaryIs>
+                        </gml:Polygon>
+                    </gml:polygonMember>
+                </gml:MultiPolygon>
+            </ms:msGeometry>
+            <ms:ogc_fid>1</ms:ogc_fid>
+            <ms:name>My Polygon with hole</ms:name>
+            <ms:id>0</ms:id>
+        </ms:polygon>
+    </gml:featureMember>
+    <gml:featureMember>
+        <ms:polygon fid="2">
+            <gml:boundedBy>
+                <gml:Box srsName="EPSG:4326">
+                    <gml:coordinates>1.511919,47.088176 3.002191,47.882988</gml:coordinates>
+                </gml:Box>
+            </gml:boundedBy>
+            <ms:msGeometry>
+                <gml:Polygon srsName="EPSG:4326">
+                    <gml:outerBoundaryIs>
+                        <gml:LinearRing>
+                            <gml:coordinates>1.625463,47.357844 1.511919,47.741057 1.880938,47.882988 2.420275,47.797830 2.789295,47.485582 3.002191,47.457196 2.874453,47.088176 2.178993,47.343651 1.625463,47.357844 </gml:coordinates>
+                        </gml:LinearRing>
+                    </gml:outerBoundaryIs>
+                </gml:Polygon>
+            </ms:msGeometry>
+            <ms:ogc_fid>2</ms:ogc_fid>
+            <ms:name>My simple Polygon</ms:name>
+            <ms:id>0</ms:id>
+        </ms:polygon>
+    </gml:featureMember>
+    <gml:featureMember>
+        <ms:polygon fid="3">
+            <gml:boundedBy>
+                <gml:Box srsName="EPSG:4326">
+                    <gml:coordinates>0.000000,45.000000 2.000000,47.000000</gml:coordinates>
+                </gml:Box>
+            </gml:boundedBy>
+            <ms:msGeometry>
+                <gml:MultiPolygon srsName="EPSG:4326">
+                    <gml:polygonMember>
+                        <gml:Polygon>
+                            <gml:outerBoundaryIs>
+                                <gml:LinearRing>
+                                    <gml:coordinates>0.000000,45.000000 2.000000,45.000000 2.000000,47.000000 0.000000,47.000000 0.000000,45.000000 </gml:coordinates>
+                                </gml:LinearRing>
+                            </gml:outerBoundaryIs>
+                            <gml:innerBoundaryIs>
+                                <gml:LinearRing>
+                                    <gml:coordinates>0.500000,45.500000 1.500000,45.500000 1.500000,46.500000 0.500000,46.500000 0.500000,45.500000 </gml:coordinates>
+                                </gml:LinearRing>
+                            </gml:innerBoundaryIs>
+                        </gml:Polygon>
+                    </gml:polygonMember>
+                </gml:MultiPolygon>
+            </ms:msGeometry>
+            <ms:ogc_fid>3</ms:ogc_fid>
+            <ms:name>my polygon with hole</ms:name>
+            <ms:id>3</ms:id>
+        </ms:polygon>
+    </gml:featureMember>
+</wfs:FeatureCollection>
\ No newline at end of file
diff --git a/test/spec/ol/format/wfs/topp-states-wfs.xml b/test/spec/ol/format/wfs/topp-states-wfs.xml
new file mode 100644
index 0000000..352a01f
--- /dev/null
+++ b/test/spec/ol/format/wfs/topp-states-wfs.xml
@@ -0,0 +1,233 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<wfs:FeatureCollection numberOfFeatures="3" timeStamp="2008-09-12T00:24:21.013-04:00"
+    xsi:schemaLocation="http://www.openplans.org/topp http://sigma.openplans.org:80/geoserver/wfs?service=WFS&version=1.1.0&request=DescribeFeatureType&typeName=topp:states http://www.opengis.net/wfs http://sigma.openplans.org:80/geoserver/schemas/wfs/1.1.0/wfs.xsd"
+    xmlns:ogc="http://www.opengis.net/ogc" xmlns:opengeo="http://open-geo.com"
+    xmlns:tiger="http://www.census.gov" xmlns:wfs="http://www.opengis.net/wfs"
+    xmlns:topp="http://www.openplans.org/topp" xmlns:seb="http://seb.com"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ows="http://www.opengis.net/ows"
+    xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <gml:featureMembers>
+        <topp:states gml:id="states.1">
+            <gml:boundedBy>
+                <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:lowerCorner>36.986 -91.516</gml:lowerCorner>
+                    <gml:upperCorner>42.509 -87.507</gml:upperCorner>
+                </gml:Envelope>
+            </gml:boundedBy>
+            <topp:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>37.511 -88.071 37.476 -88.087 37.442 -88.311 37.409
+                                        -88.359 37.421 -88.419 37.401 -88.467 37.296 -88.511 37.257
+                                        -88.501 37.205 -88.451 37.156 -88.422 37.098 -88.451 37.072
+                                        -88.476 37.068 -88.491 37.064 -88.517 37.072 -88.559 37.109
+                                        -88.614 37.135 -88.688 37.141 -88.739 37.152 -88.746 37.202
+                                        -88.863 37.218 -88.932 37.221 -88.993 37.185 -89.065 37.112
+                                        -89.116 37.093 -89.146 37.064 -89.169 37.025 -89.174 36.998
+                                        -89.151 36.988 -89.129 36.986 -89.193 37.028 -89.211 37.041
+                                        -89.237 37.087 -89.264 37.091 -89.284 37.085 -89.303 37.061
+                                        -89.309 37.027 -89.264 37.008 -89.262 36.999 -89.282 37.009
+                                        -89.311 37.049 -89.382 37.099 -89.379 37.137 -89.423 37.165
+                                        -89.441 37.224 -89.468 37.253 -89.465 37.256 -89.489 37.276
+                                        -89.513 37.304 -89.513 37.329 -89.501 37.339 -89.468 37.355
+                                        -89.435 37.411 -89.427 37.453 -89.453 37.491 -89.494 37.571
+                                        -89.524 37.615 -89.513 37.651 -89.519 37.679 -89.513 37.694
+                                        -89.521 37.706 -89.581 37.745 -89.666 37.783 -89.675 37.804
+                                        -89.691 37.841 -89.728 37.905 -89.851 37.905 -89.861 37.891
+                                        -89.866 37.875 -89.901 37.878 -89.937 37.911 -89.978 37.963
+                                        -89.958 37.969 -90.011 37.993 -90.041 38.032 -90.119 38.053
+                                        -90.134 38.088 -90.207 38.122 -90.254 38.166 -90.289 38.188
+                                        -90.336 38.234 -90.364 38.323 -90.369 38.365 -90.358 38.391
+                                        -90.339 38.427 -90.301 38.518 -90.265 38.532 -90.261 38.562
+                                        -90.241 38.611 -90.183 38.658 -90.183 38.701 -90.202 38.723
+                                        -90.196 38.773 -90.163 38.785 -90.135 38.801 -90.121 38.831
+                                        -90.113 38.853 -90.132 38.914 -90.243 38.924 -90.278 38.924
+                                        -90.319 38.962 -90.413 38.959 -90.469 38.891 -90.531 38.871
+                                        -90.571 38.881 -90.627 38.935 -90.668 39.037 -90.706 39.058
+                                        -90.707 39.093 -90.691 39.144 -90.716 39.195 -90.718 39.224
+                                        -90.732 39.247 -90.738 39.296 -90.779 39.351 -90.851 39.401
+                                        -90.947 39.444 -91.036 39.473 -91.064 39.528 -91.093 39.552
+                                        -91.156 39.601 -91.203 39.685 -91.317 39.724 -91.367 39.761
+                                        -91.373 39.803 -91.381 39.863 -91.449 39.885 -91.451 39.901
+                                        -91.434 39.921 -91.431 39.946 -91.447 40.005 -91.487 40.066
+                                        -91.504 40.134 -91.516 40.201 -91.506 40.251 -91.498 40.309
+                                        -91.486 40.371 -91.448 40.386 -91.418 40.392 -91.385 40.402
+                                        -91.372 40.447 -91.385 40.503 -91.374 40.528 -91.382 40.547
+                                        -91.412 40.572 -91.411 40.603 -91.375 40.639 -91.262 40.643
+                                        -91.214 40.656 -91.162 40.682 -91.129 40.705 -91.119 40.761
+                                        -91.092 40.833 -91.088 40.879 -91.049 40.923 -90.983 40.951
+                                        -90.961 41.071 -90.954 41.104 -90.957 41.144 -90.991 41.165
+                                        -91.018 41.176 -91.056 41.231 -91.101 41.267 -91.102 41.334
+                                        -91.073 41.401 -91.055 41.423 -91.027 41.431 -91.001 41.421
+                                        -90.949 41.444 -90.844 41.449 -90.779 41.451 -90.708 41.462
+                                        -90.658 41.509 -90.601 41.525 -90.541 41.527 -90.454 41.543
+                                        -90.434 41.567 -90.423 41.586 -90.348 41.602 -90.339 41.649
+                                        -90.341 41.722 -90.326 41.756 -90.304 41.781 -90.255 41.806
+                                        -90.195 41.931 -90.154 41.983 -90.142 42.033 -90.151 42.061
+                                        -90.168 42.103 -90.166 42.121 -90.176 42.122 -90.191 42.159
+                                        -90.231 42.197 -90.323 42.211 -90.367 42.242 -90.407 42.263
+                                        -90.417 42.341 -90.427 42.361 -90.441 42.388 -90.491 42.421
+                                        -90.563 42.461 -90.605 42.475 -90.648 42.494 -90.651 42.509
+                                        -90.638 42.508 -90.419 42.504 -89.923 42.503 -89.834 42.497
+                                        -89.401 42.497 -89.359 42.491 -88.939 42.491 -88.764 42.489
+                                        -88.706 42.491 -88.297 42.489 -88.194 42.489 -87.797 42.314
+                                        -87.836 42.156 -87.761 42.059 -87.671 41.847 -87.612 41.723
+                                        -87.529 41.469 -87.532 41.301 -87.532 41.173 -87.531 41.009
+                                        -87.532 40.745 -87.532 40.494 -87.537 40.483 -87.535 40.166
+                                        -87.535 39.887 -87.535 39.609 -87.535 39.477 -87.538 39.351
+                                        -87.541 39.338 -87.597 39.307 -87.625 39.297 -87.611 39.281
+                                        -87.615 39.258 -87.606 39.248 -87.584 39.208 -87.588 39.198
+                                        -87.594 39.196 -87.607 39.168 -87.644 39.146 -87.671 39.131
+                                        -87.659 39.113 -87.662 39.103 -87.631 39.088 -87.631 39.084
+                                        -87.612 39.062 -87.585 38.995 -87.581 38.994 -87.591 38.977
+                                        -87.547 38.963 -87.533 38.931 -87.531 38.904 -87.539 38.869
+                                        -87.559 38.857 -87.551 38.795 -87.507 38.776 -87.519 38.769
+                                        -87.508 38.736 -87.508 38.685 -87.543 38.672 -87.588 38.642
+                                        -87.625 38.622 -87.628 38.599 -87.619 38.593 -87.641 38.573
+                                        -87.652 38.547 -87.672 38.515 -87.651 38.501 -87.653 38.504
+                                        -87.679 38.481 -87.692 38.466 -87.756 38.457 -87.758 38.445
+                                        -87.738 38.417 -87.748 38.378 -87.784 38.352 -87.834 38.286
+                                        -87.851 38.285 -87.863 38.316 -87.874 38.315 -87.883 38.301
+                                        -87.888 38.281 -87.914 38.302 -87.913 38.304 -87.925 38.241
+                                        -87.981 38.234 -87.986 38.201 -87.977 38.171 -87.932 38.157
+                                        -87.931 38.136 -87.951 38.131 -87.973 38.103 -88.018 38.092
+                                        -88.012 38.096 -87.964 38.073 -87.975 38.054 -88.034 38.045
+                                        -88.043 38.038 -88.041 38.033 -88.021 38.008 -88.029 37.975
+                                        -88.021 37.956 -88.042 37.934 -88.041 37.929 -88.064 37.944
+                                        -88.078 37.923 -88.084 37.917 -88.031 37.905 -88.026 37.896
+                                        -88.044 37.906 -88.101 37.895 -88.101 37.867 -88.075 37.843
+                                        -88.034 37.827 -88.042 37.831 -88.089 37.817 -88.086 37.805
+                                        -88.035 37.735 -88.072 37.701 -88.133 37.661 -88.159 37.628
+                                        -88.157 37.583 -88.134 37.511 -88.071</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </topp:the_geom>
+            <topp:STATE_NAME>Illinois</topp:STATE_NAME>
+            <topp:STATE_FIPS>17</topp:STATE_FIPS>
+            <topp:SUB_REGION>E N Cen</topp:SUB_REGION>
+            <topp:STATE_ABBR>IL</topp:STATE_ABBR>
+            <topp:LAND_KM>143986.61</topp:LAND_KM>
+            <topp:WATER_KM>1993.335</topp:WATER_KM>
+            <topp:PERSONS>1.143E7</topp:PERSONS>
+            <topp:FAMILIES>2924880.0</topp:FAMILIES>
+            <topp:HOUSHOLD>4202240.0</topp:HOUSHOLD>
+            <topp:MALE>5552233.0</topp:MALE>
+            <topp:FEMALE>5878369.0</topp:FEMALE>
+            <topp:WORKERS>4199206.0</topp:WORKERS>
+            <topp:DRVALONE>3741715.0</topp:DRVALONE>
+            <topp:CARPOOL>652603.0</topp:CARPOOL>
+            <topp:PUBTRANS>538071.0</topp:PUBTRANS>
+            <topp:EMPLOYED>5417967.0</topp:EMPLOYED>
+            <topp:UNEMPLOY>385040.0</topp:UNEMPLOY>
+            <topp:SERVICE>1360159.0</topp:SERVICE>
+            <topp:MANUAL>828906.0</topp:MANUAL>
+            <topp:P_MALE>0.486</topp:P_MALE>
+            <topp:P_FEMALE>0.514</topp:P_FEMALE>
+            <topp:SAMP_POP>1747776.0</topp:SAMP_POP>
+        </topp:states>
+        <topp:states gml:id="states.2">
+            <gml:boundedBy>
+                <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:lowerCorner>38.788 -77.122</gml:lowerCorner>
+                    <gml:upperCorner>38.993 -76.911</gml:upperCorner>
+                </gml:Envelope>
+            </gml:boundedBy>
+            <topp:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>38.966 -77.008 38.889 -76.911 38.788 -77.045 38.813
+                                        -77.035 38.829 -77.045 38.838 -77.041 38.862 -77.039 38.886
+                                        -77.067 38.915 -77.078 38.932 -77.122 38.993 -77.042 38.966
+                                        -77.008</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </topp:the_geom>
+            <topp:STATE_NAME>District of Columbia</topp:STATE_NAME>
+            <topp:STATE_FIPS>11</topp:STATE_FIPS>
+            <topp:SUB_REGION>S Atl</topp:SUB_REGION>
+            <topp:STATE_ABBR>DC</topp:STATE_ABBR>
+            <topp:LAND_KM>159.055</topp:LAND_KM>
+            <topp:WATER_KM>17.991</topp:WATER_KM>
+            <topp:PERSONS>606900.0</topp:PERSONS>
+            <topp:FAMILIES>122087.0</topp:FAMILIES>
+            <topp:HOUSHOLD>249634.0</topp:HOUSHOLD>
+            <topp:MALE>282970.0</topp:MALE>
+            <topp:FEMALE>323930.0</topp:FEMALE>
+            <topp:WORKERS>229975.0</topp:WORKERS>
+            <topp:DRVALONE>106694.0</topp:DRVALONE>
+            <topp:CARPOOL>36621.0</topp:CARPOOL>
+            <topp:PUBTRANS>111422.0</topp:PUBTRANS>
+            <topp:EMPLOYED>303994.0</topp:EMPLOYED>
+            <topp:UNEMPLOY>23442.0</topp:UNEMPLOY>
+            <topp:SERVICE>65498.0</topp:SERVICE>
+            <topp:MANUAL>22407.0</topp:MANUAL>
+            <topp:P_MALE>0.466</topp:P_MALE>
+            <topp:P_FEMALE>0.534</topp:P_FEMALE>
+            <topp:SAMP_POP>72696.0</topp:SAMP_POP>
+        </topp:states>
+        <topp:states gml:id="states.3">
+            <gml:boundedBy>
+                <gml:Envelope srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:lowerCorner>38.449 -75.791</gml:lowerCorner>
+                    <gml:upperCorner>39.841 -75.045</gml:upperCorner>
+                </gml:Envelope>
+            </gml:boundedBy>
+            <topp:the_geom>
+                <gml:MultiSurface srsName="urn:x-ogc:def:crs:EPSG:4326">
+                    <gml:surfaceMember>
+                        <gml:Polygon>
+                            <gml:exterior>
+                                <gml:LinearRing>
+                                    <gml:posList>38.557 -75.707 38.649 -75.711 38.831 -75.724 39.141
+                                        -75.752 39.247 -75.761 39.295 -75.764 39.383 -75.772 39.723
+                                        -75.791 39.724 -75.775 39.774 -75.745 39.821 -75.695 39.838
+                                        -75.644 39.841 -75.583 39.826 -75.471 39.798 -75.421 39.789
+                                        -75.412 39.778 -75.428 39.763 -75.461 39.741 -75.475 39.719
+                                        -75.476 39.714 -75.489 39.612 -75.611 39.566 -75.562 39.463
+                                        -75.591 39.366 -75.515 39.257 -75.402 39.073 -75.397 39.012
+                                        -75.324 38.945 -75.307 38.808 -75.191 38.799 -75.083 38.449
+                                        -75.045 38.449 -75.068 38.451 -75.093 38.455 -75.351 38.463
+                                        -75.699 38.557 -75.707</gml:posList>
+                                </gml:LinearRing>
+                            </gml:exterior>
+                        </gml:Polygon>
+                    </gml:surfaceMember>
+                </gml:MultiSurface>
+            </topp:the_geom>
+            <topp:STATE_NAME>Delaware</topp:STATE_NAME>
+            <topp:STATE_FIPS>10</topp:STATE_FIPS>
+            <topp:SUB_REGION>S Atl</topp:SUB_REGION>
+            <topp:STATE_ABBR>DE</topp:STATE_ABBR>
+            <topp:LAND_KM>5062.456</topp:LAND_KM>
+            <topp:WATER_KM>1385.022</topp:WATER_KM>
+            <topp:PERSONS>666168.0</topp:PERSONS>
+            <topp:FAMILIES>175867.0</topp:FAMILIES>
+            <topp:HOUSHOLD>247497.0</topp:HOUSHOLD>
+            <topp:MALE>322968.0</topp:MALE>
+            <topp:FEMALE>343200.0</topp:FEMALE>
+            <topp:WORKERS>247566.0</topp:WORKERS>
+            <topp:DRVALONE>258087.0</topp:DRVALONE>
+            <topp:CARPOOL>42968.0</topp:CARPOOL>
+            <topp:PUBTRANS>8069.0</topp:PUBTRANS>
+            <topp:EMPLOYED>335147.0</topp:EMPLOYED>
+            <topp:UNEMPLOY>13945.0</topp:UNEMPLOY>
+            <topp:SERVICE>87973.0</topp:SERVICE>
+            <topp:MANUAL>44140.0</topp:MANUAL>
+            <topp:P_MALE>0.485</topp:P_MALE>
+            <topp:P_FEMALE>0.515</topp:P_FEMALE>
+            <topp:SAMP_POP>102776.0</topp:SAMP_POP>
+        </topp:states>
+    </gml:featureMembers>
+</wfs:FeatureCollection>
diff --git a/test/spec/ol/format/wfsformat.test.js b/test/spec/ol/format/wfsformat.test.js
new file mode 100644
index 0000000..09a3f6e
--- /dev/null
+++ b/test/spec/ol/format/wfsformat.test.js
@@ -0,0 +1,447 @@
+goog.provide('ol.test.format.WFS');
+
+describe('ol.format.WFS', function() {
+
+  describe('when parsing TOPP states GML from WFS', function() {
+
+    var features, feature, xml;
+    var config = {
+      'featureNS': 'http://www.openplans.org/topp',
+      'featureType': 'states'
+    };
+
+    before(function(done) {
+      proj4.defs('urn:x-ogc:def:crs:EPSG:4326', proj4.defs('EPSG:4326'));
+      afterLoadText('spec/ol/format/wfs/topp-states-wfs.xml', function(data) {
+        try {
+          xml = data;
+          features = new ol.format.WFS(config).readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates 3 features', function() {
+      expect(features).to.have.length(3);
+    });
+
+    it('creates a polygon for Illinois', function() {
+      feature = features[0];
+      expect(feature.getId()).to.equal('states.1');
+      expect(feature.get('STATE_NAME')).to.equal('Illinois');
+      expect(feature.getGeometry()).to.be.an(ol.geom.MultiPolygon);
+    });
+
+    it('transforms and creates a polygon for Illinois', function() {
+      features = new ol.format.WFS(config).readFeatures(xml, {
+        featureProjection: 'EPSG:3857'
+      });
+      feature = features[0];
+      expect(feature.getId()).to.equal('states.1');
+      expect(feature.get('STATE_NAME')).to.equal('Illinois');
+      var geom = feature.getGeometry();
+      expect(geom).to.be.an(ol.geom.MultiPolygon);
+      var p = ol.proj.transform([-88.071, 37.511], 'EPSG:4326', 'EPSG:3857');
+      p.push(0);
+      expect(geom.getFirstCoordinate()).to.eql(p);
+    });
+
+  });
+
+  describe('when parsing mapserver GML2 polygon', function() {
+
+    var features, feature, xml;
+    var config = {
+      'featureNS': 'http://mapserver.gis.umn.edu/mapserver',
+      'featureType': 'polygon',
+      'gmlFormat': new ol.format.GML2()
+    };
+
+    before(function(done) {
+      proj4.defs('urn:x-ogc:def:crs:EPSG:4326', proj4.defs('EPSG:4326'));
+      afterLoadText('spec/ol/format/wfs/polygonv2.xml', function(data) {
+        try {
+          xml = data;
+          features = new ol.format.WFS(config).readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates 3 features', function() {
+      expect(features).to.have.length(3);
+    });
+
+    it('creates a polygon for My Polygon with hole', function() {
+      feature = features[0];
+      expect(feature.getId()).to.equal('1');
+      expect(feature.get('name')).to.equal('My Polygon with hole');
+      expect(feature.get('boundedBy')).to.eql(
+          [47.003018, -0.768746, 47.925567, 0.532597]);
+      expect(feature.getGeometry()).to.be.an(ol.geom.MultiPolygon);
+      expect(feature.getGeometry().getFlatCoordinates()).
+          to.have.length(60);
+    });
+
+  });
+
+  describe('when parsing FeatureCollection', function() {
+    var response;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wfs/NumberOfFeatures.xml',
+          function(xml) {
+            try {
+              response = new ol.format.WFS().readFeatureCollectionMetadata(xml);
+            } catch (e) {
+              done(e);
+            }
+            done();
+          });
+    });
+    it('returns the correct number of features', function() {
+      expect(response.numberOfFeatures).to.equal(625);
+    });
+  });
+
+  describe('when parsing FeatureCollection', function() {
+    var response;
+    before(function(done) {
+      proj4.defs('EPSG:28992', '+proj=sterea +lat_0=52.15616055555555 ' +
+          '+lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 ' +
+          '+ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,' +
+          '-1.8774,4.0725 +units=m +no_defs');
+      afterLoadText('spec/ol/format/wfs/boundedBy.xml',
+          function(xml) {
+            try {
+              response = new ol.format.WFS().readFeatureCollectionMetadata(xml);
+            } catch (e) {
+              done(e);
+            }
+            done();
+          });
+    });
+    it('returns the correct bounds', function() {
+      expect(response.bounds).to.eql([3197.88, 306457.313,
+        280339.156, 613850.438]);
+    });
+  });
+
+  describe('when parsing TransactionResponse', function() {
+    var response;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wfs/TransactionResponse.xml',
+          function(xml) {
+            try {
+              response = new ol.format.WFS().readTransactionResponse(xml);
+            } catch (e) {
+              done(e);
+            }
+            done();
+          });
+    });
+    it('returns the correct TransactionResponse object', function() {
+      expect(response.transactionSummary.totalDeleted).to.equal(0);
+      expect(response.transactionSummary.totalInserted).to.equal(0);
+      expect(response.transactionSummary.totalUpdated).to.equal(1);
+      expect(response.insertIds).to.have.length(2);
+      expect(response.insertIds[0]).to.equal('parcelle.40');
+    });
+  });
+
+  describe('when writing out a GetFeature request', function() {
+
+    it('creates the expected output', function() {
+      var text =
+          '<wfs:GetFeature service="WFS" version="1.1.0" resultType="hits" ' +
+          '    xmlns:topp="http://www.openplans.org/topp"' +
+          '    xmlns:wfs="http://www.opengis.net/wfs"' +
+          '    xmlns:ogc="http://www.opengis.net/ogc"' +
+          '    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+          '    xsi:schemaLocation="http://www.opengis.net/wfs ' +
+          'http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">' +
+          '  <wfs:Query xmlns:wfs="http://www.opengis.net/wfs" ' +
+          '      typeName="topp:states" srsName="urn:ogc:def:crs:EPSG::4326" ' +
+          '      xmlns:topp="http://www.openplans.org/topp">' +
+          '    <wfs:PropertyName>STATE_NAME</wfs:PropertyName>' +
+          '    <wfs:PropertyName>STATE_FIPS</wfs:PropertyName>' +
+          '    <wfs:PropertyName>STATE_ABBR</wfs:PropertyName>' +
+          '  </wfs:Query>' +
+          '</wfs:GetFeature>';
+      var serialized = new ol.format.WFS().writeGetFeature({
+        resultType: 'hits',
+        featureTypes: ['states'],
+        featureNS: 'http://www.openplans.org/topp',
+        featurePrefix: 'topp',
+        srsName: 'urn:ogc:def:crs:EPSG::4326',
+        propertyNames: ['STATE_NAME', 'STATE_FIPS', 'STATE_ABBR']
+      });
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+
+    it('creates paging headers', function() {
+      var text =
+          '<wfs:GetFeature service="WFS" version="1.1.0" startIndex="20" ' +
+          '    count="10" xmlns:topp="http://www.openplans.org/topp"' +
+          '    xmlns:wfs="http://www.opengis.net/wfs"' +
+          '    xmlns:ogc="http://www.opengis.net/ogc"' +
+          '    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+          '    xsi:schemaLocation="http://www.opengis.net/wfs ' +
+          'http://schemas.opengis.net/wfs/1.1.0/wfs.xsd">' +
+          '  <wfs:Query xmlns:wfs="http://www.opengis.net/wfs" ' +
+          '      typeName="topp:states" srsName="urn:ogc:def:crs:EPSG::4326"' +
+          '       xmlns:topp="http://www.openplans.org/topp">' +
+          '  </wfs:Query>' +
+          '</wfs:GetFeature>';
+      var serialized = new ol.format.WFS().writeGetFeature({
+        count: 10,
+        startIndex: 20,
+        srsName: 'urn:ogc:def:crs:EPSG::4326',
+        featureNS: 'http://www.openplans.org/topp',
+        featurePrefix: 'topp',
+        featureTypes: ['states']
+      });
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+
+    it('creates a BBOX filter', function() {
+      var text =
+          '<wfs:Query xmlns:wfs="http://www.opengis.net/wfs" ' +
+          '    typeName="topp:states" srsName="urn:ogc:def:crs:EPSG::4326" ' +
+          '    xmlns:topp="http://www.openplans.org/topp">' +
+          '  <ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
+          '    <ogc:BBOX>' +
+          '      <ogc:PropertyName>the_geom</ogc:PropertyName>' +
+          '      <gml:Envelope xmlns:gml="http://www.opengis.net/gml" ' +
+          '          srsName="urn:ogc:def:crs:EPSG::4326">' +
+          '        <gml:lowerCorner>1 2</gml:lowerCorner>' +
+          '        <gml:upperCorner>3 4</gml:upperCorner>' +
+          '      </gml:Envelope>' +
+          '    </ogc:BBOX>' +
+          '  </ogc:Filter>' +
+          '</wfs:Query>';
+      var serialized = new ol.format.WFS().writeGetFeature({
+        srsName: 'urn:ogc:def:crs:EPSG::4326',
+        featureNS: 'http://www.openplans.org/topp',
+        featurePrefix: 'topp',
+        featureTypes: ['states'],
+        geometryName: 'the_geom',
+        bbox: [1, 2, 3, 4]
+      });
+      expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));
+    });
+
+  });
+
+  describe('when writing out a Transaction request', function() {
+
+    it('creates a handle', function() {
+      var text =
+          '<wfs:Transaction xmlns:wfs="http://www.opengis.net/wfs" ' +
+          'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
+          'service="WFS" version="1.1.0" handle="handle_t" ' +
+          'xsi:schemaLocation="http://www.opengis.net/wfs ' +
+          'http://schemas.opengis.net/wfs/1.1.0/wfs.xsd"/>';
+      var serialized = new ol.format.WFS().writeTransaction(null, null, null,
+          {handle: 'handle_t'});
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+
+  });
+
+  describe('when writing out a Transaction request', function() {
+    var text;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wfs/TransactionSrs.xml', function(xml) {
+        text = xml;
+        done();
+      });
+    });
+    it('creates the correct srsName', function() {
+      var format = new ol.format.WFS();
+      var insertFeature = new ol.Feature({
+        the_geom: new ol.geom.MultiLineString([[
+          [-5178372.1885436, 1992365.7775042],
+          [-4434792.7774889, 1601008.1927386],
+          [-4043435.1927233, 2148908.8114105]
+        ]]),
+        TYPE: 'xyz'
+      });
+      insertFeature.setGeometryName('the_geom');
+      var inserts = [insertFeature];
+      var serialized = format.writeTransaction(inserts, null, null, {
+        featureNS: 'http://foo',
+        featureType: 'FAULTS',
+        featurePrefix: 'feature',
+        gmlOptions: {multiCurve: true, srsName: 'EPSG:900913'}
+      });
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+  });
+
+  describe('when writing out a Transaction request', function() {
+    var text;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wfs/TransactionUpdate.xml', function(xml) {
+        text = xml;
+        done();
+      });
+    });
+
+    it('creates the correct update', function() {
+      var format = new ol.format.WFS();
+      var updateFeature = new ol.Feature();
+      updateFeature.setGeometryName('the_geom');
+      updateFeature.setGeometry(new ol.geom.MultiLineString([[
+        [-12279454, 6741885],
+        [-12064207, 6732101],
+        [-11941908, 6595126],
+        [-12240318, 6507071],
+        [-12416429, 6604910]
+      ]]));
+      updateFeature.setId('FAULTS.4455');
+      var serialized = format.writeTransaction(null, [updateFeature], null, {
+        featureNS: 'http://foo',
+        featureType: 'FAULTS',
+        featurePrefix: 'foo',
+        gmlOptions: {srsName: 'EPSG:900913'}
+      });
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+  });
+
+  describe('when writing out a Transaction request', function() {
+    var text;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wfs/TransactionMulti.xml', function(xml) {
+        text = xml;
+        done();
+      });
+    });
+
+    it('creates the correct transaction body', function() {
+      var format = new ol.format.WFS();
+      var insertFeature = new ol.Feature({
+        the_geom: new ol.geom.MultiPoint([[1, 2]]),
+        foo: 'bar',
+        nul: null
+      });
+      insertFeature.setGeometryName('the_geom');
+      var inserts = [insertFeature];
+      var updateFeature = new ol.Feature({
+        the_geom: new ol.geom.MultiPoint([[1, 2]]),
+        foo: 'bar',
+        // null value gets Property element with no Value
+        nul: null,
+        // undefined value means don't create a Property element
+        unwritten: undefined
+      });
+      updateFeature.setId('fid.42');
+      var updates = [updateFeature];
+
+      var deleteFeature = new ol.Feature();
+      deleteFeature.setId('fid.37');
+      var deletes = [deleteFeature];
+      var serialized = format.writeTransaction(inserts, updates, deletes, {
+        featureNS: 'http://www.openplans.org/topp',
+        featureType: 'states',
+        featurePrefix: 'topp'
+      });
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+
+  });
+
+  describe('when writing out a Transaction request', function() {
+    var text;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wfs/Native.xml', function(xml) {
+        text = xml;
+        done();
+      });
+    });
+
+    it('handles writing out Native', function() {
+      var format = new ol.format.WFS();
+      var serialized = format.writeTransaction(null, null, null, {
+        nativeElements: [{
+          vendorId: 'ORACLE',
+          safeToIgnore: true,
+          value: 'ALTER SESSION ENABLE PARALLEL DML'
+        }, {
+          vendorId: 'ORACLE',
+          safeToIgnore: false,
+          value: 'Another native line goes here'
+        }]
+      });
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+  });
+
+  describe('when writing out a GetFeature request', function() {
+    var text;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wfs/GetFeatureMultiple.xml', function(xml) {
+        text = xml;
+        done();
+      });
+    });
+
+    it('handles writing multiple Query elements', function() {
+      var format = new ol.format.WFS();
+      var serialized = format.writeGetFeature({
+        featureNS: 'http://www.openplans.org/topp',
+        featureTypes: ['states', 'cities'],
+        featurePrefix: 'topp'
+      });
+      expect(serialized).to.xmleql(ol.xml.parse(text));
+    });
+  });
+
+  describe('when parsing GML from MapServer', function() {
+
+    var features, feature;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wfs/mapserver.xml', function(xml) {
+        try {
+          var config = {
+            'featureNS': 'http://mapserver.gis.umn.edu/mapserver',
+            'featureType': 'Historische_Messtischblaetter_WFS'
+          };
+          features = new ol.format.WFS(config).readFeatures(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('creates 7 features', function() {
+      expect(features).to.have.length(7);
+    });
+
+    it('creates a polygon for Arnstadt', function() {
+      feature = features[0];
+      var fid = 'Historische_Messtischblaetter_WFS.71055885';
+      expect(feature.getId()).to.equal(fid);
+      expect(feature.get('titel')).to.equal('Arnstadt');
+      expect(feature.getGeometry()).to.be.an(ol.geom.Polygon);
+    });
+
+  });
+
+});
+
+
+goog.require('ol.xml');
+goog.require('ol.Feature');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Polygon');
+goog.require('ol.format.GML2');
+goog.require('ol.format.WFS');
+goog.require('ol.proj');
diff --git a/test/spec/ol/format/wktformat.test.js b/test/spec/ol/format/wktformat.test.js
new file mode 100644
index 0000000..0012023
--- /dev/null
+++ b/test/spec/ol/format/wktformat.test.js
@@ -0,0 +1,371 @@
+goog.provide('ol.test.format.WKT');
+
+describe('ol.format.WKT', function() {
+
+  var format = new ol.format.WKT();
+
+  describe('#readGeometry()', function() {
+
+    it('transforms with dataProjection and featureProjection', function() {
+      var wkt = 'POINT(1 2)';
+      var geom = format.readGeometry(wkt, {
+        dataProjection: 'EPSG:4326',
+        featureProjection: 'EPSG:3857'
+      });
+      expect(geom.getCoordinates()).to.eql(
+          ol.proj.transform([1, 2], 'EPSG:4326', 'EPSG:3857'));
+    });
+
+  });
+
+  describe('#writeGeometry()', function() {
+
+    it('transforms with dataProjection and featureProjection', function() {
+      var geom = new ol.geom.Point([1, 2]).transform('EPSG:4326', 'EPSG:3857');
+      var wkt = format.writeGeometry(geom, {
+        dataProjection: 'EPSG:4326',
+        featureProjection: 'EPSG:3857'
+      });
+      var got = format.readGeometry(wkt).getCoordinates();
+      expect(got[0]).to.roughlyEqual(1, 1e-6);
+      expect(got[1]).to.roughlyEqual(2, 1e-6);
+    });
+
+  });
+
+  describe('#readFeature()', function() {
+
+    it('transforms with dataProjection and featureProjection', function() {
+      var wkt = 'POINT(1 2)';
+      var feature = format.readFeature(wkt, {
+        dataProjection: 'EPSG:4326',
+        featureProjection: 'EPSG:3857'
+      });
+      var geom = feature.getGeometry();
+      expect(geom.getCoordinates()).to.eql(
+          ol.proj.transform([1, 2], 'EPSG:4326', 'EPSG:3857'));
+    });
+
+  });
+
+  describe('#writeFeature()', function() {
+
+    it('transforms with dataProjection and featureProjection', function() {
+      var feature = new ol.Feature(
+          new ol.geom.Point([1, 2]).transform('EPSG:4326', 'EPSG:3857'));
+      var wkt = format.writeFeature(feature, {
+        dataProjection: 'EPSG:4326',
+        featureProjection: 'EPSG:3857'
+      });
+      var gotFeature = format.readFeature(wkt);
+      expect(gotFeature).to.be.a(ol.Feature);
+      var got = gotFeature.getGeometry().getCoordinates();
+      expect(got[0]).to.roughlyEqual(1, 1e-6);
+      expect(got[1]).to.roughlyEqual(2, 1e-6);
+    });
+
+  });
+
+  describe('#readFeatures()', function() {
+
+    it('transforms with dataProjection and featureProjection', function() {
+      var wkt = 'GEOMETRYCOLLECTION(POINT(1 2),POINT(4 5))';
+      var features = format.readFeatures(wkt, {
+        dataProjection: 'EPSG:4326',
+        featureProjection: 'EPSG:3857'
+      });
+      expect(features.length).to.eql(2);
+      var point1 = features[0].getGeometry();
+      var point2 = features[1].getGeometry();
+      expect(point1.getType()).to.eql(ol.geom.GeometryType.POINT);
+      expect(point2.getType()).to.eql(ol.geom.GeometryType.POINT);
+      expect(point1.getCoordinates()).to.eql(
+          ol.proj.transform([1, 2], 'EPSG:4326', 'EPSG:3857'));
+      expect(point2.getCoordinates()).to.eql(
+          ol.proj.transform([4, 5], 'EPSG:4326', 'EPSG:3857'));
+    });
+  });
+
+  describe('#writeFeatures()', function() {
+
+    it('transforms with dataProjection and featureProjection', function() {
+      var features = [
+        new ol.Feature(
+            new ol.geom.Point([1, 2]).transform('EPSG:4326', 'EPSG:3857')),
+        new ol.Feature(
+            new ol.geom.Point([4, 5]).transform('EPSG:4326', 'EPSG:3857'))
+      ];
+      var wkt = format.writeFeatures(features, {
+        dataProjection: 'EPSG:4326',
+        featureProjection: 'EPSG:3857'
+      });
+      var gotFeatures = format.readFeatures(wkt);
+      expect(gotFeatures).to.have.length(2);
+      expect(gotFeatures[0].getGeometry().getCoordinates()[0])
+          .to.roughlyEqual(1, 1e-6);
+      expect(gotFeatures[0].getGeometry().getCoordinates()[1])
+          .to.roughlyEqual(2, 1e-6);
+      expect(gotFeatures[1].getGeometry().getCoordinates()[0])
+          .to.roughlyEqual(4, 1e-6);
+      expect(gotFeatures[1].getGeometry().getCoordinates()[1])
+          .to.roughlyEqual(5, 1e-6);
+    });
+
+  });
+
+
+  it('Point read / written correctly', function() {
+    var wkt = 'POINT(30 10)';
+    var geom = format.readGeometry(wkt);
+    expect(geom.getCoordinates()).to.eql([30, 10]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+    // test whitespace when reading
+    wkt = 'POINT (30 10)';
+    geom = format.readGeometry(wkt);
+    expect(geom.getCoordinates()).to.eql([30, 10]);
+  });
+
+  it('MultiPoint read / written correctly', function() {
+    // there are two forms to test
+    var wkt = 'MULTIPOINT((10 40),(40 30),(20 20),(30 10))';
+    var geom = format.readGeometry(wkt);
+    var points = geom.getPoints();
+    expect(points.length).to.eql(4);
+    expect(points[0].getCoordinates()).to.eql([10, 40]);
+    expect(points[1].getCoordinates()).to.eql([40, 30]);
+    expect(points[2].getCoordinates()).to.eql([20, 20]);
+    expect(points[3].getCoordinates()).to.eql([30, 10]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+    // this has whitespace
+    wkt = 'MULTIPOINT (10 40, 40 30, 20 20, 30 10)';
+    geom = format.readGeometry(wkt);
+    points = geom.getPoints();
+    expect(points.length).to.eql(4);
+    expect(points[0].getCoordinates()).to.eql([10, 40]);
+    expect(points[1].getCoordinates()).to.eql([40, 30]);
+    expect(points[2].getCoordinates()).to.eql([20, 20]);
+    expect(points[3].getCoordinates()).to.eql([30, 10]);
+  });
+
+  it('LineString read / written correctly', function() {
+    var wkt = 'LINESTRING(30 10,10 30,40 40)';
+    var geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+    expect(geom.getCoordinates()).to.eql([[30, 10], [10, 30], [40, 40]]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+    // test whitespace when reading
+    wkt = 'LINESTRING (30 10, 10 30, 40 40)';
+    geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+    expect(geom.getCoordinates()).to.eql([[30, 10], [10, 30], [40, 40]]);
+  });
+
+  it('MultiLineString read / written correctly', function() {
+    var wkt = 'MULTILINESTRING((10 10,20 20,10 40),' +
+        '(40 40,30 30,40 20,30 10))';
+    var geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_LINE_STRING);
+    var linestrings = geom.getLineStrings();
+    expect(linestrings.length).to.eql(2);
+    expect(linestrings[0].getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+    expect(linestrings[0].getCoordinates()).to.eql(
+        [[10, 10], [20, 20], [10, 40]]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+    // test whitespace when reading
+    wkt = 'MULTILINESTRING ( (10 10, 20 20, 10 40), ' +
+        '(40 40, 30 30, 40 20, 30 10) )';
+    geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_LINE_STRING);
+    linestrings = geom.getLineStrings();
+    expect(linestrings.length).to.eql(2);
+    expect(linestrings[0].getType()).to.eql(
+        ol.geom.GeometryType.LINE_STRING);
+    expect(linestrings[0].getCoordinates()).to.eql(
+        [[10, 10], [20, 20], [10, 40]]);
+  });
+
+  it('Polygon read / written correctly', function() {
+    var wkt = 'POLYGON((30 10,10 20,20 40,40 40,30 10))';
+    var geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON);
+    var rings = geom.getLinearRings();
+    expect(rings.length).to.eql(1);
+    expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING);
+    expect(rings[0].getCoordinates()).to.eql(
+        [[30, 10], [10, 20], [20, 40], [40, 40], [30, 10]]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+
+    // note that WKT doesn't care about winding order, we do
+    wkt = 'POLYGON((35 10,10 20,15 40,45 45,35 10),(20 30,30 20,35 35,20 30))';
+    geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON);
+    rings = geom.getLinearRings();
+    expect(rings.length).to.eql(2);
+    expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING);
+    expect(rings[1].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING);
+    expect(rings[0].getCoordinates()).to.eql(
+        [[35, 10], [10, 20], [15, 40], [45, 45], [35, 10]]);
+    expect(rings[1].getCoordinates()).to.eql(
+        [[20, 30], [30, 20], [35, 35], [20, 30]]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+
+    // test whitespace when reading
+    wkt = 'POLYGON ( (30 10, 10 20, 20 40, 40 40, 30 10) )';
+    geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.POLYGON);
+    rings = geom.getLinearRings();
+    expect(rings.length).to.eql(1);
+    expect(rings[0].getType()).to.eql(ol.geom.GeometryType.LINEAR_RING);
+    expect(rings[0].getCoordinates()).to.eql(
+        [[30, 10], [10, 20], [20, 40], [40, 40], [30, 10]]);
+  });
+
+  it('MultiPolygon read / written correctly', function() {
+    // note that WKT doesn't care about winding order, we do
+    var wkt = 'MULTIPOLYGON(((40 40,45 30,20 45,40 40)),' +
+        '((20 35,45 20,30 5,10 10,10 30,20 35),(30 20,20 25,20 15,30 20)))';
+    var geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_POLYGON);
+    var polygons = geom.getPolygons();
+    expect(polygons.length).to.eql(2);
+    expect(polygons[0].getType()).to.eql(ol.geom.GeometryType.POLYGON);
+    expect(polygons[1].getType()).to.eql(ol.geom.GeometryType.POLYGON);
+    expect(polygons[0].getLinearRings().length).to.eql(1);
+    expect(polygons[1].getLinearRings().length).to.eql(2);
+    expect(polygons[0].getLinearRings()[0].getCoordinates()).to.eql(
+        [[40, 40], [45, 30], [20, 45], [40, 40]]);
+    expect(polygons[1].getLinearRings()[0].getCoordinates()).to.eql(
+        [[20, 35], [45, 20], [30, 5], [10, 10], [10, 30], [20, 35]]);
+    expect(polygons[1].getLinearRings()[1].getCoordinates()).to.eql(
+        [[30, 20], [20, 25], [20, 15], [30, 20]]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+
+    // test whitespace when reading
+    wkt = 'MULTIPOLYGON( ( ( 40 40,45 30, 20 45 ,40 40 )) ,' +
+        '( (20 35, 45 20,30 5,10 10,10 30,20 35), ' +
+        '( 30 20,  20 25,20 15  ,30 20 ) ))';
+    geom = format.readGeometry(wkt);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.MULTI_POLYGON);
+    polygons = geom.getPolygons();
+    expect(polygons.length).to.eql(2);
+    expect(polygons[0].getType()).to.eql(ol.geom.GeometryType.POLYGON);
+    expect(polygons[1].getType()).to.eql(ol.geom.GeometryType.POLYGON);
+    expect(polygons[0].getLinearRings().length).to.eql(1);
+    expect(polygons[1].getLinearRings().length).to.eql(2);
+    expect(polygons[0].getLinearRings()[0].getCoordinates()).to.eql(
+        [[40, 40], [45, 30], [20, 45], [40, 40]]);
+    expect(polygons[1].getLinearRings()[0].getCoordinates()).to.eql(
+        [[20, 35], [45, 20], [30, 5], [10, 10], [10, 30], [20, 35]]);
+    expect(polygons[1].getLinearRings()[1].getCoordinates()).to.eql(
+        [[30, 20], [20, 25], [20, 15], [30, 20]]);
+  });
+
+  it('Empty geometries read / written correctly', function() {
+    var wkts = ['POINT', 'LINESTRING', 'POLYGON',
+                'MULTIPOINT', 'MULTILINESTRING', 'MULTIPOLYGON'];
+    for (var i = 0, ii = wkts.length; i < ii; ++i) {
+      var wkt = wkts[i] + ' EMPTY';
+      var geom = format.readGeometry(wkt);
+      expect(geom.getCoordinates()).to.eql([]);
+      expect(format.writeGeometry(geom)).to.eql(wkt);
+    }
+  });
+
+  it('Invalid geometries detected correctly', function() {
+    expect(function() {
+      format.readGeometry('POINT(1,2)');
+    }).to.throwException();
+    expect(function() {
+      format.readGeometry('LINESTRING(1 2,3 4');
+    }).to.throwException();
+    expect(function() {
+      format.readGeometry('POLYGON(1 2,3 4))');
+    }).to.throwException();
+    expect(function() {
+      format.readGeometry('POLGON((1 2,3 4))');
+    }).to.throwException();
+    expect(function() {
+      format.readGeometry('LINESTRING(1.2,3 4');
+    }).to.throwException();
+    expect(function() {
+      format.readGeometry('MULTIPOINT((1 2),3 4))');
+    }).to.throwException();
+    expect(function() {
+      format.readGeometry('MULTIPOLYGON((1 2,3 4))');
+    }).to.throwException();
+    expect(function() {
+      format.readGeometry('GEOMETRYCOLLECTION(1 2,3 4)');
+    }).to.throwException();
+  });
+
+  it('GeometryCollection read / written correctly', function() {
+    var wkt = 'GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))';
+    var geom = format.readGeometry(wkt);
+    var geoms = geom.getGeometries();
+    expect(geoms.length).to.eql(2);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.GEOMETRY_COLLECTION);
+    expect(geoms[0].getType()).to.eql(ol.geom.GeometryType.POINT);
+    expect(geoms[1].getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+    expect(geoms[0].getCoordinates()).to.eql([4, 6]);
+    expect(geoms[1].getCoordinates()).to.eql([[4, 6], [7, 10]]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+    // test whitespace when reading
+    wkt = 'GEOMETRYCOLLECTION ( POINT (4 6), LINESTRING (4 6, 7 10) )';
+    geom = format.readGeometry(wkt);
+    geoms = geom.getGeometries();
+    expect(geoms.length).to.eql(2);
+    expect(geom.getType()).to.eql(ol.geom.GeometryType.GEOMETRY_COLLECTION);
+    expect(geoms[0].getType()).to.eql(ol.geom.GeometryType.POINT);
+    expect(geoms[1].getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+    expect(geoms[0].getCoordinates()).to.eql([4, 6]);
+    expect(geoms[1].getCoordinates()).to.eql([[4, 6], [7, 10]]);
+  });
+
+  it('Empty GeometryCollection read / written correctly', function() {
+    var wkt = 'GEOMETRYCOLLECTION EMPTY';
+    var geom = format.readGeometry(wkt);
+    expect(geom.getGeometries()).to.eql([]);
+    expect(format.writeGeometry(geom)).to.eql(wkt);
+  });
+
+  it('GeometryCollection split / merged correctly', function() {
+    format = new ol.format.WKT({splitCollection: true});
+    var wkt = 'GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10))';
+    var features = format.readFeatures(wkt);
+    expect(features.length).to.eql(2);
+    var geoms = [features[0].getGeometry(), features[1].getGeometry()];
+    expect(geoms[0].getType()).to.eql(ol.geom.GeometryType.POINT);
+    expect(geoms[1].getType()).to.eql(ol.geom.GeometryType.LINE_STRING);
+    expect(geoms[0].getCoordinates()).to.eql([4, 6]);
+    expect(geoms[1].getCoordinates()).to.eql([[4, 6], [7, 10]]);
+    expect(format.writeFeatures(features)).to.eql(wkt);
+  });
+
+  it('Point feature read / written correctly', function() {
+    var wkt = 'POINT(30 10)';
+    var feature = format.readFeature(wkt);
+    var geom = feature.getGeometry();
+    expect(geom.getCoordinates()).to.eql([30, 10]);
+    expect(format.writeFeature(feature)).to.eql(wkt);
+  });
+
+  it('Features read / written correctly', function() {
+    var wkt = 'GEOMETRYCOLLECTION(POINT(1 2),POINT(3 4))';
+    var features = format.readFeatures(wkt);
+    expect(features.length).to.eql(2);
+    var point1 = features[0].getGeometry();
+    var point2 = features[1].getGeometry();
+    expect(point1.getType()).to.eql(ol.geom.GeometryType.POINT);
+    expect(point2.getType()).to.eql(ol.geom.GeometryType.POINT);
+    expect(point1.getCoordinates()).to.eql([1, 2]);
+    expect(point2.getCoordinates()).to.eql([3, 4]);
+    expect(format.writeFeatures(features)).to.eql(wkt);
+  });
+
+});
+
+goog.require('ol.Feature');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.Point');
+goog.require('ol.format.WKT');
+goog.require('ol.proj');
diff --git a/test/spec/ol/format/wms/getfeatureinfo.xml b/test/spec/ol/format/wms/getfeatureinfo.xml
new file mode 100644
index 0000000..f00c6c4
--- /dev/null
+++ b/test/spec/ol/format/wms/getfeatureinfo.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<msGMLOutput xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <ADCP_2001_layer>
+        <gml:name>ADCP de coque 2001</gml:name>
+        <ADCP_2001_feature>
+            <gml:boundedBy>
+                <gml:Box srsName="EPSG:3857">
+                    <gml:coordinates>-531138.686422,5386348.414671 -117252.819653,6144475.186022</gml:coordinates>
+                </gml:Box>
+            </gml:boundedBy>
+            <FID>1071</FID>
+            <NO_CAMPAGNE>1020050</NO_CAMPAGNE>
+            <NOM_CAMPAGNE>ITSAS II</NOM_CAMPAGNE>
+            <NAUTILUS_CAMPAGNE>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata2.jsp?strPortail=ifremer&langue=FR&pageOrigine=CAM&cle1=FI352001020050</NAUTILUS_CAMPAGNE>
+            <FICHIER>ITSASII_BB150_0_osite.nc</FICHIER>
+            <NAUTILUS_DATA>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata3.jsp?strPortail=ifremer&langue=FR&pageOrigine=CS&cle1=71053_1&cle2=ADCP01</NAUTILUS_DATA>
+        </ADCP_2001_feature>
+        <ADCP_2001_feature>
+            <gml:boundedBy>
+                <gml:Box srsName="EPSG:3857">
+                    <gml:coordinates>-531138.686422,5386348.414671 -117252.819653,6144475.186022</gml:coordinates>
+                </gml:Box>
+            </gml:boundedBy>
+            <FID>22431</FID>
+            <NO_CAMPAGNE>1020050</NO_CAMPAGNE>
+            <NOM_CAMPAGNE>ITSAS II</NOM_CAMPAGNE>
+            <NAUTILUS_CAMPAGNE>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata2.jsp?strPortail=ifremer&langue=FR&pageOrigine=CAM&cle1=FI352001020050</NAUTILUS_CAMPAGNE>
+            <FICHIER>ITSASII_BB150_figures.tar</FICHIER>
+            <NAUTILUS_DATA>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata3.jsp?strPortail=ifremer&langue=FR&pageOrigine=CS&cle1=108842_2&cle2=ADCP01</NAUTILUS_DATA>
+        </ADCP_2001_feature>
+        <ADCP_2001_feature>
+            <gml:boundedBy>
+                <gml:Box srsName="EPSG:3857">
+                    <gml:coordinates>-531138.686422,5386348.414671 -117252.819653,6144475.186022</gml:coordinates>
+                </gml:Box>
+            </gml:boundedBy>
+            <FID>22432</FID>
+            <NO_CAMPAGNE>1020050</NO_CAMPAGNE>
+            <NOM_CAMPAGNE>ITSAS II</NOM_CAMPAGNE>
+            <NAUTILUS_CAMPAGNE>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata2.jsp?strPortail=ifremer&langue=FR&pageOrigine=CAM&cle1=FI352001020050</NAUTILUS_CAMPAGNE>
+            <FICHIER>ITSASII_BB150_0_fhv12.nc</FICHIER>
+            <NAUTILUS_DATA>http://www.ifremer.fr/sismerData/jsp/visualisationMetadata3.jsp?strPortail=ifremer&langue=FR&pageOrigine=CS&cle1=108842_3&cle2=ADCP01</NAUTILUS_DATA>
+        </ADCP_2001_feature>
+    </ADCP_2001_layer>
+</msGMLOutput>
diff --git a/test/spec/ol/format/wms/ogcsample.xml b/test/spec/ol/format/wms/ogcsample.xml
new file mode 100644
index 0000000..0d4c52d
--- /dev/null
+++ b/test/spec/ol/format/wms/ogcsample.xml
@@ -0,0 +1,284 @@
+<?xml version='1.0' encoding="UTF-8"?>
+<WMS_Capabilities version="1.3.0" xmlns="http://www.opengis.net/wms"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.opengis.net/wms http://schemas.opengis.net/wms/1.3.0/capabilities_1_3_0.xsd">
+<Service>
+  <Name>WMS</Name>
+  <Title>Acme Corp. Map Server</Title>
+  <Abstract>Map Server maintained by Acme Corporation.  Contact: webmaster at wmt.acme.com.  High-quality maps showing roadrunner nests and possible ambush locations.</Abstract>
+
+  <KeywordList>
+    <Keyword>bird</Keyword>
+    <Keyword>roadrunner</Keyword>
+    <Keyword>ambush</Keyword>
+  </KeywordList>
+  <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+   xlink:href="http://hostname/" />
+
+
+  <ContactInformation>
+    <ContactPersonPrimary>
+      <ContactPerson>Jeff Smith</ContactPerson>
+      <ContactOrganization>NASA</ContactOrganization>
+    </ContactPersonPrimary>
+    <ContactPosition>Computer Scientist</ContactPosition>
+
+    <ContactAddress>
+      <AddressType>postal</AddressType>
+      <Address>NASA Goddard Space Flight Center</Address>
+      <City>Greenbelt</City>
+      <StateOrProvince>MD</StateOrProvince>
+      <PostCode>20771</PostCode>
+
+      <Country>USA</Country>
+    </ContactAddress>
+    <ContactVoiceTelephone>+1 301 555-1212</ContactVoiceTelephone>
+    <ContactElectronicMailAddress>user at host.com</ContactElectronicMailAddress>
+  </ContactInformation>
+
+  <Fees>none</Fees>
+
+  <AccessConstraints>none</AccessConstraints>
+  <LayerLimit>16</LayerLimit>
+  <MaxWidth>2048</MaxWidth>
+  <MaxHeight>2048</MaxHeight>
+</Service>
+<Capability>
+  <Request>
+    <GetCapabilities>
+
+      <Format>text/xml</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+          <Post>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+
+          </Post>
+        </HTTP>
+      </DCPType>
+    </GetCapabilities>
+    <GetMap>
+      <Format>image/gif</Format>
+      <Format>image/png</Format>
+      <Format>image/jpeg</Format>
+
+      <DCPType>
+        <HTTP>
+          <Get>
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+        </HTTP>
+      </DCPType>
+    </GetMap>
+
+    <GetFeatureInfo>
+      <Format>text/xml</Format>
+      <Format>text/plain</Format>
+      <Format>text/html</Format>
+      <DCPType>
+        <HTTP>
+          <Get>
+
+            <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+             xlink:type="simple"
+             xlink:href="http://hostname/path?" />
+          </Get>
+        </HTTP>
+      </DCPType>
+    </GetFeatureInfo>
+  </Request>
+  <Exception>
+    <Format>XML</Format>
+
+    <Format>INIMAGE</Format>
+    <Format>BLANK</Format>
+  </Exception>
+  <Layer>
+    <Title>Acme Corp. Map Server</Title>
+    <CRS>CRS:84</CRS>
+
+    <AuthorityURL name="DIF_ID">
+      <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+       xlink:href="http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html" />
+    </AuthorityURL>
+    <BoundingBox CRS="CRS:84"
+     minx="-1" miny="-1" maxx="1" maxy="1" resx="0.0" resy="0.0"/>
+    <Layer>
+
+      <Name>ROADS_RIVERS</Name>
+      <Title>Roads and Rivers</Title>
+
+      <CRS>EPSG:26986</CRS>
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-71.63</westBoundLongitude>
+        <eastBoundLongitude>-70.78</eastBoundLongitude>
+        <southBoundLatitude>41.75</southBoundLatitude>
+        <northBoundLatitude>42.90</northBoundLatitude>
+
+      </EX_GeographicBoundingBox>
+      <BoundingBox CRS="CRS:84"
+       minx="-71.63" miny="41.75" maxx="-70.78" maxy="42.90" resx="0.01" resy="0.01"/>
+      <BoundingBox CRS="EPSG:26986"
+       minx="189000" miny="834000" maxx="285000" maxy="962000" resx="1" resy="1" />
+      <Attribution>
+        <Title>State College University</Title>
+        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+         xlink:href="http://www.university.edu/" />
+
+        <LogoURL width="100" height="100">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/icons/logo.gif" />
+        </LogoURL>
+      </Attribution>
+      <Identifier authority="DIF_ID">123456</Identifier>
+      <FeatureListURL>
+
+        <Format>XML</Format>
+        <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple"
+         xlink:href="http://www.university.edu/data/roads_rivers.gml" />
+      </FeatureListURL>
+      <Style>
+        <Name>USGS</Name>
+        <Title>USGS Topo Map Style</Title>
+        <Abstract>Features are shown in a style like that used in USGS topographic maps.</Abstract>
+
+        <LegendURL width="72" height="72">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/legends/usgs.gif" />
+        </LegendURL>
+        <StyleSheetURL>
+          <Format>text/xsl</Format>
+
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/stylesheets/usgs.xsl" />
+        </StyleSheetURL>
+      </Style>
+      <MinScaleDenominator>1000</MinScaleDenominator>
+      <MaxScaleDenominator>250000</MaxScaleDenominator>
+      <Layer queryable="1">
+        <Name>ROADS_1M</Name>
+        <Title>Roads at 1:1M scale</Title>
+        <Abstract>Roads at a scale of 1 to 1 million.</Abstract>
+
+        <KeywordList>
+          <Keyword>road</Keyword>
+          <Keyword>transportation</Keyword>
+          <Keyword>atlas</Keyword>
+        </KeywordList>
+        <Identifier authority="DIF_ID">123456</Identifier>
+        <MetadataURL type="FGDC:1998">
+
+                <Format>text/plain</Format>
+                <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+                 xlink:type="simple"
+                 xlink:href="http://www.university.edu/metadata/roads.txt" />
+             </MetadataURL>
+        <MetadataURL type="ISO19115:2003">
+               <Format>text/xml</Format>
+               <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+                xlink:type="simple"
+                xlink:href="http://www.university.edu/metadata/roads.xml" />
+             </MetadataURL>
+
+        <Style>
+          <Name>ATLAS</Name>
+          <Title>Road atlas style</Title>
+          <Abstract>Roads are shown in a style like that used in a commercial road atlas.</Abstract>
+        <LegendURL width="72" height="72">
+          <Format>image/gif</Format>
+          <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink"
+           xlink:type="simple"
+           xlink:href="http://www.university.edu/legends/atlas.gif" />
+
+        </LegendURL>
+        </Style>
+      </Layer>
+      <Layer queryable="1">
+        <Name>RIVERS_1M</Name>
+        <Title>Rivers at 1:1M scale</Title>
+        <Abstract>Rivers at a scale of 1 to 1 million.</Abstract>
+
+        <KeywordList>
+          <Keyword>river</Keyword>
+          <Keyword>canal</Keyword>
+          <Keyword>waterway</Keyword>
+        </KeywordList>
+      </Layer>
+    </Layer>
+
+    <Layer queryable="1">
+      <Title>Weather Forecast Data</Title>
+      <CRS>CRS:84</CRS>
+
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+        <eastBoundLongitude>180</eastBoundLongitude>
+
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="2000-08-22">1999-01-01/2000-08-22/P1D</Dimension>
+      <Layer>
+
+        <Name>Clouds</Name>
+        <Title>Forecast cloud cover</Title>
+      </Layer>
+      <Layer>
+        <Name>Temperature</Name>
+        <Title>Forecast temperature</Title>
+      </Layer>
+
+      <Layer>
+        <Name>Pressure</Name>
+        <Title>Forecast barometric pressure</Title>
+         <Dimension name="elevation" units="EPSG:5030" />
+         <Dimension name="time" units="ISO8601" default="2000-08-22">
+           1999-01-01/2000-08-22/P1D</Dimension>
+
+         <Dimension name="elevation" units="CRS:88" default="0" nearestValue="1">0,1000,3000,5000,10000</Dimension>
+      </Layer>
+    </Layer>
+    <Layer opaque="1" noSubsets="1" fixedWidth="512" fixedHeight="256">
+      <Name>ozone_image</Name>
+      <Title>Global ozone distribution (1992)</Title>
+
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+        <eastBoundLongitude>180</eastBoundLongitude>
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="1992">1992</Dimension>
+
+    </Layer>
+    <Layer cascaded="1">
+      <Name>population</Name>
+      <Title>World population, annual</Title>
+      <EX_GeographicBoundingBox>
+        <westBoundLongitude>-180</westBoundLongitude>
+
+        <eastBoundLongitude>180</eastBoundLongitude>
+        <southBoundLatitude>-90</southBoundLatitude>
+        <northBoundLatitude>90</northBoundLatitude>
+      </EX_GeographicBoundingBox>
+      <Dimension name="time" units="ISO8601" default="2000">1990/2000/P1Y</Dimension>
+    </Layer>
+  </Layer>
+
+</Capability>
+</WMS_Capabilities>
diff --git a/test/spec/ol/format/wmscapabilities.test.js b/test/spec/ol/format/wmscapabilities.test.js
new file mode 100644
index 0000000..8505866
--- /dev/null
+++ b/test/spec/ol/format/wmscapabilities.test.js
@@ -0,0 +1,148 @@
+goog.provide('ol.test.format.WMSCapabilities');
+
+describe('ol.format.WMSCapabilities', function() {
+
+  describe('when parsing ogcsample.xml', function() {
+
+    var parser = new ol.format.WMSCapabilities();
+    var capabilities;
+    before(function(done) {
+      afterLoadText('spec/ol/format/wms/ogcsample.xml', function(xml) {
+        try {
+          capabilities = parser.read(xml);
+        } catch (e) {
+          done(e);
+        }
+        done();
+      });
+    });
+
+    it('can read version', function() {
+      expect(capabilities.version).to.eql('1.3.0');
+    });
+
+    it('can read Service section', function() {
+      // FIXME not all fields are tested
+      var service = capabilities.Service;
+      var contact = service.ContactInformation;
+
+      expect(service.Name).to.eql('WMS');
+      expect(service.Title).to.eql('Acme Corp. Map Server');
+      expect(service.KeywordList).to.eql(['bird', 'roadrunner', 'ambush']);
+      expect(service.OnlineResource).to.eql('http://hostname/');
+      expect(service.Fees).to.eql('none');
+      expect(service.AccessConstraints).to.eql('none');
+      expect(service.LayerLimit).to.eql(16);
+      expect(service.MaxWidth).to.eql(2048);
+      expect(service.MaxHeight).to.eql(2048);
+
+      expect(contact.ContactPosition).to.eql('Computer Scientist');
+      expect(contact.ContactPersonPrimary).to.eql({
+        ContactPerson: 'Jeff Smith',
+        ContactOrganization: 'NASA'
+      });
+    });
+
+    it('can read Capability.Exception', function() {
+      var exception = capabilities.Capability.Exception;
+
+      expect(exception).to.eql(['XML', 'INIMAGE', 'BLANK']);
+    });
+
+    it('can read Capability.Request.GetCapabilities', function() {
+      var getCapabilities = capabilities.Capability.Request.GetCapabilities;
+
+      expect(getCapabilities.Format).to.eql(['text/xml']);
+      expect(getCapabilities.DCPType.length).to.eql(1);
+      var http = getCapabilities.DCPType[0].HTTP;
+      expect(http.Get.OnlineResource).to.eql('http://hostname/path?');
+      expect(http.Post.OnlineResource).to.eql('http://hostname/path?');
+    });
+
+    it('can read Capability.Request.GetFeatureInfo', function() {
+      var getFeatureInfo = capabilities.Capability.Request.GetFeatureInfo;
+
+      expect(getFeatureInfo.Format).to.eql(
+          ['text/xml', 'text/plain', 'text/html']);
+      expect(getFeatureInfo.DCPType.length).to.eql(1);
+      var http = getFeatureInfo.DCPType[0].HTTP;
+      expect(http.Get.OnlineResource).to.eql('http://hostname/path?');
+    });
+
+    it('can read Capability.Request.GetMap', function() {
+      var getMap = capabilities.Capability.Request.GetMap;
+
+      expect(getMap.Format).to.eql(['image/gif', 'image/png', 'image/jpeg']);
+      expect(getMap.DCPType.length).to.eql(1);
+      var http = getMap.DCPType[0].HTTP;
+      expect(http.Get.OnlineResource).to.eql('http://hostname/path?');
+    });
+
+    it('can read Capability.Layer', function() {
+      var layer = capabilities.Capability.Layer;
+
+      expect(layer.Title).to.eql('Acme Corp. Map Server');
+      expect(layer.Name).to.be(undefined);
+      expect(layer.CRS).to.eql(['CRS:84']);
+      expect(layer.AuthorityURL).to.eql([{
+        name: 'DIF_ID',
+        OnlineResource: 'http://gcmd.gsfc.nasa.gov/difguide/whatisadif.html'
+      }]);
+      expect(layer.BoundingBox).to.eql([{
+        crs: 'CRS:84',
+        extent: [-1, -1, 1, 1],
+        res: [0, 0]
+      }]);
+
+      expect(layer.Layer.length).to.eql(4);
+      expect(layer.Layer[0].Name).to.eql('ROADS_RIVERS');
+      expect(layer.Layer[0].Title).to.eql('Roads and Rivers');
+      expect(layer.Layer[0].CRS).to.eql(['EPSG:26986', 'CRS:84']);
+      expect(layer.Layer[0].Identifier).to.eql(['123456']);
+      expect(layer.Layer[0].BoundingBox).to.eql([{
+        crs: 'CRS:84',
+        extent: [-71.63, 41.75, -70.78, 42.9],
+        res: [0.01, 0.01]
+      }, {
+        crs: 'EPSG:26986',
+        extent: [189000, 834000, 285000, 962000],
+        res: [1, 1]
+      }]);
+      expect(layer.Layer[0].EX_GeographicBoundingBox).to.eql(
+          [-71.63, 41.75, -70.78, 42.9]);
+      expect(layer.Layer[0].Style).to.eql([{
+        Name: 'USGS',
+        Title: 'USGS Topo Map Style',
+        Abstract: 'Features are shown in a style like that used in USGS ' +
+            'topographic maps.',
+        StyleSheetURL: {
+          Format: 'text/xsl',
+          OnlineResource: 'http://www.university.edu/stylesheets/usgs.xsl'
+        },
+        LegendURL: [{
+          Format: 'image/gif',
+          OnlineResource: 'http://www.university.edu/legends/usgs.gif',
+          size: [72, 72]
+        }]
+      }]);
+      expect(layer.Layer[0].FeatureListURL).to.eql([{
+        Format: 'XML',
+        OnlineResource: 'http://www.university.edu/data/roads_rivers.gml'
+      }]);
+      expect(layer.Layer[0].Attribution).to.eql({
+        Title: 'State College University',
+        OnlineResource: 'http://www.university.edu/',
+        LogoURL: {
+          Format: 'image/gif',
+          OnlineResource: 'http://www.university.edu/icons/logo.gif',
+          size: [100, 100]
+        }
+      });
+
+    });
+
+
+  });
+});
+
+goog.require('ol.format.WMSCapabilities');
diff --git a/test/spec/ol/format/wmsgetfeatureinfoformat.test.js b/test/spec/ol/format/wmsgetfeatureinfoformat.test.js
new file mode 100644
index 0000000..aff68e2
--- /dev/null
+++ b/test/spec/ol/format/wmsgetfeatureinfoformat.test.js
@@ -0,0 +1,207 @@
+goog.provide('ol.test.format.WMSGetFeatureInfo');
+
+describe('ol.format.WMSGetFeatureInfo', function() {
+
+  describe('#readFormat', function() {
+
+    describe('read Features', function() {
+
+      var features;
+
+      before(function(done) {
+        proj4.defs('urn:x-ogc:def:crs:EPSG:4326', proj4.defs('EPSG:4326'));
+        afterLoadText('spec/ol/format/wms/getfeatureinfo.xml', function(data) {
+          try {
+            features = new ol.format.WMSGetFeatureInfo().readFeatures(data);
+          } catch (e) {
+            done(e);
+          }
+          done();
+        });
+      });
+
+      after(function() {
+        proj4.defs('urn:x-ogc:def:crs:EPSG:4326', undefined);
+      });
+
+      it('creates 3 features', function() {
+        expect(features).to.have.length(3);
+      });
+
+      it('creates a feature for 1071', function() {
+        var feature = features[0];
+        expect(feature.getId()).to.be(undefined);
+        expect(feature.get('FID')).to.equal('1071');
+        expect(feature.get('NO_CAMPAGNE')).to.equal('1020050');
+      });
+
+      it('read boundedBy but no geometry', function() {
+        var feature = features[0];
+        expect(feature.getGeometry()).to.be(undefined);
+        expect(feature.get('boundedBy')).to.eql(
+            [-531138.686422, 5386348.414671, -117252.819653, 6144475.186022]);
+      });
+
+      it('read empty response', function() {
+        // read empty response
+        var text = '<?xml version="1.0" encoding="ISO-8859-1"?>' +
+            '<msGMLOutput xmlns:gml="http://www.opengis.net/gml"' +
+            '  xmlns:xlink="http://www.w3.org/1999/xlink"' +
+            '  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
+            '  <AAA64_layer>' +
+            '  </AAA64_layer>' +
+            '</msGMLOutput>';
+        var features = new ol.format.WMSGetFeatureInfo().readFeatures(text);
+        expect(features.length).to.be(0);
+      });
+
+      it('read empty attributes', function() {
+        text =
+            '<?xml version="1.0" encoding="ISO-8859-1"?>' +
+            '<msGMLOutput ' +
+            '   xmlns:gml="http://www.opengis.net/gml"' +
+            '   xmlns:xlink="http://www.w3.org/1999/xlink"' +
+            '   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
+            '  <AAA64_layer>' +
+            '    <AAA64_feature>' +
+            '      <gml:boundedBy>' +
+            '        <gml:Box srsName="EPSG:4326">' +
+            '        <gml:coordinates>' +
+            '        107397.266000,460681.063000 116568.188000,480609.250000' +
+            '        </gml:coordinates>' +
+            '        </gml:Box>' +
+            '      </gml:boundedBy>' +
+            '      <FOO>bar</FOO>' +
+            '      <EMPTY></EMPTY>' +
+            '    </AAA64_feature>' +
+            '  </AAA64_layer>' +
+            '</msGMLOutput>';
+        var features = new ol.format.WMSGetFeatureInfo().readFeatures(text);
+        expect(features.length).to.be(1);
+        expect(features[0].get('FOO')).to.be('bar');
+        // FIXME is that really wanted ?
+        expect(features[0].get('EMPTY')).to.be(undefined);
+      });
+
+      it('read features from multiple layers', function() {
+        text =
+            '<?xml version="1.0" encoding="ISO-8859-1"?>' +
+            '<msGMLOutput ' +
+            '  xmlns:gml="http://www.opengis.net/gml"' +
+            '  xmlns:xlink="http://www.w3.org/1999/xlink"' +
+            '  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
+            '  <AAA64_layer>' +
+            '   <AAA64_feature>' +
+            '     <gml:boundedBy>' +
+            '       <gml:Box srsName="EPSG:4326">' +
+            '       <gml:coordinates>' +
+            '       129799.109000,467950.250000 133199.906000,468904.063000' +
+            '       </gml:coordinates>' +
+            '       </gml:Box>' +
+            '     </gml:boundedBy>' +
+            '     <OBJECTID>287</OBJECTID>' +
+            '     <ROUTE>N403</ROUTE>' +
+            '     <ROUTE_CH>#N403</ROUTE_CH>' +
+            '     <COUNT>1</COUNT>' +
+            '     <BEHEERDER>P</BEHEERDER>' +
+            '     <LENGTH>4091.25</LENGTH>' +
+            '     <SHAPE><shape></SHAPE>' +
+            '     <SE_ANNO_CAD_DATA><null></SE_ANNO_CAD_DATA>' +
+            '   </AAA64_feature>' +
+            '  </AAA64_layer>' +
+            '  <AAA62_layer>' +
+            '   <AAA62_feature>' +
+            '     <gml:boundedBy>' +
+            '       <gml:Box srsName="EPSG:4326">' +
+            '        <gml:coordinates>' +
+            '        129936.000000,468362.000000 131686.000000,473119.000000' +
+            '        </gml:coordinates>' +
+            '       </gml:Box>' +
+            '     </gml:boundedBy>' +
+            '     <OBJECTID>1251</OBJECTID>' +
+            '     <VWK_ID>1515</VWK_ID>' +
+            '     <VWK_BEGDTM>00:00:00 01/01/1998</VWK_BEGDTM>' +
+            '     <VWJ_ID_BEG>1472</VWJ_ID_BEG>' +
+            '     <VWJ_ID_END>1309</VWJ_ID_END>' +
+            '     <VAKTYPE>D</VAKTYPE>' +
+            '     <VRT_CODE>227</VRT_CODE>' +
+            '     <VRT_NAAM>Vecht</VRT_NAAM>' +
+            '     <VWG_NR>2</VWG_NR>' +
+            '     <VWG_NAAM>Vecht</VWG_NAAM>' +
+            '     <BEGKM>18.25</BEGKM>' +
+            '     <ENDKM>23.995</ENDKM>' +
+            '     <LENGTH>5745.09</LENGTH>' +
+            '     <SHAPE><shape></SHAPE>' +
+            '     <SE_ANNO_CAD_DATA><null></SE_ANNO_CAD_DATA>' +
+            '   </AAA62_feature>' +
+            '  </AAA62_layer>' +
+            '</msGMLOutput>';
+        var features = new ol.format.WMSGetFeatureInfo().readFeatures(text);
+        expect(features.length).to.be(2);
+        expect(features[0].get('OBJECTID')).to.be('287');
+        expect(features[1].get('OBJECTID')).to.be('1251');
+      });
+
+      it('read geoserver’s response', function() {
+        text =
+            '<?xml version="1.0" encoding="UTF-8"?>' +
+            '<wfs:FeatureCollection xmlns="http://www.opengis.net/wfs"' +
+            '  xmlns:wfs="http://www.opengis.net/wfs"' +
+            '   xmlns:opengeo="http://opengeo.org"' +
+            '   xmlns:gml="http://www.opengis.net/gml"' +
+            '   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' +
+            '   xsi:schemaLocation="http://opengeo.org ' +
+            '   http://demo.opengeo.org:80/geoserver/wfs?service=WFS&' +
+            'version=1.0.0&request=DescribeFeatureType&' +
+            'typeName=opengeo:roads http://www.opengis.net/wfs ' +
+            '   http://demo.opengeo.org:80/geoserver/schemas/wfs/1.0.0/' +
+            'WFS-basic.xsd">' +
+            '  <gml:boundedBy>' +
+            '    <gml:Box' +
+            ' srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">' +
+            '      <gml:coordinates xmlns:gml="http://www.opengis.net/gml"' +
+            '        decimal="." cs="," ts=" ">' +
+            '591943.9375,4925605 593045.625,4925845' +
+            '      </gml:coordinates>' +
+            '    </gml:Box>' +
+            '  </gml:boundedBy>' +
+            '  <gml:featureMember>' +
+            '    <opengeo:roads fid="roads.90">' +
+            '      <opengeo:cat>3</opengeo:cat>' +
+            '      <opengeo:label>secondary highway, hard surface' +
+            '      </opengeo:label>' +
+            '      <opengeo:the_geom>' +
+            '        <gml:MultiLineString' +
+            '  srsName="http://www.opengis.net/gml/srs/epsg.xml#4326">' +
+            '        <gml:lineStringMember>' +
+            '        <gml:LineString>' +
+            '        <gml:coordinates xmlns:gml="http://www.opengis.net/gml"' +
+            ' decimal="." cs="," ts=" ">' +
+            '593045.60746465,4925605.0059156 593024.32382915,4925606.79305411' +
+            ' 592907.54863574,4925624.85647524 592687.35111096,' +
+            '4925670.76834012 592430.76279218,4925678.79393165' +
+            ' 592285.97636109,4925715.70811767 592173.39165655,' +
+            '4925761.83511156 592071.1753393,4925793.95523514' +
+            ' 591985.96972625,4925831.59842486' +
+            ' 591943.98769455,4925844.93220071' +
+            '        </gml:coordinates>' +
+            '        </gml:LineString>' +
+            '        </gml:lineStringMember>' +
+            '        </gml:MultiLineString>' +
+            '      </opengeo:the_geom>' +
+            '    </opengeo:roads>' +
+            '  </gml:featureMember>' +
+            '</wfs:FeatureCollection>';
+        var features = new ol.format.WMSGetFeatureInfo().readFeatures(text);
+        expect(features.length).to.be(1);
+        expect(features[0].get('cat')).to.be('3');
+        expect(features[0].getGeometry().getType()).to.be('MultiLineString');
+      });
+
+    });
+  });
+});
+
+
+goog.require('goog.dom');
+goog.require('ol.format.WMSGetFeatureInfo');
diff --git a/test/spec/ol/geom/circle.test.js b/test/spec/ol/geom/circle.test.js
new file mode 100644
index 0000000..0b4443d
--- /dev/null
+++ b/test/spec/ol/geom/circle.test.js
@@ -0,0 +1,212 @@
+goog.provide('ol.test.geom.Circle');
+
+
+describe('ol.geom.Circle', function() {
+
+  describe('with a unit circle', function() {
+
+    var circle;
+    beforeEach(function() {
+      circle = new ol.geom.Circle([0, 0], 1);
+    });
+
+    describe('#clone', function() {
+
+      it('returns a clone', function() {
+        var clone = circle.clone();
+        expect(clone).to.be.an(ol.geom.Circle);
+        expect(clone.getCenter()).to.eql(circle.getCenter());
+        expect(clone.getCenter()).not.to.be(circle.getCenter());
+        expect(clone.getRadius()).to.be(circle.getRadius());
+      });
+
+    });
+
+    describe('#containsCoordinate', function() {
+
+      it('contains the center', function() {
+        expect(circle.containsCoordinate([0, 0])).to.be(true);
+      });
+
+      it('contains points inside the perimeter', function() {
+        expect(circle.containsCoordinate([0.5, 0.5])).to.be(true);
+        expect(circle.containsCoordinate([-0.5, 0.5])).to.be(true);
+        expect(circle.containsCoordinate([-0.5, -0.5])).to.be(true);
+        expect(circle.containsCoordinate([0.5, -0.5])).to.be(true);
+      });
+
+      it('contains points on the perimeter', function() {
+        expect(circle.containsCoordinate([1, 0])).to.be(true);
+        expect(circle.containsCoordinate([0, 1])).to.be(true);
+        expect(circle.containsCoordinate([-1, 0])).to.be(true);
+        expect(circle.containsCoordinate([0, -1])).to.be(true);
+      });
+
+      it('does not contain points outside the perimeter', function() {
+        expect(circle.containsCoordinate([2, 0])).to.be(false);
+        expect(circle.containsCoordinate([1, 1])).to.be(false);
+        expect(circle.containsCoordinate([-2, 0])).to.be(false);
+        expect(circle.containsCoordinate([0, -2])).to.be(false);
+      });
+
+    });
+
+    describe('#getCenter', function() {
+
+      it('returns the expected value', function() {
+        expect(circle.getCenter()).to.eql([0, 0]);
+      });
+
+    });
+
+    describe('#getClosestPoint', function() {
+
+      it('returns the closest point on the perimeter', function() {
+        var closestPoint;
+        closestPoint = circle.getClosestPoint([2, 0]);
+        expect(closestPoint[0]).to.roughlyEqual(1, 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(0, 1e-15);
+        closestPoint = circle.getClosestPoint([2, 2]);
+        expect(closestPoint[0]).to.roughlyEqual(Math.sqrt(0.5), 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(Math.sqrt(0.5), 1e-15);
+        closestPoint = circle.getClosestPoint([0, 2]);
+        expect(closestPoint[0]).to.roughlyEqual(0, 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(1, 1e-15);
+        closestPoint = circle.getClosestPoint([-2, 2]);
+        expect(closestPoint[0]).to.roughlyEqual(-Math.sqrt(0.5), 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(Math.sqrt(0.5), 1e-15);
+        closestPoint = circle.getClosestPoint([-2, 0]);
+        expect(closestPoint[0]).to.roughlyEqual(-1, 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(0, 1e-15);
+        closestPoint = circle.getClosestPoint([-2, -2]);
+        expect(closestPoint[0]).to.roughlyEqual(-Math.sqrt(0.5), 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(-Math.sqrt(0.5), 1e-15);
+        closestPoint = circle.getClosestPoint([0, -2]);
+        expect(closestPoint[0]).to.roughlyEqual(0, 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(-1, 1e-15);
+        closestPoint = circle.getClosestPoint([2, -2]);
+        expect(closestPoint[0]).to.roughlyEqual(Math.sqrt(0.5), 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(-Math.sqrt(0.5), 1e-15);
+      });
+
+      it('maintains Z coordinates', function() {
+        var circle = new ol.geom.Circle([0, 0, 1], 1);
+        expect(circle.getLayout()).to.be(ol.geom.GeometryLayout.XYZ);
+        var closestPoint = circle.getClosestPoint([2, 0]);
+        expect(closestPoint).to.have.length(3);
+        expect(closestPoint[0]).to.roughlyEqual(1, 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(0, 1e-15);
+        expect(closestPoint[2]).to.be(1);
+      });
+
+      it('maintains M coordinates', function() {
+        var circle = new ol.geom.Circle([0, 0, 2], 1,
+            ol.geom.GeometryLayout.XYM);
+        var closestPoint = circle.getClosestPoint([2, 0]);
+        expect(closestPoint).to.have.length(3);
+        expect(closestPoint[0]).to.roughlyEqual(1, 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(0, 1e-15);
+        expect(closestPoint[2]).to.be(2);
+      });
+
+      it('maintains Z and M coordinates', function() {
+        var circle = new ol.geom.Circle([0, 0, 1, 2], 1);
+        expect(circle.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var closestPoint = circle.getClosestPoint([2, 0]);
+        expect(closestPoint).to.have.length(4);
+        expect(closestPoint[0]).to.roughlyEqual(1, 1e-15);
+        expect(closestPoint[1]).to.roughlyEqual(0, 1e-15);
+        expect(closestPoint[2]).to.be(1);
+        expect(closestPoint[3]).to.be(2);
+      });
+
+    });
+
+    describe('#getExtent', function() {
+
+      it('returns the expected value', function() {
+        expect(circle.getExtent()).to.eql([-1, -1, 1, 1]);
+      });
+
+    });
+
+    describe('#getRadius', function() {
+
+      it('returns the expected value', function() {
+        expect(circle.getRadius()).to.be(1);
+      });
+
+    });
+
+    describe('#getSimplifiedGeometry', function() {
+
+      it('returns the same geometry', function() {
+        expect(circle.getSimplifiedGeometry(1)).to.be(circle);
+      });
+
+    });
+
+    describe('#getType', function() {
+
+      it('returns the expected value', function() {
+        expect(circle.getType()).to.be(ol.geom.GeometryType.CIRCLE);
+      });
+
+    });
+
+    describe('#setCenter', function() {
+
+      it('sets the center', function() {
+        circle.setCenter([1, 2]);
+        expect(circle.getCenter()).to.eql([1, 2]);
+      });
+
+      it('fires a change event', function() {
+        var spy = sinon.spy();
+        circle.on('change', spy);
+        circle.setCenter([1, 2]);
+        expect(spy.calledOnce).to.be(true);
+      });
+
+    });
+
+    describe('#setFlatCoordinates', function() {
+
+      it('sets both center and radius', function() {
+        circle.setFlatCoordinates(ol.geom.GeometryLayout.XY, [1, 2, 4, 2]);
+        expect(circle.getCenter()).to.eql([1, 2]);
+        expect(circle.getRadius()).to.be(3);
+      });
+
+      it('fires a single change event', function() {
+        var spy = sinon.spy();
+        circle.on('change', spy);
+        circle.setFlatCoordinates(ol.geom.GeometryLayout.XY, [1, 2, 4, 2]);
+        expect(spy.calledOnce).to.be(true);
+      });
+
+    });
+
+    describe('#setRadius', function() {
+
+      it('sets the radius', function() {
+        circle.setRadius(2);
+        expect(circle.getRadius()).to.be(2);
+      });
+
+      it('fires a change event', function() {
+        var spy = sinon.spy();
+        circle.on('change', spy);
+        circle.setRadius(2);
+        expect(spy.calledOnce).to.be(true);
+      });
+
+    });
+
+  });
+
+});
+
+
+goog.require('ol.geom.Circle');
+goog.require('ol.geom.GeometryType');
diff --git a/test/spec/ol/geom/flat/areaflatgeom.test.js b/test/spec/ol/geom/flat/areaflatgeom.test.js
new file mode 100644
index 0000000..afd0b8a
--- /dev/null
+++ b/test/spec/ol/geom/flat/areaflatgeom.test.js
@@ -0,0 +1,32 @@
+goog.provide('ol.test.geom.flat.area');
+
+describe('ol.geom.flat.area', function() {
+
+  describe('ol.geom.flat.area.linearRing', function() {
+
+    it('calcaultes the area of a triangle', function() {
+      var area = ol.geom.flat.area.linearRing([0, 0, 0.5, 1, 1, 0], 0, 6, 2);
+      expect(area).to.be(0.5);
+    });
+
+    it('calculates the area of a unit square', function() {
+      var area =
+          ol.geom.flat.area.linearRing([0, 0, 0, 1, 1, 1, 1, 0], 0, 8, 2);
+      expect(area).to.be(1);
+    });
+
+  });
+
+  describe('ol.geom.flat.area.linearRings', function() {
+
+    it('calculates the area with holes', function() {
+      var area = ol.geom.flat.area.linearRings(
+          [0, 0, 0, 3, 3, 3, 3, 0, 1, 1, 2, 1, 2, 2, 1, 2], 0, [8, 16], 2);
+      expect(area).to.be(8);
+    });
+
+  });
+
+});
+
+goog.require('ol.geom.flat.area');
diff --git a/test/spec/ol/geom/flat/closestflatgeom.test.js b/test/spec/ol/geom/flat/closestflatgeom.test.js
new file mode 100644
index 0000000..e583ed0
--- /dev/null
+++ b/test/spec/ol/geom/flat/closestflatgeom.test.js
@@ -0,0 +1,146 @@
+goog.provide('ol.test.geom.flat.closest');
+
+
+describe('ol.geom.flat.closest', function() {
+
+  describe('with simple data', function() {
+
+    var flatCoordinates = [0, 0, 1, 0, 3, 0, 5, 0, 6, 0, 8, 0, 11, 0];
+
+    describe('ol.geom.flat.closest.getMaxSquaredDelta', function() {
+
+      it('returns the expected value in simple cases', function() {
+        expect(ol.geom.flat.closest.getMaxSquaredDelta(
+            flatCoordinates, 0, flatCoordinates.length, 2, 0)).to.be(9);
+      });
+
+    });
+
+    describe('ol.geom.flat.closest.getClosestPoint', function() {
+
+      it('returns the expected value', function() {
+        var maxDelta = Math.sqrt(ol.geom.flat.closest.getMaxSquaredDelta(
+            flatCoordinates, 0, flatCoordinates.length, 2, 0));
+        expect(maxDelta).to.be(3);
+        var closestPoint = [NaN, NaN];
+        expect(ol.geom.flat.closest.getClosestPoint(
+            flatCoordinates, 0, flatCoordinates.length, 2,
+            maxDelta, false, 0, 0, closestPoint, Infinity)).to.be(0);
+        expect(closestPoint).to.eql([0, 0]);
+        expect(ol.geom.flat.closest.getClosestPoint(
+            flatCoordinates, 0, flatCoordinates.length, 2,
+            maxDelta, false, 4, 1, closestPoint, Infinity)).to.be(1);
+        expect(closestPoint).to.eql([4, 0]);
+        expect(ol.geom.flat.closest.getClosestPoint(
+            flatCoordinates, 0, flatCoordinates.length, 2,
+            maxDelta, false, 5, 2, closestPoint, Infinity)).to.be(4);
+        expect(closestPoint).to.eql([5, 0]);
+        expect(ol.geom.flat.closest.getClosestPoint(
+            flatCoordinates, 0, flatCoordinates.length, 2,
+            maxDelta, false, 10, 100, closestPoint, Infinity)).to.be(10000);
+        expect(closestPoint).to.eql([10, 0]);
+      });
+
+    });
+
+  });
+
+  describe('with real data', function() {
+
+    var flatCoordinates = [
+      224.55, 250.15, 226.91, 244.19, 233.31, 241.45, 234.98, 236.06,
+      244.21, 232.76, 262.59, 215.31, 267.76, 213.81, 273.57, 201.84,
+      273.12, 192.16, 277.62, 189.03, 280.36, 181.41, 286.51, 177.74,
+      292.41, 159.37, 296.91, 155.64, 314.95, 151.37, 319.75, 145.16,
+      330.33, 137.57, 341.48, 139.96, 369.98, 137.89, 387.39, 142.51,
+      391.28, 139.39, 409.52, 141.14, 414.82, 139.75, 427.72, 127.30,
+      439.60, 119.74, 474.93, 107.87, 486.51, 106.75, 489.20, 109.45,
+      493.79, 108.63, 504.74, 119.66, 512.96, 122.35, 518.63, 120.89,
+      524.09, 126.88, 529.57, 127.86, 534.21, 140.93, 539.27, 147.24,
+      567.69, 148.91, 575.25, 157.26, 580.62, 158.15, 601.53, 156.85,
+      617.74, 159.86, 622.00, 167.04, 629.55, 194.60, 638.90, 195.61,
+      641.26, 200.81, 651.77, 204.56, 671.55, 222.55, 683.68, 217.45,
+      695.25, 219.15, 700.64, 217.98, 703.12, 214.36, 712.26, 215.87,
+      721.49, 212.81, 727.81, 213.36, 729.98, 208.73, 735.32, 208.20,
+      739.94, 204.77, 769.98, 208.42, 779.60, 216.87, 784.20, 218.16,
+      800.24, 214.62, 810.53, 219.73, 817.19, 226.82, 820.77, 236.17,
+      827.23, 236.16, 829.89, 239.89, 851.00, 248.94, 859.88, 255.49,
+      865.21, 268.53, 857.95, 280.30, 865.48, 291.45, 866.81, 298.66,
+      864.68, 302.71, 867.79, 306.17, 859.87, 311.37, 860.08, 314.35,
+      858.29, 314.94, 858.10, 327.60, 854.54, 335.40, 860.92, 343.00,
+      856.43, 350.15, 851.42, 352.96, 849.84, 359.59, 854.56, 365.53,
+      849.74, 370.38, 844.09, 371.89, 844.75, 380.44, 841.52, 383.67,
+      839.57, 390.40, 845.59, 399.05, 848.40, 407.55, 843.71, 411.30,
+      844.09, 419.88, 839.51, 432.76, 841.33, 441.04, 847.62, 449.22,
+      847.16, 458.44, 851.38, 462.79, 853.97, 471.15, 866.36, 480.77
+    ];
+
+    describe('ol.geom.closet.maSquaredDelta', function() {
+
+      it('returns the expected value', function() {
+        expect(ol.geom.flat.closest.getMaxSquaredDelta(
+            flatCoordinates, 0, flatCoordinates.length, 2, 0)).
+            to.roughlyEqual(1389.1058, 1e-9);
+      });
+
+    });
+
+    describe('ol.geom.flat.closest.getClosestPoint', function() {
+
+      it('returns the expected value', function() {
+        var maxDelta = Math.sqrt(ol.geom.flat.closest.getMaxSquaredDelta(
+            flatCoordinates, 0, flatCoordinates.length, 2, 0));
+        expect(maxDelta).to.roughlyEqual(Math.sqrt(1389.1058), 1e-9);
+        var closestPoint = [NaN, NaN];
+        expect(ol.geom.flat.closest.getClosestPoint(
+            flatCoordinates, 0, flatCoordinates.length, 2,
+            maxDelta, false, 0, 0, closestPoint, Infinity)).
+            to.roughlyEqual(110902.405, 1e-9);
+        expect(closestPoint).to.eql([292.41, 159.37]);
+        expect(ol.geom.flat.closest.getClosestPoint(
+            flatCoordinates, 0, flatCoordinates.length, 2,
+            maxDelta, false, 500, 500, closestPoint, Infinity)).
+            to.roughlyEqual(106407.905, 1e-9);
+        expect(closestPoint).to.eql([671.55, 222.55]);
+        expect(ol.geom.flat.closest.getClosestPoint(
+            flatCoordinates, 0, flatCoordinates.length, 2,
+            maxDelta, false, 1000, 500, closestPoint, Infinity)).
+            to.roughlyEqual(18229.4425, 1e-9);
+        expect(closestPoint).to.eql([866.36, 480.77]);
+      });
+
+    });
+
+  });
+
+  describe('with multi-dimensional data', function() {
+
+    var flatCoordinates = [0, 0, 10, -10, 2, 2, 30, -20];
+    var stride = 4;
+
+    describe('ol.geom.flat.closest.getClosestPoint', function() {
+
+      it('interpolates M coordinates', function() {
+        var maxDelta = Math.sqrt(ol.geom.flat.closest.getMaxSquaredDelta(
+            flatCoordinates, 0, flatCoordinates.length, stride, 0));
+        expect(maxDelta).to.roughlyEqual(Math.sqrt(8), 1e-9);
+        var closestPoint = [NaN, NaN];
+        expect(ol.geom.flat.closest.getClosestPoint(
+            flatCoordinates, 0, flatCoordinates.length, stride,
+            maxDelta, false, 1, 1, closestPoint, Infinity)).
+            to.roughlyEqual(0, 1e-9);
+        expect(closestPoint).to.have.length(stride);
+        expect(closestPoint[0]).to.be(1);
+        expect(closestPoint[1]).to.be(1);
+        expect(closestPoint[2]).to.be(20);
+        expect(closestPoint[3]).to.be(-15);
+      });
+
+    });
+
+  });
+
+});
+
+
+goog.require('ol.geom.flat.closest');
diff --git a/test/spec/ol/geom/flat/deflateflatgeom.test.js b/test/spec/ol/geom/flat/deflateflatgeom.test.js
new file mode 100644
index 0000000..75ff97e
--- /dev/null
+++ b/test/spec/ol/geom/flat/deflateflatgeom.test.js
@@ -0,0 +1,39 @@
+goog.provide('ol.test.geom.flat.deflate');
+
+describe('ol.geom.flat.deflate', function() {
+
+  describe('ol.geom.flat.deflate.coordinates', function() {
+
+    var flatCoordinates;
+    beforeEach(function() {
+      flatCoordinates = [];
+    });
+
+    it('flattens coordinates', function() {
+      var offset = ol.geom.flat.deflate.coordinates(
+          flatCoordinates, 0, [[1, 2], [3, 4]], 2);
+      expect(offset).to.be(4);
+      expect(flatCoordinates).to.eql([1, 2, 3, 4]);
+    });
+
+  });
+
+  describe('ol.geom.flat.deflate.coordinatess', function() {
+
+    var flatCoordinates;
+    beforeEach(function() {
+      flatCoordinates = [];
+    });
+
+    it('flattens arrays of coordinates', function() {
+      var ends = ol.geom.flat.deflate.coordinatess(flatCoordinates, 0,
+          [[[1, 2], [3, 4]], [[5, 6], [7, 8]]], 2);
+      expect(ends).to.eql([4, 8]);
+      expect(flatCoordinates).to.eql([1, 2, 3, 4, 5, 6, 7, 8]);
+    });
+
+  });
+
+});
+
+goog.require('ol.geom.flat.deflate');
diff --git a/test/spec/ol/geom/flat/flipflatgeom.test.js b/test/spec/ol/geom/flat/flipflatgeom.test.js
new file mode 100644
index 0000000..ec5da63
--- /dev/null
+++ b/test/spec/ol/geom/flat/flipflatgeom.test.js
@@ -0,0 +1,38 @@
+goog.provide('ol.test.geom.flat.flip');
+
+describe('ol.geom.flat.flip', function() {
+
+  describe('ol.geom.flat.flip.flipXY', function() {
+
+    it('can flip XY coordinates', function() {
+      var flatCoordinates = ol.geom.flat.flip.flipXY([1, 2, 3, 4], 0, 4, 2);
+      expect(flatCoordinates).to.eql([2, 1, 4, 3]);
+    });
+
+    it('can flip XY coordinates while preserving other dimensions', function() {
+      var flatCoordinates = ol.geom.flat.flip.flipXY(
+          [1, 2, 3, 4, 5, 6, 7, 8], 0, 8, 4);
+      expect(flatCoordinates).to.eql([2, 1, 3, 4, 6, 5, 7, 8]);
+    });
+
+    it('can flip XY coordinates in place', function() {
+      var flatCoordinates = [1, 2, 3, 4];
+      expect(ol.geom.flat.flip.flipXY(
+          flatCoordinates, 0, 4, 2, flatCoordinates)).to.be(flatCoordinates);
+      expect(flatCoordinates).to.eql([2, 1, 4, 3]);
+    });
+
+    it('can flip XY coordinates in place while preserving other dimensions',
+        function() {
+          var flatCoordinates = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+          expect(ol.geom.flat.flip.flipXY(
+              flatCoordinates, 0, 9, 3, flatCoordinates)).
+              to.be(flatCoordinates);
+          expect(flatCoordinates).to.eql([2, 1, 3, 5, 4, 6, 8, 7, 9]);
+        });
+
+  });
+
+});
+
+goog.require('ol.geom.flat.flip');
diff --git a/test/spec/ol/geom/flat/inflateflatgeom.test.js b/test/spec/ol/geom/flat/inflateflatgeom.test.js
new file mode 100644
index 0000000..478aecd
--- /dev/null
+++ b/test/spec/ol/geom/flat/inflateflatgeom.test.js
@@ -0,0 +1,26 @@
+goog.provide('ol.test.geom.flat.inflate');
+
+describe('ol.geom.flat.inflate', function() {
+
+  describe('ol.geom.flat.inflate.coordinates', function() {
+
+    it('inflates coordinates', function() {
+      var coordinates = ol.geom.flat.inflate.coordinates([1, 2, 3, 4], 0, 4, 2);
+      expect(coordinates).to.eql([[1, 2], [3, 4]]);
+    });
+
+  });
+
+  describe('ol.geom.flat.inflate.coordinatess', function() {
+
+    it('inflates arrays of coordinates', function() {
+      var coordinatess = ol.geom.flat.inflate.coordinatess(
+          [1, 2, 3, 4, 5, 6, 7, 8], 0, [4, 8], 2);
+      expect(coordinatess).to.eql([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]);
+    });
+
+  });
+
+});
+
+goog.require('ol.geom.flat.inflate');
diff --git a/test/spec/ol/geom/flat/interpolateflatgeom.test.js b/test/spec/ol/geom/flat/interpolateflatgeom.test.js
new file mode 100644
index 0000000..a9b205b
--- /dev/null
+++ b/test/spec/ol/geom/flat/interpolateflatgeom.test.js
@@ -0,0 +1,57 @@
+goog.provide('ol.test.geom.flat.interpolate');
+
+describe('ol.geom.flat.interpolate', function() {
+
+  describe('ol.geom.flat.interpolate.lineString', function() {
+
+    it('returns the expected value for single points', function() {
+      var flatCoordinates = [0, 1];
+      var point =
+          ol.geom.flat.interpolate.lineString(flatCoordinates, 0, 2, 2, 0.5);
+      expect(point).to.eql([0, 1]);
+    });
+
+    it('returns the expected value for simple line segments', function() {
+      var flatCoordinates = [0, 1, 2, 3];
+      var point =
+          ol.geom.flat.interpolate.lineString(flatCoordinates, 0, 4, 2, 0.5);
+      expect(point).to.eql([1, 2]);
+    });
+
+    it('returns the expected value when the mid point is an existing ' +
+       'coordinate', function() {
+          var flatCoordinates = [0, 1, 2, 3, 4, 5];
+          var point = ol.geom.flat.interpolate.lineString(
+              flatCoordinates, 0, 6, 2, 0.5);
+          expect(point).to.eql([2, 3]);
+        });
+
+    it('returns the expected value when the midpoint falls halfway between ' +
+       'two existing coordinates', function() {
+          var flatCoordinates = [0, 1, 2, 3, 4, 5, 6, 7];
+          var point = ol.geom.flat.interpolate.lineString(
+              flatCoordinates, 0, 8, 2, 0.5);
+          expect(point).to.eql([3, 4]);
+        });
+
+    it('returns the expected value when the coordinates are not evenly spaced',
+        function() {
+          var flatCoordinates = [0, 1, 2, 3, 6, 7];
+          var point = ol.geom.flat.interpolate.lineString(
+              flatCoordinates, 0, 6, 2, 0.5);
+          expect(point).to.eql([3, 4]);
+        });
+
+    it('returns the expected value when using opt_dest',
+        function() {
+          var flatCoordinates = [0, 1, 2, 3, 6, 7];
+          var point = ol.geom.flat.interpolate.lineString(
+              flatCoordinates, 0, 6, 2, 0.5, [0, 0]);
+          expect(point).to.eql([3, 4]);
+        });
+
+  });
+
+});
+
+goog.require('ol.geom.flat.interpolate');
diff --git a/test/spec/ol/geom/flat/intersectsextentflatgeom.test.js b/test/spec/ol/geom/flat/intersectsextentflatgeom.test.js
new file mode 100644
index 0000000..e929efc
--- /dev/null
+++ b/test/spec/ol/geom/flat/intersectsextentflatgeom.test.js
@@ -0,0 +1,92 @@
+goog.provide('ol.test.geom.flat.intersectsextent');
+
+describe('ol.geom.flat.intersectsextent', function() {
+
+  describe('ol.geom.flat.intersectsextent.lineString', function() {
+    var flatCoordinates;
+    beforeEach(function() {
+      flatCoordinates = [0, 0, 1, 1, 2, 2];
+    });
+    describe('linestring envelope does not intersect the extent', function() {
+      it('returns false', function() {
+        var extent = [3, 3, 4, 4];
+        var r = ol.geom.flat.intersectsextent.lineString(
+            flatCoordinates, 0, flatCoordinates.length, 2, extent);
+        expect(r).to.be(false);
+      });
+    });
+    describe('linestring envelope within the extent', function() {
+      it('returns true', function() {
+        var extent = [-1, -1, 3, 3];
+        var r = ol.geom.flat.intersectsextent.lineString(
+            flatCoordinates, 0, flatCoordinates.length, 2, extent);
+        expect(r).to.be(true);
+      });
+    });
+    describe('linestring envelope bisected by an edge of the extent',
+        function() {
+          it('returns true', function() {
+            var extent = [-0.1, 0.1, 2.1, 0.1];
+            var r = ol.geom.flat.intersectsextent.lineString(
+                flatCoordinates, 0, flatCoordinates.length, 2, extent);
+            expect(r).to.be(true);
+          });
+        });
+    describe('a segment intersects the extent', function() {
+      it('returns true', function() {
+        var extent = [-0.5, -0.5, 0.5, 0.5];
+        var r = ol.geom.flat.intersectsextent.lineString(
+            flatCoordinates, 0, flatCoordinates.length, 2, extent);
+        expect(r).to.be(true);
+      });
+    });
+    describe('no segments intersect the extent', function() {
+      it('returns false', function() {
+        var extent = [0.5, 1.5, 1, 1.75];
+        var r = ol.geom.flat.intersectsextent.lineString(
+            flatCoordinates, 0, flatCoordinates.length, 2, extent);
+        expect(r).to.be(false);
+      });
+      it('returns false', function() {
+        var extent = [1, 0.25, 1.5, 0.5];
+        var r = ol.geom.flat.intersectsextent.lineString(
+            flatCoordinates, 0, flatCoordinates.length, 2, extent);
+        expect(r).to.be(false);
+      });
+    });
+  });
+
+  describe('ol.geom.flat.intersectsextent.linearRing', function() {
+    var flatCoordinates;
+    beforeEach(function() {
+      flatCoordinates = [0, 0, 1, 1, 2, 0, 1, -1, 0, 0];
+    });
+    describe('boundary intersects the extent', function() {
+      it('returns true', function() {
+        var extent = [1.5, 0.0, 2.5, 1.0];
+        var r = ol.geom.flat.intersectsextent.linearRing(
+            flatCoordinates, 0, flatCoordinates.length, 2, extent);
+        expect(r).to.be(true);
+      });
+    });
+    describe('boundary does not intersect the extent and ring does not ' +
+        'contain a corner of the extent', function() {
+          it('returns false', function() {
+            var extent = [2.0, 0.5, 3, 1.5];
+            var r = ol.geom.flat.intersectsextent.linearRing(
+                flatCoordinates, 0, flatCoordinates.length, 2, extent);
+            expect(r).to.be(false);
+          });
+        });
+    describe('ring contains the extent', function() {
+      it('returns true', function() {
+        var extent = [0.75, -0.25, 1.25, 0.25];
+        var r = ol.geom.flat.intersectsextent.linearRing(
+            flatCoordinates, 0, flatCoordinates.length, 2, extent);
+        expect(r).to.be(true);
+      });
+    });
+  });
+});
+
+goog.require('ol.geom.flat.intersectsextent');
diff --git a/test/spec/ol/geom/flat/orientflatgeom.test.js b/test/spec/ol/geom/flat/orientflatgeom.test.js
new file mode 100644
index 0000000..c8842eb
--- /dev/null
+++ b/test/spec/ol/geom/flat/orientflatgeom.test.js
@@ -0,0 +1,25 @@
+goog.provide('ol.test.geom.flat.orient');
+
+describe('ol.geom.flat.orient', function() {
+
+  describe('ol.geom.flat.orient.linearRingIsClockwise', function() {
+
+    it('identifies clockwise rings', function() {
+      var flatCoordinates = [0, 1, 1, 4, 4, 3, 3, 0];
+      var isClockwise = ol.geom.flat.orient.linearRingIsClockwise(
+          flatCoordinates, 0, flatCoordinates.length, 2);
+      expect(isClockwise).to.be(true);
+    });
+
+    it('identifies anti-clockwise rings', function() {
+      var flatCoordinates = [2, 2, 3, 2, 3, 3, 2, 3];
+      var isClockwise = ol.geom.flat.orient.linearRingIsClockwise(
+          flatCoordinates, 0, flatCoordinates.length, 2);
+      expect(isClockwise).to.be(false);
+    });
+
+  });
+
+});
+
+goog.require('ol.geom.flat.orient');
diff --git a/test/spec/ol/geom/flat/reverseflatgeom.js b/test/spec/ol/geom/flat/reverseflatgeom.js
new file mode 100644
index 0000000..a2c8fa0
--- /dev/null
+++ b/test/spec/ol/geom/flat/reverseflatgeom.js
@@ -0,0 +1,130 @@
+goog.provide('ol.test.geom.flat.reverse');
+
+describe('ol.geom.flat.reverse', function() {
+
+  describe('ol.geom.flat.reverse.coordinates', function() {
+
+    describe('with a stride of 2', function() {
+
+      it('can reverse empty flat coordinates', function() {
+        var flatCoordinates = [];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 2);
+        expect(flatCoordinates).to.be.empty();
+      });
+
+      it('can reverse one flat coordinates', function() {
+        var flatCoordinates = [1, 2];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 2);
+        expect(flatCoordinates).to.eql([1, 2]);
+      });
+
+      it('can reverse two flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 2);
+        expect(flatCoordinates).to.eql([3, 4, 1, 2]);
+      });
+
+      it('can reverse three flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4, 5, 6];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 2);
+        expect(flatCoordinates).to.eql([5, 6, 3, 4, 1, 2]);
+      });
+
+      it('can reverse four flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4, 5, 6, 7, 8];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 2);
+        expect(flatCoordinates).to.eql([7, 8, 5, 6, 3, 4, 1, 2]);
+      });
+
+    });
+
+    describe('with a stride of 3', function() {
+
+      it('can reverse empty flat coordinates', function() {
+        var flatCoordinates = [];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 3);
+        expect(flatCoordinates).to.be.empty();
+      });
+
+      it('can reverse one flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 3);
+        expect(flatCoordinates).to.eql([1, 2, 3]);
+      });
+
+      it('can reverse two flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4, 5, 6];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 3);
+        expect(flatCoordinates).to.eql([4, 5, 6, 1, 2, 3]);
+      });
+
+      it('can reverse three flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4, 5, 6, 7, 8, 9];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 3);
+        expect(flatCoordinates).to.eql([7, 8, 9, 4, 5, 6, 1, 2, 3]);
+      });
+
+      it('can reverse four flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 3);
+        expect(flatCoordinates).to.eql([10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3]);
+      });
+
+    });
+
+    describe('with a stride of 4', function() {
+
+      it('can reverse empty flat coordinates', function() {
+        var flatCoordinates = [];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 4);
+        expect(flatCoordinates).to.be.empty();
+      });
+
+      it('can reverse one flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 4);
+        expect(flatCoordinates).to.eql([1, 2, 3, 4]);
+      });
+
+      it('can reverse two flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4, 5, 6, 7, 8];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 4);
+        expect(flatCoordinates).to.eql([5, 6, 7, 8, 1, 2, 3, 4]);
+      });
+
+      it('can reverse three flat coordinates', function() {
+        var flatCoordinates = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 4);
+        expect(flatCoordinates).to.eql([9, 10, 11, 12, 5, 6, 7, 8, 1, 2, 3, 4]);
+      });
+
+      it('can reverse four flat coordinates', function() {
+        var flatCoordinates =
+            [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
+        ol.geom.flat.reverse.coordinates(
+            flatCoordinates, 0, flatCoordinates.length, 4);
+        expect(flatCoordinates).to.eql(
+            [13, 14, 15, 16, 9, 10, 11, 12, 5, 6, 7, 8, 1, 2, 3, 4]);
+      });
+
+    });
+
+  });
+
+});
+
+goog.require('ol.geom.flat.reverse');
diff --git a/test/spec/ol/geom/flat/segmentsflatgeom.test.js b/test/spec/ol/geom/flat/segmentsflatgeom.test.js
new file mode 100644
index 0000000..18a70f5
--- /dev/null
+++ b/test/spec/ol/geom/flat/segmentsflatgeom.test.js
@@ -0,0 +1,57 @@
+goog.provide('ol.test.geom.flat.segments');
+
+describe('ol.geom.flat.segments', function() {
+
+  describe('ol.geom.flat.segments.forEach', function() {
+    var flatCoordinates, offset, end, stride;
+    beforeEach(function() {
+      flatCoordinates = [0, 0, 1, 1, 2, 2, 3, 3];
+      offset = 0;
+      end = 8;
+      stride = 2;
+    });
+    describe('callback returns undefined', function() {
+      it('executes the callback for each segment', function() {
+        var args = [];
+        var spy = sinon.spy(function(point1, point2) {
+          args.push([point1[0], point1[1], point2[0], point2[1]]);
+        });
+        var ret = ol.geom.flat.segments.forEach(
+            flatCoordinates, offset, end, stride, spy);
+        expect(spy.callCount).to.be(3);
+        expect(args[0][0]).to.be(0);
+        expect(args[0][1]).to.be(0);
+        expect(args[0][2]).to.be(1);
+        expect(args[0][3]).to.be(1);
+        expect(args[1][0]).to.be(1);
+        expect(args[1][1]).to.be(1);
+        expect(args[1][2]).to.be(2);
+        expect(args[1][3]).to.be(2);
+        expect(args[2][0]).to.be(2);
+        expect(args[2][1]).to.be(2);
+        expect(args[2][2]).to.be(3);
+        expect(args[2][3]).to.be(3);
+        expect(ret).to.be(false);
+      });
+    });
+    describe('callback returns true', function() {
+      it('executes the callback for the first segment', function() {
+        var args = [];
+        var spy = sinon.spy(function(point1, point2) {
+          args.push([point1[0], point1[1], point2[0], point2[1]]);
+          return true;
+        });
+        var ret = ol.geom.flat.segments.forEach(
+            flatCoordinates, offset, end, stride, spy);
+        expect(spy.callCount).to.be(1);
+        expect(args[0][0]).to.be(0);
+        expect(args[0][1]).to.be(0);
+        expect(args[0][2]).to.be(1);
+        expect(args[0][3]).to.be(1);
+        expect(ret).to.be(true);
+      });
+    });
+  });
+});
+
+goog.require('ol.geom.flat.segments');
diff --git a/test/spec/ol/geom/flat/simplifyflatgeom.test.js b/test/spec/ol/geom/flat/simplifyflatgeom.test.js
new file mode 100644
index 0000000..abc4a12
--- /dev/null
+++ b/test/spec/ol/geom/flat/simplifyflatgeom.test.js
@@ -0,0 +1,358 @@
+goog.provide('ol.test.geom.simplify');
+
+
+describe('ol.geom.flat.simplify', function() {
+
+  var flatCoordinates = [
+    224.55, 250.15, 226.91, 244.19, 233.31, 241.45, 234.98, 236.06,
+    244.21, 232.76, 262.59, 215.31, 267.76, 213.81, 273.57, 201.84,
+    273.12, 192.16, 277.62, 189.03, 280.36, 181.41, 286.51, 177.74,
+    292.41, 159.37, 296.91, 155.64, 314.95, 151.37, 319.75, 145.16,
+    330.33, 137.57, 341.48, 139.96, 369.98, 137.89, 387.39, 142.51,
+    391.28, 139.39, 409.52, 141.14, 414.82, 139.75, 427.72, 127.30,
+    439.60, 119.74, 474.93, 107.87, 486.51, 106.75, 489.20, 109.45,
+    493.79, 108.63, 504.74, 119.66, 512.96, 122.35, 518.63, 120.89,
+    524.09, 126.88, 529.57, 127.86, 534.21, 140.93, 539.27, 147.24,
+    567.69, 148.91, 575.25, 157.26, 580.62, 158.15, 601.53, 156.85,
+    617.74, 159.86, 622.00, 167.04, 629.55, 194.60, 638.90, 195.61,
+    641.26, 200.81, 651.77, 204.56, 671.55, 222.55, 683.68, 217.45,
+    695.25, 219.15, 700.64, 217.98, 703.12, 214.36, 712.26, 215.87,
+    721.49, 212.81, 727.81, 213.36, 729.98, 208.73, 735.32, 208.20,
+    739.94, 204.77, 769.98, 208.42, 779.60, 216.87, 784.20, 218.16,
+    800.24, 214.62, 810.53, 219.73, 817.19, 226.82, 820.77, 236.17,
+    827.23, 236.16, 829.89, 239.89, 851.00, 248.94, 859.88, 255.49,
+    865.21, 268.53, 857.95, 280.30, 865.48, 291.45, 866.81, 298.66,
+    864.68, 302.71, 867.79, 306.17, 859.87, 311.37, 860.08, 314.35,
+    858.29, 314.94, 858.10, 327.60, 854.54, 335.40, 860.92, 343.00,
+    856.43, 350.15, 851.42, 352.96, 849.84, 359.59, 854.56, 365.53,
+    849.74, 370.38, 844.09, 371.89, 844.75, 380.44, 841.52, 383.67,
+    839.57, 390.40, 845.59, 399.05, 848.40, 407.55, 843.71, 411.30,
+    844.09, 419.88, 839.51, 432.76, 841.33, 441.04, 847.62, 449.22,
+    847.16, 458.44, 851.38, 462.79, 853.97, 471.15, 866.36, 480.77
+  ];
+
+  var simplifiedRadiallyFlatCoordinates = [
+    224.55, 250.15, 226.91, 244.19, 233.31, 241.45, 234.98, 236.06,
+    244.21, 232.76, 262.59, 215.31, 267.76, 213.81, 273.57, 201.84,
+    273.12, 192.16, 277.62, 189.03, 280.36, 181.41, 286.51, 177.74,
+    292.41, 159.37, 296.91, 155.64, 314.95, 151.37, 319.75, 145.16,
+    330.33, 137.57, 341.48, 139.96, 369.98, 137.89, 387.39, 142.51,
+    409.52, 141.14, 414.82, 139.75, 427.72, 127.30, 439.60, 119.74,
+    474.93, 107.87, 486.51, 106.75, 493.79, 108.63, 504.74, 119.66,
+    512.96, 122.35, 518.63, 120.89, 524.09, 126.88, 529.57, 127.86,
+    534.21, 140.93, 539.27, 147.24, 567.69, 148.91, 575.25, 157.26,
+    580.62, 158.15, 601.53, 156.85, 617.74, 159.86, 622.00, 167.04,
+    629.55, 194.60, 638.90, 195.61, 641.26, 200.81, 651.77, 204.56,
+    671.55, 222.55, 683.68, 217.45, 695.25, 219.15, 700.64, 217.98,
+    712.26, 215.87, 721.49, 212.81, 727.81, 213.36, 729.98, 208.73,
+    735.32, 208.20, 739.94, 204.77, 769.98, 208.42, 779.60, 216.87,
+    800.24, 214.62, 810.53, 219.73, 817.19, 226.82, 820.77, 236.17,
+    827.23, 236.16, 851.00, 248.94, 859.88, 255.49, 865.21, 268.53,
+    857.95, 280.30, 865.48, 291.45, 866.81, 298.66, 867.79, 306.17,
+    859.87, 311.37, 858.10, 327.60, 854.54, 335.40, 860.92, 343.00,
+    856.43, 350.15, 851.42, 352.96, 849.84, 359.59, 854.56, 365.53,
+    849.74, 370.38, 844.09, 371.89, 844.75, 380.44, 839.57, 390.40,
+    845.59, 399.05, 848.40, 407.55, 843.71, 411.30, 844.09, 419.88,
+    839.51, 432.76, 841.33, 441.04, 847.62, 449.22, 847.16, 458.44,
+    851.38, 462.79, 853.97, 471.15, 866.36, 480.77
+  ];
+
+  var simplifiedFlatCoordinates = [
+    224.55, 250.15, 267.76, 213.81, 296.91, 155.64, 330.33, 137.57,
+    409.52, 141.14, 439.60, 119.74, 486.51, 106.75, 529.57, 127.86,
+    539.27, 147.24, 617.74, 159.86, 629.55, 194.60, 671.55, 222.55,
+    727.81, 213.36, 739.94, 204.77, 769.98, 208.42, 779.60, 216.87,
+    800.24, 214.62, 820.77, 236.17, 859.88, 255.49, 865.21, 268.53,
+    857.95, 280.30, 867.79, 306.17, 859.87, 311.37, 854.54, 335.40,
+    860.92, 343.00, 849.84, 359.59, 854.56, 365.53, 844.09, 371.89,
+    839.57, 390.40, 848.40, 407.55, 839.51, 432.76, 853.97, 471.15,
+    866.36, 480.77
+  ];
+
+  var simplifiedHighQualityFlatCoordinates = [
+    224.55, 250.15, 267.76, 213.81, 296.91, 155.64, 330.33, 137.57,
+    409.52, 141.14, 439.60, 119.74, 486.51, 106.75, 529.57, 127.86,
+    539.27, 147.24, 617.74, 159.86, 629.55, 194.60, 671.55, 222.55,
+    727.81, 213.36, 739.94, 204.77, 769.98, 208.42, 784.20, 218.16,
+    800.24, 214.62, 820.77, 236.17, 859.88, 255.49, 865.21, 268.53,
+    857.95, 280.30, 867.79, 306.17, 858.29, 314.94, 854.54, 335.40,
+    860.92, 343.00, 849.84, 359.59, 854.56, 365.53, 844.09, 371.89,
+    839.57, 390.40, 848.40, 407.55, 839.51, 432.76, 853.97, 471.15,
+    866.36, 480.77
+  ];
+
+  describe('ol.geom.flat.simplify.lineString', function() {
+
+    it('works with empty line strings', function() {
+      expect(ol.geom.flat.simplify.lineString([], 0, 0, 2, 1, true)).to.
+          eql([]);
+      expect(ol.geom.flat.simplify.lineString([], 0, 0, 2, 1, false)).to.
+          eql([]);
+    });
+
+    it('works with a line string with a single point', function() {
+      expect(ol.geom.flat.simplify.lineString([1, 2], 0, 2, 2, 1, true)).to.
+          eql([1, 2]);
+      expect(ol.geom.flat.simplify.lineString([1, 2], 0, 2, 2, 1, false)).to.
+          eql([1, 2]);
+    });
+
+    it('returns the expected result with low quality', function() {
+      var result = ol.geom.flat.simplify.lineString(
+          flatCoordinates, 0, flatCoordinates.length, 2, 25, false);
+      expect(result.length).to.be(simplifiedFlatCoordinates.length);
+      expect(result).to.eql(simplifiedFlatCoordinates);
+    });
+
+    it('returns the expected result with high quality', function() {
+      var result = ol.geom.flat.simplify.lineString(
+          flatCoordinates, 0, flatCoordinates.length, 2, 25, true);
+      expect(result.length).to.be(simplifiedHighQualityFlatCoordinates.length);
+      expect(result).to.eql(simplifiedHighQualityFlatCoordinates);
+    });
+
+  });
+
+  describe('ol.geom.flat.simplify.radialDistance', function() {
+
+    var dest;
+    beforeEach(function() {
+      dest = [];
+    });
+
+    it('works with empty line strings', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [], 0, 0, 2, 1, dest, 0)).to.be(0);
+      expect(dest).to.eql([]);
+    });
+
+    it('works with a line string with a single point', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [1, 2], 0, 2, 2, 1, dest, 0)).to.be(2);
+      expect(dest).to.eql([1, 2]);
+    });
+
+    it('works with a line string with two points', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [1, 2, 3, 4], 0, 4, 2, 1, dest, 0)).to.be(4);
+      expect(dest).to.eql([1, 2, 3, 4]);
+    });
+
+    it('works when the points are widely spaced', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 0.5, dest, 0)).to.be(8);
+      expect(dest).to.eql([0, 0, 1, 0, 2, 0, 3, 0]);
+    });
+
+    it('works when the spacing matches the tolerance', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 1, dest, 0)).to.be(6);
+      expect(dest).to.eql([0, 0, 2, 0, 3, 0]);
+    });
+
+    it('works when the points are closely spaced', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 1.5, dest, 0)).to.be(6);
+      expect(dest).to.eql([0, 0, 2, 0, 3, 0]);
+    });
+
+    it('works when the line oscillates with widely spaced points', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], 0, 12, 2, 1, dest, 0)).
+          to.be(12);
+      expect(dest).to.eql([0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1]);
+    });
+
+    it('works when the line oscillates with closely spaced points', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], 0, 12, 2, 2, dest, 0)).to.be(4);
+      expect(dest).to.eql([0, 0, 1, 1]);
+    });
+
+    it('works when the line oscillates within the tolerance', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0], 0, 14, 2, 2, dest, 0)).
+          to.be(2);
+      expect(dest).to.eql([0, 0]);
+    });
+
+    it('works with real data', function() {
+      expect(ol.geom.flat.simplify.radialDistance(
+          flatCoordinates, 0, flatCoordinates.length, 2, 25, dest, 0)).
+          to.be(simplifiedRadiallyFlatCoordinates.length);
+      expect(dest).to.eql(simplifiedRadiallyFlatCoordinates);
+    });
+
+  });
+
+  describe('ol.geom.flat.simplify.douglasPeucker', function() {
+
+    var dest;
+    beforeEach(function() {
+      dest = [];
+    });
+
+    it('works with empty line strings', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [], 0, 0, 2, 1, dest, 0)).to.be(0);
+      expect(dest).to.eql([]);
+    });
+
+    it('works with a line string with a single point', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [1, 2], 0, 2, 2, 1, dest, 0)).to.be(2);
+      expect(dest).to.eql([1, 2]);
+    });
+
+    it('works with a line string with two points', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [1, 2, 3, 4], 0, 4, 2, 1, dest, 0)).to.be(4);
+      expect(dest).to.eql([1, 2, 3, 4]);
+    });
+
+    it('works when the points are widely spaced', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 0.5, dest, 0)).to.be(4);
+      expect(dest).to.eql([0, 0, 3, 0]);
+    });
+
+    it('works when the spacing matches the tolerance', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 1, dest, 0)).to.be(4);
+      expect(dest).to.eql([0, 0, 3, 0]);
+    });
+
+    it('works when the points are closely spaced', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 0, 2, 0, 3, 0], 0, 8, 2, 1.5, dest, 0)).to.be(4);
+      expect(dest).to.eql([0, 0, 3, 0]);
+    });
+
+    it('does not elimnate points outside the tolerance', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 1, 2, 0], 0, 6, 2, 0.5, dest, 0)).to.be(6);
+      expect(dest).to.eql([0, 0, 1, 1, 2, 0]);
+    });
+
+    it('does eliminate points within the tolerance', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 1, 2, 0], 0, 6, 2, 2, dest, 0)).to.be(4);
+      expect(dest).to.eql([0, 0, 2, 0]);
+    });
+
+    it('does not eliminate multiple points outside the tolerance', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 1, 1, -1, 2, 0], 0, 8, 2, 0.5, dest, 0)).to.be(8);
+      expect(dest).to.eql([0, 0, 1, 1, 1, -1, 2, 0]);
+    });
+
+    it('does eliminate multiple points within the tolerance', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 1, 1, -1, 2, 0], 0, 8, 2, 2, dest, 0)).to.be(4);
+      expect(dest).to.eql([0, 0, 2, 0]);
+    });
+
+    it('works when the line oscillates with widely spaced points', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], 0, 12, 2, 1, dest, 0)).to.be(4);
+      expect(dest).to.eql([0, 0, 1, 1]);
+    });
+
+    it('works when the line oscillates with closely spaced points', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], 0, 12, 2, 2, dest, 0)).
+          to.be(4);
+      expect(dest).to.eql([0, 0, 1, 1]);
+    });
+
+    it('works when the line oscillates within the tolerance', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0], 0, 14, 2, 2, dest, 0)).
+          to.be(4);
+      expect(dest).to.eql([0, 0, 0, 0]);
+    });
+
+    it('works on small triangles', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          [3, 0, 4, 1, 5, 2, 5, 0], 0, 8, 2, 1, dest, 0)).to.be(6);
+      expect(dest).to.eql([3, 0, 5, 2, 5, 0]);
+    });
+
+    it('is the same as high quality simplification', function() {
+      expect(ol.geom.flat.simplify.douglasPeucker(
+          flatCoordinates, 0, flatCoordinates.length, 2, 25, dest, 0)).
+          to.be(simplifiedHighQualityFlatCoordinates.length);
+      expect(dest).to.eql(simplifiedHighQualityFlatCoordinates);
+    });
+
+  });
+
+  describe('ol.geom.flat.simplify.quantize', function() {
+
+    it('handles empty coordinates', function() {
+      var simplifiedFlatCoordinates = [];
+      expect(ol.geom.flat.simplify.quantize(
+          [], 0, 0, 2, 2, simplifiedFlatCoordinates, 0)).to.be(0);
+      expect(simplifiedFlatCoordinates).to.be.empty();
+    });
+
+    it('expands points to a zero-length line', function() {
+      var simplifiedFlatCoordinates = [];
+      expect(ol.geom.flat.simplify.quantize(
+          [0, 0, 0, 0], 0, 4, 2, 2, simplifiedFlatCoordinates, 0)).to.be(4);
+      expect(simplifiedFlatCoordinates).to.eql([0, 0, 0, 0]);
+    });
+
+    it('snaps near-by points to the same value', function() {
+      var simplifiedFlatCoordinates = [];
+      expect(ol.geom.flat.simplify.quantize(
+          [0.1, 0, 0, 0.1], 0, 4, 2, 2, simplifiedFlatCoordinates, 0)).to.be(4);
+      expect(simplifiedFlatCoordinates).to.eql([0, 0, 0, 0]);
+    });
+
+    it('eliminates duplicate snapped points', function() {
+      var simplifiedFlatCoordinates = [];
+      expect(ol.geom.flat.simplify.quantize(
+          [0.1, 0, 2, 0, 2.1, 0, 2, 0.1, 1.9, 0, 2, -0.1], 0, 12, 2, 2,
+          simplifiedFlatCoordinates, 0)).to.be(4);
+      expect(simplifiedFlatCoordinates).to.eql([0, 0, 2, 0]);
+    });
+
+    it('eliminates horizontal colinear points', function() {
+      var simplifiedFlatCoordinates = [];
+      expect(ol.geom.flat.simplify.quantize(
+          [0, 0, 2, 0, 4, 0, 6, 0], 0, 8, 2, 2,
+          simplifiedFlatCoordinates, 0)).to.be(4);
+      expect(simplifiedFlatCoordinates).to.eql([0, 0, 6, 0]);
+    });
+
+    it('eliminates vertical colinear points', function() {
+      var simplifiedFlatCoordinates = [];
+      expect(ol.geom.flat.simplify.quantize(
+          [0, 0, 0, -2, 0, -4, 0, -6], 0, 8, 2, 2,
+          simplifiedFlatCoordinates, 0)).to.be(4);
+      expect(simplifiedFlatCoordinates).to.eql([0, 0, 0, -6]);
+    });
+
+    it('eliminates diagonal colinear points', function() {
+      var simplifiedFlatCoordinates = [];
+      expect(ol.geom.flat.simplify.quantize(
+          [0, 0, 2, -2, 4, -4, 6, -6], 0, 8, 2, 2,
+          simplifiedFlatCoordinates, 0)).to.be(4);
+      expect(simplifiedFlatCoordinates).to.eql([0, 0, 6, -6]);
+    });
+
+    it('handles switchbacks', function() {
+      var simplifiedFlatCoordinates = [];
+      expect(ol.geom.flat.simplify.quantize(
+          [0, 0, 2, 0, 0, 0, 4, 0], 0, 8, 2, 2,
+          simplifiedFlatCoordinates, 0)).to.be(8);
+      expect(simplifiedFlatCoordinates).to.eql([0, 0, 2, 0, 0, 0, 4, 0]);
+    });
+
+  });
+
+});
+
+
+goog.require('ol.geom.flat.simplify');
diff --git a/test/spec/ol/geom/flat/transformflatgeom.test.js b/test/spec/ol/geom/flat/transformflatgeom.test.js
new file mode 100644
index 0000000..c661116
--- /dev/null
+++ b/test/spec/ol/geom/flat/transformflatgeom.test.js
@@ -0,0 +1,85 @@
+goog.provide('ol.test.geom.flat.transform');
+
+describe('ol.geom.flat.transform', function() {
+
+  describe('ol.geom.flat.transform.transform2D', function() {
+
+    it('transforms a Simple Geometry to 2D', function() {
+
+      var multiPolygonGeometry = new ol.geom.MultiPolygon([
+        [[[-80.736061, 28.788576000000006, 0],
+          [-80.763557, 28.821799999999996, 0],
+          [-80.817406, 28.895123999999996, 0],
+          [-80.891304, 29.013130000000004, 0],
+          [-80.916512, 29.071560000000005, 0],
+          [-80.899323, 29.061249000000004, 0],
+          [-80.862663, 28.991361999999995, 0],
+          [-80.736061, 28.788576000000006, 0]]], [[
+          [-82.102127, 26.585724, 0],
+          [-82.067139, 26.497208, 0],
+          [-82.097641, 26.493585999999993, 0],
+          [-82.135895, 26.642279000000002, 0],
+          [-82.183495, 26.683082999999996, 0],
+          [-82.128838, 26.693342, 0],
+          [-82.102127, 26.585724, 0]]]
+      ]).transform('EPSG:4326', 'EPSG:3857');
+      var transform = [0.0004088332670837288, 0, 0, 0, 0,
+        -0.0004088332670837288, 0, 0, 0, 0, 1, 0, 4480.991370439071,
+        1529.5752568707105, 0, 1];
+      var pixelCoordinates = ol.geom.transformSimpleGeometry2D(
+          multiPolygonGeometry, transform, []);
+      expect(pixelCoordinates[0]).to.roughlyEqual(806.6035275946265, 1e-9);
+      expect(pixelCoordinates[1]).to.roughlyEqual(160.48916296287916, 1e-9);
+      expect(pixelCoordinates[2]).to.roughlyEqual(805.3521540835154, 1e-9);
+      expect(pixelCoordinates[3]).to.roughlyEqual(158.76358389011807, 1e-9);
+      expect(pixelCoordinates[4]).to.roughlyEqual(802.9014262612932, 1e-9);
+      expect(pixelCoordinates[5]).to.roughlyEqual(154.95335187132082, 1e-9);
+      expect(pixelCoordinates[6]).to.roughlyEqual(799.5382461724039, 1e-9);
+      expect(pixelCoordinates[7]).to.roughlyEqual(148.815592819916, 1e-9);
+      expect(pixelCoordinates[8]).to.roughlyEqual(798.3910020835165, 1e-9);
+      expect(pixelCoordinates[9]).to.roughlyEqual(145.77392230456553, 1e-9);
+      expect(pixelCoordinates[10]).to.roughlyEqual(799.1732925724045, 1e-9);
+      expect(pixelCoordinates[11]).to.roughlyEqual(146.31080369865776, 1e-9);
+      expect(pixelCoordinates[12]).to.roughlyEqual(800.8417299057378, 1e-9);
+      expect(pixelCoordinates[13]).to.roughlyEqual(149.94832216046188, 1e-9);
+      expect(pixelCoordinates[14]).to.roughlyEqual(806.6035275946265, 1e-9);
+      expect(pixelCoordinates[15]).to.roughlyEqual(160.48916296287916, 1e-9);
+      expect(pixelCoordinates[16]).to.roughlyEqual(744.4323460835158, 1e-9);
+      expect(pixelCoordinates[17]).to.roughlyEqual(273.7179168205373, 1e-9);
+      expect(pixelCoordinates[18]).to.roughlyEqual(746.0246888390716, 1e-9);
+      expect(pixelCoordinates[19]).to.roughlyEqual(278.22094795365365, 1e-9);
+      expect(pixelCoordinates[20]).to.roughlyEqual(744.6365089279602, 1e-9);
+      expect(pixelCoordinates[21]).to.roughlyEqual(278.40513424671826, 1e-9);
+      expect(pixelCoordinates[22]).to.roughlyEqual(742.8955268835157, 1e-9);
+      expect(pixelCoordinates[23]).to.roughlyEqual(270.83899948444764, 1e-9);
+      expect(pixelCoordinates[24]).to.roughlyEqual(740.7291979946272, 1e-9);
+      expect(pixelCoordinates[25]).to.roughlyEqual(268.76099731369345, 1e-9);
+      expect(pixelCoordinates[26]).to.roughlyEqual(743.2166987946266, 1e-9);
+      expect(pixelCoordinates[27]).to.roughlyEqual(268.23842607400616, 1e-9);
+      expect(pixelCoordinates[28]).to.roughlyEqual(744.4323460835158, 1e-9);
+      expect(pixelCoordinates[29]).to.roughlyEqual(273.7179168205373, 1e-9);
+    });
+
+  });
+
+  describe('ol.geom.flat.transform.translate', function() {
+    it('translates the coordinates array', function() {
+      var multiPolygon = new ol.geom.MultiPolygon([
+        [[[0, 0, 2], [0, 1, 2], [1, 1, 2], [1, 0, 2], [0, 0, 2]]],
+        [[[2, 2, 3], [2, 3, 3], [3, 3, 3], [3, 2, 3], [2, 2, 3]]]]);
+      var flatCoordinates = multiPolygon.getFlatCoordinates();
+      var deltaX = 1;
+      var deltaY = 2;
+      ol.geom.flat.transform.translate(flatCoordinates, 0,
+          flatCoordinates.length, multiPolygon.getStride(),
+          deltaX, deltaY, flatCoordinates);
+      expect(flatCoordinates).to.eql([
+        1, 2, 2, 1, 3, 2, 2, 3, 2, 2, 2, 2, 1, 2, 2,
+        3, 4, 3, 3, 5, 3, 4, 5, 3, 4, 4, 3, 3, 4, 3]);
+    });
+  });
+
+});
+
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.flat.transform');
diff --git a/test/spec/ol/geom/geometrycollection.test.js b/test/spec/ol/geom/geometrycollection.test.js
new file mode 100644
index 0000000..9cefbf9
--- /dev/null
+++ b/test/spec/ol/geom/geometrycollection.test.js
@@ -0,0 +1,178 @@
+goog.provide('ol.test.geom.GeometryCollection');
+
+
+describe('ol.geom.GeometryCollection', function() {
+
+  var outer = [[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]],
+      inner1 = [[1, 1], [2, 1], [2, 2], [1, 2], [1, 1]],
+      inner2 = [[8, 8], [9, 8], [9, 9], [8, 9], [8, 8]];
+
+  describe('constructor', function() {
+
+    var line, multi, point, poly;
+    beforeEach(function() {
+      point = new ol.geom.Point([10, 20]);
+      line = new ol.geom.LineString([[10, 20], [30, 40]]);
+      poly = new ol.geom.Polygon([outer, inner1, inner2]);
+      multi = new ol.geom.GeometryCollection([point, line, poly]);
+    });
+
+    it('creates a geometry collection from an array of geometries', function() {
+      expect(multi).to.be.a(ol.geom.GeometryCollection);
+      expect(multi).to.be.a(ol.geom.Geometry);
+    });
+
+    it('fires a change event when one of its component changes',
+        function(done) {
+          multi.on('change', function() {
+            done();
+          });
+          point.setCoordinates([10, 10]);
+        }
+    );
+
+    it('deregister old components', function() {
+      multi.setGeometries([poly]);
+      multi.on('change', function() {
+        expect().fail();
+      });
+      point.setCoordinates([10, 10]);
+    });
+
+    it('register new components', function(done) {
+      var point2 = new ol.geom.Point([10, 20]);
+      multi.setGeometriesArray([point2]);
+      multi.on('change', function() {
+        done();
+      });
+      point2.setCoordinates([10, 10]);
+    });
+
+  });
+
+  describe('#getGeometries', function() {
+
+    it('returns a collection of geometries', function() {
+      var point = new ol.geom.Point([10, 20]);
+      var line = new ol.geom.LineString([[10, 20], [30, 40]]);
+      var poly = new ol.geom.Polygon([outer, inner1, inner2]);
+      var multi = new ol.geom.GeometryCollection([point, line, poly]);
+
+      var geometries = multi.getGeometries();
+      expect(geometries).to.be.an(Array);
+      expect(geometries).to.have.length(3);
+      expect(geometries[0]).to.be.a(ol.geom.Point);
+      expect(geometries[1]).to.be.a(ol.geom.LineString);
+      expect(geometries[2]).to.be.a(ol.geom.Polygon);
+    });
+
+  });
+
+  describe('#clone()', function() {
+
+    it('has a working clone method', function() {
+      var point = new ol.geom.Point([10, 20]);
+      var line = new ol.geom.LineString([[10, 20], [30, 40]]);
+      var poly = new ol.geom.Polygon([outer, inner1, inner2]);
+      var multi = new ol.geom.GeometryCollection([point, line, poly]);
+      var clone = multi.clone();
+      expect(clone).to.not.be(multi);
+      var geometries = clone.getGeometries();
+      expect(geometries[0].getCoordinates()).to.eql([10, 20]);
+      expect(geometries[1].getCoordinates()).to.eql([[10, 20], [30, 40]]);
+      expect(geometries[2].getCoordinates()).to.eql([outer, inner1, inner2]);
+    });
+
+    it('does a deep clone', function() {
+      var point = new ol.geom.Point([30, 40]);
+      var originalGeometries = [point];
+      var multi = new ol.geom.GeometryCollection(originalGeometries);
+      var clone = multi.clone();
+      var clonedGeometries = clone.getGeometries();
+      expect(clonedGeometries).not.to.be(originalGeometries);
+      expect(clonedGeometries).to.have.length(originalGeometries.length);
+      expect(clonedGeometries).to.have.length(1);
+      expect(clonedGeometries[0]).not.to.be(originalGeometries[0]);
+      expect(clonedGeometries[0].getCoordinates()).
+          to.eql(originalGeometries[0].getCoordinates());
+    });
+
+  });
+
+  describe('#getExtent()', function() {
+
+    it('returns the bounding extent', function() {
+      var point = new ol.geom.Point([10, 2]);
+      var line = new ol.geom.LineString([[1, 20], [30, 40]]);
+      var multi = new ol.geom.GeometryCollection([point, line]);
+      var extent = multi.getExtent();
+      expect(extent[0]).to.be(1);
+      expect(extent[2]).to.be(30);
+      expect(extent[1]).to.be(2);
+      expect(extent[3]).to.be(40);
+    });
+
+  });
+
+  describe('#setGeometries', function() {
+
+    var line, multi, point, poly;
+    beforeEach(function() {
+      point = new ol.geom.Point([10, 20]);
+      line = new ol.geom.LineString([[10, 20], [30, 40]]);
+      poly = new ol.geom.Polygon([outer, inner1, inner2]);
+      multi = new ol.geom.GeometryCollection([point, line, poly]);
+    });
+
+    it('fires a change event', function() {
+      var listener = sinon.spy();
+      multi.on('change', listener);
+      multi.setGeometries([point, line, poly]);
+      expect(listener.calledOnce).to.be(true);
+    });
+
+    it('updates the extent', function() {
+      expect(multi.getExtent()).to.eql([0, 0, 30, 40]);
+      line.setCoordinates([[10, 20], [300, 400]]);
+      expect(multi.getExtent()).to.eql([0, 0, 300, 400]);
+    });
+
+  });
+
+  describe('#transform()', function() {
+
+    var line, multi, point;
+    beforeEach(function() {
+      point = new ol.geom.Point([10, 20]);
+      line = new ol.geom.LineString([[10, 20], [30, 40]]);
+      multi = new ol.geom.GeometryCollection([point, line]);
+    });
+
+    it('transforms all geometries', function() {
+      multi.transform('EPSG:4326', 'EPSG:3857');
+
+      var geometries = multi.getGeometries();
+      expect(geometries[0]).to.be.a(ol.geom.Point);
+      expect(geometries[1]).to.be.a(ol.geom.LineString);
+
+      var coords = geometries[0].getCoordinates();
+      expect(coords[0]).to.roughlyEqual(1113194.90, 1e-2);
+      expect(coords[1]).to.roughlyEqual(2273030.92, 1e-2);
+
+      coords = geometries[1].getCoordinates();
+      expect(coords[0][0]).to.roughlyEqual(1113194.90, 1e-2);
+      expect(coords[0][1]).to.roughlyEqual(2273030.92, 1e-2);
+      expect(coords[1][0]).to.roughlyEqual(3339584.72, 1e-2);
+      expect(coords[1][1]).to.roughlyEqual(4865942.27, 1e-2);
+    });
+
+  });
+
+});
+
+
+goog.require('ol.geom.Geometry');
+goog.require('ol.geom.GeometryCollection');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
diff --git a/test/spec/ol/geom/linestring.test.js b/test/spec/ol/geom/linestring.test.js
new file mode 100644
index 0000000..f4546bc
--- /dev/null
+++ b/test/spec/ol/geom/linestring.test.js
@@ -0,0 +1,305 @@
+goog.provide('ol.test.geom.LineString');
+
+
+describe('ol.geom.LineString', function() {
+
+  it('can be constructed with a null geometry', function() {
+    expect(function() {
+      var lineString = new ol.geom.LineString(null);
+      lineString = lineString; // suppress gjslint warning
+    }).not.to.throwException();
+  });
+
+  describe('construct empty', function() {
+
+    var lineString;
+    beforeEach(function() {
+      lineString = new ol.geom.LineString([]);
+    });
+
+    it('defaults to layout XY', function() {
+      expect(lineString.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has empty coordinates', function() {
+      expect(lineString.getCoordinates()).to.be.empty();
+    });
+
+    it('has an empty extent', function() {
+      expect(ol.extent.isEmpty(lineString.getExtent())).to.be(true);
+    });
+
+    it('has empty flat coordinates', function() {
+      expect(lineString.getFlatCoordinates()).to.be.empty();
+    });
+
+    it('has stride the expected stride', function() {
+      expect(lineString.getStride()).to.be(2);
+    });
+
+    it('can append coordinates', function() {
+      lineString.appendCoordinate([1, 2]);
+      expect(lineString.getCoordinates()).to.eql([[1, 2]]);
+      lineString.appendCoordinate([3, 4]);
+      expect(lineString.getCoordinates()).to.eql([[1, 2], [3, 4]]);
+    });
+
+  });
+
+  describe('construct with 2D coordinates', function() {
+
+    var lineString;
+    beforeEach(function() {
+      lineString = new ol.geom.LineString([[1, 2], [3, 4]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(lineString.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(lineString.getCoordinates()).to.eql([[1, 2], [3, 4]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(lineString.getExtent()).to.eql([1, 2, 3, 4]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(lineString.getFlatCoordinates()).to.eql([1, 2, 3, 4]);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(lineString.getStride()).to.be(2);
+    });
+
+  });
+
+  describe('construct with 3D coordinates', function() {
+
+    var lineString;
+    beforeEach(function() {
+      lineString = new ol.geom.LineString([[1, 2, 3], [4, 5, 6]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(lineString.getLayout()).to.be(ol.geom.GeometryLayout.XYZ);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(lineString.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(lineString.getExtent()).to.eql([1, 2, 4, 5]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(lineString.getFlatCoordinates()).to.eql([1, 2, 3, 4, 5, 6]);
+    });
+
+    it('has the expected stride', function() {
+      expect(lineString.getStride()).to.be(3);
+    });
+
+  });
+
+  describe('construct with 3D coordinates and layout XYM', function() {
+
+    var lineString;
+    beforeEach(function() {
+      lineString = new ol.geom.LineString(
+          [[1, 2, 3], [4, 5, 6]], ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected layout', function() {
+      expect(lineString.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(lineString.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(lineString.getExtent()).to.eql([1, 2, 4, 5]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(lineString.getFlatCoordinates()).to.eql([1, 2, 3, 4, 5, 6]);
+    });
+
+    it('has the expected stride', function() {
+      expect(lineString.getStride()).to.be(3);
+    });
+
+  });
+
+  describe('construct with 4D coordinates', function() {
+
+    var lineString;
+    beforeEach(function() {
+      lineString = new ol.geom.LineString([[1, 2, 3, 4], [5, 6, 7, 8]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(lineString.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(lineString.getCoordinates()).to.eql([[1, 2, 3, 4], [5, 6, 7, 8]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(lineString.getExtent()).to.eql([1, 2, 5, 6]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(lineString.getFlatCoordinates()).to.eql([1, 2, 3, 4, 5, 6, 7, 8]);
+    });
+
+    it('has the expected stride', function() {
+      expect(lineString.getStride()).to.be(4);
+    });
+
+  });
+
+  describe('with a simple line string', function() {
+
+    var lineString;
+    beforeEach(function() {
+      lineString = new ol.geom.LineString(
+          [[0, 0], [1.5, 1], [3, 3], [5, 1], [6, 3.5], [7, 5]]);
+    });
+
+    describe('#getFirstCoordinate', function() {
+
+      it('returns the expected result', function() {
+        expect(lineString.getFirstCoordinate()).to.eql([0, 0]);
+      });
+
+    });
+
+    describe('#getFlatMidpoint', function() {
+
+      it('returns the expected result', function() {
+        var midpoint = lineString.getFlatMidpoint();
+        expect(midpoint).to.be.an(Array);
+        expect(midpoint).to.have.length(2);
+        expect(midpoint[0]).to.roughlyEqual(4, 1e-1);
+        expect(midpoint[1]).to.roughlyEqual(2, 1e-1);
+      });
+
+    });
+
+    describe('#getLastCoordinate', function() {
+
+      it('returns the expected result', function() {
+        expect(lineString.getLastCoordinate()).to.eql([7, 5]);
+      });
+
+    });
+
+    describe('#getSimplifiedGeometry', function() {
+
+      it('returns the expectedResult', function() {
+        var simplifiedGeometry = lineString.getSimplifiedGeometry(1);
+        expect(simplifiedGeometry).to.be.an(ol.geom.LineString);
+        expect(simplifiedGeometry.getCoordinates()).to.eql(
+            [[0, 0], [3, 3], [5, 1], [7, 5]]);
+      });
+
+      it('caches by resolution', function() {
+        var simplifiedGeometry1 = lineString.getSimplifiedGeometry(1);
+        var simplifiedGeometry2 = lineString.getSimplifiedGeometry(1);
+        expect(simplifiedGeometry1).to.be(simplifiedGeometry2);
+      });
+
+      it('invalidates the cache when the geometry changes', function() {
+        var simplifiedGeometry1 = lineString.getSimplifiedGeometry(1);
+        lineString.setCoordinates(lineString.getCoordinates());
+        var simplifiedGeometry2 = lineString.getSimplifiedGeometry(1);
+        expect(simplifiedGeometry1).not.to.be(simplifiedGeometry2);
+      });
+
+      it('remembers the minimum squared tolerance', function() {
+        sinon.spy(lineString, 'getSimplifiedGeometryInternal');
+        var simplifiedGeometry1 = lineString.getSimplifiedGeometry(0.05);
+        expect(lineString.getSimplifiedGeometryInternal.callCount).to.be(1);
+        expect(simplifiedGeometry1).to.be(lineString);
+        var simplifiedGeometry2 = lineString.getSimplifiedGeometry(0.01);
+        expect(lineString.getSimplifiedGeometryInternal.callCount).to.be(1);
+        expect(simplifiedGeometry2).to.be(lineString);
+      });
+
+    });
+
+  });
+
+  describe('with a simple XYM coordinates', function() {
+
+    var lineString;
+    beforeEach(function() {
+      lineString = new ol.geom.LineString(
+          [[1, 2, 3], [4, 5, 6]], ol.geom.GeometryLayout.XYM);
+    });
+
+    describe('#getCoordinateAtM', function() {
+
+      it('returns the expected value', function() {
+        expect(lineString.getCoordinateAtM(2, false)).to.be(null);
+        expect(lineString.getCoordinateAtM(2, true)).to.eql([1, 2, 2]);
+        expect(lineString.getCoordinateAtM(3, false)).to.eql([1, 2, 3]);
+        expect(lineString.getCoordinateAtM(3, true)).to.eql([1, 2, 3]);
+        expect(lineString.getCoordinateAtM(4, false)).to.eql([2, 3, 4]);
+        expect(lineString.getCoordinateAtM(4, true)).to.eql([2, 3, 4]);
+        expect(lineString.getCoordinateAtM(5, false)).to.eql([3, 4, 5]);
+        expect(lineString.getCoordinateAtM(5, true)).to.eql([3, 4, 5]);
+        expect(lineString.getCoordinateAtM(6, false)).to.eql([4, 5, 6]);
+        expect(lineString.getCoordinateAtM(6, true)).to.eql([4, 5, 6]);
+        expect(lineString.getCoordinateAtM(7, false)).to.eql(null);
+        expect(lineString.getCoordinateAtM(7, true)).to.eql([4, 5, 7]);
+      });
+
+    });
+
+  });
+
+  describe('with several XYZM coordinates', function() {
+
+    var lineString;
+    beforeEach(function() {
+      lineString = new ol.geom.LineString([
+        [0, 0, 0, 0],
+        [1, -1, 2, 1],
+        [2, -2, 4, 2],
+        [4, -4, 8, 4],
+        [8, -8, 16, 8],
+        [12, -12, 24, 12],
+        [14, -14, 28, 14],
+        [15, -15, 30, 15],
+        [16, -16, 32, 16],
+        [18, -18, 36, 18],
+        [22, -22, 44, 22]
+      ]);
+    });
+
+    describe('#getCoordinateAtM', function() {
+
+      it('returns the expected value', function() {
+        expect(lineString.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+        var m;
+        for (m = 0; m <= 22; m += 0.5) {
+          expect(lineString.getCoordinateAtM(m, true)).to.eql(
+              [m, -m, 2 * m, m]);
+        }
+      });
+
+    });
+
+  });
+
+});
+
+
+goog.require('ol.extent');
+goog.require('ol.geom.LineString');
diff --git a/test/spec/ol/geom/multilinestring.test.js b/test/spec/ol/geom/multilinestring.test.js
new file mode 100644
index 0000000..76d18f9
--- /dev/null
+++ b/test/spec/ol/geom/multilinestring.test.js
@@ -0,0 +1,326 @@
+goog.provide('ol.test.geom.MultiLineString');
+
+
+describe('ol.geom.MultiLineString', function() {
+
+  it('can be constructed with a null geometry', function() {
+    expect(function() {
+      var multiLineString = new ol.geom.MultiLineString(null);
+      multiLineString = multiLineString; // suppress gjslint warning
+    }).not.to.throwException();
+  });
+
+  describe('construct empty', function() {
+
+    var multiLineString;
+    beforeEach(function() {
+      multiLineString = new ol.geom.MultiLineString([]);
+    });
+
+    it('defaults to layout XY', function() {
+      expect(multiLineString.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has empty coordinates', function() {
+      expect(multiLineString.getCoordinates()).to.be.empty();
+    });
+
+    it('has an empty extent', function() {
+      expect(ol.extent.isEmpty(multiLineString.getExtent())).to.be(true);
+    });
+
+    it('has empty flat coordinates', function() {
+      expect(multiLineString.getFlatCoordinates()).to.be.empty();
+    });
+
+    it('has stride the expected stride', function() {
+      expect(multiLineString.getStride()).to.be(2);
+    });
+
+    it('can append line strings', function() {
+      multiLineString.appendLineString(
+          new ol.geom.LineString([[1, 2], [3, 4]]));
+      expect(multiLineString.getCoordinates()).to.eql(
+          [[[1, 2], [3, 4]]]);
+      multiLineString.appendLineString(
+          new ol.geom.LineString([[5, 6], [7, 8]]));
+      expect(multiLineString.getCoordinates()).to.eql(
+          [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]);
+    });
+
+  });
+
+  describe('construct with 2D coordinates', function() {
+
+    var multiLineString;
+    beforeEach(function() {
+      multiLineString = new ol.geom.MultiLineString(
+          [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(multiLineString.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(multiLineString.getCoordinates()).to.eql(
+          [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(multiLineString.getExtent()).to.eql([1, 2, 7, 8]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(multiLineString.getFlatCoordinates()).to.eql(
+          [1, 2, 3, 4, 5, 6, 7, 8]);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(multiLineString.getStride()).to.be(2);
+    });
+
+    describe('#getFlatMidpoints', function() {
+
+      it('returns the expected result', function() {
+        expect(multiLineString.getFlatMidpoints()).to.eql([2, 3, 6, 7]);
+      });
+
+    });
+
+  });
+
+  describe('construct with 3D coordinates', function() {
+
+    var multiLineString;
+    beforeEach(function() {
+      multiLineString = new ol.geom.MultiLineString(
+          [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(multiLineString.getLayout()).to.be(ol.geom.GeometryLayout.XYZ);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(multiLineString.getCoordinates()).to.eql(
+          [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(multiLineString.getExtent()).to.eql([1, 2, 10, 11]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(multiLineString.getFlatCoordinates()).to.eql(
+          [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(multiLineString.getStride()).to.be(3);
+    });
+
+  });
+
+  describe('construct with 3D coordinates and layout XYM', function() {
+
+    var multiLineString;
+    beforeEach(function() {
+      multiLineString = new ol.geom.MultiLineString(
+          [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]],
+          ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected layout', function() {
+      expect(multiLineString.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(multiLineString.getCoordinates()).to.eql(
+          [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(multiLineString.getExtent()).to.eql([1, 2, 10, 11]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(multiLineString.getFlatCoordinates()).to.eql(
+          [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(multiLineString.getStride()).to.be(3);
+    });
+
+    it('can return individual line strings', function() {
+      var lineString0 = multiLineString.getLineString(0);
+      expect(lineString0).to.be.an(ol.geom.LineString);
+      expect(lineString0.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+      expect(lineString0.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
+      var lineString1 = multiLineString.getLineString(1);
+      expect(lineString1).to.be.an(ol.geom.LineString);
+      expect(lineString1.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+      expect(lineString1.getCoordinates()).to.eql([[7, 8, 9], [10, 11, 12]]);
+    });
+
+    describe('#getCoordinateAtM', function() {
+
+      describe('with extrapolation and interpolation', function() {
+
+        it('returns the expected value', function() {
+          expect(multiLineString.getCoordinateAtM(0, true, true)).to.eql(
+              [1, 2, 0]);
+          expect(multiLineString.getCoordinateAtM(3, true, true)).to.eql(
+              [1, 2, 3]);
+          expect(multiLineString.getCoordinateAtM(4.5, true, true)).to.eql(
+              [2.5, 3.5, 4.5]);
+          expect(multiLineString.getCoordinateAtM(6, true, true)).to.eql(
+              [4, 5, 6]);
+          expect(multiLineString.getCoordinateAtM(7.5, true, true)).to.eql(
+              [5.5, 6.5, 7.5]);
+          expect(multiLineString.getCoordinateAtM(9, true, true)).to.eql(
+              [7, 8, 9]);
+          expect(multiLineString.getCoordinateAtM(10.5, true, true)).to.eql(
+              [8.5, 9.5, 10.5]);
+          expect(multiLineString.getCoordinateAtM(12, true, true)).to.eql(
+              [10, 11, 12]);
+          expect(multiLineString.getCoordinateAtM(15, true, true)).to.eql(
+              [10, 11, 15]);
+        });
+
+      });
+
+      describe('with extrapolation and no interpolation', function() {
+
+        it('returns the expected value', function() {
+          expect(multiLineString.getCoordinateAtM(0, true, false)).to.eql(
+              [1, 2, 0]);
+          expect(multiLineString.getCoordinateAtM(3, true, false)).to.eql(
+              [1, 2, 3]);
+          expect(multiLineString.getCoordinateAtM(4.5, true, false)).to.eql(
+              [2.5, 3.5, 4.5]);
+          expect(multiLineString.getCoordinateAtM(6, true, false)).to.eql(
+              [4, 5, 6]);
+          expect(multiLineString.getCoordinateAtM(7.5, true, false)).to.be(
+              null);
+          expect(multiLineString.getCoordinateAtM(9, true, false)).to.eql(
+              [7, 8, 9]);
+          expect(multiLineString.getCoordinateAtM(10.5, true, false)).to.eql(
+              [8.5, 9.5, 10.5]);
+          expect(multiLineString.getCoordinateAtM(12, true, false)).to.eql(
+              [10, 11, 12]);
+          expect(multiLineString.getCoordinateAtM(15, true, false)).to.eql(
+              [10, 11, 15]);
+        });
+
+      });
+
+      describe('with no extrapolation and interpolation', function() {
+
+        it('returns the expected value', function() {
+          expect(multiLineString.getCoordinateAtM(0, false, true)).to.eql(
+              null);
+          expect(multiLineString.getCoordinateAtM(3, false, true)).to.eql(
+              [1, 2, 3]);
+          expect(multiLineString.getCoordinateAtM(4.5, false, true)).to.eql(
+              [2.5, 3.5, 4.5]);
+          expect(multiLineString.getCoordinateAtM(6, false, true)).to.eql(
+              [4, 5, 6]);
+          expect(multiLineString.getCoordinateAtM(7.5, false, true)).to.eql(
+              [5.5, 6.5, 7.5]);
+          expect(multiLineString.getCoordinateAtM(9, false, true)).to.eql(
+              [7, 8, 9]);
+          expect(multiLineString.getCoordinateAtM(10.5, false, true)).to.eql(
+              [8.5, 9.5, 10.5]);
+          expect(multiLineString.getCoordinateAtM(12, false, true)).to.eql(
+              [10, 11, 12]);
+          expect(multiLineString.getCoordinateAtM(15, false, true)).to.eql(
+              null);
+        });
+
+      });
+
+      describe('with no extrapolation or interpolation', function() {
+
+        it('returns the expected value', function() {
+          expect(multiLineString.getCoordinateAtM(0, false, false)).to.eql(
+              null);
+          expect(multiLineString.getCoordinateAtM(3, false, false)).to.eql(
+              [1, 2, 3]);
+          expect(multiLineString.getCoordinateAtM(4.5, false, false)).to.eql(
+              [2.5, 3.5, 4.5]);
+          expect(multiLineString.getCoordinateAtM(6, false, false)).to.eql(
+              [4, 5, 6]);
+          expect(multiLineString.getCoordinateAtM(7.5, false, false)).to.eql(
+              null);
+          expect(multiLineString.getCoordinateAtM(9, false, false)).to.eql(
+              [7, 8, 9]);
+          expect(multiLineString.getCoordinateAtM(10.5, false, false)).to.eql(
+              [8.5, 9.5, 10.5]);
+          expect(multiLineString.getCoordinateAtM(12, false, false)).to.eql(
+              [10, 11, 12]);
+          expect(multiLineString.getCoordinateAtM(15, false, false)).to.eql(
+              null);
+        });
+
+      });
+
+    });
+
+  });
+
+  describe('construct with 4D coordinates', function() {
+
+    var multiLineString;
+    beforeEach(function() {
+      multiLineString = new ol.geom.MultiLineString(
+          [[[1, 2, 3, 4], [5, 6, 7, 8]], [[9, 10, 11, 12], [13, 14, 15, 16]]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(multiLineString.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(multiLineString.getCoordinates()).to.eql(
+          [[[1, 2, 3, 4], [5, 6, 7, 8]], [[9, 10, 11, 12], [13, 14, 15, 16]]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(multiLineString.getExtent()).to.eql([1, 2, 13, 14]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(multiLineString.getFlatCoordinates()).to.eql(
+          [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(multiLineString.getStride()).to.be(4);
+    });
+
+  });
+
+  describe('#setLineStrings', function() {
+
+    it('sets the line strings', function() {
+      var multiLineString = new ol.geom.MultiLineString(null);
+      var lineString1 = new ol.geom.LineString([[1, 2], [3, 4]]);
+      var lineString2 = new ol.geom.LineString([[5, 6], [7, 8]]);
+      multiLineString.setLineStrings([lineString1, lineString2]);
+      expect(multiLineString.getFlatCoordinates()).to.eql(
+          [1, 2, 3, 4, 5, 6, 7, 8]);
+      expect(multiLineString.getEnds()).to.eql([4, 8]);
+      var coordinates = multiLineString.getCoordinates();
+      expect(coordinates[0]).to.eql(lineString1.getCoordinates());
+      expect(coordinates[1]).to.eql(lineString2.getCoordinates());
+    });
+  });
+
+});
+
+
+goog.require('ol.extent');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
diff --git a/test/spec/ol/geom/multipoint.test.js b/test/spec/ol/geom/multipoint.test.js
new file mode 100644
index 0000000..a6b3a47
--- /dev/null
+++ b/test/spec/ol/geom/multipoint.test.js
@@ -0,0 +1,257 @@
+goog.provide('ol.test.geom.MultiPoint');
+
+
+describe('ol.geom.MultiPoint', function() {
+
+  it('can be constructed with a null geometry', function() {
+    expect(function() {
+      var multiPoint = new ol.geom.MultiPoint(null);
+      multiPoint = multiPoint; // suppress gjslint warning
+    }).not.to.throwException();
+  });
+
+  describe('construct empty', function() {
+
+    var multiPoint;
+    beforeEach(function() {
+      multiPoint = new ol.geom.MultiPoint([]);
+    });
+
+    it('defaults to layout XY', function() {
+      expect(multiPoint.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has empty coordinates', function() {
+      expect(multiPoint.getCoordinates()).to.be.empty();
+    });
+
+    it('has an empty extent', function() {
+      expect(ol.extent.isEmpty(multiPoint.getExtent())).to.be(true);
+    });
+
+    it('has empty flat coordinates', function() {
+      expect(multiPoint.getFlatCoordinates()).to.be.empty();
+    });
+
+    it('has stride the expected stride', function() {
+      expect(multiPoint.getStride()).to.be(2);
+    });
+
+    it('can append points', function() {
+      multiPoint.appendPoint(new ol.geom.Point([1, 2]));
+      expect(multiPoint.getCoordinates()).to.eql([[1, 2]]);
+      multiPoint.appendPoint(new ol.geom.Point([3, 4]));
+      expect(multiPoint.getCoordinates()).to.eql([[1, 2], [3, 4]]);
+    });
+
+  });
+
+  describe('construct with 2D coordinates', function() {
+
+    var multiPoint;
+    beforeEach(function() {
+      multiPoint = new ol.geom.MultiPoint([[1, 2], [3, 4]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(multiPoint.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(multiPoint.getCoordinates()).to.eql([[1, 2], [3, 4]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(multiPoint.getExtent()).to.eql([1, 2, 3, 4]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(multiPoint.getFlatCoordinates()).to.eql([1, 2, 3, 4]);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(multiPoint.getStride()).to.be(2);
+    });
+
+  });
+
+  describe('construct with 3D coordinates', function() {
+
+    var multiPoint;
+    beforeEach(function() {
+      multiPoint = new ol.geom.MultiPoint([[1, 2, 3], [4, 5, 6]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(multiPoint.getLayout()).to.be(ol.geom.GeometryLayout.XYZ);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(multiPoint.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(multiPoint.getExtent()).to.eql([1, 2, 4, 5]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(multiPoint.getFlatCoordinates()).to.eql([1, 2, 3, 4, 5, 6]);
+    });
+
+    it('has the expected stride', function() {
+      expect(multiPoint.getStride()).to.be(3);
+    });
+
+  });
+
+  describe('construct with 3D coordinates and layout XYM', function() {
+
+    var multiPoint;
+    beforeEach(function() {
+      multiPoint = new ol.geom.MultiPoint(
+          [[1, 2, 3], [4, 5, 6]], ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected layout', function() {
+      expect(multiPoint.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(multiPoint.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(multiPoint.getExtent()).to.eql([1, 2, 4, 5]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(multiPoint.getFlatCoordinates()).to.eql([1, 2, 3, 4, 5, 6]);
+    });
+
+    it('has the expected stride', function() {
+      expect(multiPoint.getStride()).to.be(3);
+    });
+
+    it('can return individual points', function() {
+      var point0 = multiPoint.getPoint(0);
+      expect(point0.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+      expect(point0.getCoordinates()).to.eql([1, 2, 3]);
+      var point1 = multiPoint.getPoint(1);
+      expect(point1.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+      expect(point1.getCoordinates()).to.eql([4, 5, 6]);
+    });
+
+    it('can return all points', function() {
+      var points = multiPoint.getPoints();
+      expect(points).to.have.length(2);
+      expect(points[0]).to.be.an(ol.geom.Point);
+      expect(points[0].getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+      expect(points[0].getCoordinates()).to.eql([1, 2, 3]);
+      expect(points[1]).to.be.an(ol.geom.Point);
+      expect(points[1].getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+      expect(points[1].getCoordinates()).to.eql([4, 5, 6]);
+    });
+
+  });
+
+  describe('construct with 4D coordinates', function() {
+
+    var multiPoint;
+    beforeEach(function() {
+      multiPoint = new ol.geom.MultiPoint([[1, 2, 3, 4], [5, 6, 7, 8]]);
+    });
+
+    it('has the expected layout', function() {
+      expect(multiPoint.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(multiPoint.getCoordinates()).to.eql([[1, 2, 3, 4], [5, 6, 7, 8]]);
+    });
+
+    it('has the expected extent', function() {
+      expect(multiPoint.getExtent()).to.eql([1, 2, 5, 6]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(multiPoint.getFlatCoordinates()).to.eql([1, 2, 3, 4, 5, 6, 7, 8]);
+    });
+
+    it('has the expected stride', function() {
+      expect(multiPoint.getStride()).to.be(4);
+    });
+
+    describe('#getClosestPoint', function() {
+
+      it('preserves extra dimensions', function() {
+        var closestPoint = multiPoint.getClosestPoint([6, 6]);
+        expect(closestPoint).to.eql([5, 6, 7, 8]);
+      });
+
+    });
+
+  });
+
+  describe('#applyTransform()', function() {
+
+    var multi, transform;
+    beforeEach(function() {
+      multi = new ol.geom.MultiPoint([[1, 2], [3, 4]]);
+      transform = sinon.spy();
+    });
+
+    it('calls a transform function', function() {
+      multi.applyTransform(transform);
+      expect(transform.calledOnce).to.be(true);
+      var args = transform.firstCall.args;
+      expect(args).to.have.length(3);
+
+      expect(args[0]).to.be(multi.getFlatCoordinates()); // input coords
+      expect(args[1]).to.be(multi.getFlatCoordinates()); // output coords
+      expect(args[2]).to.be(2); // dimension
+    });
+
+    it('allows for modification of coordinates', function() {
+      var mod = function(input, output, dimension) {
+        var copy = input.slice();
+        for (var i = 0, ii = copy.length; i < ii; i += dimension) {
+          output[i] = copy[i + 1];
+          output[i + 1] = copy[i];
+        }
+      };
+      multi.applyTransform(mod);
+      expect(multi.getCoordinates()).to.eql([[2, 1], [4, 3]]);
+    });
+
+    it('returns undefined', function() {
+      var got = multi.applyTransform(transform);
+      expect(got).to.be(undefined);
+    });
+
+  });
+
+  describe('#transform()', function() {
+
+    it('transforms a geometry given CRS identifiers', function() {
+      var multi = new ol.geom.MultiPoint([[-111, 45], [111, -45]]).transform(
+          'EPSG:4326', 'EPSG:3857');
+
+      expect(multi).to.be.a(ol.geom.MultiPoint);
+
+      var coords = multi.getCoordinates();
+
+      expect(coords[0][0]).to.roughlyEqual(-12356463.47, 1e-2);
+      expect(coords[0][1]).to.roughlyEqual(5621521.48, 1e-2);
+
+      expect(coords[1][0]).to.roughlyEqual(12356463.47, 1e-2);
+      expect(coords[1][1]).to.roughlyEqual(-5621521.48, 1e-2);
+    });
+
+  });
+
+});
+
+
+goog.require('ol.extent');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.Point');
diff --git a/test/spec/ol/geom/multipolygon.test.js b/test/spec/ol/geom/multipolygon.test.js
new file mode 100644
index 0000000..e04f599
--- /dev/null
+++ b/test/spec/ol/geom/multipolygon.test.js
@@ -0,0 +1,110 @@
+goog.provide('ol.test.geom.MultiPolygon');
+
+
+describe('ol.geom.MultiPolygon', function() {
+
+  it('can be constructed with a null geometry', function() {
+    expect(function() {
+      var multiPolygon = new ol.geom.MultiPolygon(null);
+      multiPolygon = multiPolygon; // suppress gjslint warning
+    }).not.to.throwException();
+  });
+
+  describe('with a null MultiPolygon', function() {
+
+    var multiPolygon;
+    beforeEach(function() {
+      multiPolygon = new ol.geom.MultiPolygon(null);
+    });
+
+    it('can append polygons', function() {
+      multiPolygon.appendPolygon(
+          new ol.geom.Polygon([[[0, 0], [0, 2], [1, 1], [2, 0]]]));
+      expect(multiPolygon.getCoordinates()).to.eql(
+          [[[[0, 0], [0, 2], [1, 1], [2, 0]]]]);
+      multiPolygon.appendPolygon(
+          new ol.geom.Polygon([[[3, 0], [4, 1], [5, 2], [5, 0]]]));
+      expect(multiPolygon.getCoordinates()).to.eql([
+        [[[0, 0], [0, 2], [1, 1], [2, 0]]],
+        [[[3, 0], [4, 1], [5, 2], [5, 0]]]
+      ]);
+      expect(multiPolygon.getPolygons().length).to.eql(2);
+    });
+
+  });
+
+  describe('with an empty MultiPolygon', function() {
+
+    var multiPolygon;
+    beforeEach(function() {
+      multiPolygon = new ol.geom.MultiPolygon([]);
+    });
+
+    it('can append polygons', function() {
+      multiPolygon.appendPolygon(
+          new ol.geom.Polygon([[[0, 0], [0, 2], [1, 1], [2, 0]]]));
+      expect(multiPolygon.getCoordinates()).to.eql(
+          [[[[0, 0], [0, 2], [1, 1], [2, 0]]]]);
+      multiPolygon.appendPolygon(
+          new ol.geom.Polygon([[[3, 0], [4, 1], [5, 2], [5, 0]]]));
+      expect(multiPolygon.getCoordinates()).to.eql([
+        [[[0, 0], [0, 2], [1, 1], [2, 0]]],
+        [[[3, 0], [4, 1], [5, 2], [5, 0]]]
+      ]);
+      expect(multiPolygon.getPolygons().length).to.eql(2);
+    });
+
+  });
+
+  describe('with a simple MultiPolygon', function() {
+
+    var multiPolygon;
+    beforeEach(function() {
+      multiPolygon = new ol.geom.MultiPolygon([
+        [[[0, 0], [0, 2], [1, 1], [2, 0]]],
+        [[[3, 0], [4, 1], [5, 2], [5, 0]]]
+      ]);
+    });
+
+    it('can return individual polygons', function() {
+      var polygon0 = multiPolygon.getPolygon(0);
+      expect(polygon0).to.be.an(ol.geom.Polygon);
+      expect(polygon0.getCoordinates()).to.eql(
+          [[[0, 0], [0, 2], [1, 1], [2, 0]]]);
+      var polygon1 = multiPolygon.getPolygon(1);
+      expect(polygon1).to.be.an(ol.geom.Polygon);
+      expect(polygon1.getCoordinates()).to.eql(
+          [[[3, 0], [4, 1], [5, 2], [5, 0]]]);
+    });
+
+    it('can return all polygons', function() {
+      var polygons = multiPolygon.getPolygons();
+      expect(polygons).to.be.an(Array);
+      expect(polygons).to.have.length(2);
+      expect(polygons[0]).to.be.an(ol.geom.Polygon);
+      expect(polygons[0].getCoordinates()).to.eql(
+          [[[0, 0], [0, 2], [1, 1], [2, 0]]]);
+      expect(polygons[1]).to.be.an(ol.geom.Polygon);
+      expect(polygons[1].getCoordinates()).to.eql(
+          [[[3, 0], [4, 1], [5, 2], [5, 0]]]);
+    });
+
+    describe('#getSimplifiedGeometry', function() {
+
+      it('returns the expected result', function() {
+        var simplifiedGeometry = multiPolygon.getSimplifiedGeometry(1);
+        expect(simplifiedGeometry).to.be.an(ol.geom.MultiPolygon);
+        expect(simplifiedGeometry.getCoordinates()).to.eql([
+          [[[0, 0], [0, 2], [2, 0]]],
+          [[[3, 0], [5, 2], [5, 0]]]
+        ]);
+      });
+    });
+
+  });
+
+});
+
+
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Polygon');
diff --git a/test/spec/ol/geom/point.test.js b/test/spec/ol/geom/point.test.js
new file mode 100644
index 0000000..f32f86f
--- /dev/null
+++ b/test/spec/ol/geom/point.test.js
@@ -0,0 +1,174 @@
+goog.provide('ol.test.geom.Point');
+
+
+describe('ol.geom.Point', function() {
+
+  it('can be constructed with a null geometry', function() {
+    expect(function() {
+      var point = new ol.geom.Point(null);
+      point = point; // suppress gjslint warning
+    }).not.to.throwException();
+  });
+
+  describe('construct with 2D coordinates', function() {
+
+    var point;
+    beforeEach(function() {
+      point = new ol.geom.Point([1, 2]);
+    });
+
+    it('has the expected layout', function() {
+      expect(point.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(point.getCoordinates()).to.eql([1, 2]);
+    });
+
+    it('has the expected extent', function() {
+      expect(point.getExtent()).to.eql([1, 2, 1, 2]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(point.getFlatCoordinates()).to.eql([1, 2]);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(point.getStride()).to.be(2);
+    });
+
+  });
+
+  describe('construct with 3D coordinates and layout XYM', function() {
+
+    var point;
+    beforeEach(function() {
+      point = new ol.geom.Point([1, 2, 3], ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected layout', function() {
+      expect(point.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(point.getCoordinates()).to.eql([1, 2, 3]);
+    });
+
+    it('has the expected extent', function() {
+      expect(point.getExtent()).to.eql([1, 2, 1, 2]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(point.getFlatCoordinates()).to.eql([1, 2, 3]);
+    });
+
+    it('has the expected stride', function() {
+      expect(point.getStride()).to.be(3);
+    });
+
+  });
+
+  describe('construct with 4D coordinates', function() {
+
+    var point;
+    beforeEach(function() {
+      point = new ol.geom.Point([1, 2, 3, 4]);
+    });
+
+    it('has the expected layout', function() {
+      expect(point.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(point.getCoordinates()).to.eql([1, 2, 3, 4]);
+    });
+
+    it('has the expected extent', function() {
+      expect(point.getExtent()).to.eql([1, 2, 1, 2]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(point.getFlatCoordinates()).to.eql([1, 2, 3, 4]);
+    });
+
+    it('has the expected stride', function() {
+      expect(point.getStride()).to.be(4);
+    });
+
+    describe('#getClosestPoint', function() {
+
+      it('preseves extra dimensions', function() {
+        var closestPoint = point.getClosestPoint([0, 0]);
+        expect(closestPoint).to.eql([1, 2, 3, 4]);
+      });
+
+    });
+
+  });
+
+  describe('#applyTransform()', function() {
+
+    var point, transform;
+    beforeEach(function() {
+      point = new ol.geom.Point([1, 2]);
+      transform = sinon.spy();
+    });
+
+    it('calls a transform function', function() {
+      point.applyTransform(transform);
+      expect(transform.calledOnce).to.be(true);
+      var args = transform.firstCall.args;
+      expect(args).to.have.length(3);
+
+      expect(args[0]).to.be(point.getFlatCoordinates()); // input coords
+      expect(args[1]).to.be(point.getFlatCoordinates()); // output coords
+      expect(args[2]).to.be(2); // dimension
+    });
+
+    it('allows for modification of coordinates', function() {
+      var mod = function(input, output, dimension) {
+        var copy = input.slice();
+        output[1] = copy[0];
+        output[0] = copy[1];
+      };
+      point.applyTransform(mod);
+      expect(point.getCoordinates()).to.eql([2, 1]);
+    });
+
+    it('returns undefined', function() {
+      var got = point.applyTransform(transform);
+      expect(got).to.be(undefined);
+    });
+
+  });
+
+  describe('#transform()', function() {
+
+    it('transforms a geometry given CRS identifiers', function() {
+      var point = new ol.geom.Point([-111, 45]).transform(
+          'EPSG:4326', 'EPSG:3857');
+
+      expect(point).to.be.a(ol.geom.Point);
+
+      var coords = point.getCoordinates();
+
+      expect(coords[0]).to.roughlyEqual(-12356463.47, 1e-2);
+      expect(coords[1]).to.roughlyEqual(5621521.48, 1e-2);
+    });
+
+    it('modifies the original', function() {
+      var point = new ol.geom.Point([-111, 45]);
+      point.transform('EPSG:4326', 'EPSG:3857');
+      var coords = point.getCoordinates();
+
+      expect(coords[0]).to.roughlyEqual(-12356463.47, 1e-2);
+      expect(coords[1]).to.roughlyEqual(5621521.48, 1e-2);
+    });
+
+  });
+
+});
+
+
+goog.require('ol.extent');
+goog.require('ol.geom.Point');
diff --git a/test/spec/ol/geom/polygon.test.js b/test/spec/ol/geom/polygon.test.js
new file mode 100644
index 0000000..163d36c
--- /dev/null
+++ b/test/spec/ol/geom/polygon.test.js
@@ -0,0 +1,420 @@
+goog.provide('ol.test.geom.Polygon');
+
+
+describe('ol.geom.Polygon', function() {
+
+  it('can be constructed with a null geometry', function() {
+    expect(function() {
+      var polygon = new ol.geom.Polygon(null);
+      polygon = polygon; // suppress gjslint warning
+    }).not.to.throwException();
+  });
+
+  describe('construct empty', function() {
+
+    var polygon;
+    beforeEach(function() {
+      polygon = new ol.geom.Polygon([]);
+    });
+
+    it('defaults to layout XY', function() {
+      expect(polygon.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has empty coordinates', function() {
+      expect(polygon.getCoordinates()).to.be.empty();
+    });
+
+    it('has an empty extent', function() {
+      expect(ol.extent.isEmpty(polygon.getExtent())).to.be(true);
+    });
+
+    it('has empty flat coordinates', function() {
+      expect(polygon.getFlatCoordinates()).to.be.empty();
+    });
+
+    it('has stride the expected stride', function() {
+      expect(polygon.getStride()).to.be(2);
+    });
+
+    it('can append linear rings', function() {
+      polygon.appendLinearRing(
+          new ol.geom.LinearRing([[1, 2], [3, 4], [5, 6]]));
+      expect(polygon.getCoordinates()).to.eql(
+          [[[1, 2], [3, 4], [5, 6]]]);
+      polygon.appendLinearRing(
+          new ol.geom.LinearRing([[7, 8], [9, 10], [11, 12]]));
+      expect(polygon.getCoordinates()).to.eql(
+          [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]);
+    });
+
+  });
+
+  describe('construct with 2D coordinates', function() {
+
+    var outerRing, innerRing, polygon, flatCoordinates;
+    var outsideOuter, inside, insideInner;
+    beforeEach(function() {
+      outerRing = [[0, 1], [1, 4], [4, 3], [3, 0]];
+      innerRing = [[2, 2], [3, 2], [3, 3], [2, 3]];
+      polygon = new ol.geom.Polygon([outerRing, innerRing]);
+      flatCoordinates = [0, 1, 1, 4, 4, 3, 3, 0, 2, 2, 3, 2, 3, 3, 2, 3];
+      outsideOuter = [0, 4];
+      inside = [1.5, 1.5];
+      insideInner = [2.5, 3.5];
+    });
+
+    it('has the expected layout', function() {
+      expect(polygon.getLayout()).to.be(ol.geom.GeometryLayout.XY);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(polygon.getCoordinates()).to.eql([outerRing, innerRing]);
+    });
+
+    it('has the expected extent', function() {
+      expect(polygon.getExtent()).to.eql([0, 0, 4, 4]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(polygon.getFlatCoordinates()).to.eql(flatCoordinates);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(polygon.getStride()).to.be(2);
+    });
+
+    it('can return individual rings', function() {
+      expect(polygon.getLinearRing(0).getCoordinates()).to.eql(outerRing);
+      expect(polygon.getLinearRing(1).getCoordinates()).to.eql(innerRing);
+    });
+
+    it('has the expected rings', function() {
+      var linearRings = polygon.getLinearRings();
+      expect(linearRings).to.be.an(Array);
+      expect(linearRings).to.have.length(2);
+      expect(linearRings[0]).to.be.an(ol.geom.LinearRing);
+      expect(linearRings[0].getCoordinates()).to.eql(outerRing);
+      expect(linearRings[1]).to.be.an(ol.geom.LinearRing);
+      expect(linearRings[1].getCoordinates()).to.eql(innerRing);
+    });
+
+    it('does not reverse any rings', function() {
+      outerRing.reverse();
+      innerRing.reverse();
+      polygon = new ol.geom.Polygon([outerRing, innerRing]);
+      var coordinates = polygon.getCoordinates();
+      expect(coordinates[0]).to.eql(outerRing);
+      expect(coordinates[1]).to.eql(innerRing);
+    });
+
+    it('does not contain outside coordinates', function() {
+      expect(polygon.containsCoordinate(outsideOuter)).to.be(false);
+    });
+
+    it('does contain inside coordinates', function() {
+      expect(polygon.containsCoordinate(inside)).to.be(true);
+    });
+
+    it('does not contain inside inner coordinates', function() {
+      expect(polygon.containsCoordinate(insideInner)).to.be(false);
+    });
+
+    describe('#getOrientedFlatCoordinates', function() {
+
+      it('reverses the outer ring if necessary', function() {
+        outerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+      it('reverses inner rings if necessary', function() {
+        innerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+      it('reverses all rings if necessary', function() {
+        outerRing.reverse();
+        innerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+    });
+
+  });
+
+  describe('construct with 3D coordinates', function() {
+
+    var outerRing, innerRing, polygon, flatCoordinates;
+    var outsideOuter, inside, insideInner;
+    beforeEach(function() {
+      outerRing = [[0, 0, 1], [4, 4, 2], [4, 0, 3]];
+      innerRing = [[2, 1, 4], [3, 1, 5], [3, 2, 6]];
+      polygon = new ol.geom.Polygon([outerRing, innerRing]);
+      flatCoordinates = [0, 0, 1, 4, 4, 2, 4, 0, 3, 2, 1, 4, 3, 1, 5, 3, 2, 6];
+      outsideOuter = [1, 3];
+      inside = [3.5, 0.5];
+      insideInner = [2.9, 1.1];
+    });
+
+    it('has the expected layout', function() {
+      expect(polygon.getLayout()).to.be(ol.geom.GeometryLayout.XYZ);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(polygon.getCoordinates()).to.eql([outerRing, innerRing]);
+    });
+
+    it('has the expected extent', function() {
+      expect(polygon.getExtent()).to.eql([0, 0, 4, 4]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(polygon.getFlatCoordinates()).to.eql(flatCoordinates);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(polygon.getStride()).to.be(3);
+    });
+
+    it('does not contain outside coordinates', function() {
+      expect(polygon.containsCoordinate(outsideOuter)).to.be(false);
+    });
+
+    it('does contain inside coordinates', function() {
+      expect(polygon.containsCoordinate(inside)).to.be(true);
+    });
+
+    it('does not contain inside inner coordinates', function() {
+      expect(polygon.containsCoordinate(insideInner)).to.be(false);
+    });
+
+    describe('#getOrientedFlatCoordinates', function() {
+
+      it('reverses the outer ring if necessary', function() {
+        outerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+      it('reverses inner rings if necessary', function() {
+        innerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+      it('reverses all rings if necessary', function() {
+        outerRing.reverse();
+        innerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+    });
+
+  });
+
+  describe('construct with 3D coordinates and layout XYM', function() {
+
+    var outerRing, innerRing, polygon, flatCoordinates;
+    var outsideOuter, inside, insideInner;
+    beforeEach(function() {
+      outerRing = [[0, 0, 1], [4, 4, 2], [4, 0, 3]];
+      innerRing = [[2, 1, 4], [3, 1, 5], [3, 2, 6]];
+      polygon = new ol.geom.Polygon(
+          [outerRing, innerRing], ol.geom.GeometryLayout.XYM);
+      flatCoordinates = [0, 0, 1, 4, 4, 2, 4, 0, 3, 2, 1, 4, 3, 1, 5, 3, 2, 6];
+      outsideOuter = [1, 3];
+      inside = [3.5, 0.5];
+      insideInner = [2.9, 1.1];
+    });
+
+    it('has the expected layout', function() {
+      expect(polygon.getLayout()).to.be(ol.geom.GeometryLayout.XYM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(polygon.getCoordinates()).to.eql([outerRing, innerRing]);
+    });
+
+    it('has the expected extent', function() {
+      expect(polygon.getExtent()).to.eql([0, 0, 4, 4]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(polygon.getFlatCoordinates()).to.eql(flatCoordinates);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(polygon.getStride()).to.be(3);
+    });
+
+    it('does not contain outside coordinates', function() {
+      expect(polygon.containsCoordinate(outsideOuter)).to.be(false);
+    });
+
+    it('does contain inside coordinates', function() {
+      expect(polygon.containsCoordinate(inside)).to.be(true);
+    });
+
+    it('does not contain inside inner coordinates', function() {
+      expect(polygon.containsCoordinate(insideInner)).to.be(false);
+    });
+
+    describe('#getOrientedFlatCoordinates', function() {
+
+      it('reverses the outer ring if necessary', function() {
+        outerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+      it('reverses inner rings if necessary', function() {
+        innerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+      it('reverses all rings if necessary', function() {
+        outerRing.reverse();
+        innerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+    });
+
+  });
+
+  describe('construct with 4D coordinates', function() {
+
+    var outerRing, innerRing1, innerRing2, polygon, flatCoordinates;
+    var outsideOuter, inside, insideInner1, insideInner2;
+    beforeEach(function() {
+      outerRing = [[0, 6, 1, 2], [6, 6, 3, 4], [3, 0, 5, 6]];
+      innerRing1 =
+          [[2, 4, 7, 8], [4, 4, 9, 10], [4, 5, 11, 12], [2, 5, 13, 14]];
+      innerRing2 = [[3, 2, 15, 16], [4, 3, 17, 18], [2, 3, 19, 20]];
+      polygon = new ol.geom.Polygon([outerRing, innerRing1, innerRing2]);
+      flatCoordinates = [
+        0, 6, 1, 2, 6, 6, 3, 4, 3, 0, 5, 6,
+        2, 4, 7, 8, 4, 4, 9, 10, 4, 5, 11, 12, 2, 5, 13, 14,
+        3, 2, 15, 16, 4, 3, 17, 18, 2, 3, 19, 20
+      ];
+      outsideOuter = [1, 1];
+      inside = [3, 1];
+      insideInner1 = [2.5, 4.5];
+      insideInner2 = [3, 2.5];
+    });
+
+    it('has the expected layout', function() {
+      expect(polygon.getLayout()).to.be(ol.geom.GeometryLayout.XYZM);
+    });
+
+    it('has the expected coordinates', function() {
+      expect(polygon.getCoordinates()).to.eql(
+          [outerRing, innerRing1, innerRing2]);
+    });
+
+    it('has the expected extent', function() {
+      expect(polygon.getExtent()).to.eql([0, 0, 6, 6]);
+    });
+
+    it('has the expected flat coordinates', function() {
+      expect(polygon.getFlatCoordinates()).to.eql(flatCoordinates);
+    });
+
+    it('has stride the expected stride', function() {
+      expect(polygon.getStride()).to.be(4);
+    });
+
+    it('does not contain outside coordinates', function() {
+      expect(polygon.containsCoordinate(outsideOuter)).to.be(false);
+    });
+
+    it('does contain inside coordinates', function() {
+      expect(polygon.containsCoordinate(inside)).to.be(true);
+    });
+
+    it('does not contain inside inner coordinates', function() {
+      expect(polygon.containsCoordinate(insideInner1)).to.be(false);
+      expect(polygon.containsCoordinate(insideInner2)).to.be(false);
+    });
+
+    describe('#getOrientedFlatCoordinates', function() {
+
+      it('reverses the outer ring if necessary', function() {
+        outerRing.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing1, innerRing2]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+      it('reverses inner rings if necessary', function() {
+        innerRing1.reverse();
+        innerRing2.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing1, innerRing2]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+      it('reverses all rings if necessary', function() {
+        outerRing.reverse();
+        innerRing1.reverse();
+        innerRing2.reverse();
+        polygon = new ol.geom.Polygon([outerRing, innerRing1, innerRing2]);
+        expect(polygon.getOrientedFlatCoordinates()).to.eql(flatCoordinates);
+      });
+
+    });
+
+  });
+
+  describe('with a simple polygon', function() {
+
+    var polygon;
+    beforeEach(function() {
+      polygon = new ol.geom.Polygon(
+          [[[3, 0], [1, 3], [0, 6], [2, 6], [3, 7], [4, 6], [6, 6], [4, 3]]]);
+    });
+
+    describe('#getSimplifiedGeometry', function() {
+
+      it('returns the expected result', function() {
+        var simplifiedGeometry = polygon.getSimplifiedGeometry(9);
+        expect(simplifiedGeometry).to.be.an(ol.geom.Polygon);
+        expect(simplifiedGeometry.getCoordinates()).to.eql(
+            [[[3, 0], [0, 3], [0, 6], [6, 6], [3, 3]]]);
+      });
+
+      it('caches multiple simplified geometries', function() {
+        var simplifiedGeometry1 = polygon.getSimplifiedGeometry(4);
+        var simplifiedGeometry2 = polygon.getSimplifiedGeometry(9);
+        var simplifiedGeometry3 = polygon.getSimplifiedGeometry(4);
+        var simplifiedGeometry4 = polygon.getSimplifiedGeometry(9);
+        expect(simplifiedGeometry1).to.be(simplifiedGeometry3);
+        expect(simplifiedGeometry2).to.be(simplifiedGeometry4);
+      });
+
+    });
+  });
+
+  describe('ol.geom.Polygon.fromExtent', function() {
+    it('creates the correct polygon', function() {
+      var extent = [1, 2, 3, 5];
+      var polygon = ol.geom.Polygon.fromExtent(extent);
+      var flatCoordinates = polygon.getFlatCoordinates();
+      expect(flatCoordinates).to.eql(
+          [1, 2, 1, 5, 3, 5, 3, 2, 1, 2]);
+      var orientedFlatCoordinates = polygon.getOrientedFlatCoordinates();
+      expect(orientedFlatCoordinates).to.eql(
+          [1, 2, 1, 5, 3, 5, 3, 2, 1, 2]);
+    });
+  });
+
+});
+
+
+goog.require('ol.extent');
+goog.require('ol.geom.LinearRing');
+goog.require('ol.geom.Polygon');
diff --git a/test/spec/ol/graticule.test.js b/test/spec/ol/graticule.test.js
new file mode 100644
index 0000000..6f9b698
--- /dev/null
+++ b/test/spec/ol/graticule.test.js
@@ -0,0 +1,53 @@
+goog.provide('ol.test.Graticule');
+
+describe('ol.Graticule', function() {
+  var graticule;
+
+  beforeEach(function() {
+    graticule = new ol.Graticule({
+      map: new ol.Map({})
+    });
+  });
+
+  describe('#createGraticule', function() {
+    it('creates the graticule', function() {
+      var extent = [-25614353.926475704, -7827151.696402049,
+        25614353.926475704, 7827151.696402049];
+      var projection = ol.proj.get('EPSG:3857');
+      var resolution = 39135.75848201024;
+      var squaredTolerance = resolution * resolution / 4.0;
+      graticule.updateProjectionInfo_(projection);
+      graticule.createGraticule_(extent, [0, 0], resolution, squaredTolerance);
+      expect(graticule.getMeridians().length).to.be(13);
+      expect(graticule.getParallels().length).to.be(3);
+    });
+
+    it('has a default stroke style', function() {
+      var actualStyle = graticule.strokeStyle_;
+
+      expect(actualStyle).not.to.be(undefined);
+      expect(actualStyle instanceof ol.style.Stroke).to.be(true);
+    });
+
+    it('can be configured with a stroke style', function() {
+      var customStrokeStyle = new ol.style.Stroke({
+        color: 'rebeccapurple'
+      });
+      var styledGraticule = new ol.Graticule({
+        map: new ol.Map({}),
+        strokeStyle: customStrokeStyle
+      });
+      var actualStyle = styledGraticule.strokeStyle_;
+
+      expect(actualStyle).not.to.be(undefined);
+      expect(actualStyle).to.be(customStrokeStyle);
+    });
+
+  });
+
+});
+
+goog.require('ol.Graticule');
+goog.require('ol.Map');
+goog.require('ol.proj');
+goog.require('ol.style.Stroke');
diff --git a/test/spec/ol/interaction/drawinteraction.test.js b/test/spec/ol/interaction/drawinteraction.test.js
new file mode 100644
index 0000000..f49a3f8
--- /dev/null
+++ b/test/spec/ol/interaction/drawinteraction.test.js
@@ -0,0 +1,609 @@
+goog.provide('ol.test.interaction.Draw');
+
+describe('ol.interaction.Draw', function() {
+  var target, map, source;
+
+  var width = 360;
+  var height = 180;
+
+  beforeEach(function(done) {
+    target = document.createElement('div');
+    var style = target.style;
+    style.position = 'absolute';
+    style.left = '-1000px';
+    style.top = '-1000px';
+    style.width = width + 'px';
+    style.height = height + 'px';
+    document.body.appendChild(target);
+    source = new ol.source.Vector();
+    var layer = new ol.layer.Vector({source: source});
+    map = new ol.Map({
+      target: target,
+      layers: [layer],
+      view: new ol.View({
+        projection: 'EPSG:4326',
+        center: [0, 0],
+        resolution: 1
+      })
+    });
+    map.on('postrender', function() {
+      done();
+    });
+  });
+
+  afterEach(function() {
+    goog.dispose(map);
+    document.body.removeChild(target);
+  });
+
+  /**
+   * Simulates a browser event on the map viewport.  The client x/y location
+   * will be adjusted as if the map were centered at 0,0.
+   * @param {string} type Event type.
+   * @param {number} x Horizontal offset from map center.
+   * @param {number} y Vertical offset from map center.
+   * @param {boolean=} opt_shiftKey Shift key is pressed.
+   */
+  function simulateEvent(type, x, y, opt_shiftKey) {
+    var viewport = map.getViewport();
+    // calculated in case body has top < 0 (test runner with small window)
+    var position = goog.style.getClientPosition(viewport);
+    var shiftKey = goog.isDef(opt_shiftKey) ? opt_shiftKey : false;
+    var event = new ol.MapBrowserPointerEvent(type, map,
+        new ol.pointer.PointerEvent(type,
+            new goog.events.BrowserEvent({
+              clientX: position.x + x + width / 2,
+              clientY: position.y + y + height / 2,
+              shiftKey: shiftKey
+            })));
+    map.handleMapBrowserEvent(event);
+  }
+
+  describe('constructor', function() {
+
+    it('creates a new interaction', function() {
+      var draw = new ol.interaction.Draw({
+        source: source,
+        type: ol.geom.GeometryType.POINT
+      });
+      expect(draw).to.be.a(ol.interaction.Draw);
+      expect(draw).to.be.a(ol.interaction.Interaction);
+    });
+
+  });
+
+  describe('specifying a geometryName', function() {
+
+    beforeEach(function() {
+      var draw = new ol.interaction.Draw({
+        source: source,
+        geometryName: 'the_geom',
+        type: ol.geom.GeometryType.POINT
+      });
+      map.addInteraction(draw);
+    });
+
+    it('creates a feature with the correct geometryName', function() {
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+      var features = source.getFeatures();
+      var geometry = features[0].getGeometry();
+      expect(features[0].getGeometryName()).to.equal('the_geom');
+      expect(geometry).to.be.a(ol.geom.Point);
+    });
+  });
+
+  describe('drawing points', function() {
+    var draw;
+
+    beforeEach(function() {
+      draw = new ol.interaction.Draw({
+        source: source,
+        type: ol.geom.GeometryType.POINT
+      });
+      map.addInteraction(draw);
+    });
+
+    it('draws a point on click', function() {
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.Point);
+      expect(geometry.getCoordinates()).to.eql([10, -20]);
+    });
+
+    it('does not draw a point with a significant drag', function() {
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointermove', 15, 20);
+      simulateEvent('pointerup', 15, 20);
+      var features = source.getFeatures();
+      expect(features).to.have.length(0);
+    });
+
+    it('does not draw a point when modifier key is pressed', function() {
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20, true);
+      simulateEvent('pointerup', 10, 20);
+      var features = source.getFeatures();
+      expect(features).to.have.length(0);
+    });
+
+    it('triggers draw events', function() {
+      var ds = sinon.spy();
+      var de = sinon.spy();
+      goog.events.listen(draw, ol.DrawEventType.DRAWSTART, ds);
+      goog.events.listen(draw, ol.DrawEventType.DRAWEND, de);
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+      simulateEvent('pointermove', 20, 20);
+      expect(ds).to.be.called(2);
+      expect(de).to.be.called(1);
+    });
+  });
+
+  describe('drawing multipoints', function() {
+
+    beforeEach(function() {
+      map.addInteraction(new ol.interaction.Draw({
+        source: source,
+        type: ol.geom.GeometryType.MULTI_POINT
+      }));
+    });
+
+    it('draws multipoint on click', function() {
+      simulateEvent('pointermove', 30, 15);
+      simulateEvent('pointerdown', 30, 15);
+      simulateEvent('pointerup', 30, 15);
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.MultiPoint);
+      expect(geometry.getCoordinates()).to.eql([[30, -15]]);
+    });
+
+  });
+
+  describe('drawing linestrings', function() {
+    var draw;
+
+    beforeEach(function() {
+      draw = new ol.interaction.Draw({
+        source: source,
+        type: ol.geom.GeometryType.LINE_STRING
+      });
+      map.addInteraction(draw);
+    });
+
+    it('draws linestring with clicks, finishing on last point', function() {
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // finish on second point
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.LineString);
+      expect(geometry.getCoordinates()).to.eql([[10, -20], [30, -20]]);
+    });
+
+    it('does not add a point with a significant drag', function() {
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // drag map
+      simulateEvent('pointermove', 15, 20);
+      simulateEvent('pointerdown', 15, 20);
+      simulateEvent('pointermove', 20, 20);
+      simulateEvent('pointerup', 20, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // finish on second point
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.LineString);
+      expect(geometry.getCoordinates()).to.eql([[10, -20], [30, -20]]);
+    });
+
+    it('triggers draw events', function() {
+      var ds = sinon.spy();
+      var de = sinon.spy();
+      goog.events.listen(draw, ol.DrawEventType.DRAWSTART, ds);
+      goog.events.listen(draw, ol.DrawEventType.DRAWEND, de);
+
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // finish on second point
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+      simulateEvent('pointermove', 10, 20);
+
+      expect(ds).to.be.called(1);
+      expect(de).to.be.called(1);
+    });
+
+  });
+
+  describe('drawing multi-linestrings', function() {
+
+    beforeEach(function() {
+      map.addInteraction(new ol.interaction.Draw({
+        source: source,
+        type: ol.geom.GeometryType.MULTI_LINE_STRING
+      }));
+    });
+
+    it('draws multi with clicks, finishing on last point', function() {
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // finish on second point
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.MultiLineString);
+      expect(geometry.getCoordinates()).to.eql([[[10, -20], [30, -20]]]);
+    });
+
+  });
+
+  describe('drawing polygons', function() {
+    var draw;
+
+    beforeEach(function() {
+      draw = new ol.interaction.Draw({
+        source: source,
+        type: ol.geom.GeometryType.POLYGON
+      });
+      map.addInteraction(draw);
+    });
+
+    it('draws polygon with clicks, finishing on first point', function() {
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // third point
+      simulateEvent('pointermove', 40, 10);
+      simulateEvent('pointerdown', 40, 10);
+      simulateEvent('pointerup', 40, 10);
+
+      // finish on first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.Polygon);
+
+      expect(geometry.getCoordinates()).to.eql([
+        [[10, -20], [30, -20], [40, -10], [10, -20]]
+      ]);
+    });
+
+    it('draws polygon with clicks, finishing on last point', function() {
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // third point
+      simulateEvent('pointermove', 40, 10);
+      simulateEvent('pointerdown', 40, 10);
+      simulateEvent('pointerup', 40, 10);
+
+      // finish on last point
+      simulateEvent('pointerdown', 40, 10);
+      simulateEvent('pointerup', 40, 10);
+
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.Polygon);
+
+      expect(geometry.getCoordinates()).to.eql([
+        [[10, -20], [30, -20], [40, -10], [10, -20]]
+      ]);
+    });
+
+    it('triggers draw events', function() {
+      var ds = sinon.spy();
+      var de = sinon.spy();
+      goog.events.listen(draw, ol.DrawEventType.DRAWSTART, ds);
+      goog.events.listen(draw, ol.DrawEventType.DRAWEND, de);
+
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // third point
+      simulateEvent('pointermove', 30, 10);
+      simulateEvent('pointerdown', 30, 10);
+      simulateEvent('pointerup', 30, 10);
+
+      // finish on first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      expect(ds).to.be.called(1);
+      expect(de).to.be.called(1);
+    });
+
+  });
+
+  describe('drawing multi-polygons', function() {
+
+    beforeEach(function() {
+      map.addInteraction(new ol.interaction.Draw({
+        source: source,
+        type: ol.geom.GeometryType.MULTI_POLYGON
+      }));
+    });
+
+    it('draws multi with clicks, finishing on first point', function() {
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // third point
+      simulateEvent('pointermove', 40, 10);
+      simulateEvent('pointerdown', 40, 10);
+      simulateEvent('pointerup', 40, 10);
+
+      // finish on first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.MultiPolygon);
+      var coordinates = geometry.getCoordinates();
+      expect(coordinates).to.have.length(1);
+
+      expect(coordinates[0]).to.eql([
+        [[10, -20], [30, -20], [40, -10], [10, -20]]
+      ]);
+    });
+
+    it('draws multi with clicks, finishing on last point', function() {
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      // second point
+      simulateEvent('pointermove', 30, 20);
+      simulateEvent('pointerdown', 30, 20);
+      simulateEvent('pointerup', 30, 20);
+
+      // third point
+      simulateEvent('pointermove', 40, 10);
+      simulateEvent('pointerdown', 40, 10);
+      simulateEvent('pointerup', 40, 10);
+
+      // finish on last point
+      simulateEvent('pointerdown', 40, 10);
+      simulateEvent('pointerup', 40, 10);
+
+      var features = source.getFeatures();
+      expect(features).to.have.length(1);
+      var geometry = features[0].getGeometry();
+      expect(geometry).to.be.a(ol.geom.MultiPolygon);
+      var coordinates = geometry.getCoordinates();
+      expect(coordinates).to.have.length(1);
+
+      expect(coordinates[0]).to.eql([
+        [[10, -20], [30, -20], [40, -10], [10, -20]]
+      ]);
+    });
+
+  });
+
+  describe('#setActive()', function() {
+    var interaction;
+
+    beforeEach(function() {
+      interaction = new ol.interaction.Draw({
+        type: ol.geom.GeometryType.LINE_STRING
+      });
+
+      expect(interaction.getActive()).to.be(true);
+
+      map.addInteraction(interaction);
+
+      // first point
+      simulateEvent('pointermove', 10, 20);
+      simulateEvent('pointerdown', 10, 20);
+      simulateEvent('pointerup', 10, 20);
+
+      expect(interaction.sketchFeature_).not.to.be(null);
+    });
+
+    afterEach(function() {
+      map.removeInteraction(interaction);
+    });
+
+    describe('#setActive(false)', function() {
+      it('unsets the map from the feature overlay', function() {
+        interaction.setActive(false);
+        expect(interaction.overlay_.map_).to.be(null);
+      });
+      it('aborts the drawing', function() {
+        interaction.setActive(false);
+        expect(interaction.sketchFeature_).to.be(null);
+      });
+      it('fires change:active', function() {
+        listenerSpy = sinon.spy(function() {
+          // test that the interaction's change:active listener is called first
+          expect(interaction.overlay_.map_).to.be(null);
+        });
+        interaction.on('change:active', listenerSpy);
+        interaction.setActive(false);
+        expect(listenerSpy.callCount).to.be(1);
+      });
+    });
+
+    describe('#setActive(true)', function() {
+      beforeEach(function() {
+        interaction.setActive(false);
+      });
+      it('sets the map into the feature overlay', function() {
+        interaction.setActive(true);
+        expect(interaction.overlay_.map_).to.be(map);
+      });
+      it('fires change:active', function() {
+        listenerSpy = sinon.spy(function() {
+          // test that the interaction's change:active listener is called first
+          expect(interaction.overlay_.map_).not.to.be(null);
+        });
+        interaction.on('change:active', listenerSpy);
+        interaction.setActive(true);
+        expect(listenerSpy.callCount).to.be(1);
+      });
+    });
+
+  });
+
+  describe('#setMap()', function() {
+    var interaction;
+
+    beforeEach(function() {
+      interaction = new ol.interaction.Draw({
+        type: ol.geom.GeometryType.LINE_STRING
+      });
+      expect(interaction.getActive()).to.be(true);
+    });
+
+    describe('#setMap(null)', function() {
+      beforeEach(function() {
+        map.addInteraction(interaction);
+        // first point
+        simulateEvent('pointermove', 10, 20);
+        simulateEvent('pointerdown', 10, 20);
+        simulateEvent('pointerup', 10, 20);
+        expect(interaction.sketchFeature_).not.to.be(null);
+      });
+      afterEach(function() {
+        map.removeInteraction(interaction);
+      });
+      describe('#setMap(null) when interaction is active', function() {
+        it('unsets the map from the feature overlay', function() {
+          interaction.setMap(null);
+          expect(interaction.overlay_.map_).to.be(null);
+        });
+        it('aborts the drawing', function() {
+          interaction.setMap(null);
+          expect(interaction.sketchFeature_).to.be(null);
+        });
+      });
+    });
+
+    describe('#setMap(map)', function() {
+      describe('#setMap(map) when interaction is active', function() {
+        it('sets the map into the feature overlay', function() {
+          interaction.setMap(map);
+          expect(interaction.overlay_.map_).to.be(map);
+        });
+      });
+      describe('#setMap(map) when interaction is not active', function() {
+        it('does not set the map into the feature overlay', function() {
+          interaction.setActive(false);
+          interaction.setMap(map);
+          expect(interaction.overlay_.map_).to.be(null);
+        });
+      });
+
+    });
+  });
+});
+
+goog.require('goog.dispose');
+goog.require('goog.events');
+goog.require('goog.events.BrowserEvent');
+goog.require('goog.style');
+goog.require('ol.Map');
+goog.require('ol.MapBrowserPointerEvent');
+goog.require('ol.View');
+goog.require('ol.geom.GeometryType');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.MultiLineString');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.geom.Point');
+goog.require('ol.geom.Polygon');
+goog.require('ol.interaction.Draw');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.layer.Vector');
+goog.require('ol.pointer.PointerEvent');
+goog.require('ol.source.Vector');
diff --git a/test/spec/ol/interaction/interaction.test.js b/test/spec/ol/interaction/interaction.test.js
new file mode 100644
index 0000000..bff9c9e
--- /dev/null
+++ b/test/spec/ol/interaction/interaction.test.js
@@ -0,0 +1,60 @@
+goog.provide('ol.test.interaction.Interaction');
+
+describe('ol.interaction.Interaction', function() {
+
+  describe('constructor', function() {
+    var interaction;
+
+    beforeEach(function() {
+      interaction = new ol.interaction.Interaction({});
+    });
+
+    it('creates a new interaction', function() {
+      expect(interaction).to.be.a(ol.interaction.Interaction);
+      expect(interaction).to.be.a(goog.events.EventTarget);
+    });
+
+    it('creates an active interaction', function() {
+      expect(interaction.getActive()).to.be(true);
+    });
+
+  });
+
+  describe('#getMap()', function() {
+
+    it('retrieves the associated map', function() {
+      var map = new ol.Map({});
+      var interaction = new ol.interaction.Interaction({});
+      interaction.setMap(map);
+      expect(interaction.getMap()).to.be(map);
+    });
+
+    it('returns null if no map', function() {
+      var interaction = new ol.interaction.Interaction({});
+      expect(interaction.getMap()).to.be(null);
+    });
+
+  });
+
+  describe('#setMap()', function() {
+
+    it('allows a map to be set', function() {
+      var map = new ol.Map({});
+      var interaction = new ol.interaction.Interaction({});
+      interaction.setMap(map);
+      expect(interaction.getMap()).to.be(map);
+    });
+
+    it('accepts null', function() {
+      var interaction = new ol.interaction.Interaction({});
+      interaction.setMap(null);
+      expect(interaction.getMap()).to.be(null);
+    });
+
+  });
+
+});
+
+goog.require('goog.events.EventTarget');
+goog.require('ol.Map');
+goog.require('ol.interaction.Interaction');
diff --git a/test/spec/ol/interaction/modifyinteraction.test.js b/test/spec/ol/interaction/modifyinteraction.test.js
new file mode 100644
index 0000000..0efc2f2
--- /dev/null
+++ b/test/spec/ol/interaction/modifyinteraction.test.js
@@ -0,0 +1,24 @@
+goog.provide('ol.test.interaction.Modify');
+
+describe('ol.interaction.Modify', function() {
+
+  describe('constructor', function() {
+    it('adds features to the RTree', function() {
+      var feature = new ol.Feature(
+          new ol.geom.Point([0, 0]));
+      var features = new ol.Collection([feature]);
+      var modify = new ol.interaction.Modify({
+        features: features
+      });
+      var rbushEntries = modify.rBush_.getAll();
+      expect(rbushEntries.length).to.be(1);
+      expect(rbushEntries[0].feature === feature).to.be.ok();
+    });
+  });
+
+});
+
+goog.require('ol.Feature');
+goog.require('ol.Collection');
+goog.require('ol.geom.Point');
+goog.require('ol.interaction.Modify');
diff --git a/test/spec/ol/layer/layer.test.js b/test/spec/ol/layer/layer.test.js
new file mode 100644
index 0000000..93cee8f
--- /dev/null
+++ b/test/spec/ol/layer/layer.test.js
@@ -0,0 +1,575 @@
+goog.provide('ol.test.layer.Layer');
+
+describe('ol.layer.Layer', function() {
+
+  describe('constructor (defaults)', function() {
+
+    var layer;
+
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('creates an instance', function() {
+      expect(layer).to.be.a(ol.layer.Layer);
+    });
+
+    it('provides default brightness', function() {
+      expect(layer.getBrightness()).to.be(0);
+    });
+
+    it('provides default contrast', function() {
+      expect(layer.getContrast()).to.be(1);
+    });
+
+    it('provides default hue', function() {
+      expect(layer.getHue()).to.be(0);
+    });
+
+    it('provides default opacity', function() {
+      expect(layer.getOpacity()).to.be(1);
+    });
+
+    it('provides default saturation', function() {
+      expect(layer.getSaturation()).to.be(1);
+    });
+
+    it('provides default visibility', function() {
+      expect(layer.getVisible()).to.be(true);
+    });
+
+    it('provides default layerState', function() {
+      expect(layer.getLayerState()).to.eql({
+        layer: layer,
+        brightness: 0,
+        contrast: 1,
+        hue: 0,
+        opacity: 1,
+        saturation: 1,
+        visible: true,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: Infinity,
+        minResolution: 0
+      });
+    });
+
+  });
+
+  describe('constructor (options)', function() {
+
+    it('accepts options', function() {
+      var layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        }),
+        brightness: 0.5,
+        contrast: 10,
+        hue: 180,
+        opacity: 0.5,
+        saturation: 5,
+        visible: false,
+        maxResolution: 500,
+        minResolution: 0.25,
+        foo: 42
+      });
+
+      expect(layer.getBrightness()).to.be(0.5);
+      expect(layer.getContrast()).to.be(10);
+      expect(layer.getHue()).to.be(180);
+      expect(layer.getOpacity()).to.be(0.5);
+      expect(layer.getSaturation()).to.be(5);
+      expect(layer.getVisible()).to.be(false);
+      expect(layer.getMaxResolution()).to.be(500);
+      expect(layer.getMinResolution()).to.be(0.25);
+      expect(layer.get('foo')).to.be(42);
+      expect(layer.getLayerState()).to.eql({
+        layer: layer,
+        brightness: 0.5,
+        contrast: 10,
+        hue: 180,
+        opacity: 0.5,
+        saturation: 5,
+        visible: false,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: 500,
+        minResolution: 0.25
+      });
+
+      goog.dispose(layer);
+    });
+
+  });
+
+  describe('visibleAtResolution', function() {
+    var layer;
+
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('returns false if layer is not visible', function() {
+      layer.setVisible(false);
+      layer.setMinResolution(3);
+      layer.setMaxResolution(5);
+      var layerState = layer.getLayerState();
+      expect(ol.layer.Layer.visibleAtResolution(layerState, 4)).to.be(false);
+    });
+
+    it('returns false if resolution lower than minResolution', function() {
+      layer.setVisible(true);
+      layer.setMinResolution(3);
+      layer.setMaxResolution(5);
+      var layerState = layer.getLayerState();
+      expect(ol.layer.Layer.visibleAtResolution(layerState, 2)).to.be(false);
+    });
+
+    it('returns false if resolution greater than maxResolution', function() {
+      layer.setVisible(true);
+      layer.setMinResolution(3);
+      layer.setMaxResolution(5);
+      var layerState = layer.getLayerState();
+      expect(ol.layer.Layer.visibleAtResolution(layerState, 6)).to.be(false);
+    });
+
+    it('returns true otherwise', function() {
+      layer.setVisible(true);
+      layer.setMinResolution(3);
+      layer.setMaxResolution(5);
+      var layerState = layer.getLayerState();
+      expect(ol.layer.Layer.visibleAtResolution(layerState, 4)).to.be(true);
+    });
+
+  });
+
+  describe('#getLayerState', function() {
+
+    var layer;
+
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('returns a layerState from the properties values', function() {
+      layer.setBrightness(-0.7);
+      layer.setContrast(0.3);
+      layer.setHue(-0.3);
+      layer.setOpacity(0.3);
+      layer.setSaturation(0.3);
+      layer.setVisible(false);
+      layer.setMaxResolution(500);
+      layer.setMinResolution(0.25);
+      expect(layer.getLayerState()).to.eql({
+        layer: layer,
+        brightness: -0.7,
+        contrast: 0.3,
+        hue: -0.3,
+        opacity: 0.3,
+        saturation: 0.3,
+        visible: false,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: 500,
+        minResolution: 0.25
+      });
+    });
+
+    it('returns a layerState with clamped values', function() {
+      layer.setBrightness(1.5);
+      layer.setContrast(-0.7);
+      layer.setHue(42);
+      layer.setOpacity(-1.5);
+      layer.setSaturation(-0.7);
+      layer.setVisible(false);
+      expect(layer.getLayerState()).to.eql({
+        layer: layer,
+        brightness: 1,
+        contrast: 0,
+        hue: 42,
+        opacity: 0,
+        saturation: 0,
+        visible: false,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: Infinity,
+        minResolution: 0
+      });
+
+      layer.setBrightness(-3);
+      layer.setContrast(42);
+      layer.setHue(-100);
+      layer.setOpacity(3);
+      layer.setSaturation(42);
+      layer.setVisible(true);
+      expect(layer.getLayerState()).to.eql({
+        layer: layer,
+        brightness: -1,
+        contrast: 42,
+        hue: -100,
+        opacity: 1,
+        saturation: 42,
+        visible: true,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: Infinity,
+        minResolution: 0
+      });
+    });
+
+  });
+
+  describe('#getSource', function() {
+
+    it('gets the layer source', function() {
+      var source = new ol.source.Source({projection: ol.proj.get('EPSG:4326')});
+      var layer = new ol.layer.Layer({source: source});
+      expect(layer.getSource()).to.be(source);
+    });
+
+  });
+
+  describe('#set("source", source)', function() {
+    var projection = ol.proj.get('EPSG:4326');
+
+    it('sets the layer source', function() {
+      var layer = new ol.layer.Layer({
+        source: new ol.source.Source({projection: projection})
+      });
+
+      var source = new ol.source.Source({projection: projection});
+      layer.set('source', source);
+      expect(layer.getSource()).to.be(source);
+    });
+
+    it('calls changed', function() {
+      var layer = new ol.layer.Layer({
+        source: new ol.source.Source({projection: projection})
+      });
+      sinon.spy(layer, 'changed');
+
+      var source = new ol.source.Source({projection: projection});
+      layer.set('source', source);
+      expect(layer.changed.calledOnce).to.be(true);
+    });
+
+    it('sets up event listeners', function() {
+      sinon.spy(ol.layer.Layer.prototype, 'handleSourceChange_');
+
+      var first = new ol.source.Source({projection: projection});
+      var layer = new ol.layer.Layer({source: first});
+
+      first.setState(ol.source.State.READY);
+      expect(layer.handleSourceChange_.calledOnce).to.be(true);
+
+      var second = new ol.source.Source({projection: projection});
+      layer.set('source', second);
+
+      expect(layer.handleSourceChange_.calledOnce).to.be(true);
+      second.setState(ol.source.State.READY);
+      expect(layer.handleSourceChange_.callCount).to.be(2);
+
+      // remove spy
+      ol.layer.Layer.prototype.handleSourceChange_.restore();
+    });
+
+  });
+
+  describe('#setSource()', function() {
+    var projection = ol.proj.get('EPSG:4326');
+
+    it('sets the layer source', function() {
+      var layer = new ol.layer.Layer({
+        source: new ol.source.Source({projection: projection})
+      });
+
+      var source = new ol.source.Source({projection: projection});
+      layer.setSource(source);
+      expect(layer.getSource()).to.be(source);
+    });
+
+    it('calls changed', function() {
+      var layer = new ol.layer.Layer({
+        source: new ol.source.Source({projection: projection})
+      });
+      sinon.spy(layer, 'changed');
+
+      var source = new ol.source.Source({projection: projection});
+      layer.setSource(source);
+      expect(layer.changed.calledOnce).to.be(true);
+    });
+
+    it('sets up event listeners', function() {
+      sinon.spy(ol.layer.Layer.prototype, 'handleSourceChange_');
+
+      var first = new ol.source.Source({projection: projection});
+      var layer = new ol.layer.Layer({source: first});
+
+      first.setState(ol.source.State.READY);
+      expect(layer.handleSourceChange_.calledOnce).to.be(true);
+
+      var second = new ol.source.Source({projection: projection});
+      layer.setSource(second);
+
+      expect(layer.handleSourceChange_.calledOnce).to.be(true);
+      second.setState(ol.source.State.READY);
+      expect(layer.handleSourceChange_.callCount).to.be(2);
+
+      // remove spy
+      ol.layer.Layer.prototype.handleSourceChange_.restore();
+    });
+
+  });
+
+  describe('#setBrightness', function() {
+
+    var layer;
+
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('accepts a positive number', function() {
+      layer.setBrightness(0.3);
+      expect(layer.getBrightness()).to.be(0.3);
+    });
+
+    it('accepts a negative number', function() {
+      layer.setBrightness(-0.7);
+      expect(layer.getBrightness()).to.be(-0.7);
+    });
+
+    it('triggers a change event', function() {
+      var listener = sinon.spy();
+      layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
+      layer.setBrightness(0.5);
+      expect(listener.calledOnce).to.be(true);
+    });
+
+  });
+
+  describe('#setContrast', function() {
+
+    var layer;
+
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('accepts a small positive number', function() {
+      layer.setContrast(0.3);
+      expect(layer.getContrast()).to.be(0.3);
+    });
+
+    it('accepts a big positive number', function() {
+      layer.setContrast(42);
+      expect(layer.getContrast()).to.be(42);
+    });
+
+    it('triggers a change event', function() {
+      var listener = sinon.spy();
+      layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
+      layer.setContrast(43);
+      expect(listener.calledOnce).to.be(true);
+    });
+
+  });
+
+
+  describe('#setHue', function() {
+
+    var layer;
+
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('accepts a small positive number', function() {
+      layer.setHue(0.3);
+      expect(layer.getHue()).to.be(0.3);
+    });
+
+    it('accepts a small negative number', function() {
+      layer.setHue(-0.7);
+      expect(layer.getHue()).to.be(-0.7);
+    });
+
+    it('accepts a big positive number', function() {
+      layer.setHue(42);
+      expect(layer.getHue()).to.be(42);
+    });
+
+    it('accepts a big negative number', function() {
+      layer.setHue(-100);
+      expect(layer.getHue()).to.be(-100);
+    });
+
+    it('triggers a change event', function() {
+      var listener = sinon.spy();
+      layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
+      layer.setHue(0.5);
+      expect(listener.calledOnce).to.be(true);
+    });
+
+  });
+
+
+  describe('#setOpacity', function() {
+
+    var layer;
+
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('accepts a positive number', function() {
+      layer.setOpacity(0.3);
+      expect(layer.getOpacity()).to.be(0.3);
+    });
+
+    it('triggers a change event', function() {
+      var listener = sinon.spy();
+      layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
+      layer.setOpacity(0.4);
+      expect(listener.calledOnce).to.be(true);
+    });
+
+  });
+
+
+  describe('#setSaturation', function() {
+
+    var layer;
+
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('accepts a small positive number', function() {
+      layer.setSaturation(0.3);
+      expect(layer.getSaturation()).to.be(0.3);
+    });
+
+    it('accepts a big positive number', function() {
+      layer.setSaturation(42);
+      expect(layer.getSaturation()).to.be(42);
+    });
+
+    it('triggers a change event', function() {
+      var listener = sinon.spy();
+      layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
+      layer.setSaturation(42);
+      expect(listener.calledOnce).to.be(true);
+    });
+
+  });
+
+
+  describe('#setVisible', function() {
+
+    var layer;
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: ol.proj.get('EPSG:4326')
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(layer);
+    });
+
+    it('sets visible property', function() {
+      layer.setVisible(false);
+      expect(layer.getVisible()).to.be(false);
+
+      layer.setVisible(true);
+      expect(layer.getVisible()).to.be(true);
+    });
+
+    it('fires a change event', function() {
+      var listener = sinon.spy();
+      layer.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
+
+      layer.setVisible(false);
+      expect(listener.callCount).to.be(1);
+
+      layer.setVisible(true);
+      expect(listener.callCount).to.be(2);
+    });
+
+  });
+
+});
+
+goog.require('goog.dispose');
+goog.require('ol.ObjectEventType');
+goog.require('ol.layer.Layer');
+goog.require('ol.proj');
+goog.require('ol.source.Source');
+goog.require('ol.source.State');
diff --git a/test/spec/ol/layer/layergroup.test.js b/test/spec/ol/layer/layergroup.test.js
new file mode 100644
index 0000000..3430969
--- /dev/null
+++ b/test/spec/ol/layer/layergroup.test.js
@@ -0,0 +1,498 @@
+goog.provide('ol.test.layer.LayerGroup');
+
+describe('ol.layer.Group', function() {
+
+  describe('constructor (defaults)', function() {
+
+    var layerGroup;
+
+    beforeEach(function() {
+      layerGroup = new ol.layer.Group();
+    });
+
+    afterEach(function() {
+      goog.dispose(layerGroup);
+    });
+
+    it('creates an instance', function() {
+      expect(layerGroup).to.be.a(ol.layer.Group);
+    });
+
+    it('provides default brightness', function() {
+      expect(layerGroup.getBrightness()).to.be(0);
+    });
+
+    it('provides default contrast', function() {
+      expect(layerGroup.getContrast()).to.be(1);
+    });
+
+    it('provides default hue', function() {
+      expect(layerGroup.getHue()).to.be(0);
+    });
+
+    it('provides default opacity', function() {
+      expect(layerGroup.getOpacity()).to.be(1);
+    });
+
+    it('provides default saturation', function() {
+      expect(layerGroup.getSaturation()).to.be(1);
+    });
+
+    it('provides default visibility', function() {
+      expect(layerGroup.getVisible()).to.be(true);
+    });
+
+    it('provides default layerState', function() {
+      expect(layerGroup.getLayerState()).to.eql({
+        layer: layerGroup,
+        brightness: 0,
+        contrast: 1,
+        hue: 0,
+        opacity: 1,
+        saturation: 1,
+        visible: true,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: Infinity,
+        minResolution: 0
+      });
+    });
+
+    it('provides default empty layers collection', function() {
+      expect(layerGroup.getLayers()).to.be.a(ol.Collection);
+      expect(layerGroup.getLayers().getLength()).to.be(0);
+    });
+
+  });
+
+  describe('generic change event', function() {
+
+    var layer, group, listener;
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: 'EPSG:4326'
+        })
+      });
+      group = new ol.layer.Group({
+        layers: [layer]
+      });
+      listener = sinon.spy();
+    });
+
+    afterEach(function() {
+      goog.dispose(group);
+      goog.dispose(layer);
+    });
+
+    it('is dispatched by the group when layer opacity changes', function() {
+      group.on(goog.events.EventType.CHANGE, listener);
+
+      layer.setOpacity(0.5);
+      expect(listener.calledOnce).to.be(true);
+    });
+
+    it('is dispatched by the group when layer visibility changes', function() {
+      group.on(goog.events.EventType.CHANGE, listener);
+
+      layer.setVisible(false);
+      expect(listener.callCount).to.be(1);
+
+      layer.setVisible(true);
+      expect(listener.callCount).to.be(2);
+    });
+
+  });
+
+  describe('property change event', function() {
+
+    var layer, group, listener;
+    beforeEach(function() {
+      layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: 'EPSG:4326'
+        })
+      });
+      group = new ol.layer.Group({
+        layers: [layer]
+      });
+      listener = sinon.spy();
+    });
+
+    afterEach(function() {
+      goog.dispose(group);
+      goog.dispose(layer);
+    });
+
+    it('is dispatched by the group when group opacity changes', function() {
+      group.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
+
+      group.setOpacity(0.5);
+      expect(listener.calledOnce).to.be(true);
+    });
+
+    it('is dispatched by the group when group visibility changes', function() {
+      group.on(ol.ObjectEventType.PROPERTYCHANGE, listener);
+
+      group.setVisible(false);
+      expect(listener.callCount).to.be(1);
+
+      group.setVisible(true);
+      expect(listener.callCount).to.be(2);
+    });
+
+  });
+
+  describe('constructor (options)', function() {
+
+    it('accepts options', function() {
+      var layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: 'EPSG:4326'
+        })
+      });
+      var layerGroup = new ol.layer.Group({
+        layers: [layer],
+        brightness: 0.5,
+        contrast: 10,
+        hue: 180,
+        opacity: 0.5,
+        saturation: 5,
+        visible: false,
+        maxResolution: 500,
+        minResolution: 0.25
+      });
+
+      expect(layerGroup.getBrightness()).to.be(0.5);
+      expect(layerGroup.getContrast()).to.be(10);
+      expect(layerGroup.getHue()).to.be(180);
+      expect(layerGroup.getOpacity()).to.be(0.5);
+      expect(layerGroup.getSaturation()).to.be(5);
+      expect(layerGroup.getVisible()).to.be(false);
+      expect(layerGroup.getMaxResolution()).to.be(500);
+      expect(layerGroup.getMinResolution()).to.be(0.25);
+      expect(layerGroup.getLayerState()).to.eql({
+        layer: layerGroup,
+        brightness: 0.5,
+        contrast: 10,
+        hue: 180,
+        opacity: 0.5,
+        saturation: 5,
+        visible: false,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: 500,
+        minResolution: 0.25
+      });
+      expect(layerGroup.getLayers()).to.be.a(ol.Collection);
+      expect(layerGroup.getLayers().getLength()).to.be(1);
+      expect(layerGroup.getLayers().item(0)).to.be(layer);
+
+      goog.dispose(layer);
+      goog.dispose(layerGroup);
+    });
+
+    it('accepts an extent option', function() {
+      var layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: 'EPSG:4326'
+        })
+      });
+
+      var groupExtent = [-10, -5, 10, 5];
+      var layerGroup = new ol.layer.Group({
+        layers: [layer],
+        brightness: 0.5,
+        contrast: 10,
+        hue: 180,
+        opacity: 0.5,
+        saturation: 5,
+        visible: false,
+        extent: groupExtent,
+        maxResolution: 500,
+        minResolution: 0.25
+      });
+
+      expect(layerGroup.getBrightness()).to.be(0.5);
+      expect(layerGroup.getContrast()).to.be(10);
+      expect(layerGroup.getHue()).to.be(180);
+      expect(layerGroup.getOpacity()).to.be(0.5);
+      expect(layerGroup.getSaturation()).to.be(5);
+      expect(layerGroup.getVisible()).to.be(false);
+      expect(layerGroup.getExtent()).to.eql(groupExtent);
+      expect(layerGroup.getMaxResolution()).to.be(500);
+      expect(layerGroup.getMinResolution()).to.be(0.25);
+      expect(layerGroup.getLayerState()).to.eql({
+        layer: layerGroup,
+        brightness: 0.5,
+        contrast: 10,
+        hue: 180,
+        opacity: 0.5,
+        saturation: 5,
+        visible: false,
+        sourceState: ol.source.State.READY,
+        extent: groupExtent,
+        maxResolution: 500,
+        minResolution: 0.25
+      });
+      expect(layerGroup.getLayers()).to.be.a(ol.Collection);
+      expect(layerGroup.getLayers().getLength()).to.be(1);
+      expect(layerGroup.getLayers().item(0)).to.be(layer);
+
+      goog.dispose(layer);
+      goog.dispose(layerGroup);
+    });
+  });
+
+  describe('#getLayerState', function() {
+
+    var layerGroup;
+
+    beforeEach(function() {
+      layerGroup = new ol.layer.Group();
+    });
+
+    afterEach(function() {
+      goog.dispose(layerGroup);
+    });
+
+    it('returns a layerState from the properties values', function() {
+      layerGroup.setBrightness(-0.7);
+      layerGroup.setContrast(0.3);
+      layerGroup.setHue(-0.3);
+      layerGroup.setOpacity(0.3);
+      layerGroup.setSaturation(0.3);
+      layerGroup.setVisible(false);
+      var groupExtent = [-100, 50, 100, 50];
+      layerGroup.setExtent(groupExtent);
+      layerGroup.setMaxResolution(500);
+      layerGroup.setMinResolution(0.25);
+      expect(layerGroup.getLayerState()).to.eql({
+        layer: layerGroup,
+        brightness: -0.7,
+        contrast: 0.3,
+        hue: -0.3,
+        opacity: 0.3,
+        saturation: 0.3,
+        visible: false,
+        sourceState: ol.source.State.READY,
+        extent: groupExtent,
+        maxResolution: 500,
+        minResolution: 0.25
+      });
+    });
+
+    it('returns a layerState with clamped values', function() {
+      layerGroup.setBrightness(1.5);
+      layerGroup.setContrast(-0.7);
+      layerGroup.setHue(42);
+      layerGroup.setOpacity(-1.5);
+      layerGroup.setSaturation(-0.7);
+      layerGroup.setVisible(false);
+      expect(layerGroup.getLayerState()).to.eql({
+        layer: layerGroup,
+        brightness: 1,
+        contrast: 0,
+        hue: 42,
+        opacity: 0,
+        saturation: 0,
+        visible: false,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: Infinity,
+        minResolution: 0
+      });
+
+      layerGroup.setBrightness(-3);
+      layerGroup.setContrast(42);
+      layerGroup.setHue(-100);
+      layerGroup.setOpacity(3);
+      layerGroup.setSaturation(42);
+      layerGroup.setVisible(true);
+      expect(layerGroup.getLayerState()).to.eql({
+        layer: layerGroup,
+        brightness: -1,
+        contrast: 42,
+        hue: -100,
+        opacity: 1,
+        saturation: 42,
+        visible: true,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: Infinity,
+        minResolution: 0
+      });
+    });
+
+  });
+
+
+  describe('#setLayers', function() {
+
+    it('sets layers property', function() {
+      var layer = new ol.layer.Layer({
+        source: new ol.source.Source({
+          projection: 'EPSG:4326'
+        })
+      });
+      var layers = new ol.Collection([layer]);
+      var layerGroup = new ol.layer.Group();
+
+      layerGroup.setLayers(layers);
+      expect(layerGroup.getLayers()).to.be(layers);
+
+      layerGroup.setLayers(null);
+      expect(layerGroup.getLayers()).to.be(null);
+
+      goog.dispose(layerGroup);
+      goog.dispose(layer);
+      goog.dispose(layers);
+    });
+
+  });
+
+
+  describe('#getLayerStatesArray', function() {
+
+    it('returns an empty array if no layer', function() {
+      var layerGroup = new ol.layer.Group();
+
+      var layerStatesArray = layerGroup.getLayerStatesArray();
+      expect(layerStatesArray).to.be.a(Array);
+      expect(layerStatesArray.length).to.be(0);
+
+      goog.dispose(layerGroup);
+    });
+
+    var layer1 = new ol.layer.Layer({
+      source: new ol.source.Source({
+        projection: 'EPSG:4326'
+      })
+    });
+    var layer2 = new ol.layer.Layer({
+      source: new ol.source.Source({
+        projection: 'EPSG:4326'
+      }),
+      brightness: 0.5,
+      contrast: 10,
+      hue: 180,
+      opacity: 0.5,
+      saturation: 5,
+      visible: false,
+      maxResolution: 500,
+      minResolution: 0.25
+    });
+    var layer3 = new ol.layer.Layer({
+      source: new ol.source.Source({
+        projection: 'EPSG:4326'
+      }),
+      extent: [-5, -2, 5, 2]
+    });
+
+    it('does not transform layerStates by default', function() {
+      var layerGroup = new ol.layer.Group({
+        layers: [layer1, layer2]
+      });
+
+      var layerStatesArray = layerGroup.getLayerStatesArray();
+      expect(layerStatesArray).to.be.a(Array);
+      expect(layerStatesArray.length).to.be(2);
+      expect(layerStatesArray[0]).to.eql(layer1.getLayerState());
+
+      // layer state should match except for layer reference
+      var layerState = goog.object.clone(layerStatesArray[0]);
+      delete layerState.layer;
+      var groupState = goog.object.clone(layerGroup.getLayerState());
+      delete groupState.layer;
+      expect(layerState).to.eql(groupState);
+
+      expect(layerStatesArray[1]).to.eql(layer2.getLayerState());
+
+      goog.dispose(layerGroup);
+    });
+
+    it('uses the layer group extent if layer has no extent', function() {
+      var groupExtent = [-10, -5, 10, 5];
+      var layerGroup = new ol.layer.Group({
+        extent: groupExtent,
+        layers: [layer1]
+      });
+      var layerStatesArray = layerGroup.getLayerStatesArray();
+      expect(layerStatesArray[0].extent).to.eql(groupExtent);
+      goog.dispose(layerGroup);
+    });
+
+    it('uses the intersection of group and child extent', function() {
+      var groupExtent = [-10, -5, 10, 5];
+      var layerGroup = new ol.layer.Group({
+        extent: groupExtent,
+        layers: [layer3]
+      });
+      var layerStatesArray = layerGroup.getLayerStatesArray();
+      expect(layerStatesArray[0].extent).to.eql(
+          ol.extent.getIntersection(layer3.getExtent(), groupExtent));
+      goog.dispose(layerGroup);
+    });
+
+    it('transforms layerStates correctly', function() {
+      var layerGroup = new ol.layer.Group({
+        layers: [layer1, layer2],
+        brightness: 0.5,
+        contrast: 10,
+        hue: 180,
+        opacity: 0.5,
+        saturation: 5,
+        visible: false,
+        maxResolution: 150,
+        minResolution: 0.2
+      });
+
+      var layerStatesArray = layerGroup.getLayerStatesArray();
+
+      // compare layer state to group state
+      var groupState, layerState;
+
+      // layer state should match except for layer reference
+      layerState = goog.object.clone(layerStatesArray[0]);
+      delete layerState.layer;
+      groupState = goog.object.clone(layerGroup.getLayerState());
+      delete groupState.layer;
+      expect(layerState).to.eql(groupState);
+
+      // layer state should be transformed (and we ignore layer reference)
+      layerState = goog.object.clone(layerStatesArray[1]);
+      delete layerState.layer;
+      expect(layerState).to.eql({
+        brightness: 1,
+        contrast: 100,
+        hue: 360,
+        opacity: 0.25,
+        saturation: 25,
+        visible: false,
+        sourceState: ol.source.State.READY,
+        extent: undefined,
+        maxResolution: 150,
+        minResolution: 0.25
+      });
+
+      goog.dispose(layerGroup);
+    });
+
+    goog.dispose(layer1);
+    goog.dispose(layer2);
+    goog.dispose(layer3);
+
+  });
+
+});
+
+goog.require('goog.dispose');
+goog.require('goog.events.EventType');
+goog.require('goog.object');
+goog.require('ol.ObjectEventType');
+goog.require('ol.extent');
+goog.require('ol.layer.Layer');
+goog.require('ol.layer.Group');
+goog.require('ol.source.Source');
+goog.require('ol.source.State');
+goog.require('ol.Collection');
diff --git a/test/spec/ol/layer/vectorlayer.test.js b/test/spec/ol/layer/vectorlayer.test.js
new file mode 100644
index 0000000..79abfe2
--- /dev/null
+++ b/test/spec/ol/layer/vectorlayer.test.js
@@ -0,0 +1,129 @@
+goog.provide('ol.test.layer.Vector');
+
+goog.require('ol.feature');
+
+describe('ol.layer.Vector', function() {
+
+  describe('constructor', function() {
+    var source = new ol.source.Vector();
+    var style = new ol.style.Style();
+
+    it('creates a new layer', function() {
+      var layer = new ol.layer.Vector({source: source});
+      expect(layer).to.be.a(ol.layer.Vector);
+      expect(layer).to.be.a(ol.layer.Layer);
+    });
+
+    it('accepts a style option with a single style', function() {
+      var layer = new ol.layer.Vector({
+        source: source,
+        style: style
+      });
+
+      var styleFunction = layer.getStyleFunction();
+      expect(styleFunction()).to.eql([style]);
+    });
+
+    it('accepts a style option with an array of styles', function() {
+      var layer = new ol.layer.Vector({
+        source: source,
+        style: [style]
+      });
+
+      var styleFunction = layer.getStyleFunction();
+      expect(styleFunction()).to.eql([style]);
+    });
+
+    it('accepts a style option with a style function', function() {
+      var layer = new ol.layer.Vector({
+        source: source,
+        style: function(feature, resolution) {
+          return [style];
+        }
+      });
+
+      var styleFunction = layer.getStyleFunction();
+      expect(styleFunction()).to.eql([style]);
+    });
+
+  });
+
+  describe('#setStyle()', function() {
+
+    var layer, style;
+
+    beforeEach(function() {
+      layer = new ol.layer.Vector({
+        source: new ol.source.Vector()
+      });
+      style = new ol.style.Style();
+    });
+
+    it('allows the style to be set after construction', function() {
+      layer.setStyle(style);
+      expect(layer.getStyle()).to.be(style);
+    });
+
+    it('dispatches the change event', function(done) {
+      layer.on('change', function() {
+        done();
+      });
+      layer.setStyle(style);
+    });
+
+    it('updates the internal style function', function() {
+      expect(layer.getStyleFunction()).to.be(ol.style.defaultStyleFunction);
+      layer.setStyle(style);
+      expect(layer.getStyleFunction()).not.to.be(
+          ol.style.defaultStyleFunction);
+    });
+
+    it('allows setting an null style', function() {
+      layer.setStyle(null);
+      expect(layer.getStyle()).to.be(null);
+      expect(layer.getStyleFunction()).to.be(undefined);
+    });
+
+    it('sets the default style when passing undefined', function() {
+      layer.setStyle(style);
+      layer.setStyle(undefined);
+      expect(layer.getStyle()).to.be(ol.style.defaultStyleFunction);
+      expect(layer.getStyleFunction()).to.be(ol.style.defaultStyleFunction);
+    });
+
+  });
+
+  describe('#getStyle()', function() {
+
+    var source = new ol.source.Vector();
+    var style = new ol.style.Style();
+
+    it('returns what is provided to setStyle', function() {
+      var layer = new ol.layer.Vector({
+        source: source
+      });
+
+      expect(layer.getStyle()).to.be(ol.style.defaultStyleFunction);
+
+      layer.setStyle(style);
+      expect(layer.getStyle()).to.be(style);
+
+      layer.setStyle([style]);
+      expect(layer.getStyle()).to.eql([style]);
+
+      var styleFunction = function(feature, resolution) {
+        return [style];
+      };
+      layer.setStyle(styleFunction);
+      expect(layer.getStyle()).to.be(styleFunction);
+
+    });
+
+  });
+
+});
+
+goog.require('ol.layer.Layer');
+goog.require('ol.layer.Vector');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Style');
diff --git a/test/spec/ol/map.test.js b/test/spec/ol/map.test.js
new file mode 100644
index 0000000..ef6a658
--- /dev/null
+++ b/test/spec/ol/map.test.js
@@ -0,0 +1,255 @@
+goog.provide('ol.test.Map');
+
+describe('ol.Map', function() {
+
+  describe('constructor', function() {
+    it('creates a new map', function() {
+      var map = new ol.Map({});
+      expect(map).to.be.a(ol.Map);
+    });
+
+    it('creates a set of default interactions', function() {
+      var map = new ol.Map({});
+      var interactions = map.getInteractions();
+      var length = interactions.getLength();
+      expect(length).to.be.greaterThan(0);
+
+      for (var i = 0; i < length; ++i) {
+        expect(interactions.item(i).getMap()).to.be(map);
+      }
+    });
+  });
+
+  describe('#addInteraction()', function() {
+    it('adds an interaction to the map', function() {
+      var map = new ol.Map({});
+      var interaction = new ol.interaction.Interaction({});
+
+      var before = map.getInteractions().getLength();
+      map.addInteraction(interaction);
+      var after = map.getInteractions().getLength();
+      expect(after).to.be(before + 1);
+      expect(interaction.getMap()).to.be(map);
+    });
+  });
+
+  describe('#removeInteraction()', function() {
+    it('removes an interaction from the map', function() {
+      var map = new ol.Map({});
+      var interaction = new ol.interaction.Interaction({});
+
+      var before = map.getInteractions().getLength();
+      map.addInteraction(interaction);
+
+      map.removeInteraction(interaction);
+      expect(map.getInteractions().getLength()).to.be(before);
+
+      expect(interaction.getMap()).to.be(null);
+    });
+  });
+
+  describe('moveend event', function() {
+
+    var target, view, map;
+
+    beforeEach(function() {
+      target = document.createElement('div');
+
+      var style = target.style;
+      style.position = 'absolute';
+      style.left = '-1000px';
+      style.top = '-1000px';
+      style.width = '360px';
+      style.height = '180px';
+      document.body.appendChild(target);
+
+      view = new ol.View({
+        projection: 'EPSG:4326'
+      });
+      map = new ol.Map({
+        target: target,
+        view: view,
+        layers: [
+          new ol.layer.Tile({
+            source: new ol.source.XYZ({
+              url: '#{x}/{y}/{z}'
+            })
+          })
+        ]
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(map);
+      document.body.removeChild(target);
+    });
+
+    it('is fired only once after view changes', function(done) {
+      var center = [10, 20];
+      var zoom = 3;
+      var calls = 0;
+      map.on('moveend', function() {
+        ++calls;
+        expect(calls).to.be(1);
+        expect(view.getCenter()).to.eql(center);
+        expect(view.getZoom()).to.be(zoom);
+        window.setTimeout(done, 1000);
+      });
+
+      view.setCenter(center);
+      view.setZoom(zoom);
+    });
+
+  });
+
+  describe('#render()', function() {
+
+    var target, map;
+
+    beforeEach(function() {
+      target = document.createElement('div');
+      var style = target.style;
+      style.position = 'absolute';
+      style.left = '-1000px';
+      style.top = '-1000px';
+      style.width = '360px';
+      style.height = '180px';
+      document.body.appendChild(target);
+      map = new ol.Map({
+        target: target,
+        view: new ol.View({
+          projection: 'EPSG:4326',
+          center: [0, 0],
+          resolution: 1
+        })
+      });
+    });
+
+    afterEach(function() {
+      goog.dispose(map);
+      document.body.removeChild(target);
+    });
+
+    it('results in an postrender event', function(done) {
+
+      map.render();
+      map.on('postrender', function(event) {
+        expect(event).to.be.a(ol.MapEvent);
+        var frameState = event.frameState;
+        expect(frameState).not.to.be(null);
+        done();
+      });
+
+    });
+
+    it('results in an postrender event (for zero height map)', function(done) {
+      target.style.height = '0px';
+      map.updateSize();
+
+      map.render();
+      map.on('postrender', function(event) {
+        expect(event).to.be.a(ol.MapEvent);
+        var frameState = event.frameState;
+        expect(frameState).to.be(null);
+        done();
+      });
+
+    });
+
+    it('results in an postrender event (for zero width map)', function(done) {
+      target.style.width = '0px';
+      map.updateSize();
+
+      map.render();
+      map.on('postrender', function(event) {
+        expect(event).to.be.a(ol.MapEvent);
+        var frameState = event.frameState;
+        expect(frameState).to.be(null);
+        done();
+      });
+
+    });
+
+  });
+
+  describe('dispose', function() {
+    var map;
+
+    beforeEach(function() {
+      map = new ol.Map({
+        target: document.createElement('div')
+      });
+    });
+
+    it('removes the viewport from its parent', function() {
+      goog.dispose(map);
+      expect(goog.dom.getParentElement(map.getViewport())).to.be(null);
+    });
+  });
+
+  describe('create interactions', function() {
+
+    var options;
+
+    beforeEach(function() {
+      options = {
+        altShiftDragRotate: false,
+        doubleClickZoom: false,
+        keyboard: false,
+        mouseWheelZoom: false,
+        shiftDragZoom: false,
+        dragPan: false,
+        pinchRotate: false,
+        pinchZoom: false
+      };
+    });
+
+    describe('create mousewheel interaction', function() {
+      it('creates mousewheel interaction', function() {
+        options.mouseWheelZoom = true;
+        var interactions = ol.interaction.defaults(options);
+        expect(interactions.getLength()).to.eql(1);
+        expect(interactions.item(0)).to.be.a(ol.interaction.MouseWheelZoom);
+      });
+    });
+
+    describe('create double click interaction', function() {
+
+      beforeEach(function() {
+        options.doubleClickZoom = true;
+      });
+
+      describe('default zoomDelta', function() {
+        it('create double click interaction with default delta', function() {
+          var interactions = ol.interaction.defaults(options);
+          expect(interactions.getLength()).to.eql(1);
+          expect(interactions.item(0)).to.be.a(ol.interaction.DoubleClickZoom);
+          expect(interactions.item(0).delta_).to.eql(1);
+        });
+      });
+
+      describe('set zoomDelta', function() {
+        it('create double click interaction with set delta', function() {
+          options.zoomDelta = 7;
+          var interactions = ol.interaction.defaults(options);
+          expect(interactions.getLength()).to.eql(1);
+          expect(interactions.item(0)).to.be.a(ol.interaction.DoubleClickZoom);
+          expect(interactions.item(0).delta_).to.eql(7);
+        });
+      });
+    });
+  });
+
+});
+
+goog.require('goog.dispose');
+goog.require('goog.dom');
+goog.require('ol.Map');
+goog.require('ol.MapEvent');
+goog.require('ol.View');
+goog.require('ol.interaction');
+goog.require('ol.interaction.Interaction');
+goog.require('ol.interaction.DoubleClickZoom');
+goog.require('ol.interaction.MouseWheelZoom');
+goog.require('ol.layer.Tile');
+goog.require('ol.source.XYZ');
diff --git a/test/spec/ol/mapbrowserevent.test.js b/test/spec/ol/mapbrowserevent.test.js
new file mode 100644
index 0000000..c046545
--- /dev/null
+++ b/test/spec/ol/mapbrowserevent.test.js
@@ -0,0 +1,126 @@
+goog.provide('ol.test.MapBrowserEventHandler');
+
+describe('ol.MapBrowserEventHandler', function() {
+  describe('#emulateClick_', function() {
+    var clock;
+    var handler;
+    var clickSpy;
+    var singleclickSpy;
+    var dblclickSpy;
+    var target;
+
+    beforeEach(function() {
+      clock = sinon.useFakeTimers();
+      target = goog.dom.createElement(goog.dom.TagName.DIV);
+      handler = new ol.MapBrowserEventHandler(new ol.Map({
+        target: target
+      }));
+
+      clickSpy = sinon.spy();
+      goog.events.listen(handler, 'click', clickSpy);
+
+      singleclickSpy = sinon.spy();
+      goog.events.listen(handler, 'singleclick', singleclickSpy);
+
+      dblclickSpy = sinon.spy();
+      goog.events.listen(handler, 'dblclick', dblclickSpy);
+
+    });
+
+    afterEach(function() {
+      clock.restore();
+    });
+
+    it('emulates click', function() {
+      handler.emulateClick_(new ol.pointer.PointerEvent('pointerdown',
+          new goog.events.BrowserEvent({
+            type: 'mousedown',
+            target: target,
+            clientX: 0,
+            clientY: 0
+          })));
+      expect(clickSpy.called).to.be.ok();
+    });
+
+    it('emulates singleclick', function() {
+      handler.emulateClick_(new ol.pointer.PointerEvent('pointerdown',
+          new goog.events.BrowserEvent({
+            type: 'mousedown',
+            target: target,
+            clientX: 0,
+            clientY: 0
+          })));
+      expect(singleclickSpy.called).to.not.be.ok();
+      expect(dblclickSpy.called).to.not.be.ok();
+
+      clock.tick(250);
+      expect(singleclickSpy.calledOnce).to.be.ok();
+      expect(dblclickSpy.called).to.not.be.ok();
+
+      handler.emulateClick_(new ol.pointer.PointerEvent('pointerdown',
+          new goog.events.BrowserEvent({
+            type: 'mousedown',
+            target: target,
+            clientX: 0,
+            clientY: 0
+          })));
+      expect(singleclickSpy.calledOnce).to.be.ok();
+      expect(dblclickSpy.called).to.not.be.ok();
+    });
+
+    it('emulates dblclick', function() {
+      handler.emulateClick_(new ol.pointer.PointerEvent('pointerdown',
+          new goog.events.BrowserEvent({
+            type: 'mousedown',
+            target: target,
+            clientX: 0,
+            clientY: 0
+          })));
+      expect(singleclickSpy.called).to.not.be.ok();
+      expect(dblclickSpy.called).to.not.be.ok();
+
+      handler.emulateClick_(new ol.pointer.PointerEvent('pointerdown',
+          new goog.events.BrowserEvent({
+            type: 'mousedown',
+            target: target,
+            clientX: 0,
+            clientY: 0
+          })));
+      expect(singleclickSpy.called).to.not.be.ok();
+      expect(dblclickSpy.calledOnce).to.be.ok();
+
+      clock.tick(250);
+      expect(singleclickSpy.called).to.not.be.ok();
+      expect(dblclickSpy.calledOnce).to.be.ok();
+    });
+
+  });
+
+  describe('#getDown()', function() {
+
+    var handler;
+    beforeEach(function() {
+      handler = new ol.MapBrowserEventHandler(new ol.Map({}));
+    });
+
+    it('returns null if no "down" type event has been handled', function() {
+      expect(handler.getDown()).to.be(null);
+    });
+
+    it('returns an event after handlePointerDown_ has been called', function() {
+      var event = new ol.pointer.PointerEvent('pointerdown',
+          new goog.events.BrowserEvent({}));
+      handler.handlePointerDown_(event);
+      expect(handler.getDown()).to.be(event);
+    });
+
+  });
+});
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.BrowserEvent');
+goog.require('ol.Map');
+goog.require('ol.MapBrowserEventHandler');
+goog.require('ol.pointer.PointerEvent');
diff --git a/test/spec/ol/math.test.js b/test/spec/ol/math.test.js
new file mode 100644
index 0000000..a732474
--- /dev/null
+++ b/test/spec/ol/math.test.js
@@ -0,0 +1,174 @@
+goog.provide('ol.test.math');
+
+
+describe('ol.math.cosh', function() {
+
+  it('returns the correct value at -Infinity', function() {
+    expect(ol.math.cosh(-Infinity)).to.eql(Infinity);
+  });
+
+  it('returns the correct value at -1', function() {
+    expect(ol.math.cosh(-1)).to.roughlyEqual(1.5430806348152437, 1e-9);
+  });
+
+  it('returns the correct value at 0', function() {
+    expect(ol.math.cosh(0)).to.eql(1);
+  });
+
+  it('returns the correct value at 1', function() {
+    expect(ol.math.cosh(1)).to.roughlyEqual(1.5430806348152437, 1e-9);
+  });
+
+  it('returns the correct value at Infinity', function() {
+    expect(ol.math.cosh(Infinity)).to.eql(Infinity);
+  });
+
+});
+
+
+describe('ol.math.coth', function() {
+
+  it('returns the correct value at -1', function() {
+    expect(ol.math.coth(-1)).to.roughlyEqual(-1.3130352854993312, 1e-9);
+  });
+
+  it('returns the correct value at 1', function() {
+    expect(ol.math.coth(1)).to.roughlyEqual(1.3130352854993312, 1e-9);
+  });
+
+  it('returns the correct value at Infinity', function() {
+    expect(ol.math.coth(Infinity)).to.eql(1);
+  });
+
+});
+
+
+describe('ol.math.csch', function() {
+
+  it('returns the correct value at -Infinity', function() {
+    expect(ol.math.csch(-Infinity)).to.eql(0);
+  });
+
+  it('returns the correct value at -1', function() {
+    expect(ol.math.csch(-1)).to.roughlyEqual(-0.85091812823932156, 1e-9);
+  });
+
+  it('returns the correct value at 1', function() {
+    expect(ol.math.csch(1)).to.roughlyEqual(0.85091812823932156, 1e-9);
+  });
+
+  it('returns the correct value at Infinity', function() {
+    expect(ol.math.csch(Infinity)).to.eql(0);
+  });
+
+});
+
+
+describe('ol.math.roundUpToPowerOfTwo', function() {
+
+  it('raises an exception when x is negative', function() {
+    expect(function() {
+      ol.math.roundUpToPowerOfTwo(-1);
+    }).to.throwException();
+  });
+
+  it('raises an exception when x is zero', function() {
+    expect(function() {
+      ol.math.roundUpToPowerOfTwo(0);
+    }).to.throwException();
+  });
+
+  it('returns the expected value for simple powers of two', function() {
+    expect(ol.math.roundUpToPowerOfTwo(1)).to.be(1);
+    expect(ol.math.roundUpToPowerOfTwo(2)).to.be(2);
+    expect(ol.math.roundUpToPowerOfTwo(4)).to.be(4);
+    expect(ol.math.roundUpToPowerOfTwo(8)).to.be(8);
+    expect(ol.math.roundUpToPowerOfTwo(16)).to.be(16);
+    expect(ol.math.roundUpToPowerOfTwo(32)).to.be(32);
+    expect(ol.math.roundUpToPowerOfTwo(64)).to.be(64);
+    expect(ol.math.roundUpToPowerOfTwo(128)).to.be(128);
+    expect(ol.math.roundUpToPowerOfTwo(256)).to.be(256);
+  });
+
+  it('returns the expected value for simple powers of ten', function() {
+    expect(ol.math.roundUpToPowerOfTwo(1)).to.be(1);
+    expect(ol.math.roundUpToPowerOfTwo(10)).to.be(16);
+    expect(ol.math.roundUpToPowerOfTwo(100)).to.be(128);
+    expect(ol.math.roundUpToPowerOfTwo(1000)).to.be(1024);
+    expect(ol.math.roundUpToPowerOfTwo(10000)).to.be(16384);
+    expect(ol.math.roundUpToPowerOfTwo(100000)).to.be(131072);
+    expect(ol.math.roundUpToPowerOfTwo(1000000)).to.be(1048576);
+    expect(ol.math.roundUpToPowerOfTwo(10000000)).to.be(16777216);
+  });
+
+});
+
+
+describe('ol.math.sech', function() {
+
+  it('returns the correct value at -Infinity', function() {
+    expect(ol.math.sech(-Infinity)).to.eql(0);
+  });
+
+  it('returns the correct value at -1', function() {
+    expect(ol.math.sech(-1)).to.roughlyEqual(0.64805427366388535, 1e-9);
+  });
+
+  it('returns the correct value at 0', function() {
+    expect(ol.math.sech(0)).to.eql(1);
+  });
+
+  it('returns the correct value at 1', function() {
+    expect(ol.math.sech(1)).to.roughlyEqual(0.64805427366388535, 1e-9);
+  });
+
+  it('returns the correct value at Infinity', function() {
+    expect(ol.math.sech(Infinity)).to.eql(0);
+  });
+
+});
+
+
+describe('ol.math.sinh', function() {
+
+  it('returns the correct value at -Infinity', function() {
+    expect(ol.math.sinh(-Infinity)).to.eql(-Infinity);
+  });
+
+  it('returns the correct value at -1', function() {
+    expect(ol.math.sinh(-1)).to.roughlyEqual(-1.1752011936438014, 1e-9);
+  });
+
+  it('returns the correct value at 0', function() {
+    expect(ol.math.sinh(0)).to.eql(0);
+  });
+
+  it('returns the correct value at 1', function() {
+    expect(ol.math.sinh(1)).to.roughlyEqual(1.1752011936438014, 1e-9);
+  });
+
+  it('returns the correct value at Infinity', function() {
+    expect(ol.math.cosh(Infinity)).to.eql(Infinity);
+  });
+
+});
+
+
+describe('ol.math.tanh', function() {
+
+  it('returns the correct value at -1', function() {
+    expect(ol.math.tanh(-1)).to.roughlyEqual(-0.76159415595576485, 1e-9);
+  });
+
+  it('returns the correct value at 0', function() {
+    expect(ol.math.tanh(0)).to.eql(0);
+  });
+
+  it('returns the correct value at 1', function() {
+    expect(ol.math.tanh(1)).to.roughlyEqual(0.76159415595576485, 1e-9);
+  });
+
+});
+
+
+goog.require('ol.math');
diff --git a/test/spec/ol/object.test.js b/test/spec/ol/object.test.js
new file mode 100644
index 0000000..e8890aa
--- /dev/null
+++ b/test/spec/ol/object.test.js
@@ -0,0 +1,660 @@
+goog.provide('ol.test.Object');
+
+describe('ol.Object', function() {
+
+  var o;
+  beforeEach(function() {
+    o = new ol.Object();
+  });
+
+  describe('get and set', function() {
+
+    describe('get an unset property', function() {
+      var v;
+      beforeEach(function() {
+        v = o.get('k');
+      });
+
+      it('returns undefined', function() {
+        expect(v).to.be(undefined);
+      });
+
+    });
+
+    describe('get a set property', function() {
+      var v;
+      beforeEach(function() {
+        o.set('k', 1);
+        v = o.get('k');
+      });
+
+      it('returns expected value', function() {
+        expect(v).to.eql(1);
+      });
+    });
+  });
+
+  describe('#get()', function() {
+
+    it('does not return values that are not explicitly set', function() {
+      var o = new ol.Object();
+      expect(o.get('constructor')).to.be(undefined);
+      expect(o.get('hasOwnProperty')).to.be(undefined);
+      expect(o.get('isPrototypeOf')).to.be(undefined);
+      expect(o.get('propertyIsEnumerable')).to.be(undefined);
+      expect(o.get('toLocaleString')).to.be(undefined);
+      expect(o.get('toString')).to.be(undefined);
+      expect(o.get('valueOf')).to.be(undefined);
+    });
+
+  });
+
+  describe('#set()', function() {
+    it('can be used with arbitrary names', function() {
+      var o = new ol.Object();
+
+      o.set('set', 'sat');
+      expect(o.get('set')).to.be('sat');
+
+      o.set('get', 'got');
+      expect(o.get('get')).to.be('got');
+
+      o.set('toString', 'string');
+      expect(o.get('toString')).to.be('string');
+      expect(typeof o.toString).to.be('function');
+    });
+  });
+
+  describe('#getKeys()', function() {
+
+    it('returns property names set at construction', function() {
+      var o = new ol.Object({
+        prop1: 'val1',
+        prop2: 'val2',
+        toString: 'string',
+        get: 'foo'
+      });
+
+      var keys = o.getKeys();
+      expect(keys.length).to.be(4);
+      expect(keys.sort()).to.eql(['get', 'prop1', 'prop2', 'toString']);
+    });
+
+  });
+
+  describe('setProperties', function() {
+
+    it('sets multiple values at once', function() {
+      o.setProperties({
+        k1: 1,
+        k2: 2
+      });
+      expect(o.get('k1')).to.eql(1);
+      expect(o.get('k2')).to.eql(2);
+
+      var keys = o.getKeys().sort();
+      expect(keys).to.eql(['k1', 'k2']);
+    });
+  });
+
+  describe('notify', function() {
+
+    var listener1, listener2, listener3;
+
+    beforeEach(function() {
+      listener1 = sinon.spy();
+      goog.events.listen(o, 'change:k', listener1);
+
+      listener2 = sinon.spy();
+      goog.events.listen(o, ol.ObjectEventType.PROPERTYCHANGE, listener2);
+
+      var o2 = new ol.Object();
+      o2.bindTo('k', o);
+      listener3 = sinon.spy();
+      goog.events.listen(o2, 'change:k', listener3);
+    });
+
+    it('dispatches events', function() {
+      o.notify('k', 1);
+      expect(listener1.calledOnce).to.be(true);
+      var args = listener1.firstCall.args;
+      expect(args).to.have.length(1);
+      var event = args[0];
+      expect(event.key).to.be('k');
+      expect(event.oldValue).to.be(1);
+    });
+
+    it('dispatches generic change events to bound objects', function() {
+      o.notify('k', 1);
+      expect(listener2.calledOnce).to.be(true);
+      var args = listener2.firstCall.args;
+      expect(args).to.have.length(1);
+      var event = args[0];
+      expect(event.key).to.be('k');
+      expect(event.oldValue).to.be(1);
+    });
+
+    it('dispatches events to bound objects', function() {
+      o.notify('k', 1);
+      expect(listener3.calledOnce).to.be(true);
+      var args = listener3.firstCall.args;
+      expect(args).to.have.length(1);
+      var event = args[0];
+      expect(event.key).to.be('k');
+      expect(event.oldValue).to.be(1);
+    });
+  });
+
+  describe('set', function() {
+
+    var listener1, o2, listener2, listener3;
+
+    beforeEach(function() {
+      listener1 = sinon.spy();
+      goog.events.listen(o, 'change:k', listener1);
+
+      listener2 = sinon.spy();
+      goog.events.listen(o, ol.ObjectEventType.PROPERTYCHANGE, listener2);
+
+      o2 = new ol.Object();
+      o2.bindTo('k', o);
+      listener3 = sinon.spy();
+      goog.events.listen(o2, 'change:k', listener3);
+    });
+
+    it('dispatches events to object', function() {
+      o.set('k', 1);
+      expect(listener1).to.be.called();
+
+      expect(o.getKeys()).to.eql(['k']);
+      expect(o2.getKeys()).to.eql(['k']);
+    });
+
+    it('dispatches generic change events to object', function() {
+      o.set('k', 1);
+      expect(listener2.calledOnce).to.be(true);
+      var args = listener2.firstCall.args;
+      expect(args).to.have.length(1);
+      var event = args[0];
+      expect(event.key).to.be('k');
+    });
+
+    it('dispatches events to bound object', function() {
+      o.set('k', 1);
+      expect(listener3).to.be.called();
+    });
+
+    it('dispatches events to object bound to', function() {
+      o2.set('k', 2);
+      expect(listener1).to.be.called();
+
+      expect(o.getKeys()).to.eql(['k']);
+      expect(o2.getKeys()).to.eql(['k']);
+    });
+
+    it('dispatches generic change events to object bound to', function() {
+      o2.set('k', 2);
+      expect(listener2.calledOnce).to.be(true);
+      var args = listener2.firstCall.args;
+      expect(args).to.have.length(1);
+      var event = args[0];
+      expect(event.key).to.be('k');
+    });
+
+  });
+
+  describe('bind', function() {
+
+    var o2;
+
+    beforeEach(function() {
+      o2 = new ol.Object();
+    });
+
+    describe('bindTo after set', function() {
+
+      beforeEach(function() {
+        o.set('k', 1);
+        o2.set('k', 0);
+      });
+
+      it('gets expected value', function() {
+        o2.bindTo('k', o);
+        expect(o.get('k')).to.eql(1);
+        expect(o2.get('k')).to.eql(1);
+
+        expect(o.getKeys()).to.eql(['k']);
+        expect(o2.getKeys()).to.eql(['k']);
+      });
+
+      it('dispatches a change: event', function() {
+        var listener = sinon.spy();
+        o2.on('change:k', listener);
+        o2.bindTo('k', o);
+        expect(listener.calledOnce).to.be(true);
+        var call = listener.firstCall;
+        expect(call.args).to.have.length(1);
+        expect(call.args[0].key).to.be('k');
+        expect(call.args[0].oldValue).to.be(0);
+        expect(o2.get('k')).to.be(1);
+      });
+
+      it('dispatches a propertychange event', function() {
+        var listener = sinon.spy();
+        o2.on('propertychange', listener);
+        o2.bindTo('k', o);
+        expect(listener.calledOnce).to.be(true);
+        var call = listener.firstCall;
+        expect(call.args).to.have.length(1);
+        expect(call.args[0].key).to.be('k');
+        expect(call.args[0].oldValue).to.be(0);
+        expect(o2.get('k')).to.be(1);
+      });
+
+    });
+
+    describe('bindTo before set', function() {
+
+      it('gets expected value', function() {
+        o2.bindTo('k', o);
+        o.set('k', 1);
+        expect(o.get('k')).to.eql(1);
+        expect(o2.get('k')).to.eql(1);
+
+        expect(o.getKeys()).to.eql(['k']);
+        expect(o2.getKeys()).to.eql(['k']);
+      });
+    });
+
+    describe('backwards', function() {
+      describe('bindTo after set', function() {
+
+        it('gets expected value', function() {
+          o2.set('k', 1);
+          o2.bindTo('k', o);
+          expect(o.get('k')).to.be(undefined);
+          expect(o2.get('k')).to.be(undefined);
+        });
+      });
+
+      describe('bindTo before set', function() {
+
+        it('gets expected value', function() {
+          o2.bindTo('k', o);
+          o2.set('k', 1);
+          expect(o.get('k')).to.eql(1);
+          expect(o2.get('k')).to.eql(1);
+        });
+      });
+    });
+  });
+
+  describe('unbind', function() {
+    var o2;
+
+    beforeEach(function() {
+      o2 = new ol.Object();
+      o2.bindTo('k', o);
+      o2.set('k', 1);
+    });
+
+    it('makes changes to unbound object invisible to other object', function() {
+      // initial state
+      expect(o.get('k')).to.eql(1);
+      expect(o2.get('k')).to.eql(1);
+      o2.unbind('k');
+      expect(o.get('k')).to.eql(1);
+      expect(o2.get('k')).to.eql(1);
+      o2.set('k', 2);
+      expect(o.get('k')).to.eql(1);
+      expect(o2.get('k')).to.eql(2);
+    });
+
+  });
+
+  describe('unbindAll', function() {
+    var o2;
+
+    beforeEach(function() {
+      o2 = new ol.Object();
+      o2.bindTo('k', o);
+      o2.set('k', 1);
+    });
+
+    it('makes changes to unbound object invisible to other object', function() {
+      // initial state
+      expect(o.get('k')).to.eql(1);
+      expect(o2.get('k')).to.eql(1);
+      o2.unbindAll();
+      expect(o.get('k')).to.eql(1);
+      expect(o2.get('k')).to.eql(1);
+      o2.set('k', 2);
+      expect(o.get('k')).to.eql(1);
+      expect(o2.get('k')).to.eql(2);
+    });
+  });
+
+  describe('bind rename', function() {
+    var listener1, o2, listener2;
+
+    beforeEach(function() {
+      o2 = new ol.Object();
+      o2.bindTo('k2', o, 'k1');
+
+      listener1 = sinon.spy();
+      goog.events.listen(o, 'change:k1', listener1);
+
+      listener2 = sinon.spy();
+      goog.events.listen(o2, 'change:k2', listener2);
+    });
+
+    it('sets the expected properties', function() {
+      o.set('k1', 1);
+      expect(o.get('k1')).to.eql(1);
+      expect(o.get('k2')).to.be(undefined);
+      expect(o2.get('k2')).to.eql(1);
+      expect(o2.get('k1')).to.be(undefined);
+      expect(listener1).to.be.called();
+      expect(listener2).to.be.called();
+
+      expect(o.getKeys()).to.eql(['k1']);
+      expect(o2.getKeys()).to.eql(['k2']);
+    });
+  });
+
+  describe('transitive bind', function() {
+    var o2, o3;
+
+    beforeEach(function() {
+      o2 = new ol.Object();
+      o3 = new ol.Object();
+      o2.bindTo('k2', o, 'k1');
+      o3.bindTo('k3', o2, 'k2');
+    });
+
+    it('sets the expected properties', function() {
+      o.set('k1', 1);
+      expect(o.get('k1')).to.eql(1);
+      expect(o2.get('k2')).to.eql(1);
+      expect(o3.get('k3')).to.eql(1);
+
+      expect(o.getKeys()).to.eql(['k1']);
+      expect(o2.getKeys()).to.eql(['k2']);
+      expect(o3.getKeys()).to.eql(['k3']);
+    });
+
+    describe('backward', function() {
+
+      it('sets the expected properties', function() {
+        o3.set('k3', 1);
+        expect(o.get('k1')).to.eql(1);
+        expect(o2.get('k2')).to.eql(1);
+        expect(o3.get('k3')).to.eql(1);
+
+        expect(o.getKeys()).to.eql(['k1']);
+        expect(o2.getKeys()).to.eql(['k2']);
+        expect(o3.getKeys()).to.eql(['k3']);
+      });
+    });
+  });
+
+  describe('circular bind', function() {
+    var o2;
+
+    beforeEach(function() {
+      o2 = new ol.Object();
+      o.bindTo('k', o2);
+    });
+
+    it('throws an error', function() {
+      expect(function() { o2.bindTo('k', o); }).to.throwException();
+    });
+  });
+
+  describe('priority', function() {
+    var o2;
+
+    beforeEach(function() {
+      o2 = new ol.Object();
+    });
+
+    it('respects set order', function() {
+      o.set('k', 1);
+      o2.set('k', 2);
+      o.bindTo('k', o2);
+      expect(o.get('k')).to.eql(2);
+      expect(o2.get('k')).to.eql(2);
+    });
+
+    it('respects set order (undefined)', function() {
+      o.set('k', 1);
+      o.bindTo('k', o2);
+      expect(o.get('k')).to.be(undefined);
+      expect(o2.get('k')).to.be(undefined);
+    });
+  });
+
+  describe('setter', function() {
+    beforeEach(function() {
+      o.setX = function(x) {
+        this.set('x', x);
+      };
+      sinon.spy(o, 'setX');
+    });
+
+    describe('without bind', function() {
+      it('does not call the setter', function() {
+        o.set('x', 1);
+        expect(o.get('x')).to.eql(1);
+        expect(o.setX).to.not.be.called();
+
+        expect(o.getKeys()).to.eql(['x']);
+      });
+    });
+
+    describe('with bind', function() {
+      it('does call the setter', function() {
+        var o2 = new ol.Object();
+        o2.bindTo('x', o);
+        o2.set('x', 1);
+        expect(o.setX).to.be.called();
+        expect(o.get('x')).to.eql(1);
+
+        expect(o.getKeys()).to.eql(['x']);
+        expect(o2.getKeys()).to.eql(['x']);
+      });
+    });
+  });
+
+  describe('getter', function() {
+    beforeEach(function() {
+      o.getX = function() {
+        return 1;
+      };
+      sinon.spy(o, 'getX');
+    });
+
+    describe('without bind', function() {
+      it('does not call the getter', function() {
+        expect(o.get('x')).to.be(undefined);
+        expect(o.getX).to.not.be.called();
+      });
+    });
+
+    describe('with bind', function() {
+      it('does call the getter', function() {
+        var o2 = new ol.Object();
+        o2.bindTo('x', o);
+        expect(o2.get('x')).to.eql(1);
+        expect(o.getX).to.be.called();
+
+        expect(o.getKeys()).to.eql([]);
+        expect(o2.getKeys()).to.eql(['x']);
+      });
+    });
+  });
+
+  describe('bind self', function() {
+    it('throws an error', function() {
+      expect(function() { o.bindTo('k', o); }).to.throwException();
+    });
+  });
+
+  describe('create with options', function() {
+    it('sets the property', function() {
+      var o = new ol.Object({k: 1});
+      expect(o.get('k')).to.eql(1);
+
+      expect(o.getKeys()).to.eql(['k']);
+    });
+  });
+
+  describe('case sensitivity', function() {
+    var listener1, listener2;
+
+    beforeEach(function() {
+      listener1 = sinon.spy();
+      goog.events.listen(o, 'change:k', listener1);
+      listener2 = sinon.spy();
+      goog.events.listen(o, 'change:K', listener2);
+    });
+
+    it('dispatches the expected event', function() {
+      o.set('K', 1);
+      expect(listener1).to.not.be.called();
+      expect(listener2).to.be.called();
+
+      expect(o.getKeys()).to.eql(['K']);
+    });
+  });
+
+  describe('transforms', function() {
+
+    describe('original states and events', function() {
+      it('bindTo and transform emit propertychange events', function() {
+        var source = new ol.Object();
+        var target = new ol.Object();
+        source.set('x', 1);
+        target.set('x', 2);
+        var sourceSpy = sinon.spy();
+        var targetSpy = sinon.spy();
+        source.on('propertychange', sourceSpy);
+        target.on('propertychange', targetSpy);
+        var accessor = source.bindTo('x', target);
+        expect(sourceSpy.callCount).to.be(1);
+        expect(targetSpy.callCount).to.be(0);
+        expect(source.get('x')).to.be(2);
+        expect(target.get('x')).to.be(2);
+        accessor.transform(function(v) {
+          return v * 2;
+        }, function(v) {
+          return v / 2;
+        });
+        var call, args;
+        expect(sourceSpy.calledTwice).to.be(true);
+        call = sourceSpy.firstCall;
+        expect(call.args).to.have.length(1);
+        expect(call.args[0].key).to.be('x');
+        expect(call.args[0].oldValue).to.be(1);
+        call = sourceSpy.secondCall;
+        expect(call.args).to.have.length(1);
+        expect(call.args[0].key).to.be('x');
+        expect(call.args[0].oldValue).to.be(2);
+        expect(targetSpy.called).to.be(false);
+        expect(source.get('x')).to.be(1);
+        expect(target.get('x')).to.be(2);
+      });
+    });
+
+    describe('with multiple binds to a single property', function() {
+
+      var original, plusOne, asString;
+
+      beforeEach(function() {
+        original = new ol.Object();
+        original.set('x', 1);
+        plusOne = new ol.Object();
+        plusOne.bindTo('x', original).transform(
+            function(x) { return x - 1; },
+            function(x) { return x + 1; }
+        );
+        asString = new ol.Object();
+        asString.bindTo('x', original).transform(
+            function(x) { return +x; },
+            function(x) { return x + ''; }
+        );
+      });
+
+      it('returns the expected value', function() {
+        expect(original.get('x')).to.be(1);
+        expect(plusOne.get('x')).to.be(2);
+        expect(asString.get('x')).to.be('1');
+      });
+
+      it('allows the original value to be set correctly', function() {
+        original.set('x', 2);
+        expect(plusOne.get('x')).to.be(3);
+        expect(asString.get('x')).to.be('2');
+      });
+
+      it('allows the transformed values to be set correctly', function() {
+        plusOne.set('x', 3);
+        expect(original.get('x')).to.be(2);
+        expect(asString.get('x')).to.be('2');
+        asString.set('x', '3');
+        expect(original.get('x')).to.be(3);
+        expect(plusOne.get('x')).to.be(4);
+      });
+
+    });
+
+    describe('with transitive binds', function() {
+
+      var original, plusOne, plusOneAsString;
+
+      beforeEach(function() {
+        original = new ol.Object();
+        original.set('x', 1);
+        plusOne = new ol.Object();
+        plusOne.bindTo('x', original).transform(
+            function(x) { return x - 1; },
+            function(x) { return x + 1; }
+        );
+        plusOneAsString = new ol.Object();
+        plusOneAsString.bindTo('x', plusOne).transform(
+            parseFloat,
+            function(x) { return x + ''; }
+        );
+      });
+
+      it('returns the expected value', function() {
+        expect(original.get('x')).to.be(1);
+        expect(plusOne.get('x')).to.be(2);
+        expect(plusOneAsString.get('x')).to.be('2');
+      });
+
+      it('allows the original value to be set correctly', function() {
+        original.set('x', 2);
+        expect(plusOne.get('x')).to.be(3);
+        expect(plusOneAsString.get('x')).to.be('3');
+      });
+
+      it('allows the transformed values to be set correctly', function() {
+        plusOne.set('x', 3);
+        expect(original.get('x')).to.be(2);
+        expect(plusOneAsString.get('x')).to.be('3');
+        plusOneAsString.set('x', '4');
+        expect(original.get('x')).to.be(3);
+        expect(plusOne.get('x')).to.be(4);
+      });
+
+    });
+
+  });
+
+});
+
+
+goog.require('goog.events');
+goog.require('ol.Object');
+goog.require('ol.ObjectEventType');
diff --git a/test/spec/ol/observable.test.js b/test/spec/ol/observable.test.js
new file mode 100644
index 0000000..890e83c
--- /dev/null
+++ b/test/spec/ol/observable.test.js
@@ -0,0 +1,172 @@
+goog.provide('ol.test.Observable');
+
+describe('ol.Observable', function() {
+
+  describe('constructor', function() {
+
+    it('creates a new observable', function() {
+      var observable = new ol.Observable();
+      expect(observable).to.be.a(ol.Observable);
+      expect(observable).to.be.a(goog.events.EventTarget);
+    });
+
+  });
+
+  describe('#on()', function() {
+    var observable, listener;
+    beforeEach(function() {
+      observable = new ol.Observable();
+      listener = sinon.spy();
+    });
+
+    it('registers a listener for events of the given type', function() {
+      observable.on('foo', listener);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+
+      observable.dispatchEvent('foo');
+      expect(listener.callCount).to.be(2);
+    });
+
+    it('accepts an array of event types', function() {
+      observable.on(['foo', 'bar'], listener);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+
+      observable.dispatchEvent('bar');
+      expect(listener.callCount).to.be(2);
+    });
+
+    it('accepts an optional `this` arg for the listener', function() {
+      var thisArg = {};
+      observable.on('foo', listener, thisArg);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+      expect(listener.calledOn(thisArg)).to.be(true);
+    });
+
+    it('returns a listener key', function() {
+      var key = observable.on('foo', listener);
+
+      expect(key).to.be.a(goog.events.Listener);
+    });
+
+  });
+
+  describe('#once()', function() {
+    var observable, listener;
+    beforeEach(function() {
+      observable = new ol.Observable();
+      listener = sinon.spy();
+    });
+
+    it('registers a listener that is only called once', function() {
+      observable.once('foo', listener);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+
+      observable.dispatchEvent('foo');
+      expect(listener.callCount).to.be(1);
+    });
+
+    it('accepts an array of event types (called once for each)', function() {
+      observable.once(['foo', 'bar'], listener);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+
+      observable.dispatchEvent('foo');
+      expect(listener.callCount).to.be(1);
+
+      observable.dispatchEvent('bar');
+      expect(listener.callCount).to.be(2);
+
+      observable.dispatchEvent('bar');
+      expect(listener.callCount).to.be(2);
+    });
+
+    it('accepts an optional `this` arg for the listener', function() {
+      var thisArg = {};
+      observable.once('foo', listener, thisArg);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+      expect(listener.calledOn(thisArg)).to.be(true);
+    });
+
+    it('returns a listener key', function() {
+      var key = observable.once('foo', listener);
+
+      expect(key).to.be.a(goog.events.Listener);
+    });
+
+  });
+
+  describe('#un()', function() {
+    var observable, listener;
+    beforeEach(function() {
+      observable = new ol.Observable();
+      listener = sinon.spy();
+    });
+
+    it('unregisters a previously registered listener', function() {
+      observable.on('foo', listener);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+
+      observable.un('foo', listener);
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+    });
+
+    it('accepts a `this` arg', function() {
+      var thisArg = {};
+      observable.on('foo', listener, thisArg);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+
+      // will not unregister without the same thisArg
+      observable.un('foo', listener);
+      observable.dispatchEvent('foo');
+      expect(listener.callCount).to.be(2);
+
+      // properly unregister by providing the same thisArg
+      observable.un('foo', listener, thisArg);
+      observable.dispatchEvent('foo');
+      expect(listener.callCount).to.be(2);
+    });
+
+  });
+
+  describe('ol.Observable.unByKey()', function() {
+    var observable, listener;
+    beforeEach(function() {
+      observable = new ol.Observable();
+      listener = sinon.spy();
+    });
+
+    it('unregisters a listener given the key returned by `on`', function() {
+      var key = observable.on('foo', listener);
+
+      observable.dispatchEvent('foo');
+      expect(listener.calledOnce).to.be(true);
+
+      ol.Observable.unByKey(key);
+      observable.dispatchEvent('foo');
+      expect(listener.callCount).to.be(1);
+    });
+
+  });
+
+});
+
+
+goog.require('goog.events.EventTarget');
+goog.require('goog.events.Listener');
+goog.require('ol.Observable');
diff --git a/test/spec/ol/pointer/mousesource.test.js b/test/spec/ol/pointer/mousesource.test.js
new file mode 100644
index 0000000..624dc27
--- /dev/null
+++ b/test/spec/ol/pointer/mousesource.test.js
@@ -0,0 +1,102 @@
+goog.provide('ol.test.pointer.MouseSource');
+
+describe('ol.pointer.MouseSource', function() {
+  var handler;
+  var target;
+  var eventSpy;
+  var clock;
+
+  beforeEach(function() {
+    clock = sinon.useFakeTimers();
+    target = goog.dom.createElement(goog.dom.TagName.DIV);
+
+    // make sure that a mouse and touch event source is used
+    ol.has.POINTER = false;
+    ol.has.MSPOINTER = false;
+    ol.has.TOUCH = true;
+
+    handler = new ol.pointer.PointerEventHandler(target);
+    eventSpy = sinon.spy();
+  });
+
+  afterEach(function() {
+    clock.restore();
+    handler.dispose();
+  });
+
+  describe('simulated mouse events', function() {
+    it('prevents simulated mouse events', function() {
+      goog.events.listen(handler, 'pointerdown', eventSpy);
+
+      // simulates that a mouse event is triggered from a touch
+      simulateTouchEvent('touchstart', 10, 20);
+      simulateEvent('mousedown', 10, 20);
+
+      expect(eventSpy.calledOnce).to.be.ok();
+
+    });
+
+    it('dispatches real mouse events', function() {
+      goog.events.listen(handler, 'pointerdown', eventSpy);
+
+      // the two events are at different positions
+      simulateTouchEvent('touchstart', 10, 20);
+      simulateEvent('mousedown', 10, 50);
+
+      expect(eventSpy.calledTwice).to.be.ok();
+    });
+
+    it('dispatches real mouse events after timeout', function() {
+      // set the timeout to a lower value, to speed up the tests
+      ol.pointer.TouchSource.DEDUP_TIMEOUT = 100;
+
+      goog.events.listen(handler, 'pointerdown', eventSpy);
+
+      // first simulate a touch event, then a mouse event
+      // at the same position after a timeout
+      simulateTouchEvent('touchstart', 10, 20);
+      clock.tick(150);
+      simulateEvent('mousedown', 10, 20);
+
+      expect(eventSpy.calledTwice).to.be.ok();
+    });
+  });
+
+  function simulateTouchEvent(type, x, y) {
+    var touches = [
+      {
+        identifier: 4,
+        clientX: x,
+        clientY: y,
+        target: target
+      }
+    ];
+
+    var event = new goog.events.BrowserEvent({
+      type: type,
+      touches: touches,
+      changedTouches: touches
+    });
+    goog.events.fireListeners(target, type, false, event);
+  }
+
+  function simulateEvent(type, x, y) {
+    var event = new goog.events.BrowserEvent({
+      type: type,
+      clientX: x,
+      clientY: y,
+      target: target
+    });
+    goog.events.fireListeners(target, type, false, event);
+  }
+});
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.BrowserEvent');
+goog.require('ol.has');
+goog.require('ol.pointer.MouseSource');
+goog.require('ol.pointer.PointerEvent');
+goog.require('ol.pointer.PointerEventHandler');
+goog.require('ol.pointer.TouchSource');
diff --git a/test/spec/ol/pointer/pointereventhandler.test.js b/test/spec/ol/pointer/pointereventhandler.test.js
new file mode 100644
index 0000000..aa12df4
--- /dev/null
+++ b/test/spec/ol/pointer/pointereventhandler.test.js
@@ -0,0 +1,170 @@
+goog.provide('ol.test.pointer.PointerEventHandler');
+
+describe('ol.pointer.PointerEventHandler', function() {
+  var handler;
+  var target;
+  var eventSpy;
+
+  beforeEach(function() {
+    target = goog.dom.createElement(goog.dom.TagName.DIV);
+
+    // make sure that a mouse event source is used
+    ol.has.POINTER = false;
+    ol.has.MSPOINTER = false;
+
+    handler = new ol.pointer.PointerEventHandler(target);
+    eventSpy = sinon.spy();
+  });
+
+  afterEach(function() {
+    handler.dispose();
+  });
+
+
+  describe('constructor', function() {
+    it('registers a least one event source', function() {
+      expect(handler.eventSourceList_.length).to.be.greaterThan(0);
+      expect(handler.eventSourceList_[0]).to.be.a(ol.pointer.MouseSource);
+    });
+  });
+
+  function simulateEvent(type, x, y) {
+    var event = new goog.events.BrowserEvent({
+      type: type,
+      clientX: x,
+      clientY: y,
+      target: target
+    });
+    goog.events.fireListeners(target, type, false, event);
+  }
+
+  describe('pointer down', function() {
+    it('fires pointerdown events', function() {
+      goog.events.listen(handler, 'pointerdown', eventSpy);
+      simulateEvent('mousedown', 0, 0);
+      expect(eventSpy.calledOnce).to.be.ok();
+
+      var pointerEvent = eventSpy.firstCall.args[0];
+      expect(pointerEvent).to.be.a(ol.pointer.PointerEvent);
+      expect(pointerEvent.type).to.be('pointerdown');
+      expect(pointerEvent.pointerId).to.be(1);
+      expect(pointerEvent.pointerType).to.be('mouse');
+    });
+  });
+
+  describe('pointer up', function() {
+    it('fires pointerup events', function() {
+      goog.events.listen(handler, 'pointerup', eventSpy);
+      simulateEvent('mousedown', 0, 0);
+      simulateEvent('mouseup', 0, 0);
+      expect(eventSpy.calledOnce).to.be.ok();
+    });
+  });
+
+  describe('pointer move', function() {
+    it('fires pointermove events', function() {
+      goog.events.listen(handler, 'pointermove', eventSpy);
+      simulateEvent('mousemove', 0, 0);
+      expect(eventSpy.calledOnce).to.be.ok();
+    });
+  });
+
+  describe('pointer enter and over', function() {
+    it('fires pointerenter and pointerover events', function() {
+      var enterEventSpy = sinon.spy();
+      var overEventSpy = sinon.spy();
+
+      goog.events.listen(handler, 'pointerenter', enterEventSpy);
+      goog.events.listen(handler, 'pointerover', overEventSpy);
+
+      simulateEvent('mouseover', 0, 0);
+
+      expect(enterEventSpy.calledOnce).to.be.ok();
+      expect(overEventSpy.calledOnce).to.be.ok();
+    });
+  });
+
+  describe('pointer leave and out', function() {
+    it('fires pointerleave and pointerout events', function() {
+      var leaveEventSpy = sinon.spy();
+      var outEventSpy = sinon.spy();
+
+      goog.events.listen(handler, 'pointerleave', leaveEventSpy);
+      goog.events.listen(handler, 'pointerout', outEventSpy);
+
+      simulateEvent('mouseout', 0, 0);
+
+      expect(leaveEventSpy.calledOnce).to.be.ok();
+      expect(outEventSpy.calledOnce).to.be.ok();
+    });
+  });
+
+  describe('#cloneEvent', function() {
+    it('copies the properties of an event', function() {
+      var event = {
+        type: 'mousedown',
+        target: target,
+        clientX: 1,
+        clientY: 2
+      };
+      var browserEvent = new goog.events.BrowserEvent(event);
+
+      var eventClone = handler.cloneEvent(browserEvent, event);
+
+      // properties are copied from `event`
+      expect(eventClone.type).to.be('mousedown');
+      expect(eventClone.target).to.be(target);
+      expect(eventClone.clientX).to.be(1);
+      expect(eventClone.clientY).to.be(2);
+
+      // properties are copied from `browserEvent`
+      expect(eventClone.screenX).to.be(0);
+      expect(eventClone.screenY).to.be(0);
+
+      // properties are copied from the defaults
+      expect(eventClone.pointerId).to.be(0);
+      expect(eventClone.pressure).to.be(0);
+
+    });
+  });
+
+  describe('#makeEvent', function() {
+    it('makes a new pointer event', function() {
+      var event = {
+        type: 'mousedown',
+        target: target,
+        clientX: 1,
+        clientY: 2
+      };
+      var browserEvent = new goog.events.BrowserEvent(event);
+
+      var eventClone = handler.cloneEvent(browserEvent, event);
+      var pointerEvent = handler.makeEvent('pointerdown',
+          eventClone, browserEvent);
+
+      expect(pointerEvent.type).to.be('pointerdown');
+      expect(pointerEvent.clientX).to.be(1);
+      expect(pointerEvent.clientY).to.be(2);
+
+      expect(pointerEvent.screenX).to.be(0);
+      expect(pointerEvent.screenY).to.be(0);
+
+      expect(pointerEvent.pointerId).to.be(0);
+      expect(pointerEvent.pressure).to.be(0);
+
+      expect(pointerEvent.preventDefault).to.be.ok();
+
+      expect(pointerEvent).to.be.a(ol.pointer.PointerEvent);
+    });
+  });
+
+});
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.BrowserEvent');
+goog.require('ol.has');
+goog.require('ol.pointer.MouseSource');
+goog.require('ol.pointer.PointerEvent');
+goog.require('ol.pointer.PointerEventHandler');
diff --git a/test/spec/ol/pointer/touchsource.test.js b/test/spec/ol/pointer/touchsource.test.js
new file mode 100644
index 0000000..c5d6be0
--- /dev/null
+++ b/test/spec/ol/pointer/touchsource.test.js
@@ -0,0 +1,139 @@
+goog.provide('ol.test.pointer.TouchSource');
+
+goog.require('goog.object');
+
+describe('ol.pointer.TouchSource', function() {
+  var handler;
+  var target;
+  var eventSpy;
+
+  beforeEach(function() {
+    target = goog.dom.createElement(goog.dom.TagName.DIV);
+
+    // make sure that a mouse and touch event source is used
+    ol.has.POINTER = false;
+    ol.has.MSPOINTER = false;
+    ol.has.TOUCH = true;
+
+    handler = new ol.pointer.PointerEventHandler(target);
+    eventSpy = sinon.spy();
+  });
+
+  afterEach(function() {
+    handler.dispose();
+  });
+
+  describe('pointer event creation', function() {
+    it('generates pointer events for each touch contact', function() {
+      goog.events.listen(handler, 'pointerdown', eventSpy);
+
+      simulateTouchEvent('touchstart', [
+        {identifier: 3, clientX: 10, clientY: 11},
+        {identifier: 4, clientX: 30, clientY: 45}
+      ]);
+
+      expect(eventSpy.calledTwice).to.be.ok();
+
+      // pointer event for the first touch contact
+      var pointerEvent1 = eventSpy.firstCall.args[0];
+      expect(pointerEvent1.pointerId).to.be(5);
+      expect(pointerEvent1.pointerType).to.be('touch');
+      expect(pointerEvent1.clientX).to.be(10);
+      expect(pointerEvent1.clientY).to.be(11);
+
+      // pointer event for the second touch contact
+      var pointerEvent2 = eventSpy.secondCall.args[0];
+      expect(pointerEvent2.pointerId).to.be(6);
+      expect(pointerEvent2.pointerType).to.be('touch');
+      expect(pointerEvent2.clientX).to.be(30);
+      expect(pointerEvent2.clientY).to.be(45);
+
+      expect(goog.object.getCount(handler.pointerMap)).to.be(2);
+    });
+
+    it('creates the right pointer events', function() {
+      goog.events.listen(handler, 'pointerdown', eventSpy);
+
+      // first touch
+      simulateTouchEvent('touchstart', [
+        {identifier: 3, clientX: 10, clientY: 11}
+      ]);
+      expect(eventSpy.calledOnce).to.be.ok();
+      expect(goog.object.getCount(handler.pointerMap)).to.be(1);
+
+      // second touch (first touch still down)
+      simulateTouchEvent('touchstart', [
+        {identifier: 4, clientX: 30, clientY: 45}
+      ], [{identifier: 3}, {identifier: 4}]
+      );
+      expect(eventSpy.calledTwice).to.be.ok();
+      expect(goog.object.getCount(handler.pointerMap)).to.be(2);
+
+      // first touch moves
+      var moveEventSpy = sinon.spy();
+      goog.events.listen(handler, 'pointermove', moveEventSpy);
+
+      simulateTouchEvent('touchmove', [
+        {identifier: 3, clientX: 15, clientY: 16}
+      ], [{identifier: 3}, {identifier: 4}]
+      );
+      expect(moveEventSpy.calledOnce).to.be.ok();
+
+      // and then both touches go up
+      var upEventSpy = sinon.spy();
+      goog.events.listen(handler, 'pointerup', upEventSpy);
+
+      simulateTouchEvent('touchend', [
+        {identifier: 3, clientX: 15, clientY: 16},
+        {identifier: 4, clientX: 30, clientY: 45}
+      ], [{identifier: 3}, {identifier: 4}]
+      );
+      expect(upEventSpy.calledTwice).to.be.ok();
+      expect(goog.object.getCount(handler.pointerMap)).to.be(0);
+    });
+
+    it('handles flawed touches', function() {
+      goog.events.listen(handler, 'pointerdown', eventSpy);
+
+      // first touch
+      simulateTouchEvent('touchstart', [
+        {identifier: 3, clientX: 10, clientY: 11}
+      ]);
+      expect(eventSpy.calledOnce).to.be.ok();
+      expect(goog.object.getCount(handler.pointerMap)).to.be(1);
+
+      // second touch, but the first touch has disappeared
+      var cancelEventSpy = sinon.spy();
+      goog.events.listen(handler, 'pointercancel', cancelEventSpy);
+      simulateTouchEvent('touchstart', [
+        {identifier: 4, clientX: 30, clientY: 45}
+      ], [{identifier: 4}]
+      );
+      expect(eventSpy.calledTwice).to.be.ok();
+
+      // the first (broken) touch is canceled
+      expect(cancelEventSpy.calledOnce).to.be.ok();
+      expect(goog.object.getCount(handler.pointerMap)).to.be(1);
+    });
+  });
+
+  function simulateTouchEvent(type, changedTouches, touches) {
+    touches = goog.isDef(touches) ? touches : changedTouches;
+
+    var event = new goog.events.BrowserEvent({
+      type: type,
+      touches: touches,
+      changedTouches: changedTouches
+    });
+    goog.events.fireListeners(target, type, false, event);
+  }
+});
+
+goog.require('goog.dom');
+goog.require('goog.dom.TagName');
+goog.require('goog.events');
+goog.require('goog.events.BrowserEvent');
+goog.require('ol.has');
+goog.require('ol.pointer.PointerEvent');
+goog.require('ol.pointer.PointerEventHandler');
+goog.require('ol.pointer.TouchSource');
diff --git a/test/spec/ol/proj/epsg3857projection.test.js b/test/spec/ol/proj/epsg3857projection.test.js
new file mode 100644
index 0000000..a832168
--- /dev/null
+++ b/test/spec/ol/proj/epsg3857projection.test.js
@@ -0,0 +1,56 @@
+goog.provide('ol.test.proj.EPSG3857');
+
+
+describe('ol.proj.EPSG3857', function() {
+
+  beforeEach(function() {
+    ol.proj.common.add();
+  });
+
+  afterEach(function() {
+    ol.proj.clearAllProjections();
+  });
+
+  describe('getPointResolution', function() {
+
+    it('returns the correct point scale at the equator', function() {
+      // @see http://msdn.microsoft.com/en-us/library/aa940990.aspx
+      var epsg3857 = ol.proj.get('EPSG:3857');
+      var resolution = 19.11;
+      var point = [0, 0];
+      expect(epsg3857.getPointResolution(resolution, point)).
+          to.roughlyEqual(19.11, 1e-1);
+    });
+
+    it('returns the correct point scale at the latitude of Toronto',
+        function() {
+          // @see http://msdn.microsoft.com/en-us/library/aa940990.aspx
+          var epsg3857 = ol.proj.get('EPSG:3857');
+          var epsg4326 = ol.proj.get('EPSG:4326');
+          var resolution = 19.11;
+          var point = ol.proj.transform([0, 43.65], epsg4326, epsg3857);
+          expect(epsg3857.getPointResolution(resolution, point)).
+              to.roughlyEqual(19.11 * Math.cos(Math.PI * 43.65 / 180), 1e-9);
+        });
+
+    it('returns the correct point scale at various latitudes', function() {
+      // @see http://msdn.microsoft.com/en-us/library/aa940990.aspx
+      var epsg3857 = ol.proj.get('EPSG:3857');
+      var epsg4326 = ol.proj.get('EPSG:4326');
+      var resolution = 19.11;
+      var latitude;
+      for (latitude = 0; latitude < 90; ++latitude) {
+        var point = ol.proj.transform([0, latitude], epsg4326, epsg3857);
+        expect(epsg3857.getPointResolution(resolution, point)).
+            to.roughlyEqual(19.11 * Math.cos(Math.PI * latitude / 180), 1e-9);
+      }
+    });
+
+  });
+
+});
+
+
+goog.require('ol.proj');
+goog.require('ol.proj.common');
+goog.require('ol.proj.EPSG3857');
diff --git a/test/spec/ol/proj/proj.test.js b/test/spec/ol/proj/proj.test.js
new file mode 100644
index 0000000..d800d81
--- /dev/null
+++ b/test/spec/ol/proj/proj.test.js
@@ -0,0 +1,394 @@
+goog.provide('ol.test.proj');
+
+describe('ol.proj', function() {
+
+  beforeEach(function() {
+    ol.proj.common.add();
+  });
+
+  afterEach(function() {
+    ol.proj.clearAllProjections();
+  });
+
+  describe('projection equivalence', function() {
+
+    function _testAllEquivalent(codes) {
+      var projections = goog.array.map(codes, ol.proj.get);
+      goog.array.forEach(projections, function(source) {
+        goog.array.forEach(projections, function(destination) {
+          expect(ol.proj.equivalent(source, destination)).to.be.ok();
+        });
+      });
+    }
+
+    it('gives that 3857, 102100, 102113, 900913 are equivalent ', function() {
+      _testAllEquivalent([
+        'EPSG:3857',
+        'EPSG:102100',
+        'EPSG:102113',
+        'EPSG:900913'
+      ]);
+    });
+
+    it('gives that CRS:84, urn:ogc:def:crs:EPSG:6.6:4326, EPSG:4326 are ' +
+       'equivalent', function() {
+          _testAllEquivalent([
+            'CRS:84',
+            'urn:ogc:def:crs:EPSG:6.6:4326',
+            'EPSG:4326'
+          ]);
+        });
+  });
+
+  describe('identify transform', function() {
+
+    it('returns a new object, with same coord values', function() {
+      var epsg4326 = ol.proj.get('EPSG:4326');
+      var uniqueObject = {};
+      var sourcePoint = [uniqueObject, uniqueObject];
+      var destinationPoint = ol.proj.transform(
+          sourcePoint, epsg4326, epsg4326);
+      expect(sourcePoint === destinationPoint).to.not.be();
+      expect(destinationPoint[0] === sourcePoint[0]).to.be.ok();
+      expect(destinationPoint[1] === sourcePoint[1]).to.be.ok();
+    });
+  });
+
+  describe('transform 0,0 from 4326 to 3857', function() {
+
+    it('returns expected value', function() {
+      var point = ol.proj.transform([0, 0], 'EPSG:4326', 'EPSG:3857');
+      expect(point).not.to.be(undefined);
+      expect(point).not.to.be(null);
+      expect(point[1]).to.roughlyEqual(0, 1e-9);
+    });
+  });
+
+  describe('transform 0,0 from 3857 to 4326', function() {
+
+    it('returns expected value', function() {
+      var point = ol.proj.transform([0, 0], 'EPSG:3857', 'EPSG:4326');
+      expect(point).not.to.be(undefined);
+      expect(point).not.to.be(null);
+      expect(point[0]).to.eql(0);
+      expect(point[1]).to.eql(0);
+    });
+  });
+
+  describe('transform from 4326 to 3857 (Alastaira)', function() {
+    // http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
+
+    it('returns expected value', function() {
+      var point = ol.proj.transform(
+          [-5.625, 52.4827802220782], 'EPSG:4326', 'EPSG:900913');
+      expect(point).not.to.be(undefined);
+      expect(point).not.to.be(null);
+      expect(point[0]).to.roughlyEqual(-626172.13571216376, 1e-9);
+      expect(point[1]).to.roughlyEqual(6887893.4928337997, 1e-8);
+    });
+  });
+
+  describe('transform from 3857 to 4326 (Alastaira)', function() {
+    // http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
+
+    it('returns expected value', function() {
+      var point = ol.proj.transform([-626172.13571216376, 6887893.4928337997],
+          'EPSG:900913', 'EPSG:4326');
+      expect(point).not.to.be(undefined);
+      expect(point).not.to.be(null);
+      expect(point[0]).to.roughlyEqual(-5.625, 1e-9);
+      expect(point[1]).to.roughlyEqual(52.4827802220782, 1e-9);
+    });
+  });
+
+  describe('transformExtent()', function() {
+
+    it('transforms an extent given projection identifiers', function() {
+      var sourceExtent = [-15, -30, 45, 60];
+      var destinationExtent = ol.proj.transformExtent(
+          sourceExtent, 'EPSG:4326', 'EPSG:3857');
+      expect(destinationExtent).not.to.be(undefined);
+      expect(destinationExtent).not.to.be(null);
+      expect(destinationExtent[0])
+          .to.roughlyEqual(-1669792.3618991037, 1e-9);
+      expect(destinationExtent[2]).to.roughlyEqual(5009377.085697311, 1e-9);
+      expect(destinationExtent[1]).to.roughlyEqual(-3503549.843504376, 1e-8);
+      expect(destinationExtent[3]).to.roughlyEqual(8399737.889818361, 1e-8);
+    });
+
+  });
+
+  describe('Proj4js integration', function() {
+
+    it('allows Proj4js projections to be used transparently', function() {
+      var point = ol.proj.transform(
+          [-626172.13571216376, 6887893.4928337997], 'GOOGLE', 'WGS84');
+      expect(point[0]).to.roughlyEqual(-5.625, 1e-9);
+      expect(point[1]).to.roughlyEqual(52.4827802220782, 1e-9);
+    });
+
+    it('allows new Proj4js projections to be defined', function() {
+      proj4.defs('EPSG:21781',
+          '+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 ' +
+          '+k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel ' +
+          '+towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs');
+      var point = ol.proj.transform([7.439583333333333, 46.95240555555556],
+          'EPSG:4326', 'EPSG:21781');
+      expect(point[0]).to.roughlyEqual(600072.300, 1);
+      expect(point[1]).to.roughlyEqual(200146.976, 1);
+      delete proj4.defs['EPSG:21781'];
+    });
+
+    it('caches the new Proj4js projections given their srsCode', function() {
+      proj4.defs('EPSG:21781',
+          '+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 ' +
+          '+k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel ' +
+          '+towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs');
+      var code = 'urn:ogc:def:crs:EPSG:21781';
+      var srsCode = 'EPSG:21781';
+      proj4.defs(code, proj4.defs(srsCode));
+      var proj = ol.proj.get(code);
+      var proj2 = ol.proj.get(srsCode);
+      expect(ol.proj.equivalent(proj2, proj)).to.be(true);
+      delete proj4.defs[code];
+      delete proj4.defs[srsCode];
+    });
+
+    it('numerically estimates point scale at the equator', function() {
+      var googleProjection = ol.proj.get('GOOGLE');
+      expect(googleProjection.getPointResolution(1, [0, 0])).
+          to.roughlyEqual(1, 1e-1);
+    });
+
+    it('numerically estimates point scale at various latitudes', function() {
+      var epsg3857Projection = ol.proj.get('EPSG:3857');
+      var googleProjection = ol.proj.get('GOOGLE');
+      var point, y;
+      for (y = -20; y <= 20; ++y) {
+        point = [0, 1000000 * y];
+        expect(googleProjection.getPointResolution(1, point)).to.roughlyEqual(
+            epsg3857Projection.getPointResolution(1, point), 1e-1);
+      }
+    });
+
+    it('numerically estimates point scale at various points', function() {
+      var epsg3857Projection = ol.proj.get('EPSG:3857');
+      var googleProjection = ol.proj.get('GOOGLE');
+      var point, x, y;
+      for (x = -20; x <= 20; x += 2) {
+        for (y = -20; y <= 20; y += 2) {
+          point = [1000000 * x, 1000000 * y];
+          expect(googleProjection.getPointResolution(1, point)).to.roughlyEqual(
+              epsg3857Projection.getPointResolution(1, point), 1e-1);
+        }
+      }
+    });
+
+  });
+
+  describe('ol.proj.getTransformFromProjections()', function() {
+
+    it('returns a transform function', function() {
+      var transform = ol.proj.getTransformFromProjections(ol.proj.get('GOOGLE'),
+          ol.proj.get('EPSG:4326'));
+      expect(typeof transform).to.be('function');
+
+      var output = transform([-12000000, 5000000]);
+
+      expect(output[0]).to.roughlyEqual(-107.79783409434258, 1e-9);
+      expect(output[1]).to.roughlyEqual(40.91627447067577, 1e-9);
+    });
+
+    it('works for longer arrays', function() {
+      var transform = ol.proj.getTransformFromProjections(ol.proj.get('GOOGLE'),
+          ol.proj.get('EPSG:4326'));
+      expect(typeof transform).to.be('function');
+
+      var output = transform([-12000000, 5000000, -12000000, 5000000]);
+
+      expect(output[0]).to.roughlyEqual(-107.79783409434258, 1e-9);
+      expect(output[1]).to.roughlyEqual(40.91627447067577, 1e-9);
+      expect(output[2]).to.roughlyEqual(-107.79783409434258, 1e-9);
+      expect(output[3]).to.roughlyEqual(40.91627447067577, 1e-9);
+    });
+
+  });
+
+  describe('ol.proj.getTransform()', function() {
+
+    it('returns a function', function() {
+      var transform = ol.proj.getTransform('GOOGLE', 'EPSG:4326');
+      expect(typeof transform).to.be('function');
+    });
+
+    it('returns a transform function', function() {
+      var transform = ol.proj.getTransform('GOOGLE', 'EPSG:4326');
+      expect(typeof transform).to.be('function');
+
+      var output = transform([-626172.13571216376, 6887893.4928337997]);
+
+      expect(output[0]).to.roughlyEqual(-5.625, 1e-9);
+      expect(output[1]).to.roughlyEqual(52.4827802220782, 1e-9);
+
+    });
+
+    it('works for longer arrays of coordinate values', function() {
+      var transform = ol.proj.getTransform('GOOGLE', 'EPSG:4326');
+      expect(typeof transform).to.be('function');
+
+      var output = transform([
+        -626172.13571216376, 6887893.4928337997,
+        -12000000, 5000000,
+        -626172.13571216376, 6887893.4928337997
+      ]);
+
+      expect(output[0]).to.roughlyEqual(-5.625, 1e-9);
+      expect(output[1]).to.roughlyEqual(52.4827802220782, 1e-9);
+      expect(output[2]).to.roughlyEqual(-107.79783409434258, 1e-9);
+      expect(output[3]).to.roughlyEqual(40.91627447067577, 1e-9);
+      expect(output[4]).to.roughlyEqual(-5.625, 1e-9);
+      expect(output[5]).to.roughlyEqual(52.4827802220782, 1e-9);
+    });
+
+    it('accepts an optional destination array', function() {
+      var transform = ol.proj.getTransform('EPSG:3857', 'EPSG:4326');
+      var input = [-12000000, 5000000];
+      var output = [];
+
+      var got = transform(input, output);
+      expect(got).to.be(output);
+
+      expect(output[0]).to.roughlyEqual(-107.79783409434258, 1e-9);
+      expect(output[1]).to.roughlyEqual(40.91627447067577, 1e-9);
+
+      expect(input).to.eql([-12000000, 5000000]);
+    });
+
+    it('accepts a dimension', function() {
+      var transform = ol.proj.getTransform('GOOGLE', 'EPSG:4326');
+      expect(typeof transform).to.be('function');
+
+      var dimension = 3;
+      var output = transform([
+        -626172.13571216376, 6887893.4928337997, 100,
+        -12000000, 5000000, 200,
+        -626172.13571216376, 6887893.4928337997, 300
+      ], undefined, dimension);
+
+      expect(output[0]).to.roughlyEqual(-5.625, 1e-9);
+      expect(output[1]).to.roughlyEqual(52.4827802220782, 1e-9);
+      expect(output[2]).to.be(100);
+      expect(output[3]).to.roughlyEqual(-107.79783409434258, 1e-9);
+      expect(output[4]).to.roughlyEqual(40.91627447067577, 1e-9);
+      expect(output[5]).to.be(200);
+      expect(output[6]).to.roughlyEqual(-5.625, 1e-9);
+      expect(output[7]).to.roughlyEqual(52.4827802220782, 1e-9);
+      expect(output[8]).to.be(300);
+    });
+  });
+
+  describe('ol.proj.removeTransform()', function() {
+
+    var extent = [180, -90, 180, 90];
+    var units = ol.proj.Units.DEGREES;
+
+    it('removes functions cached by addTransform', function() {
+      var foo = new ol.proj.Projection({
+        code: 'foo',
+        units: units,
+        extent: extent
+      });
+      var bar = new ol.proj.Projection({
+        code: 'bar',
+        units: units,
+        extent: extent
+      });
+      var transform = function(input, output, dimension) {return input;};
+      ol.proj.addTransform(foo, bar, transform);
+      expect(ol.proj.transforms_).not.to.be(undefined);
+      expect(ol.proj.transforms_.foo).not.to.be(undefined);
+      expect(ol.proj.transforms_.foo.bar).to.be(transform);
+
+      var removed = ol.proj.removeTransform(foo, bar);
+      expect(removed).to.be(transform);
+      expect(ol.proj.transforms_.foo).to.be(undefined);
+    });
+
+  });
+
+  describe('ol.proj.transform()', function() {
+
+    it('transforms a 2d coordinate', function() {
+      var got = ol.proj.transform([-10, -20], 'EPSG:4326', 'EPSG:3857');
+      expect(got).to.have.length(2);
+      expect(got[0]).to.roughlyEqual(-1113194.9079327357, 1e-3);
+      expect(got[1]).to.roughlyEqual(-2273030.92698769, 1e-3);
+    });
+
+    it('transforms a 3d coordinate', function() {
+      var got = ol.proj.transform([-10, -20, 3], 'EPSG:4326', 'EPSG:3857');
+      expect(got).to.have.length(3);
+      expect(got[0]).to.roughlyEqual(-1113194.9079327357, 1e-3);
+      expect(got[1]).to.roughlyEqual(-2273030.92698769, 1e-3);
+      expect(got[2]).to.be(3);
+    });
+
+    it('transforms a 4d coordinate', function() {
+      var got = ol.proj.transform([-10, -20, 3, 4], 'EPSG:4326', 'EPSG:3857');
+      expect(got).to.have.length(4);
+      expect(got[0]).to.roughlyEqual(-1113194.9079327357, 1e-3);
+      expect(got[1]).to.roughlyEqual(-2273030.92698769, 1e-3);
+      expect(got[2]).to.be(3);
+      expect(got[3]).to.be(4);
+    });
+
+    it('works with 3d points and proj4 defs', function() {
+      proj4.defs('custom',
+          '+proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 ' +
+          '+k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel ' +
+          '+towgs84=674.374,15.056,405.346,0,0,0,0 +units=m +no_defs');
+
+      var got = ol.proj.transform([-111, 45.5, 123], 'EPSG:4326', 'custom');
+      expect(got).to.have.length(3);
+      expect(got[0]).to.roughlyEqual(-6601512.194209638, 1);
+      expect(got[1]).to.roughlyEqual(6145843.802742112, 1);
+      expect(got[2]).to.be(123);
+
+      delete proj4.defs.custom;
+    });
+
+  });
+
+  describe('ol.proj.Projection.prototype.getMetersPerUnit()', function() {
+
+    beforeEach(function() {
+      proj4.defs('EPSG:26782',
+          '+proj=lcc +lat_1=29.3 +lat_2=30.7 +lat_0=28.66666666666667 ' +
+          '+lon_0=-91.33333333333333 +x_0=609601.2192024384 +y_0=0 ' +
+          '+ellps=clrk66 +datum=NAD27 +to_meter=0.3048006096012192 +no_defs');
+    });
+
+    afterEach(function() {
+      delete proj4.defs['EPSG:26782'];
+    });
+
+    it('returns value in meters', function() {
+      var epsg4326 = ol.proj.get('EPSG:4326');
+      expect(epsg4326.getMetersPerUnit()).to.eql(111194.87428468118);
+    });
+
+    it('works for proj4js projections without units', function() {
+      var epsg26782 = ol.proj.get('EPSG:26782');
+      expect(epsg26782.getMetersPerUnit()).to.eql(0.3048006096012192);
+    });
+
+  });
+
+});
+
+
+goog.require('goog.array');
+goog.require('ol.proj');
+goog.require('ol.proj.Projection');
+goog.require('ol.proj.Units');
+goog.require('ol.proj.common');
diff --git a/test/spec/ol/render/canvasimmediate.test.js b/test/spec/ol/render/canvasimmediate.test.js
new file mode 100644
index 0000000..f604677
--- /dev/null
+++ b/test/spec/ol/render/canvasimmediate.test.js
@@ -0,0 +1,97 @@
+goog.provide('ol.test.render.canvas.Immediate');
+
+describe('ol.render.canvas.Immediate', function() {
+  describe('#drawMultiPolygonGeometry', function() {
+    it('creates the correct canvas instructions for 3D geometries', function() {
+      var log = {
+        lineTo: [],
+        moveTo: []
+      };
+      // FIXME move the canvas/context mocks outside of here for reuse
+      var context = {
+        setLineDash: function() {},
+        beginPath: function() {},
+        closePath: function() {},
+        stroke: function() {},
+        lineTo: function(x, y) {
+          log.lineTo.push([x, y]);
+        },
+        moveTo: function(x, y) {
+          log.moveTo.push([x, y]);
+        }
+      };
+      var transform = [0.0004088332670837288, 0, 0, 0, 0,
+        -0.0004088332670837288, 0, 0, 0, 0, 1, 0, 4480.991370439071,
+        1529.5752568707105, 0, 1];
+      var extent = [-10960437.252092224, 2762924.0275091752,
+        -7572748.158493212, 3741317.9895594316];
+      var canvas = new ol.render.canvas.Immediate(context, 1, extent,
+          transform);
+      canvas.strokeState_ = {
+        lineCap: 'round',
+        lineDash: [],
+        lineJoin: 'round',
+        lineWidth: 3,
+        miterLimit: 10,
+        strokeStyle: '#00FFFF'
+      };
+      var multiPolygonGeometry = new ol.geom.MultiPolygon([
+        [[[-80.736061, 28.788576000000006, 0],
+           [-80.763557, 28.821799999999996, 0],
+           [-80.817406, 28.895123999999996, 0],
+           [-80.891304, 29.013130000000004, 0],
+           [-80.916512, 29.071560000000005, 0],
+           [-80.899323, 29.061249000000004, 0],
+           [-80.862663, 28.991361999999995, 0],
+           [-80.736061, 28.788576000000006, 0]]], [[
+          [-82.102127, 26.585724, 0],
+          [-82.067139, 26.497208, 0],
+          [-82.097641, 26.493585999999993, 0],
+          [-82.135895, 26.642279000000002, 0],
+          [-82.183495, 26.683082999999996, 0],
+          [-82.128838, 26.693342, 0],
+          [-82.102127, 26.585724, 0]]]
+      ]).transform('EPSG:4326', 'EPSG:3857');
+      canvas.drawMultiPolygonGeometry(multiPolygonGeometry, null);
+      expect(log.lineTo.length).to.be(15);
+      expect(log.lineTo[0][0]).to.roughlyEqual(805.3521540835154, 1e-9);
+      expect(log.lineTo[0][1]).to.roughlyEqual(158.76358389011807, 1e-9);
+      expect(log.lineTo[1][0]).to.roughlyEqual(802.9014262612932, 1e-9);
+      expect(log.lineTo[1][1]).to.roughlyEqual(154.95335187132082, 1e-9);
+      expect(log.lineTo[2][0]).to.roughlyEqual(799.5382461724039, 1e-9);
+      expect(log.lineTo[2][1]).to.roughlyEqual(148.815592819916, 1e-9);
+      expect(log.lineTo[3][0]).to.roughlyEqual(798.3910020835165, 1e-9);
+      expect(log.lineTo[3][1]).to.roughlyEqual(145.77392230456553, 1e-9);
+      expect(log.lineTo[4][0]).to.roughlyEqual(799.1732925724045, 1e-9);
+      expect(log.lineTo[4][1]).to.roughlyEqual(146.31080369865776, 1e-9);
+      expect(log.lineTo[5][0]).to.roughlyEqual(800.8417299057378, 1e-9);
+      expect(log.lineTo[5][1]).to.roughlyEqual(149.94832216046188, 1e-9);
+      expect(log.lineTo[6][0]).to.roughlyEqual(806.6035275946265, 1e-9);
+      expect(log.lineTo[6][1]).to.roughlyEqual(160.48916296287916, 1e-9);
+      expect(log.lineTo[7][0]).to.roughlyEqual(806.6035275946265, 1e-9);
+      expect(log.lineTo[7][1]).to.roughlyEqual(160.48916296287916, 1e-9);
+      expect(log.lineTo[8][0]).to.roughlyEqual(746.0246888390716, 1e-9);
+      expect(log.lineTo[8][1]).to.roughlyEqual(278.22094795365365, 1e-9);
+      expect(log.lineTo[9][0]).to.roughlyEqual(744.6365089279602, 1e-9);
+      expect(log.lineTo[9][1]).to.roughlyEqual(278.40513424671826, 1e-9);
+      expect(log.lineTo[10][0]).to.roughlyEqual(742.8955268835157, 1e-9);
+      expect(log.lineTo[10][1]).to.roughlyEqual(270.83899948444764, 1e-9);
+      expect(log.lineTo[11][0]).to.roughlyEqual(740.7291979946272, 1e-9);
+      expect(log.lineTo[11][1]).to.roughlyEqual(268.76099731369345, 1e-9);
+      expect(log.lineTo[12][0]).to.roughlyEqual(743.2166987946266, 1e-9);
+      expect(log.lineTo[12][1]).to.roughlyEqual(268.23842607400616, 1e-9);
+      expect(log.lineTo[13][0]).to.roughlyEqual(744.4323460835158, 1e-9);
+      expect(log.lineTo[13][1]).to.roughlyEqual(273.7179168205373, 1e-9);
+      expect(log.lineTo[14][0]).to.roughlyEqual(744.4323460835158, 1e-9);
+      expect(log.lineTo[14][1]).to.roughlyEqual(273.7179168205373, 1e-9);
+      expect(log.moveTo.length).to.be(2);
+      expect(log.moveTo[0][0]).to.roughlyEqual(806.6035275946265, 1e-9);
+      expect(log.moveTo[0][1]).to.roughlyEqual(160.48916296287916, 1e-9);
+      expect(log.moveTo[1][0]).to.roughlyEqual(744.4323460835158, 1e-9);
+      expect(log.moveTo[1][1]).to.roughlyEqual(273.7179168205373, 1e-9);
+    });
+  });
+});
+
+goog.require('ol.geom.MultiPolygon');
+goog.require('ol.render.canvas.Immediate');
diff --git a/test/spec/ol/render/vector.test.js b/test/spec/ol/render/vector.test.js
new file mode 100644
index 0000000..eef8d0f
--- /dev/null
+++ b/test/spec/ol/render/vector.test.js
@@ -0,0 +1,65 @@
+goog.provide('ol.test.renderer.vector');
+
+describe('ol.renderer.vector', function() {
+  describe('#renderFeature', function() {
+    var replayGroup;
+
+    beforeEach(function() {
+      replayGroup = new ol.render.canvas.ReplayGroup(1);
+    });
+
+    describe('call multiple times', function() {
+
+      it('does not set multiple listeners', function() {
+        var iconStyle = new ol.style.Icon({
+          src: 'http://example.com/icon.png'
+        });
+
+        var iconImage = iconStyle.iconImage_;
+
+        var iconStyleLoadSpy = sinon.stub(iconStyle, 'load', function() {
+          iconImage.imageState_ = ol.style.ImageState.LOADING;
+        });
+
+        var style = new ol.style.Style({
+          image: iconStyle
+        });
+
+        var feature = new ol.Feature();
+
+        var listener = function() {};
+        var listenerThis = {};
+        var listeners;
+
+        // call #1
+        ol.renderer.vector.renderFeature(replayGroup, feature,
+            style, 1, listener, listenerThis);
+
+        expect(iconStyleLoadSpy.calledOnce).to.be.ok();
+        listeners = goog.events.getListeners(
+            iconStyle.iconImage_, goog.events.EventType.CHANGE, false);
+        expect(listeners.length).to.eql(1);
+
+        // call #2
+        ol.renderer.vector.renderFeature(replayGroup, feature,
+            style, 1, listener, listenerThis);
+
+        expect(iconStyleLoadSpy.calledOnce).to.be.ok();
+        listeners = goog.events.getListeners(
+            iconStyle.iconImage_, goog.events.EventType.CHANGE, false);
+        expect(listeners.length).to.eql(1);
+      });
+
+    });
+
+  });
+});
+
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('ol.render.canvas.ReplayGroup');
+goog.require('ol.renderer.vector');
+goog.require('ol.style.Icon');
+goog.require('ol.style.ImageState');
+goog.require('ol.style.Style');
+goog.require('ol.Feature');
diff --git a/test/spec/ol/render/webglreplay.test.js b/test/spec/ol/render/webglreplay.test.js
new file mode 100644
index 0000000..8e60018
--- /dev/null
+++ b/test/spec/ol/render/webglreplay.test.js
@@ -0,0 +1,158 @@
+goog.provide('ol.test.render.webgl.Replay');
+
+describe('ol.render.webgl.ImageReplay', function() {
+  var replay;
+
+  var createImageStyle = function(image) {
+    var imageStyle = new ol.style.Image({
+      opacity: 0.1,
+      rotateWithView: true,
+      rotation: 1.5,
+      scale: 2.0
+    });
+    imageStyle.getAnchor = function() {
+      return [0.5, 1];
+    };
+    imageStyle.getImage = function() {
+      return image;
+    };
+    imageStyle.getImageSize = function() {
+      return [512, 512];
+    };
+    imageStyle.getOrigin = function() {
+      return [200, 200];
+    };
+    imageStyle.getSize = function() {
+      return [256, 256];
+    };
+    return imageStyle;
+  };
+
+  beforeEach(function() {
+    var tolerance = 0.1;
+    var maxExtent = [-10000, -20000, 10000, 20000];
+    replay = new ol.render.webgl.ImageReplay(tolerance, maxExtent);
+  });
+
+  describe('#setImageStyle', function() {
+
+    var imageStyle1, imageStyle2;
+
+    beforeEach(function() {
+      imageStyle1 = createImageStyle(new Image());
+      imageStyle2 = createImageStyle(new Image());
+    });
+
+    it('set expected states', function() {
+      replay.setImageStyle(imageStyle1);
+      expect(replay.anchorX_).to.be(0.5);
+      expect(replay.anchorY_).to.be(1);
+      expect(replay.height_).to.be(256);
+      expect(replay.imageHeight_).to.be(512);
+      expect(replay.imageWidth_).to.be(512);
+      expect(replay.opacity_).to.be(0.1);
+      expect(replay.originX_).to.be(200);
+      expect(replay.originY_).to.be(200);
+      expect(replay.rotation_).to.be(1.5);
+      expect(replay.rotateWithView_).to.be(true);
+      expect(replay.scale_).to.be(2.0);
+      expect(replay.width_).to.be(256);
+      expect(replay.images_).to.have.length(1);
+      expect(replay.groupIndices_).to.have.length(0);
+
+      replay.setImageStyle(imageStyle1);
+      expect(replay.images_).to.have.length(1);
+      expect(replay.groupIndices_).to.have.length(0);
+
+      replay.setImageStyle(imageStyle2);
+      expect(replay.images_).to.have.length(2);
+      expect(replay.groupIndices_).to.have.length(1);
+    });
+  });
+
+  describe('#drawPointGeometry', function() {
+    beforeEach(function() {
+      var imageStyle = createImageStyle(new Image());
+      replay.setImageStyle(imageStyle);
+    });
+
+    it('sets the buffer data', function() {
+      var point;
+
+      point = new ol.geom.Point([1000, 2000]);
+      replay.drawPointGeometry(point, null);
+      expect(replay.vertices_).to.have.length(32);
+      expect(replay.indices_).to.have.length(6);
+      expect(replay.indices_[0]).to.be(0);
+      expect(replay.indices_[1]).to.be(1);
+      expect(replay.indices_[2]).to.be(2);
+      expect(replay.indices_[3]).to.be(0);
+      expect(replay.indices_[4]).to.be(2);
+      expect(replay.indices_[5]).to.be(3);
+
+      point = new ol.geom.Point([2000, 3000]);
+      replay.drawPointGeometry(point, null);
+      expect(replay.vertices_).to.have.length(64);
+      expect(replay.indices_).to.have.length(12);
+      expect(replay.indices_[6]).to.be(4);
+      expect(replay.indices_[7]).to.be(5);
+      expect(replay.indices_[8]).to.be(6);
+      expect(replay.indices_[9]).to.be(4);
+      expect(replay.indices_[10]).to.be(6);
+      expect(replay.indices_[11]).to.be(7);
+    });
+  });
+
+  describe('#drawMultiPointGeometry', function() {
+    beforeEach(function() {
+      var imageStyle = createImageStyle(new Image());
+      replay.setImageStyle(imageStyle);
+    });
+
+    it('sets the buffer data', function() {
+      var multiPoint;
+
+      multiPoint = new ol.geom.MultiPoint(
+          [[1000, 2000], [2000, 3000]]);
+      replay.drawMultiPointGeometry(multiPoint, null);
+      expect(replay.vertices_).to.have.length(64);
+      expect(replay.indices_).to.have.length(12);
+      expect(replay.indices_[0]).to.be(0);
+      expect(replay.indices_[1]).to.be(1);
+      expect(replay.indices_[2]).to.be(2);
+      expect(replay.indices_[3]).to.be(0);
+      expect(replay.indices_[4]).to.be(2);
+      expect(replay.indices_[5]).to.be(3);
+      expect(replay.indices_[6]).to.be(4);
+      expect(replay.indices_[7]).to.be(5);
+      expect(replay.indices_[8]).to.be(6);
+      expect(replay.indices_[9]).to.be(4);
+      expect(replay.indices_[10]).to.be(6);
+      expect(replay.indices_[11]).to.be(7);
+
+      multiPoint = new ol.geom.MultiPoint(
+          [[3000, 4000], [4000, 5000]]);
+      replay.drawMultiPointGeometry(multiPoint, null);
+      expect(replay.vertices_).to.have.length(128);
+      expect(replay.indices_).to.have.length(24);
+      expect(replay.indices_[12]).to.be(8);
+      expect(replay.indices_[13]).to.be(9);
+      expect(replay.indices_[14]).to.be(10);
+      expect(replay.indices_[15]).to.be(8);
+      expect(replay.indices_[16]).to.be(10);
+      expect(replay.indices_[17]).to.be(11);
+      expect(replay.indices_[18]).to.be(12);
+      expect(replay.indices_[19]).to.be(13);
+      expect(replay.indices_[20]).to.be(14);
+      expect(replay.indices_[21]).to.be(12);
+      expect(replay.indices_[22]).to.be(14);
+      expect(replay.indices_[23]).to.be(15);
+    });
+  });
+});
+
+goog.require('ol.extent');
+goog.require('ol.geom.MultiPoint');
+goog.require('ol.geom.Point');
+goog.require('ol.render.webgl.ImageReplay');
+goog.require('ol.style.Image');
diff --git a/test/spec/ol/renderer/canvas/canvasreplay.test.js b/test/spec/ol/renderer/canvas/canvasreplay.test.js
new file mode 100644
index 0000000..a537079
--- /dev/null
+++ b/test/spec/ol/renderer/canvas/canvasreplay.test.js
@@ -0,0 +1,126 @@
+goog.provide('ol.test.renderer.canvas.Replay');
+
+describe('ol.render.canvas.Replay', function() {
+
+  describe('constructor', function() {
+
+    it('creates a new replay batch', function() {
+      var tolerance = 10;
+      var extent = [-180, -90, 180, 90];
+      var replay = new ol.render.canvas.Replay(tolerance, extent, 1);
+      expect(replay).to.be.a(ol.render.canvas.Replay);
+    });
+
+  });
+
+  describe('#appendFlatCoordinates()', function() {
+
+    var replay;
+    beforeEach(function() {
+      replay = new ol.render.canvas.Replay(1, [-180, -90, 180, 90], 1);
+    });
+
+    it('appends coordinates that are within the max extent', function() {
+      var flat = [-110, 45, 110, 45, 110, -45, -110, -45];
+      replay.appendFlatCoordinates(flat, 0, flat.length, 2, false);
+      expect(replay.coordinates).to.eql(flat);
+    });
+
+    it('works with a single coordinate (inside)', function() {
+      var flat = [-110, 45];
+      replay.appendFlatCoordinates(flat, 0, flat.length, 2, false);
+      expect(replay.coordinates).to.eql(flat);
+    });
+
+    it('always appends first point (even if outside)', function() {
+      // this could be changed, but to make the code simpler for properly
+      // closing rings, we always add the first point
+      var flat = [-110, 145];
+      replay.appendFlatCoordinates(flat, 0, flat.length, 2, false);
+      expect(replay.coordinates).to.eql(flat);
+    });
+
+    it('appends points when segments cross (top to bottom)', function() {
+      // this means we get a few extra points when coordinates are not
+      // part of a linestring or ring, but only a few extra
+      var flat = [0, 200, 0, -200];
+      replay.appendFlatCoordinates(flat, 0, flat.length, 2, false);
+      expect(replay.coordinates).to.eql(flat);
+    });
+
+    it('appends points when segments cross (top to inside)', function() {
+      var flat = [0, 200, 0, 0];
+      replay.appendFlatCoordinates(flat, 0, flat.length, 2, false);
+      expect(replay.coordinates).to.eql(flat);
+    });
+
+    it('always appends the first segment (even when outside)', function() {
+      // this could be changed, but to make the code simpler for properly
+      // closing rings, we always add the first segment
+      var flat = [-10, 200, 10, 200];
+      replay.appendFlatCoordinates(flat, 0, flat.length, 2, false);
+      expect(replay.coordinates).to.eql(flat);
+    });
+
+    it('eliminates segments outside (and not changing rel)', function() {
+      var flat = [0, 0, 0, 200, 10, 200];
+      replay.appendFlatCoordinates(flat, 0, flat.length, 2, false);
+      expect(replay.coordinates).to.eql([0, 0, 0, 200]);
+    });
+
+    it('includes outside segments that change relationship', function() {
+      var flat = [0, 0, 0, 200, 200, 200, 250, 200];
+      replay.appendFlatCoordinates(flat, 0, flat.length, 2, false);
+      expect(replay.coordinates).to.eql([0, 0, 0, 200, 200, 200]);
+    });
+
+  });
+
+});
+
+describe('ol.render.canvas.LineStringReplay', function() {
+
+  describe('#getBufferedMaxExtent()', function() {
+
+    it('buffers the max extent to accomodate stroke width', function() {
+      var tolerance = 1;
+      var extent = [-180, -90, 180, 90];
+      var resolution = 10;
+      var replay = new ol.render.canvas.LineStringReplay(tolerance, extent,
+          resolution);
+      var stroke = new ol.style.Stroke({
+        width: 2
+      });
+      replay.setFillStrokeStyle(null, stroke);
+      var buffered = replay.getBufferedMaxExtent();
+      expect(buffered).to.eql([-195, -105, 195, 105]);
+    });
+
+  });
+
+});
+
+describe('ol.render.canvas.PolygonReplay', function() {
+
+  describe('#getBufferedMaxExtent()', function() {
+
+    it('buffers the max extent to accomodate stroke width', function() {
+      var tolerance = 1;
+      var extent = [-180, -90, 180, 90];
+      var resolution = 10;
+      var replay = new ol.render.canvas.PolygonReplay(tolerance, extent,
+          resolution);
+      var stroke = new ol.style.Stroke({
+        width: 5
+      });
+      replay.setFillStrokeStyle(null, stroke);
+      var buffered = replay.getBufferedMaxExtent();
+      expect(buffered).to.eql([-210, -120, 210, 120]);
+    });
+
+  });
+
+});
+
+goog.require('ol.render.canvas.Replay');
+goog.require('ol.style.Stroke');
diff --git a/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js b/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js
new file mode 100644
index 0000000..65971bb
--- /dev/null
+++ b/test/spec/ol/renderer/canvas/canvasvectorlayerrenderer.test.js
@@ -0,0 +1,109 @@
+goog.provide('ol.test.renderer.canvas.VectorLayer');
+
+describe('ol.renderer.canvas.VectorLayer', function() {
+
+  describe('constructor', function() {
+
+    it('creates a new instance', function() {
+      var map = new ol.Map({
+        target: document.createElement('div')
+      });
+      var layer = new ol.layer.Vector({
+        source: new ol.source.Vector()
+      });
+      var renderer = new ol.renderer.canvas.VectorLayer(map.getRenderer(),
+          layer);
+      expect(renderer).to.be.a(ol.renderer.canvas.VectorLayer);
+    });
+
+    it('gives precedence to feature styles over layer styles', function() {
+      var target = document.createElement('div');
+      target.style.width = '256px';
+      target.style.height = '256px';
+      document.body.appendChild(target);
+      var map = new ol.Map({
+        view: new ol.View({
+          center: [0, 0],
+          zoom: 0
+        }),
+        target: target
+      });
+      var layerStyle = [new ol.style.Style({
+        text: new ol.style.Text({
+          text: 'layer'
+        })
+      })];
+      var featureStyle = [new ol.style.Style({
+        text: new ol.style.Text({
+          text: 'feature'
+        })
+      })];
+      var feature1 = new ol.Feature(new ol.geom.Point([0, 0]));
+      var feature2 = new ol.Feature(new ol.geom.Point([0, 0]));
+      feature2.setStyle(featureStyle);
+      var layer = new ol.layer.Vector({
+        source: new ol.source.Vector({
+          features: [feature1, feature2]
+        }),
+        style: layerStyle
+      });
+      map.addLayer(layer);
+      var spy = sinon.spy(map.getRenderer().getLayerRenderer(layer),
+          'renderFeature');
+      map.renderSync();
+      expect(spy.getCall(0).args[3]).to.be(layerStyle);
+      expect(spy.getCall(1).args[3]).to.be(featureStyle);
+      document.body.removeChild(target);
+    });
+
+  });
+
+  describe('#forEachFeatureAtPixel', function() {
+    var renderer;
+
+    beforeEach(function() {
+      var map = new ol.Map({});
+      var layer = new ol.layer.Vector({
+        source: new ol.source.Vector()
+      });
+      renderer = new ol.renderer.canvas.VectorLayer(
+          map.getRenderer(), layer);
+      var replayGroup = {};
+      renderer.replayGroup_ = replayGroup;
+      replayGroup.forEachGeometryAtPixel = function(resolution,
+          rotation, coordinate, skippedFeaturesUids, callback) {
+        var geometry = new ol.geom.Point([0, 0]);
+        var feature = new ol.Feature();
+        callback(geometry, feature);
+        callback(geometry, feature);
+      };
+    });
+
+    it('calls callback once per feature', function() {
+      var spy = sinon.spy();
+      var coordinate = [0, 0];
+      var frameState = {
+        skippedFeatureUids: {},
+        viewState: {
+          resolution: 1,
+          rotation: 0
+        }
+      };
+      renderer.forEachFeatureAtPixel(
+          coordinate, frameState, spy, undefined);
+      expect(spy.callCount).to.be(1);
+    });
+  });
+
+});
+
+
+goog.require('ol.Feature');
+goog.require('ol.Map');
+goog.require('ol.View');
+goog.require('ol.geom.Point');
+goog.require('ol.layer.Vector');
+goog.require('ol.renderer.canvas.VectorLayer');
+goog.require('ol.source.Vector');
+goog.require('ol.style.Style');
+goog.require('ol.style.Text');
diff --git a/test/spec/ol/renderer/webgl/webglimagelayerrenderer.test.js b/test/spec/ol/renderer/webgl/webglimagelayerrenderer.test.js
new file mode 100644
index 0000000..94515a6
--- /dev/null
+++ b/test/spec/ol/renderer/webgl/webglimagelayerrenderer.test.js
@@ -0,0 +1,88 @@
+goog.provide('ol.test.renderer.webgl.ImageLayer');
+
+describe('ol.renderer.webgl.ImageLayer', function() {
+  describe('updateProjectionMatrix_', function() {
+    var map;
+    var renderer;
+    var canvasWidth;
+    var canvasHeight;
+    var viewResolution;
+    var viewRotation;
+    var viewCenter;
+    var imageExtent;
+
+    beforeEach(function() {
+      ol.proj.common.add();
+
+      map = new ol.Map({
+        target: document.createElement('div')
+      });
+      var layer = new ol.layer.Image({
+        source: new ol.source.Image({
+          extent: [0, 0, 1, 1]
+        })
+      });
+      renderer = new ol.renderer.webgl.ImageLayer(map.renderer_, layer);
+
+      // input params
+      canvasWidth = 512;
+      canvasHeight = 256;
+      viewResolution = 10;
+      viewRotation = 0;
+      viewCenter = [7680, 3840];
+      // view extent is 512O, 2560, 10240, 5120
+
+      // image size is 1024, 768
+      // image resolution is 10
+      imageExtent = [0, 0, 10240, 7680];
+    });
+
+    afterEach(function() {
+      goog.dispose(map);
+    });
+
+    it('produces a correct matrix', function() {
+
+      renderer.updateProjectionMatrix_(canvasWidth, canvasHeight,
+          viewCenter, viewResolution, viewRotation, imageExtent);
+      var matrix = renderer.getProjectionMatrix();
+
+      var input;
+      var output = goog.vec.Vec4.createNumber();
+
+      input = goog.vec.Vec4.createFromValues(-1, -1, 0, 1);
+      goog.vec.Mat4.multVec4(matrix, input, output);
+      expect(output[0]).to.eql(-3);
+      expect(output[1]).to.eql(-3);
+
+      input = goog.vec.Vec4.createFromValues(1, -1, 0, 1);
+      goog.vec.Mat4.multVec4(matrix, input, output);
+      expect(output[0]).to.eql(1);
+      expect(output[1]).to.eql(-3);
+
+      input = goog.vec.Vec4.createFromValues(-1, 1, 0, 1);
+      goog.vec.Mat4.multVec4(matrix, input, output);
+      expect(output[0]).to.eql(-3);
+      expect(output[1]).to.eql(3);
+
+      input = goog.vec.Vec4.createFromValues(1, 1, 0, 1);
+      goog.vec.Mat4.multVec4(matrix, input, output);
+      expect(output[0]).to.eql(1);
+      expect(output[1]).to.eql(3);
+
+      input = goog.vec.Vec4.createFromValues(0, 0, 0, 1);
+      goog.vec.Mat4.multVec4(matrix, input, output);
+      expect(output[0]).to.eql(-1);
+      expect(output[1]).to.eql(0);
+    });
+  });
+});
+
+goog.require('goog.dispose');
+goog.require('goog.vec.Mat4');
+goog.require('goog.vec.Vec4');
+goog.require('ol.Map');
+goog.require('ol.proj.common');
+goog.require('ol.layer.Image');
+goog.require('ol.source.Image');
+goog.require('ol.renderer.webgl.ImageLayer');
diff --git a/test/spec/ol/resolutionconstraint.test.js b/test/spec/ol/resolutionconstraint.test.js
new file mode 100644
index 0000000..b89df9b
--- /dev/null
+++ b/test/spec/ol/resolutionconstraint.test.js
@@ -0,0 +1,242 @@
+goog.provide('ol.test.ResolutionConstraint');
+
+describe('ol.ResolutionConstraint', function() {
+
+  describe('SnapToResolution', function() {
+
+    var resolutionConstraint;
+
+    beforeEach(function() {
+      resolutionConstraint = ol.ResolutionConstraint.createSnapToResolutions(
+          [1000, 500, 250, 100]);
+    });
+
+    describe('delta 0', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1000, 0, 0)).to.eql(1000);
+        expect(resolutionConstraint(500, 0, 0)).to.eql(500);
+        expect(resolutionConstraint(250, 0, 0)).to.eql(250);
+        expect(resolutionConstraint(100, 0, 0)).to.eql(100);
+      });
+    });
+
+    describe('zoom in', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1000, 1, 0)).to.eql(500);
+        expect(resolutionConstraint(500, 1, 0)).to.eql(250);
+        expect(resolutionConstraint(250, 1, 0)).to.eql(100);
+        expect(resolutionConstraint(100, 1, 0)).to.eql(100);
+      });
+    });
+
+    describe('zoom out', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1000, -1, 0)).to.eql(1000);
+        expect(resolutionConstraint(500, -1, 0)).to.eql(1000);
+        expect(resolutionConstraint(250, -1, 0)).to.eql(500);
+        expect(resolutionConstraint(100, -1, 0)).to.eql(250);
+      });
+    });
+  });
+
+  describe('SnapToResolutions Nearest', function() {
+
+    var resolutionConstraint;
+
+    beforeEach(function() {
+      resolutionConstraint =
+          ol.ResolutionConstraint.createSnapToResolutions(
+              [1000, 500, 250, 100]);
+    });
+
+    describe('delta 0', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1050, 0, 0)).to.eql(1000);
+        expect(resolutionConstraint(950, 0, 0)).to.eql(1000);
+        expect(resolutionConstraint(550, 0, 0)).to.eql(500);
+        expect(resolutionConstraint(400, 0, 0)).to.eql(500);
+        expect(resolutionConstraint(300, 0, 0)).to.eql(250);
+        expect(resolutionConstraint(200, 0, 0)).to.eql(250);
+        expect(resolutionConstraint(150, 0, 0)).to.eql(100);
+        expect(resolutionConstraint(50, 0, 0)).to.eql(100);
+      });
+    });
+
+    describe('zoom in', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1050, 1, 0)).to.eql(500);
+        expect(resolutionConstraint(950, 1, 0)).to.eql(500);
+        expect(resolutionConstraint(550, 1, 0)).to.eql(250);
+        expect(resolutionConstraint(450, 1, 0)).to.eql(250);
+        expect(resolutionConstraint(300, 1, 0)).to.eql(100);
+        expect(resolutionConstraint(200, 1, 0)).to.eql(100);
+        expect(resolutionConstraint(150, 1, 0)).to.eql(100);
+        expect(resolutionConstraint(50, 1, 0)).to.eql(100);
+      });
+    });
+
+    describe('zoom out', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1050, -1, 0)).to.eql(1000);
+        expect(resolutionConstraint(950, -1, 0)).to.eql(1000);
+        expect(resolutionConstraint(550, -1, 0)).to.eql(1000);
+        expect(resolutionConstraint(450, -1, 0)).to.eql(1000);
+        expect(resolutionConstraint(300, -1, 0)).to.eql(500);
+        expect(resolutionConstraint(200, -1, 0)).to.eql(500);
+        expect(resolutionConstraint(150, -1, 0)).to.eql(250);
+        expect(resolutionConstraint(50, -1, 0)).to.eql(250);
+      });
+    });
+  });
+
+  describe('createSnapToPower', function() {
+
+    var resolutionConstraint;
+
+    beforeEach(function() {
+      resolutionConstraint =
+          ol.ResolutionConstraint.createSnapToPower(2, 1024, 10);
+    });
+
+    describe('delta 0', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1024, 0, 0)).to.eql(1024);
+        expect(resolutionConstraint(512, 0, 0)).to.eql(512);
+        expect(resolutionConstraint(256, 0, 0)).to.eql(256);
+        expect(resolutionConstraint(128, 0, 0)).to.eql(128);
+        expect(resolutionConstraint(64, 0, 0)).to.eql(64);
+        expect(resolutionConstraint(32, 0, 0)).to.eql(32);
+        expect(resolutionConstraint(16, 0, 0)).to.eql(16);
+        expect(resolutionConstraint(8, 0, 0)).to.eql(8);
+        expect(resolutionConstraint(4, 0, 0)).to.eql(4);
+        expect(resolutionConstraint(2, 0, 0)).to.eql(2);
+        expect(resolutionConstraint(1, 0, 0)).to.eql(1);
+      });
+    });
+
+    describe('zoom in', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1024, 1, 0)).to.eql(512);
+        expect(resolutionConstraint(512, 1, 0)).to.eql(256);
+        expect(resolutionConstraint(256, 1, 0)).to.eql(128);
+        expect(resolutionConstraint(128, 1, 0)).to.eql(64);
+        expect(resolutionConstraint(64, 1, 0)).to.eql(32);
+        expect(resolutionConstraint(32, 1, 0)).to.eql(16);
+        expect(resolutionConstraint(16, 1, 0)).to.eql(8);
+        expect(resolutionConstraint(8, 1, 0)).to.eql(4);
+        expect(resolutionConstraint(4, 1, 0)).to.eql(2);
+        expect(resolutionConstraint(2, 1, 0)).to.eql(1);
+        expect(resolutionConstraint(1, 1, 0)).to.eql(1);
+      });
+    });
+
+    describe('zoom out', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1024, -1, 0)).to.eql(1024);
+        expect(resolutionConstraint(512, -1, 0)).to.eql(1024);
+        expect(resolutionConstraint(256, -1, 0)).to.eql(512);
+        expect(resolutionConstraint(128, -1, 0)).to.eql(256);
+        expect(resolutionConstraint(64, -1, 0)).to.eql(128);
+        expect(resolutionConstraint(32, -1, 0)).to.eql(64);
+        expect(resolutionConstraint(16, -1, 0)).to.eql(32);
+        expect(resolutionConstraint(8, -1, 0)).to.eql(16);
+        expect(resolutionConstraint(4, -1, 0)).to.eql(8);
+        expect(resolutionConstraint(2, -1, 0)).to.eql(4);
+        expect(resolutionConstraint(1, -1, 0)).to.eql(2);
+      });
+    });
+  });
+
+  describe('createSnapToPower Nearest', function() {
+
+    var resolutionConstraint;
+
+    beforeEach(function() {
+      resolutionConstraint =
+          ol.ResolutionConstraint.createSnapToPower(2, 1024, 10);
+    });
+
+    describe('delta 0, direction 0', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1050, 0, 0)).to.eql(1024);
+        expect(resolutionConstraint(9050, 0, 0)).to.eql(1024);
+        expect(resolutionConstraint(550, 0, 0)).to.eql(512);
+        expect(resolutionConstraint(450, 0, 0)).to.eql(512);
+        expect(resolutionConstraint(300, 0, 0)).to.eql(256);
+        expect(resolutionConstraint(250, 0, 0)).to.eql(256);
+        expect(resolutionConstraint(150, 0, 0)).to.eql(128);
+        expect(resolutionConstraint(100, 0, 0)).to.eql(128);
+        expect(resolutionConstraint(75, 0, 0)).to.eql(64);
+        expect(resolutionConstraint(50, 0, 0)).to.eql(64);
+        expect(resolutionConstraint(40, 0, 0)).to.eql(32);
+        expect(resolutionConstraint(30, 0, 0)).to.eql(32);
+        expect(resolutionConstraint(20, 0, 0)).to.eql(16);
+        expect(resolutionConstraint(12, 0, 0)).to.eql(16);
+        expect(resolutionConstraint(9, 0, 0)).to.eql(8);
+        expect(resolutionConstraint(7, 0, 0)).to.eql(8);
+        expect(resolutionConstraint(5, 0, 0)).to.eql(4);
+        expect(resolutionConstraint(3.5, 0, 0)).to.eql(4);
+        expect(resolutionConstraint(2.1, 0, 0)).to.eql(2);
+        expect(resolutionConstraint(1.9, 0, 0)).to.eql(2);
+        expect(resolutionConstraint(1.1, 0, 0)).to.eql(1);
+        expect(resolutionConstraint(0.9, 0, 0)).to.eql(1);
+      });
+    });
+
+    describe('delta 0, direction > 0', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1050, 0, 1)).to.eql(1024);
+        expect(resolutionConstraint(9050, 0, 1)).to.eql(1024);
+        expect(resolutionConstraint(550, 0, 1)).to.eql(1024);
+        expect(resolutionConstraint(450, 0, 1)).to.eql(512);
+        expect(resolutionConstraint(300, 0, 1)).to.eql(512);
+        expect(resolutionConstraint(250, 0, 1)).to.eql(256);
+        expect(resolutionConstraint(150, 0, 1)).to.eql(256);
+        expect(resolutionConstraint(100, 0, 1)).to.eql(128);
+        expect(resolutionConstraint(75, 0, 1)).to.eql(128);
+        expect(resolutionConstraint(50, 0, 1)).to.eql(64);
+        expect(resolutionConstraint(40, 0, 1)).to.eql(64);
+        expect(resolutionConstraint(30, 0, 1)).to.eql(32);
+        expect(resolutionConstraint(20, 0, 1)).to.eql(32);
+        expect(resolutionConstraint(12, 0, 1)).to.eql(16);
+        expect(resolutionConstraint(9, 0, 1)).to.eql(16);
+        expect(resolutionConstraint(7, 0, 1)).to.eql(8);
+        expect(resolutionConstraint(5, 0, 1)).to.eql(8);
+        expect(resolutionConstraint(3.5, 0, 1)).to.eql(4);
+        expect(resolutionConstraint(2.1, 0, 1)).to.eql(4);
+        expect(resolutionConstraint(1.9, 0, 1)).to.eql(2);
+        expect(resolutionConstraint(1.1, 0, 1)).to.eql(2);
+        expect(resolutionConstraint(0.9, 0, 1)).to.eql(1);
+      });
+    });
+
+    describe('delta 0, direction < 0', function() {
+      it('returns expected resolution value', function() {
+        expect(resolutionConstraint(1050, 0, -1)).to.eql(1024);
+        expect(resolutionConstraint(9050, 0, -1)).to.eql(1024);
+        expect(resolutionConstraint(550, 0, -1)).to.eql(512);
+        expect(resolutionConstraint(450, 0, -1)).to.eql(256);
+        expect(resolutionConstraint(300, 0, -1)).to.eql(256);
+        expect(resolutionConstraint(250, 0, -1)).to.eql(128);
+        expect(resolutionConstraint(150, 0, -1)).to.eql(128);
+        expect(resolutionConstraint(100, 0, -1)).to.eql(64);
+        expect(resolutionConstraint(75, 0, -1)).to.eql(64);
+        expect(resolutionConstraint(50, 0, -1)).to.eql(32);
+        expect(resolutionConstraint(40, 0, -1)).to.eql(32);
+        expect(resolutionConstraint(30, 0, -1)).to.eql(16);
+        expect(resolutionConstraint(20, 0, -1)).to.eql(16);
+        expect(resolutionConstraint(12, 0, -1)).to.eql(8);
+        expect(resolutionConstraint(9, 0, -1)).to.eql(8);
+        expect(resolutionConstraint(7, 0, -1)).to.eql(4);
+        expect(resolutionConstraint(5, 0, -1)).to.eql(4);
+        expect(resolutionConstraint(3.5, 0, -1)).to.eql(2);
+        expect(resolutionConstraint(2.1, 0, -1)).to.eql(2);
+        expect(resolutionConstraint(1.9, 0, -1)).to.eql(1);
+        expect(resolutionConstraint(1.1, 0, -1)).to.eql(1);
+        expect(resolutionConstraint(0.9, 0, -1)).to.eql(1);
+      });
+    });
+  });
+});
+
+goog.require('ol.ResolutionConstraint');
diff --git a/test/spec/ol/rotationconstraint.test.js b/test/spec/ol/rotationconstraint.test.js
new file mode 100644
index 0000000..509d26a
--- /dev/null
+++ b/test/spec/ol/rotationconstraint.test.js
@@ -0,0 +1,36 @@
+goog.provide('ol.test.RotationConstraint');
+
+describe('ol.RotationConstraint', function() {
+
+  describe('SnapToZero', function() {
+
+    it('returns expected rotation value', function() {
+      var rotationConstraint = ol.RotationConstraint.createSnapToZero(0.3);
+
+      expect(rotationConstraint(0.1, 0)).to.eql(0);
+      expect(rotationConstraint(0.2, 0)).to.eql(0);
+      expect(rotationConstraint(0.3, 0)).to.eql(0);
+      expect(rotationConstraint(0.4, 0)).to.eql(0.4);
+
+      expect(rotationConstraint(-0.1, 0)).to.eql(0);
+      expect(rotationConstraint(-0.2, 0)).to.eql(0);
+      expect(rotationConstraint(-0.3, 0)).to.eql(0);
+      expect(rotationConstraint(-0.4, 0)).to.eql(-0.4);
+
+      expect(rotationConstraint(1, -0.9)).to.eql(0);
+      expect(rotationConstraint(1, -0.8)).to.eql(0);
+      // floating-point arithmetic
+      expect(rotationConstraint(1, -0.7)).not.to.eql(0);
+      expect(rotationConstraint(1, -0.6)).to.eql(0.4);
+
+      expect(rotationConstraint(-1, 0.9)).to.eql(0);
+      expect(rotationConstraint(-1, 0.8)).to.eql(0);
+      // floating-point arithmetic
+      expect(rotationConstraint(-1, 0.7)).not.to.eql(0);
+      expect(rotationConstraint(-1, 0.6)).to.eql(-0.4);
+    });
+
+  });
+});
+
+goog.require('ol.RotationConstraint');
diff --git a/test/spec/ol/source/clustersource.test.js b/test/spec/ol/source/clustersource.test.js
new file mode 100644
index 0000000..100206a
--- /dev/null
+++ b/test/spec/ol/source/clustersource.test.js
@@ -0,0 +1,21 @@
+goog.provide('ol.test.source.ClusterSource');
+
+goog.require('ol.source.Vector');
+
+describe('ol.source.Cluster', function() {
+
+  describe('constructor', function() {
+    it('returns a cluster source', function() {
+      var source = new ol.source.Cluster({
+        projection: ol.proj.get('EPSG:4326'),
+        source: new ol.source.Vector()
+      });
+      expect(source).to.be.a(ol.source.Source);
+      expect(source).to.be.a(ol.source.Cluster);
+    });
+  });
+});
+
+goog.require('ol.proj');
+goog.require('ol.source.Cluster');
+goog.require('ol.source.Source');
diff --git a/test/spec/ol/source/imagewmssource.test.js b/test/spec/ol/source/imagewmssource.test.js
new file mode 100644
index 0000000..5031017
--- /dev/null
+++ b/test/spec/ol/source/imagewmssource.test.js
@@ -0,0 +1,214 @@
+goog.provide('ol.test.source.ImageWMS');
+
+
+describe('ol.source.ImageWMS', function() {
+
+  var extent, pixelRatio, options, projection, resolution;
+  beforeEach(function() {
+    extent = [10, 20, 30, 40];
+    pixelRatio = 1;
+    projection = ol.proj.get('EPSG:4326');
+    resolution = 0.1;
+    options = {
+      params: {
+        'LAYERS': 'layer'
+      },
+      ratio: 1,
+      url: 'http://example.com/wms'
+    };
+  });
+
+  describe('#getImage', function() {
+
+    it('returns the expected image URL', function() {
+      var source = new ol.source.ImageWMS(options);
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      expect(uri.getScheme()).to.be('http');
+      expect(uri.getDomain()).to.be('example.com');
+      expect(uri.getPath()).to.be('/wms');
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('20,10,40,30');
+      expect(queryData.get('CRS')).to.be('EPSG:4326');
+      expect(queryData.get('FORMAT')).to.be('image/png');
+      expect(queryData.get('HEIGHT')).to.be('200');
+      expect(queryData.get('LAYERS')).to.be('layer');
+      expect(queryData.get('REQUEST')).to.be('GetMap');
+      expect(queryData.get('SERVICE')).to.be('WMS');
+      expect(queryData.get('SRS')).to.be(undefined);
+      expect(queryData.get('STYLES')).to.be('');
+      expect(queryData.get('TRANSPARENT')).to.be('true');
+      expect(queryData.get('VERSION')).to.be('1.3.0');
+      expect(queryData.get('WIDTH')).to.be('200');
+      expect(uri.getFragment()).to.be.empty();
+    });
+
+    it('sets the SRS query value instead of CRS if version < 1.3', function() {
+      options.params.VERSION = '1.2';
+      var source = new ol.source.ImageWMS(options);
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('CRS')).to.be(undefined);
+      expect(queryData.get('SRS')).to.be('EPSG:4326');
+    });
+
+    it('allows various parameters to be overridden', function() {
+      options.params.FORMAT = 'image/jpeg';
+      options.params.TRANSPARENT = false;
+      var source = new ol.source.ImageWMS(options);
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('FORMAT')).to.be('image/jpeg');
+      expect(queryData.get('TRANSPARENT')).to.be('false');
+    });
+
+    it('does not add a STYLES= option if one is specified', function() {
+      options.params.STYLES = 'foo';
+      var source = new ol.source.ImageWMS(options);
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('STYLES')).to.be('foo');
+    });
+
+    it('changes the BBOX order for EN axis orientations', function() {
+      var source = new ol.source.ImageWMS(options);
+      projection = ol.proj.get('CRS:84');
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('10,20,30,40');
+    });
+
+    it('uses EN BBOX order if version < 1.3', function() {
+      options.params.VERSION = '1.1.0';
+      var source = new ol.source.ImageWMS(options);
+      var image =
+          source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('10,20,30,40');
+    });
+
+    it('sets MAP_RESOLUTION when the server is MapServer', function() {
+      options.serverType = ol.source.wms.ServerType.MAPSERVER;
+      var source = new ol.source.ImageWMS(options);
+      pixelRatio = 2;
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('MAP_RESOLUTION')).to.be('180');
+    });
+
+    it('sets FORMAT_OPTIONS when the server is GeoServer', function() {
+      options.serverType = ol.source.wms.ServerType.GEOSERVER;
+      var source = new ol.source.ImageWMS(options);
+      pixelRatio = 2;
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('FORMAT_OPTIONS')).to.be('dpi:180');
+    });
+
+    it('rounds FORMAT_OPTIONS to an integer when the server is GeoServer',
+       function() {
+         options.serverType = ol.source.wms.ServerType.GEOSERVER;
+         var source = new ol.source.ImageWMS(options);
+         pixelRatio = 1.325;
+         var image =
+             source.getImage(extent, resolution, pixelRatio, projection);
+         var uri = new goog.Uri(image.src_);
+         var queryData = uri.getQueryData();
+         expect(queryData.get('FORMAT_OPTIONS')).to.be('dpi:119');
+       });
+
+    it('sets DPI when the server is QGIS', function() {
+      options.serverType = ol.source.wms.ServerType.QGIS;
+      var source = new ol.source.ImageWMS(options);
+      pixelRatio = 2;
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      var uri = new goog.Uri(image.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('DPI')).to.be('180');
+    });
+
+    it('creates an image with a custom imageLoadFunction', function() {
+      var imageLoadFunction = sinon.spy();
+      options.imageLoadFunction = imageLoadFunction;
+      var source = new ol.source.ImageWMS(options);
+      var image = source.getImage(extent, resolution, pixelRatio, projection);
+      image.load();
+      expect(imageLoadFunction).to.be.called();
+      expect(imageLoadFunction.calledWith(image, image.src_)).to.be(true);
+    });
+
+  });
+
+  describe('#getGetFeatureInfo', function() {
+
+    it('returns the expected GetFeatureInfo URL', function() {
+      var source = new ol.source.ImageWMS(options);
+      var url = source.getGetFeatureInfoUrl(
+          [20, 30], resolution, projection,
+          {INFO_FORMAT: 'text/plain'});
+      var uri = new goog.Uri(url);
+      expect(uri.getScheme()).to.be('http');
+      expect(uri.getDomain()).to.be('example.com');
+      expect(uri.getPath()).to.be('/wms');
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('24.95,14.95,35.05,25.05');
+      expect(queryData.get('CRS')).to.be('EPSG:4326');
+      expect(queryData.get('FORMAT')).to.be('image/png');
+      expect(queryData.get('HEIGHT')).to.be('101');
+      expect(queryData.get('I')).to.be('50');
+      expect(queryData.get('J')).to.be('50');
+      expect(queryData.get('LAYERS')).to.be('layer');
+      expect(queryData.get('QUERY_LAYERS')).to.be('layer');
+      expect(queryData.get('REQUEST')).to.be('GetFeatureInfo');
+      expect(queryData.get('SERVICE')).to.be('WMS');
+      expect(queryData.get('SRS')).to.be(undefined);
+      expect(queryData.get('STYLES')).to.be('');
+      expect(queryData.get('TRANSPARENT')).to.be('true');
+      expect(queryData.get('VERSION')).to.be('1.3.0');
+      expect(queryData.get('WIDTH')).to.be('101');
+      expect(uri.getFragment()).to.be.empty();
+    });
+
+    it('sets the QUERY_LAYERS param as expected', function() {
+      var source = new ol.source.ImageWMS(options);
+      var url = source.getGetFeatureInfoUrl(
+          [20, 30], resolution, projection,
+          {INFO_FORMAT: 'text/plain', QUERY_LAYERS: 'foo,bar'});
+      var uri = new goog.Uri(url);
+      expect(uri.getScheme()).to.be('http');
+      expect(uri.getDomain()).to.be('example.com');
+      expect(uri.getPath()).to.be('/wms');
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('24.95,14.95,35.05,25.05');
+      expect(queryData.get('CRS')).to.be('EPSG:4326');
+      expect(queryData.get('FORMAT')).to.be('image/png');
+      expect(queryData.get('HEIGHT')).to.be('101');
+      expect(queryData.get('I')).to.be('50');
+      expect(queryData.get('J')).to.be('50');
+      expect(queryData.get('LAYERS')).to.be('layer');
+      expect(queryData.get('QUERY_LAYERS')).to.be('foo,bar');
+      expect(queryData.get('REQUEST')).to.be('GetFeatureInfo');
+      expect(queryData.get('SERVICE')).to.be('WMS');
+      expect(queryData.get('SRS')).to.be(undefined);
+      expect(queryData.get('STYLES')).to.be('');
+      expect(queryData.get('TRANSPARENT')).to.be('true');
+      expect(queryData.get('VERSION')).to.be('1.3.0');
+      expect(queryData.get('WIDTH')).to.be('101');
+      expect(uri.getFragment()).to.be.empty();
+    });
+  });
+
+});
+
+
+goog.require('goog.Uri');
+goog.require('ol.source.ImageWMS');
+goog.require('ol.proj');
+goog.require('ol.source.wms.ServerType');
diff --git a/test/spec/ol/source/servervectorsource.test.js b/test/spec/ol/source/servervectorsource.test.js
new file mode 100644
index 0000000..17dd078
--- /dev/null
+++ b/test/spec/ol/source/servervectorsource.test.js
@@ -0,0 +1,68 @@
+goog.provide('ol.test.source.ServerVector');
+
+
+describe('ol.source.ServerVector', function() {
+
+  describe('when empty', function() {
+
+    var vectorSource;
+    beforeEach(function() {
+      vectorSource = new ol.source.ServerVector({});
+    });
+
+    describe('#addFeatures', function() {
+
+      it('adds features with the same id only once', function() {
+        var addfeatureSpy = sinon.spy();
+        vectorSource.on('addfeature', addfeatureSpy);
+        features = [];
+        var i;
+        var feature;
+        for (i = 0; i < 5; i++) {
+          feature = new ol.Feature();
+          feature.setId(0);
+          features.push(feature);
+        }
+        vectorSource.addFeatures(features);
+        expect(vectorSource.getFeatures().length).to.be(1);
+        expect(addfeatureSpy.callCount).to.be(1);
+      });
+
+      it('adds features all features with distinct ids', function() {
+        var addfeatureSpy = sinon.spy();
+        vectorSource.on('addfeature', addfeatureSpy);
+        features = [];
+        var i;
+        var feature;
+        for (i = 0; i < 5; i++) {
+          feature = new ol.Feature();
+          feature.setId(i);
+          features.push(feature);
+        }
+        vectorSource.addFeatures(features);
+        expect(vectorSource.getFeatures().length).to.be(5);
+        expect(addfeatureSpy.callCount).to.be(5);
+      });
+
+      it('adds features without ids', function() {
+        var addfeatureSpy = sinon.spy();
+        vectorSource.on('addfeature', addfeatureSpy);
+        features = [];
+        var i;
+        for (i = 0; i < 10; i++) {
+          features.push(new ol.Feature());
+        }
+        vectorSource.addFeatures(features);
+        expect(vectorSource.getFeatures().length).to.be(10);
+        expect(addfeatureSpy.callCount).to.be(10);
+      });
+
+    });
+
+  });
+
+});
+
+
+goog.require('ol.Feature');
+goog.require('ol.source.ServerVector');
diff --git a/test/spec/ol/source/tilesource.test.js b/test/spec/ol/source/tilesource.test.js
new file mode 100644
index 0000000..d2340c0
--- /dev/null
+++ b/test/spec/ol/source/tilesource.test.js
@@ -0,0 +1,278 @@
+goog.provide('ol.test.source.TileSource');
+
+describe('ol.source.Tile', function() {
+
+  describe('constructor', function() {
+    it('returns a tile source', function() {
+      var source = new ol.source.Tile({
+        projection: ol.proj.get('EPSG:4326')
+      });
+      expect(source).to.be.a(ol.source.Source);
+      expect(source).to.be.a(ol.source.Tile);
+    });
+  });
+
+  describe('#findLoadedTiles()', function() {
+
+    it('adds no tiles if none are already loaded', function() {
+      // a source with no loaded tiles
+      var source = new ol.test.source.TileMock({});
+
+      var loadedTilesByZ = {};
+      var grid = source.getTileGrid();
+      var extent = [-180, -180, 180, 180];
+      var range = grid.getTileRangeForExtentAndZ(extent, 3);
+
+      function getTileIfLoaded(z, x, y) {
+        var tile = source.getTile(z, x, y);
+        return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+            tile : null;
+      }
+      source.findLoadedTiles(loadedTilesByZ, getTileIfLoaded, 3, range);
+
+      var keys = goog.object.getKeys(loadedTilesByZ);
+      expect(keys.length).to.be(0);
+    });
+
+    it('adds loaded tiles to the lookup (z: 0)', function() {
+      // a source with no loaded tiles
+      var source = new ol.test.source.TileMock({
+        '0/0/0': true,
+        '1/0/0': true
+      });
+
+      var loadedTilesByZ = {};
+      var grid = source.getTileGrid();
+      var extent = [-180, -180, 180, 180];
+      var range = grid.getTileRangeForExtentAndZ(extent, 0);
+
+      function getTileIfLoaded(z, x, y) {
+        var tile = source.getTile(z, x, y);
+        return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+            tile : null;
+      }
+      source.findLoadedTiles(loadedTilesByZ, getTileIfLoaded, 0, range);
+      var keys = goog.object.getKeys(loadedTilesByZ);
+      expect(keys.length).to.be(1);
+      var tile = loadedTilesByZ['0']['0/0/0'];
+      expect(tile).to.be.a(ol.Tile);
+      expect(tile.state).to.be(ol.TileState.LOADED);
+    });
+
+    it('adds loaded tiles to the lookup (z: 1)', function() {
+      // a source with no loaded tiles
+      var source = new ol.test.source.TileMock({
+        '0/0/0': true,
+        '1/0/0': true
+      });
+
+      var loadedTilesByZ = {};
+      var grid = source.getTileGrid();
+      var extent = [-180, -180, 180, 180];
+      var range = grid.getTileRangeForExtentAndZ(extent, 1);
+
+      function getTileIfLoaded(z, x, y) {
+        var tile = source.getTile(z, x, y);
+        return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+            tile : null;
+      }
+      source.findLoadedTiles(loadedTilesByZ, getTileIfLoaded, 1, range);
+      var keys = goog.object.getKeys(loadedTilesByZ);
+      expect(keys.length).to.be(1);
+      var tile = loadedTilesByZ['1']['1/0/0'];
+      expect(tile).to.be.a(ol.Tile);
+      expect(tile.state).to.be(ol.TileState.LOADED);
+    });
+
+    it('returns true when all tiles are already loaded', function() {
+      // a source with no loaded tiles
+      var source = new ol.test.source.TileMock({
+        '1/0/0': true,
+        '1/0/1': true,
+        '1/1/0': true,
+        '1/1/1': true
+      });
+
+      var loadedTilesByZ = {};
+      var grid = source.getTileGrid();
+      var extent = [-180, -180, 180, 180];
+      var range = grid.getTileRangeForExtentAndZ(extent, 1);
+      function getTileIfLoaded(z, x, y) {
+        var tile = source.getTile(z, x, y);
+        return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+            tile : null;
+      }
+      var loaded = source.findLoadedTiles(
+          loadedTilesByZ, getTileIfLoaded, 1, range);
+      expect(loaded).to.be(true);
+    });
+
+    it('returns true when all tiles are already loaded (part 2)', function() {
+      // a source with no loaded tiles
+      var source = new ol.test.source.TileMock({});
+
+      var loadedTilesByZ = {
+        '1': {
+          '1/0/0': true,
+          '1/0/1': true,
+          '1/1/0': true,
+          '1/1/1': true,
+          '1/1/2': true
+        }
+      };
+      var grid = source.getTileGrid();
+      var extent = [-180, -180, 180, 180];
+      var range = grid.getTileRangeForExtentAndZ(extent, 1);
+
+      function getTileIfLoaded(z, x, y) {
+        var tile = source.getTile(z, x, y);
+        return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+            tile : null;
+      }
+      var loaded = source.findLoadedTiles(
+          loadedTilesByZ, getTileIfLoaded, 1, range);
+      expect(loaded).to.be(true);
+    });
+
+    it('returns false when all tiles are already loaded', function() {
+      // a source with no loaded tiles
+      var source = new ol.test.source.TileMock({
+        '1/0/0': true,
+        '1/0/1': true,
+        '1/1/0': true,
+        '1/1/1': false
+      });
+
+      var loadedTilesByZ = {};
+      var grid = source.getTileGrid();
+      var extent = [-180, -180, 180, 180];
+      var range = grid.getTileRangeForExtentAndZ(extent, 1);
+
+      function getTileIfLoaded(z, x, y) {
+        var tile = source.getTile(z, x, y);
+        return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+            tile : null;
+      }
+      var loaded = source.findLoadedTiles(
+          loadedTilesByZ, getTileIfLoaded, 1, range);
+      expect(loaded).to.be(false);
+    });
+
+    it('returns false when all tiles are already loaded (part 2)', function() {
+      // a source with no loaded tiles
+      var source = new ol.test.source.TileMock({});
+
+      var loadedTilesByZ = {
+        '1': {
+          '1/0/0': true,
+          '1/0/1': true,
+          '1/1/0': true,
+          '1/1/1': false
+        }
+      };
+      var grid = source.getTileGrid();
+      var extent = [-180, -180, 180, 180];
+      var range = grid.getTileRangeForExtentAndZ(extent, 1);
+
+      function getTileIfLoaded(z, x, y) {
+        var tile = source.getTile(z, x, y);
+        return (!goog.isNull(tile) && tile.getState() === ol.TileState.LOADED) ?
+            tile : null;
+      }
+      var loaded = source.findLoadedTiles(
+          loadedTilesByZ, getTileIfLoaded, 1, range);
+      expect(loaded).to.be(false);
+    });
+
+  });
+
+});
+
+
+
+/**
+ * Tile source for tests that uses a EPSG:4326 based grid with 4 resolutions and
+ * 256x256 tiles.
+ *
+ * @constructor
+ * @extends {ol.source.Tile}
+ * @param {Object.<string, boolean>} loaded Lookup of already loaded tiles.
+ */
+ol.test.source.TileMock = function(loaded) {
+  var tileGrid = new ol.tilegrid.TileGrid({
+    resolutions: [360 / 256, 180 / 256, 90 / 256, 45 / 256],
+    origin: [-180, -180],
+    tileSize: 256
+  });
+
+  goog.base(this, {
+    projection: ol.proj.get('EPSG:4326'),
+    tileGrid: tileGrid
+  });
+
+  /**
+   * @type {Object.<string, boolean>}
+   * @private
+   */
+  this.loaded_ = loaded;
+
+};
+goog.inherits(ol.test.source.TileMock, ol.source.Tile);
+
+
+/**
+ * @inheritDoc
+ */
+ol.test.source.TileMock.prototype.getTile = function(z, x, y) {
+  var key = ol.tilecoord.getKeyZXY(z, x, y);
+  var tileState = this.loaded_[key] ? ol.TileState.LOADED : ol.TileState.IDLE;
+  return new ol.Tile([z, x, y], tileState);
+};
+
+
+describe('ol.test.source.TileMock', function() {
+
+  describe('constructor', function() {
+    it('creates a tile source', function() {
+      var source = new ol.test.source.TileMock({});
+      expect(source).to.be.a(ol.source.Tile);
+      expect(source).to.be.a(ol.test.source.TileMock);
+    });
+  });
+
+  describe('#getTile()', function() {
+    it('returns a tile with state based on constructor arg', function() {
+      var source = new ol.test.source.TileMock({
+        '0/0/0': true,
+        '1/0/0': true
+      });
+      var tile;
+
+      // check a loaded tile
+      tile = source.getTile(0, 0, 0);
+      expect(tile).to.be.a(ol.Tile);
+      expect(tile.state).to.be(ol.TileState.LOADED);
+
+      // check a tile that is not loaded
+      tile = source.getTile(1, 0, -1);
+      expect(tile).to.be.a(ol.Tile);
+      expect(tile.state).to.be(ol.TileState.IDLE);
+
+      // check another loaded tile
+      tile = source.getTile(1, 0, 0);
+      expect(tile).to.be.a(ol.Tile);
+      expect(tile.state).to.be(ol.TileState.LOADED);
+
+    });
+  });
+
+});
+
+goog.require('goog.object');
+goog.require('ol.Tile');
+goog.require('ol.TileState');
+goog.require('ol.proj');
+goog.require('ol.source.Source');
+goog.require('ol.source.Tile');
+goog.require('ol.tilecoord');
+goog.require('ol.tilegrid.TileGrid');
diff --git a/test/spec/ol/source/tilewmssource.test.js b/test/spec/ol/source/tilewmssource.test.js
new file mode 100644
index 0000000..069248b
--- /dev/null
+++ b/test/spec/ol/source/tilewmssource.test.js
@@ -0,0 +1,207 @@
+goog.provide('ol.test.source.TileWMS');
+
+
+describe('ol.source.TileWMS', function() {
+
+  var options;
+  beforeEach(function() {
+    options = {
+      params: {
+        'LAYERS': 'layer'
+      },
+      url: 'http://example.com/wms'
+    };
+  });
+
+  describe('#getTile', function() {
+
+    it('returns a tile with the expected URL', function() {
+      var source = new ol.source.TileWMS(options);
+      var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:3857'));
+      expect(tile).to.be.an(ol.ImageTile);
+      var uri = new goog.Uri(tile.src_);
+      expect(uri.getScheme()).to.be('http');
+      expect(uri.getDomain()).to.be('example.com');
+      expect(uri.getPath()).to.be('/wms');
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be(
+          '-10018754.171394622,-15028131.257091932,' +
+          '-5009377.085697311,-10018754.17139462');
+      expect(queryData.get('CRS')).to.be('EPSG:3857');
+      expect(queryData.get('FORMAT')).to.be('image/png');
+      expect(queryData.get('HEIGHT')).to.be('256');
+      expect(queryData.get('LAYERS')).to.be('layer');
+      expect(queryData.get('REQUEST')).to.be('GetMap');
+      expect(queryData.get('SERVICE')).to.be('WMS');
+      expect(queryData.get('SRS')).to.be(undefined);
+      expect(queryData.get('STYLES')).to.be('');
+      expect(queryData.get('TRANSPARENT')).to.be('true');
+      expect(queryData.get('VERSION')).to.be('1.3.0');
+      expect(queryData.get('WIDTH')).to.be('256');
+      expect(uri.getFragment()).to.be.empty();
+    });
+
+    it('returns a larger tile when a gutter is specified', function() {
+      options.gutter = 16;
+      var source = new ol.source.TileWMS(options);
+      var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:3857'));
+      expect(tile).to.be.an(ol.ImageTile);
+      var uri = new goog.Uri(tile.src_);
+      var queryData = uri.getQueryData();
+      var bbox = queryData.get('BBOX').split(',');
+      var expected = [-10331840.239250705, -15341217.324948015,
+        -4696291.017841229, -9705668.103538537];
+      for (var i = 0, ii = bbox.length; i < ii; ++i) {
+        expect(parseFloat(bbox[i])).to.roughlyEqual(expected[i], 1e-9);
+      }
+      expect(queryData.get('HEIGHT')).to.be('288');
+      expect(queryData.get('WIDTH')).to.be('288');
+    });
+
+    it('sets the SRS query value instead of CRS if version < 1.3', function() {
+      options.params.VERSION = '1.2';
+      var source = new ol.source.TileWMS(options);
+      var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:4326'));
+      var uri = new goog.Uri(tile.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('CRS')).to.be(undefined);
+      expect(queryData.get('SRS')).to.be('EPSG:4326');
+    });
+
+    it('allows various parameters to be overridden', function() {
+      options.params.FORMAT = 'image/jpeg';
+      options.params.TRANSPARENT = false;
+      var source = new ol.source.TileWMS(options);
+      var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:4326'));
+      var uri = new goog.Uri(tile.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('FORMAT')).to.be('image/jpeg');
+      expect(queryData.get('TRANSPARENT')).to.be('false');
+    });
+
+    it('does not add a STYLES= option if one is specified', function() {
+      options.params.STYLES = 'foo';
+      var source = new ol.source.TileWMS(options);
+      var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:4326'));
+      var uri = new goog.Uri(tile.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('STYLES')).to.be('foo');
+    });
+
+    it('changes the BBOX order for EN axis orientations', function() {
+      var source = new ol.source.TileWMS(options);
+      var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:4326'));
+      var uri = new goog.Uri(tile.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('-45,-90,0,-45');
+    });
+
+    it('uses EN BBOX order if version < 1.3', function() {
+      options.params.VERSION = '1.1.0';
+      var source = new ol.source.TileWMS(options);
+      var tile = source.getTile(3, 2, 1, 1, ol.proj.get('CRS:84'));
+      var uri = new goog.Uri(tile.src_);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('-90,-45,-45,0');
+    });
+
+  });
+
+  describe('#tileUrlFunction', function() {
+
+    it('returns a tile if it is contained within layers extent', function() {
+      options.extent = [-80, -40, -50, -10];
+      var source = new ol.source.TileWMS(options);
+      var tileCoord = [3, 2, 1];
+      var url = source.tileUrlFunction(tileCoord, 1, ol.proj.get('EPSG:4326'));
+      var uri = new goog.Uri(url);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('-45,-90,0,-45');
+    });
+
+    it('returns a tile if it intersects layers extent', function() {
+      options.extent = [-80, -40, -40, -10];
+      var source = new ol.source.TileWMS(options);
+      var tileCoord = [3, 3, 1];
+      var url = source.tileUrlFunction(tileCoord, 1, ol.proj.get('EPSG:4326'));
+      var uri = new goog.Uri(url);
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be('-45,-45,0,0');
+    });
+
+  });
+
+  describe('#getGetFeatureInfo', function() {
+
+    it('returns the expected GetFeatureInfo URL', function() {
+      var source = new ol.source.TileWMS(options);
+      source.pixelRatio_ = 1;
+      var url = source.getGetFeatureInfoUrl(
+          [-7000000, -12000000],
+          19567.87924100512, ol.proj.get('EPSG:3857'),
+          {INFO_FORMAT: 'text/plain'});
+      var uri = new goog.Uri(url);
+      expect(uri.getScheme()).to.be('http');
+      expect(uri.getDomain()).to.be('example.com');
+      expect(uri.getPath()).to.be('/wms');
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be(
+          '-10018754.171394622,-15028131.257091932,' +
+          '-5009377.085697311,-10018754.17139462');
+      expect(queryData.get('CRS')).to.be('EPSG:3857');
+      expect(queryData.get('FORMAT')).to.be('image/png');
+      expect(queryData.get('HEIGHT')).to.be('256');
+      expect(queryData.get('I')).to.be('154');
+      expect(queryData.get('J')).to.be('101');
+      expect(queryData.get('LAYERS')).to.be('layer');
+      expect(queryData.get('QUERY_LAYERS')).to.be('layer');
+      expect(queryData.get('REQUEST')).to.be('GetFeatureInfo');
+      expect(queryData.get('SERVICE')).to.be('WMS');
+      expect(queryData.get('SRS')).to.be(undefined);
+      expect(queryData.get('STYLES')).to.be('');
+      expect(queryData.get('TRANSPARENT')).to.be('true');
+      expect(queryData.get('VERSION')).to.be('1.3.0');
+      expect(queryData.get('WIDTH')).to.be('256');
+      expect(uri.getFragment()).to.be.empty();
+    });
+
+    it('sets the QUERY_LAYERS param as expected', function() {
+      var source = new ol.source.TileWMS(options);
+      source.pixelRatio_ = 1;
+      var url = source.getGetFeatureInfoUrl(
+          [-7000000, -12000000],
+          19567.87924100512, ol.proj.get('EPSG:3857'),
+          {INFO_FORMAT: 'text/plain', QUERY_LAYERS: 'foo,bar'});
+      var uri = new goog.Uri(url);
+      expect(uri.getScheme()).to.be('http');
+      expect(uri.getDomain()).to.be('example.com');
+      expect(uri.getPath()).to.be('/wms');
+      var queryData = uri.getQueryData();
+      expect(queryData.get('BBOX')).to.be(
+          '-10018754.171394622,-15028131.257091932,' +
+          '-5009377.085697311,-10018754.17139462');
+      expect(queryData.get('CRS')).to.be('EPSG:3857');
+      expect(queryData.get('FORMAT')).to.be('image/png');
+      expect(queryData.get('HEIGHT')).to.be('256');
+      expect(queryData.get('I')).to.be('154');
+      expect(queryData.get('J')).to.be('101');
+      expect(queryData.get('LAYERS')).to.be('layer');
+      expect(queryData.get('QUERY_LAYERS')).to.be('foo,bar');
+      expect(queryData.get('REQUEST')).to.be('GetFeatureInfo');
+      expect(queryData.get('SERVICE')).to.be('WMS');
+      expect(queryData.get('SRS')).to.be(undefined);
+      expect(queryData.get('STYLES')).to.be('');
+      expect(queryData.get('TRANSPARENT')).to.be('true');
+      expect(queryData.get('VERSION')).to.be('1.3.0');
+      expect(queryData.get('WIDTH')).to.be('256');
+      expect(uri.getFragment()).to.be.empty();
+      expect(uri.getFragment()).to.be.empty();
+    });
+  });
+});
+
+
+goog.require('goog.Uri');
+goog.require('ol.ImageTile');
+goog.require('ol.source.TileWMS');
+goog.require('ol.proj');
diff --git a/test/spec/ol/source/vectorsource.test.js b/test/spec/ol/source/vectorsource.test.js
new file mode 100644
index 0000000..558cd72
--- /dev/null
+++ b/test/spec/ol/source/vectorsource.test.js
@@ -0,0 +1,418 @@
+goog.provide('ol.test.source.Vector');
+
+
+describe('ol.source.Vector', function() {
+
+  var pointFeature;
+  var infiniteExtent;
+  beforeEach(function() {
+    pointFeature = new ol.Feature(new ol.geom.Point([0, 0]));
+    infiniteExtent = [-Infinity, -Infinity, Infinity, Infinity];
+  });
+
+  describe('when empty', function() {
+
+    var vectorSource;
+    beforeEach(function() {
+      vectorSource = new ol.source.Vector();
+    });
+
+    describe('#forEachFeatureInExtent', function() {
+
+      it('does not call the callback', function() {
+        var f = sinon.spy();
+        vectorSource.forEachFeatureInExtent(infiniteExtent, f);
+        expect(f).not.to.be.called();
+      });
+
+    });
+
+    describe('#getFeaturesInExtent', function() {
+
+      it('returns an empty array', function() {
+        var features = vectorSource.getFeaturesInExtent(infiniteExtent);
+        expect(features).to.be.an(Array);
+        expect(features).to.be.empty();
+      });
+
+    });
+
+    describe('#isEmpty', function() {
+
+      it('returns true', function() {
+        expect(vectorSource.isEmpty()).to.be(true);
+      });
+
+    });
+
+    describe('#addFeature', function() {
+
+      it('can add a single point feature', function() {
+        vectorSource.addFeature(pointFeature);
+        var features = vectorSource.getFeaturesInExtent(infiniteExtent);
+        expect(features).to.be.an(Array);
+        expect(features).to.have.length(1);
+        expect(features[0]).to.be(pointFeature);
+      });
+
+      it('fires a change event', function() {
+        var listener = sinon.spy();
+        goog.events.listen(vectorSource, 'change', listener);
+        vectorSource.addFeature(pointFeature);
+        expect(listener).to.be.called();
+      });
+
+    });
+
+  });
+
+  describe('when populated with 10 random points and a null', function() {
+
+    var features;
+    var vectorSource;
+    beforeEach(function() {
+      features = [];
+      var i;
+      for (i = 0; i < 10; ++i) {
+        features[i] =
+            new ol.Feature(new ol.geom.Point([Math.random(), Math.random()]));
+      }
+      features.push(new ol.Feature(null));
+      vectorSource = new ol.source.Vector({
+        features: features
+      });
+    });
+
+    describe('#clear', function() {
+
+      it('removes all features using fast path', function() {
+        var changeSpy = sinon.spy();
+        goog.events.listen(vectorSource, 'change', changeSpy);
+        var removeFeatureSpy = sinon.spy();
+        goog.events.listen(vectorSource, 'removefeature', removeFeatureSpy);
+        var clearSourceSpy = sinon.spy();
+        goog.events.listen(vectorSource, 'clear', clearSourceSpy);
+        vectorSource.clear(true);
+        expect(vectorSource.getFeatures()).to.eql([]);
+        expect(vectorSource.isEmpty()).to.be(true);
+        expect(changeSpy).to.be.called();
+        expect(changeSpy.callCount).to.be(1);
+        expect(removeFeatureSpy).not.to.be.called();
+        expect(removeFeatureSpy.callCount).to.be(0);
+        expect(clearSourceSpy).to.be.called();
+        expect(clearSourceSpy.callCount).to.be(1);
+      });
+
+      it('removes all features using slow path', function() {
+        var changeSpy = sinon.spy();
+        goog.events.listen(vectorSource, 'change', changeSpy);
+        var removeFeatureSpy = sinon.spy();
+        goog.events.listen(vectorSource, 'removefeature', removeFeatureSpy);
+        var clearSourceSpy = sinon.spy();
+        goog.events.listen(vectorSource, 'clear', clearSourceSpy);
+        vectorSource.clear();
+        expect(vectorSource.getFeatures()).to.eql([]);
+        expect(vectorSource.isEmpty()).to.be(true);
+        expect(changeSpy).to.be.called();
+        expect(changeSpy.callCount).to.be(1);
+        expect(removeFeatureSpy).to.be.called();
+        expect(removeFeatureSpy.callCount).to.be(features.length);
+        expect(clearSourceSpy).to.be.called();
+        expect(clearSourceSpy.callCount).to.be(1);
+      });
+
+    });
+
+    describe('#forEachFeatureInExtent', function() {
+
+      it('is called the expected number of times', function() {
+        var f = sinon.spy();
+        vectorSource.forEachFeatureInExtent(infiniteExtent, f);
+        expect(f.callCount).to.be(10);
+      });
+
+      it('allows breaking out', function() {
+        var count = 0;
+        var result = vectorSource.forEachFeatureInExtent(infiniteExtent,
+            function(f) {
+              return ++count == 5;
+            });
+        expect(result).to.be(true);
+        expect(count).to.be(5);
+      });
+
+    });
+
+    describe('#getFeaturesInExtent', function() {
+
+      it('returns the expected number of features', function() {
+        expect(vectorSource.getFeaturesInExtent(infiniteExtent)).
+            to.have.length(10);
+      });
+
+    });
+
+    describe('#isEmpty', function() {
+
+      it('returns false', function() {
+        expect(vectorSource.isEmpty()).to.be(false);
+      });
+
+    });
+
+    describe('#removeFeature', function() {
+
+      it('works as expected', function() {
+        var i;
+        for (i = features.length - 1; i >= 0; --i) {
+          vectorSource.removeFeature(features[i]);
+          expect(vectorSource.getFeaturesInExtent(infiniteExtent)).
+              have.length(i);
+        }
+      });
+
+      it('fires a change event', function() {
+        var listener = sinon.spy();
+        goog.events.listen(vectorSource, 'change', listener);
+        vectorSource.removeFeature(features[0]);
+        expect(listener).to.be.called();
+      });
+
+    });
+
+    describe('modifying a feature\'s geometry', function() {
+
+      it('keeps the R-Tree index up to date', function() {
+        expect(vectorSource.getFeaturesInExtent([0, 0, 1, 1])).
+            to.have.length(10);
+        features[0].getGeometry().setCoordinates([100, 100]);
+        expect(vectorSource.getFeaturesInExtent([0, 0, 1, 1])).
+            to.have.length(9);
+        features[0].getGeometry().setCoordinates([0.5, 0.5]);
+        expect(vectorSource.getFeaturesInExtent([0, 0, 1, 1])).
+            to.have.length(10);
+      });
+
+    });
+
+    describe('setting a features geometry', function() {
+
+      it('keeps the R-Tree index up to date', function() {
+        expect(vectorSource.getFeaturesInExtent([0, 0, 1, 1])).
+            to.have.length(10);
+        features[0].setGeometry(new ol.geom.Point([100, 100]));
+        expect(vectorSource.getFeaturesInExtent([0, 0, 1, 1])).
+            to.have.length(9);
+      });
+
+    });
+
+  });
+
+  describe('tracking changes to features', function() {
+
+    var vectorSource;
+    beforeEach(function() {
+      vectorSource = new ol.source.Vector();
+    });
+
+    it('keeps its index up-to-date', function() {
+      var feature = new ol.Feature(new ol.geom.Point([1, 1]));
+      vectorSource.addFeature(feature);
+      expect(vectorSource.getFeaturesInExtent([0, 0, 2, 2])).
+          to.eql([feature]);
+      feature.getGeometry().setCoordinates([3, 3]);
+      expect(vectorSource.getFeaturesInExtent([0, 0, 2, 2])).
+          to.be.empty();
+      expect(vectorSource.getFeaturesInExtent([2, 2, 4, 4])).
+          to.eql([feature]);
+    });
+
+    it('handles features with null geometries', function() {
+      var feature = new ol.Feature(null);
+      vectorSource.addFeature(feature);
+      expect(vectorSource.getFeatures()).to.eql([feature]);
+    });
+
+    it('handles features with geometries changing from null', function() {
+      var feature = new ol.Feature(null);
+      vectorSource.addFeature(feature);
+      expect(vectorSource.getFeatures()).to.eql([feature]);
+      feature.setGeometry(new ol.geom.Point([1, 1]));
+      expect(vectorSource.getFeaturesInExtent([0, 0, 2, 2])).
+          to.eql([feature]);
+      expect(vectorSource.getFeatures()).to.eql([feature]);
+    });
+
+    it('handles features with geometries changing to null', function() {
+      var feature = new ol.Feature(new ol.geom.Point([1, 1]));
+      vectorSource.addFeature(feature);
+      expect(vectorSource.getFeatures()).to.eql([feature]);
+      expect(vectorSource.getFeaturesInExtent([0, 0, 2, 2])).
+          to.eql([feature]);
+      feature.setGeometry(null);
+      expect(vectorSource.getFeaturesInExtent([0, 0, 2, 2])).to.be.empty();
+      expect(vectorSource.getFeatures()).to.eql([feature]);
+    });
+
+    it('fires a change event when setting a feature\'s property', function() {
+      var feature = new ol.Feature(new ol.geom.Point([1, 1]));
+      vectorSource.addFeature(feature);
+      var listener = sinon.spy();
+      goog.events.listen(vectorSource, 'change', listener);
+      feature.set('foo', 'bar');
+      expect(listener).to.be.called();
+    });
+
+    it('fires a changefeature event when updating a feature', function() {
+      var feature = new ol.Feature(new ol.geom.Point([1, 1]));
+      vectorSource.addFeature(feature);
+      var listener = sinon.spy(function(event) {
+        expect(event.feature).to.be(feature);
+      });
+      vectorSource.on('changefeature', listener);
+      feature.setStyle(null);
+      expect(listener).to.be.called();
+    });
+
+  });
+
+  describe('#getFeatureById()', function() {
+    var source;
+    beforeEach(function() {
+      source = new ol.source.Vector();
+    });
+
+    it('returns a feature by id', function() {
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      source.addFeature(feature);
+      expect(source.getFeatureById('foo')).to.be(feature);
+    });
+
+    it('returns a feature by id (set after add)', function() {
+      var feature = new ol.Feature();
+      source.addFeature(feature);
+      expect(source.getFeatureById('foo')).to.be(null);
+      feature.setId('foo');
+      expect(source.getFeatureById('foo')).to.be(feature);
+    });
+
+    it('returns null when no feature is found', function() {
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      source.addFeature(feature);
+      expect(source.getFeatureById('bar')).to.be(null);
+    });
+
+    it('returns null after removing feature', function() {
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      source.addFeature(feature);
+      expect(source.getFeatureById('foo')).to.be(feature);
+      source.removeFeature(feature);
+      expect(source.getFeatureById('foo')).to.be(null);
+    });
+
+    it('returns null after unsetting id', function() {
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      source.addFeature(feature);
+      expect(source.getFeatureById('foo')).to.be(feature);
+      feature.setId(undefined);
+      expect(source.getFeatureById('foo')).to.be(null);
+    });
+
+    it('returns null after clear', function() {
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      source.addFeature(feature);
+      expect(source.getFeatureById('foo')).to.be(feature);
+      source.clear();
+      expect(source.getFeatureById('foo')).to.be(null);
+    });
+
+    it('returns null when no features are indexed', function() {
+      expect(source.getFeatureById('foo')).to.be(null);
+      source.addFeature(new ol.Feature());
+      expect(source.getFeatureById('foo')).to.be(null);
+    });
+
+    it('returns correct feature after add/remove/add', function() {
+      expect(source.getFeatureById('foo')).to.be(null);
+      var first = new ol.Feature();
+      first.setId('foo');
+      source.addFeature(first);
+      expect(source.getFeatureById('foo')).to.be(first);
+      source.removeFeature(first);
+      expect(source.getFeatureById('foo')).to.be(null);
+      var second = new ol.Feature();
+      second.setId('foo');
+      source.addFeature(second);
+      expect(source.getFeatureById('foo')).to.be(second);
+    });
+
+    it('returns correct feature after add/change', function() {
+      expect(source.getFeatureById('foo')).to.be(null);
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      source.addFeature(feature);
+      expect(source.getFeatureById('foo')).to.be(feature);
+      feature.setId('bar');
+      expect(source.getFeatureById('foo')).to.be(null);
+      expect(source.getFeatureById('bar')).to.be(feature);
+    });
+
+  });
+
+  describe('the feature id index', function() {
+    var source;
+    beforeEach(function() {
+      source = new ol.source.Vector();
+    });
+
+    it('allows adding feature with the same id', function() {
+      var feature = new ol.Feature();
+      feature.setId('foo');
+      source.addFeature(feature);
+      var dupe = new ol.Feature();
+      dupe.setId('foo');
+      source.addFeature(dupe);
+      expect(source.getFeatureById('foo')).to.be(dupe);
+    });
+
+    it('allows changing feature and set the same id', function() {
+      var foo = new ol.Feature();
+      foo.setId('foo');
+      source.addFeature(foo);
+      var bar = new ol.Feature();
+      bar.setId('bar');
+      source.addFeature(bar);
+      bar.setId('foo');
+      expect(source.getFeatureById('foo')).to.be(bar);
+    });
+
+  });
+
+  describe('the undefined feature id index', function() {
+    var source;
+    beforeEach(function() {
+      source = new ol.source.Vector();
+    });
+
+    it('disallows adding the same feature twice', function() {
+      var feature = new ol.Feature();
+      source.addFeature(feature);
+      expect(function() {
+        source.addFeature(feature);
+      }).to.throwException();
+    });
+  });
+
+});
+
+
+goog.require('goog.events');
+goog.require('ol.Feature');
+goog.require('ol.geom.Point');
+goog.require('ol.source.Vector');
diff --git a/test/spec/ol/source/vectorsource/single-feature.json b/test/spec/ol/source/vectorsource/single-feature.json
new file mode 100644
index 0000000..5d7944e
--- /dev/null
+++ b/test/spec/ol/source/vectorsource/single-feature.json
@@ -0,0 +1,16 @@
+{
+  "type": "FeatureCollection",
+  "features": [
+    {
+      "type": "Feature",
+      "id": "point_1",
+      "geometry": {
+        "coordinates": [1, 2],
+        "type": "Point"
+      },
+      "properties": {
+        "name": "point"
+      }
+    }
+  ]
+}
diff --git a/test/spec/ol/source/xyzsource.test.js b/test/spec/ol/source/xyzsource.test.js
new file mode 100644
index 0000000..1a9ed0c
--- /dev/null
+++ b/test/spec/ol/source/xyzsource.test.js
@@ -0,0 +1,101 @@
+goog.provide('ol.test.source.XYZ');
+
+
+describe('ol.source.XYZ', function() {
+
+  describe('constructor', function() {
+
+    it('can be constructed with a custom tile size', function() {
+      var tileSource = new ol.source.XYZ({
+        tileSize: 512
+      });
+      expect(tileSource.getTileGrid().getTileSize(0)).to.be(512);
+    });
+
+  });
+
+  describe('tileUrlFunction', function() {
+
+    var xyzTileSource, tileGrid;
+
+    beforeEach(function() {
+      xyzTileSource = new ol.source.XYZ({
+        maxZoom: 6,
+        url: '{z}/{x}/{y}'
+      });
+      tileGrid = xyzTileSource.getTileGrid();
+    });
+
+    it('return the expected URL', function() {
+
+      var coordinate = [829330.2064098881, 5933916.615134273];
+      var tileUrl;
+
+      tileUrl = xyzTileSource.tileUrlFunction(
+          tileGrid.getTileCoordForCoordAndZ(coordinate, 0));
+      expect(tileUrl).to.eql('0/0/0');
+
+      tileUrl = xyzTileSource.tileUrlFunction(
+          tileGrid.getTileCoordForCoordAndZ(coordinate, 1));
+      expect(tileUrl).to.eql('1/1/0');
+
+      tileUrl = xyzTileSource.tileUrlFunction(
+          tileGrid.getTileCoordForCoordAndZ(coordinate, 2));
+      expect(tileUrl).to.eql('2/2/1');
+
+      tileUrl = xyzTileSource.tileUrlFunction(
+          tileGrid.getTileCoordForCoordAndZ(coordinate, 3));
+      expect(tileUrl).to.eql('3/4/2');
+
+      tileUrl = xyzTileSource.tileUrlFunction(
+          tileGrid.getTileCoordForCoordAndZ(coordinate, 4));
+      expect(tileUrl).to.eql('4/8/5');
+
+      tileUrl = xyzTileSource.tileUrlFunction(
+          tileGrid.getTileCoordForCoordAndZ(coordinate, 5));
+      expect(tileUrl).to.eql('5/16/11');
+
+      tileUrl = xyzTileSource.tileUrlFunction(
+          tileGrid.getTileCoordForCoordAndZ(coordinate, 6));
+      expect(tileUrl).to.eql('6/33/22');
+
+    });
+
+    describe('wrap x', function() {
+
+      it('returns the expected URL', function() {
+        var tileUrl = xyzTileSource.tileUrlFunction(
+            [6, -31, -23]);
+        expect(tileUrl).to.eql('6/33/22');
+
+        tileUrl = xyzTileSource.tileUrlFunction([6, 33, -23]);
+        expect(tileUrl).to.eql('6/33/22');
+
+        tileUrl = xyzTileSource.tileUrlFunction([6, 97, -23]);
+        expect(tileUrl).to.eql('6/33/22');
+      });
+
+    });
+
+    describe('crop y', function() {
+
+      it('returns the expected URL', function() {
+        var tileUrl = xyzTileSource.tileUrlFunction(
+            [6, 33, -87]);
+        expect(tileUrl).to.be(undefined);
+
+        tileUrl = xyzTileSource.tileUrlFunction([6, 33, -23]);
+        expect(tileUrl).to.eql('6/33/22');
+
+        tileUrl = xyzTileSource.tileUrlFunction([6, 33, 41]);
+        expect(tileUrl).to.be(undefined);
+      });
+
+    });
+
+  });
+
+});
+
+goog.require('ol.TileCoord');
+goog.require('ol.source.XYZ');
diff --git a/test/spec/ol/sphere/sphere.test.js b/test/spec/ol/sphere/sphere.test.js
new file mode 100644
index 0000000..63ee543
--- /dev/null
+++ b/test/spec/ol/sphere/sphere.test.js
@@ -0,0 +1,271 @@
+// See http://www.movable-type.co.uk/scripts/latlong.html
+// FIXME add tests for crossTrackDistance
+// FIXME add tests for maximumLatitude
+// FIXME add tests for offset
+
+goog.provide('ol.test.Sphere');
+
+
+describe('ol.Sphere', function() {
+
+  var sphere = new ol.Sphere(6371);
+  var expected = [
+    {
+      c1: [0, 0],
+      c2: [0, 0],
+      cosineDistance: 0,
+      equirectangularDistance: 0,
+      finalBearing: 180,
+      haversineDistance: 0,
+      initialBearing: 0,
+      midpoint: [0, 0]
+    },
+    {
+      c1: [0, 0],
+      c2: [45, 45],
+      cosineDistance: 6671.695598673524,
+      equirectangularDistance: 6812.398372654371,
+      finalBearing: 54.735610317245346,
+      haversineDistance: 6671.695598673525,
+      initialBearing: 35.264389682754654,
+      midpoint: [18.434948822922006, 24.0948425521107]
+    },
+    {
+      c1: [0, 0],
+      c2: [-45, 45],
+      cosineDistance: 6671.695598673524,
+      equirectangularDistance: 6812.398372654371,
+      finalBearing: 305.26438968275465,
+      haversineDistance: 6671.695598673525,
+      initialBearing: -35.264389682754654,
+      midpoint: [-18.434948822922006, 24.0948425521107]
+    },
+    {
+      c1: [0, 0],
+      c2: [-45, -45],
+      cosineDistance: 6671.695598673524,
+      equirectangularDistance: 6812.398372654371,
+      finalBearing: 234.73561031724535,
+      haversineDistance: 6671.695598673525,
+      initialBearing: -144.73561031724535,
+      midpoint: [-18.434948822922006, -24.0948425521107]
+    },
+    {
+      c1: [0, 0],
+      c2: [45, -45],
+      cosineDistance: 6671.695598673524,
+      equirectangularDistance: 6812.398372654371,
+      finalBearing: 125.26438968275465,
+      haversineDistance: 6671.695598673525,
+      initialBearing: 144.73561031724535,
+      midpoint: [18.434948822922006, -24.0948425521107]
+    },
+    {
+      c1: [45, 45],
+      c2: [45, 45],
+      cosineDistance: 0,
+      equirectangularDistance: 0,
+      finalBearing: 180,
+      haversineDistance: 0,
+      initialBearing: 0,
+      midpoint: [45.00000000000005, 45]
+    },
+    {
+      c1: [45, 45],
+      c2: [-45, 45],
+      cosineDistance: 6671.695598673525,
+      equirectangularDistance: 7076.401799751738,
+      finalBearing: 234.73561031724535,
+      haversineDistance: 6671.695598673525,
+      initialBearing: -54.73561031724535,
+      midpoint: [0, 54.735610317245346]
+    },
+    {
+      c1: [45, 45],
+      c2: [-45, -45],
+      cosineDistance: 13343.391197347048,
+      equirectangularDistance: 14152.803599503475,
+      finalBearing: 234.73561031724535,
+      haversineDistance: 13343.391197347048,
+      initialBearing: -125.26438968275465,
+      midpoint: [0, 0]
+    },
+    {
+      c1: [45, 45],
+      c2: [45, -45],
+      cosineDistance: 10007.543398010284,
+      equirectangularDistance: 10007.543398010286,
+      finalBearing: 180,
+      haversineDistance: 10007.543398010286,
+      initialBearing: 180,
+      midpoint: [45.00000000000005, 0]
+    },
+    {
+      c1: [-45, 45],
+      c2: [-45, 45],
+      cosineDistance: 0,
+      equirectangularDistance: 0,
+      finalBearing: 180,
+      haversineDistance: 0,
+      initialBearing: 0,
+      midpoint: [-45.00000000000005, 45]
+    },
+    {
+      c1: [-45, 45],
+      c2: [-45, -45],
+      cosineDistance: 10007.543398010284,
+      equirectangularDistance: 10007.543398010286,
+      finalBearing: 180,
+      haversineDistance: 10007.543398010286,
+      initialBearing: 180,
+      midpoint: [-45.00000000000005, 0]
+    },
+    {
+      c1: [-45, 45],
+      c2: [45, -45],
+      cosineDistance: 13343.391197347048,
+      equirectangularDistance: 14152.803599503475,
+      finalBearing: 125.26438968275465,
+      haversineDistance: 13343.391197347048,
+      initialBearing: 125.26438968275465,
+      midpoint: [0, 0]
+    },
+    {
+      c1: [-45, -45],
+      c2: [-45, -45],
+      cosineDistance: 0,
+      equirectangularDistance: 0,
+      finalBearing: 180,
+      haversineDistance: 0,
+      initialBearing: 0,
+      midpoint: [-45.00000000000005, -45]
+    },
+    {
+      c1: [-45, -45],
+      c2: [45, -45],
+      cosineDistance: 6671.695598673525,
+      equirectangularDistance: 7076.401799751738,
+      finalBearing: 54.735610317245346,
+      haversineDistance: 6671.695598673525,
+      initialBearing: 125.26438968275465,
+      midpoint: [0, -54.735610317245346]
+    },
+    {
+      c1: [45, -45],
+      c2: [45, -45],
+      cosineDistance: 0,
+      equirectangularDistance: 0,
+      finalBearing: 180,
+      haversineDistance: 0,
+      initialBearing: 0,
+      midpoint: [45.00000000000005, -45]
+    }
+  ];
+
+  describe('cosineDistance', function() {
+
+    it('results match Chris Veness\'s reference implementation', function() {
+      var e, i;
+      for (i = 0; i < expected.length; ++i) {
+        e = expected[i];
+        expect(sphere.cosineDistance(e.c1, e.c2)).to.roughlyEqual(
+            e.cosineDistance, 1e-3);
+      }
+    });
+
+  });
+
+  describe('equirectangularDistance', function() {
+
+    it('results match Chris Veness\'s reference implementation', function() {
+      var e, i;
+      for (i = 0; i < expected.length; ++i) {
+        e = expected[i];
+        expect(sphere.equirectangularDistance(e.c1, e.c2)).to.roughlyEqual(
+            e.equirectangularDistance, 1e-9);
+      }
+    });
+
+  });
+
+  describe('finalBearing', function() {
+
+    it('results match Chris Veness\'s reference implementation', function() {
+      var e, i;
+      for (i = 0; i < expected.length; ++i) {
+        e = expected[i];
+        expect(sphere.finalBearing(e.c1, e.c2)).to.roughlyEqual(
+            e.finalBearing, 1e-9);
+      }
+    });
+
+  });
+
+  describe('haversineDistance', function() {
+
+    it('results match Chris Veness\'s reference implementation', function() {
+      var e, i;
+      for (i = 0; i < expected.length; ++i) {
+        e = expected[i];
+        expect(sphere.haversineDistance(e.c1, e.c2)).to.roughlyEqual(
+            e.haversineDistance, 1e-9);
+      }
+    });
+
+  });
+
+  describe('initialBearing', function() {
+
+    it('results match Chris Veness\'s reference implementation', function() {
+      var e, i;
+      for (i = 0; i < expected.length; ++i) {
+        e = expected[i];
+        expect(sphere.initialBearing(e.c1, e.c2)).to.roughlyEqual(
+            e.initialBearing, 1e-9);
+      }
+    });
+
+  });
+
+  describe('interpolate', function() {
+
+    it('results match at the start, midpoint, and end', function() {
+      var e, i;
+      for (i = 0; i < expected.length; ++i) {
+        e = expected[i];
+        var c1 = sphere.interpolate(e.c1, e.c2, 0);
+        expect(c1[0]).to.roughlyEqual(e.c1[0], 1e-9);
+        expect(c1[1]).to.roughlyEqual(e.c1[1], 1e-9);
+        var midpoint = sphere.interpolate(e.c1, e.c2, 0.5);
+        expect(midpoint[0]).to.roughlyEqual(e.midpoint[0], 1e-9);
+        expect(midpoint[1]).to.roughlyEqual(e.midpoint[1], 1e-5);
+        var c2 = sphere.interpolate(e.c1, e.c2, 1);
+        expect(c2[0]).to.roughlyEqual(e.c2[0], 1e-9);
+        expect(c2[1]).to.roughlyEqual(e.c2[1], 1e-5);
+      }
+    });
+
+  });
+
+  describe('midpoint', function() {
+
+    it('results match Chris Veness\'s reference implementation', function() {
+      var e, i, midpoint;
+      for (i = 0; i < expected.length; ++i) {
+        e = expected[i];
+        midpoint = sphere.midpoint(e.c1, e.c2);
+        // Test modulo 360 to avoid unnecessary expensive modulo operations
+        // in our implementation.
+        expect(goog.math.modulo(midpoint[0], 360)).to.roughlyEqual(
+            goog.math.modulo(e.midpoint[0], 360), 1e-9);
+        expect(midpoint[1]).to.roughlyEqual(e.midpoint[1], 1e-9);
+      }
+    });
+
+  });
+
+});
+
+
+goog.require('goog.math');
+goog.require('ol.Sphere');
diff --git a/test/spec/ol/structs/lrucache.test.js b/test/spec/ol/structs/lrucache.test.js
new file mode 100644
index 0000000..7c5e29a
--- /dev/null
+++ b/test/spec/ol/structs/lrucache.test.js
@@ -0,0 +1,191 @@
+goog.provide('ol.test.LRUCache');
+
+
+describe('ol.structs.LRUCache', function() {
+
+  var lruCache;
+
+  function fillLRUCache(lruCache) {
+    lruCache.set('a', 0);
+    lruCache.set('b', 1);
+    lruCache.set('c', 2);
+    lruCache.set('d', 3);
+  }
+
+  beforeEach(function() {
+    lruCache = new ol.structs.LRUCache();
+  });
+
+  describe('empty cache', function() {
+    it('has size zero', function() {
+      expect(lruCache.getCount()).to.eql(0);
+    });
+    it('has no keys', function() {
+      expect(lruCache.getKeys()).to.eql([]);
+    });
+    it('has no values', function() {
+      expect(lruCache.getValues()).to.eql([]);
+    });
+  });
+
+  describe('populating', function() {
+    it('returns the correct size', function() {
+      fillLRUCache(lruCache);
+      expect(lruCache.getCount()).to.eql(4);
+    });
+    it('contains the correct keys in the correct order', function() {
+      fillLRUCache(lruCache);
+      expect(lruCache.getKeys()).to.eql(['d', 'c', 'b', 'a']);
+    });
+    it('contains the correct values in the correct order', function() {
+      fillLRUCache(lruCache);
+      expect(lruCache.getValues()).to.eql([3, 2, 1, 0]);
+    });
+    it('reports which keys are contained', function() {
+      fillLRUCache(lruCache);
+      expect(lruCache.containsKey('a')).to.be.ok();
+      expect(lruCache.containsKey('b')).to.be.ok();
+      expect(lruCache.containsKey('c')).to.be.ok();
+      expect(lruCache.containsKey('d')).to.be.ok();
+      expect(lruCache.containsKey('e')).to.not.be();
+    });
+  });
+
+  describe('getting the oldest key', function() {
+    it('moves the key to newest position', function() {
+      fillLRUCache(lruCache);
+      lruCache.get('a');
+      expect(lruCache.getCount()).to.eql(4);
+      expect(lruCache.getKeys()).to.eql(['a', 'd', 'c', 'b']);
+      expect(lruCache.getValues()).to.eql([0, 3, 2, 1]);
+    });
+  });
+
+  describe('getting a key in the middle', function() {
+    it('moves the key to newest position', function() {
+      fillLRUCache(lruCache);
+      lruCache.get('b');
+      expect(lruCache.getCount()).to.eql(4);
+      expect(lruCache.getKeys()).to.eql(['b', 'd', 'c', 'a']);
+      expect(lruCache.getValues()).to.eql([1, 3, 2, 0]);
+    });
+  });
+
+  describe('getting the newest key', function() {
+    it('maintains the key to newest position', function() {
+      fillLRUCache(lruCache);
+      lruCache.get('d');
+      expect(lruCache.getCount()).to.eql(4);
+      expect(lruCache.getKeys()).to.eql(['d', 'c', 'b', 'a']);
+      expect(lruCache.getValues()).to.eql([3, 2, 1, 0]);
+    });
+  });
+
+  describe('setting a new value', function() {
+    it('adds it as the newest value', function() {
+      fillLRUCache(lruCache);
+      lruCache.set('e', 4);
+      expect(lruCache.getKeys()).to.eql(['e', 'd', 'c', 'b', 'a']);
+      expect(lruCache.getValues()).to.eql([4, 3, 2, 1, 0]);
+    });
+  });
+
+  describe('setting an existing value', function() {
+    it('raises an exception', function() {
+      fillLRUCache(lruCache);
+      expect(function() {
+        lruCache.set('a', 0);
+      }).to.throwException();
+    });
+  });
+
+  describe('disallowed keys', function() {
+    it('setting raises an exception', function() {
+      expect(function() {
+        lruCache.set('constructor', 0);
+      }).to.throwException();
+      expect(function() {
+        lruCache.set('hasOwnProperty', 0);
+      }).to.throwException();
+      expect(function() {
+        lruCache.set('isPrototypeOf', 0);
+      }).to.throwException();
+      expect(function() {
+        lruCache.set('propertyIsEnumerable', 0);
+      }).to.throwException();
+      expect(function() {
+        lruCache.set('toLocaleString', 0);
+      }).to.throwException();
+      expect(function() {
+        lruCache.set('toString', 0);
+      }).to.throwException();
+      expect(function() {
+        lruCache.set('valueOf', 0);
+      }).to.throwException();
+    });
+    it('getting returns false', function() {
+      expect(lruCache.containsKey('constructor')).to.not.be();
+      expect(lruCache.containsKey('hasOwnProperty')).to.not.be();
+      expect(lruCache.containsKey('isPrototypeOf')).to.not.be();
+      expect(lruCache.containsKey('propertyIsEnumerable')).to.not.be();
+      expect(lruCache.containsKey('toLocaleString')).to.not.be();
+      expect(lruCache.containsKey('toString')).to.not.be();
+      expect(lruCache.containsKey('valueOf')).to.not.be();
+    });
+  });
+
+  describe('popping a value', function() {
+    it('returns the least-recent-used value', function() {
+      fillLRUCache(lruCache);
+      expect(lruCache.pop()).to.eql(0);
+      expect(lruCache.getCount()).to.eql(3);
+      expect(lruCache.containsKey('a')).to.not.be();
+      expect(lruCache.pop()).to.eql(1);
+      expect(lruCache.getCount()).to.eql(2);
+      expect(lruCache.containsKey('b')).to.not.be();
+      expect(lruCache.pop()).to.eql(2);
+      expect(lruCache.getCount()).to.eql(1);
+      expect(lruCache.containsKey('c')).to.not.be();
+      expect(lruCache.pop()).to.eql(3);
+      expect(lruCache.getCount()).to.eql(0);
+      expect(lruCache.containsKey('d')).to.not.be();
+    });
+  });
+
+  describe('peeking at the last value', function() {
+    it('returns the last key', function() {
+      fillLRUCache(lruCache);
+      expect(lruCache.peekLast()).to.eql(0);
+    });
+    it('throws an exception when the cache is empty', function() {
+      expect(function() {
+        lruCache.peekLast();
+      }).to.throwException();
+    });
+  });
+
+  describe('peeking at the last key', function() {
+    it('returns the last key', function() {
+      fillLRUCache(lruCache);
+      expect(lruCache.peekLastKey()).to.eql('a');
+    });
+    it('throws an exception when the cache is empty', function() {
+      expect(function() {
+        lruCache.peekLastKey();
+      }).to.throwException();
+    });
+  });
+
+  describe('clearing the cache', function() {
+    it('clears the cache', function() {
+      fillLRUCache(lruCache);
+      lruCache.clear();
+      expect(lruCache.getCount()).to.eql(0);
+      expect(lruCache.getKeys()).to.eql([]);
+      expect(lruCache.getValues()).to.eql([]);
+    });
+  });
+
+});
+
+goog.require('ol.structs.LRUCache');
diff --git a/test/spec/ol/structs/priorityqueue.test.js b/test/spec/ol/structs/priorityqueue.test.js
new file mode 100644
index 0000000..60e84e4
--- /dev/null
+++ b/test/spec/ol/structs/priorityqueue.test.js
@@ -0,0 +1,186 @@
+goog.provide('ol.test.structs.PriorityQueue');
+
+
+describe('ol.structs.PriorityQueue', function() {
+
+  describe('when empty', function() {
+
+    var pq;
+    beforeEach(function() {
+      pq = new ol.structs.PriorityQueue(
+          goog.identityFunction, goog.identityFunction);
+    });
+
+    it('is valid', function() {
+      expect(function() {
+        pq.assertValid();
+      }).not.to.throwException();
+    });
+
+    it('is empty', function() {
+      expect(pq.isEmpty()).to.be(true);
+    });
+
+    it('dequeue raises an exception', function() {
+      expect(function() {
+        pq.dequeue();
+      }).to.throwException();
+    });
+
+    it('enqueue adds an element', function() {
+      pq.enqueue(0);
+      expect(function() {
+        pq.assertValid();
+      }).not.to.throwException();
+      expect(pq.elements_).to.eql([0]);
+      expect(pq.priorities_).to.eql([0]);
+    });
+
+    it('maintains the pq property while elements are enqueued', function() {
+      var i;
+      for (i = 0; i < 32; ++i) {
+        pq.enqueue(Math.random());
+        expect(function() {
+          pq.assertValid();
+        }).not.to.throwException();
+      }
+    });
+
+  });
+
+  describe('when populated', function() {
+
+    var elements, pq;
+    beforeEach(function() {
+      elements = [];
+      pq = new ol.structs.PriorityQueue(
+          goog.identityFunction, goog.identityFunction);
+      var element, i;
+      for (i = 0; i < 32; ++i) {
+        element = Math.random();
+        pq.enqueue(element);
+        elements.push(element);
+      }
+    });
+
+    it('dequeues elements in the correct order', function() {
+      elements.sort();
+      var i;
+      for (i = 0; i < elements.length; ++i) {
+        expect(pq.dequeue()).to.be(elements[i]);
+      }
+      expect(pq.isEmpty()).to.be(true);
+    });
+
+  });
+
+  describe('with an impure priority function', function() {
+
+    var pq, target;
+    beforeEach(function() {
+      target = 0.5;
+      pq = new ol.structs.PriorityQueue(function(element) {
+        return Math.abs(element - target);
+      }, goog.identityFunction);
+      var i;
+      for (i = 0; i < 32; ++i) {
+        pq.enqueue(Math.random());
+      }
+    });
+
+    it('dequeue elements in the correct order', function() {
+      var lastDelta = 0;
+      var delta;
+      while (!pq.isEmpty()) {
+        delta = Math.abs(pq.dequeue() - target);
+        expect(lastDelta <= delta).to.be(true);
+        lastDelta = delta;
+      }
+    });
+
+    it('allows reprioritization', function() {
+      var target = 0.5;
+      pq.reprioritize();
+      var lastDelta = 0;
+      var delta;
+      while (!pq.isEmpty()) {
+        delta = Math.abs(pq.dequeue() - target);
+        expect(lastDelta <= delta).to.be(true);
+        lastDelta = delta;
+      }
+    });
+
+    it('allows dropping during reprioritization', function() {
+      var target = 0.5;
+      var i = 0;
+      pq.priorityFunction_ = function(element) {
+        if (i++ % 2 === 0) {
+          return Math.abs(element - target);
+        } else {
+          return ol.structs.PriorityQueue.DROP;
+        }
+      };
+      pq.reprioritize();
+      expect(pq.getCount()).to.be(16);
+      var lastDelta = 0;
+      var delta;
+      while (!pq.isEmpty()) {
+        delta = Math.abs(pq.dequeue() - target);
+        expect(lastDelta <= delta).to.be(true);
+        lastDelta = delta;
+      }
+    });
+
+  });
+
+  describe('tracks elements in the queue', function() {
+
+    var pq;
+    beforeEach(function() {
+      pq = new ol.structs.PriorityQueue(
+          goog.identityFunction, goog.identityFunction);
+      pq.enqueue('a');
+      pq.enqueue('b');
+      pq.enqueue('c');
+    });
+
+    it('tracks which elements have been queued', function() {
+      expect(pq.isQueued('a')).to.be(true);
+      expect(pq.isQueued('b')).to.be(true);
+      expect(pq.isQueued('c')).to.be(true);
+    });
+
+    it('tracks which elements have not been queued', function() {
+      expect(pq.isQueued('d')).to.be(false);
+    });
+
+    it('raises an error when an queued element is re-queued', function() {
+      expect(function() {
+        pq.enqueue('a');
+      }).to.throwException();
+    });
+
+    it('tracks which elements have be dequeued', function() {
+      expect(pq.isQueued('a')).to.be(true);
+      expect(pq.isQueued('b')).to.be(true);
+      expect(pq.isQueued('c')).to.be(true);
+      expect(pq.dequeue()).to.be('a');
+      expect(pq.isQueued('a')).to.be(false);
+      expect(pq.isQueued('b')).to.be(true);
+      expect(pq.isQueued('c')).to.be(true);
+      expect(pq.dequeue()).to.be('b');
+      expect(pq.isQueued('a')).to.be(false);
+      expect(pq.isQueued('b')).to.be(false);
+      expect(pq.isQueued('c')).to.be(true);
+      expect(pq.dequeue()).to.be('c');
+      expect(pq.isQueued('a')).to.be(false);
+      expect(pq.isQueued('b')).to.be(false);
+      expect(pq.isQueued('c')).to.be(false);
+    });
+
+  });
+
+});
+
+
+goog.require('ol.structs.PriorityQueue');
diff --git a/test/spec/ol/structs/rbush.test.js b/test/spec/ol/structs/rbush.test.js
new file mode 100644
index 0000000..c765329
--- /dev/null
+++ b/test/spec/ol/structs/rbush.test.js
@@ -0,0 +1,359 @@
+goog.provide('ol.test.structs.RBush');
+
+
+describe('ol.structs.RBush', function() {
+
+  var rBush;
+  beforeEach(function() {
+    rBush = new ol.structs.RBush();
+  });
+
+  describe('when empty', function() {
+
+    describe('#getAll', function() {
+
+      it('returns the expected number of objects', function() {
+        expect(rBush.getAll()).to.be.empty();
+      });
+
+    });
+
+    describe('#isEmpty', function() {
+
+      it('returns true', function() {
+        expect(rBush.isEmpty()).to.be(true);
+      });
+
+    });
+
+  });
+
+  describe('with a single object', function() {
+
+    var obj;
+    beforeEach(function() {
+      obj = {};
+      rBush.insert([0, 0, 1, 1], obj);
+    });
+
+    it('can update the object', function() {
+      expect(rBush.getInExtent([0, 0, 1, 1])).to.eql([obj]);
+      rBush.update([2, 2, 3, 3], obj);
+      expect(rBush.getInExtent([0, 0, 1, 1])).to.be.empty();
+      expect(rBush.getAll()).to.eql([obj]);
+      expect(rBush.getInExtent([2, 2, 3, 3])).to.eql([obj]);
+    });
+
+  });
+
+  describe('with a few objects', function() {
+
+    var objs;
+    beforeEach(function() {
+      objs = [{}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}];
+      rBush.insert([0, 0, 1, 1], objs[0]);
+      rBush.insert([1, 1, 4, 4], objs[1]);
+      rBush.insert([2, 2, 3, 3], objs[2]);
+      rBush.insert([-5, -5, -4, -4], objs[3]);
+      rBush.insert([-4, -4, -1, -1], objs[4]);
+      rBush.insert([-3, -3, -2, -2], objs[5]);
+      rBush.insert([-3, -3, -2, -2], objs[6]);
+      rBush.insert([-3, -3, -2, -2], objs[7]);
+      rBush.insert([-3, -3, -2, -2], objs[8]);
+      rBush.insert([-3, -3, -2, -2], objs[9]);
+      rBush.insert([-3, -3, -2, -2], objs[10]);
+    });
+
+    describe('#forEach', function() {
+
+      it('called for all the objects', function() {
+        var i = 0;
+        rBush.forEach(function() {
+          ++i;
+        });
+        expect(i).to.be(objs.length);
+      });
+
+      it('stops when the function returns true', function() {
+        var i = 0;
+        var result = rBush.forEach(function() {
+          return ++i >= 4;
+        });
+        expect(i).to.be(4);
+        expect(result).to.be(true);
+      });
+
+    });
+
+    describe('#getInExtent', function() {
+
+      it('returns the expected objects', function() {
+        var result;
+        result = rBush.getInExtent([2, 2, 3, 3]);
+        expect(result).to.contain(objs[1]);
+        expect(result).to.contain(objs[2]);
+        expect(result.length).to.be(2);
+        result = rBush.getInExtent([-1, -1, 2, 2]);
+        expect(result).to.contain(objs[0]);
+        expect(result).to.contain(objs[1]);
+        expect(result).to.contain(objs[2]);
+        expect(result).to.contain(objs[4]);
+        expect(result.length).to.be(4);
+      });
+
+      it('returns an empty array when given a disjoint extent', function() {
+        expect(rBush.getInExtent([5, 5, 6, 6]).length).to.be(0);
+      });
+
+    });
+
+    describe('#insert', function() {
+
+      it('throws an exception if called while iterating over all values',
+          function() {
+            expect(function() {
+              rBush.forEach(function(value) {
+                rBush.insert([0, 0, 1, 1], {});
+              });
+            }).to.throwException();
+          });
+
+      it('throws an exception if called while iterating over an extent',
+          function() {
+            expect(function() {
+              rBush.forEachInExtent([-10, -10, 10, 10], function(value) {
+                rBush.insert([0, 0, 1, 1], {});
+              });
+            }).to.throwException();
+          });
+    });
+
+    describe('#isEmpty', function() {
+
+      it('returns false', function() {
+        expect(rBush.isEmpty()).to.be(false);
+      });
+
+    });
+
+    describe('#remove', function() {
+
+      it('can remove each object', function() {
+        var i, ii;
+        for (i = 0, ii = objs.length; i < ii; ++i) {
+          expect(rBush.getAll()).to.contain(objs[i]);
+          rBush.remove(objs[i]);
+          expect(rBush.getAll()).not.to.contain(objs[i]);
+        }
+      });
+
+      it('throws an exception if called while iterating over all values',
+          function() {
+            expect(function() {
+              rBush.forEach(function(value) {
+                rBush.remove(value);
+              });
+            }).to.throwException();
+          });
+
+      it('throws an exception if called while iterating over an extent',
+          function() {
+            expect(function() {
+              rBush.forEachInExtent([-10, -10, 10, 10], function(value) {
+                rBush.remove(value);
+              });
+            }).to.throwException();
+          });
+
+    });
+
+    describe('#update', function() {
+
+      it('throws an exception if called while iterating over all values',
+          function() {
+            expect(function() {
+              rBush.forEach(function(value) {
+                rBush.update([0, 0, 1, 1], objs[1]);
+              });
+            }).to.throwException();
+          });
+
+      it('throws an exception if called while iterating over an extent',
+          function() {
+            expect(function() {
+              rBush.forEachInExtent([-10, -10, 10, 10], function(value) {
+                rBush.update([0, 0, 1, 1], objs[1]);
+              });
+            }).to.throwException();
+          });
+    });
+
+  });
+
+  describe('with 100 objects', function() {
+
+    var extents, objs;
+    beforeEach(function() {
+      extents = [];
+      objs = [];
+      var i;
+      for (i = 0; i < 100; ++i) {
+        extents[i] = [i - 0.1, i - 0.1, i + 0.1, i + 0.1];
+        objs[i] = {id: i};
+        rBush.insert(extents[i], objs[i]);
+      }
+    });
+
+    describe('#getInExtent', function() {
+
+      it('returns the expected objects', function() {
+        var i, ii;
+        for (i = 0, ii = objs.length; i < ii; ++i) {
+          expect(rBush.getInExtent(extents[i])).to.eql([objs[i]]);
+        }
+      });
+
+    });
+
+    describe('#isEmpty', function() {
+
+      it('returns false', function() {
+        expect(rBush.isEmpty()).to.be(false);
+      });
+
+    });
+
+    describe('#remove', function() {
+
+      it('can remove each object in turn', function() {
+        var i, ii;
+        for (i = 0, ii = objs.length; i < ii; ++i) {
+          expect(rBush.getInExtent(extents[i])).to.eql([objs[i]]);
+          rBush.remove(objs[i]);
+          expect(rBush.getInExtent(extents[i])).to.be.empty();
+        }
+        expect(rBush.getAll()).to.be.empty();
+        expect(rBush.isEmpty()).to.be(true);
+      });
+
+      it('can remove objects in random order', function() {
+        var i, ii, j;
+        // http://en.wikipedia.org/wiki/Random_permutation
+        var indexes = [];
+        for (i = 0, ii = objs.length; i < ii; ++i) {
+          j = Math.floor(Math.random() * (i + 1));
+          indexes[i] = indexes[j];
+          indexes[j] = i;
+        }
+        for (i = 0, ii = objs.length; i < ii; ++i) {
+          var index = indexes[i];
+          expect(rBush.getInExtent(extents[index])).to.eql([objs[index]]);
+          rBush.remove(objs[index]);
+          expect(rBush.getInExtent(extents[index])).to.be.empty();
+        }
+        expect(rBush.getAll()).to.be.empty();
+        expect(rBush.isEmpty()).to.be(true);
+      });
+
+    });
+
+  });
+
+  describe('with 1000 objects', function() {
+
+    beforeEach(function() {
+      var i;
+      for (i = 0; i < 1000; ++i) {
+        var min = [Math.random() * 10000, Math.random() * 10000];
+        var max = [min[0] + Math.random() * 500, min[1] + Math.random() * 500];
+        var extent = [min[0], min[1], max[0], max[1]];
+        rBush.insert(extent, {id: i});
+      }
+    });
+
+    describe('#getAll', function() {
+
+      it('returns the expected number of objects', function() {
+        expect(rBush.getAll().length).to.be(1000);
+      });
+
+    });
+
+    describe('#getInExtent', function() {
+
+      it('returns the expected number of objects', function() {
+        expect(rBush.getInExtent([0, 0, 10600, 10600]).length).to.be(1000);
+      });
+
+      it('can perform 1000 in-extent searches', function() {
+        var n = 0;
+        var i;
+        for (i = 0; i < 1000; ++i) {
+          var min = [Math.random() * 10000, Math.random() * 10000];
+          var max = [min[0] + Math.random() * 500,
+                     min[1] + Math.random() * 500];
+          var extent = [min[0], min[1], max[0], max[1]];
+          n += rBush.getInExtent(extent).length;
+        }
+        expect(n).not.to.be(0);
+      });
+
+      it('can perform 1000 out-of-extent searches', function() {
+        var n = 0;
+        var i;
+        for (i = 0; i < 1000; ++i) {
+          var min = [-(Math.random() * 10000 + 501),
+                -(Math.random() * 10000 + 501)];
+          var max = [min[0] + Math.random() * 500,
+                     min[1] + Math.random() * 500];
+          var extent = [min[0], min[1], max[0], max[1]];
+          n += rBush.getInExtent(extent).length;
+        }
+        expect(n).to.be(0);
+      });
+
+    });
+
+    describe('#insert', function() {
+
+      it('can insert another 1000 objects', function() {
+        var i;
+        for (i = 1000; i < 2000; ++i) {
+          var min = [Math.random() * 10000, Math.random() * 10000];
+          var max = [min[0] + Math.random() * 500,
+                     min[1] + Math.random() * 500];
+          var extent = [min[0], min[1], max[0], max[1]];
+          rBush.insert(extent, {id: i});
+        }
+        expect(rBush.getInExtent([0, 0, 10600, 10600]).length).to.be(2000);
+      });
+
+    });
+
+    describe('#isEmpty', function() {
+
+      it('returns false', function() {
+        expect(rBush.isEmpty()).to.be(false);
+      });
+
+    });
+
+    describe('#remove', function() {
+
+      it('can remove all 1000 objects', function() {
+        var objs = rBush.getAll();
+        var i, value;
+        for (i = objs.length - 1; i >= 0; --i) {
+          value = objs[i];
+          rBush.remove(value);
+        }
+        expect(rBush.isEmpty()).to.be(true);
+      });
+
+    });
+
+  });
+
+});
+
+goog.require('ol.structs.RBush');
diff --git a/test/spec/ol/style.test.js b/test/spec/ol/style.test.js
new file mode 100644
index 0000000..2a42d4a
--- /dev/null
+++ b/test/spec/ol/style.test.js
@@ -0,0 +1,94 @@
+goog.provide('ol.test.style.Style');
+
+describe('ol.style.Style', function() {
+
+  describe('#setZIndex', function() {
+
+    it('sets the zIndex', function() {
+      var style = new ol.style.Style();
+
+      style.setZIndex(0.7);
+      expect(style.getZIndex()).to.be(0.7);
+    });
+  });
+
+  describe('#setGeometry', function() {
+    var style = new ol.style.Style();
+
+    it('creates a geometry function from a string', function() {
+      var feature = new ol.Feature();
+      feature.set('myGeom', new ol.geom.Point([0, 0]));
+      style.setGeometry('myGeom');
+      expect(style.getGeometryFunction()(feature))
+          .to.eql(feature.get('myGeom'));
+    });
+
+    it('creates a geometry function from a geometry', function() {
+      var geom = new ol.geom.Point([0, 0]);
+      style.setGeometry(geom);
+      expect(style.getGeometryFunction()())
+          .to.eql(geom);
+    });
+
+    it('returns the configured geometry function', function() {
+      var geom = new ol.geom.Point([0, 0]);
+      style.setGeometry(function() {
+        return geom;
+      });
+      expect(style.getGeometryFunction()())
+          .to.eql(geom);
+    });
+  });
+
+  describe('#getGeometry', function() {
+
+    it('returns whatever was passed to setGeometry', function() {
+      var style = new ol.style.Style();
+      style.setGeometry('foo');
+      expect(style.getGeometry()).to.eql('foo');
+      var geom = new ol.geom.Point([1, 2]);
+      style.setGeometry(geom);
+      expect(style.getGeometry()).to.eql(geom);
+      var fn = function() { return geom; };
+      style.setGeometry(fn);
+      expect(style.getGeometry()).to.eql(fn);
+      style.setGeometry(null);
+      expect(style.getGeometry()).to.eql(null);
+    });
+
+  });
+
+});
+
+describe('ol.style.createStyleFunction()', function() {
+  var style = new ol.style.Style();
+
+  it('creates a style function from a single style', function() {
+    var styleFunction = ol.style.createStyleFunction(style);
+    expect(styleFunction()).to.eql([style]);
+  });
+
+  it('creates a style function from an array of styles', function() {
+    var styleFunction = ol.style.createStyleFunction([style]);
+    expect(styleFunction()).to.eql([style]);
+  });
+
+  it('passes through a function', function() {
+    var original = function() {
+      return [style];
+    };
+    var styleFunction = ol.style.createStyleFunction(original);
+    expect(styleFunction).to.be(original);
+  });
+
+  it('throws on (some) unexpected input', function() {
+    expect(function() {
+      ol.style.createStyleFunction({bogus: 'input'});
+    }).to.throwException();
+  });
+
+});
+
+goog.require('ol.Feature');
+goog.require('ol.geom.Point');
+goog.require('ol.style.Style');
diff --git a/test/spec/ol/style/atlasmanager.test.js b/test/spec/ol/style/atlasmanager.test.js
new file mode 100644
index 0000000..66f5707
--- /dev/null
+++ b/test/spec/ol/style/atlasmanager.test.js
@@ -0,0 +1,273 @@
+goog.provide('ol.test.style.AtlasManager');
+
+
+describe('ol.style.Atlas', function() {
+
+  var defaultRender = function(context, x, y) {
+  };
+
+  describe('#constructor', function() {
+
+    it('inits the atlas', function() {
+      var atlas = new ol.style.Atlas(256, 1);
+      expect(atlas.emptyBlocks_).to.eql(
+          [{x: 0, y: 0, width: 256, height: 256}]);
+    });
+  });
+
+  describe('#add (squares with same size)', function() {
+
+    it('adds one entry', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+      var info = atlas.add('1', 32, 32, defaultRender);
+
+      expect(info).to.eql(
+          {offsetX: 1, offsetY: 1, image: atlas.canvas_});
+
+      expect(atlas.get('1')).to.eql(info);
+    });
+
+    it('adds two entries', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      atlas.add('1', 32, 32, defaultRender);
+      var info = atlas.add('2', 32, 32, defaultRender);
+
+      expect(info).to.eql(
+          {offsetX: 34, offsetY: 1, image: atlas.canvas_});
+
+      expect(atlas.get('2')).to.eql(info);
+    });
+
+    it('adds three entries', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      atlas.add('1', 32, 32, defaultRender);
+      atlas.add('2', 32, 32, defaultRender);
+      var info = atlas.add('3', 32, 32, defaultRender);
+
+      expect(info).to.eql(
+          {offsetX: 67, offsetY: 1, image: atlas.canvas_});
+
+      expect(atlas.get('3')).to.eql(info);
+    });
+
+    it('adds four entries (new row)', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      atlas.add('1', 32, 32, defaultRender);
+      atlas.add('2', 32, 32, defaultRender);
+      atlas.add('3', 32, 32, defaultRender);
+      var info = atlas.add('4', 32, 32, defaultRender);
+
+      expect(info).to.eql(
+          {offsetX: 1, offsetY: 34, image: atlas.canvas_});
+
+      expect(atlas.get('4')).to.eql(info);
+    });
+
+    it('returns null when an entry is too big', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      atlas.add('1', 32, 32, defaultRender);
+      atlas.add('2', 32, 32, defaultRender);
+      atlas.add('3', 32, 32, defaultRender);
+      var info = atlas.add(4, 100, 100, defaultRender);
+
+      expect(info).to.eql(null);
+    });
+
+    it('fills up the whole atlas', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      for (var i = 1; i <= 16; i++) {
+        expect(atlas.add(i.toString(), 28, 28, defaultRender)).to.be.ok();
+      }
+
+      // there is no more space for items of this size, the next one will fail
+      expect(atlas.add('17', 28, 28, defaultRender)).to.eql(null);
+    });
+  });
+
+  describe('#add (rectangles with different sizes)', function() {
+
+    it('adds a bunch of rectangles', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      expect(atlas.add('1', 64, 32, defaultRender)).to.eql(
+          {offsetX: 1, offsetY: 1, image: atlas.canvas_});
+
+      expect(atlas.add('2', 64, 32, defaultRender)).to.eql(
+          {offsetX: 1, offsetY: 34, image: atlas.canvas_});
+
+      expect(atlas.add('3', 64, 32, defaultRender)).to.eql(
+          {offsetX: 1, offsetY: 67, image: atlas.canvas_});
+
+      // this one can not be added anymore
+      expect(atlas.add('4', 64, 32, defaultRender)).to.eql(null);
+
+      // but there is still room for smaller ones
+      expect(atlas.add('5', 40, 32, defaultRender)).to.eql(
+          {offsetX: 66, offsetY: 1, image: atlas.canvas_});
+
+      expect(atlas.add('6', 40, 32, defaultRender)).to.eql(
+          {offsetX: 66, offsetY: 34, image: atlas.canvas_});
+    });
+
+    it('fills up the whole atlas (rectangles in portrait format)', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      for (var i = 1; i <= 32; i++) {
+        expect(atlas.add(i.toString(), 28, 14, defaultRender)).to.be.ok();
+      }
+
+      // there is no more space for items of this size, the next one will fail
+      expect(atlas.add('33', 28, 14, defaultRender)).to.eql(null);
+    });
+
+    it('fills up the whole atlas (rectangles in landscape format)', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      for (var i = 1; i <= 32; i++) {
+        expect(atlas.add(i.toString(), 14, 28, defaultRender)).to.be.ok();
+      }
+
+      // there is no more space for items of this size, the next one will fail
+      expect(atlas.add('33', 14, 28, defaultRender)).to.eql(null);
+    });
+  });
+
+  describe('#add (rendering)', function() {
+
+    it('calls the render callback with the right values', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+      var rendererCallback = sinon.spy();
+      atlas.add('1', 32, 32, rendererCallback);
+
+      expect(rendererCallback.calledOnce).to.be.ok();
+      expect(rendererCallback.calledWith(atlas.context_, 1, 1)).to.be.ok();
+
+      rendererCallback = sinon.spy();
+      atlas.add('2', 32, 32, rendererCallback);
+
+      expect(rendererCallback.calledOnce).to.be.ok();
+      expect(rendererCallback.calledWith(atlas.context_, 34, 1)).to.be.ok();
+    });
+
+    it('is possible to actually draw on the canvas', function() {
+      var atlas = new ol.style.Atlas(128, 1);
+
+      var rendererCallback = function(context, x, y) {
+        context.fillStyle = '#FFA500';
+        context.fillRect(x, y, 32, 32);
+      };
+
+      expect(atlas.add('1', 32, 32, rendererCallback)).to.be.ok();
+      expect(atlas.add('2', 32, 32, rendererCallback)).to.be.ok();
+      // no error, ok
+    });
+  });
+});
+
+
+describe('ol.style.AtlasManager', function() {
+
+  var defaultRender = function(context, x, y) {
+  };
+
+  describe('#constructor', function() {
+
+    it('inits the atlas manager', function() {
+      var manager = new ol.style.AtlasManager();
+      expect(manager.atlases_).to.not.be.empty();
+    });
+  });
+
+  describe('#add', function() {
+
+    it('adds one entry', function() {
+      var manager = new ol.style.AtlasManager({initialSize: 128});
+      var info = manager.add('1', 32, 32, defaultRender);
+
+      expect(info).to.eql({
+        offsetX: 1, offsetY: 1, image: manager.atlases_[0].canvas_,
+        hitOffsetX: undefined, hitOffsetY: undefined, hitImage: undefined});
+
+      expect(manager.getInfo('1')).to.eql(info);
+    });
+
+    it('adds one entry (also to the hit detection atlas)', function() {
+      var manager = new ol.style.AtlasManager({initialSize: 128});
+      var info = manager.add('1', 32, 32, defaultRender, defaultRender);
+
+      expect(info).to.eql({
+        offsetX: 1, offsetY: 1, image: manager.atlases_[0].canvas_,
+        hitOffsetX: 1, hitOffsetY: 1,
+        hitImage: manager.hitAtlases_[0].canvas_});
+
+      expect(manager.getInfo('1')).to.eql(info);
+    });
+
+    it('creates a new atlas if needed', function() {
+      var manager = new ol.style.AtlasManager({initialSize: 128});
+      expect(manager.add('1', 100, 100, defaultRender, defaultRender))
+          .to.be.ok();
+      var info = manager.add('2', 100, 100, defaultRender, defaultRender);
+      expect(info).to.be.ok();
+      expect(info.image.width).to.eql(256);
+      expect(manager.atlases_).to.have.length(2);
+      expect(info.hitImage.width).to.eql(256);
+      expect(manager.hitAtlases_).to.have.length(2);
+    });
+
+    it('creates new atlases until one is large enough', function() {
+      var manager = new ol.style.AtlasManager({initialSize: 128});
+      expect(manager.add('1', 100, 100, defaultRender, defaultRender))
+          .to.be.ok();
+      expect(manager.atlases_).to.have.length(1);
+      expect(manager.hitAtlases_).to.have.length(1);
+      var info = manager.add('2', 500, 500, defaultRender, defaultRender);
+      expect(info).to.be.ok();
+      expect(info.image.width).to.eql(512);
+      expect(manager.atlases_).to.have.length(3);
+      expect(info.hitImage.width).to.eql(512);
+      expect(manager.hitAtlases_).to.have.length(3);
+    });
+
+    it('checks all existing atlases and create a new if needed', function() {
+      var manager = new ol.style.AtlasManager({initialSize: 128});
+      expect(manager.add('1', 100, 100, defaultRender, defaultRender))
+          .to.be.ok();
+      expect(manager.add('2', 100, 100, defaultRender, defaultRender))
+          .to.be.ok();
+      expect(manager.atlases_).to.have.length(2);
+      expect(manager.hitAtlases_).to.have.length(2);
+      var info = manager.add(3, 500, 500, defaultRender, defaultRender);
+      expect(info).to.be.ok();
+      expect(info.image.width).to.eql(512);
+      expect(manager.atlases_).to.have.length(3);
+      expect(info.hitImage.width).to.eql(512);
+      expect(manager.hitAtlases_).to.have.length(3);
+    });
+
+    it('returns null if the size exceeds the maximum size', function() {
+      var manager = new ol.style.AtlasManager(
+          {initialSize: 128, maxSize: 2048});
+      expect(manager.add('1', 100, 100, defaultRender, defaultRender))
+          .to.be.ok();
+      expect(manager.add('2', 2048, 2048, defaultRender, defaultRender))
+          .to.eql(null);
+    });
+  });
+
+  describe('#getInfo', function() {
+
+    it('returns null if no entry for the given id', function() {
+      var manager = new ol.style.AtlasManager({initialSize: 128});
+      expect(manager.getInfo('123456')).to.eql(null);
+    });
+  });
+});
+
+goog.require('ol.style.Atlas');
+goog.require('ol.style.AtlasManager');
diff --git a/test/spec/ol/style/circlestyle.test.js b/test/spec/ol/style/circlestyle.test.js
new file mode 100644
index 0000000..4e5d0b9
--- /dev/null
+++ b/test/spec/ol/style/circlestyle.test.js
@@ -0,0 +1,240 @@
+goog.provide('ol.test.style.Circle');
+
+
+describe('ol.style.Circle', function() {
+
+  describe('#constructor', function() {
+
+    it('creates a canvas if no atlas is used (no fill-style)', function() {
+      var style = new ol.style.Circle({radius: 10});
+      expect(style.getImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getSize()).to.eql([21, 21]);
+      expect(style.getImageSize()).to.eql([21, 21]);
+      expect(style.getOrigin()).to.eql([0, 0]);
+      expect(style.getAnchor()).to.eql([10.5, 10.5]);
+      // hit-detection image is created, because no fill style is set
+      expect(style.getImage()).to.not.be(style.getHitDetectionImage());
+      expect(style.getHitDetectionImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getHitDetectionImageSize()).to.eql([21, 21]);
+      expect(style.getHitDetectionOrigin()).to.eql([0, 0]);
+    });
+
+    it('creates a canvas if no atlas is used (fill-style)', function() {
+      var style = new ol.style.Circle({
+        radius: 10,
+        fill: new ol.style.Fill({
+          color: '#FFFF00'
+        })
+      });
+      expect(style.getImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getSize()).to.eql([21, 21]);
+      expect(style.getImageSize()).to.eql([21, 21]);
+      expect(style.getOrigin()).to.eql([0, 0]);
+      expect(style.getAnchor()).to.eql([10.5, 10.5]);
+      // no hit-detection image is created, because fill style is set
+      expect(style.getImage()).to.be(style.getHitDetectionImage());
+      expect(style.getHitDetectionImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getHitDetectionImageSize()).to.eql([21, 21]);
+      expect(style.getHitDetectionOrigin()).to.eql([0, 0]);
+    });
+
+    it('adds itself to an atlas manager (no fill-style)', function() {
+      var atlasManager = new ol.style.AtlasManager({initialSize: 512});
+      var style = new ol.style.Circle({radius: 10, atlasManager: atlasManager});
+      expect(style.getImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getSize()).to.eql([21, 21]);
+      expect(style.getImageSize()).to.eql([512, 512]);
+      expect(style.getOrigin()).to.eql([1, 1]);
+      expect(style.getAnchor()).to.eql([10.5, 10.5]);
+      // hit-detection image is created, because no fill style is set
+      expect(style.getImage()).to.not.be(style.getHitDetectionImage());
+      expect(style.getHitDetectionImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getHitDetectionImageSize()).to.eql([512, 512]);
+      expect(style.getHitDetectionOrigin()).to.eql([1, 1]);
+    });
+
+    it('adds itself to an atlas manager (fill-style)', function() {
+      var atlasManager = new ol.style.AtlasManager({initialSize: 512});
+      var style = new ol.style.Circle({
+        radius: 10,
+        atlasManager: atlasManager,
+        fill: new ol.style.Fill({
+          color: '#FFFF00'
+        })
+      });
+      expect(style.getImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getSize()).to.eql([21, 21]);
+      expect(style.getImageSize()).to.eql([512, 512]);
+      expect(style.getOrigin()).to.eql([1, 1]);
+      expect(style.getAnchor()).to.eql([10.5, 10.5]);
+      // no hit-detection image is created, because fill style is set
+      expect(style.getImage()).to.be(style.getHitDetectionImage());
+      expect(style.getHitDetectionImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getHitDetectionImageSize()).to.eql([512, 512]);
+      expect(style.getHitDetectionOrigin()).to.eql([1, 1]);
+    });
+  });
+
+  describe('#getChecksum', function() {
+
+    it('calculates the same hash code for default options', function() {
+      var style1 = new ol.style.Circle();
+      var style2 = new ol.style.Circle();
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+    });
+
+    it('calculates not the same hash code (radius)', function() {
+      var style1 = new ol.style.Circle();
+      var style2 = new ol.style.Circle({
+        radius: 5
+      });
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('calculates the same hash code (radius)', function() {
+      var style1 = new ol.style.Circle({
+        radius: 5
+      });
+      var style2 = new ol.style.Circle({
+        radius: 5
+      });
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+    });
+
+    it('calculates not the same hash code (color)', function() {
+      var style1 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        })
+      });
+      var style2 = new ol.style.Circle({
+        radius: 5,
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('calculates the same hash code (everything set)', function() {
+      var style1 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3',
+          lineCap: 'round',
+          lineDash: [5, 15, 25],
+          lineJoin: 'miter',
+          miterLimit: 4,
+          width: 2
+        })
+      });
+      var style2 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3',
+          lineCap: 'round',
+          lineDash: [5, 15, 25],
+          lineJoin: 'miter',
+          miterLimit: 4,
+          width: 2
+        })
+      });
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+    });
+
+    it('calculates not the same hash code (stroke width differs)', function() {
+      var style1 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3',
+          lineCap: 'round',
+          lineDash: [5, 15, 25],
+          lineJoin: 'miter',
+          miterLimit: 4,
+          width: 3
+        })
+      });
+      var style2 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3',
+          lineCap: 'round',
+          lineDash: [5, 15, 25],
+          lineJoin: 'miter',
+          miterLimit: 4,
+          width: 2
+        })
+      });
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('invalidates a cached checksum if values change (fill)', function() {
+      var style1 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      var style2 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+
+      style1.getFill().setColor('red');
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('invalidates a cached checksum if values change (stroke)', function() {
+      var style1 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      var style2 = new ol.style.Circle({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+
+      style1.getStroke().setWidth(4);
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+  });
+});
+
+goog.require('ol.style.AtlasManager');
+goog.require('ol.style.Circle');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
diff --git a/test/spec/ol/style/iconstyle.test.js b/test/spec/ol/style/iconstyle.test.js
new file mode 100644
index 0000000..e84d55a
--- /dev/null
+++ b/test/spec/ol/style/iconstyle.test.js
@@ -0,0 +1,182 @@
+goog.provide('ol.test.style.Icon');
+goog.provide('ol.test.style.IconImageCache');
+
+goog.require('ol.style.Icon');
+goog.require('ol.style.IconAnchorUnits');
+goog.require('ol.style.IconOrigin');
+
+
+describe('ol.style.Icon', function() {
+  var size = [36, 48];
+
+  describe('#getAnchor', function() {
+    var fractionAnchor = [0.25, 0.25];
+
+    it('uses fractional units by default', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        anchor: fractionAnchor
+      });
+      expect(iconStyle.getAnchor()).to.eql([9, 12]);
+    });
+
+    it('uses pixels units', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        anchor: [2, 18],
+        anchorXUnits: ol.style.IconAnchorUnits.PIXELS,
+        anchorYUnits: ol.style.IconAnchorUnits.PIXELS
+      });
+      expect(iconStyle.getAnchor()).to.eql([2, 18]);
+    });
+
+    it('uses a bottom left anchor origin', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        anchor: fractionAnchor,
+        anchorOrigin: ol.style.IconOrigin.BOTTOM_LEFT
+      });
+      expect(iconStyle.getAnchor()).to.eql([9, 36]);
+    });
+
+    it('uses a bottom right anchor origin', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        anchor: fractionAnchor,
+        anchorOrigin: ol.style.IconOrigin.BOTTOM_RIGHT
+      });
+      expect(iconStyle.getAnchor()).to.eql([27, 36]);
+    });
+
+    it('uses a top right anchor origin', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        anchor: fractionAnchor,
+        anchorOrigin: ol.style.IconOrigin.TOP_RIGHT
+      });
+      expect(iconStyle.getAnchor()).to.eql([27, 12]);
+    });
+  });
+
+  describe('#getOrigin', function() {
+    var offset = [16, 20];
+    var imageSize = [144, 192];
+
+    it('uses a top left offset origin (default)', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        offset: offset
+      });
+      expect(iconStyle.getOrigin()).to.eql([16, 20]);
+    });
+
+    it('uses a bottom left offset origin', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        offset: offset,
+        offsetOrigin: ol.style.IconOrigin.BOTTOM_LEFT
+      });
+      iconStyle.iconImage_.size_ = imageSize;
+      expect(iconStyle.getOrigin()).to.eql([16, 124]);
+    });
+
+    it('uses a bottom right offset origin', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        offset: offset,
+        offsetOrigin: ol.style.IconOrigin.BOTTOM_RIGHT
+      });
+      iconStyle.iconImage_.size_ = imageSize;
+      expect(iconStyle.getOrigin()).to.eql([92, 124]);
+    });
+
+    it('uses a top right offset origin', function() {
+      var iconStyle = new ol.style.Icon({
+        src: 'test.png',
+        size: size,
+        offset: offset,
+        offsetOrigin: ol.style.IconOrigin.TOP_RIGHT
+      });
+      iconStyle.iconImage_.size_ = imageSize;
+      expect(iconStyle.getOrigin()).to.eql([92, 20]);
+    });
+  });
+});
+
+describe('ol.style.IconImageCache', function() {
+  var originalMaxCacheSize;
+
+  beforeEach(function() {
+    var cache = ol.style.IconImageCache.getInstance();
+    cache.clear();
+    originalMaxCacheSize = cache.maxCacheSize;
+    cache.maxCacheSize_ = 4;
+  });
+
+  afterEach(function() {
+    var cache = ol.style.IconImageCache.getInstance();
+    cache.maxCacheSize_ = originalMaxCacheSize;
+    cache.clear();
+  });
+
+  describe('#expire', function() {
+    it('expires images when expected', function() {
+      var cache = ol.style.IconImageCache.getInstance();
+
+      var i, src, iconImage, key;
+
+      for (i = 0; i < 4; ++i) {
+        src = i + '';
+        iconImage = new ol.style.IconImage_(src, null);
+        cache.set(src, null, iconImage);
+      }
+
+      expect(cache.cacheSize_).to.eql(4);
+
+      cache.expire();
+      expect(cache.cacheSize_).to.eql(4);
+
+      src = '4';
+      iconImage = new ol.style.IconImage_(src, null);
+      cache.set(src, null, iconImage);
+      expect(cache.cacheSize_).to.eql(5);
+
+      cache.expire(); // remove '0' and '4'
+      expect(cache.cacheSize_).to.eql(3);
+
+      src = '0';
+      iconImage = new ol.style.IconImage_(src, null);
+      goog.events.listen(iconImage, goog.events.EventType.CHANGE,
+          goog.nullFunction, false);
+      cache.set(src, null, iconImage);
+      expect(cache.cacheSize_).to.eql(4);
+
+      src = '4';
+      iconImage = new ol.style.IconImage_(src, null);
+      goog.events.listen(iconImage, goog.events.EventType.CHANGE,
+          goog.nullFunction, false);
+      cache.set(src, null, iconImage);
+      expect(cache.cacheSize_).to.eql(5);
+
+      // check that '0' and '4' are not removed from the cache
+      cache.expire();
+      key = ol.style.IconImageCache.getKey('0', null);
+      expect(key in cache.cache_).to.be.ok();
+      key = ol.style.IconImageCache.getKey('4', null);
+      expect(key in cache.cache_).to.be.ok();
+
+    });
+  });
+});
+
+goog.require('goog.events');
+goog.require('goog.events.EventType');
+goog.require('ol.style.IconImageCache');
diff --git a/test/spec/ol/style/regularshapestyle.test.js b/test/spec/ol/style/regularshapestyle.test.js
new file mode 100644
index 0000000..f972ae7
--- /dev/null
+++ b/test/spec/ol/style/regularshapestyle.test.js
@@ -0,0 +1,297 @@
+goog.provide('ol.test.style.RegularShape');
+
+describe('ol.style.RegularShape', function() {
+
+  describe('#constructor', function() {
+
+    it('can use radius', function() {
+      var style = new ol.style.RegularShape({
+        radius: 5,
+        radius2: 10
+      });
+      expect(style.getRadius()).to.eql(5);
+      expect(style.getRadius2()).to.eql(10);
+    });
+
+    it('can use radius1 as an alias for radius', function() {
+      var style = new ol.style.RegularShape({
+        radius1: 5,
+        radius2: 10
+      });
+      expect(style.getRadius()).to.eql(5);
+      expect(style.getRadius2()).to.eql(10);
+    });
+
+    it('will use radius for radius2 if radius2 not defined', function() {
+      var style = new ol.style.RegularShape({
+        radius: 5
+      });
+      expect(style.getRadius()).to.eql(5);
+      expect(style.getRadius2()).to.eql(5);
+    });
+
+    it('will use radius1 for radius2 if radius2 not defined', function() {
+      var style = new ol.style.RegularShape({
+        radius1: 5
+      });
+      expect(style.getRadius()).to.eql(5);
+      expect(style.getRadius2()).to.eql(5);
+    });
+
+    it('creates a canvas if no atlas is used (no fill-style)', function() {
+      var style = new ol.style.RegularShape({radius: 10});
+      expect(style.getImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getSize()).to.eql([21, 21]);
+      expect(style.getImageSize()).to.eql([21, 21]);
+      expect(style.getOrigin()).to.eql([0, 0]);
+      expect(style.getAnchor()).to.eql([10.5, 10.5]);
+      // hit-detection image is created, because no fill style is set
+      expect(style.getImage()).to.not.be(style.getHitDetectionImage());
+      expect(style.getHitDetectionImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getHitDetectionImageSize()).to.eql([21, 21]);
+      expect(style.getHitDetectionOrigin()).to.eql([0, 0]);
+    });
+
+    it('creates a canvas if no atlas is used (fill-style)', function() {
+      var style = new ol.style.RegularShape({
+        radius: 10,
+        fill: new ol.style.Fill({
+          color: '#FFFF00'
+        })
+      });
+      expect(style.getImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getSize()).to.eql([21, 21]);
+      expect(style.getImageSize()).to.eql([21, 21]);
+      expect(style.getOrigin()).to.eql([0, 0]);
+      expect(style.getAnchor()).to.eql([10.5, 10.5]);
+      // no hit-detection image is created, because fill style is set
+      expect(style.getImage()).to.be(style.getHitDetectionImage());
+      expect(style.getHitDetectionImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getHitDetectionImageSize()).to.eql([21, 21]);
+      expect(style.getHitDetectionOrigin()).to.eql([0, 0]);
+    });
+
+    it('adds itself to an atlas manager (no fill-style)', function() {
+      var atlasManager = new ol.style.AtlasManager({initialSize: 512});
+      var style = new ol.style.RegularShape(
+          {radius: 10, atlasManager: atlasManager});
+      expect(style.getImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getSize()).to.eql([21, 21]);
+      expect(style.getImageSize()).to.eql([512, 512]);
+      expect(style.getOrigin()).to.eql([1, 1]);
+      expect(style.getAnchor()).to.eql([10.5, 10.5]);
+      // hit-detection image is created, because no fill style is set
+      expect(style.getImage()).to.not.be(style.getHitDetectionImage());
+      expect(style.getHitDetectionImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getHitDetectionImageSize()).to.eql([512, 512]);
+      expect(style.getHitDetectionOrigin()).to.eql([1, 1]);
+    });
+
+    it('adds itself to an atlas manager (fill-style)', function() {
+      var atlasManager = new ol.style.AtlasManager({initialSize: 512});
+      var style = new ol.style.RegularShape({
+        radius: 10,
+        atlasManager: atlasManager,
+        fill: new ol.style.Fill({
+          color: '#FFFF00'
+        })
+      });
+      expect(style.getImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getSize()).to.eql([21, 21]);
+      expect(style.getImageSize()).to.eql([512, 512]);
+      expect(style.getOrigin()).to.eql([1, 1]);
+      expect(style.getAnchor()).to.eql([10.5, 10.5]);
+      // no hit-detection image is created, because fill style is set
+      expect(style.getImage()).to.be(style.getHitDetectionImage());
+      expect(style.getHitDetectionImage()).to.be.an(HTMLCanvasElement);
+      expect(style.getHitDetectionImageSize()).to.eql([512, 512]);
+      expect(style.getHitDetectionOrigin()).to.eql([1, 1]);
+    });
+  });
+
+
+  describe('#getChecksum', function() {
+
+    it('calculates not the same hash code (radius)', function() {
+      var style1 = new ol.style.RegularShape({
+        radius: 4,
+        radius2: 5
+      });
+      var style2 = new ol.style.RegularShape({
+        radius: 3,
+        radius2: 5
+      });
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('calculates not the same hash code (radius2)', function() {
+      var style1 = new ol.style.RegularShape({
+        radius: 4,
+        radius2: 5
+      });
+      var style2 = new ol.style.RegularShape({
+        radius: 4,
+        radius2: 6
+      });
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('calculates the same hash code (radius)', function() {
+      var style1 = new ol.style.RegularShape({
+        radius: 5
+      });
+      var style2 = new ol.style.RegularShape({
+        radius: 5
+      });
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+    });
+
+    it('calculates not the same hash code (color)', function() {
+      var style1 = new ol.style.RegularShape({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        })
+      });
+      var style2 = new ol.style.RegularShape({
+        radius: 5,
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('calculates the same hash code (everything set)', function() {
+      var style1 = new ol.style.RegularShape({
+        radius: 5,
+        radius2: 3,
+        angle: 1.41,
+        points: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3',
+          lineCap: 'round',
+          lineDash: [5, 15, 25],
+          lineJoin: 'miter',
+          miterLimit: 4,
+          width: 2
+        })
+      });
+      var style2 = new ol.style.RegularShape({
+        radius: 5,
+        radius2: 3,
+        angle: 1.41,
+        points: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3',
+          lineCap: 'round',
+          lineDash: [5, 15, 25],
+          lineJoin: 'miter',
+          miterLimit: 4,
+          width: 2
+        })
+      });
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+    });
+
+    it('calculates not the same hash code (stroke width differs)', function() {
+      var style1 = new ol.style.RegularShape({
+        radius: 5,
+        radius2: 3,
+        angle: 1.41,
+        points: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3',
+          lineCap: 'round',
+          lineDash: [5, 15, 25],
+          lineJoin: 'miter',
+          miterLimit: 4,
+          width: 3
+        })
+      });
+      var style2 = new ol.style.RegularShape({
+        radius: 5,
+        radius2: 3,
+        angle: 1.41,
+        points: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3',
+          lineCap: 'round',
+          lineDash: [5, 15, 25],
+          lineJoin: 'miter',
+          miterLimit: 4,
+          width: 2
+        })
+      });
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('invalidates a cached checksum if values change (fill)', function() {
+      var style1 = new ol.style.RegularShape({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      var style2 = new ol.style.RegularShape({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+
+      style1.getFill().setColor('red');
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+    it('invalidates a cached checksum if values change (stroke)', function() {
+      var style1 = new ol.style.RegularShape({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      var style2 = new ol.style.RegularShape({
+        radius: 5,
+        fill: new ol.style.Fill({
+          color: '#319FD3'
+        }),
+        stroke: new ol.style.Stroke({
+          color: '#319FD3'
+        })
+      });
+      expect(style1.getChecksum()).to.eql(style2.getChecksum());
+
+      style1.getStroke().setWidth(4);
+      expect(style1.getChecksum()).to.not.eql(style2.getChecksum());
+    });
+
+  });
+});
+
+goog.require('ol.style.AtlasManager');
+goog.require('ol.style.RegularShape');
+goog.require('ol.style.Fill');
+goog.require('ol.style.Stroke');
diff --git a/test/spec/ol/tilecoord.test.js b/test/spec/ol/tilecoord.test.js
new file mode 100644
index 0000000..d46c348
--- /dev/null
+++ b/test/spec/ol/tilecoord.test.js
@@ -0,0 +1,52 @@
+goog.provide('ol.test.TileCoord');
+
+describe('ol.TileCoord', function() {
+
+  describe('create', function() {
+    it('sets x y z properties as expected', function() {
+      var tileCoord = [1, 2, 3];
+      expect(tileCoord[0]).to.eql(1);
+      expect(tileCoord[1]).to.eql(2);
+      expect(tileCoord[2]).to.eql(3);
+    });
+  });
+
+  describe('create from quad key', function() {
+    it('sets x y z properties as expected', function() {
+      var tileCoord = ol.tilecoord.createFromQuadKey('213');
+      expect(tileCoord[0]).to.eql(3);
+      expect(tileCoord[1]).to.eql(3);
+      expect(tileCoord[2]).to.eql(5);
+    });
+  });
+
+  describe('create from string', function() {
+    it('sets x y z properties as expected', function() {
+      var str = '1/2/3';
+      var tileCoord = ol.tilecoord.createFromString(str);
+      expect(tileCoord[0]).to.eql(1);
+      expect(tileCoord[1]).to.eql(2);
+      expect(tileCoord[2]).to.eql(3);
+    });
+  });
+
+  describe('call quadKey', function() {
+    it('returns expected string', function() {
+      var tileCoord = [3, 3, 5];
+      var s = ol.tilecoord.quadKey(tileCoord);
+      expect(s).to.eql('213');
+    });
+  });
+
+  describe('hash', function() {
+    it('produces different hashes for different tile coords', function() {
+      var tileCoord1 = [3, 2, 1];
+      var tileCoord2 = [3, 1, 1];
+      expect(ol.tilecoord.hash(tileCoord1)).not.to.eql(
+          ol.tilecoord.hash(tileCoord2));
+    });
+  });
+});
+
+goog.require('ol.TileCoord');
+goog.require('ol.tilecoord');
diff --git a/test/spec/ol/tilegrid/tilegrid.test.js b/test/spec/ol/tilegrid/tilegrid.test.js
new file mode 100644
index 0000000..747b695
--- /dev/null
+++ b/test/spec/ol/tilegrid/tilegrid.test.js
@@ -0,0 +1,710 @@
+goog.provide('ol.test.TileGrid');
+
+describe('ol.tilegrid.TileGrid', function() {
+  var extent;
+  var resolutions;
+  var origin;
+  var origins;
+  var tileSize;
+
+  beforeEach(function() {
+    resolutions = [1000, 500, 250, 100];
+    extent = [0, 0, 100000, 100000];
+    origin = [0, 0];
+    origins = [];
+    tileSize = 100;
+  });
+
+  describe('create valid', function() {
+    it('does not throw an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: resolutions,
+          extent: extent,
+          origin: origin,
+          tileSize: tileSize
+        });
+      }).not.to.throwException();
+    });
+  });
+
+  describe('create with duplicate resolutions', function() {
+    it('throws an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 50, 25, 10],
+          extent: extent,
+          origin: origin,
+          tileSize: tileSize
+        });
+      }).to.throwException();
+    });
+  });
+
+  describe('create with out of order resolutions', function() {
+    it('throws an exception', function() {
+      var resolutions = [100, 25, 50, 10];
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: resolutions,
+          extent: extent,
+          origin: origin,
+          tileSize: tileSize
+        });
+      }).to.throwException();
+    });
+  });
+
+  describe('create with multiple origins', function() {
+    it('does not throw an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 25, 10],
+          extent: extent,
+          origins: [origin, origin, origin, origin],
+          tileSize: tileSize
+        });
+      }).not.to.throwException();
+    });
+  });
+
+  describe('create with both origin and multiple origins', function() {
+    it('throws an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 25, 10],
+          extent: extent,
+          origins: [origin, origin, origin, origin],
+          origin: origin,
+          tileSize: tileSize
+        });
+      }).to.throwException();
+    });
+  });
+
+  describe('create with too few origins', function() {
+    it('throws an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 25, 10],
+          extent: extent,
+          origins: [origin, origin, origin],
+          tileSize: tileSize
+        });
+      }).to.throwException();
+    });
+  });
+
+  describe('create with too many origins', function() {
+    it('throws an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 25, 10],
+          extent: extent,
+          origins: [origin, origin, origin, origin, origin],
+          tileSize: tileSize
+        });
+      }).to.throwException();
+    });
+  });
+
+  describe('create with multiple tileSizes', function() {
+    it('does not throw an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 25, 10],
+          extent: extent,
+          tileSizes: [tileSize, tileSize, tileSize, tileSize],
+          origin: origin
+        });
+      }).not.to.throwException();
+    });
+  });
+
+  describe('create with both tileSize and multiple tileSizes', function() {
+    it('throws an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 25, 10],
+          extent: extent,
+          tileSizes: [tileSize, tileSize, tileSize, tileSize],
+          tileSize: tileSize,
+          origin: origin
+        });
+      }).to.throwException();
+    });
+  });
+
+  describe('create with too few tileSizes', function() {
+    it('throws an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 25, 10],
+          extent: extent,
+          tileSizes: [tileSize, tileSize, tileSize],
+          origin: origin
+        });
+      }).to.throwException();
+    });
+  });
+
+  describe('create with too many tileSizes', function() {
+    it('throws an exception', function() {
+      expect(function() {
+        return new ol.tilegrid.TileGrid({
+          resolutions: [100, 50, 25, 10],
+          extent: extent,
+          tileSizes: [tileSize, tileSize, tileSize, tileSize, tileSize],
+          origin: origin
+        });
+      }).to.throwException();
+    });
+  });
+
+  describe('createForExtent', function() {
+    it('allows creation of tile grid from extent', function() {
+      var extent = ol.extent.createOrUpdate(-100, -100, 100, 100);
+      var grid = ol.tilegrid.createForExtent(extent);
+      expect(grid).to.be.a(ol.tilegrid.TileGrid);
+
+      var resolutions = grid.getResolutions();
+      expect(resolutions.length).to.be(ol.DEFAULT_MAX_ZOOM + 1);
+      expect(grid.getOrigin()).to.eql([-100, -100]);
+    });
+  });
+
+  describe('createForProjection', function() {
+
+    it('allows easier creation of a tile grid', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.createForProjection(projection);
+      expect(grid).to.be.a(ol.tilegrid.TileGrid);
+
+      var resolutions = grid.getResolutions();
+      expect(resolutions.length).to.be(ol.DEFAULT_MAX_ZOOM + 1);
+    });
+
+    it('accepts a number of zoom levels', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.createForProjection(projection, 18);
+      expect(grid).to.be.a(ol.tilegrid.TileGrid);
+
+      var resolutions = grid.getResolutions();
+      expect(resolutions.length).to.be(19);
+    });
+
+    it('accepts a big number of zoom levels', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.createForProjection(projection, 23);
+      expect(grid).to.be.a(ol.tilegrid.TileGrid);
+
+      var resolutions = grid.getResolutions();
+      expect(resolutions.length).to.be(24);
+    });
+
+    it('works for projections unknown to the client', function() {
+      var projection = new ol.proj.Projection(
+          {code: 'EPSG:31287', units: 'm'});
+      var grid = ol.tilegrid.createForProjection(projection);
+      var resolutions = grid.getResolutions();
+      expect(resolutions[5]).to.be(
+          360 * ol.proj.METERS_PER_UNIT[ol.proj.Units.DEGREES] /
+          ol.DEFAULT_TILE_SIZE / Math.pow(2, 5));
+    });
+
+    it('assumes origin is bottom-left', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.createForProjection(projection);
+      var origin = grid.getOrigin();
+      var half = ol.proj.EPSG3857.HALF_SIZE;
+      expect(origin).to.eql([-half, -half]);
+    });
+
+    it('accepts bottom-left as corner', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.createForProjection(
+          projection, undefined, undefined, ol.extent.Corner.BOTTOM_LEFT);
+      var origin = grid.getOrigin();
+      var half = ol.proj.EPSG3857.HALF_SIZE;
+      expect(origin).to.eql([-half, -half]);
+    });
+
+    it('accepts bottom-right as corner', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.createForProjection(
+          projection, undefined, undefined, ol.extent.Corner.BOTTOM_RIGHT);
+      var origin = grid.getOrigin();
+      var half = ol.proj.EPSG3857.HALF_SIZE;
+      expect(origin).to.eql([half, -half]);
+    });
+
+    it('accepts top-left as corner', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.createForProjection(
+          projection, undefined, undefined, ol.extent.Corner.TOP_LEFT);
+      var origin = grid.getOrigin();
+      var half = ol.proj.EPSG3857.HALF_SIZE;
+      expect(origin).to.eql([-half, half]);
+    });
+
+    it('accepts top-right as corner', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.createForProjection(
+          projection, undefined, undefined, ol.extent.Corner.TOP_RIGHT);
+      var origin = grid.getOrigin();
+      var half = ol.proj.EPSG3857.HALF_SIZE;
+      expect(origin).to.eql([half, half]);
+    });
+
+  });
+
+  describe('getForProjection', function() {
+
+    it('gets the default tile grid for a projection', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.getForProjection(projection);
+      expect(grid).to.be.a(ol.tilegrid.TileGrid);
+
+      var resolutions = grid.getResolutions();
+      expect(resolutions.length).to.be(ol.DEFAULT_MAX_ZOOM + 1);
+      expect(grid.getTileSize()).to.eql(256);
+    });
+
+    it('stores the default tile grid on a projection', function() {
+      var projection = ol.proj.get('EPSG:3857');
+      var grid = ol.tilegrid.getForProjection(projection);
+      var gridAgain = ol.tilegrid.getForProjection(projection);
+
+      expect(grid).to.be(gridAgain);
+    });
+
+  });
+
+  describe('getTileCoordFromCoordAndZ', function() {
+
+    describe('Y North, X East', function() {
+      it('returns the expected TileCoord', function() {
+        origin = [0, 0];
+        var tileGrid = new ol.tilegrid.TileGrid({
+          resolutions: resolutions,
+          extent: extent,
+          origin: origin,
+          tileSize: tileSize
+        });
+        var tileCoord;
+
+        tileCoord = tileGrid.getTileCoordForCoordAndZ([0, 0], 3);
+        expect(tileCoord[0]).to.eql(3);
+        expect(tileCoord[1]).to.eql(0);
+        expect(tileCoord[2]).to.eql(0);
+
+        tileCoord = tileGrid.getTileCoordForCoordAndZ([0, 100000], 3);
+        expect(tileCoord[0]).to.eql(3);
+        expect(tileCoord[1]).to.eql(0);
+        expect(tileCoord[2]).to.eql(10);
+
+        tileCoord = tileGrid.getTileCoordForCoordAndZ([100000, 0], 3);
+        expect(tileCoord[0]).to.eql(3);
+        expect(tileCoord[1]).to.eql(10);
+        expect(tileCoord[2]).to.eql(0);
+
+        tileCoord = tileGrid.getTileCoordForCoordAndZ([100000, 100000], 3);
+        expect(tileCoord[0]).to.eql(3);
+        expect(tileCoord[1]).to.eql(10);
+        expect(tileCoord[2]).to.eql(10);
+      });
+    });
+
+    describe('Y South, X East', function() {
+      it('returns the expected TileCoord', function() {
+        origin = [0, 100000];
+        var tileGrid = new ol.tilegrid.TileGrid({
+          resolutions: resolutions,
+          extent: extent,
+          origin: origin,
+          tileSize: tileSize
+        });
+        var tileCoord;
+
+        tileCoord = tileGrid.getTileCoordForCoordAndZ([0, 0], 3);
+        expect(tileCoord[0]).to.eql(3);
+        expect(tileCoord[1]).to.eql(0);
+        expect(tileCoord[2]).to.eql(-10);
+
+        tileCoord = tileGrid.getTileCoordForCoordAndZ([0, 100000], 3);
+        expect(tileCoord[0]).to.eql(3);
+        expect(tileCoord[1]).to.eql(0);
+        expect(tileCoord[2]).to.eql(0);
+
+        tileCoord = tileGrid.getTileCoordForCoordAndZ([100000, 0], 3);
+        expect(tileCoord[0]).to.eql(3);
+        expect(tileCoord[1]).to.eql(10);
+        expect(tileCoord[2]).to.eql(-10);
+
+        tileCoord = tileGrid.getTileCoordForCoordAndZ([100000, 100000], 3);
+        expect(tileCoord[0]).to.eql(3);
+        expect(tileCoord[1]).to.eql(10);
+        expect(tileCoord[2]).to.eql(0);
+      });
+    });
+  });
+
+  describe('getTileCoordForCoordAndResolution', function() {
+    it('returns the expected TileCoord', function() {
+      var tileSize = 256;
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: [10],
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+
+      var coordinate;
+      var tileCoord;
+
+      // gets the first tile at the origin
+      coordinate = [0, 0];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(0);
+      expect(tileCoord[2]).to.eql(0);
+
+      // gets one tile northwest of the origin
+      coordinate = [-1280, 1280];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(-1);
+      expect(tileCoord[2]).to.eql(0);
+
+      // gets one tile northeast of the origin
+      coordinate = [1280, 1280];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(0);
+      expect(tileCoord[2]).to.eql(0);
+
+      // gets one tile southeast of the origin
+      coordinate = [1280, -1280];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(0);
+      expect(tileCoord[2]).to.eql(-1);
+
+      // gets one tile southwest of the origin
+      coordinate = [-1280, -1280];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(-1);
+      expect(tileCoord[2]).to.eql(-1);
+
+      // gets the tile to the east when on the edge
+      coordinate = [2560, -1280];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(1);
+      expect(tileCoord[2]).to.eql(-1);
+
+      // gets the tile to the north when on the edge
+      coordinate = [1280, -2560];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(0);
+      expect(tileCoord[2]).to.eql(-1);
+
+      // pixels are top aligned to the origin
+      coordinate = [1280, -2559.999];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(0);
+      expect(tileCoord[2]).to.eql(-1);
+
+      // pixels are left aligned to the origin
+      coordinate = [2559.999, -1280];
+      tileCoord = tileGrid.getTileCoordForCoordAndResolution(coordinate, 10);
+      expect(tileCoord[0]).to.eql(0);
+      expect(tileCoord[1]).to.eql(0);
+      expect(tileCoord[2]).to.eql(-1);
+    });
+  });
+
+
+  describe('getTileCoordForXYAndResolution_', function() {
+    it('returns higher tile coord for intersections by default', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+
+      var tileCoord;
+
+      // gets higher tile for edge intersection
+      tileCoord = tileGrid.getTileCoordForXYAndResolution_(
+          0, 0, 100, false);
+      expect(tileCoord[0]).to.eql(3);
+      expect(tileCoord[1]).to.eql(0);
+      expect(tileCoord[2]).to.eql(0);
+
+      // gets higher tile for edge intersection
+      tileCoord = tileGrid.getTileCoordForXYAndResolution_(
+          100000, 100000, 100, false);
+      expect(tileCoord[0]).to.eql(3);
+      expect(tileCoord[1]).to.eql(10);
+      expect(tileCoord[2]).to.eql(10);
+
+    });
+
+    it('handles alt intersection policy', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+
+      var tileCoord;
+
+      // can get lower tile for edge intersection
+      tileCoord = tileGrid.getTileCoordForXYAndResolution_(
+          0, 0, 100, true);
+      expect(tileCoord[0]).to.eql(3);
+      expect(tileCoord[1]).to.eql(-1);
+      expect(tileCoord[2]).to.eql(-1);
+
+      // gets higher tile for edge intersection
+      tileCoord = tileGrid.getTileCoordForXYAndResolution_(
+          100000, 100000, 100, true);
+      expect(tileCoord[0]).to.eql(3);
+      expect(tileCoord[1]).to.eql(9);
+      expect(tileCoord[2]).to.eql(9);
+
+    });
+
+  });
+
+  describe('getTileCoordCenter', function() {
+    it('returns the expected center', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+      var center;
+
+      center = tileGrid.getTileCoordCenter([0, 0, 0]);
+      expect(center[0]).to.eql(50000);
+      expect(center[1]).to.eql(50000);
+
+      center = tileGrid.getTileCoordCenter([3, 0, 0]);
+      expect(center[0]).to.eql(5000);
+      expect(center[1]).to.eql(5000);
+
+      center = tileGrid.getTileCoordCenter([3, 9, 9]);
+      expect(center[0]).to.eql(95000);
+      expect(center[1]).to.eql(95000);
+    });
+  });
+
+  describe('getTileCoordExtent', function() {
+    it('returns the expected extend', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+      var tileCoordExtent;
+
+      tileCoordExtent = tileGrid.getTileCoordExtent([0, 0, 0]);
+      expect(tileCoordExtent[0]).to.eql(0);
+      expect(tileCoordExtent[1]).to.eql(0);
+      expect(tileCoordExtent[2]).to.eql(100000);
+      expect(tileCoordExtent[3]).to.eql(100000);
+
+      tileCoordExtent = tileGrid.getTileCoordExtent([3, 9, 0]);
+      expect(tileCoordExtent[0]).to.eql(90000);
+      expect(tileCoordExtent[1]).to.eql(0);
+      expect(tileCoordExtent[2]).to.eql(100000);
+      expect(tileCoordExtent[3]).to.eql(10000);
+
+      tileCoordExtent = tileGrid.getTileCoordExtent([3, 0, 9]);
+      expect(tileCoordExtent[0]).to.eql(0);
+      expect(tileCoordExtent[1]).to.eql(90000);
+      expect(tileCoordExtent[2]).to.eql(10000);
+      expect(tileCoordExtent[3]).to.eql(100000);
+    });
+  });
+
+  describe('getTileRangeForExtentAndResolution', function() {
+    it('returns the expected TileRange', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+      var tileRange;
+
+      tileRange = tileGrid.getTileRangeForExtentAndResolution(extent,
+          resolutions[0]);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.minX).to.eql(0);
+      expect(tileRange.maxX).to.eql(0);
+      expect(tileRange.maxY).to.eql(0);
+
+      tileRange = tileGrid.getTileRangeForExtentAndResolution(extent,
+          resolutions[1]);
+      expect(tileRange.minX).to.eql(0);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.maxX).to.eql(1);
+      expect(tileRange.maxY).to.eql(1);
+
+      tileRange = tileGrid.getTileRangeForExtentAndResolution(extent,
+          resolutions[2]);
+      expect(tileRange.minX).to.eql(0);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.maxX).to.eql(3);
+      expect(tileRange.maxY).to.eql(3);
+
+      tileRange = tileGrid.getTileRangeForExtentAndResolution(extent,
+          resolutions[3]);
+      expect(tileRange.minX).to.eql(0);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.maxX).to.eql(9);
+      expect(tileRange.maxY).to.eql(9);
+    });
+  });
+
+  describe('getTileRangeForExtentAndZ', function() {
+    it('returns the expected TileRange', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+      var e = [45000, 5000, 55000, 15000];
+      var tileRange;
+
+      tileRange = tileGrid.getTileRangeForExtentAndZ(e, 0);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.minX).to.eql(0);
+      expect(tileRange.maxX).to.eql(0);
+      expect(tileRange.maxY).to.eql(0);
+
+      tileRange = tileGrid.getTileRangeForExtentAndZ(e, 1);
+      expect(tileRange.minX).to.eql(0);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.maxX).to.eql(1);
+      expect(tileRange.maxY).to.eql(0);
+
+      tileRange = tileGrid.getTileRangeForExtentAndZ(e, 2);
+      expect(tileRange.minX).to.eql(1);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.maxX).to.eql(2);
+      expect(tileRange.maxY).to.eql(0);
+
+      tileRange = tileGrid.getTileRangeForExtentAndZ(e, 3);
+      expect(tileRange.minX).to.eql(4);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.maxX).to.eql(5);
+      expect(tileRange.maxY).to.eql(1);
+    });
+  });
+
+  describe('forEachTileCoordParentTileRange', function() {
+    it('iterates as expected', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+      var zs = [], tileRanges = [];
+
+      tileGrid.forEachTileCoordParentTileRange(
+          [3, 7, 3],
+          function(z, tileRange) {
+            zs.push(z);
+            tileRanges.push(tileRange);
+            return false;
+          });
+
+      expect(zs.length).to.eql(3);
+      expect(tileRanges.length).to.eql(3);
+
+      expect(zs[0]).to.eql(2);
+      expect(tileRanges[0].minX).to.eql(2);
+      expect(tileRanges[0].minY).to.eql(1);
+      expect(tileRanges[0].maxX).to.eql(3);
+      expect(tileRanges[0].maxY).to.eql(1);
+
+      expect(zs[1]).to.eql(1);
+      expect(tileRanges[1].minX).to.eql(1);
+      expect(tileRanges[1].minY).to.eql(0);
+      expect(tileRanges[1].maxX).to.eql(1);
+      expect(tileRanges[1].maxY).to.eql(0);
+
+      expect(zs[2]).to.eql(0);
+      expect(tileRanges[2].minX).to.eql(0);
+      expect(tileRanges[2].minY).to.eql(0);
+      expect(tileRanges[2].maxX).to.eql(0);
+      expect(tileRanges[2].maxY).to.eql(0);
+    });
+  });
+
+  describe('getZForResolution (exact)', function() {
+    it('returns the expected z value', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+
+      expect(tileGrid.getZForResolution(1000)).to.eql(0);
+      expect(tileGrid.getZForResolution(500)).to.eql(1);
+      expect(tileGrid.getZForResolution(250)).to.eql(2);
+      expect(tileGrid.getZForResolution(100)).to.eql(3);
+    });
+  });
+
+  describe('getZForResolution (approcimate)', function() {
+    it('returns the expected z value', function() {
+      var tileGrid = new ol.tilegrid.TileGrid({
+        resolutions: resolutions,
+        extent: extent,
+        origin: origin,
+        tileSize: tileSize
+      });
+
+      expect(tileGrid.getZForResolution(2000)).to.eql(0);
+      expect(tileGrid.getZForResolution(1000)).to.eql(0);
+      expect(tileGrid.getZForResolution(900)).to.eql(0);
+      expect(tileGrid.getZForResolution(750)).to.eql(1);
+      expect(tileGrid.getZForResolution(625)).to.eql(1);
+      expect(tileGrid.getZForResolution(500)).to.eql(1);
+      expect(tileGrid.getZForResolution(475)).to.eql(1);
+      expect(tileGrid.getZForResolution(375)).to.eql(2);
+      expect(tileGrid.getZForResolution(250)).to.eql(2);
+      expect(tileGrid.getZForResolution(200)).to.eql(2);
+      expect(tileGrid.getZForResolution(125)).to.eql(3);
+      expect(tileGrid.getZForResolution(100)).to.eql(3);
+      expect(tileGrid.getZForResolution(50)).to.eql(3);
+    });
+  });
+
+});
+
+goog.require('ol.Coordinate');
+goog.require('ol.extent');
+goog.require('ol.extent.Corner');
+goog.require('ol.proj');
+goog.require('ol.proj.METERS_PER_UNIT');
+goog.require('ol.proj');
+goog.require('ol.proj.EPSG3857');
+goog.require('ol.proj.Projection');
+goog.require('ol.proj.Units');
+goog.require('ol.tilegrid.TileGrid');
diff --git a/test/spec/ol/tilegrid/xyztilegrid.test.js b/test/spec/ol/tilegrid/xyztilegrid.test.js
new file mode 100644
index 0000000..b82079d
--- /dev/null
+++ b/test/spec/ol/tilegrid/xyztilegrid.test.js
@@ -0,0 +1,168 @@
+goog.provide('ol.test.tilegrid.XYZ');
+
+
+describe('ol.tilegrid.XYZ', function() {
+
+  var xyzTileGrid;
+  beforeEach(function() {
+    xyzTileGrid = new ol.tilegrid.XYZ({
+      maxZoom: 22
+    });
+  });
+
+  describe('#getTileCoordChildTileRange()', function() {
+
+    it('returns the tile range for one zoom level deeper', function() {
+      var range;
+
+      range = xyzTileGrid.getTileCoordChildTileRange([0, 0, 0]);
+      expect(range.minX).to.be(0);
+      expect(range.maxX).to.be(1);
+      expect(range.minY).to.be(0);
+      expect(range.maxY).to.be(1);
+
+      range = xyzTileGrid.getTileCoordChildTileRange([0, 1, 0]);
+      expect(range.minX).to.be(2);
+      expect(range.maxX).to.be(3);
+      expect(range.minY).to.be(0);
+      expect(range.maxY).to.be(1);
+
+      range = xyzTileGrid.getTileCoordChildTileRange([0, 0, 1]);
+      expect(range.minX).to.be(0);
+      expect(range.maxX).to.be(1);
+      expect(range.minY).to.be(2);
+      expect(range.maxY).to.be(3);
+
+      range = xyzTileGrid.getTileCoordChildTileRange([0, -1, 0]);
+      expect(range.minX).to.be(-2);
+      expect(range.maxX).to.be(-1);
+      expect(range.minY).to.be(0);
+      expect(range.maxY).to.be(1);
+
+      range = xyzTileGrid.getTileCoordChildTileRange([0, 0, -1]);
+      expect(range.minX).to.be(0);
+      expect(range.maxX).to.be(1);
+      expect(range.minY).to.be(-2);
+      expect(range.maxY).to.be(-1);
+    });
+
+    it('returns null for z > maxZoom', function() {
+      var max = xyzTileGrid.maxZoom;
+      var range = xyzTileGrid.getTileCoordChildTileRange([max + 1, 0, 0]);
+      expect(range).to.be(null);
+    });
+
+    it('is like ol.tilegrid.TileGrid#getTileCoordChildTileRange()', function() {
+      var superMethod = ol.tilegrid.TileGrid.prototype
+          .getTileCoordChildTileRange.bind(xyzTileGrid);
+
+      var coord, selfRange, superRange;
+
+      coord = [0, 0, 0];
+      selfRange = xyzTileGrid.getTileCoordChildTileRange(coord);
+      superRange = superMethod(coord);
+      expect(selfRange.minX).to.be(superRange.minX);
+      expect(selfRange.maxX).to.be(superRange.maxX);
+      expect(selfRange.minY).to.be(superRange.minY);
+      expect(selfRange.maxY).to.be(superRange.maxY);
+
+      coord = [1, 2, 3];
+      selfRange = xyzTileGrid.getTileCoordChildTileRange(coord);
+      superRange = superMethod(coord);
+      expect(selfRange.minX).to.be(superRange.minX);
+      expect(selfRange.maxX).to.be(superRange.maxX);
+      expect(selfRange.minY).to.be(superRange.minY);
+      expect(selfRange.maxY).to.be(superRange.maxY);
+
+    });
+
+  });
+
+  describe('forEachTileCoordParentTileRange', function() {
+
+    it('iterates as expected', function() {
+
+      var tileCoord = [5, 11, 21];
+      var zs = [], tileRanges = [];
+      xyzTileGrid.forEachTileCoordParentTileRange(
+          tileCoord,
+          function(z, tileRange) {
+            zs.push(z);
+            tileRanges.push(new ol.TileRange(
+                tileRange.minX, tileRange.maxX,
+                tileRange.minY, tileRange.maxY));
+            return false;
+          });
+
+      expect(zs.length).to.eql(5);
+      expect(tileRanges.length).to.eql(5);
+
+      expect(zs[0]).to.eql(4);
+      expect(tileRanges[0].minX).to.eql(5);
+      expect(tileRanges[0].maxX).to.eql(5);
+      expect(tileRanges[0].minY).to.eql(10);
+      expect(tileRanges[0].maxY).to.eql(10);
+
+      expect(zs[1]).to.eql(3);
+      expect(tileRanges[1].minX).to.eql(2);
+      expect(tileRanges[1].maxX).to.eql(2);
+      expect(tileRanges[1].minY).to.eql(5);
+      expect(tileRanges[1].maxY).to.eql(5);
+
+      expect(zs[2]).to.eql(2);
+      expect(tileRanges[2].minX).to.eql(1);
+      expect(tileRanges[2].maxX).to.eql(1);
+      expect(tileRanges[2].minY).to.eql(2);
+      expect(tileRanges[2].maxY).to.eql(2);
+
+      expect(zs[3]).to.eql(1);
+      expect(tileRanges[3].minX).to.eql(0);
+      expect(tileRanges[3].maxX).to.eql(0);
+      expect(tileRanges[3].minY).to.eql(1);
+      expect(tileRanges[3].maxY).to.eql(1);
+
+      expect(zs[4]).to.eql(0);
+      expect(tileRanges[4].minX).to.eql(0);
+      expect(tileRanges[4].maxX).to.eql(0);
+      expect(tileRanges[4].minY).to.eql(0);
+      expect(tileRanges[4].maxY).to.eql(0);
+
+    });
+
+  });
+
+  describe('getResolution', function() {
+
+    it('returns the correct resolution at the equator', function() {
+      // @see http://msdn.microsoft.com/en-us/library/aa940990.aspx
+      expect(xyzTileGrid.getResolution(0)).to.roughlyEqual(156543.04, 1e-2);
+      expect(xyzTileGrid.getResolution(1)).to.roughlyEqual(78271.52, 1e-2);
+      expect(xyzTileGrid.getResolution(2)).to.roughlyEqual(39135.76, 1e-2);
+      expect(xyzTileGrid.getResolution(3)).to.roughlyEqual(19567.88, 1e-2);
+      expect(xyzTileGrid.getResolution(4)).to.roughlyEqual(9783.94, 1e-2);
+      expect(xyzTileGrid.getResolution(5)).to.roughlyEqual(4891.97, 1e-2);
+      expect(xyzTileGrid.getResolution(6)).to.roughlyEqual(2445.98, 1e-2);
+      expect(xyzTileGrid.getResolution(7)).to.roughlyEqual(1222.99, 1e-2);
+      expect(xyzTileGrid.getResolution(8)).to.roughlyEqual(611.50, 1e-2);
+      expect(xyzTileGrid.getResolution(9)).to.roughlyEqual(305.75, 1e-2);
+      expect(xyzTileGrid.getResolution(10)).to.roughlyEqual(152.87, 1e-2);
+      expect(xyzTileGrid.getResolution(11)).to.roughlyEqual(76.44, 1e-2);
+      expect(xyzTileGrid.getResolution(12)).to.roughlyEqual(38.22, 1e-2);
+      expect(xyzTileGrid.getResolution(13)).to.roughlyEqual(19.11, 1e-2);
+      expect(xyzTileGrid.getResolution(14)).to.roughlyEqual(9.55, 1e-2);
+      expect(xyzTileGrid.getResolution(15)).to.roughlyEqual(4.78, 1e-2);
+      expect(xyzTileGrid.getResolution(16)).to.roughlyEqual(2.39, 1e-2);
+      expect(xyzTileGrid.getResolution(17)).to.roughlyEqual(1.19, 1e-2);
+      expect(xyzTileGrid.getResolution(18)).to.roughlyEqual(0.60, 1e-2);
+      expect(xyzTileGrid.getResolution(19)).to.roughlyEqual(0.30, 1e-2);
+    });
+
+  });
+
+});
+
+
+goog.require('ol.TileCoord');
+goog.require('ol.TileRange');
+goog.require('ol.tilegrid.TileGrid');
+goog.require('ol.tilegrid.XYZ');
diff --git a/test/spec/ol/tilequeue.test.js b/test/spec/ol/tilequeue.test.js
new file mode 100644
index 0000000..142ceb4
--- /dev/null
+++ b/test/spec/ol/tilequeue.test.js
@@ -0,0 +1,61 @@
+goog.provide('ol.test.TileQueue');
+
+describe('ol.TileQueue', function() {
+
+  function addRandomPriorityTiles(tq, num) {
+    var i, tile, priority;
+    for (i = 0; i < num; i++) {
+      tile = new ol.Tile();
+      priority = Math.floor(Math.random() * 100);
+      tq.elements_.push([tile, '', [0, 0]]);
+      tq.priorities_.push(priority);
+      tq.queuedElements_[tile.getKey()] = true;
+    }
+  }
+
+  describe('heapify', function() {
+    it('does convert an arbitrary array into a heap', function() {
+
+      var tq = new ol.TileQueue(function() {});
+      addRandomPriorityTiles(tq, 100);
+
+      tq.heapify_();
+      expect(function() {
+        tq.assertValid();
+      }).not.to.throwException();
+    });
+  });
+
+  describe('reprioritize', function() {
+    it('does reprioritize the array', function() {
+
+      var tq = new ol.TileQueue(function() {});
+      addRandomPriorityTiles(tq, 100);
+
+      tq.heapify_();
+
+      // now reprioritize, changing the priority of 50 tiles and removing the
+      // rest
+
+      var i = 0;
+      tq.priorityFunction_ = function() {
+        if ((i++) % 2 === 0) {
+          return ol.structs.PriorityQueue.DROP;
+        }
+        return Math.floor(Math.random() * 100);
+      };
+
+      tq.reprioritize();
+      expect(tq.elements_.length).to.eql(50);
+      expect(tq.priorities_.length).to.eql(50);
+      expect(function() {
+        tq.assertValid();
+      }).not.to.throwException();
+
+    });
+  });
+});
+
+goog.require('ol.Tile');
+goog.require('ol.TileQueue');
+goog.require('ol.structs.PriorityQueue');
diff --git a/test/spec/ol/tilerange.test.js b/test/spec/ol/tilerange.test.js
new file mode 100644
index 0000000..7fa6858
--- /dev/null
+++ b/test/spec/ol/tilerange.test.js
@@ -0,0 +1,133 @@
+goog.provide('ol.test.TileRange');
+
+describe('ol.TileRange', function() {
+
+  describe('constructor', function() {
+    it('creates a range', function() {
+      var range = new ol.TileRange(1, 3, 2, 4);
+      expect(range).to.be.a(ol.TileRange);
+    });
+
+    it('can represent a range of one tile', function() {
+      var range = new ol.TileRange(2, 2, 3, 3);
+      expect(range).to.be.a(ol.TileRange);
+      expect(range.getHeight()).to.be(1);
+      expect(range.getWidth()).to.be(1);
+    });
+  });
+
+  describe('contains', function() {
+    it('returns the expected value', function() {
+      var tileRange = new ol.TileRange(1, 3, 1, 3);
+      expect(tileRange.contains([0, 0, 0])).to.not.be();
+      expect(tileRange.contains([0, 0, 1])).to.not.be();
+      expect(tileRange.contains([0, 0, 2])).to.not.be();
+      expect(tileRange.contains([0, 0, 3])).to.not.be();
+      expect(tileRange.contains([0, 0, 4])).to.not.be();
+      expect(tileRange.contains([0, 1, 0])).to.not.be();
+      expect(tileRange.contains([0, 1, 1])).to.be.ok();
+      expect(tileRange.contains([0, 1, 2])).to.be.ok();
+      expect(tileRange.contains([0, 1, 3])).to.be.ok();
+      expect(tileRange.contains([0, 1, 4])).to.not.be();
+      expect(tileRange.contains([0, 2, 0])).to.not.be();
+      expect(tileRange.contains([0, 2, 1])).to.be.ok();
+      expect(tileRange.contains([0, 2, 2])).to.be.ok();
+      expect(tileRange.contains([0, 2, 3])).to.be.ok();
+      expect(tileRange.contains([0, 2, 4])).to.not.be();
+      expect(tileRange.contains([0, 3, 0])).to.not.be();
+      expect(tileRange.contains([0, 3, 1])).to.be.ok();
+      expect(tileRange.contains([0, 3, 2])).to.be.ok();
+      expect(tileRange.contains([0, 3, 3])).to.be.ok();
+      expect(tileRange.contains([0, 3, 4])).to.not.be();
+      expect(tileRange.contains([0, 4, 0])).to.not.be();
+      expect(tileRange.contains([0, 4, 1])).to.not.be();
+      expect(tileRange.contains([0, 4, 2])).to.not.be();
+      expect(tileRange.contains([0, 4, 3])).to.not.be();
+      expect(tileRange.contains([0, 4, 4])).to.not.be();
+    });
+  });
+
+  describe('boundingTileRange', function() {
+    it('returns the expected TileRange', function() {
+      var tileRange = new ol.TileRange.boundingTileRange(
+          [3, 1, 3], [3, 2, 0]);
+      expect(tileRange.minX).to.eql(1);
+      expect(tileRange.maxX).to.eql(2);
+      expect(tileRange.minY).to.eql(0);
+      expect(tileRange.maxY).to.eql(3);
+    });
+
+    describe('with mixed z', function() {
+      expect(function() {
+        var tileRange = new ol.TileRange.boundingTileRange(
+            [3, 1, 3], [4, 2, 0]);
+        tileRange = tileRange; // suppress gjslint warning about unused variable
+      }).to.throwException();
+    });
+  });
+
+  describe('equals', function() {
+    it('determines equivalence of two ranges', function() {
+      var one = new ol.TileRange(0, 2, 1, 4);
+      var same = new ol.TileRange(0, 2, 1, 4);
+      var diff1 = new ol.TileRange(0, 2, 1, 5);
+      var diff2 = new ol.TileRange(0, 3, 1, 4);
+      var diff3 = new ol.TileRange(0, 2, 2, 4);
+      var diff4 = new ol.TileRange(1, 2, 1, 4);
+      expect(one.equals(same)).to.be(true);
+      expect(one.equals(diff1)).to.be(false);
+      expect(one.equals(diff2)).to.be(false);
+      expect(one.equals(diff3)).to.be(false);
+      expect(one.equals(diff4)).to.be(false);
+    });
+  });
+
+  describe('extent', function() {
+    it('modifies range so it includes another', function() {
+      var one = new ol.TileRange(0, 2, 1, 4);
+      var other = new ol.TileRange(-1, -3, 10, 12);
+      one.extend(other);
+
+      expect(one.minX).to.be(-1);
+      expect(one.maxX).to.be(2);
+      expect(one.minY).to.be(1);
+      expect(one.maxY).to.be(12);
+
+    });
+  });
+
+  describe('getSize', function() {
+    it('returns the expected size', function() {
+      var tileRange = new ol.TileRange(0, 2, 1, 4);
+      var size = tileRange.getSize();
+      expect(size).to.eql([3, 4]);
+    });
+  });
+
+  describe('intersects', function() {
+    it('determines if two ranges overlap', function() {
+      var one = new ol.TileRange(0, 2, 1, 4);
+      var overlapsRight = new ol.TileRange(2, 4, 1, 4);
+      var overlapsLeft = new ol.TileRange(-3, 0, 1, 4);
+      var overlapsTop = new ol.TileRange(0, 2, 4, 5);
+      var overlapsBottom = new ol.TileRange(0, 2, -3, 1);
+      expect(one.intersects(overlapsLeft)).to.be(true);
+      expect(one.intersects(overlapsRight)).to.be(true);
+      expect(one.intersects(overlapsTop)).to.be(true);
+      expect(one.intersects(overlapsBottom)).to.be(true);
+
+      var right = new ol.TileRange(3, 5, 1, 4);
+      var left = new ol.TileRange(-3, -1, 1, 4);
+      var above = new ol.TileRange(0, 2, 5, 6);
+      var below = new ol.TileRange(0, 2, -3, 0);
+      expect(one.intersects(right)).to.be(false);
+      expect(one.intersects(left)).to.be(false);
+      expect(one.intersects(above)).to.be(false);
+      expect(one.intersects(below)).to.be(false);
+    });
+  });
+
+});
+
+goog.require('ol.TileCoord');
+goog.require('ol.TileRange');
diff --git a/test/spec/ol/tileurlfunction.test.js b/test/spec/ol/tileurlfunction.test.js
new file mode 100644
index 0000000..60ddd2b
--- /dev/null
+++ b/test/spec/ol/tileurlfunction.test.js
@@ -0,0 +1,98 @@
+goog.provide('ol.test.TileUrlFunction');
+
+describe('ol.TileUrlFunction', function() {
+
+  describe('expandUrl', function() {
+    describe('with number range', function() {
+      it('creates expected URLs', function() {
+        var template = 'http://tile-{1-3}/{z}/{x}/{y}';
+        var urls = ol.TileUrlFunction.expandUrl(template);
+        expect(urls).to.eql([
+          'http://tile-1/{z}/{x}/{y}',
+          'http://tile-2/{z}/{x}/{y}',
+          'http://tile-3/{z}/{x}/{y}'
+        ]);
+      });
+    });
+    describe('with character range', function() {
+      it('creates expected URLs', function() {
+        var template = 'http://tile-{c-e}/{z}/{x}/{y}';
+        var urls = ol.TileUrlFunction.expandUrl(template);
+        expect(urls).to.eql([
+          'http://tile-c/{z}/{x}/{y}',
+          'http://tile-d/{z}/{x}/{y}',
+          'http://tile-e/{z}/{x}/{y}'
+        ]);
+      });
+    });
+  });
+
+  describe('createFromTemplate', function() {
+    it('creates expected URL', function() {
+      var tileUrl = ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}');
+      expect(tileUrl([3, 2, 1])).to.eql('3/2/1');
+      expect(tileUrl(null)).to.be(undefined);
+    });
+    it('accepts {-y} placeholder', function() {
+      var tileUrl = ol.TileUrlFunction.createFromTemplate('{z}/{x}/{-y}');
+      expect(tileUrl([3, 2, 2])).to.eql('3/2/5');
+    });
+    it('replaces multiple placeholder occurrences', function() {
+      var tileUrl = ol.TileUrlFunction.createFromTemplate('{z}/{z}{x}{y}');
+      expect(tileUrl([3, 2, 1])).to.eql('3/321');
+    });
+  });
+
+  describe('createFromTemplates', function() {
+    it('creates expected URL', function() {
+      var templates = [
+        'http://tile-1/{z}/{x}/{y}',
+        'http://tile-2/{z}/{x}/{y}',
+        'http://tile-3/{z}/{x}/{y}'
+      ];
+      var tileUrlFunction = ol.TileUrlFunction.createFromTemplates(templates);
+      var tileCoord = [3, 2, 1];
+
+      sinon.stub(ol.tilecoord, 'hash', function() { return 3; });
+      expect(tileUrlFunction(tileCoord)).to.eql('http://tile-1/3/2/1');
+      ol.tilecoord.hash.restore();
+
+      sinon.stub(ol.tilecoord, 'hash', function() { return 2; });
+      expect(tileUrlFunction(tileCoord)).to.eql('http://tile-3/3/2/1');
+      ol.tilecoord.hash.restore();
+
+      sinon.stub(ol.tilecoord, 'hash', function() { return 1; });
+      expect(tileUrlFunction(tileCoord)).to.eql('http://tile-2/3/2/1');
+      ol.tilecoord.hash.restore();
+    });
+  });
+
+  describe('withTileCoordTransform', function() {
+    it('creates expected URL', function() {
+      var tileUrl = ol.TileUrlFunction.withTileCoordTransform(
+          function(tileCoord) {
+            return [tileCoord[0], tileCoord[1], -tileCoord[2]];
+          },
+          ol.TileUrlFunction.createFromTemplate('{z}/{x}/{y}'));
+      expect(tileUrl([3, 2, -1])).to.eql('3/2/1');
+      expect(tileUrl(null)).to.be(undefined);
+    });
+  });
+
+  describe('createFromTileUrlFunctions', function() {
+    it('creates expected URL', function() {
+      var tileUrl = ol.TileUrlFunction.createFromTileUrlFunctions([
+        ol.TileUrlFunction.createFromTemplate('a'),
+        ol.TileUrlFunction.createFromTemplate('b')
+      ]);
+      var tileUrl1 = tileUrl([1, 0, 0]);
+      var tileUrl2 = tileUrl([1, 0, 1]);
+      expect(tileUrl1).not.to.be(tileUrl2);
+      expect(tileUrl(null)).to.be(undefined);
+    });
+  });
+
+});
+
+goog.require('ol.TileCoord');
+goog.require('ol.TileUrlFunction');
diff --git a/test/spec/ol/view.test.js b/test/spec/ol/view.test.js
new file mode 100644
index 0000000..fe35e8d
--- /dev/null
+++ b/test/spec/ol/view.test.js
@@ -0,0 +1,463 @@
+goog.provide('ol.test.View');
+
+describe('ol.View', function() {
+  describe('create constraints', function() {
+
+    describe('create resolution constraint', function() {
+
+      describe('with no options', function() {
+        it('gives a correct resolution constraint function', function() {
+          var options = {};
+          var fn = ol.View.createResolutionConstraint_(options).constraint;
+          expect(fn(156543.03392804097, 0, 0))
+              .to.roughlyEqual(156543.03392804097, 1e-9);
+          expect(fn(78271.51696402048, 0, 0))
+              .to.roughlyEqual(78271.51696402048, 1e-10);
+        });
+      });
+
+      describe('with maxResolution, maxZoom, and zoomFactor options',
+          function() {
+            it('gives a correct resolution constraint function', function() {
+              var options = {
+                maxResolution: 81,
+                maxZoom: 3,
+                zoomFactor: 3
+              };
+              var info = ol.View.createResolutionConstraint_(options);
+              var maxResolution = info.maxResolution;
+              expect(maxResolution).to.eql(81);
+              var minResolution = info.minResolution;
+              expect(minResolution).to.eql(3);
+              var fn = info.constraint;
+              expect(fn(82, 0, 0)).to.eql(81);
+              expect(fn(81, 0, 0)).to.eql(81);
+              expect(fn(27, 0, 0)).to.eql(27);
+              expect(fn(9, 0, 0)).to.eql(9);
+              expect(fn(3, 0, 0)).to.eql(3);
+              expect(fn(2, 0, 0)).to.eql(3);
+            });
+          });
+
+      describe('with resolutions', function() {
+        it('gives a correct resolution constraint function', function() {
+          var options = {
+            resolutions: [97, 76, 65, 54, 0.45]
+          };
+          var info = ol.View.createResolutionConstraint_(options);
+          var maxResolution = info.maxResolution;
+          expect(maxResolution).to.eql(97);
+          var minResolution = info.minResolution;
+          expect(minResolution).to.eql(0.45);
+          var fn = info.constraint;
+          expect(fn(97, 0, 0)).to.eql(97);
+          expect(fn(76, 0, 0)).to.eql(76);
+          expect(fn(65, 0, 0)).to.eql(65);
+          expect(fn(54, 0, 0)).to.eql(54);
+          expect(fn(0.45, 0, 0)).to.eql(0.45);
+        });
+      });
+
+      describe('with zoom related options', function() {
+
+        var defaultMaxRes = 156543.03392804097;
+        function getConstraint(options) {
+          return ol.View.createResolutionConstraint_(options).constraint;
+        }
+
+        it('works with only maxZoom', function() {
+          var maxZoom = 10;
+          var constraint = getConstraint({
+            maxZoom: maxZoom
+          });
+
+          expect(constraint(defaultMaxRes, 0, 0)).to.roughlyEqual(
+              defaultMaxRes, 1e-9);
+
+          expect(constraint(0, 0, 0)).to.roughlyEqual(
+              defaultMaxRes / Math.pow(2, maxZoom), 1e-9);
+        });
+
+        it('works with only minZoom', function() {
+          var minZoom = 5;
+          var constraint = getConstraint({
+            minZoom: minZoom
+          });
+
+          expect(constraint(defaultMaxRes, 0, 0)).to.roughlyEqual(
+              defaultMaxRes / Math.pow(2, minZoom), 1e-9);
+
+          expect(constraint(0, 0, 0)).to.roughlyEqual(
+              defaultMaxRes / Math.pow(2, 28), 1e-9);
+        });
+
+        it('works with maxZoom and minZoom', function() {
+          var minZoom = 2;
+          var maxZoom = 11;
+          var constraint = getConstraint({
+            minZoom: minZoom,
+            maxZoom: maxZoom
+          });
+
+          expect(constraint(defaultMaxRes, 0, 0)).to.roughlyEqual(
+              defaultMaxRes / Math.pow(2, minZoom), 1e-9);
+
+          expect(constraint(0, 0, 0)).to.roughlyEqual(
+              defaultMaxRes / Math.pow(2, maxZoom), 1e-9);
+        });
+
+        it('works with maxZoom, minZoom, and zoomFactor', function() {
+          var minZoom = 4;
+          var maxZoom = 8;
+          var zoomFactor = 3;
+          var constraint = getConstraint({
+            minZoom: minZoom,
+            maxZoom: maxZoom,
+            zoomFactor: zoomFactor
+          });
+
+          expect(constraint(defaultMaxRes, 0, 0)).to.roughlyEqual(
+              defaultMaxRes / Math.pow(zoomFactor, minZoom), 1e-9);
+
+          expect(constraint(0, 0, 0)).to.roughlyEqual(
+              defaultMaxRes / Math.pow(zoomFactor, maxZoom), 1e-9);
+        });
+
+      });
+
+      describe('with resolution related options', function() {
+
+        var defaultMaxRes = 156543.03392804097;
+        function getConstraint(options) {
+          return ol.View.createResolutionConstraint_(options).constraint;
+        }
+
+        it('works with only maxResolution', function() {
+          var maxResolution = 10e6;
+          var constraint = getConstraint({
+            maxResolution: maxResolution
+          });
+
+          expect(constraint(maxResolution * 3, 0, 0)).to.roughlyEqual(
+              maxResolution, 1e-9);
+
+          var minResolution = constraint(0, 0, 0);
+          var defaultMinRes = defaultMaxRes / Math.pow(2, 28);
+
+          expect(minResolution).to.be.greaterThan(defaultMinRes);
+          expect(minResolution / defaultMinRes).to.be.lessThan(2);
+        });
+
+        it('works with only minResolution', function() {
+          var minResolution = 100;
+          var constraint = getConstraint({
+            minResolution: minResolution
+          });
+
+          expect(constraint(defaultMaxRes, 0, 0)).to.roughlyEqual(
+              defaultMaxRes, 1e-9);
+
+          var constrainedMinRes = constraint(0, 0, 0);
+          expect(constrainedMinRes).to.be.greaterThan(minResolution);
+          expect(constrainedMinRes / minResolution).to.be.lessThan(2);
+        });
+
+        it('works with minResolution and maxResolution', function() {
+          var constraint = getConstraint({
+            maxResolution: 500,
+            minResolution: 100
+          });
+
+          expect(constraint(600, 0, 0)).to.be(500);
+          expect(constraint(500, 0, 0)).to.be(500);
+          expect(constraint(400, 0, 0)).to.be(500);
+          expect(constraint(300, 0, 0)).to.be(250);
+          expect(constraint(200, 0, 0)).to.be(250);
+          expect(constraint(100, 0, 0)).to.be(125);
+          expect(constraint(0, 0, 0)).to.be(125);
+        });
+
+        it('accepts minResolution, maxResolution, and zoomFactor', function() {
+          var constraint = getConstraint({
+            maxResolution: 500,
+            minResolution: 1,
+            zoomFactor: 10
+          });
+
+          expect(constraint(1000, 0, 0)).to.be(500);
+          expect(constraint(500, 0, 0)).to.be(500);
+          expect(constraint(100, 0, 0)).to.be(50);
+          expect(constraint(50, 0, 0)).to.be(50);
+          expect(constraint(10, 0, 0)).to.be(5);
+          expect(constraint(1, 0, 0)).to.be(5);
+        });
+
+      });
+
+      describe('overspecified options (prefers resolution)', function() {
+
+        var defaultMaxRes = 156543.03392804097;
+        function getConstraint(options) {
+          return ol.View.createResolutionConstraint_(options).constraint;
+        }
+
+        it('respects maxResolution over minZoom', function() {
+          var maxResolution = 10e6;
+          var minZoom = 8;
+          var constraint = getConstraint({
+            maxResolution: maxResolution,
+            minZoom: minZoom
+          });
+
+          expect(constraint(maxResolution * 3, 0, 0)).to.roughlyEqual(
+              maxResolution, 1e-9);
+
+          var minResolution = constraint(0, 0, 0);
+          var defaultMinRes = defaultMaxRes / Math.pow(2, 28);
+
+          expect(minResolution).to.be.greaterThan(defaultMinRes);
+          expect(minResolution / defaultMinRes).to.be.lessThan(2);
+        });
+
+        it('respects minResolution over maxZoom', function() {
+          var minResolution = 100;
+          var maxZoom = 50;
+          var constraint = getConstraint({
+            minResolution: minResolution,
+            maxZoom: maxZoom
+          });
+
+          expect(constraint(defaultMaxRes, 0, 0)).to.roughlyEqual(
+              defaultMaxRes, 1e-9);
+
+          var constrainedMinRes = constraint(0, 0, 0);
+          expect(constrainedMinRes).to.be.greaterThan(minResolution);
+          expect(constrainedMinRes / minResolution).to.be.lessThan(2);
+        });
+
+      });
+
+    });
+
+    describe('create rotation constraint', function() {
+      it('gives a correct rotation constraint function', function() {
+        var options = {};
+        var fn = ol.View.createRotationConstraint_(options);
+        expect(fn(0.01, 0)).to.eql(0);
+        expect(fn(0.15, 0)).to.eql(0.15);
+      });
+    });
+
+  });
+
+  describe('#getZoom', function() {
+    var view;
+    beforeEach(function() {
+      view = new ol.View({
+        resolutions: [512, 256, 128, 64, 32, 16]
+      });
+    });
+
+    it('returns correct zoom levels', function() {
+      view.setResolution(undefined);
+      expect(view.getZoom()).to.be(undefined);
+
+      view.setResolution(511);
+      expect(view.getZoom()).to.be(undefined);
+
+      view.setResolution(512);
+      expect(view.getZoom()).to.be(0);
+
+      view.setResolution(64);
+      expect(view.getZoom()).to.be(3);
+
+      view.setResolution(65);
+      expect(view.getZoom()).to.be(undefined);
+
+      view.setResolution(16);
+      expect(view.getZoom()).to.be(5);
+
+      view.setResolution(15);
+      expect(view.getZoom()).to.be(undefined);
+    });
+  });
+
+  describe('#getZoom() - constrained', function() {
+    it('returns correct zoom levels', function() {
+      var view = new ol.View({
+        minZoom: 10,
+        maxZoom: 20
+      });
+
+      view.setZoom(5);
+      expect(view.getZoom()).to.be(10);
+
+      view.setZoom(10);
+      expect(view.getZoom()).to.be(10);
+
+      view.setZoom(15);
+      expect(view.getZoom()).to.be(15);
+
+      view.setZoom(20);
+      expect(view.getZoom()).to.be(20);
+
+      view.setZoom(25);
+      expect(view.getZoom()).to.be(20);
+    });
+  });
+
+  describe('#getZoom() - custom ol.DEFAULT_MIN_ZOOM', function() {
+    var defaultMinZoom = ol.DEFAULT_MIN_ZOOM;
+
+    afterEach(function() {
+      ol.DEFAULT_MIN_ZOOM = defaultMinZoom;
+    });
+
+    it('respects custom ol.DEFAULT_MIN_ZOOM', function() {
+      ol.DEFAULT_MIN_ZOOM = 2;
+
+      var view = new ol.View();
+
+      view.setZoom(1);
+      expect(view.getZoom()).to.be(2);
+
+      view.setZoom(2);
+      expect(view.getZoom()).to.be(2);
+
+      view.setZoom(3);
+      expect(view.getZoom()).to.be(3);
+    });
+  });
+
+  describe('#getZoom() - overspecified', function() {
+
+    it('gives maxResolution precedence over minZoom', function() {
+
+      var view = new ol.View({
+        maxResolution: 100,
+        minZoom: 2 // this should get ignored
+      });
+
+      view.setResolution(100);
+      expect(view.getZoom()).to.be(0);
+
+      view.setZoom(0);
+      expect(view.getResolution()).to.be(100);
+    });
+  });
+
+  describe('fitGeometry', function() {
+    var view;
+    beforeEach(function() {
+      view = new ol.View({
+        resolutions: [200, 100, 50, 20, 10, 5, 2, 1]
+      });
+    });
+    it('fit correctly to the geometry', function() {
+      view.fitGeometry(
+          new ol.geom.LineString([[6000, 46000], [6000, 47100], [7000, 46000]]),
+          [200, 200],
+          {
+            padding: [100, 0, 0, 100],
+            constrainResolution: false
+          }
+      );
+      expect(view.getResolution()).to.be(11);
+      expect(view.getCenter()[0]).to.be(5950);
+      expect(view.getCenter()[1]).to.be(47100);
+
+      view.fitGeometry(
+          new ol.geom.LineString([[6000, 46000], [6000, 47100], [7000, 46000]]),
+          [200, 200],
+          {
+            padding: [100, 0, 0, 100]
+          }
+      );
+      expect(view.getResolution()).to.be(20);
+      expect(view.getCenter()[0]).to.be(5500);
+      expect(view.getCenter()[1]).to.be(47550);
+
+      view.fitGeometry(
+          new ol.geom.LineString([[6000, 46000], [6000, 47100], [7000, 46000]]),
+          [200, 200],
+          {
+            padding: [100, 0, 0, 100],
+            nearest: true
+          }
+      );
+      expect(view.getResolution()).to.be(10);
+      expect(view.getCenter()[0]).to.be(6000);
+      expect(view.getCenter()[1]).to.be(47050);
+
+      view.fitGeometry(
+          new ol.geom.Point([6000, 46000]),
+          [200, 200],
+          {
+            padding: [100, 0, 0, 100],
+            minResolution: 2
+          }
+      );
+      expect(view.getResolution()).to.be(2);
+      expect(view.getCenter()[0]).to.be(5900);
+      expect(view.getCenter()[1]).to.be(46100);
+
+      view.fitGeometry(
+          new ol.geom.Point([6000, 46000]),
+          [200, 200],
+          {
+            padding: [100, 0, 0, 100],
+            maxZoom: 6
+          }
+      );
+      expect(view.getResolution()).to.be(2);
+      expect(view.getZoom()).to.be(6);
+      expect(view.getCenter()[0]).to.be(5900);
+      expect(view.getCenter()[1]).to.be(46100);
+
+      view.setRotation(Math.PI / 4);
+      view.fitGeometry(
+          new ol.geom.LineString([[6000, 46000], [6000, 47100], [7000, 46000]]),
+          [200, 200],
+          {
+            padding: [100, 0, 0, 100],
+            constrainResolution: false
+          }
+      );
+      expect(view.getResolution()).to.roughlyEqual(14.849242404917458, 1e-9);
+      expect(view.getCenter()[0]).to.roughlyEqual(5200, 1e-9);
+      expect(view.getCenter()[1]).to.roughlyEqual(46300, 1e-9);
+    });
+  });
+
+  describe('centerOn', function() {
+    var view;
+    beforeEach(function() {
+      view = new ol.View({
+        resolutions: [200, 100, 50, 20, 10, 5, 2, 1]
+      });
+    });
+    it('fit correctly to the coordinates', function() {
+      view.setResolution(10);
+      view.centerOn(
+          [6000, 46000],
+          [400, 400],
+          [300, 300]
+      );
+      expect(view.getCenter()[0]).to.be(5000);
+      expect(view.getCenter()[1]).to.be(47000);
+
+      view.setRotation(Math.PI / 4);
+      view.centerOn(
+          [6000, 46000],
+          [400, 400],
+          [300, 300]
+      );
+      expect(view.getCenter()[0]).to.roughlyEqual(4585.78643762691, 1e-9);
+      expect(view.getCenter()[1]).to.roughlyEqual(46000, 1e-9);
+    });
+  });
+});
+
+goog.require('ol.View');
+goog.require('ol.geom.LineString');
+goog.require('ol.geom.Point');
diff --git a/test/spec/ol/webgl/buffer.test.js b/test/spec/ol/webgl/buffer.test.js
new file mode 100644
index 0000000..7d7153e
--- /dev/null
+++ b/test/spec/ol/webgl/buffer.test.js
@@ -0,0 +1,55 @@
+goog.provide('ol.test.webgl.Buffer');
+
+
+describe('ol.webgl.Buffer', function() {
+
+  describe('constructor', function() {
+
+    describe('without an argument', function() {
+
+      var b;
+      beforeEach(function() {
+        b = new ol.webgl.Buffer();
+      });
+
+      it('constructs an empty instance', function() {
+        expect(b.getArray()).to.be.empty();
+      });
+
+    });
+
+    describe('with a single array argument', function() {
+
+      var b;
+      beforeEach(function() {
+        b = new ol.webgl.Buffer([0, 1, 2, 3]);
+      });
+
+      it('constructs a populated instance', function() {
+        expect(b.getArray()).to.eql([0, 1, 2, 3]);
+      });
+
+    });
+
+  });
+
+  describe('with an empty instance', function() {
+
+    var b;
+    beforeEach(function() {
+      b = new ol.webgl.Buffer();
+    });
+
+    describe('getArray', function() {
+
+      it('returns an empty array', function() {
+        expect(b.getArray()).to.be.empty();
+      });
+
+    });
+
+  });
+
+});
+
+goog.require('ol.webgl.Buffer');
diff --git a/test/test-extensions.js b/test/test-extensions.js
new file mode 100644
index 0000000..badd5df
--- /dev/null
+++ b/test/test-extensions.js
@@ -0,0 +1,323 @@
+// FIXME remove afterLoadXml as it uses the wrong XML parser on IE9
+
+// helper functions for async testing
+(function(global) {
+
+  function afterLoad(type, path, next) {
+    var client = new XMLHttpRequest();
+    client.open('GET', path, true);
+    client.onload = function() {
+      var data;
+      if (type === 'xml') {
+        data = client.responseXML;
+      } else {
+        data = client.responseText;
+      }
+      if (!data) {
+        throw new Error(path + ' loading failed: ' + client.status);
+      }
+      next(data);
+    };
+    client.send();
+  }
+
+  /**
+   * @param {string} path Relative path to file (e.g. 'spec/ol/foo.json').
+   * @param {function(Object)} next Function to call with response object on
+   *     success.  On failure, an error is thrown with the reason.
+   */
+  global.afterLoadJson = function(path, next) {
+    afterLoad('json', path, next);
+  };
+
+
+  /**
+   * @param {string} path Relative path to file (e.g. 'spec/ol/foo.txt').
+   * @param {function(string)} next Function to call with response text on
+   *     success.  On failure, an error is thrown with the reason.
+   */
+  global.afterLoadText = function(path, next) {
+    afterLoad('text', path, next);
+  };
+
+
+  /**
+   * @param {string} path Relative path to file (e.g. 'spec/ol/foo.xml').
+   * @param {function(Document)} next Function to call with response xml on
+   *     success.  On failure, an error is thrown with the reason.
+   */
+  global.afterLoadXml = function(path, next) {
+    afterLoad('xml', path, next);
+  };
+
+
+  // extensions to expect.js
+  var expect = global.expect;
+
+
+  /**
+   * Assert value is within some tolerance of a number.
+   * @param {Number} n Number.
+   * @param {Number} tol Tolerance.
+   */
+  expect.Assertion.prototype.roughlyEqual = function(n, tol) {
+    this.assert(
+        Math.abs(this.obj - n) <= tol,
+        function() {
+          return 'expected ' + expect.stringify(this.obj) + ' to be within ' +
+              tol + ' of ' + n;
+        },
+        function() {
+          return 'expected ' + expect.stringify(this.obj) +
+              ' not to be within ' + tol + ' of ' + n;
+        });
+    return this;
+  };
+
+
+  /**
+   * Assert that a sinon spy was called.
+   */
+  expect.Assertion.prototype.called = function() {
+    this.assert(
+        this.obj.called,
+        function() {
+          return 'expected ' + expect.stringify(this.obj) + ' to be called';
+        },
+        function() {
+          return 'expected ' + expect.stringify(this.obj) + ' not to be called';
+        });
+    return this;
+  };
+
+
+  function getChildNodes(node, options) {
+    // check whitespace
+    if (options && options.includeWhiteSpace) {
+        return node.childNodes;
+    } else {
+      var nodes = [];
+      for (var i = 0, ii=node.childNodes.length; i < ii; i++ ) {
+        var child = node.childNodes[i];
+        if (child.nodeType == 1) {
+          // element node, add it
+          nodes.push(child);
+        } else if (child.nodeType == 3) {
+          // text node, add if non empty
+          if (child.nodeValue &&
+              child.nodeValue.replace(/^\s*(.*?)\s*$/, '$1') !== '') {
+            nodes.push(child);
+          }
+        }
+      }
+      return nodes;
+    }
+  }
+
+  function assertElementNodesEqual(node1, node2, options, errors) {
+    var testPrefix = (options && options.prefix === true);
+    try {
+      expect(node1.nodeType).to.equal(node2.nodeType);
+    } catch(e) {
+      errors.push('nodeType test failed for: ' + node1.nodeName + ' | ' +
+          node2.nodeName + ' | ' + e.message);
+    }
+    if (testPrefix) {
+      try {
+        expect(node1.nodeName).to.equal(node2.nodeName);
+      } catch(e) {
+        errors.push('nodeName test failed for: ' + node1.nodeName + ' | ' +
+            node2.nodeName + ' | ' + e.message);
+      }
+    } else {
+      try {
+        expect(node1.nodeName.split(':').pop()).to.equal(
+            node2.nodeName.split(':').pop());
+      } catch(e) {
+        errors.push('nodeName test failed for: ' + node1.nodeName + ' | ' +
+            node2.nodeName + ' | ' + e.message);
+      }
+    }
+    // for text nodes compare value
+    if (node1.nodeType === 3) {
+      try {
+        // TODO should we make this optional?
+        expect(node1.nodeValue.replace(/\s/g, '')).to.equal(
+            node2.nodeValue.replace(/\s/g, ''));
+      } catch(e) {
+        errors.push('nodeValue test failed | ' + e.message);
+      }
+    }
+    // for element type nodes compare namespace, attributes, and children
+    else if (node1.nodeType === 1) {
+      // test namespace alias and uri
+      if (node1.prefix || node2.prefix) {
+        if (testPrefix) {
+          try {
+            expect(node1.prefix).to.equal(node2.prefix);
+          } catch(e) {
+            errors.push('Prefix test failed for: ' + node1.nodeName + ' | ' +
+                e.message);
+          }
+        }
+      }
+      if (node1.namespaceURI || node2.namespaceURI) {
+        try {
+          expect(node1.namespaceURI).to.equal(node2.namespaceURI);
+        } catch(e) {
+          errors.push('namespaceURI test failed for: ' + node1.nodeName +
+              ' | ' + e.message);
+        }
+      }
+      // compare attributes - disregard xmlns given namespace handling above
+      var node1AttrLen = 0;
+      var node1Attr = {};
+      var node2AttrLen = 0;
+      var node2Attr = {};
+      var ga, ea, gn, en;
+      var i, ii;
+      if (node1.attributes) {
+        for (i=0, ii=node1.attributes.length; i<ii; ++i) {
+          ga = node1.attributes[i];
+          if (ga.specified === undefined || ga.specified === true) {
+            if (ga.name.split(':').shift() != 'xmlns') {
+              gn = testPrefix ? ga.name : ga.name.split(':').pop();
+              node1Attr[gn] = ga;
+              ++node1AttrLen;
+            }
+          }
+        }
+      }
+      if (node2.attributes) {
+        for (i=0, ii=node2.attributes.length; i<ii; ++i) {
+          ea = node2.attributes[i];
+          if (ea.specified === undefined || ea.specified === true) {
+            if (ea.name.split(':').shift() != 'xmlns') {
+              en = testPrefix ? ea.name : ea.name.split(':').pop();
+              node2Attr[en] = ea;
+              ++node2AttrLen;
+            }
+          }
+        }
+      }
+      try {
+        expect(node1AttrLen).to.equal(node2AttrLen);
+      } catch(e) {
+        errors.push('Number of attributes test failed for: ' + node1.nodeName +
+            ' | ' + e.message);
+      }
+      var gv, ev;
+      for (var name in node1Attr) {
+        if (node2Attr[name] === undefined) {
+          errors.push('Attribute name ' + node1Attr[name].name +
+              ' expected for element ' + node1.nodeName);
+        }
+        // test attribute namespace
+        try {
+          // we do not care about the difference between an empty string and
+          // null for namespaceURI some tests will fail in IE9 otherwise
+          // see also 
+          // http://msdn.microsoft.com/en-us/library/ff460650(v=vs.85).aspx
+          expect(node1Attr[name].namespaceURI || null).to.be(
+              node2Attr[name].namespaceURI || null);
+        } catch(e) {
+          errors.push('namespaceURI attribute test failed for: ' +
+              node1.nodeName + ' | ' + e.message);
+        }
+        try {
+          expect(node1Attr[name].value).to.equal(node2Attr[name].value);
+        } catch(e) {
+          errors.push('Attribute value test failed for: ' + node1.nodeName +
+              ' | ' + e.message);
+        }
+      }
+      // compare children
+      var node1ChildNodes = getChildNodes(node1, options);
+      var node2ChildNodes = getChildNodes(node2, options);
+      try {
+        expect(node1ChildNodes.length).to.equal(node2ChildNodes.length);
+      } catch(e) {
+        errors.push('Number of childNodes test failed for: ' + node1.nodeName +
+            ' | ' + e.message);
+      }
+      // only compare if they are equal
+      if (node1ChildNodes.length === node2ChildNodes.length) {
+        for (var j=0, jj=node1ChildNodes.length; j<jj; ++j) {
+          assertElementNodesEqual(
+              node1ChildNodes[j], node2ChildNodes[j], options, errors);
+        }
+      }
+    }
+  }
+
+
+  /**
+   * Checks if the XML document sort of equals another XML document.
+   */
+  expect.Assertion.prototype.xmleql = function(obj, options) {
+    if (obj && obj.nodeType == 9) {
+      obj = obj.documentElement;
+    }
+    if (this.obj && this.obj.nodeType == 9) {
+      this.obj = this.obj.documentElement;
+    }
+    var errors = [];
+    assertElementNodesEqual(obj, this.obj, options, errors);
+    var result = (errors.length === 0);
+    this.assert(
+        !!result,
+        function() {
+          return 'expected ' + expect.stringify(this.obj) +
+              ' to sort of equal ' + expect.stringify(obj) + '\n' +
+              errors.join('\n');
+        },
+        function() {
+          return 'expected ' + expect.stringify(this.obj) +
+              ' to sort of not equal ' + expect.stringify(obj) + '\n' +
+              errors.join('\n');
+        });
+    return this;
+  };
+
+
+  /**
+   * Checks if the array sort of equals another array.
+   */
+  expect.Assertion.prototype.arreql = function (obj) {
+    this.assert(
+        goog.array.equals(this.obj, obj),
+        function() {
+          return 'expected ' + expect.stringify(this.obj) +
+              ' to sort of equal ' + expect.stringify(obj);
+        },
+        function() {
+          return 'expected ' + expect.stringify(this.obj) +
+              ' to sort of not equal ' + expect.stringify(obj);
+        });
+    return this;
+  };
+
+
+  /**
+   * Checks if the array sort of equals another array (allows NaNs to be equal).
+   */
+  expect.Assertion.prototype.arreqlNaN = function (obj) {
+    function compare(a, b) {
+      return a === b || (typeof a === 'number' && typeof b === 'number' &&
+          isNaN(a) && isNaN(b));
+    }
+    this.assert(
+        goog.array.equals(this.obj, obj, compare),
+        function() {
+          return 'expected ' + expect.stringify(this.obj) +
+              ' to sort of equal ' + expect.stringify(obj);
+        },
+        function() {
+          return 'expected ' + expect.stringify(this.obj) +
+              ' to sort of not equal ' + expect.stringify(obj);
+        });
+    return this;
+  };
+
+
+})(this);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/openlayers3.git



More information about the Pkg-grass-devel mailing list